authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2026-08-24 19:12:07-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2026-08-26 03:11:07+02:00
loge955d137e7d23eacd6aeb0eeb406d9fd9cfa9526
tree4ec9b4756f32b7dddef3243d2239b64e699fe6cd
parent18e38104ce60a02f27b565097cff66c3429aa8d4

x86_64: add soft float abi support

Closes #36582

2 files changed, 17 insertions(+), 15 deletions(-)

src/Type.zig+1-1
......@@ -3163,7 +3163,7 @@ pub fn validateExtern(ty: Type, position: ExternPosition, zcu: *const Zcu) bool
31633163 },
31643164 .float => switch (ty.floatBits(zcu.getTarget())) {
31653165 else => true,
3166 80 => zcu.getTarget().cTypeBitSize(.longdouble) == 80,
3166 80 => |bits| std.zig.target.compilerRtFloatAbi(zcu.getTarget(), bits) == .hard,
31673167 },
31683168 .@"fn" => {
31693169 if (position != .other) return false;
src/codegen/x86_64/abi.zig+16-14
......@@ -122,19 +122,17 @@ pub fn classifyWindows(init_ty: Type, zcu: *Zcu, target: *const std.Target, ctx:
122122 1, 2, 4, 8 => .integer,
123123 else => switch (ty.zigTypeTag(zcu)) {
124124 .int => .win_i128,
125 .@"struct", .@"union" => if (ty.containerLayout(zcu) == .@"packed")
126 .win_i128
127 else
128 .memory,
125 .@"struct", .@"union" => if (ty.containerLayout(zcu) != .@"packed" or
126 target.cpu.has(.x86, .soft_float)) .memory else .win_i128,
129127 else => .memory,
130128 },
131129 },
132130 .noreturn => unreachable,
133131 .float => switch (ty.floatBits(target)) {
134 16, 32, 64 => .sse,
135 80 => .memory,
136 128 => .win_i128,
137132 else => unreachable,
133 16, 32, 64 => if (target.cpu.has(.x86, .soft_float)) .integer else .sse,
134 80 => .memory,
135 128 => if (target.cpu.has(.x86, .soft_float)) .memory else .win_i128,
138136 },
139137 .vector => {
140138 const len = ty.vectorLen(zcu);
......@@ -183,6 +181,7 @@ pub fn classifyWindows(init_ty: Type, zcu: *Zcu, target: *const std.Target, ctx:
183181/// the beginning of the array; unused slots are filled with .none.
184182pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Context) [8]Class {
185183 switch (ty.zigTypeTag(zcu)) {
184 else => unreachable,
186185 .void => return Class.zero_bit,
187186 .bool => return Class.one_integer,
188187 .noreturn => unreachable,
......@@ -195,7 +194,12 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Cont
195194 if (bits <= 64 * 4) return Class.four_integers;
196195 return Class.stack;
197196 },
198 .float => switch (ty.floatBits(target)) {
197 .float => if (target.cpu.has(.x86, .soft_float)) switch (ty.floatBits(target)) {
198 else => unreachable,
199 16, 32, 64 => return Class.one_integer,
200 80, 128 => return Class.two_integers,
201 } else switch (ty.floatBits(target)) {
202 else => unreachable,
199203 16 => {
200204 if (ctx == .other) return Class.stack;
201205 // TODO clang doesn't allow __fp16 as .ret or .arg
......@@ -203,15 +207,14 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Cont
203207 },
204208 32 => return Class.f32,
205209 64 => return Class.f64,
206 // "Arguments of types __float128, _Decimal128 and __m128 are
207 // split into two halves. The least significant ones belong
208 // to class SSE, the most significant one to class SSEUP."
209 128 => return Class.f128,
210210 // "The 64-bit mantissa of arguments of type long double
211211 // belongs to class X87, the 16-bit exponent plus 6 bytes
212212 // of padding belongs to class X87UP."
213213 80 => return Class.f80,
214 else => unreachable,
214 // "Arguments of types __float128, _Decimal128 and __m128 are
215 // split into two halves. The least significant ones belong
216 // to class SSE, the most significant one to class SSEUP."
217 128 => return Class.f128,
215218 },
216219 .pointer => switch (ty.ptrSize(zcu)) {
217220 .slice => return Class.two_integers,
......@@ -341,7 +344,6 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: *const std.Target, ctx: Cont
341344 if (ty_size <= 16) return Class.two_integers;
342345 return Class.stack;
343346 },
344 else => unreachable,
345347 }
346348}
347349