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 {
27392739 const mcv = try self.resolveInst(operand);
27402740 const struct_ty = self.air.typeOf(operand);
27412741 const struct_field_offset = @intCast(u32, struct_ty.structFieldOffset(index, self.target.*));
2742 const struct_field_ty = struct_ty.structFieldType(index);
27422743
27432744 switch (mcv) {
27442745 .dead, .unreach => unreachable,
......@@ -2776,11 +2777,45 @@ fn airStructFieldVal(self: *Self, inst: Air.Inst.Index) !void {
27762777 } else {
27772778 // Copy to new register
27782779 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
27812782 break :result MCValue{ .register = dest_reg };
27822783 }
27832784 },
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 },
27842819 else => return self.fail("TODO implement codegen struct_field_val for {}", .{mcv}),
27852820 }
27862821 };
test/behavior/array.zig-2
......@@ -175,7 +175,6 @@ test "nested arrays of integers" {
175175
176176test "implicit comptime in array type size" {
177177 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
178 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
179178
180179 var arr: [plusOne(10)]bool = undefined;
181180 try expect(arr.len == 11);
......@@ -484,7 +483,6 @@ test "sentinel element count towards the ABI size calculation" {
484483test "zero-sized array with recursive type definition" {
485484 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
486485 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
487 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
488486
489487 const U = struct {
490488 fn foo(comptime T: type, comptime n: usize) type {
test/behavior/basic.zig-2
......@@ -465,7 +465,6 @@ fn nine() u8 {
465465
466466test "struct inside function" {
467467 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
468 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
469468
470469 try testStructInFn();
471470 comptime try testStructInFn();
......@@ -514,7 +513,6 @@ var global_foo: *i32 = undefined;
514513
515514test "peer result location with typed parent, runtime condition, comptime prongs" {
516515 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
517 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
518516
519517 const S = struct {
520518 fn doTheTest(arg: i32) i32 {
test/behavior/bitcast.zig-1
......@@ -138,7 +138,6 @@ test "@bitCast extern structs at runtime and comptime" {
138138 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
139139 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
140140 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
141 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
142141
143142 const Full = extern struct {
144143 number: u16,
test/behavior/enum.zig-1
......@@ -1127,7 +1127,6 @@ test "tag name functions are unique" {
11271127
11281128test "size of enum with only one tag which has explicit integer tag type" {
11291129 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
1130 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
11311130 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
11321131
11331132 const E = enum(u8) { nope = 10 };
test/behavior/eval.zig-1
......@@ -954,7 +954,6 @@ test "const local with comptime init through array init" {
954954
955955test "closure capture type of runtime-known parameter" {
956956 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
957 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
958957
959958 const S = struct {
960959 fn b(c: anytype) !void {
test/behavior/for.zig-1
......@@ -213,7 +213,6 @@ test "for on slice with allowzero ptr" {
213213
214214test "else continue outer for" {
215215 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
216 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
217216
218217 var i: usize = 6;
219218 var buf: [5]u8 = undefined;
test/behavior/pointers.zig-1
......@@ -66,7 +66,6 @@ test "initialize const optional C pointer to null" {
6666
6767test "assigning integer to C pointer" {
6868 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
69 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7069 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
7170
7271 var x: i32 = 0;
test/behavior/ptrcast.zig-3
......@@ -4,7 +4,6 @@ const expect = std.testing.expect;
44const native_endian = builtin.target.cpu.arch.endian();
55
66test "reinterpret bytes as integer with nonzero offset" {
7 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
87 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
98
109 try testReinterpretBytesAsInteger();
......@@ -39,7 +38,6 @@ fn testReinterpretWithOffsetAndNoWellDefinedLayout() !void {
3938}
4039
4140test "reinterpret bytes inside auto-layout struct as integer with nonzero offset" {
42 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
4341 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
4442
4543 try testReinterpretStructWrappedBytesAsInteger();
......@@ -179,7 +177,6 @@ test "lower reinterpreted comptime field ptr" {
179177}
180178
181179test "reinterpret struct field at comptime" {
182 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
183180 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
184181
185182 const numNative = comptime Bytes.init(0x12345678);
test/behavior/sizeof_and_typeof.zig-2
......@@ -18,7 +18,6 @@ test "@sizeOf on compile-time types" {
1818}
1919
2020test "@TypeOf() with multiple arguments" {
21 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2221 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
2322 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
2423 {
......@@ -77,7 +76,6 @@ const P = packed struct {
7776};
7877
7978test "@offsetOf" {
80 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
8179 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8280
8381 // Packed structs have fixed memory layout
test/behavior/struct.zig-7
......@@ -10,7 +10,6 @@ top_level_field: i32,
1010
1111test "top level fields" {
1212 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
1413
1514 var instance = @This(){
1615 .top_level_field = 1234,
......@@ -239,7 +238,6 @@ test "usingnamespace within struct scope" {
239238
240239test "struct field init with catch" {
241240 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
242 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
243241
244242 const S = struct {
245243 fn doTheTest() !void {
......@@ -280,7 +278,6 @@ const Val = struct {
280278test "struct point to self" {
281279 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
282280 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
283 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
284281
285282 var root: Node = undefined;
286283 root.val.x = 1;
......@@ -296,7 +293,6 @@ test "struct point to self" {
296293
297294test "void struct fields" {
298295 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
299 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
300296
301297 const foo = VoidStructFieldsFoo{
302298 .a = void{},
......@@ -760,7 +756,6 @@ test "packed struct with u0 field access" {
760756}
761757
762758test "access to global struct fields" {
763 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
764759 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
765760 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
766761
......@@ -1259,7 +1254,6 @@ test "typed init through error unions and optionals" {
12591254
12601255test "initialize struct with empty literal" {
12611256 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1262 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
12631257
12641258 const S = struct { x: i32 = 1234 };
12651259 var s: S = .{};
......@@ -1361,7 +1355,6 @@ test "store to comptime field" {
13611355
13621356test "struct field init value is size of the struct" {
13631357 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1364 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
13651358
13661359 const namespace = struct {
13671360 const S = extern struct {
test/behavior/switch.zig-1
......@@ -348,7 +348,6 @@ test "switch on const enum with var" {
348348}
349349
350350test "anon enum literal used in switch on union enum" {
351 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
352351 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
353352
354353 const Foo = union(enum) {
test/behavior/usingnamespace.zig-1
......@@ -58,7 +58,6 @@ test "two files usingnamespace import each other" {
5858}
5959
6060test {
61 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6261 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6362
6463 const AA = struct {