authorgravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-04-16 18:48:33-07:00
committergravatar for david@vortan.devDavid Rubin <david@vortan.dev> 2024-05-11 02:17:24-07:00
log2fd83d8c0a8dd28c2474b26ead8cb24d6bde0901
treec3293e36e9233a9c9e7ce4b4d56677173662ae9e
parenta30af172e8dc360cb0a71a5c4dfd904120555715

riscv: by-value structs + `@min`


15 files changed, 174 insertions(+), 35 deletions(-)

src/arch/riscv64/CodeGen.zig+89-10
...@@ -1800,8 +1800,95 @@ fn airNot(self: *Self, inst: Air.Inst.Index) !void {...@@ -1800,8 +1800,95 @@ fn airNot(self: *Self, inst: Air.Inst.Index) !void {
1800}1800}
18011801
1802fn airMin(self: *Self, inst: Air.Inst.Index) !void {1802fn airMin(self: *Self, inst: Air.Inst.Index) !void {
1803 const zcu = self.bin_file.comp.module.?;
1803 const bin_op = self.air.instructions.items(.data)[@intFromEnum(inst)].bin_op;1804 const bin_op = self.air.instructions.items(.data)[@intFromEnum(inst)].bin_op;
1804 const result: MCValue = if (self.liveness.isUnused(inst)) .unreach else return self.fail("TODO implement min for {}", .{self.target.cpu.arch});1805
1806 const result: MCValue = if (self.liveness.isUnused(inst)) .unreach else result: {
1807 const lhs = try self.resolveInst(bin_op.lhs);
1808 const rhs = try self.resolveInst(bin_op.rhs);
1809 const lhs_ty = self.typeOf(bin_op.lhs);
1810 const rhs_ty = self.typeOf(bin_op.rhs);
1811
1812 const int_info = lhs_ty.intInfo(zcu);
1813
1814 if (int_info.bits > 64) return self.fail("TODO: > 64 bit @min", .{});
1815
1816 const lhs_reg, const lhs_lock = blk: {
1817 if (lhs == .register) break :blk .{ lhs.register, null };
1818
1819 const lhs_reg, const lhs_lock = try self.allocReg();
1820 try self.genSetReg(lhs_ty, lhs_reg, lhs);
1821 break :blk .{ lhs_reg, lhs_lock };
1822 };
1823 defer if (lhs_lock) |lock| self.register_manager.unlockReg(lock);
1824
1825 const rhs_reg, const rhs_lock = blk: {
1826 if (rhs == .register) break :blk .{ rhs.register, null };
1827
1828 const rhs_reg, const rhs_lock = try self.allocReg();
1829 try self.genSetReg(rhs_ty, rhs_reg, rhs);
1830 break :blk .{ rhs_reg, rhs_lock };
1831 };
1832 defer if (rhs_lock) |lock| self.register_manager.unlockReg(lock);
1833
1834 const mask_reg, const mask_lock = try self.allocReg();
1835 defer self.register_manager.unlockReg(mask_lock);
1836
1837 const result_reg, const result_lock = try self.allocReg();
1838 defer self.register_manager.unlockReg(result_lock);
1839
1840 _ = try self.addInst(.{
1841 .tag = if (int_info.signedness == .unsigned) .sltu else .slt,
1842 .ops = .rrr,
1843 .data = .{ .r_type = .{
1844 .rd = mask_reg,
1845 .rs1 = lhs_reg,
1846 .rs2 = rhs_reg,
1847 } },
1848 });
1849
1850 _ = try self.addInst(.{
1851 .tag = .sub,
1852 .ops = .rrr,
1853 .data = .{ .r_type = .{
1854 .rd = mask_reg,
1855 .rs1 = .zero,
1856 .rs2 = mask_reg,
1857 } },
1858 });
1859
1860 _ = try self.addInst(.{
1861 .tag = .xor,
1862 .ops = .rrr,
1863 .data = .{ .r_type = .{
1864 .rd = result_reg,
1865 .rs1 = lhs_reg,
1866 .rs2 = rhs_reg,
1867 } },
1868 });
1869
1870 _ = try self.addInst(.{
1871 .tag = .@"and",
1872 .ops = .rrr,
1873 .data = .{ .r_type = .{
1874 .rd = mask_reg,
1875 .rs1 = result_reg,
1876 .rs2 = mask_reg,
1877 } },
1878 });
1879
1880 _ = try self.addInst(.{
1881 .tag = .xor,
1882 .ops = .rrr,
1883 .data = .{ .r_type = .{
1884 .rd = result_reg,
1885 .rs1 = rhs_reg,
1886 .rs2 = mask_reg,
1887 } },
1888 });
1889
1890 break :result .{ .register = result_reg };
1891 };
1805 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });1892 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
1806}1893}
18071894
...@@ -3513,17 +3600,9 @@ fn genCall(...@@ -3513,17 +3600,9 @@ fn genCall(
3513 .imm12 = Immediate.s(0),3600 .imm12 = Immediate.s(0),
3514 } },3601 } },
3515 });3602 });
3516 } else if (self.bin_file.cast(link.File.Coff)) |_| {
3517 return self.fail("TODO implement calling in COFF for {}", .{self.target.cpu.arch});
3518 } else if (self.bin_file.cast(link.File.MachO)) |_| {
3519 unreachable; // unsupported architecture for MachO
3520 } else if (self.bin_file.cast(link.File.Plan9)) |_| {
3521 return self.fail("TODO implement call on plan9 for {}", .{self.target.cpu.arch});
3522 } else unreachable;3603 } else unreachable;
3523 },3604 },
3524 .extern_func => {3605 .extern_func => return self.fail("TODO: extern func calls", .{}),
3525 return self.fail("TODO: extern func calls", .{});
3526 },
3527 else => return self.fail("TODO implement calling bitcasted functions", .{}),3606 else => return self.fail("TODO implement calling bitcasted functions", .{}),
3528 }3607 }
3529 } else {3608 } else {
src/arch/riscv64/Encoding.zig+5-2
...@@ -11,7 +11,6 @@ pub const Mnemonic = enum {...@@ -11,7 +11,6 @@ pub const Mnemonic = enum {
11 lb,11 lb,
12 lbu,12 lbu,
13 sltiu,13 sltiu,
14 sltu,
15 xori,14 xori,
16 andi,15 andi,
17 slli,16 slli,
...@@ -38,9 +37,11 @@ pub const Mnemonic = enum {...@@ -38,9 +37,11 @@ pub const Mnemonic = enum {
3837
39 // R Type38 // R Type
40 add,39 add,
40 @"and",
41 sub,41 sub,
42 slt,42 slt,
43 mul,43 mul,
44 sltu,
44 xor,45 xor,
4546
46 // System47 // System
...@@ -52,6 +53,8 @@ pub const Mnemonic = enum {...@@ -52,6 +53,8 @@ pub const Mnemonic = enum {
52 return switch (mnem) {53 return switch (mnem) {
53 // zig fmt: off54 // zig fmt: off
54 .add => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0000000 },55 .add => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0000000 },
56 .sltu => .{ .opcode = 0b0110011, .funct3 = 0b011, .funct7 = 0b0000000 },
57 .@"and" => .{ .opcode = 0b0110011, .funct3 = 0b111, .funct7 = 0b0000000 },
55 .sub => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0100000 }, 58 .sub => .{ .opcode = 0b0110011, .funct3 = 0b000, .funct7 = 0b0100000 },
5659
57 .ld => .{ .opcode = 0b0000011, .funct3 = 0b011, .funct7 = null },60 .ld => .{ .opcode = 0b0000011, .funct3 = 0b011, .funct7 = null },
...@@ -84,7 +87,6 @@ pub const Mnemonic = enum {...@@ -84,7 +87,6 @@ pub const Mnemonic = enum {
84 .beq => .{ .opcode = 0b1100011, .funct3 = 0b000, .funct7 = null },87 .beq => .{ .opcode = 0b1100011, .funct3 = 0b000, .funct7 = null },
8588
86 .slt => .{ .opcode = 0b0110011, .funct3 = 0b010, .funct7 = 0b0000000 },89 .slt => .{ .opcode = 0b0110011, .funct3 = 0b010, .funct7 = 0b0000000 },
87 .sltu => .{ .opcode = 0b0110011, .funct3 = 0b011, .funct7 = 0b0000000 },
8890
89 .xor => .{ .opcode = 0b0110011, .funct3 = 0b100, .funct7 = 0b0000000 },91 .xor => .{ .opcode = 0b0110011, .funct3 = 0b100, .funct7 = 0b0000000 },
9092
...@@ -149,6 +151,7 @@ pub const InstEnc = enum {...@@ -149,6 +151,7 @@ pub const InstEnc = enum {
149 .xor,151 .xor,
150 .add,152 .add,
151 .sub,153 .sub,
154 .@"and",
152 => .R,155 => .R,
153156
154 .ecall,157 .ecall,
src/arch/riscv64/Mir.zig+6
...@@ -32,6 +32,9 @@ pub const Inst = struct {...@@ -32,6 +32,9 @@ pub const Inst = struct {
32 lui,32 lui,
33 mv,33 mv,
3434
35 @"and",
36 xor,
37
35 ebreak,38 ebreak,
36 ecall,39 ecall,
37 unimp,40 unimp,
...@@ -49,6 +52,9 @@ pub const Inst = struct {...@@ -49,6 +52,9 @@ pub const Inst = struct {
49 /// Absolute Value, uses i_type payload.52 /// Absolute Value, uses i_type payload.
50 abs,53 abs,
5154
55 sltu,
56 slt,
57
52 /// Immediate Logical Right Shift, uses i_type payload58 /// Immediate Logical Right Shift, uses i_type payload
53 srli,59 srli,
54 /// Immediate Logical Left Shift, uses i_type payload60 /// Immediate Logical Left Shift, uses i_type payload
src/arch/riscv64/abi.zig+74-3
...@@ -3,6 +3,7 @@ const bits = @import("bits.zig");...@@ -3,6 +3,7 @@ const bits = @import("bits.zig");
3const Register = bits.Register;3const Register = bits.Register;
4const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager;4const RegisterManagerFn = @import("../../register_manager.zig").RegisterManager;
5const Type = @import("../../type.zig").Type;5const Type = @import("../../type.zig").Type;
6const InternPool = @import("../../InternPool.zig");
6const Module = @import("../../Module.zig");7const Module = @import("../../Module.zig");
7const assert = std.debug.assert;8const assert = std.debug.assert;
89
...@@ -97,7 +98,10 @@ pub fn classifyType(ty: Type, mod: *Module) Class {...@@ -97,7 +98,10 @@ pub fn classifyType(ty: Type, mod: *Module) Class {
97pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {98pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
98 const ip = zcu.intern_pool;99 const ip = zcu.intern_pool;
99 var result = [1]Class{.none} ** 8;100 var result = [1]Class{.none} ** 8;
100101 const memory_class = [_]Class{
102 .memory, .none, .none, .none,
103 .none, .none, .none, .none,
104 };
101 switch (ty.zigTypeTag(zcu)) {105 switch (ty.zigTypeTag(zcu)) {
102 .Bool, .Void, .NoReturn => {106 .Bool, .Void, .NoReturn => {
103 result[0] = .integer;107 result[0] = .integer;
...@@ -146,7 +150,12 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {...@@ -146,7 +150,12 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
146 // anyerror!void can fit into one register150 // anyerror!void can fit into one register
147 if (payload_bits == 0) return result;151 if (payload_bits == 0) return result;
148152
149 std.debug.panic("support ErrorUnion payload {}", .{payload_ty.fmt(zcu)});153 if (payload_bits <= 64) {
154 result[1] = .integer;
155 return result;
156 }
157
158 std.debug.panic("TODO: classifySystem ErrorUnion > 64 bit payload", .{});
150 },159 },
151 .Struct => {160 .Struct => {
152 const loaded_struct = ip.loadStructType(ty.toIntern());161 const loaded_struct = ip.loadStructType(ty.toIntern());
...@@ -158,13 +167,75 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {...@@ -158,13 +167,75 @@ pub fn classifySystem(ty: Type, zcu: *Module) [8]Class {
158 if (ty_size > 8) result[1] = .integer;167 if (ty_size > 8) result[1] = .integer;
159 return result;168 return result;
160 }169 }
170 if (ty_size > 64)
171 return memory_class;
161172
162 std.debug.panic("support Struct in classifySystem", .{});173 var byte_offset: u64 = 0;
174 classifyStruct(&result, &byte_offset, loaded_struct, zcu);
175
176 return result;
163 },177 },
164 else => |bad_ty| std.debug.panic("classifySystem {s}", .{@tagName(bad_ty)}),178 else => |bad_ty| std.debug.panic("classifySystem {s}", .{@tagName(bad_ty)}),
165 }179 }
166}180}
167181
182fn classifyStruct(
183 result: *[8]Class,
184 byte_offset: *u64,
185 loaded_struct: InternPool.LoadedStructType,
186 zcu: *Module,
187) void {
188 const ip = &zcu.intern_pool;
189 var field_it = loaded_struct.iterateRuntimeOrder(ip);
190
191 while (field_it.next()) |field_index| {
192 const field_ty = Type.fromInterned(loaded_struct.field_types.get(ip)[field_index]);
193 const field_align = loaded_struct.fieldAlign(ip, field_index);
194 byte_offset.* = std.mem.alignForward(
195 u64,
196 byte_offset.*,
197 field_align.toByteUnits() orelse field_ty.abiAlignment(zcu).toByteUnits().?,
198 );
199 if (zcu.typeToStruct(field_ty)) |field_loaded_struct| {
200 if (field_loaded_struct.layout != .@"packed") {
201 classifyStruct(result, byte_offset, field_loaded_struct, zcu);
202 continue;
203 }
204 }
205 const field_class = std.mem.sliceTo(&classifySystem(field_ty, zcu), .none);
206 const field_size = field_ty.abiSize(zcu);
207
208 combine: {
209 const result_class = &result[@intCast(byte_offset.* / 8)];
210 if (result_class.* == field_class[0]) {
211 break :combine;
212 }
213
214 if (result_class.* == .none) {
215 result_class.* = field_class[0];
216 break :combine;
217 }
218 assert(field_class[0] != .none);
219
220 // "If one of the classes is MEMORY, the result is the MEMORY class."
221 if (result_class.* == .memory or field_class[0] == .memory) {
222 result_class.* = .memory;
223 break :combine;
224 }
225
226 // "If one of the classes is INTEGER, the result is the INTEGER."
227 if (result_class.* == .integer or field_class[0] == .integer) {
228 result_class.* = .integer;
229 break :combine;
230 }
231
232 result_class.* = .integer;
233 }
234 @memcpy(result[@intCast(byte_offset.* / 8 + 1)..][0 .. field_class.len - 1], field_class[1..]);
235 byte_offset.* += field_size;
236 }
237}
238
168pub const callee_preserved_regs = [_]Register{239pub const callee_preserved_regs = [_]Register{
169 // .s0 is ommited to be used as a frame pointer240 // .s0 is ommited to be used as a frame pointer
170 .s1, .s2, .s3, .s4, .s5, .s6, .s7, .s8, .s9, .s10, .s11,241 .s1, .s2, .s3, .s4, .s5, .s6, .s7, .s8, .s9, .s10, .s11,
test/behavior/array.zig-1
...@@ -75,7 +75,6 @@ test "array concat with tuple" {...@@ -75,7 +75,6 @@ test "array concat with tuple" {
75 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO75 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
76 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO76 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO77 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
78 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
7978
80 const array: [2]u8 = .{ 1, 2 };79 const array: [2]u8 = .{ 1, 2 };
81 {80 {
test/behavior/basic.zig-1
...@@ -593,7 +593,6 @@ test "equality compare fn ptrs" {...@@ -593,7 +593,6 @@ test "equality compare fn ptrs" {
593593
594test "self reference through fn ptr field" {594test "self reference through fn ptr field" {
595 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;595 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
596 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
597596
598 const S = struct {597 const S = struct {
599 const A = struct {598 const A = struct {
test/behavior/cast.zig-2
...@@ -2073,7 +2073,6 @@ test "peer type resolution: empty tuple pointer and slice" {...@@ -2073,7 +2073,6 @@ test "peer type resolution: empty tuple pointer and slice" {
2073 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2073 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2074 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2074 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2075 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2075 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2076 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20772076
2078 var a: [:0]const u8 = "Hello";2077 var a: [:0]const u8 = "Hello";
2079 var b = &.{};2078 var b = &.{};
...@@ -2095,7 +2094,6 @@ test "peer type resolution: tuple pointer and slice" {...@@ -2095,7 +2094,6 @@ test "peer type resolution: tuple pointer and slice" {
2095 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO2094 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2096 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO2095 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2097 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO2096 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
2098 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
20992097
2100 var a: [:0]const u8 = "Hello";2098 var a: [:0]const u8 = "Hello";
2101 var b = &.{ @as(u8, 'x'), @as(u8, 'y'), @as(u8, 'z') };2099 var b = &.{ @as(u8, 'x'), @as(u8, 'y'), @as(u8, 'z') };
test/behavior/fn.zig-3
...@@ -191,7 +191,6 @@ test "function with complex callconv and return type expressions" {...@@ -191,7 +191,6 @@ test "function with complex callconv and return type expressions" {
191191
192test "pass by non-copying value" {192test "pass by non-copying value" {
193 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO193 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
194 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
195194
196 try expect(addPointCoords(Point{ .x = 1, .y = 2 }) == 3);195 try expect(addPointCoords(Point{ .x = 1, .y = 2 }) == 3);
197}196}
...@@ -219,7 +218,6 @@ fn addPointCoordsVar(pt: anytype) !i32 {...@@ -219,7 +218,6 @@ fn addPointCoordsVar(pt: anytype) !i32 {
219218
220test "pass by non-copying value as method" {219test "pass by non-copying value as method" {
221 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO220 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
222 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
223221
224 var pt = Point2{ .x = 1, .y = 2 };222 var pt = Point2{ .x = 1, .y = 2 };
225 try expect(pt.addPointCoords() == 3);223 try expect(pt.addPointCoords() == 3);
...@@ -236,7 +234,6 @@ const Point2 = struct {...@@ -236,7 +234,6 @@ const Point2 = struct {
236234
237test "pass by non-copying value as method, which is generic" {235test "pass by non-copying value as method, which is generic" {
238 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO236 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
239 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
240237
241 var pt = Point3{ .x = 1, .y = 2 };238 var pt = Point3{ .x = 1, .y = 2 };
242 try expect(pt.addPointCoords(i32) == 3);239 try expect(pt.addPointCoords(i32) == 3);
test/behavior/fn_delegation.zig-1
...@@ -34,7 +34,6 @@ fn custom(comptime T: type, comptime num: u64) fn (T) u64 {...@@ -34,7 +34,6 @@ fn custom(comptime T: type, comptime num: u64) fn (T) u64 {
34test "fn delegation" {34test "fn delegation" {
35 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO35 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
36 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO36 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
3837
39 const foo = Foo{};38 const foo = Foo{};
40 try expect(foo.one() == 11);39 try expect(foo.one() == 11);
test/behavior/generics.zig-1
...@@ -395,7 +395,6 @@ test "extern function used as generic parameter" {...@@ -395,7 +395,6 @@ test "extern function used as generic parameter" {
395395
396test "generic struct as parameter type" {396test "generic struct as parameter type" {
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 const S = struct {399 const S = struct {
401 fn doTheTest(comptime Int: type, thing: struct { int: Int }) !void {400 fn doTheTest(comptime Int: type, thing: struct { int: Int }) !void {
test/behavior/pointers.zig-1
...@@ -434,7 +434,6 @@ test "indexing array with sentinel returns correct type" {...@@ -434,7 +434,6 @@ test "indexing array with sentinel returns correct type" {
434 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO434 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
435 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO435 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
436 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO436 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
437 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
438437
439 var s: [:0]const u8 = "abc";438 var s: [:0]const u8 = "abc";
440 try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));439 try testing.expectEqualSlices(u8, "*const u8", @typeName(@TypeOf(&s[0])));
test/behavior/sizeof_and_typeof.zig-1
...@@ -412,7 +412,6 @@ test "Extern function calls, dereferences and field access in @TypeOf" {...@@ -412,7 +412,6 @@ test "Extern function calls, dereferences and field access in @TypeOf" {
412 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;412 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
413 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO413 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
414 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;414 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
415 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
416415
417 const Test = struct {416 const Test = struct {
418 fn test_fn_1(a: c_long) @TypeOf(c_fopen("test", "r").*) {417 fn test_fn_1(a: c_long) @TypeOf(c_fopen("test", "r").*) {
test/behavior/slice.zig-1
...@@ -939,7 +939,6 @@ test "modify slice length at comptime" {...@@ -939,7 +939,6 @@ test "modify slice length at comptime" {
939 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;939 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
940 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;940 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
941 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;941 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest;
942 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
943942
944 const arr: [2]u8 = .{ 10, 20 };943 const arr: [2]u8 = .{ 10, 20 };
945 comptime var s: []const u8 = arr[0..0];944 comptime var s: []const u8 = arr[0..0];
test/behavior/struct.zig-7
...@@ -176,7 +176,6 @@ const MemberFnTestFoo = struct {...@@ -176,7 +176,6 @@ const MemberFnTestFoo = struct {
176176
177test "call member function directly" {177test "call member function directly" {
178 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO178 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
179 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
180179
181 const instance = MemberFnTestFoo{ .x = 1234 };180 const instance = MemberFnTestFoo{ .x = 1234 };
182 const result = MemberFnTestFoo.member(instance);181 const result = MemberFnTestFoo.member(instance);
...@@ -185,7 +184,6 @@ test "call member function directly" {...@@ -185,7 +184,6 @@ test "call member function directly" {
185184
186test "store member function in variable" {185test "store member function in variable" {
187 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO186 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
188 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
189187
190 const instance = MemberFnTestFoo{ .x = 1234 };188 const instance = MemberFnTestFoo{ .x = 1234 };
191 const memberFn = MemberFnTestFoo.member;189 const memberFn = MemberFnTestFoo.member;
...@@ -1561,7 +1559,6 @@ test "discarded struct initialization works as expected" {...@@ -1561,7 +1559,6 @@ test "discarded struct initialization works as expected" {
1561test "function pointer in struct returns the struct" {1559test "function pointer in struct returns the struct" {
1562 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1560 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1563 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;1561 if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest;
1564 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
15651562
1566 const A = struct {1563 const A = struct {
1567 const A = @This();1564 const A = @This();
...@@ -1784,8 +1781,6 @@ fn countFields(v: anytype) usize {...@@ -1784,8 +1781,6 @@ fn countFields(v: anytype) usize {
1784}1781}
17851782
1786test "struct init with no result pointer sets field result types" {1783test "struct init with no result pointer sets field result types" {
1787 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1788
1789 const S = struct {1784 const S = struct {
1790 // A function parameter has a result type, but no result pointer.1785 // A function parameter has a result type, but no result pointer.
1791 fn f(s: struct { x: u32 }) u32 {1786 fn f(s: struct { x: u32 }) u32 {
...@@ -1933,8 +1928,6 @@ test "circular dependency through pointer field of a struct" {...@@ -1933,8 +1928,6 @@ test "circular dependency through pointer field of a struct" {
1933}1928}
19341929
1935test "field calls do not force struct field init resolution" {1930test "field calls do not force struct field init resolution" {
1936 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
1937
1938 const S = struct {1931 const S = struct {
1939 x: u32 = blk: {1932 x: u32 = blk: {
1940 _ = @TypeOf(make().dummyFn()); // runtime field call - S not fully resolved - dummyFn call should not force field init resolution1933 _ = @TypeOf(make().dummyFn()); // runtime field call - S not fully resolved - dummyFn call should not force field init resolution
test/behavior/type.zig-1
...@@ -203,7 +203,6 @@ test "Type.Opaque" {...@@ -203,7 +203,6 @@ test "Type.Opaque" {
203 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO203 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
204 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO204 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
205 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO205 if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO
206 if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest;
207206
208 const Opaque = @Type(.{207 const Opaque = @Type(.{
209 .Opaque = .{208 .Opaque = .{