authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-09-04 09:00:14+02:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-09-09 19:17:18+02:00
log3794f2c493c9744e19cd7df23c3d4b32565aaa96
treef7840fae06c5f0f909e5c58dc1160c211782ca7b
parent25729d6155682933d7ab3aa30c7e060519b2f4e1
signature Commit is signed but in an unrecognized format.

stage2 ARM: implement struct_field_val for registers


13 files changed, 36 insertions(+), 24 deletions(-)

src/arch/arm/CodeGen.zig+36-1
...@@ -2739,6 +2739,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -2739,6 +2739,7 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
2739 const mcv = try self.resolveInst(operand);2739 const mcv = try self.resolveInst(operand);
2740 const struct_ty = self.air.typeOf(operand);2740 const struct_ty = self.air.typeOf(operand);
2741 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));2741 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
2742 const struct_field_ty = struct_ty.structFieldType(index);
27422743
2743 switch (mcv) {2744 switch (mcv) {
2744 .dead, .unreach => unreachable,2745 .dead, .unreach => unreachable,
...@@ -2776,11 +2777,45 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {...@@ -2776,11 +2777,45 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
2776 } else {2777 } else {
2777 // Copy to new register2778 // Copy to new register
2778 const dest_reg = try self.register_manager.allocReg(null, gp);2779 const dest_reg = try self.register_manager.allocReg(null, gp);
2779 try self.genSetReg(struct_ty.structFieldType(index), dest_reg, field);2780 try self.genSetReg(struct_field_ty, dest_reg, field);
27802781
2781 break :result MCValue{ .register = dest_reg };2782 break :result MCValue{ .register = dest_reg };
2782 }2783 }
2783 },2784 },
2785 .register => {
2786 var operand_reg: Register = undefined;
2787 var dest_reg: Register = undefined;
2788
2789 const read_args = [_]ReadArg{
2790 .{ .ty = struct_ty, .bind = .{ .mcv = mcv }, .class = gp, .reg = &operand_reg },
2791 };
2792 const write_args = [_]WriteArg{
2793 .{ .ty = struct_field_ty, .bind = .none, .class = gp, .reg = &dest_reg },
2794 };
2795 try self.allocRegs(
2796 &read_args,
2797 &write_args,
2798 ReuseMetadata{
2799 .corresponding_inst = inst,
2800 .operand_mapping = &.{0},
2801 },
2802 );
2803
2804 const field_bit_offset = struct_field_offset * 8;
2805 const field_bit_size = @intCast(u32, struct_field_ty.abiSize(self.target.*)) * 8;
2806
2807 _ = try self.addInst(.{
2808 .tag = if (struct_field_ty.isSignedInt()) Mir.Inst.Tag.sbfx else .ubfx,
2809 .data = .{ .rr_lsb_width = .{
2810 .rd = dest_reg,
2811 .rn = operand_reg,
2812 .lsb = @intCast(u5, field_bit_offset),
2813 .width = @intCast(u6, field_bit_size),
2814 } },
2815 });
2816
2817 break :result MCValue{ .register = dest_reg };
2818 },
2784 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),2819 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
2785 }2820 }
2786 };2821 };
test/behavior/array.zig-2
...@@ -175,7 +175,6 @@ test "nested arrays of integers" {...@@ -175,7 +175,6 @@ test "nested arrays of integers" {
175175
176test "implicit comptime in array type size" {176test "implicit comptime in array type size" {
177 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;177 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
178 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
179178
180 var arr: [plusOne(10)]bool = undefined;179 var arr: [plusOne(10)]bool = undefined;
181 try expect(arr.len == 11);180 try expect(arr.len == 11);
...@@ -484,7 +483,6 @@ test "sentinel element count towards the ABI size calculation" {...@@ -484,7 +483,6 @@ test "sentinel element count towards the ABI size calculation" {
484test "zero-sized array with recursive type definition" {483test "zero-sized array with recursive type definition" {
485 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO484 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
486 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO485 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
487 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
488486
489 const U = struct {487 const U = struct {
490 fn foo(comptime T: type, comptime n: usize) type {488 fn foo(comptime T: type, comptime n: usize) type {
test/behavior/basic.zig-2
...@@ -465,7 +465,6 @@ fn nine() u8 {...@@ -465,7 +465,6 @@ fn nine() u8 {
465465
466test "struct inside function" {466test "struct inside function" {
467 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;467 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
468 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
469468
470 try testStructInFn();469 try testStructInFn();
471 comptime try testStructInFn();470 comptime try testStructInFn();
...@@ -514,7 +513,6 @@ var global_foo: *i32 = undefined;...@@ -514,7 +513,6 @@ var global_foo: *i32 = undefined;
514513
515test "peer result location with typed parent, runtime condition, comptime prongs" {514test "peer result location with typed parent, runtime condition, comptime prongs" {
516 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
517 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
518516
519 const S = struct {517 const S = struct {
520 fn doTheTest(arg: i32) i32 {518 fn doTheTest(arg: i32) i32 {
test/behavior/bitcast.zig-1
...@@ -138,7 +138,6 @@ test "@bitCast extern structs at runtime and comptime" {...@@ -138,7 +138,6 @@ test "@bitCast extern structs at runtime and comptime" {
138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
139 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;139 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
140 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;140 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
141 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
142141
143 const Full = extern struct {142 const Full = extern struct {
144 number: u16,143 number: u16,
test/behavior/enum.zig-1
...@@ -1127,7 +1127,6 @@ test "tag name functions are unique" {...@@ -1127,7 +1127,6 @@ test "tag name functions are unique" {
11271127
1128test "size of enum with only one tag which has explicit integer tag type" {1128test "size of enum with only one tag which has explicit integer tag type" {
1129 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;1129 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1130 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1131 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1130 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11321131
1133 const E = enum(u8) { nope = 10 };1132 const E = enum(u8) { nope = 10 };
test/behavior/eval.zig-1
...@@ -954,7 +954,6 @@ test "const local with comptime init through array init" {...@@ -954,7 +954,6 @@ test "const local with comptime init through array init" {
954954
955test "closure capture type of runtime-known parameter" {955test "closure capture type of runtime-known parameter" {
956 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO956 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
957 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
958957
959 const S = struct {958 const S = struct {
960 fn b(c: anytype) !void {959 fn b(c: anytype) !void {
test/behavior/for.zig-1
...@@ -213,7 +213,6 @@ test "for on slice with allowzero ptr" {...@@ -213,7 +213,6 @@ test "for on slice with allowzero ptr" {
213213
214test "else continue outer for" {214test "else continue outer for" {
215 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO215 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
216 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
217216
218 var i: usize = 6;217 var i: usize = 6;
219 var buf: [5]u8 = undefined;218 var buf: [5]u8 = undefined;
test/behavior/pointers.zig-1
...@@ -66,7 +66,6 @@ test "initialize const optional C pointer to null" {...@@ -66,7 +66,6 @@ test "initialize const optional C pointer to null" {
6666
67test "assigning integer to C pointer" {67test "assigning integer to C pointer" {
68 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;68 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
69 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
70 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;69 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7170
72 var x: i32 = 0;71 var x: i32 = 0;
test/behavior/ptrcast.zig-3
...@@ -4,7 +4,6 @@ const expect = std.testing.expect;...@@ -4,7 +4,6 @@ const expect = std.testing.expect;
4const native_endian = builtin.target.cpu.arch.endian();4const native_endian = builtin.target.cpu.arch.endian();
55
6test "reinterpret bytes as integer with nonzero offset" {6test "reinterpret bytes as integer with nonzero offset" {
7 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
8 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO7 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
98
10 try testReinterpretBytesAsInteger();9 try testReinterpretBytesAsInteger();
...@@ -39,7 +38,6 @@ fn testReinterpretWithOffsetAndNoWellDefinedLayout() !void {...@@ -39,7 +38,6 @@ fn testReinterpretWithOffsetAndNoWellDefinedLayout() !void {
39}38}
4039
41test "reinterpret bytes inside auto-layout struct as integer with nonzero offset" {40test "reinterpret bytes inside auto-layout struct as integer with nonzero offset" {
42 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
43 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO41 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4442
45 try testReinterpretStructWrappedBytesAsInteger();43 try testReinterpretStructWrappedBytesAsInteger();
...@@ -179,7 +177,6 @@ test "lower reinterpreted comptime field ptr" {...@@ -179,7 +177,6 @@ test "lower reinterpreted comptime field ptr" {
179}177}
180178
181test "reinterpret struct field at comptime" {179test "reinterpret struct field at comptime" {
182 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
183 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
184181
185 const numNative = comptime Bytes.init(0x12345678);182 const numNative = comptime Bytes.init(0x12345678);
test/behavior/sizeof_and_typeof.zig-2
...@@ -18,7 +18,6 @@ test "@sizeOf on compile-time types" {...@@ -18,7 +18,6 @@ test "@sizeOf on compile-time types" {
18}18}
1919
20test "@TypeOf() with multiple arguments" {20test "@TypeOf() with multiple arguments" {
21 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
22 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;21 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;22 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
24 {23 {
...@@ -77,7 +76,6 @@ const P = packed struct {...@@ -77,7 +76,6 @@ const P = packed struct {
77};76};
7877
79test "@offsetOf" {78test "@offsetOf" {
80 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
81 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;79 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8280
83 // Packed structs have fixed memory layout81 // Packed structs have fixed memory layout
test/behavior/struct.zig-7
...@@ -10,7 +10,6 @@ top_level_field: i32,...@@ -10,7 +10,6 @@ top_level_field: i32,
1010
11test "top level fields" {11test "top level fields" {
12 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;12 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1413
15 var instance = @This(){14 var instance = @This(){
16 .top_level_field = 1234,15 .top_level_field = 1234,
...@@ -239,7 +238,6 @@ test "usingnamespace within struct scope" {...@@ -239,7 +238,6 @@ test "usingnamespace within struct scope" {
239238
240test "struct field init with catch" {239test "struct field init with catch" {
241 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;240 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
242 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
243241
244 const S = struct {242 const S = struct {
245 fn doTheTest() !void {243 fn doTheTest() !void {
...@@ -280,7 +278,6 @@ const Val = struct {...@@ -280,7 +278,6 @@ const Val = struct {
280test "struct point to self" {278test "struct point to self" {
281 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;279 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
282 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO280 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
283 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
284281
285 var root: Node = undefined;282 var root: Node = undefined;
286 root.val.x = 1;283 root.val.x = 1;
...@@ -296,7 +293,6 @@ test "struct point to self" {...@@ -296,7 +293,6 @@ test "struct point to self" {
296293
297test "void struct fields" {294test "void struct fields" {
298 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;295 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
299 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
300296
301 const foo = VoidStructFieldsFoo{297 const foo = VoidStructFieldsFoo{
302 .a = void{},298 .a = void{},
...@@ -760,7 +756,6 @@ test "packed struct with u0 field access" {...@@ -760,7 +756,6 @@ test "packed struct with u0 field access" {
760}756}
761757
762test "access to global struct fields" {758test "access to global struct fields" {
763 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
764 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO759 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
765 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO760 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
766761
...@@ -1259,7 +1254,6 @@ test "typed init through error unions and optionals" {...@@ -1259,7 +1254,6 @@ test "typed init through error unions and optionals" {
12591254
1260test "initialize struct with empty literal" {1255test "initialize struct with empty literal" {
1261 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1256 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1262 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12631257
1264 const S = struct { x: i32 = 1234 };1258 const S = struct { x: i32 = 1234 };
1265 var s: S = .{};1259 var s: S = .{};
...@@ -1361,7 +1355,6 @@ test "store to comptime field" {...@@ -1361,7 +1355,6 @@ test "store to comptime field" {
13611355
1362test "struct field init value is size of the struct" {1356test "struct field init value is size of the struct" {
1363 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1357 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1364 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13651358
1366 const namespace = struct {1359 const namespace = struct {
1367 const S = extern struct {1360 const S = extern struct {
test/behavior/switch.zig-1
...@@ -348,7 +348,6 @@ test "switch on const enum with var" {...@@ -348,7 +348,6 @@ test "switch on const enum with var" {
348}348}
349349
350test "anon enum literal used in switch on union enum" {350test "anon enum literal used in switch on union enum" {
351 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
352 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO351 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
353352
354 const Foo = union(enum) {353 const Foo = union(enum) {
test/behavior/usingnamespace.zig-1
...@@ -58,7 +58,6 @@ test "two files usingnamespace import each other" {...@@ -58,7 +58,6 @@ test "two files usingnamespace import each other" {
58}58}
5959
60test {60test {
61 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
62 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO61 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6362
64 const AA = struct {63 const AA = struct {