authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-12 12:24:59-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-06-13 02:22:04-07:00
log083b7b483e1ad83d62ed7029822a82fff14953c5
tree3b534a1d71fa3bc1c511788d162db28b5250b470
parentb67995689df424a0cab9186fcaf7b09bb04ffc1a
signaturelock-open Commit is signed but in an unrecognized format.

riscv: zero registers when using register-wide operations

what was happening is that instructions like `lb` were only affecting the lower bytes of the register and leaving the top dirty. this would lead to situtations were `cmp_eq` for example was using `xor`, which was failing because of the left-over stuff in the top of the register. with this commit, we now zero out or truncate depending on the context, to ensure instructions like xor will provide proper results.

13 files changed, 72 insertions(+), 44 deletions(-)

src/arch/riscv64/CodeGen.zig+71-17
...@@ -1668,12 +1668,66 @@ fn allocReg(self: *Self, reg_class: abi.RegisterClass) !struct { Register, Regis...@@ -1668,12 +1668,66 @@ fn allocReg(self: *Self, reg_class: abi.RegisterClass) !struct { Register, Regis
1668 return .{ reg, lock };1668 return .{ reg, lock };
1669}1669}
16701670
1671const PromoteOptions = struct {
1672 /// zeroes out the register before loading in the operand
1673 ///
1674 /// if the operand is already a register, it will truncate with 0
1675 zero: bool = false,
1676};
1677
1671/// Similar to `allocReg` but will copy the MCValue into the Register unless `operand` is already1678/// Similar to `allocReg` but will copy the MCValue into the Register unless `operand` is already
1672/// a register, in which case it will return a possible lock to that register.1679/// a register, in which case it will return a possible lock to that register.
1673fn promoteReg(self: *Self, ty: Type, operand: MCValue) !struct { Register, ?RegisterLock } {1680fn promoteReg(self: *Self, ty: Type, operand: MCValue, options: PromoteOptions) !struct { Register, ?RegisterLock } {
1674 if (operand == .register) return .{ operand.register, self.register_manager.lockReg(operand.register) };1681 const zcu = self.bin_file.comp.module.?;
1682 const bit_size = ty.bitSize(zcu);
1683
1684 if (operand == .register) {
1685 const op_reg = operand.register;
1686 if (options.zero and op_reg.class() == .int) {
1687 // we make sure to emit the truncate manually because binOp will call this function
1688 // and it could cause an infinite loop
1689
1690 _ = try self.addInst(.{
1691 .tag = .slli,
1692 .ops = .rri,
1693 .data = .{
1694 .i_type = .{
1695 .imm12 = Immediate.u(64 - bit_size),
1696 .rd = op_reg,
1697 .rs1 = op_reg,
1698 },
1699 },
1700 });
1701
1702 _ = try self.addInst(.{
1703 .tag = .srli,
1704 .ops = .rri,
1705 .data = .{
1706 .i_type = .{
1707 .imm12 = Immediate.u(64 - bit_size),
1708 .rd = op_reg,
1709 .rs1 = op_reg,
1710 },
1711 },
1712 });
1713 }
1714
1715 return .{ op_reg, self.register_manager.lockReg(operand.register) };
1716 }
16751717
1676 const reg, const lock = try self.allocReg(self.typeRegClass(ty));1718 const reg, const lock = try self.allocReg(self.typeRegClass(ty));
1719
1720 if (options.zero and reg.class() == .int) {
1721 _ = try self.addInst(.{
1722 .tag = .pseudo,
1723 .ops = .pseudo_mv,
1724 .data = .{ .rr = .{
1725 .rd = reg,
1726 .rs = .zero,
1727 } },
1728 });
1729 }
1730
1677 try self.genSetReg(ty, reg, operand);1731 try self.genSetReg(ty, reg, operand);
1678 return .{ reg, lock };1732 return .{ reg, lock };
1679}1733}
...@@ -2124,10 +2178,10 @@ fn binOpRegister(...@@ -2124,10 +2178,10 @@ fn binOpRegister(
2124 rhs: MCValue,2178 rhs: MCValue,
2125 rhs_ty: Type,2179 rhs_ty: Type,
2126) !MCValue {2180) !MCValue {
2127 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);2181 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{ .zero = true });
2128 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);2182 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
21292183
2130 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);2184 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{ .zero = true });
2131 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);2185 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
21322186
2133 const dest_reg, const dest_lock = try self.allocReg(.int);2187 const dest_reg, const dest_lock = try self.allocReg(.int);
...@@ -2223,10 +2277,10 @@ fn binOpFloat(...@@ -2223,10 +2277,10 @@ fn binOpFloat(
2223 const zcu = self.bin_file.comp.module.?;2277 const zcu = self.bin_file.comp.module.?;
2224 const float_bits = lhs_ty.floatBits(zcu.getTarget());2278 const float_bits = lhs_ty.floatBits(zcu.getTarget());
22252279
2226 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);2280 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{});
2227 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);2281 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
22282282
2229 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);2283 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{});
2230 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);2284 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
22312285
2232 const mir_tag: Mir.Inst.Tag = switch (tag) {2286 const mir_tag: Mir.Inst.Tag = switch (tag) {
...@@ -2425,10 +2479,10 @@ fn airSubWithOverflow(self: *Self, inst: Air.Inst.Index) !void {...@@ -2425,10 +2479,10 @@ fn airSubWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
2425 const result_mcv = try self.allocRegOrMem(inst, false);2479 const result_mcv = try self.allocRegOrMem(inst, false);
2426 const offset = result_mcv.load_frame;2480 const offset = result_mcv.load_frame;
24272481
2428 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);2482 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{});
2429 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);2483 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
24302484
2431 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);2485 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{});
2432 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);2486 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
24332487
2434 const dest_reg, const dest_lock = try self.allocReg(.int);2488 const dest_reg, const dest_lock = try self.allocReg(.int);
...@@ -2559,7 +2613,7 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void {...@@ -2559,7 +2613,7 @@ fn airMulWithOverflow(self: *Self, inst: Air.Inst.Index) !void {
2559 1...8 => {2613 1...8 => {
2560 const max_val = std.math.pow(u16, 2, int_info.bits) - 1;2614 const max_val = std.math.pow(u16, 2, int_info.bits) - 1;
25612615
2562 const add_reg, const add_lock = try self.promoteReg(lhs_ty, lhs);2616 const add_reg, const add_lock = try self.promoteReg(lhs_ty, lhs, .{});
2563 defer if (add_lock) |lock| self.register_manager.unlockReg(lock);2617 defer if (add_lock) |lock| self.register_manager.unlockReg(lock);
25642618
2565 const overflow_reg, const overflow_lock = try self.allocReg(.int);2619 const overflow_reg, const overflow_lock = try self.allocReg(.int);
...@@ -2645,10 +2699,10 @@ fn airBitAnd(self: *Self, inst: Air.Inst.Index) !void {...@@ -2645,10 +2699,10 @@ fn airBitAnd(self: *Self, inst: Air.Inst.Index) !void {
2645 const lhs_ty = self.typeOf(bin_op.lhs);2699 const lhs_ty = self.typeOf(bin_op.lhs);
2646 const rhs_ty = self.typeOf(bin_op.rhs);2700 const rhs_ty = self.typeOf(bin_op.rhs);
26472701
2648 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);2702 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{});
2649 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);2703 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
26502704
2651 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);2705 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{});
2652 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);2706 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
26532707
2654 const dest_reg, const dest_lock = try self.allocReg(.int);2708 const dest_reg, const dest_lock = try self.allocReg(.int);
...@@ -2678,10 +2732,10 @@ fn airBitOr(self: *Self, inst: Air.Inst.Index) !void {...@@ -2678,10 +2732,10 @@ fn airBitOr(self: *Self, inst: Air.Inst.Index) !void {
2678 const lhs_ty = self.typeOf(bin_op.lhs);2732 const lhs_ty = self.typeOf(bin_op.lhs);
2679 const rhs_ty = self.typeOf(bin_op.rhs);2733 const rhs_ty = self.typeOf(bin_op.rhs);
26802734
2681 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);2735 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{});
2682 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);2736 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
26832737
2684 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);2738 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{});
2685 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);2739 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
26862740
2687 const dest_reg, const dest_lock = try self.allocReg(.int);2741 const dest_reg, const dest_lock = try self.allocReg(.int);
...@@ -4706,10 +4760,10 @@ fn airBoolOp(self: *Self, inst: Air.Inst.Index) !void {...@@ -4706,10 +4760,10 @@ fn airBoolOp(self: *Self, inst: Air.Inst.Index) !void {
4706 const lhs_ty = Type.bool;4760 const lhs_ty = Type.bool;
4707 const rhs_ty = Type.bool;4761 const rhs_ty = Type.bool;
47084762
4709 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs);4763 const lhs_reg, const lhs_lock = try self.promoteReg(lhs_ty, lhs, .{});
4710 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);4764 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
47114765
4712 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs);4766 const rhs_reg, const rhs_lock = try self.promoteReg(rhs_ty, rhs, .{});
4713 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);4767 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
47144768
4715 const result_reg, const result_lock = try self.allocReg(.int);4769 const result_reg, const result_lock = try self.allocReg(.int);
...@@ -4905,7 +4959,7 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void {...@@ -4905,7 +4959,7 @@ fn genCopy(self: *Self, ty: Type, dst_mcv: MCValue, src_mcv: MCValue) !void {
4905 const src_info: ?struct { addr_reg: Register, addr_lock: ?RegisterLock } = switch (src_mcv) {4959 const src_info: ?struct { addr_reg: Register, addr_lock: ?RegisterLock } = switch (src_mcv) {
4906 .register_pair, .memory, .indirect, .load_frame => null,4960 .register_pair, .memory, .indirect, .load_frame => null,
4907 .load_symbol => src: {4961 .load_symbol => src: {
4908 const src_addr_reg, const src_addr_lock = try self.promoteReg(Type.usize, src_mcv.address());4962 const src_addr_reg, const src_addr_lock = try self.promoteReg(Type.usize, src_mcv.address(), .{});
4909 errdefer self.register_manager.unlockReg(src_addr_lock);4963 errdefer self.register_manager.unlockReg(src_addr_lock);
49104964
4911 break :src .{ .addr_reg = src_addr_reg, .addr_lock = src_addr_lock };4965 break :src .{ .addr_reg = src_addr_reg, .addr_lock = src_addr_lock };
...@@ -5463,7 +5517,7 @@ fn genSetMem(...@@ -5463,7 +5517,7 @@ fn genSetMem(
5463 .immediate => {5517 .immediate => {
5464 // TODO: remove this lock in favor of a copyToTmpRegister when we load 64 bit immediates with5518 // TODO: remove this lock in favor of a copyToTmpRegister when we load 64 bit immediates with
5465 // a register allocation.5519 // a register allocation.
5466 const reg, const reg_lock = try self.promoteReg(ty, src_mcv);5520 const reg, const reg_lock = try self.promoteReg(ty, src_mcv, .{});
5467 defer if (reg_lock) |lock| self.register_manager.unlockReg(lock);5521 defer if (reg_lock) |lock| self.register_manager.unlockReg(lock);
54685522
5469 return self.genSetMem(base, disp, ty, .{ .register = reg });5523 return self.genSetMem(base, disp, ty, .{ .register = reg });
src/arch/riscv64/bits.zig+1-1
...@@ -102,7 +102,7 @@ pub const Memory = struct {...@@ -102,7 +102,7 @@ pub const Memory = struct {
102102
103pub const Immediate = union(enum) {103pub const Immediate = union(enum) {
104 signed: i32,104 signed: i32,
105 unsigned: u32,105 unsigned: u64,
106106
107 pub fn u(x: u64) Immediate {107 pub fn u(x: u64) Immediate {
108 return .{ .unsigned = x };108 return .{ .unsigned = x };
test/behavior/array.zig-1
...@@ -542,7 +542,6 @@ test "sentinel element count towards the ABI size calculation" {...@@ -542,7 +542,6 @@ test "sentinel element count towards the ABI size calculation" {
542 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO542 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
543 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO543 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
544 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO544 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
545 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
546545
547 const S = struct {546 const S = struct {
548 fn doTheTest() !void {547 fn doTheTest() !void {
test/behavior/bitcast.zig-3
...@@ -165,7 +165,6 @@ test "@bitCast packed structs at runtime and comptime" {...@@ -165,7 +165,6 @@ test "@bitCast packed structs at runtime and comptime" {
165 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;165 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
166 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO166 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;167 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
168 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
169168
170 const Full = packed struct {169 const Full = packed struct {
171 number: u16,170 number: u16,
...@@ -192,7 +191,6 @@ test "@bitCast packed structs at runtime and comptime" {...@@ -192,7 +191,6 @@ test "@bitCast packed structs at runtime and comptime" {
192test "@bitCast extern structs at runtime and comptime" {191test "@bitCast extern structs at runtime and comptime" {
193 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;192 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
194 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO193 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
195 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
196194
197 const Full = extern struct {195 const Full = extern struct {
198 number: u16,196 number: u16,
...@@ -227,7 +225,6 @@ test "bitcast packed struct to integer and back" {...@@ -227,7 +225,6 @@ test "bitcast packed struct to integer and back" {
227 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;225 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
228 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO226 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
229 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;227 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
230 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
231228
232 const LevelUpMove = packed struct {229 const LevelUpMove = packed struct {
233 move_id: u9,230 move_id: u9,
test/behavior/cast.zig-2
...@@ -57,8 +57,6 @@ test "@intCast to comptime_int" {...@@ -57,8 +57,6 @@ test "@intCast to comptime_int" {
57}57}
5858
59test "implicit cast comptime numbers to any type when the value fits" {59test "implicit cast comptime numbers to any type when the value fits" {
60 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
61
62 const a: u64 = 255;60 const a: u64 = 255;
63 var b: u8 = a;61 var b: u8 = a;
64 _ = &b;62 _ = &b;
test/behavior/error.zig-1
...@@ -740,7 +740,6 @@ test "ret_ptr doesn't cause own inferred error set to be resolved" {...@@ -740,7 +740,6 @@ test "ret_ptr doesn't cause own inferred error set to be resolved" {
740740
741test "simple else prong allowed even when all errors handled" {741test "simple else prong allowed even when all errors handled" {
742 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO742 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
743 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
744743
745 const S = struct {744 const S = struct {
746 fn foo() !u8 {745 fn foo() !u8 {
test/behavior/eval.zig-2
...@@ -395,7 +395,6 @@ test "return 0 from function that has u0 return type" {...@@ -395,7 +395,6 @@ test "return 0 from function that has u0 return type" {
395test "statically initialized struct" {395test "statically initialized struct" {
396 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO396 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
397 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO397 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
398 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
399398
400 st_init_str_foo.x += 1;399 st_init_str_foo.x += 1;
401 try expect(st_init_str_foo.x == 14);400 try expect(st_init_str_foo.x == 14);
...@@ -787,7 +786,6 @@ test "array concatenation peer resolves element types - pointer" {...@@ -787,7 +786,6 @@ test "array concatenation peer resolves element types - pointer" {
787 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;786 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
788 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;787 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
789 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO788 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
790 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
791789
792 var a = [2]u3{ 1, 7 };790 var a = [2]u3{ 1, 7 };
793 var b = [3]u8{ 200, 225, 255 };791 var b = [3]u8{ 200, 225, 255 };
test/behavior/math.zig-4
...@@ -605,8 +605,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {...@@ -605,8 +605,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {
605}605}
606606
607test "unsigned negation wrapping" {607test "unsigned negation wrapping" {
608 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
609
610 try testUnsignedNegationWrappingEval(1);608 try testUnsignedNegationWrappingEval(1);
611 try comptime testUnsignedNegationWrappingEval(1);609 try comptime testUnsignedNegationWrappingEval(1);
612}610}
...@@ -1436,8 +1434,6 @@ test "quad hex float literal parsing accurate" {...@@ -1436,8 +1434,6 @@ test "quad hex float literal parsing accurate" {
1436}1434}
14371435
1438test "truncating shift left" {1436test "truncating shift left" {
1439 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1440
1441 try testShlTrunc(maxInt(u16));1437 try testShlTrunc(maxInt(u16));
1442 try comptime testShlTrunc(maxInt(u16));1438 try comptime testShlTrunc(maxInt(u16));
1443}1439}
test/behavior/packed-struct.zig-2
...@@ -258,7 +258,6 @@ test "nested packed struct unaligned" {...@@ -258,7 +258,6 @@ test "nested packed struct unaligned" {
258 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;258 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
259 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO259 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;260 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
261 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
262 if (native_endian != .little) return error.SkipZigTest; // Byte aligned packed struct field pointers have not been implemented yet261 if (native_endian != .little) return error.SkipZigTest; // Byte aligned packed struct field pointers have not been implemented yet
263262
264 const S1 = packed struct {263 const S1 = packed struct {
...@@ -331,7 +330,6 @@ test "byte-aligned field pointer offsets" {...@@ -331,7 +330,6 @@ test "byte-aligned field pointer offsets" {
331 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;330 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
332 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO331 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
333 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;332 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
334 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
335333
336 const S = struct {334 const S = struct {
337 const A = packed struct {335 const A = packed struct {
test/behavior/reflection.zig-1
...@@ -28,7 +28,6 @@ fn dummy(a: bool, b: i32, c: f32) i32 {...@@ -28,7 +28,6 @@ fn dummy(a: bool, b: i32, c: f32) i32 {
28test "reflection: @field" {28test "reflection: @field" {
29 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;29 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
30 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO30 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
31 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3231
33 var f = Foo{32 var f = Foo{
34 .one = 42,33 .one = 42,
test/behavior/struct.zig-5
...@@ -68,7 +68,6 @@ const SmallStruct = struct {...@@ -68,7 +68,6 @@ const SmallStruct = struct {
6868
69test "lower unnamed constants" {69test "lower unnamed constants" {
70 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO70 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
71 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
7271
73 var foo = SmallStruct{ .a = 1, .b = 255 };72 var foo = SmallStruct{ .a = 1, .b = 255 };
74 try expect(foo.first() == 1);73 try expect(foo.first() == 1);
...@@ -395,7 +394,6 @@ test "packed struct" {...@@ -395,7 +394,6 @@ test "packed struct" {
395 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO394 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
396 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO395 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
397 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;396 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
398 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
399397
400 var foo = APackedStruct{398 var foo = APackedStruct{
401 .x = 1,399 .x = 1,
...@@ -876,7 +874,6 @@ test "packed struct field passed to generic function" {...@@ -876,7 +874,6 @@ test "packed struct field passed to generic function" {
876test "anonymous struct literal syntax" {874test "anonymous struct literal syntax" {
877 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;875 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
878 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO876 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
879 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
880877
881 const S = struct {878 const S = struct {
882 const Point = struct {879 const Point = struct {
...@@ -1106,7 +1103,6 @@ test "packed struct with undefined initializers" {...@@ -1106,7 +1103,6 @@ test "packed struct with undefined initializers" {
1106 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO1103 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1107 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1104 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1108 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1105 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1109 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
11101106
1111 const S = struct {1107 const S = struct {
1112 const P = packed struct {1108 const P = packed struct {
...@@ -1369,7 +1365,6 @@ test "store to comptime field" {...@@ -1369,7 +1365,6 @@ test "store to comptime field" {
1369test "struct field init value is size of the struct" {1365test "struct field init value is size of the struct" {
1370 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1366 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1371 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO1367 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
1372 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
13731368
1374 const namespace = struct {1369 const namespace = struct {
1375 const S = extern struct {1370 const S = extern struct {
test/behavior/this.zig-1
...@@ -27,7 +27,6 @@ test "this refer to module call private fn" {...@@ -27,7 +27,6 @@ test "this refer to module call private fn" {
27test "this refer to container" {27test "this refer to container" {
28 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;28 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
29 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO29 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
30 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3130
32 var pt: Point(i32) = undefined;31 var pt: Point(i32) = undefined;
33 pt.x = 12;32 pt.x = 12;
test/behavior/union.zig-4
...@@ -2025,7 +2025,6 @@ test "inner struct initializer uses packed union layout" {...@@ -2025,7 +2025,6 @@ test "inner struct initializer uses packed union layout" {
20252025
2026test "extern union initialized via reintepreted struct field initializer" {2026test "extern union initialized via reintepreted struct field initializer" {
2027 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2027 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2028 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20292028
2030 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };2029 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };
20312030
...@@ -2045,7 +2044,6 @@ test "extern union initialized via reintepreted struct field initializer" {...@@ -2045,7 +2044,6 @@ test "extern union initialized via reintepreted struct field initializer" {
20452044
2046test "packed union initialized via reintepreted struct field initializer" {2045test "packed union initialized via reintepreted struct field initializer" {
2047 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2046 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2048 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20492047
2050 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };2048 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };
20512049
...@@ -2066,7 +2064,6 @@ test "packed union initialized via reintepreted struct field initializer" {...@@ -2066,7 +2064,6 @@ test "packed union initialized via reintepreted struct field initializer" {
20662064
2067test "store of comptime reinterpreted memory to extern union" {2065test "store of comptime reinterpreted memory to extern union" {
2068 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2066 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2069 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20702067
2071 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };2068 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };
20722069
...@@ -2089,7 +2086,6 @@ test "store of comptime reinterpreted memory to extern union" {...@@ -2089,7 +2086,6 @@ test "store of comptime reinterpreted memory to extern union" {
20892086
2090test "store of comptime reinterpreted memory to packed union" {2087test "store of comptime reinterpreted memory to packed union" {
2091 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;2088 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
2092 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20932089
2094 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };2090 const bytes = [_]u8{ 0xaa, 0xbb, 0xcc, 0xdd };
20952091