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 {...@@ -165,34 +165,6 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
165 },165 },
166 .Vector => {166 .Vector => {
167 const elem_ty = ty.childType();167 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 }
196 const bits = elem_ty.bitSize(target) * ty.arrayLen();168 const bits = elem_ty.bitSize(target) * ty.arrayLen();
197 if (bits <= 64) return .{169 if (bits <= 64) return .{
198 .sse, .none, .none, .none,170 .sse, .none, .none, .none,
...@@ -202,6 +174,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {...@@ -202,6 +174,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
202 .sse, .sseup, .none, .none,174 .sse, .sseup, .none, .none,
203 .none, .none, .none, .none,175 .none, .none, .none, .none,
204 };176 };
177 if (ctx == .arg and !std.Target.x86.featureSetHas(target.cpu.features, .avx)) return memory_class;
205 if (bits <= 192) return .{178 if (bits <= 192) return .{
206 .sse, .sseup, .sseup, .none,179 .sse, .sseup, .sseup, .none,
207 .none, .none, .none, .none,180 .none, .none, .none, .none,
...@@ -210,6 +183,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {...@@ -210,6 +183,7 @@ pub fn classifySystemV(ty: Type, target: Target, ctx: Context) [8]Class {
210 .sse, .sseup, .sseup, .sseup,183 .sse, .sseup, .sseup, .sseup,
211 .none, .none, .none, .none,184 .none, .none, .none, .none,
212 };185 };
186 if (ctx == .arg and !std.Target.x86.featureSetHas(target.cpu.features, .avx512f)) return memory_class;
213 if (bits <= 320) return .{187 if (bits <= 320) return .{
214 .sse, .sseup, .sseup, .sseup,188 .sse, .sseup, .sseup, .sseup,
215 .sseup, .none, .none, .none,189 .sseup, .none, .none, .none,