authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 00:06:36-04:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-05-15 03:07:51-04:00
log42d9789f46e94e17d8ab8d02f356eaaa44fb2822
tree228c06a5129808f2cdaf9263bc013fdf56a57547
parent77a8cb57287e8d6f8430f1dedecda2bfb30506f1

x86_64: fix sysv vector argument passing


1 files changed, 2 insertions(+), 28 deletions(-)

src/arch/x86_64/abi.zig+2-28
......@@ -165,34 +165,6 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
165165 },
166166 .Vector => {
167167 const elem_ty = ty.childType();
168 if (ctx == .arg) {
169 const bit_size = ty.bitSize(target);
170 if (bit_size > 128) {
171 const has_avx512 = target.cpu.features.isEnabled(@enumToInt(std.Target.x86.Feature.avx512f));
172 if (has_avx512 and bit_size <= 512) return .{
173 .integer, .integer, .integer, .integer,
174 .integer, .integer, .integer, .integer,
175 };
176 const has_avx = target.cpu.features.isEnabled(@enumToInt(std.Target.x86.Feature.avx));
177 if (has_avx and bit_size <= 256) return .{
178 .integer, .integer, .integer, .integer,
179 .none, .none, .none, .none,
180 };
181 return memory_class;
182 }
183 if (bit_size > 80) return .{
184 .integer, .integer, .none, .none,
185 .none, .none, .none, .none,
186 };
187 if (bit_size > 64) return .{
188 .x87, .none, .none, .none,
189 .none, .none, .none, .none,
190 };
191 return .{
192 .integer, .none, .none, .none,
193 .none, .none, .none, .none,
194 };
195 }
196168 const bits = elem_ty.bitSize(target) * ty.arrayLen();
197169 if (bits <= 64) return .{
198170 .sse, .none, .none, .none,
......@@ -202,6 +174,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
202174 .sse, .sseup, .none, .none,
203175 .none, .none, .none, .none,
204176 };
177 if (ctx == .arg and !std.Target.x86.featureSetHas(target.cpu.features, .avx)) return memory_class;
205178 if (bits <= 192) return .{
206179 .sse, .sseup, .sseup, .none,
207180 .none, .none, .none, .none,
......@@ -210,6 +183,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
210183 .sse, .sseup, .sseup, .sseup,
211184 .none, .none, .none, .none,
212185 };
186 if (ctx == .arg and !std.Target.x86.featureSetHas(target.cpu.features, .avx512f)) return memory_class;
213187 if (bits <= 320) return .{
214188 .sse, .sseup, .sseup, .sseup,
215189 .sseup, .none, .none, .none,