Parcourir la source

Float to uint conversion in consteval

Simon Lübeß il y a 3 ans
Parent
commit
3f9c2fd3f7
2 fichiers modifiés avec 74 ajouts et 0 suppressions
  1. 66 0
      IDEHelper/Compiler/CeMachine.cpp
  2. 8 0
      IDEHelper/Compiler/CeMachine.h

+ 66 - 0
IDEHelper/Compiler/CeMachine.cpp

@@ -176,11 +176,19 @@ static CeOpInfo gOpInfo[] =
 	{"CeOp_Conv_F32_I16", CEOI_FrameRef16, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_I16", CEOI_FrameRef16, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_I32", CEOI_FrameRef32, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_I32", CEOI_FrameRef32, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_I64", CEOI_FrameRef64, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_I64", CEOI_FrameRef64, CEOI_FrameRefF32},
+	{"CeOp_Conv_F32_U8", CEOI_FrameRef8, CEOI_FrameRefF32},
+	{"CeOp_Conv_F32_U16", CEOI_FrameRef16, CEOI_FrameRefF32},
+	{"CeOp_Conv_F32_U32", CEOI_FrameRef32, CEOI_FrameRefF32},
+	{"CeOp_Conv_F32_U64", CEOI_FrameRef64, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_F64", CEOI_FrameRefF32, CEOI_FrameRefF32},
 	{"CeOp_Conv_F32_F64", CEOI_FrameRefF32, CEOI_FrameRefF32},
 	{"CeOp_Conv_F64_I8", CEOI_FrameRef8, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I8", CEOI_FrameRef8, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I16", CEOI_FrameRef16, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I16", CEOI_FrameRef16, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I32", CEOI_FrameRef32, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I32", CEOI_FrameRef32, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I64", CEOI_FrameRef64, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_I64", CEOI_FrameRef64, CEOI_FrameRefF64},
+	{"CeOp_Conv_F64_U8", CEOI_FrameRef8, CEOI_FrameRefF64},
+	{"CeOp_Conv_F64_U16", CEOI_FrameRef16, CEOI_FrameRefF64},
+	{"CeOp_Conv_F64_U32", CEOI_FrameRef32, CEOI_FrameRefF64},
+	{"CeOp_Conv_F64_U64", CEOI_FrameRef64, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_F32", CEOI_FrameRefF32, CEOI_FrameRefF64},
 	{"CeOp_Conv_F64_F32", CEOI_FrameRefF32, CEOI_FrameRefF64},
 	
 	
 	CEOPINFO_SIZED_NUMERIC_PLUSF_2("Abs", CEOI_FrameRef, CEOI_FrameRef),
 	CEOPINFO_SIZED_NUMERIC_PLUSF_2("Abs", CEOI_FrameRef, CEOI_FrameRef),
@@ -2266,6 +2274,40 @@ void CeBuilder::Build()
 										break;
 										break;
 									}
 									}
 									break;
 									break;
+								case BeTypeCode_Float:
+									switch (toTypeCode)
+									{
+									case BeTypeCode_Int8:
+										op = CeOp_Conv_F32_U8;
+										break;
+									case BeTypeCode_Int16:
+										op = CeOp_Conv_F32_U16;
+										break;
+									case BeTypeCode_Int32:
+										op = CeOp_Conv_F32_U32;
+										break;
+									case BeTypeCode_Int64:
+										op = CeOp_Conv_F32_U64;
+										break;
+									}
+									break;
+								case BeTypeCode_Double:
+									switch (toTypeCode)
+									{
+									case BeTypeCode_Int8:
+										op = CeOp_Conv_F64_U8;
+										break;
+									case BeTypeCode_Int16:
+										op = CeOp_Conv_F64_U16;
+										break;
+									case BeTypeCode_Int32:
+										op = CeOp_Conv_F64_U32;
+										break;
+									case BeTypeCode_Int64:
+										op = CeOp_Conv_F64_U64;
+										break;
+									}
+									break;
 								}
 								}
 							}
 							}
 							
 							
@@ -7937,6 +7979,30 @@ bool CeContext::Execute(CeFunction* startFunction, uint8* startStackPtr, uint8*
 		case CeOp_Conv_F64_F32:
 		case CeOp_Conv_F64_F32:
 			CE_CAST(double, float);
 			CE_CAST(double, float);
 			break;
 			break;
+		case CeOp_Conv_F32_U8:
+			CE_CAST(float, uint8);
+			break;
+		case CeOp_Conv_F32_U16:
+			CE_CAST(float, uint16);
+			break;
+		case CeOp_Conv_F32_U32:
+			CE_CAST(float, uint32);
+			break;
+		case CeOp_Conv_F32_U64:
+			CE_CAST(float, uint64);
+			break;
+		case CeOp_Conv_F64_U8:
+			CE_CAST(float, uint8);
+			break;
+		case CeOp_Conv_F64_U16:
+			CE_CAST(float, uint16);
+			break;
+		case CeOp_Conv_F64_U32:
+			CE_CAST(float, uint32);
+			break;
+		case CeOp_Conv_F64_U64:
+			CE_CAST(float, uint64);
+			break;
 
 
 		case CeOp_Abs_I8:
 		case CeOp_Abs_I8:
 			{
 			{

+ 8 - 0
IDEHelper/Compiler/CeMachine.h

@@ -149,11 +149,19 @@ enum CeOp : int16
 	CeOp_Conv_F32_I16,
 	CeOp_Conv_F32_I16,
 	CeOp_Conv_F32_I32,
 	CeOp_Conv_F32_I32,
 	CeOp_Conv_F32_I64,
 	CeOp_Conv_F32_I64,
+	CeOp_Conv_F32_U8,
+	CeOp_Conv_F32_U16,
+	CeOp_Conv_F32_U32,
+	CeOp_Conv_F32_U64,
 	CeOp_Conv_F32_F64,
 	CeOp_Conv_F32_F64,
 	CeOp_Conv_F64_I8,
 	CeOp_Conv_F64_I8,
 	CeOp_Conv_F64_I16,
 	CeOp_Conv_F64_I16,
 	CeOp_Conv_F64_I32,
 	CeOp_Conv_F64_I32,
 	CeOp_Conv_F64_I64,
 	CeOp_Conv_F64_I64,
+	CeOp_Conv_F64_U8,
+	CeOp_Conv_F64_U16,
+	CeOp_Conv_F64_U32,
+	CeOp_Conv_F64_U64,
 	CeOp_Conv_F64_F32,
 	CeOp_Conv_F64_F32,
 
 
 	CEOP_SIZED_NUMERIC_PLUSF(Abs),
 	CEOP_SIZED_NUMERIC_PLUSF(Abs),