1
0
Fork 0
mirror of https://github.com/beefytech/Beef.git synced 2025-06-09 20:12:21 +02:00

Fixed sign extension for constexpr geps

This commit is contained in:
Brian Fiete 2023-07-25 07:43:22 -07:00
parent e2f45167f9
commit 974e8ac354
2 changed files with 49 additions and 17 deletions

View file

@ -8502,6 +8502,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
argIdx++; argIdx++;
} }
prevIgnoreWrites.Restore();
return mModule->GetDefaultTypedValue(returnType, false, BfDefaultValueKind_Addr); return mModule->GetDefaultTypedValue(returnType, false, BfDefaultValueKind_Addr);
} }
@ -8565,6 +8566,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
mFunctionBindResult->mIRArgs.push_back(arg); mFunctionBindResult->mIRArgs.push_back(arg);
} }
prevIgnoreWrites.Restore();
return mModule->GetDefaultTypedValue(returnType); return mModule->GetDefaultTypedValue(returnType);
} }
} }
@ -8599,6 +8601,7 @@ BfTypedValue BfExprEvaluator::CreateCall(BfAstNode* targetSrc, const BfTypedValu
auto func = moduleMethodInstance.mFunc; auto func = moduleMethodInstance.mFunc;
BfTypedValue callResult = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs, NULL, physCallFlags, origTarget.mType); BfTypedValue callResult = CreateCall(targetSrc, methodInstance, func, bypassVirtual, irArgs, NULL, physCallFlags, origTarget.mType);
prevIgnoreWrites.Restore();
if ((methodInstance->mMethodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_IsExpressionBody) != 0) && if ((methodInstance->mMethodDef->mIsNoReturn) && ((mBfEvalExprFlags & BfEvalExprFlags_IsExpressionBody) != 0) &&
(mExpectingType != NULL) && (callResult.mType != mExpectingType)) (mExpectingType != NULL) && (callResult.mType != mExpectingType))
{ {

View file

@ -69,11 +69,23 @@ struct CeOpInfo
{OPNAME "_I64", OPINFOA##64, OPINFOB##64}, \ {OPNAME "_I64", OPINFOA##64, OPINFOB##64}, \
{OPNAME "_F32", OPINFOA##F32, OPINFOB##F64}, \ {OPNAME "_F32", OPINFOA##F32, OPINFOB##F64}, \
{OPNAME "_F64", OPINFOA##F64, OPINFOB##F64} {OPNAME "_F64", OPINFOA##F64, OPINFOB##F64}
#define CEOPINFO_SIZED_NUMERIC_PLUSF_2_RESULT8(OPNAME, OPINFOA, OPINFOB) \
{OPNAME "_I8", OPINFOA##8, OPINFOB##8}, \
{OPNAME "_I16", OPINFOA##8, OPINFOB##16}, \
{OPNAME "_I32", OPINFOA##8, OPINFOB##32}, \
{OPNAME "_I64", OPINFOA##8, OPINFOB##64}, \
{OPNAME "_F32", OPINFOA##8, OPINFOB##F64}, \
{OPNAME "_F64", OPINFOA##8, OPINFOB##F64}
#define CEOPINFO_SIZED_NUMERIC_3(OPNAME, OPINFOA, OPINFOB, OPINFOC) \ #define CEOPINFO_SIZED_NUMERIC_3(OPNAME, OPINFOA, OPINFOB, OPINFOC) \
{OPNAME "_I8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \ {OPNAME "_I8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \
{OPNAME "_I16", OPINFOA##16, OPINFOB##16, OPINFOC##16}, \ {OPNAME "_I16", OPINFOA##16, OPINFOB##16, OPINFOC##16}, \
{OPNAME "_I32", OPINFOA##32, OPINFOB##32, OPINFOC##32}, \ {OPNAME "_I32", OPINFOA##32, OPINFOB##32, OPINFOC##32}, \
{OPNAME "_I64", OPINFOA##64, OPINFOB##64, OPINFOC##64} {OPNAME "_I64", OPINFOA##64, OPINFOB##64, OPINFOC##64}
#define CEOPINFO_SIZED_NUMERIC_3_RESULT8(OPNAME, OPINFOA, OPINFOB, OPINFOC) \
{OPNAME "_I8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \
{OPNAME "_I16", OPINFOA##8, OPINFOB##16, OPINFOC##16}, \
{OPNAME "_I32", OPINFOA##8, OPINFOB##32, OPINFOC##32}, \
{OPNAME "_I64", OPINFOA##8, OPINFOB##64, OPINFOC##64}
#define CEOPINFO_SIZED_UNUMERIC_3(OPNAME, OPINFOA, OPINFOB, OPINFOC) \ #define CEOPINFO_SIZED_UNUMERIC_3(OPNAME, OPINFOA, OPINFOB, OPINFOC) \
{OPNAME "_U8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \ {OPNAME "_U8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \
{OPNAME "_U16", OPINFOA##16, OPINFOB##16, OPINFOC##16}, \ {OPNAME "_U16", OPINFOA##16, OPINFOB##16, OPINFOC##16}, \
@ -86,6 +98,13 @@ struct CeOpInfo
{OPNAME "_I64", OPINFOA##64, OPINFOB##64, OPINFOC##64}, \ {OPNAME "_I64", OPINFOA##64, OPINFOB##64, OPINFOC##64}, \
{OPNAME "_F32", OPINFOA##F32, OPINFOB##F32, OPINFOC##F32}, \ {OPNAME "_F32", OPINFOA##F32, OPINFOB##F32, OPINFOC##F32}, \
{OPNAME "_F64", OPINFOA##F64, OPINFOB##F64, OPINFOC##F64} {OPNAME "_F64", OPINFOA##F64, OPINFOB##F64, OPINFOC##F64}
#define CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8(OPNAME, OPINFOA, OPINFOB, OPINFOC) \
{OPNAME "_I8", OPINFOA##8, OPINFOB##8, OPINFOC##8}, \
{OPNAME "_I16", OPINFOA##8, OPINFOB##16, OPINFOC##16}, \
{OPNAME "_I32", OPINFOA##8, OPINFOB##32, OPINFOC##32}, \
{OPNAME "_I64", OPINFOA##8, OPINFOB##64, OPINFOC##64}, \
{OPNAME "_F32", OPINFOA##8, OPINFOB##F32, OPINFOC##F32}, \
{OPNAME "_F64", OPINFOA##8, OPINFOB##F64, OPINFOC##F64}
#define CEOPINFO_SIZED_FLOAT_2(OPNAME, OPINFOA, OPINFOB) \ #define CEOPINFO_SIZED_FLOAT_2(OPNAME, OPINFOA, OPINFOB) \
{OPNAME "_F32", OPINFOA##F32, OPINFOB##F32}, \ {OPNAME "_F32", OPINFOA##F32, OPINFOB##F32}, \
{OPNAME "_F64", OPINFOA##F64, OPINFOB##F64} {OPNAME "_F64", OPINFOA##F64, OPINFOB##F64}
@ -231,17 +250,17 @@ static CeOpInfo gOpInfo[] =
CEOPINFO_SIZED_FLOAT_2("Tan", CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_FLOAT_2("Tan", CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_FLOAT_2("Tanh", CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_FLOAT_2("Tanh", CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_EQ", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_EQ", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_NE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_NE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_SLT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_SLT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_3("Cmp_ULT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_3_RESULT8("Cmp_ULT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_SLE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_SLE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_3("Cmp_ULE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_3_RESULT8("Cmp_ULE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_SGT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_SGT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_3("Cmp_UGT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_3_RESULT8("Cmp_UGT", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_3("Cmp_SGE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_3_RESULT8("Cmp_SGE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_3("Cmp_UGE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_3_RESULT8("Cmp_UGE", CEOI_FrameRef, CEOI_FrameRef, CEOI_FrameRef),
CEOPINFO_SIZED_NUMERIC_PLUSF_2("Neg", CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_PLUSF_2_RESULT8("Neg", CEOI_FrameRef, CEOI_FrameRef),
{"Not_I1", CEOI_FrameRef8, CEOI_FrameRef8}, {"Not_I1", CEOI_FrameRef8, CEOI_FrameRef8},
CEOPINFO_SIZED_NUMERIC_2("Not", CEOI_FrameRef, CEOI_FrameRef), CEOPINFO_SIZED_NUMERIC_2("Not", CEOI_FrameRef, CEOI_FrameRef),
}; };
@ -868,6 +887,11 @@ void CeBuilder::EmitSizedOp(CeOp val, int size)
Emit((CeOp)(val + sizeClass)); Emit((CeOp)(val + sizeClass));
if (sizeClass == CeSizeClass_X) if (sizeClass == CeSizeClass_X)
Emit((int32)size); Emit((int32)size);
if ((CeOp)(val + sizeClass) == CeOp_AddConst_I64)
{
NOP;
}
} }
void CeBuilder::Emit(int32 val) void CeBuilder::Emit(int32 val)
@ -2663,9 +2687,12 @@ void CeBuilder::Build()
EmitSizedOp(CeOp_AddConst_I8, mPtrSize); EmitSizedOp(CeOp_AddConst_I8, mPtrSize);
EmitFrameOffset(result); EmitFrameOffset(result);
EmitFrameOffset(ceVal); EmitFrameOffset(ceVal);
Emit((int32)(ceIdx1.mImmediate * arrayType->mElementType->GetStride()));
int32 byteOffset = (int32)(ceIdx1.mImmediate * arrayType->mElementType->GetStride());
if (mPtrSize == 8) if (mPtrSize == 8)
Emit((int32)0); Emit((int64)byteOffset);
else
Emit((int32)byteOffset);
} }
} }
else else
@ -2776,9 +2803,10 @@ void CeBuilder::Build()
EmitSizedOp(CeOp_AddConst_I8, mPtrSize); EmitSizedOp(CeOp_AddConst_I8, mPtrSize);
EmitFrameOffset(result); EmitFrameOffset(result);
EmitFrameOffset(ceVal); EmitFrameOffset(ceVal);
Emit((int32)byteOffset);
if (mPtrSize == 8) if (mPtrSize == 8)
Emit((int32)0); Emit((int64)byteOffset);
else
Emit((int32)byteOffset);
} }
else else
{ {
@ -2799,9 +2827,10 @@ void CeBuilder::Build()
EmitSizedOp(CeOp_AddConst_I8, mPtrSize); EmitSizedOp(CeOp_AddConst_I8, mPtrSize);
EmitFrameOffset(result); EmitFrameOffset(result);
EmitFrameOffset(ceVal); EmitFrameOffset(ceVal);
Emit((int32)byteOffset);
if (mPtrSize == 8) if (mPtrSize == 8)
Emit((int32)0); Emit((int64)byteOffset);
else
Emit((int32)byteOffset);
} }
} }
else else