Commit 6986d2aca9
Changed files (3)
src
arch
x86_64
codegen
src/arch/x86_64/abi.zig
@@ -170,10 +170,6 @@ pub fn classifySystemV(ty: Type, zcu: *Zcu, target: std.Target, ctx: Context) [8
// "Arguments of types __float128, _Decimal128 and __m128 are
// split into two halves. The least significant ones belong
// to class SSE, the most significant one to class SSEUP."
- if (ctx == .field) {
- result[0] = .memory;
- return result;
- }
result[0] = .sse;
result[1] = .sseup;
return result;
src/arch/x86_64/CodeGen.zig
@@ -14318,7 +14318,7 @@ fn moveStrategy(self: *Self, ty: Type, class: Register.Class, aligned: bool) !Mo
else => {
const classes = mem.sliceTo(&abi.classifySystemV(ty, mod, self.target.*, .other), .none);
assert(std.mem.indexOfNone(abi.Class, classes, &.{
- .integer, .sse, .memory, .float, .float_combine,
+ .integer, .sse, .sseup, .memory, .float, .float_combine,
}) == null);
const abi_size = ty.abiSize(mod);
if (abi_size < 4 or
src/codegen/llvm.zig
@@ -11167,10 +11167,18 @@ fn lowerSystemVFnRetTy(o: *Object, fn_info: InternPool.Key.FuncType) Allocator.E
types_buffer[types_index] = .i64;
types_index += 1;
},
- .sse, .sseup => {
+ .sse => {
types_buffer[types_index] = .double;
types_index += 1;
},
+ .sseup => {
+ if (types_buffer[types_index - 1] == .double) {
+ types_buffer[types_index - 1] = .fp128;
+ } else {
+ types_buffer[types_index] = .double;
+ types_index += 1;
+ }
+ },
.float => {
types_buffer[types_index] = .float;
types_index += 1;
@@ -11454,10 +11462,18 @@ const ParamTypeIterator = struct {
types_buffer[types_index] = .i64;
types_index += 1;
},
- .sse, .sseup => {
+ .sse => {
types_buffer[types_index] = .double;
types_index += 1;
},
+ .sseup => {
+ if (types_buffer[types_index - 1] == .double) {
+ types_buffer[types_index - 1] = .fp128;
+ } else {
+ types_buffer[types_index] = .double;
+ types_index += 1;
+ }
+ },
.float => {
types_buffer[types_index] = .float;
types_index += 1;