compiler: fix float <-> int conversions
Этот коммит содержится в:
		
							родитель
							
								
									8da1a5bc17
								
							
						
					
					
						коммит
						e66d457c42
					
				
					 3 изменённых файлов: 21 добавлений и 6 удалений
				
			
		|  | @ -3306,19 +3306,19 @@ func (c *Compiler) parseConvert(typeFrom, typeTo types.Type, value llvm.Value) ( | |||
| 
 | ||||
| 		if typeFrom.Info()&types.IsFloat != 0 && typeTo.Info()&types.IsInteger != 0 { | ||||
| 			// Conversion from float to int. | ||||
| 			if typeTo.Info()&types.IsUnsigned != 0 { // to signed int | ||||
| 				return c.builder.CreateFPToSI(value, llvmTypeTo, ""), nil | ||||
| 			} else { // to unsigned int | ||||
| 			if typeTo.Info()&types.IsUnsigned != 0 { // if unsigned | ||||
| 				return c.builder.CreateFPToUI(value, llvmTypeTo, ""), nil | ||||
| 			} else { // if signed | ||||
| 				return c.builder.CreateFPToSI(value, llvmTypeTo, ""), nil | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if typeFrom.Info()&types.IsInteger != 0 && typeTo.Info()&types.IsFloat != 0 { | ||||
| 			// Conversion from int to float. | ||||
| 			if typeFrom.Info()&types.IsUnsigned != 0 { // from signed int | ||||
| 				return c.builder.CreateSIToFP(value, llvmTypeTo, ""), nil | ||||
| 			} else { // from unsigned int | ||||
| 			if typeFrom.Info()&types.IsUnsigned != 0 { // if unsigned | ||||
| 				return c.builder.CreateUIToFP(value, llvmTypeTo, ""), nil | ||||
| 			} else { // if signed | ||||
| 				return c.builder.CreateSIToFP(value, llvmTypeTo, ""), nil | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										13
									
								
								testdata/float.go
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										13
									
								
								testdata/float.go
									
										
									
									
										предоставленный
									
									
								
							|  | @ -24,6 +24,19 @@ func main() { | |||
| 	println(float32(f64)) | ||||
| 	println(float64(f32)) | ||||
| 
 | ||||
| 	// float -> int | ||||
| 	var f1 float32 = 3.3 | ||||
| 	var f2 float32 = 5.7 | ||||
| 	var f3 float32 = -2.3 | ||||
| 	var f4 float32 = -11.8 | ||||
| 	println(int32(f1), int32(f2), int32(f3), int32(f4)) | ||||
| 
 | ||||
| 	// int -> float | ||||
| 	var i1 int32 = 53 | ||||
| 	var i2 int32 = -8 | ||||
| 	var i3 uint32 = 20 | ||||
| 	println(float32(i1), float32(i2), float32(i3)) | ||||
| 
 | ||||
| 	// complex64 | ||||
| 	c64 := complex(f32, 1.2) | ||||
| 	println(c64) | ||||
|  |  | |||
							
								
								
									
										2
									
								
								testdata/float.txt
									
										
									
									
										предоставленный
									
									
								
							
							
						
						
									
										2
									
								
								testdata/float.txt
									
										
									
									
										предоставленный
									
									
								
							|  | @ -11,6 +11,8 @@ | |||
| +3.333333e-001 | ||||
| +6.666667e-001 | ||||
| +6.666667e-001 | ||||
| 3 5 -2 -11 | ||||
| +5.300000e+001 -8.000000e+000 +2.000000e+001 | ||||
| (+6.666667e-001+1.200000e+000i) | ||||
| +6.666667e-001 | ||||
| +1.200000e+000 | ||||
|  |  | |||
		Загрузка…
	
	Создание таблицы
		
		Сослаться в новой задаче
	
	 Ayke van Laethem
						Ayke van Laethem