authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2022-01-19 12:26:30+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-01-28 11:45:04-07:00
loga31a749c42505e53308c0f2426db283ea130e776
tree06030cf2b8fbd1fe4204d9e95662e5c2b601f50a
parent0e6d2184cacf2dd1fad7508b2f9ae99d78763148

stage1: add f80 type


15 files changed, 380 insertions(+), 31 deletions(-)

CMakeLists.txt+31
...@@ -142,15 +142,19 @@ include_directories(${CLANG_INCLUDE_DIRS})...@@ -142,15 +142,19 @@ include_directories(${CLANG_INCLUDE_DIRS})
142# No patches have been applied to SoftFloat-3e142# No patches have been applied to SoftFloat-3e
143set(EMBEDDED_SOFTFLOAT_SOURCES143set(EMBEDDED_SOFTFLOAT_SOURCES
144 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/f128M_isSignalingNaN.c"144 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/f128M_isSignalingNaN.c"
145 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/extF80M_isSignalingNaN.c"
145 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF128M.c"146 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF128M.c"
147 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToExtF80M.c"
146 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF16UI.c"148 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF16UI.c"
147 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF32UI.c"149 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF32UI.c"
148 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF64UI.c"150 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_commonNaNToF64UI.c"
149 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f128MToCommonNaN.c"151 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f128MToCommonNaN.c"
152 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_extF80MToCommonNaN.c"
150 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f16UIToCommonNaN.c"153 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f16UIToCommonNaN.c"
151 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f32UIToCommonNaN.c"154 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f32UIToCommonNaN.c"
152 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f64UIToCommonNaN.c"155 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_f64UIToCommonNaN.c"
153 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF128M.c"156 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF128M.c"
157 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNExtF80M.c"
154 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF16UI.c"158 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/s_propagateNaNF16UI.c"
155 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/softfloat_raiseFlags.c"159 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/8086/softfloat_raiseFlags.c"
156 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_add.c"160 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_add.c"
...@@ -170,6 +174,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -170,6 +174,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
170 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f16.c"174 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f16.c"
171 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f32.c"175 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f32.c"
172 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f64.c"176 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_f64.c"
177 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_extF80M.c"
173 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32.c"178 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32.c"
174 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32_r_minMag.c"179 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i32_r_minMag.c"
175 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i64.c"180 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_i64.c"
...@@ -178,6 +183,20 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -178,6 +183,20 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
178 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui32_r_minMag.c"183 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui32_r_minMag.c"
179 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64.c"184 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64.c"
180 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64_r_minMag.c"185 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_to_ui64_r_minMag.c"
186 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_add.c"
187 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_div.c"
188 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_eq.c"
189 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_le.c"
190 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_lt.c"
191 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_mul.c"
192 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_rem.c"
193 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_roundToInt.c"
194 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_sqrt.c"
195 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_sub.c"
196 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_to_f16.c"
197 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_to_f32.c"
198 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_to_f64.c"
199 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/extF80M_to_f128M.c"
181 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_add.c"200 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_add.c"
182 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_div.c"201 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_div.c"
183 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_eq.c"202 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_eq.c"
...@@ -188,9 +207,12 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -188,9 +207,12 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
188 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_roundToInt.c"207 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_roundToInt.c"
189 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sqrt.c"208 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sqrt.c"
190 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sub.c"209 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_sub.c"
210 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_extF80M.c"
191 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f128M.c"211 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f128M.c"
192 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f64.c"212 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_to_f64.c"
213 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f32_to_extF80M.c"
193 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f32_to_f128M.c"214 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f32_to_f128M.c"
215 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_extF80M.c"
194 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f128M.c"216 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f128M.c"
195 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f16.c"217 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f64_to_f16.c"
196 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/i32_to_f128M.c"218 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/i32_to_f128M.c"
...@@ -198,6 +220,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -198,6 +220,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
198 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addCarryM.c"220 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addCarryM.c"
199 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addComplCarryM.c"221 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addComplCarryM.c"
200 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addF128M.c"222 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addF128M.c"
223 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addExtF80M.c"
201 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addM.c"224 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addM.c"
202 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF16.c"225 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF16.c"
203 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF32.c"226 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_addMagsF32.c"
...@@ -208,12 +231,14 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -208,12 +231,14 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
208 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecip_1Ks.c"231 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_approxRecip_1Ks.c"
209 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare128M.c"232 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare128M.c"
210 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare96M.c"233 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compare96M.c"
234 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_compareNonnormExtF80M.c"
211 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros16.c"235 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros16.c"
212 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros32.c"236 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros32.c"
213 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros64.c"237 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros64.c"
214 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros8.c"238 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_countLeadingZeros8.c"
215 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_eq128.c"239 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_eq128.c"
216 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_invalidF128M.c"240 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_invalidF128M.c"
241 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_invalidExtF80M.c"
217 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_isNaNF128M.c"242 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_isNaNF128M.c"
218 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_le128.c"243 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_le128.c"
219 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_lt128.c"244 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_lt128.c"
...@@ -224,7 +249,9 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -224,7 +249,9 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
224 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF32.c"249 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF32.c"
225 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF64.c"250 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_mulAddF64.c"
226 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_negXM.c"251 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_negXM.c"
252 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normExtF80SigM.c"
227 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackMToF128M.c"253 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackMToF128M.c"
254 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackMToExtF80M.c"
228 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF16.c"255 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF16.c"
229 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF32.c"256 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF32.c"
230 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF64.c"257 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_normRoundPackToF64.c"
...@@ -235,6 +262,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -235,6 +262,7 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
235 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_remStepMBy32.c"262 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_remStepMBy32.c"
236 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToI64.c"263 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToI64.c"
237 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToUI64.c"264 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundMToUI64.c"
265 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackMToExtF80M.c"
238 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackMToF128M.c"266 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackMToF128M.c"
239 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF16.c"267 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF16.c"
240 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF32.c"268 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_roundPackToF32.c"
...@@ -263,11 +291,14 @@ set(EMBEDDED_SOFTFLOAT_SOURCES...@@ -263,11 +291,14 @@ set(EMBEDDED_SOFTFLOAT_SOURCES
263 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF32.c"291 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF32.c"
264 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF64.c"292 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_subMagsF64.c"
265 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_tryPropagateNaNF128M.c"293 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_tryPropagateNaNF128M.c"
294 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/s_tryPropagateNaNExtF80M.c"
266 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_mulAdd.c"295 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f16_mulAdd.c"
267 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_mulAdd.c"296 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/f128M_mulAdd.c"
268 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/softfloat_state.c"297 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/softfloat_state.c"
269 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui32_to_f128M.c"298 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui32_to_f128M.c"
270 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui64_to_f128M.c"299 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui64_to_f128M.c"
300 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui32_to_extF80M.c"
301 "${CMAKE_SOURCE_DIR}/deps/SoftFloat-3e/source/ui64_to_extF80M.c"
271)302)
272add_library(embedded_softfloat STATIC ${EMBEDDED_SOFTFLOAT_SOURCES})303add_library(embedded_softfloat STATIC ${EMBEDDED_SOFTFLOAT_SOURCES})
273if(MSVC)304if(MSVC)
src/AstGen.zig+2
...@@ -7723,6 +7723,7 @@ const primitives = std.ComptimeStringMap(Zir.Inst.Ref, .{...@@ -7723,6 +7723,7 @@ const primitives = std.ComptimeStringMap(Zir.Inst.Ref, .{
7723 .{ "f16", .f16_type },7723 .{ "f16", .f16_type },
7724 .{ "f32", .f32_type },7724 .{ "f32", .f32_type },
7725 .{ "f64", .f64_type },7725 .{ "f64", .f64_type },
7726 .{ "f80", .f80_type },
7726 .{ "false", .bool_false },7727 .{ "false", .bool_false },
7727 .{ "i16", .i16_type },7728 .{ "i16", .i16_type },
7728 .{ "i32", .i32_type },7729 .{ "i32", .i32_type },
...@@ -8732,6 +8733,7 @@ fn rvalue(...@@ -8732,6 +8733,7 @@ fn rvalue(
8732 as_ty | @enumToInt(Zir.Inst.Ref.f16_type),8733 as_ty | @enumToInt(Zir.Inst.Ref.f16_type),
8733 as_ty | @enumToInt(Zir.Inst.Ref.f32_type),8734 as_ty | @enumToInt(Zir.Inst.Ref.f32_type),
8734 as_ty | @enumToInt(Zir.Inst.Ref.f64_type),8735 as_ty | @enumToInt(Zir.Inst.Ref.f64_type),
8736 as_ty | @enumToInt(Zir.Inst.Ref.f80_type),
8735 as_ty | @enumToInt(Zir.Inst.Ref.f128_type),8737 as_ty | @enumToInt(Zir.Inst.Ref.f128_type),
8736 as_ty | @enumToInt(Zir.Inst.Ref.anyopaque_type),8738 as_ty | @enumToInt(Zir.Inst.Ref.anyopaque_type),
8737 as_ty | @enumToInt(Zir.Inst.Ref.bool_type),8739 as_ty | @enumToInt(Zir.Inst.Ref.bool_type),
src/Sema.zig+3
...@@ -16950,6 +16950,7 @@ pub fn typeHasOnePossibleValue(...@@ -16950,6 +16950,7 @@ pub fn typeHasOnePossibleValue(
16950 .f16,16950 .f16,
16951 .f32,16951 .f32,
16952 .f64,16952 .f64,
16953 .f80,
16953 .f128,16954 .f128,
16954 .c_longdouble,16955 .c_longdouble,
16955 .comptime_int,16956 .comptime_int,
...@@ -17227,6 +17228,7 @@ pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref {...@@ -17227,6 +17228,7 @@ pub fn addType(sema: *Sema, ty: Type) !Air.Inst.Ref {
17227 .f16 => return .f16_type,17228 .f16 => return .f16_type,
17228 .f32 => return .f32_type,17229 .f32 => return .f32_type,
17229 .f64 => return .f64_type,17230 .f64 => return .f64_type,
17231 .f80 => return .f80_type,
17230 .f128 => return .f128_type,17232 .f128 => return .f128_type,
17231 .anyopaque => return .anyopaque_type,17233 .anyopaque => return .anyopaque_type,
17232 .bool => return .bool_type,17234 .bool => return .bool_type,
...@@ -17572,6 +17574,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C...@@ -17572,6 +17574,7 @@ fn typeRequiresComptime(sema: *Sema, block: *Block, src: LazySrcLoc, ty: Type) C
17572 .f16,17574 .f16,
17573 .f32,17575 .f32,
17574 .f64,17576 .f64,
17577 .f80,
17575 .f128,17578 .f128,
17576 .anyopaque,17579 .anyopaque,
17577 .bool,17580 .bool,
src/Zir.zig+5
...@@ -1639,6 +1639,7 @@ pub const Inst = struct {...@@ -1639,6 +1639,7 @@ pub const Inst = struct {
1639 f16_type,1639 f16_type,
1640 f32_type,1640 f32_type,
1641 f64_type,1641 f64_type,
1642 f80_type,
1642 f128_type,1643 f128_type,
1643 anyopaque_type,1644 anyopaque_type,
1644 bool_type,1645 bool_type,
...@@ -1809,6 +1810,10 @@ pub const Inst = struct {...@@ -1809,6 +1810,10 @@ pub const Inst = struct {
1809 .ty = Type.initTag(.type),1810 .ty = Type.initTag(.type),
1810 .val = Value.initTag(.f64_type),1811 .val = Value.initTag(.f64_type),
1811 },1812 },
1813 .f80_type = .{
1814 .ty = Type.initTag(.type),
1815 .val = Value.initTag(.f80_type),
1816 },
1812 .f128_type = .{1817 .f128_type = .{
1813 .ty = Type.initTag(.type),1818 .ty = Type.initTag(.type),
1814 .val = Value.initTag(.f128_type),1819 .val = Value.initTag(.f128_type),
src/stage1/all_types.hpp+2
...@@ -516,6 +516,7 @@ struct ZigValue {...@@ -516,6 +516,7 @@ struct ZigValue {
516 float16_t x_f16;516 float16_t x_f16;
517 float x_f32;517 float x_f32;
518 double x_f64;518 double x_f64;
519 extFloat80_t x_f80;
519 float128_t x_f128;520 float128_t x_f128;
520 bool x_bool;521 bool x_bool;
521 ConstBoundFnValue x_bound_fn;522 ConstBoundFnValue x_bound_fn;
...@@ -2089,6 +2090,7 @@ struct CodeGen {...@@ -2089,6 +2090,7 @@ struct CodeGen {
2089 ZigType *entry_f16;2090 ZigType *entry_f16;
2090 ZigType *entry_f32;2091 ZigType *entry_f32;
2091 ZigType *entry_f64;2092 ZigType *entry_f64;
2093 ZigType *entry_f80;
2092 ZigType *entry_f128;2094 ZigType *entry_f128;
2093 ZigType *entry_void;2095 ZigType *entry_void;
2094 ZigType *entry_unreachable;2096 ZigType *entry_unreachable;
src/stage1/analyze.cpp+13
...@@ -5647,6 +5647,9 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {...@@ -5647,6 +5647,9 @@ static uint32_t hash_combine_const_val(uint32_t hash_val, ZigValue *const_val) {
5647 case 16: return hash_combine(hash_val, &const_val->data.x_f16);5647 case 16: return hash_combine(hash_val, &const_val->data.x_f16);
5648 case 32: return hash_combine(hash_val, &const_val->data.x_f32);5648 case 32: return hash_combine(hash_val, &const_val->data.x_f32);
5649 case 64: return hash_combine(hash_val, &const_val->data.x_f64);5649 case 64: return hash_combine(hash_val, &const_val->data.x_f64);
5650 case 80:
5651 hash_val = hash_combine(hash_val, &const_val->data.x_f80.signExp);
5652 return hash_combine(hash_val, &const_val->data.x_f80.signif);
5650 case 128: return hash_combine(hash_val, &const_val->data.x_f128);5653 case 128: return hash_combine(hash_val, &const_val->data.x_f128);
5651 default: zig_unreachable();5654 default: zig_unreachable();
5652 }5655 }
...@@ -6325,6 +6328,7 @@ void init_const_float(ZigValue *const_val, ZigType *type, double value) {...@@ -6325,6 +6328,7 @@ void init_const_float(ZigValue *const_val, ZigType *type, double value) {
6325 case 64:6328 case 64:
6326 const_val->data.x_f64 = value;6329 const_val->data.x_f64 = value;
6327 break;6330 break;
6331 case 80:
6328 case 128:6332 case 128:
6329 // if we need this, we should add a function that accepts a float128_t param6333 // if we need this, we should add a function that accepts a float128_t param
6330 zig_unreachable();6334 zig_unreachable();
...@@ -7218,6 +7222,8 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {...@@ -7218,6 +7222,8 @@ bool const_values_equal(CodeGen *g, ZigValue *a, ZigValue *b) {
7218 return a->data.x_f32 == b->data.x_f32;7222 return a->data.x_f32 == b->data.x_f32;
7219 case 64:7223 case 64:
7220 return a->data.x_f64 == b->data.x_f64;7224 return a->data.x_f64 == b->data.x_f64;
7225 case 80:
7226 return extF80M_eq(&a->data.x_f80, &b->data.x_f80);
7221 case 128:7227 case 128:
7222 return f128M_eq(&a->data.x_f128, &b->data.x_f128);7228 return f128M_eq(&a->data.x_f128, &b->data.x_f128);
7223 default:7229 default:
...@@ -7470,6 +7476,13 @@ void render_const_value(CodeGen *g, Buf *buf, ZigValue *const_val) {...@@ -7470,6 +7476,13 @@ void render_const_value(CodeGen *g, Buf *buf, ZigValue *const_val) {
7470 case 64:7476 case 64:
7471 buf_appendf(buf, "%f", const_val->data.x_f64);7477 buf_appendf(buf, "%f", const_val->data.x_f64);
7472 return;7478 return;
7479 case 80: {
7480 float64_t f64_value = extF80M_to_f64(&const_val->data.x_f80);
7481 double double_value;
7482 memcpy(&double_value, &f64_value, sizeof(double));
7483 buf_appendf(buf, "%f", double_value);
7484 return;
7485 }
7473 case 128:7486 case 128:
7474 {7487 {
7475 const size_t extra_len = 100;7488 const size_t extra_len = 100;
src/stage1/codegen.cpp+13
...@@ -7692,6 +7692,12 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n...@@ -7692,6 +7692,12 @@ static LLVMValueRef gen_const_val(CodeGen *g, ZigValue *const_val, const char *n
7692 return LLVMConstReal(get_llvm_type(g, type_entry), const_val->data.x_f32);7692 return LLVMConstReal(get_llvm_type(g, type_entry), const_val->data.x_f32);
7693 case 64:7693 case 64:
7694 return LLVMConstReal(get_llvm_type(g, type_entry), const_val->data.x_f64);7694 return LLVMConstReal(get_llvm_type(g, type_entry), const_val->data.x_f64);
7695 case 80: {
7696 uint64_t buf[2];
7697 memcpy(&buf, &const_val->data.x_f80, 16);
7698 LLVMValueRef as_int = LLVMConstIntOfArbitraryPrecision(LLVMInt128Type(), 2, buf);
7699 return LLVMConstBitCast(as_int, get_llvm_type(g, type_entry));
7700 }
7695 case 128:7701 case 128:
7696 {7702 {
7697 uint64_t buf[2];7703 uint64_t buf[2];
...@@ -8911,6 +8917,13 @@ static void define_builtin_types(CodeGen *g) {...@@ -8911,6 +8917,13 @@ static void define_builtin_types(CodeGen *g) {
8911 add_fp_entry(g, "f64", 64, LLVMDoubleType(), &g->builtin_types.entry_f64);8917 add_fp_entry(g, "f64", 64, LLVMDoubleType(), &g->builtin_types.entry_f64);
8912 add_fp_entry(g, "f128", 128, LLVMFP128Type(), &g->builtin_types.entry_f128);8918 add_fp_entry(g, "f128", 128, LLVMFP128Type(), &g->builtin_types.entry_f128);
89138919
8920 if (target_has_f80(g->zig_target)) {
8921 add_fp_entry(g, "f80", 80, LLVMX86FP80Type(), &g->builtin_types.entry_f80);
8922 } else {
8923 // use f128 for correct size and alignment
8924 add_fp_entry(g, "f80", 128, LLVMFP128Type(), &g->builtin_types.entry_f80);
8925 }
8926
8914 switch (g->zig_target->arch) {8927 switch (g->zig_target->arch) {
8915 case ZigLLVM_x86:8928 case ZigLLVM_x86:
8916 case ZigLLVM_x86_64:8929 case ZigLLVM_x86_64:
src/stage1/ir.cpp+239-23
...@@ -2688,6 +2688,12 @@ static bool float_has_fraction(ZigValue *const_val) {...@@ -2688,6 +2688,12 @@ static bool float_has_fraction(ZigValue *const_val) {
2688 return floorf(const_val->data.x_f32) != const_val->data.x_f32;2688 return floorf(const_val->data.x_f32) != const_val->data.x_f32;
2689 case 64:2689 case 64:
2690 return floor(const_val->data.x_f64) != const_val->data.x_f64;2690 return floor(const_val->data.x_f64) != const_val->data.x_f64;
2691 case 80:
2692 {
2693 extFloat80_t floored;
2694 extF80M_roundToInt(&const_val->data.x_f80, softfloat_round_minMag, false, &floored);
2695 return !extF80M_eq(&floored, &const_val->data.x_f80);
2696 }
2691 case 128:2697 case 128:
2692 {2698 {
2693 float128_t floored;2699 float128_t floored;
...@@ -2716,6 +2722,15 @@ static void float_append_buf(Buf *buf, ZigValue *const_val) {...@@ -2716,6 +2722,15 @@ static void float_append_buf(Buf *buf, ZigValue *const_val) {
2716 case 64:2722 case 64:
2717 buf_appendf(buf, "%f", const_val->data.x_f64);2723 buf_appendf(buf, "%f", const_val->data.x_f64);
2718 break;2724 break;
2725 case 80:
2726 {
2727 float64_t f64_value = extF80M_to_f64(&const_val->data.x_f80);
2728 double double_value;
2729 memcpy(&double_value, &f64_value, sizeof(double));
2730
2731 buf_appendf(buf, "%f", const_val->data.x_f64);
2732 break;
2733 }
2719 case 128:2734 case 128:
2720 {2735 {
2721 // TODO actual implementation2736 // TODO actual implementation
...@@ -2772,6 +2787,15 @@ static void float_init_bigint(BigInt *bigint, ZigValue *const_val) {...@@ -2772,6 +2787,15 @@ static void float_init_bigint(BigInt *bigint, ZigValue *const_val) {
2772 bigint->is_negative = true;2787 bigint->is_negative = true;
2773 }2788 }
2774 break;2789 break;
2790 case 80:
2791 {
2792 float128_t f128_value;
2793 extF80M_to_f128M(&const_val->data.x_f80, &f128_value);
2794 BigFloat tmp_float;
2795 bigfloat_init_128(&tmp_float, f128_value);
2796 bigint_init_bigfloat(bigint, &tmp_float);
2797 }
2798 break;
2775 case 128:2799 case 128:
2776 {2800 {
2777 BigFloat tmp_float;2801 BigFloat tmp_float;
...@@ -2801,8 +2825,11 @@ static void float_init_bigfloat(ZigValue *dest_val, BigFloat *bigfloat) {...@@ -2801,8 +2825,11 @@ static void float_init_bigfloat(ZigValue *dest_val, BigFloat *bigfloat) {
2801 case 64:2825 case 64:
2802 dest_val->data.x_f64 = bigfloat_to_f64(bigfloat);2826 dest_val->data.x_f64 = bigfloat_to_f64(bigfloat);
2803 break;2827 break;
2804 case 80:2828 case 80: {
2805 zig_panic("TODO: float_init_bigfloat c_longdouble");2829 float128_t f128_value = bigfloat_to_f128(bigfloat);
2830 f128M_to_extF80M(&f128_value, &dest_val->data.x_f80);
2831 break;
2832 }
2806 case 128:2833 case 128:
2807 dest_val->data.x_f128 = bigfloat_to_f128(bigfloat);2834 dest_val->data.x_f128 = bigfloat_to_f128(bigfloat);
2808 break;2835 break;
...@@ -2828,6 +2855,9 @@ static void float_init_f16(ZigValue *dest_val, float16_t x) {...@@ -2828,6 +2855,9 @@ static void float_init_f16(ZigValue *dest_val, float16_t x) {
2828 case 64:2855 case 64:
2829 dest_val->data.x_f64 = zig_f16_to_double(x);2856 dest_val->data.x_f64 = zig_f16_to_double(x);
2830 break;2857 break;
2858 case 80:
2859 f16_to_extF80M(x, &dest_val->data.x_f80);
2860 break;
2831 case 128:2861 case 128:
2832 f16_to_f128M(x, &dest_val->data.x_f128);2862 f16_to_f128M(x, &dest_val->data.x_f128);
2833 break;2863 break;
...@@ -2853,6 +2883,12 @@ static void float_init_f32(ZigValue *dest_val, float x) {...@@ -2853,6 +2883,12 @@ static void float_init_f32(ZigValue *dest_val, float x) {
2853 case 64:2883 case 64:
2854 dest_val->data.x_f64 = x;2884 dest_val->data.x_f64 = x;
2855 break;2885 break;
2886 case 80: {
2887 float32_t x_f32;
2888 memcpy(&x_f32, &x, sizeof(float));
2889 f32_to_extF80M(x_f32, &dest_val->data.x_f80);
2890 break;
2891 }
2856 case 128:2892 case 128:
2857 {2893 {
2858 float32_t x_f32;2894 float32_t x_f32;
...@@ -2882,6 +2918,12 @@ static void float_init_f64(ZigValue *dest_val, double x) {...@@ -2882,6 +2918,12 @@ static void float_init_f64(ZigValue *dest_val, double x) {
2882 case 64:2918 case 64:
2883 dest_val->data.x_f64 = x;2919 dest_val->data.x_f64 = x;
2884 break;2920 break;
2921 case 80: {
2922 float64_t x_f64;
2923 memcpy(&x_f64, &x, sizeof(double));
2924 f64_to_extF80M(x_f64, &dest_val->data.x_f80);
2925 break;
2926 }
2885 case 128:2927 case 128:
2886 {2928 {
2887 float64_t x_f64;2929 float64_t x_f64;
...@@ -2917,6 +2959,9 @@ static void float_init_f128(ZigValue *dest_val, float128_t x) {...@@ -2917,6 +2959,9 @@ static void float_init_f128(ZigValue *dest_val, float128_t x) {
2917 memcpy(&dest_val->data.x_f64, &f64_val, sizeof(double));2959 memcpy(&dest_val->data.x_f64, &f64_val, sizeof(double));
2918 break;2960 break;
2919 }2961 }
2962 case 80:
2963 f128M_to_extF80M(&x, &dest_val->data.x_f80);
2964 break;
2920 case 128:2965 case 128:
2921 {2966 {
2922 memcpy(&dest_val->data.x_f128, &x, sizeof(float128_t));2967 memcpy(&dest_val->data.x_f128, &x, sizeof(float128_t));
...@@ -2944,6 +2989,12 @@ static void float_init_float(ZigValue *dest_val, ZigValue *src_val) {...@@ -2944,6 +2989,12 @@ static void float_init_float(ZigValue *dest_val, ZigValue *src_val) {
2944 case 64:2989 case 64:
2945 float_init_f64(dest_val, src_val->data.x_f64);2990 float_init_f64(dest_val, src_val->data.x_f64);
2946 break;2991 break;
2992 case 80: {
2993 float128_t f128_value;
2994 extF80M_to_f128M(&src_val->data.x_f80, &f128_value);
2995 float_init_f128(dest_val, f128_value);
2996 break;
2997 }
2947 case 128:2998 case 128:
2948 float_init_f128(dest_val, src_val->data.x_f128);2999 float_init_f128(dest_val, src_val->data.x_f128);
2949 break;3000 break;
...@@ -2966,6 +3017,8 @@ static bool float_is_nan(ZigValue *op) {...@@ -2966,6 +3017,8 @@ static bool float_is_nan(ZigValue *op) {
2966 return op->data.x_f32 != op->data.x_f32;3017 return op->data.x_f32 != op->data.x_f32;
2967 case 64:3018 case 64:
2968 return op->data.x_f64 != op->data.x_f64;3019 return op->data.x_f64 != op->data.x_f64;
3020 case 80:
3021 return zig_extF80_isNaN(&op->data.x_f80);
2969 case 128:3022 case 128:
2970 return zig_f128_isNaN(&op->data.x_f128);3023 return zig_f128_isNaN(&op->data.x_f128);
2971 default:3024 default:
...@@ -3006,6 +3059,14 @@ static Cmp float_cmp(ZigValue *op1, ZigValue *op2) {...@@ -3006,6 +3059,14 @@ static Cmp float_cmp(ZigValue *op1, ZigValue *op2) {
3006 } else {3059 } else {
3007 return CmpEQ;3060 return CmpEQ;
3008 }3061 }
3062 case 80:
3063 if (extF80M_lt(&op1->data.x_f80, &op2->data.x_f80)) {
3064 return CmpLT;
3065 } else if (extF80M_eq(&op1->data.x_f80, &op2->data.x_f80)) {
3066 return CmpEQ;
3067 } else {
3068 return CmpGT;
3069 }
3009 case 128:3070 case 128:
3010 if (f128M_lt(&op1->data.x_f128, &op2->data.x_f128)) {3071 if (f128M_lt(&op1->data.x_f128, &op2->data.x_f128)) {
3011 return CmpLT;3072 return CmpLT;
...@@ -3061,7 +3122,18 @@ static Cmp float_cmp_zero(ZigValue *op) {...@@ -3061,7 +3122,18 @@ static Cmp float_cmp_zero(ZigValue *op) {
3061 } else {3122 } else {
3062 return CmpEQ;3123 return CmpEQ;
3063 }3124 }
3064 case 128:3125 case 80: {
3126 extFloat80_t zero_float;
3127 ui32_to_extF80M(0, &zero_float);
3128 if (extF80M_lt(&op->data.x_f80, &zero_float)) {
3129 return CmpLT;
3130 } else if (extF80M_eq(&op->data.x_f80, &zero_float)) {
3131 return CmpEQ;
3132 } else {
3133 return CmpGT;
3134 }
3135 }
3136 case 128: {
3065 float128_t zero_float;3137 float128_t zero_float;
3066 ui32_to_f128M(0, &zero_float);3138 ui32_to_f128M(0, &zero_float);
3067 if (f128M_lt(&op->data.x_f128, &zero_float)) {3139 if (f128M_lt(&op->data.x_f128, &zero_float)) {
...@@ -3071,6 +3143,7 @@ static Cmp float_cmp_zero(ZigValue *op) {...@@ -3071,6 +3143,7 @@ static Cmp float_cmp_zero(ZigValue *op) {
3071 } else {3143 } else {
3072 return CmpGT;3144 return CmpGT;
3073 }3145 }
3146 }
3074 default:3147 default:
3075 zig_unreachable();3148 zig_unreachable();
3076 }3149 }
...@@ -3095,6 +3168,9 @@ static void float_add(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3095,6 +3168,9 @@ static void float_add(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3095 case 64:3168 case 64:
3096 out_val->data.x_f64 = op1->data.x_f64 + op2->data.x_f64;3169 out_val->data.x_f64 = op1->data.x_f64 + op2->data.x_f64;
3097 return;3170 return;
3171 case 80:
3172 extF80M_add(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3173 return;
3098 case 128:3174 case 128:
3099 f128M_add(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3175 f128M_add(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3100 return;3176 return;
...@@ -3122,6 +3198,9 @@ static void float_sub(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3122,6 +3198,9 @@ static void float_sub(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3122 case 64:3198 case 64:
3123 out_val->data.x_f64 = op1->data.x_f64 - op2->data.x_f64;3199 out_val->data.x_f64 = op1->data.x_f64 - op2->data.x_f64;
3124 return;3200 return;
3201 case 80:
3202 extF80M_sub(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3203 return;
3125 case 128:3204 case 128:
3126 f128M_sub(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3205 f128M_sub(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3127 return;3206 return;
...@@ -3149,6 +3228,9 @@ static void float_mul(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3149,6 +3228,9 @@ static void float_mul(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3149 case 64:3228 case 64:
3150 out_val->data.x_f64 = op1->data.x_f64 * op2->data.x_f64;3229 out_val->data.x_f64 = op1->data.x_f64 * op2->data.x_f64;
3151 return;3230 return;
3231 case 80:
3232 extF80M_mul(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3233 return;
3152 case 128:3234 case 128:
3153 f128M_mul(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3235 f128M_mul(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3154 return;3236 return;
...@@ -3176,6 +3258,9 @@ static void float_div(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3176,6 +3258,9 @@ static void float_div(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3176 case 64:3258 case 64:
3177 out_val->data.x_f64 = op1->data.x_f64 / op2->data.x_f64;3259 out_val->data.x_f64 = op1->data.x_f64 / op2->data.x_f64;
3178 return;3260 return;
3261 case 80:
3262 extF80M_div(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3263 return;
3179 case 128:3264 case 128:
3180 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3265 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3181 return;3266 return;
...@@ -3204,6 +3289,10 @@ static void float_div_trunc(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3204,6 +3289,10 @@ static void float_div_trunc(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3204 case 64:3289 case 64:
3205 out_val->data.x_f64 = trunc(op1->data.x_f64 / op2->data.x_f64);3290 out_val->data.x_f64 = trunc(op1->data.x_f64 / op2->data.x_f64);
3206 return;3291 return;
3292 case 80:
3293 extF80M_div(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3294 extF80M_roundToInt(&out_val->data.x_f80, softfloat_round_minMag, false, &out_val->data.x_f80);
3295 return;
3207 case 128:3296 case 128:
3208 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3297 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3209 f128M_roundToInt(&out_val->data.x_f128, softfloat_round_minMag, false, &out_val->data.x_f128);3298 f128M_roundToInt(&out_val->data.x_f128, softfloat_round_minMag, false, &out_val->data.x_f128);
...@@ -3233,6 +3322,10 @@ static void float_div_floor(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3233,6 +3322,10 @@ static void float_div_floor(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3233 case 64:3322 case 64:
3234 out_val->data.x_f64 = floor(op1->data.x_f64 / op2->data.x_f64);3323 out_val->data.x_f64 = floor(op1->data.x_f64 / op2->data.x_f64);
3235 return;3324 return;
3325 case 80:
3326 extF80M_div(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3327 extF80M_roundToInt(&out_val->data.x_f80, softfloat_round_min, false, &out_val->data.x_f80);
3328 return;
3236 case 128:3329 case 128:
3237 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3330 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3238 f128M_roundToInt(&out_val->data.x_f128, softfloat_round_min, false, &out_val->data.x_f128);3331 f128M_roundToInt(&out_val->data.x_f128, softfloat_round_min, false, &out_val->data.x_f128);
...@@ -3261,6 +3354,9 @@ static void float_rem(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3261,6 +3354,9 @@ static void float_rem(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3261 case 64:3354 case 64:
3262 out_val->data.x_f64 = fmod(op1->data.x_f64, op2->data.x_f64);3355 out_val->data.x_f64 = fmod(op1->data.x_f64, op2->data.x_f64);
3263 return;3356 return;
3357 case 80:
3358 extF80M_rem(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3359 return;
3264 case 128:3360 case 128:
3265 f128M_rem(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3361 f128M_rem(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3266 return;3362 return;
...@@ -3290,6 +3386,14 @@ static void zig_f128M_mod(const float128_t* a, const float128_t* b, float128_t*...@@ -3290,6 +3386,14 @@ static void zig_f128M_mod(const float128_t* a, const float128_t* b, float128_t*
3290 f128M_sub(a, c, c);3386 f128M_sub(a, c, c);
3291}3387}
32923388
3389// c = a - b * trunc(a / b)
3390static void zig_extF80M_mod(const extFloat80_t* a, const extFloat80_t* b, extFloat80_t* c) {
3391 extF80M_div(a, b, c);
3392 extF80M_roundToInt(c, softfloat_round_min, true, c);
3393 extF80M_mul(b, c, c);
3394 extF80M_sub(a, c, c);
3395}
3396
3293static void float_mod(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {3397static void float_mod(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3294 assert(op1->type == op2->type);3398 assert(op1->type == op2->type);
3295 out_val->type = op1->type;3399 out_val->type = op1->type;
...@@ -3306,6 +3410,9 @@ static void float_mod(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3306,6 +3410,9 @@ static void float_mod(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3306 case 64:3410 case 64:
3307 out_val->data.x_f64 = fmod(fmod(op1->data.x_f64, op2->data.x_f64) + op2->data.x_f64, op2->data.x_f64);3411 out_val->data.x_f64 = fmod(fmod(op1->data.x_f64, op2->data.x_f64) + op2->data.x_f64, op2->data.x_f64);
3308 return;3412 return;
3413 case 80:
3414 zig_extF80M_mod(&op1->data.x_f80, &op2->data.x_f80, &out_val->data.x_f80);
3415 return;
3309 case 128:3416 case 128:
3310 zig_f128M_mod(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);3417 zig_f128M_mod(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
3311 return;3418 return;
...@@ -3351,6 +3458,15 @@ static void float_max(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3351,6 +3458,15 @@ static void float_max(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3351 out_val->data.x_f64 = op1->data.x_f64 > op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64;3458 out_val->data.x_f64 = op1->data.x_f64 > op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64;
3352 }3459 }
3353 return;3460 return;
3461 case 80:
3462 if (zig_extF80_isNaN(&op1->data.x_f80)) {
3463 out_val->data.x_f80 = op2->data.x_f80;
3464 } else if (zig_extF80_isNaN(&op2->data.x_f80)) {
3465 out_val->data.x_f80 = op1->data.x_f80;
3466 } else {
3467 out_val->data.x_f80 = extF80M_lt(&op1->data.x_f80, &op2->data.x_f80) ? op2->data.x_f80 : op1->data.x_f80;
3468 }
3469 return;
3354 case 128:3470 case 128:
3355 if (zig_f128_isNaN(&op1->data.x_f128)) {3471 if (zig_f128_isNaN(&op1->data.x_f128)) {
3356 out_val->data.x_f128 = op2->data.x_f128;3472 out_val->data.x_f128 = op2->data.x_f128;
...@@ -3402,6 +3518,15 @@ static void float_min(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {...@@ -3402,6 +3518,15 @@ static void float_min(ZigValue *out_val, ZigValue *op1, ZigValue *op2) {
3402 out_val->data.x_f64 = op1->data.x_f32 < op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64;3518 out_val->data.x_f64 = op1->data.x_f32 < op2->data.x_f64 ? op1->data.x_f64 : op2->data.x_f64;
3403 }3519 }
3404 return;3520 return;
3521 case 80:
3522 if (zig_extF80_isNaN(&op1->data.x_f80)) {
3523 out_val->data.x_f80 = op2->data.x_f80;
3524 } else if (zig_extF80_isNaN(&op2->data.x_f80)) {
3525 out_val->data.x_f80 = op1->data.x_f80;
3526 } else {
3527 out_val->data.x_f80 = extF80M_lt(&op1->data.x_f80, &op2->data.x_f80) ? op1->data.x_f80 : op2->data.x_f80;
3528 }
3529 return;
3405 case 128:3530 case 128:
3406 if (zig_f128_isNaN(&op1->data.x_f128)) {3531 if (zig_f128_isNaN(&op1->data.x_f128)) {
3407 out_val->data.x_f128 = op2->data.x_f128;3532 out_val->data.x_f128 = op2->data.x_f128;
...@@ -3434,6 +3559,9 @@ static void float_negate(ZigValue *out_val, ZigValue *op) {...@@ -3434,6 +3559,9 @@ static void float_negate(ZigValue *out_val, ZigValue *op) {
3434 case 64:3559 case 64:
3435 out_val->data.x_f64 = -op->data.x_f64;3560 out_val->data.x_f64 = -op->data.x_f64;
3436 return;3561 return;
3562 case 80:
3563 extF80M_neg(&op->data.x_f80, &out_val->data.x_f80);
3564 return;
3437 case 128:3565 case 128:
3438 f128M_neg(&op->data.x_f128, &out_val->data.x_f128);3566 f128M_neg(&op->data.x_f128, &out_val->data.x_f128);
3439 return;3567 return;
...@@ -3462,6 +3590,9 @@ void float_write_ieee597(ZigValue *op, uint8_t *buf, bool target_is_big_endian)...@@ -3462,6 +3590,9 @@ void float_write_ieee597(ZigValue *op, uint8_t *buf, bool target_is_big_endian)
3462 case 64:3590 case 64:
3463 memcpy(buf, &op->data.x_f64, 8);3591 memcpy(buf, &op->data.x_f64, 8);
3464 break;3592 break;
3593 case 80:
3594 memcpy(buf, &op->data.x_f80, 16);
3595 break;
3465 case 128:3596 case 128:
3466 memcpy(buf, &op->data.x_f128, 16);3597 memcpy(buf, &op->data.x_f128, 16);
3467 break;3598 break;
...@@ -3511,6 +3642,9 @@ void float_read_ieee597(ZigValue *val, uint8_t *buf, bool target_is_big_endian)...@@ -3511,6 +3642,9 @@ void float_read_ieee597(ZigValue *val, uint8_t *buf, bool target_is_big_endian)
3511 case 64:3642 case 64:
3512 memcpy(&val->data.x_f64, ptr, 8);3643 memcpy(&val->data.x_f64, ptr, 8);
3513 return;3644 return;
3645 case 80:
3646 memcpy(&val->data.x_f80, ptr, 16);
3647 return;
3514 case 128:3648 case 128:
3515 memcpy(&val->data.x_f128, ptr, 16);3649 memcpy(&val->data.x_f128, ptr, 16);
3516 return;3650 return;
...@@ -3538,8 +3672,12 @@ static void value_to_bigfloat(BigFloat *out, ZigValue *val) {...@@ -3538,8 +3672,12 @@ static void value_to_bigfloat(BigFloat *out, ZigValue *val) {
3538 case 64:3672 case 64:
3539 bigfloat_init_64(out, val->data.x_f64);3673 bigfloat_init_64(out, val->data.x_f64);
3540 return;3674 return;
3541 case 80:3675 case 80: {
3542 zig_panic("TODO: value_to_bigfloat c_longdouble");3676 float128_t f128_value;
3677 extF80M_to_f128M(&val->data.x_f80, &f128_value);
3678 bigfloat_init_128(out, f128_value);
3679 return;
3680 }
3543 case 128:3681 case 128:
3544 bigfloat_init_128(out, val->data.x_f128);3682 bigfloat_init_128(out, val->data.x_f128);
3545 return;3683 return;
...@@ -3628,8 +3766,14 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc...@@ -3628,8 +3766,14 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc
3628 bigfloat_init_64(&orig_bf, tmp);3766 bigfloat_init_64(&orig_bf, tmp);
3629 break;3767 break;
3630 }3768 }
3631 case 80:3769 case 80: {
3632 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");3770 float128_t tmp = bigfloat_to_f128(&tmp_bf);
3771 extFloat80_t tmp80;
3772 f128M_to_extF80M(&tmp, &tmp80);
3773 extF80M_to_f128M(&tmp80, &tmp);
3774 bigfloat_init_128(&orig_bf, tmp);
3775 break;
3776 }
3633 case 128: {3777 case 128: {
3634 float128_t tmp = bigfloat_to_f128(&tmp_bf);3778 float128_t tmp = bigfloat_to_f128(&tmp_bf);
3635 bigfloat_init_128(&orig_bf, tmp);3779 bigfloat_init_128(&orig_bf, tmp);
...@@ -3673,8 +3817,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc...@@ -3673,8 +3817,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc
3673 }3817 }
3674 break;3818 break;
3675 }3819 }
3676 case 80:3820 case 80: {
3677 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");3821 float16_t tmp = extF80M_to_f16(&const_val->data.x_f80);
3822 extFloat80_t orig;
3823 f16_to_extF80M(tmp, &orig);
3824 if (extF80M_eq(&orig, &const_val->data.x_f80)) {
3825 return true;
3826 }
3827 break;
3828 }
3678 case 128: {3829 case 128: {
3679 float16_t tmp = f128M_to_f16(&const_val->data.x_f128);3830 float16_t tmp = f128M_to_f16(&const_val->data.x_f128);
3680 float128_t orig;3831 float128_t orig;
...@@ -3698,8 +3849,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc...@@ -3698,8 +3849,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc
3698 }3849 }
3699 break;3850 break;
3700 }3851 }
3701 case 80:3852 case 80: {
3702 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");3853 float32_t tmp = extF80M_to_f32(&const_val->data.x_f80);
3854 extFloat80_t orig;
3855 f32_to_extF80M(tmp, &orig);
3856 if (extF80M_eq(&orig, &const_val->data.x_f80)) {
3857 return true;
3858 }
3859 break;
3860 }
3703 case 128: {3861 case 128: {
3704 float32_t tmp = f128M_to_f32(&const_val->data.x_f128);3862 float32_t tmp = f128M_to_f32(&const_val->data.x_f128);
3705 float128_t orig;3863 float128_t orig;
...@@ -3715,8 +3873,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc...@@ -3715,8 +3873,15 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc
3715 break;3873 break;
3716 case 64:3874 case 64:
3717 switch (const_val->type->data.floating.bit_count) {3875 switch (const_val->type->data.floating.bit_count) {
3718 case 80:3876 case 80: {
3719 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");3877 float64_t tmp = extF80M_to_f64(&const_val->data.x_f80);
3878 extFloat80_t orig;
3879 f64_to_extF80M(tmp, &orig);
3880 if (extF80M_eq(&orig, &const_val->data.x_f80)) {
3881 return true;
3882 }
3883 break;
3884 }
3720 case 128: {3885 case 128: {
3721 float64_t tmp = f128M_to_f64(&const_val->data.x_f128);3886 float64_t tmp = f128M_to_f64(&const_val->data.x_f128);
3722 float128_t orig;3887 float128_t orig;
...@@ -3730,9 +3895,17 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc...@@ -3730,9 +3895,17 @@ static bool ir_num_lit_fits_in_other_type(IrAnalyze *ira, Stage1AirInst *instruc
3730 zig_unreachable();3895 zig_unreachable();
3731 }3896 }
3732 break;3897 break;
3733 case 80:3898 case 80: {
3734 assert(const_val->type->data.floating.bit_count == 128);3899 assert(const_val->type->data.floating.bit_count == 128);
3735 zig_panic("TODO: ir_num_lit_fits_in_other_type c_longdouble");3900 extFloat80_t tmp;
3901 f128M_to_extF80M(&const_val->data.x_f128, &tmp);
3902 float128_t orig;
3903 extF80M_to_f128M(&tmp, &orig);
3904 if (f128M_eq(&orig, &const_val->data.x_f128)) {
3905 return true;
3906 }
3907 break;
3908 }
3736 case 128:3909 case 128:
3737 return true;3910 return true;
3738 default:3911 default:
...@@ -5143,8 +5316,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, Scope *scope, AstNode...@@ -5143,8 +5316,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, Scope *scope, AstNode
5143 case 64:5316 case 64:
5144 const_val->data.x_f64 = bigfloat_to_f64(&other_val->data.x_bigfloat);5317 const_val->data.x_f64 = bigfloat_to_f64(&other_val->data.x_bigfloat);
5145 break;5318 break;
5146 case 80:5319 case 80: {
5147 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");5320 float128_t tmp = bigfloat_to_f128(&other_val->data.x_bigfloat);
5321 f128M_to_extF80M(&tmp, &const_val->data.x_f80);
5322 break;
5323 }
5148 case 128:5324 case 128:
5149 const_val->data.x_f128 = bigfloat_to_f128(&other_val->data.x_bigfloat);5325 const_val->data.x_f128 = bigfloat_to_f128(&other_val->data.x_bigfloat);
5150 break;5326 break;
...@@ -5172,8 +5348,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, Scope *scope, AstNode...@@ -5172,8 +5348,11 @@ static bool eval_const_expr_implicit_cast(IrAnalyze *ira, Scope *scope, AstNode
5172 case 64:5348 case 64:
5173 const_val->data.x_f64 = bigfloat_to_f64(&bigfloat);5349 const_val->data.x_f64 = bigfloat_to_f64(&bigfloat);
5174 break;5350 break;
5175 case 80:5351 case 80: {
5176 zig_panic("TODO: eval_const_expr_implicit_cast c_longdouble");5352 float128_t tmp = bigfloat_to_f128(&other_val->data.x_bigfloat);
5353 f128M_to_extF80M(&tmp, &const_val->data.x_f80);
5354 break;
5355 }
5177 case 128:5356 case 128:
5178 const_val->data.x_f128 = bigfloat_to_f128(&bigfloat);5357 const_val->data.x_f128 = bigfloat_to_f128(&bigfloat);
5179 break;5358 break;
...@@ -18960,6 +19139,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_...@@ -18960,6 +19139,7 @@ static ZigType *type_info_to_type(IrAnalyze *ira, Scope *scope, AstNode *source_
18960 case 16: return ira->codegen->builtin_types.entry_f16;19139 case 16: return ira->codegen->builtin_types.entry_f16;
18961 case 32: return ira->codegen->builtin_types.entry_f32;19140 case 32: return ira->codegen->builtin_types.entry_f32;
18962 case 64: return ira->codegen->builtin_types.entry_f64;19141 case 64: return ira->codegen->builtin_types.entry_f64;
19142 case 80: return ira->codegen->builtin_types.entry_f80;
18963 case 128: return ira->codegen->builtin_types.entry_f128;19143 case 128: return ira->codegen->builtin_types.entry_f128;
18964 }19144 }
18965 ir_add_error_node(ira, source_node, buf_sprintf("%d-bit float unsupported", bits));19145 ir_add_error_node(ira, source_node, buf_sprintf("%d-bit float unsupported", bits));
...@@ -21943,6 +22123,8 @@ static void ir_eval_mul_add(IrAnalyze *ira, ZigType *float_type,...@@ -21943,6 +22123,8 @@ static void ir_eval_mul_add(IrAnalyze *ira, ZigType *float_type,
21943 case 64:22123 case 64:
21944 out_val->data.x_f64 = fma(op1->data.x_f64, op2->data.x_f64, op3->data.x_f64);22124 out_val->data.x_f64 = fma(op1->data.x_f64, op2->data.x_f64, op3->data.x_f64);
21945 break;22125 break;
22126 case 80:
22127 zig_panic("compiler bug: TODO: implement 'mulAdd' for type 'f80'. See https://github.com/ziglang/zig/issues/4026");
21946 case 128:22128 case 128:
21947 f128M_mulAdd(&op1->data.x_f128, &op2->data.x_f128, &op3->data.x_f128, &out_val->data.x_f128);22129 f128M_mulAdd(&op1->data.x_f128, &op2->data.x_f128, &op3->data.x_f128, &out_val->data.x_f128);
21948 break;22130 break;
...@@ -24156,10 +24338,44 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_...@@ -24156,10 +24338,44 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_
24156 }24338 }
24157 break;24339 break;
24158 }24340 }
24159 case 80:24341 case 80: {
24160 return ir_add_error_node(ira, source_node,24342 extFloat80_t *out = &out_val->data.x_f80;
24161 buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026",24343 extFloat80_t *in = &op->data.x_f80;
24162 float_op_to_name(fop), buf_ptr(&float_type->name)));24344 switch (fop) {
24345 case BuiltinFnIdSqrt:
24346 extF80M_sqrt(in, out);
24347 break;
24348 case BuiltinFnIdFabs:
24349 extF80M_abs(in, out);
24350 break;
24351 case BuiltinFnIdFloor:
24352 extF80M_roundToInt(in, softfloat_round_min, false, out);
24353 break;
24354 case BuiltinFnIdCeil:
24355 extF80M_roundToInt(in, softfloat_round_max, false, out);
24356 break;
24357 case BuiltinFnIdTrunc:
24358 extF80M_trunc(in, out);
24359 break;
24360 case BuiltinFnIdRound:
24361 extF80M_roundToInt(in, softfloat_round_near_maxMag, false, out);
24362 break;
24363 case BuiltinFnIdNearbyInt:
24364 case BuiltinFnIdSin:
24365 case BuiltinFnIdCos:
24366 case BuiltinFnIdExp:
24367 case BuiltinFnIdExp2:
24368 case BuiltinFnIdLog:
24369 case BuiltinFnIdLog10:
24370 case BuiltinFnIdLog2:
24371 return ir_add_error_node(ira, source_node,
24372 buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026",
24373 float_op_to_name(fop), buf_ptr(&float_type->name)));
24374 default:
24375 zig_unreachable();
24376 }
24377 break;
24378 }
24163 case 128: {24379 case 128: {
24164 float128_t *out, *in;24380 float128_t *out, *in;
24165 if (float_type->id == ZigTypeIdComptimeFloat) {24381 if (float_type->id == ZigTypeIdComptimeFloat) {
src/stage1/softfloat.hpp+4
...@@ -56,4 +56,8 @@ static inline bool zig_f128_isNaN(float128_t *aPtr) {...@@ -56,4 +56,8 @@ static inline bool zig_f128_isNaN(float128_t *aPtr) {
56 || ((absA64 == UINT64_C(0x7FFF000000000000)) && lo);56 || ((absA64 == UINT64_C(0x7FFF000000000000)) && lo);
57}57}
5858
59static inline bool zig_extF80_isNaN(extFloat80_t *aPtr) {
60 return aPtr->signExp & 0x7FFF && aPtr->signif;
61}
62
59#endif63#endif
src/stage1/softfloat_ext.cpp+30-8
...@@ -28,13 +28,6 @@ void f128M_trunc(const float128_t *aPtr, float128_t *zPtr) {...@@ -28,13 +28,6 @@ void f128M_trunc(const float128_t *aPtr, float128_t *zPtr) {
28 } 28 }
29}29}
3030
31float16_t f16_neg(const float16_t a) {
32 union { uint16_t ui; float16_t f; } uA;
33 // Toggle the sign bit.
34 uA.ui = a.v ^ (UINT16_C(1) << 15);
35 return uA.f;
36}
37
38void f128M_neg(const float128_t *aPtr, float128_t *zPtr) {31void f128M_neg(const float128_t *aPtr, float128_t *zPtr) {
39 // Toggle the sign bit.32 // Toggle the sign bit.
40#if ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN33#if ZIG_BYTE_ORDER == ZIG_LITTLE_ENDIAN
...@@ -46,4 +39,33 @@ void f128M_neg(const float128_t *aPtr, float128_t *zPtr) {...@@ -46,4 +39,33 @@ void f128M_neg(const float128_t *aPtr, float128_t *zPtr) {
46#else39#else
47#error Unsupported endian40#error Unsupported endian
48#endif41#endif
49}
\ No newline at end of file
42}
43
44void extF80M_abs(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
45 // Clear the sign bit.
46 zPtr->signExp = aPtr->signExp & UINT16_C(0x7FFF);
47 zPtr->signif = aPtr->signif;
48}
49
50void extF80M_trunc(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
51 extFloat80_t zero_float;
52 ui32_to_extF80M(0, &zero_float);
53 if (extF80M_lt(aPtr, &zero_float)) {
54 extF80M_roundToInt(aPtr, softfloat_round_max, false, zPtr);
55 } else {
56 extF80M_roundToInt(aPtr, softfloat_round_min, false, zPtr);
57 }
58}
59
60void extF80M_neg(const extFloat80_t *aPtr, extFloat80_t *zPtr) {
61 // Toggle the sign bit.
62 zPtr->signExp = aPtr->signExp ^ UINT16_C(0x8000);
63 zPtr->signif = aPtr->signif;
64}
65
66float16_t f16_neg(const float16_t a) {
67 union { uint16_t ui; float16_t f; } uA;
68 // Toggle the sign bit.
69 uA.ui = a.v ^ (UINT16_C(1) << 15);
70 return uA.f;
71}
src/stage1/softfloat_ext.hpp+4
...@@ -7,6 +7,10 @@ void f128M_abs(const float128_t *aPtr, float128_t *zPtr);...@@ -7,6 +7,10 @@ void f128M_abs(const float128_t *aPtr, float128_t *zPtr);
7void f128M_trunc(const float128_t *aPtr, float128_t *zPtr);7void f128M_trunc(const float128_t *aPtr, float128_t *zPtr);
8void f128M_neg(const float128_t *aPtr, float128_t *zPtr);8void f128M_neg(const float128_t *aPtr, float128_t *zPtr);
99
10void extF80M_abs(const extFloat80_t *aPtr, extFloat80_t *zPtr);
11void extF80M_trunc(const extFloat80_t *aPtr, extFloat80_t *zPtr);
12void extF80M_neg(const extFloat80_t *aPtr, extFloat80_t *zPtr);
13
10float16_t f16_neg(const float16_t a);14float16_t f16_neg(const float16_t a);
1115
12#endif16#endif
\ No newline at end of file
src/stage1/target.cpp+11
...@@ -1019,6 +1019,17 @@ bool target_long_double_is_f128(const ZigTarget *target) {...@@ -1019,6 +1019,17 @@ bool target_long_double_is_f128(const ZigTarget *target) {
1019 }1019 }
1020}1020}
10211021
1022bool target_has_f80(const ZigTarget *target) {
1023 switch (target->arch) {
1024 case ZigLLVM_x86:
1025 case ZigLLVM_x86_64:
1026 return true;
1027
1028 default:
1029 return false;
1030 }
1031}
1032
1022bool target_is_riscv(const ZigTarget *target) {1033bool target_is_riscv(const ZigTarget *target) {
1023 return target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64;1034 return target->arch == ZigLLVM_riscv32 || target->arch == ZigLLVM_riscv64;
1024}1035}
src/stage1/target.hpp+1
...@@ -81,6 +81,7 @@ bool target_is_sparc(const ZigTarget *target);...@@ -81,6 +81,7 @@ bool target_is_sparc(const ZigTarget *target);
81bool target_is_android(const ZigTarget *target);81bool target_is_android(const ZigTarget *target);
82bool target_has_debug_info(const ZigTarget *target);82bool target_has_debug_info(const ZigTarget *target);
83bool target_long_double_is_f128(const ZigTarget *target);83bool target_long_double_is_f128(const ZigTarget *target);
84bool target_has_f80(const ZigTarget *target);
8485
85uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch);86uint32_t target_arch_pointer_bit_width(ZigLLVM_ArchType arch);
86uint32_t target_arch_largest_atomic_bits(ZigLLVM_ArchType arch);87uint32_t target_arch_largest_atomic_bits(ZigLLVM_ArchType arch);
src/type.zig+17
...@@ -58,6 +58,7 @@ pub const Type = extern union {...@@ -58,6 +58,7 @@ pub const Type = extern union {
58 .f16,58 .f16,
59 .f32,59 .f32,
60 .f64,60 .f64,
61 .f80,
61 .f128,62 .f128,
62 .c_longdouble,63 .c_longdouble,
63 => return .Float,64 => return .Float,
...@@ -833,6 +834,7 @@ pub const Type = extern union {...@@ -833,6 +834,7 @@ pub const Type = extern union {
833 .f16,834 .f16,
834 .f32,835 .f32,
835 .f64,836 .f64,
837 .f80,
836 .f128,838 .f128,
837 .bool,839 .bool,
838 .void,840 .void,
...@@ -1053,6 +1055,7 @@ pub const Type = extern union {...@@ -1053,6 +1055,7 @@ pub const Type = extern union {
1053 .f16,1055 .f16,
1054 .f32,1056 .f32,
1055 .f64,1057 .f64,
1058 .f80,
1056 .f128,1059 .f128,
1057 .bool,1060 .bool,
1058 .void,1061 .void,
...@@ -1371,6 +1374,7 @@ pub const Type = extern union {...@@ -1371,6 +1374,7 @@ pub const Type = extern union {
1371 .f16,1374 .f16,
1372 .f32,1375 .f32,
1373 .f64,1376 .f64,
1377 .f80,
1374 .f128,1378 .f128,
1375 .bool,1379 .bool,
1376 .void,1380 .void,
...@@ -1473,6 +1477,7 @@ pub const Type = extern union {...@@ -1473,6 +1477,7 @@ pub const Type = extern union {
1473 .f16 => return Value.initTag(.f16_type),1477 .f16 => return Value.initTag(.f16_type),
1474 .f32 => return Value.initTag(.f32_type),1478 .f32 => return Value.initTag(.f32_type),
1475 .f64 => return Value.initTag(.f64_type),1479 .f64 => return Value.initTag(.f64_type),
1480 .f80 => return Value.initTag(.f80_type),
1476 .f128 => return Value.initTag(.f128_type),1481 .f128 => return Value.initTag(.f128_type),
1477 .bool => return Value.initTag(.bool_type),1482 .bool => return Value.initTag(.bool_type),
1478 .void => return Value.initTag(.void_type),1483 .void => return Value.initTag(.void_type),
...@@ -1543,6 +1548,7 @@ pub const Type = extern union {...@@ -1543,6 +1548,7 @@ pub const Type = extern union {
1543 .f16,1548 .f16,
1544 .f32,1549 .f32,
1545 .f64,1550 .f64,
1551 .f80,
1546 .f128,1552 .f128,
1547 .bool,1553 .bool,
1548 .anyerror,1554 .anyerror,
...@@ -1858,6 +1864,7 @@ pub const Type = extern union {...@@ -1858,6 +1864,7 @@ pub const Type = extern union {
1858 .f16 => return 2,1864 .f16 => return 2,
1859 .f32 => return 4,1865 .f32 => return 4,
1860 .f64 => return 8,1866 .f64 => return 8,
1867 .f80 => return 16,
1861 .f128 => return 16,1868 .f128 => return 16,
1862 .c_longdouble => return 16,1869 .c_longdouble => return 16,
18631870
...@@ -2138,6 +2145,7 @@ pub const Type = extern union {...@@ -2138,6 +2145,7 @@ pub const Type = extern union {
2138 .f16 => return 2,2145 .f16 => return 2,
2139 .f32 => return 4,2146 .f32 => return 4,
2140 .f64 => return 8,2147 .f64 => return 8,
2148 .f80 => return 16,
2141 .f128 => return 16,2149 .f128 => return 16,
2142 .c_longdouble => return 16,2150 .c_longdouble => return 16,
21432151
...@@ -2277,6 +2285,7 @@ pub const Type = extern union {...@@ -2277,6 +2285,7 @@ pub const Type = extern union {
2277 .i16, .u16, .f16 => 16,2285 .i16, .u16, .f16 => 16,
2278 .i32, .u32, .f32 => 32,2286 .i32, .u32, .f32 => 32,
2279 .i64, .u64, .f64 => 64,2287 .i64, .u64, .f64 => 64,
2288 .f80 => 80,
2280 .u128, .i128, .f128 => 128,2289 .u128, .i128, .f128 => 128,
22812290
2282 .isize,2291 .isize,
...@@ -3170,6 +3179,7 @@ pub const Type = extern union {...@@ -3170,6 +3179,7 @@ pub const Type = extern union {
3170 .f16,3179 .f16,
3171 .f32,3180 .f32,
3172 .f64,3181 .f64,
3182 .f80,
3173 .f128,3183 .f128,
3174 .c_longdouble,3184 .c_longdouble,
3175 => true,3185 => true,
...@@ -3184,6 +3194,7 @@ pub const Type = extern union {...@@ -3184,6 +3194,7 @@ pub const Type = extern union {
3184 .f16,3194 .f16,
3185 .f32,3195 .f32,
3186 .f64,3196 .f64,
3197 .f80,
3187 .f128,3198 .f128,
3188 .c_longdouble,3199 .c_longdouble,
3189 .comptime_float,3200 .comptime_float,
...@@ -3200,6 +3211,7 @@ pub const Type = extern union {...@@ -3200,6 +3211,7 @@ pub const Type = extern union {
3200 .f16 => 16,3211 .f16 => 16,
3201 .f32 => 32,3212 .f32 => 32,
3202 .f64 => 64,3213 .f64 => 64,
3214 .f80 => 80,
3203 .f128, .comptime_float => 128,3215 .f128, .comptime_float => 128,
3204 .c_longdouble => CType.longdouble.sizeInBits(target),3216 .c_longdouble => CType.longdouble.sizeInBits(target),
32053217
...@@ -3340,6 +3352,7 @@ pub const Type = extern union {...@@ -3340,6 +3352,7 @@ pub const Type = extern union {
3340 .f16,3352 .f16,
3341 .f32,3353 .f32,
3342 .f64,3354 .f64,
3355 .f80,
3343 .f128,3356 .f128,
3344 .c_longdouble,3357 .c_longdouble,
3345 .comptime_int,3358 .comptime_int,
...@@ -3381,6 +3394,7 @@ pub const Type = extern union {...@@ -3381,6 +3394,7 @@ pub const Type = extern union {
3381 .f16,3394 .f16,
3382 .f32,3395 .f32,
3383 .f64,3396 .f64,
3397 .f80,
3384 .f128,3398 .f128,
3385 .c_longdouble,3399 .c_longdouble,
3386 .comptime_int,3400 .comptime_int,
...@@ -3579,6 +3593,7 @@ pub const Type = extern union {...@@ -3579,6 +3593,7 @@ pub const Type = extern union {
3579 .f16,3593 .f16,
3580 .f32,3594 .f32,
3581 .f64,3595 .f64,
3596 .f80,
3582 .f128,3597 .f128,
3583 .anyopaque,3598 .anyopaque,
3584 .bool,3599 .bool,
...@@ -4334,6 +4349,7 @@ pub const Type = extern union {...@@ -4334,6 +4349,7 @@ pub const Type = extern union {
4334 f16,4349 f16,
4335 f32,4350 f32,
4336 f64,4351 f64,
4352 f80,
4337 f128,4353 f128,
4338 anyopaque,4354 anyopaque,
4339 bool,4355 bool,
...@@ -4453,6 +4469,7 @@ pub const Type = extern union {...@@ -4453,6 +4469,7 @@ pub const Type = extern union {
4453 .f16,4469 .f16,
4454 .f32,4470 .f32,
4455 .f64,4471 .f64,
4472 .f80,
4456 .f128,4473 .f128,
4457 .anyopaque,4474 .anyopaque,
4458 .bool,4475 .bool,
src/value.zig+5
...@@ -47,6 +47,7 @@ pub const Value = extern union {...@@ -47,6 +47,7 @@ pub const Value = extern union {
47 f16_type,47 f16_type,
48 f32_type,48 f32_type,
49 f64_type,49 f64_type,
50 f80_type,
50 f128_type,51 f128_type,
51 anyopaque_type,52 anyopaque_type,
52 bool_type,53 bool_type,
...@@ -205,6 +206,7 @@ pub const Value = extern union {...@@ -205,6 +206,7 @@ pub const Value = extern union {
205 .f16_type,206 .f16_type,
206 .f32_type,207 .f32_type,
207 .f64_type,208 .f64_type,
209 .f80_type,
208 .f128_type,210 .f128_type,
209 .anyopaque_type,211 .anyopaque_type,
210 .bool_type,212 .bool_type,
...@@ -398,6 +400,7 @@ pub const Value = extern union {...@@ -398,6 +400,7 @@ pub const Value = extern union {
398 .f16_type,400 .f16_type,
399 .f32_type,401 .f32_type,
400 .f64_type,402 .f64_type,
403 .f80_type,
401 .f128_type,404 .f128_type,
402 .anyopaque_type,405 .anyopaque_type,
403 .bool_type,406 .bool_type,
...@@ -630,6 +633,7 @@ pub const Value = extern union {...@@ -630,6 +633,7 @@ pub const Value = extern union {
630 .f16_type => return out_stream.writeAll("f16"),633 .f16_type => return out_stream.writeAll("f16"),
631 .f32_type => return out_stream.writeAll("f32"),634 .f32_type => return out_stream.writeAll("f32"),
632 .f64_type => return out_stream.writeAll("f64"),635 .f64_type => return out_stream.writeAll("f64"),
636 .f80_type => return out_stream.writeAll("f80"),
633 .f128_type => return out_stream.writeAll("f128"),637 .f128_type => return out_stream.writeAll("f128"),
634 .anyopaque_type => return out_stream.writeAll("anyopaque"),638 .anyopaque_type => return out_stream.writeAll("anyopaque"),
635 .bool_type => return out_stream.writeAll("bool"),639 .bool_type => return out_stream.writeAll("bool"),
...@@ -824,6 +828,7 @@ pub const Value = extern union {...@@ -824,6 +828,7 @@ pub const Value = extern union {
824 .f16_type => Type.initTag(.f16),828 .f16_type => Type.initTag(.f16),
825 .f32_type => Type.initTag(.f32),829 .f32_type => Type.initTag(.f32),
826 .f64_type => Type.initTag(.f64),830 .f64_type => Type.initTag(.f64),
831 .f80_type => Type.initTag(.f80),
827 .f128_type => Type.initTag(.f128),832 .f128_type => Type.initTag(.f128),
828 .anyopaque_type => Type.initTag(.anyopaque),833 .anyopaque_type => Type.initTag(.anyopaque),
829 .bool_type => Type.initTag(.bool),834 .bool_type => Type.initTag(.bool),