authorgravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-12-03 13:55:16-05:00
committergravatar for jacobly@ziglang.orgJacob Young <jacobly@ziglang.org> 2023-12-03 13:55:31-05:00
log7c85ea65ba9f85be44aa8af3745a6038b132bd7f
tree4eeab33da7bddb8669826f8bf7597513ddc0e83d
parent82ba9b8560f6f173953e6d89321235036b98bafe

x86_64: "implement" `aggregate_init` for vectors


3 files changed, 24 insertions(+), 17 deletions(-)

src/arch/x86_64/CodeGen.zig+20-10
...@@ -8480,7 +8480,8 @@ fn genBinOp(...@@ -8480,7 +8480,8 @@ fn genBinOp(
8480 if (maybe_mask_reg) |mask_reg| self.register_manager.lockRegAssumeUnused(mask_reg) else null;8480 if (maybe_mask_reg) |mask_reg| self.register_manager.lockRegAssumeUnused(mask_reg) else null;
8481 defer if (mask_lock) |lock| self.register_manager.unlockReg(lock);8481 defer if (mask_lock) |lock| self.register_manager.unlockReg(lock);
84828482
8483 const ordered_air = if (lhs_ty.isVector(mod) and switch (lhs_ty.childType(mod).zigTypeTag(mod)) {8483 const ordered_air: [2]Air.Inst.Ref = if (lhs_ty.isVector(mod) and
8484 switch (lhs_ty.childType(mod).zigTypeTag(mod)) {
8484 .Int => switch (air_tag) {8485 .Int => switch (air_tag) {
8485 .cmp_lt, .cmp_gte => true,8486 .cmp_lt, .cmp_gte => true,
8486 else => false,8487 else => false,
...@@ -8490,14 +8491,24 @@ fn genBinOp(...@@ -8490,14 +8491,24 @@ fn genBinOp(
8490 else => false,8491 else => false,
8491 },8492 },
8492 else => unreachable,8493 else => unreachable,
8493 }) .{ .lhs = rhs_air, .rhs = lhs_air } else .{ .lhs = lhs_air, .rhs = rhs_air };8494 }) .{ rhs_air, lhs_air } else .{ lhs_air, rhs_air };
84948495
8495 const lhs_mcv = try self.resolveInst(ordered_air.lhs);8496 if (lhs_ty.isAbiInt(mod)) for (ordered_air) |op_air| {
8496 var rhs_mcv = try self.resolveInst(ordered_air.rhs);8497 switch (try self.resolveInst(op_air)) {
8498 .register => |op_reg| switch (op_reg.class()) {
8499 .sse => try self.register_manager.getReg(op_reg, null),
8500 else => {},
8501 },
8502 else => {},
8503 }
8504 };
8505
8506 const lhs_mcv = try self.resolveInst(ordered_air[0]);
8507 var rhs_mcv = try self.resolveInst(ordered_air[1]);
8497 switch (lhs_mcv) {8508 switch (lhs_mcv) {
8498 .immediate => |imm| switch (imm) {8509 .immediate => |imm| switch (imm) {
8499 0 => switch (air_tag) {8510 0 => switch (air_tag) {
8500 .sub, .sub_wrap => return self.genUnOp(maybe_inst, .neg, ordered_air.rhs),8511 .sub, .sub_wrap => return self.genUnOp(maybe_inst, .neg, ordered_air[1]),
8501 else => {},8512 else => {},
8502 },8513 },
8503 else => {},8514 else => {},
...@@ -8549,10 +8560,10 @@ fn genBinOp(...@@ -8549,10 +8560,10 @@ fn genBinOp(
8549 };8560 };
8550 if (maybe_inst) |inst| {8561 if (maybe_inst) |inst| {
8551 if ((!sse_op or lhs_mcv.isRegister()) and8562 if ((!sse_op or lhs_mcv.isRegister()) and
8552 self.reuseOperandAdvanced(inst, ordered_air.lhs, 0, lhs_mcv, tracked_inst))8563 self.reuseOperandAdvanced(inst, ordered_air[0], 0, lhs_mcv, tracked_inst))
8553 break :dst lhs_mcv;8564 break :dst lhs_mcv;
8554 if (is_commutative and (!sse_op or rhs_mcv.isRegister()) and8565 if (is_commutative and (!sse_op or rhs_mcv.isRegister()) and
8555 self.reuseOperandAdvanced(inst, ordered_air.rhs, 1, rhs_mcv, tracked_inst))8566 self.reuseOperandAdvanced(inst, ordered_air[1], 1, rhs_mcv, tracked_inst))
8556 {8567 {
8557 flipped = true;8568 flipped = true;
8558 break :dst rhs_mcv;8569 break :dst rhs_mcv;
...@@ -8563,7 +8574,7 @@ fn genBinOp(...@@ -8563,7 +8574,7 @@ fn genBinOp(
8563 copied_to_dst = false8574 copied_to_dst = false
8564 else8575 else
8565 try self.genCopy(lhs_ty, dst_mcv, lhs_mcv);8576 try self.genCopy(lhs_ty, dst_mcv, lhs_mcv);
8566 rhs_mcv = try self.resolveInst(ordered_air.rhs);8577 rhs_mcv = try self.resolveInst(ordered_air[1]);
8567 break :dst dst_mcv;8578 break :dst dst_mcv;
8568 };8579 };
8569 const dst_locks: [2]?RegisterLock = switch (dst_mcv) {8580 const dst_locks: [2]?RegisterLock = switch (dst_mcv) {
...@@ -15445,7 +15456,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {...@@ -15445,7 +15456,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
15445 }15456 }
15446 break :result .{ .load_frame = .{ .index = frame_index } };15457 break :result .{ .load_frame = .{ .index = frame_index } };
15447 },15458 },
15448 .Array => {15459 .Array, .Vector => {
15449 const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, mod));15460 const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, mod));
15450 const elem_ty = result_ty.childType(mod);15461 const elem_ty = result_ty.childType(mod);
15451 const elem_size: u32 = @intCast(elem_ty.abiSize(mod));15462 const elem_size: u32 = @intCast(elem_ty.abiSize(mod));
...@@ -15467,7 +15478,6 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {...@@ -15467,7 +15478,6 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
15467 );15478 );
15468 break :result .{ .load_frame = .{ .index = frame_index } };15479 break :result .{ .load_frame = .{ .index = frame_index } };
15469 },15480 },
15470 .Vector => return self.fail("TODO implement aggregate_init for vectors", .{}),
15471 else => unreachable,15481 else => unreachable,
15472 }15482 }
15473 };15483 };
test/behavior/cast.zig+3-6
...@@ -1476,7 +1476,7 @@ test "coerce between pointers of compatible differently-named floats" {...@@ -1476,7 +1476,7 @@ test "coerce between pointers of compatible differently-named floats" {
1476 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1476 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1477 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;1477 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
14781478
1479 if (builtin.os.tag == .windows) {1479 if (builtin.zig_backend == .stage2_llvm and builtin.os.tag == .windows) {
1480 // https://github.com/ziglang/zig/issues/123961480 // https://github.com/ziglang/zig/issues/12396
1481 return error.SkipZigTest;1481 return error.SkipZigTest;
1482 }1482 }
...@@ -1723,7 +1723,6 @@ test "peer type resolution: array and vector with same child type" {...@@ -1723,7 +1723,6 @@ test "peer type resolution: array and vector with same child type" {
1723test "peer type resolution: array with smaller child type and vector with larger child type" {1723test "peer type resolution: array with smaller child type and vector with larger child type" {
1724 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1724 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1725 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1725 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1726 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1727 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1726 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
1728 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1727 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1729 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO1728 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; // TODO
...@@ -2311,11 +2310,11 @@ test "cast builtins can wrap result in error union and optional" {...@@ -2311,11 +2310,11 @@ test "cast builtins can wrap result in error union and optional" {
23112310
2312test "@floatCast on vector" {2311test "@floatCast on vector" {
2313 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2312 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2314 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2315 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2313 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2316 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2314 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2317 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2315 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2318 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2316 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2317 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
23192318
2320 const S = struct {2319 const S = struct {
2321 fn doTheTest() !void {2320 fn doTheTest() !void {
...@@ -2332,7 +2331,6 @@ test "@floatCast on vector" {...@@ -2332,7 +2331,6 @@ test "@floatCast on vector" {
23322331
2333test "@ptrFromInt on vector" {2332test "@ptrFromInt on vector" {
2334 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2333 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2335 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2336 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2334 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2337 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2335 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2338 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2336 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
...@@ -2382,11 +2380,11 @@ test "@intFromPtr on vector" {...@@ -2382,11 +2380,11 @@ test "@intFromPtr on vector" {
23822380
2383test "@floatFromInt on vector" {2381test "@floatFromInt on vector" {
2384 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2382 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2385 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2386 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2383 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2387 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2384 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2388 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2385 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2389 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2386 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2387 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
23902388
2391 const S = struct {2389 const S = struct {
2392 fn doTheTest() !void {2390 fn doTheTest() !void {
...@@ -2403,7 +2401,6 @@ test "@floatFromInt on vector" {...@@ -2403,7 +2401,6 @@ test "@floatFromInt on vector" {
24032401
2404test "@intFromFloat on vector" {2402test "@intFromFloat on vector" {
2405 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO2403 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2406 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
2407 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2404 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2408 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2405 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2409 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2406 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
test/behavior/vector.zig+1-1
...@@ -222,7 +222,7 @@ test "array to vector with element type coercion" {...@@ -222,7 +222,7 @@ test "array to vector with element type coercion" {
222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
223 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;223 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
224 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO224 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
225 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;225 if (builtin.zig_backend == .stage2_x86_64 and builtin.target.ofmt != .elf) return error.SkipZigTest;
226226
227 const S = struct {227 const S = struct {
228 fn doTheTest() !void {228 fn doTheTest() !void {