| ... | @@ -937,7 +937,7 @@ pub const Value = extern union { | ... | @@ -937,7 +937,7 @@ pub const Value = extern union { |
| 937 | /// Asserts that the value is a float or an integer. | 937 | /// Asserts that the value is a float or an integer. |
| 938 | pub fn toFloat(self: Value, comptime T: type) T { | 938 | pub fn toFloat(self: Value, comptime T: type) T { |
| 939 | return switch (self.tag()) { | 939 | return switch (self.tag()) { |
| 940 | .float_16 => @panic("TODO soft float"), | 940 | .float_16 => @floatCast(T, self.castTag(.float_16).?.data), |
| 941 | .float_32 => @floatCast(T, self.castTag(.float_32).?.data), | 941 | .float_32 => @floatCast(T, self.castTag(.float_32).?.data), |
| 942 | .float_64 => @floatCast(T, self.castTag(.float_64).?.data), | 942 | .float_64 => @floatCast(T, self.castTag(.float_64).?.data), |
| 943 | .float_128 => @floatCast(T, self.castTag(.float_128).?.data), | 943 | .float_128 => @floatCast(T, self.castTag(.float_128).?.data), |
| ... | @@ -1046,11 +1046,10 @@ pub const Value = extern union { | ... | @@ -1046,11 +1046,10 @@ pub const Value = extern union { |
| 1046 | pub fn floatCast(self: Value, allocator: *Allocator, dest_ty: Type) !Value { | 1046 | pub fn floatCast(self: Value, allocator: *Allocator, dest_ty: Type) !Value { |
| 1047 | switch (dest_ty.tag()) { | 1047 | switch (dest_ty.tag()) { |
| 1048 | .f16 => { | 1048 | .f16 => { |
| 1049 | @panic("TODO add __trunctfhf2 to compiler-rt"); | 1049 | const res = try Value.Tag.float_16.create(allocator, self.toFloat(f16)); |
| 1050 | //const res = try Value.Tag.float_16.create(allocator, self.toFloat(f16)); | 1050 | if (!self.eql(res, dest_ty)) |
| 1051 | //if (!self.eql(res)) | 1051 | return error.Overflow; |
| 1052 | // return error.Overflow; | 1052 | return res; |
| 1053 | //return res; | | |
| 1054 | }, | 1053 | }, |
| 1055 | .f32 => { | 1054 | .f32 => { |
| 1056 | const res = try Value.Tag.float_32.create(allocator, self.toFloat(f32)); | 1055 | const res = try Value.Tag.float_32.create(allocator, self.toFloat(f32)); |
| ... | @@ -1901,10 +1900,9 @@ pub const Value = extern union { | ... | @@ -1901,10 +1900,9 @@ pub const Value = extern union { |
| 1901 | ) !Value { | 1900 | ) !Value { |
| 1902 | switch (float_type.tag()) { | 1901 | switch (float_type.tag()) { |
| 1903 | .f16 => { | 1902 | .f16 => { |
| 1904 | @panic("TODO add __trunctfhf2 to compiler-rt"); | 1903 | const lhs_val = lhs.toFloat(f16); |
| 1905 | //const lhs_val = lhs.toFloat(f16); | 1904 | const rhs_val = rhs.toFloat(f16); |
| 1906 | //const rhs_val = rhs.toFloat(f16); | 1905 | return Value.Tag.float_16.create(arena, lhs_val + rhs_val); |
| 1907 | //return Value.Tag.float_16.create(arena, lhs_val + rhs_val); | | |
| 1908 | }, | 1906 | }, |
| 1909 | .f32 => { | 1907 | .f32 => { |
| 1910 | const lhs_val = lhs.toFloat(f32); | 1908 | const lhs_val = lhs.toFloat(f32); |
| ... | @@ -1933,10 +1931,9 @@ pub const Value = extern union { | ... | @@ -1933,10 +1931,9 @@ pub const Value = extern union { |
| 1933 | ) !Value { | 1931 | ) !Value { |
| 1934 | switch (float_type.tag()) { | 1932 | switch (float_type.tag()) { |
| 1935 | .f16 => { | 1933 | .f16 => { |
| 1936 | @panic("TODO add __trunctfhf2 to compiler-rt"); | 1934 | const lhs_val = lhs.toFloat(f16); |
| 1937 | //const lhs_val = lhs.toFloat(f16); | 1935 | const rhs_val = rhs.toFloat(f16); |
| 1938 | //const rhs_val = rhs.toFloat(f16); | 1936 | return Value.Tag.float_16.create(arena, lhs_val - rhs_val); |
| 1939 | //return Value.Tag.float_16.create(arena, lhs_val - rhs_val); | | |
| 1940 | }, | 1937 | }, |
| 1941 | .f32 => { | 1938 | .f32 => { |
| 1942 | const lhs_val = lhs.toFloat(f32); | 1939 | const lhs_val = lhs.toFloat(f32); |
| ... | @@ -1965,10 +1962,9 @@ pub const Value = extern union { | ... | @@ -1965,10 +1962,9 @@ pub const Value = extern union { |
| 1965 | ) !Value { | 1962 | ) !Value { |
| 1966 | switch (float_type.tag()) { | 1963 | switch (float_type.tag()) { |
| 1967 | .f16 => { | 1964 | .f16 => { |
| 1968 | @panic("TODO add __trunctfhf2 to compiler-rt"); | 1965 | const lhs_val = lhs.toFloat(f16); |
| 1969 | //const lhs_val = lhs.toFloat(f16); | 1966 | const rhs_val = rhs.toFloat(f16); |
| 1970 | //const rhs_val = rhs.toFloat(f16); | 1967 | return Value.Tag.float_16.create(arena, lhs_val / rhs_val); |
| 1971 | //return Value.Tag.float_16.create(arena, lhs_val / rhs_val); | | |
| 1972 | }, | 1968 | }, |
| 1973 | .f32 => { | 1969 | .f32 => { |
| 1974 | const lhs_val = lhs.toFloat(f32); | 1970 | const lhs_val = lhs.toFloat(f32); |
| ... | @@ -1997,10 +1993,9 @@ pub const Value = extern union { | ... | @@ -1997,10 +1993,9 @@ pub const Value = extern union { |
| 1997 | ) !Value { | 1993 | ) !Value { |
| 1998 | switch (float_type.tag()) { | 1994 | switch (float_type.tag()) { |
| 1999 | .f16 => { | 1995 | .f16 => { |
| 2000 | @panic("TODO add __trunctfhf2 to compiler-rt"); | 1996 | const lhs_val = lhs.toFloat(f16); |
| 2001 | //const lhs_val = lhs.toFloat(f16); | 1997 | const rhs_val = rhs.toFloat(f16); |
| 2002 | //const rhs_val = rhs.toFloat(f16); | 1998 | return Value.Tag.float_16.create(arena, lhs_val * rhs_val); |
| 2003 | //return Value.Tag.float_16.create(arena, lhs_val * rhs_val); | | |
| 2004 | }, | 1999 | }, |
| 2005 | .f32 => { | 2000 | .f32 => { |
| 2006 | const lhs_val = lhs.toFloat(f32); | 2001 | const lhs_val = lhs.toFloat(f32); |