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(
84808480 if (maybe_mask_reg) |mask_reg| self.register_manager.lockRegAssumeUnused(mask_reg) else null;
84818481 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)) {
84848485 .Int => switch (air_tag) {
84858486 .cmp_lt, .cmp_gte => true,
84868487 else => false,
......@@ -8490,14 +8491,24 @@ fn genBinOp(
84908491 else => false,
84918492 },
84928493 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 var rhs_mcv = try self.resolveInst(ordered_air.rhs);
8496 if (lhs_ty.isAbiInt(mod)) for (ordered_air) |op_air| {
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]);
84978508 switch (lhs_mcv) {
84988509 .immediate => |imm| switch (imm) {
84998510 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]),
85018512 else => {},
85028513 },
85038514 else => {},
......@@ -8549,10 +8560,10 @@ fn genBinOp(
85498560 };
85508561 if (maybe_inst) |inst| {
85518562 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))
85538564 break :dst lhs_mcv;
85548565 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))
85568567 {
85578568 flipped = true;
85588569 break :dst rhs_mcv;
......@@ -8563,7 +8574,7 @@ fn genBinOp(
85638574 copied_to_dst = false
85648575 else
85658576 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]);
85678578 break :dst dst_mcv;
85688579 };
85698580 const dst_locks: [2]?RegisterLock = switch (dst_mcv) {
......@@ -15445,7 +15456,7 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
1544515456 }
1544615457 break :result .{ .load_frame = .{ .index = frame_index } };
1544715458 },
15448 .Array => {
15459 .Array, .Vector => {
1544915460 const frame_index = try self.allocFrameIndex(FrameAlloc.initSpill(result_ty, mod));
1545015461 const elem_ty = result_ty.childType(mod);
1545115462 const elem_size: u32 = @intCast(elem_ty.abiSize(mod));
......@@ -15467,7 +15478,6 @@ fn airAggregateInit(self: *Self, inst: Air.Inst.Index) !void {
1546715478 );
1546815479 break :result .{ .load_frame = .{ .index = frame_index } };
1546915480 },
15470 .Vector => return self.fail("TODO implement aggregate_init for vectors", .{}),
1547115481 else => unreachable,
1547215482 }
1547315483 };
test/behavior/cast.zig+3-6
......@@ -1476,7 +1476,7 @@ test "coerce between pointers of compatible differently-named floats" {
14761476 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
14771477 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) {
14801480 // https://github.com/ziglang/zig/issues/12396
14811481 return error.SkipZigTest;
14821482 }
......@@ -1723,7 +1723,6 @@ test "peer type resolution: array and vector with same child type" {
17231723test "peer type resolution: array with smaller child type and vector with larger child type" {
17241724 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
17251725 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1726 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
17271726 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
17281727 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
17291728 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" {
23112310
23122311test "@floatCast on vector" {
23132312 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2314 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
23152313 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
23162314 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
23172315 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23182316 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
23202319 const S = struct {
23212320 fn doTheTest() !void {
......@@ -2332,7 +2331,6 @@ test "@floatCast on vector" {
23322331
23332332test "@ptrFromInt on vector" {
23342333 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2335 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
23362334 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
23372335 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
23382336 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
......@@ -2382,11 +2380,11 @@ test "@intFromPtr on vector" {
23822380
23832381test "@floatFromInt on vector" {
23842382 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2385 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
23862383 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
23872384 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
23882385 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
23892386 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
23912389 const S = struct {
23922390 fn doTheTest() !void {
......@@ -2403,7 +2401,6 @@ test "@floatFromInt on vector" {
24032401
24042402test "@intFromFloat on vector" {
24052403 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
2406 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
24072404 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
24082405 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
24092406 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" {
222222 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
223223 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
224224 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
227227 const S = struct {
228228 fn doTheTest() !void {