Explorar o código

Fixed sign extension for constexpr geps

Brian Fiete %!s(int64=2) %!d(string=hai) anos
pai
achega
974e8ac354
Modificáronse 2 ficheiros con 49 adicións e 17 borrados
  1. 3 0
      IDEHelper/Compiler/BfExprEvaluator.cpp
  2. 46 17
      IDEHelper/Compiler/CeMachine.cpp

+ 3 - 0
IDEHelper/Compiler/BfExprEvaluator.cpp

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

+ 46 - 17
IDEHelper/Compiler/CeMachine.cpp

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