Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions BeefLibs/corlib/src/Type.bf
Original file line number Diff line number Diff line change
Expand Up @@ -1068,6 +1068,11 @@ namespace System
Float,
Double,
Float2,
Float4,
Int32_4,
Bool2,
Bool4,
V128,
Object,
Interface,
Struct,
Expand Down
14 changes: 10 additions & 4 deletions IDEHelper/Compiler/BfExprEvaluator.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7447,7 +7447,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, BfMethodInstance*
BfIRType loweredIRType = mModule->GetIRLoweredType(loweredRetType, loweredRetType2);
loweredIRType = mModule->mBfIRBuilder->GetPointerTo(loweredIRType);
auto castedRetVal = mModule->mBfIRBuilder->CreateBitCast(retVal, loweredIRType);
mModule->mBfIRBuilder->CreateStore(callInst, castedRetVal);
mModule->mBfIRBuilder->CreateAlignedStore(callInst, castedRetVal, methodInstance->mReturnType->mAlign);
result = BfTypedValue(retVal, methodInstance->mReturnType, BfTypedValueKind_RestrictedTempAddr);
}
else
Expand Down Expand Up @@ -7670,11 +7670,12 @@ void BfExprEvaluator::PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& ir
auto primType = mModule->mBfIRBuilder->GetPrimitiveType(loweredTypeCode);
auto ptrType = mModule->mBfIRBuilder->GetPointerTo(primType);
BfIRValue primPtrVal = mModule->mBfIRBuilder->CreateBitCast(argPtrVal, ptrType);
auto primVal = mModule->mBfIRBuilder->CreateLoad(primPtrVal);
irArgs.push_back(primVal);


if (loweredTypeCode2 != BfTypeCode_None)
{
auto primVal = mModule->mBfIRBuilder->CreateLoad(primPtrVal);
irArgs.push_back(primVal);

auto primType2 = mModule->mBfIRBuilder->GetPrimitiveType(loweredTypeCode2);
auto ptrType2 = mModule->mBfIRBuilder->GetPointerTo(primType2);
BfIRValue primPtrVal2;
Expand All @@ -7686,6 +7687,11 @@ void BfExprEvaluator::PushArg(BfTypedValue argVal, SizedArrayImpl<BfIRValue>& ir
auto primVal2 = mModule->mBfIRBuilder->CreateLoad(primPtrVal2);
irArgs.Add(primVal2);
}
else
{
auto primVal = mModule->mBfIRBuilder->CreateAlignedLoad(primPtrVal, argVal.mType->mAlign);
irArgs.push_back(primVal);
}
return;
}
}
Expand Down
7 changes: 6 additions & 1 deletion IDEHelper/Compiler/BfIRBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -539,7 +539,12 @@ int BfIRConstHolder::GetSize(BfTypeCode typeCode, int ptrSize)
case BfTypeCode_Char32: return 4;
case BfTypeCode_Float: return 4;
case BfTypeCode_Double: return 8;
case BfTypeCode_Float2: return 8;
case BfTypeCode_Float2: return 4 * 2;
case BfTypeCode_Float4: return 4 * 4;
case BfTypeCode_Int32_4: return 4 * 4;
case BfTypeCode_Bool2: return 2;
case BfTypeCode_Bool4: return 4;
case BfTypeCode_V128: return 16;
case BfTypeCode_Object: return ptrSize;
case BfTypeCode_Interface: return ptrSize;
case BfTypeCode_Struct: return 0;
Expand Down
5 changes: 5 additions & 0 deletions IDEHelper/Compiler/BfIRBuilder.h
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,11 @@ enum BfTypeCode : uint8
BfTypeCode_Float,
BfTypeCode_Double,
BfTypeCode_Float2,
BfTypeCode_Float4,
BfTypeCode_Int32_4,
BfTypeCode_Bool2,
BfTypeCode_Bool4,
BfTypeCode_V128,
BfTypeCode_Object,
BfTypeCode_Interface,
BfTypeCode_Struct,
Expand Down
10 changes: 10 additions & 0 deletions IDEHelper/Compiler/BfIRCodeGen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -698,6 +698,16 @@ llvm::Type* BfIRCodeGen::GetLLVMType(BfTypeCode typeCode, bool& isSigned)
return llvm::Type::getDoubleTy(*mLLVMContext);
case BfTypeCode_Float2:
return llvm::FixedVectorType::get(llvm::Type::getFloatTy(*mLLVMContext), 2);
case BfTypeCode_Float4:
return llvm::FixedVectorType::get(llvm::Type::getFloatTy(*mLLVMContext), 4);
case BfTypeCode_Int32_4:
return llvm::FixedVectorType::get(llvm::Type::getInt32Ty(*mLLVMContext), 4);
case BfTypeCode_Bool2:
return llvm::FixedVectorType::get(llvm::Type::getInt1Ty(*mLLVMContext), 2);
case BfTypeCode_Bool4:
return llvm::FixedVectorType::get(llvm::Type::getInt1Ty(*mLLVMContext), 4);
case BfTypeCode_V128:
return llvm::FixedVectorType::get(llvm::Type::getInt8Ty(*mLLVMContext), 16);
case BfTypeCode_FloatX1:
return llvm::ArrayType::get(llvm::Type::getFloatTy(*mLLVMContext), 1);
case BfTypeCode_FloatX2:
Expand Down
2 changes: 1 addition & 1 deletion IDEHelper/Compiler/BfModule.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -11318,7 +11318,7 @@ BfTypedValue BfModule::BoxValue(BfAstNode* srcNode, BfTypedValue typedVal, BfTyp
AggregateSplatIntoAddr(typedVal, valPtr);
}
else
mBfIRBuilder->CreateStore(typedVal.mValue, valPtr, typedVal.mType->mAlign);
mBfIRBuilder->CreateAlignedStore(typedVal.mValue, valPtr, typedVal.mType->mAlign);
}
}

Expand Down
56 changes: 56 additions & 0 deletions IDEHelper/Compiler/BfResolvedTypeUtils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2094,7 +2094,63 @@ bool BfTypeInstance::GetLoweredType(BfTypeUsage typeUsage, BfTypeCode* outTypeCo
if ((mTypeDef->mTypeCode != BfTypeCode_Struct) || (IsBoxed()) || (mIsSplattable))
return false;
if (mHasUnderlyingArray)
{
BfType* underlyingArrayType = NULL;
int underlyingArraySize = -1;
bool underlyingIsVector = false;
GetUnderlyingArray(underlyingArrayType, underlyingArraySize, underlyingIsVector);

if(!underlyingArrayType->IsPrimitiveType())
return false;
auto primType = (BfPrimitiveType*)underlyingArrayType;
auto underlyingArrayTypeCode = primType->mTypeDef->mTypeCode;

if ((underlyingArrayTypeCode == BfTypeCode_Float) && (underlyingArraySize == 2))
{
if (outTypeCode != NULL)
*outTypeCode = underlyingIsVector ? BfTypeCode_Float2 : BfTypeCode_FloatX2;
return true;
}
if ((underlyingArrayTypeCode == BfTypeCode_Float) && (underlyingArraySize == 4))
{
if (outTypeCode != NULL)
*outTypeCode = underlyingIsVector ? BfTypeCode_Float4 : BfTypeCode_FloatX4;
return true;
}
if ((underlyingArrayTypeCode == BfTypeCode_Int32) && (underlyingArraySize == 4))
{
if (!underlyingIsVector)
return false;
if (outTypeCode != NULL)
*outTypeCode = BfTypeCode_Int32_4;
return true;
}
if ((underlyingArrayTypeCode == BfTypeCode_Boolean) && (underlyingArraySize == 2))
{
if (!underlyingIsVector)
return false;
if (outTypeCode != NULL)
*outTypeCode = BfTypeCode_Bool2;
return true;
}
if ((underlyingArrayTypeCode == BfTypeCode_Boolean) && (underlyingArraySize == 4))
{
if (!underlyingIsVector)
return false;
if (outTypeCode != NULL)
*outTypeCode = BfTypeCode_Bool4;
return true;
}
if ((underlyingArrayTypeCode == BfTypeCode_UInt8) && (underlyingArraySize == 16))
{
if (!underlyingIsVector)
return false;
if (outTypeCode != NULL)
*outTypeCode = BfTypeCode_V128;
return true;
}
return false;
}

bool deepCheck = false;

Expand Down
Loading