authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-12 22:30:28+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-16 20:19:58+01:00
logca1ffb0951a0bd039ac435435a5c396f26c6d141
tree9eca24e25d8b17395a61c21dcc65ddcafbab1bd0
parent1f313b3d7c757a8cdc5a52a1986f0f694b7ffc5f
signaturelock-open Commit is signed but in an unrecognized format.

stage2 ARM: genSetStack for stack_argument_offset


16 files changed, 27 insertions(+), 50 deletions(-)

src/arch/arm/CodeGen.zig+18-26
...@@ -2876,35 +2876,19 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {...@@ -2876,35 +2876,19 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
2876 const condition = Condition.fromCompareOperatorUnsigned(cmp_op);2876 const condition = Condition.fromCompareOperatorUnsigned(cmp_op);
2877 break :blk condition.negate();2877 break :blk condition.negate();
2878 },2878 },
2879 .register => |reg| blk: {2879 else => blk: {
2880 try self.spillCompareFlagsIfOccupied();2880 const reg = switch (cond) {
28812881 .register => |r| r,
2882 // cmp reg, 12882 else => try self.copyToTmpRegister(Type.bool, cond),
2883 // bne ...2883 };
2884 _ = try self.addInst(.{
2885 .tag = .cmp,
2886 .cond = .al,
2887 .data = .{ .rr_op = .{
2888 .rd = .r0,
2889 .rn = reg,
2890 .op = Instruction.Operand.imm(1, 0),
2891 } },
2892 });
28932884
2894 break :blk .ne;
2895 },
2896 .stack_offset,
2897 .memory,
2898 .stack_argument_offset,
2899 => blk: {
2900 try self.spillCompareFlagsIfOccupied();2885 try self.spillCompareFlagsIfOccupied();
29012886
2902 const reg = try self.copyToTmpRegister(Type.initTag(.bool), cond);
2903
2904 // cmp reg, 12887 // cmp reg, 1
2905 // bne ...2888 // bne ...
2906 _ = try self.addInst(.{2889 _ = try self.addInst(.{
2907 .tag = .cmp,2890 .tag = .cmp,
2891 .cond = .al,
2908 .data = .{ .rr_op = .{2892 .data = .{ .rr_op = .{
2909 .rd = .r0,2893 .rd = .r0,
2910 .rn = reg,2894 .rn = reg,
...@@ -2914,7 +2898,6 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {...@@ -2914,7 +2898,6 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void {
29142898
2915 break :blk .ne;2899 break :blk .ne;
2916 },2900 },
2917 else => return self.fail("TODO implement condbr {} when condition is {s}", .{ self.target.cpu.arch, @tagName(cond) }),
2918 };2901 };
29192902
2920 break :reloc try self.addInst(.{2903 break :reloc try self.addInst(.{
...@@ -3603,9 +3586,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro...@@ -3603,9 +3586,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro
3603 try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off });3586 try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off });
3604 },3587 },
3605 .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }),3588 .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }),
3606 .embedded_in_code,3589 .stack_argument_offset => |unadjusted_off| {
3607 .stack_argument_offset,3590 const adj_off = unadjusted_off + abi_size;
3608 => return self.fail("TODO genSetStack with src={}", .{mcv}),3591
3592 _ = try self.addInst(.{
3593 .tag = .ldr_ptr_stack_argument,
3594 .data = .{ .r_stack_offset = .{
3595 .rt = src_reg,
3596 .stack_offset = adj_off,
3597 } },
3598 });
3599 },
3600 .embedded_in_code => return self.fail("TODO genSetStack with src={}", .{mcv}),
3609 else => unreachable,3601 else => unreachable,
3610 }3602 }
36113603
src/arch/arm/Emit.zig+7
...@@ -112,6 +112,7 @@ pub fn emitMir(...@@ -112,6 +112,7 @@ pub fn emitMir(
112 .str => try emit.mirLoadStore(inst),112 .str => try emit.mirLoadStore(inst),
113 .strb => try emit.mirLoadStore(inst),113 .strb => try emit.mirLoadStore(inst),
114114
115 .ldr_ptr_stack_argument => try emit.mirLoadStackArgument(inst),
115 .ldr_stack_argument => try emit.mirLoadStackArgument(inst),116 .ldr_stack_argument => try emit.mirLoadStackArgument(inst),
116 .ldrb_stack_argument => try emit.mirLoadStackArgument(inst),117 .ldrb_stack_argument => try emit.mirLoadStackArgument(inst),
117 .ldrh_stack_argument => try emit.mirLoadStackArgument(inst),118 .ldrh_stack_argument => try emit.mirLoadStackArgument(inst),
...@@ -597,6 +598,12 @@ fn mirLoadStackArgument(emit: *Emit, inst: Mir.Inst.Index) !void {...@@ -597,6 +598,12 @@ fn mirLoadStackArgument(emit: *Emit, inst: Mir.Inst.Index) !void {
597598
598 const raw_offset = emit.prologue_stack_space - r_stack_offset.stack_offset;599 const raw_offset = emit.prologue_stack_space - r_stack_offset.stack_offset;
599 switch (tag) {600 switch (tag) {
601 .ldr_ptr_stack_argument => {
602 const operand = Instruction.Operand.fromU32(raw_offset) orelse
603 return emit.fail("TODO mirLoadStack larger offsets", .{});
604
605 try emit.writeInstruction(Instruction.add(cond, r_stack_offset.rt, .fp, operand));
606 },
600 .ldr_stack_argument,607 .ldr_stack_argument,
601 .ldrb_stack_argument,608 .ldrb_stack_argument,
602 => {609 => {
src/arch/arm/Mir.zig+2
...@@ -54,6 +54,8 @@ pub const Inst = struct {...@@ -54,6 +54,8 @@ pub const Inst = struct {
54 eor,54 eor,
55 /// Load Register55 /// Load Register
56 ldr,56 ldr,
57 /// Pseudo-instruction: Load pointer to stack argument offset
58 ldr_ptr_stack_argument,
57 /// Load Register59 /// Load Register
58 ldr_stack_argument,60 ldr_stack_argument,
59 /// Load Register Byte61 /// Load Register Byte
test/behavior/array.zig-1
...@@ -202,7 +202,6 @@ fn doSomeMangling(array: *[4]u8) void {...@@ -202,7 +202,6 @@ fn doSomeMangling(array: *[4]u8) void {
202202
203test "implicit cast zero sized array ptr to slice" {203test "implicit cast zero sized array ptr to slice" {
204 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;204 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
205 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
206205
207 {206 {
208 var b = "".*;207 var b = "".*;
test/behavior/bitcast.zig-1
...@@ -269,7 +269,6 @@ test "bitcast passed as tuple element" {...@@ -269,7 +269,6 @@ test "bitcast passed as tuple element" {
269269
270test "triple level result location with bitcast sandwich passed as tuple element" {270test "triple level result location with bitcast sandwich passed as tuple element" {
271 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;271 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
272 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
273272
274 const S = struct {273 const S = struct {
275 fn foo(args: anytype) !void {274 fn foo(args: anytype) !void {
test/behavior/bugs/1421.zig-1
...@@ -9,7 +9,6 @@ const S = struct {...@@ -9,7 +9,6 @@ const S = struct {
9};9};
1010
11test "functions with return type required to be comptime are generic" {11test "functions with return type required to be comptime are generic" {
12 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
13 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;12 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
14 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;13 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
15 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;14 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
test/behavior/bugs/2692.zig-1
...@@ -6,7 +6,6 @@ fn foo(a: []u8) void {...@@ -6,7 +6,6 @@ fn foo(a: []u8) void {
66
7test "address of 0 length array" {7test "address of 0 length array" {
8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;9 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1110
12 var pt: [0]u8 = undefined;11 var pt: [0]u8 = undefined;
test/behavior/bugs/5474.zig-4
...@@ -49,15 +49,11 @@ fn constant() !void {...@@ -49,15 +49,11 @@ fn constant() !void {
49}49}
5050
51test "pointer-to-array constness for zero-size elements, var" {51test "pointer-to-array constness for zero-size elements, var" {
52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
53
54 try mutable();52 try mutable();
55 comptime try mutable();53 comptime try mutable();
56}54}
5755
58test "pointer-to-array constness for zero-size elements, const" {56test "pointer-to-array constness for zero-size elements, const" {
59 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
60
61 try constant();57 try constant();
62 comptime try constant();58 comptime try constant();
63}59}
test/behavior/bugs/828.zig-1
...@@ -30,7 +30,6 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void {...@@ -30,7 +30,6 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void {
30}30}
3131
32test "comptime struct return should not return the same instance" {32test "comptime struct return should not return the same instance" {
33 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
34 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;33 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
3534
36 //the first parameter must be passed by reference to trigger the bug35 //the first parameter must be passed by reference to trigger the bug
test/behavior/cast.zig-3
...@@ -1129,7 +1129,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A {...@@ -1129,7 +1129,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A {
1129test "peer type resolution: [0]u8 and []const u8" {1129test "peer type resolution: [0]u8 and []const u8" {
1130 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;1130 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1131 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1131 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1132 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
11331132
1134 try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0);1133 try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0);
1135 try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1);1134 try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1);
...@@ -1278,8 +1277,6 @@ test "assignment to optional pointer result loc" {...@@ -1278,8 +1277,6 @@ test "assignment to optional pointer result loc" {
1278}1277}
12791278
1280test "cast between *[N]void and []void" {1279test "cast between *[N]void and []void" {
1281 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1282
1283 var a: [4]void = undefined;1280 var a: [4]void = undefined;
1284 var b: []void = &a;1281 var b: []void = &a;
1285 try expect(b.len == 4);1282 try expect(b.len == 4);
test/behavior/optional.zig-1
...@@ -26,7 +26,6 @@ pub const EmptyStruct = struct {};...@@ -26,7 +26,6 @@ pub const EmptyStruct = struct {};
2626
27test "optional pointer to size zero struct" {27test "optional pointer to size zero struct" {
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_arm) return error.SkipZigTest; // TODO
3029
31 var e = EmptyStruct{};30 var e = EmptyStruct{};
32 var o: ?*EmptyStruct = &e;31 var o: ?*EmptyStruct = &e;
test/behavior/sizeof_and_typeof.zig-1
...@@ -186,7 +186,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {...@@ -186,7 +186,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {
186}186}
187187
188test "@TypeOf() has no runtime side effects" {188test "@TypeOf() has no runtime side effects" {
189 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
190 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;189 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
191 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;190 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
192 const S = struct {191 const S = struct {
test/behavior/slice.zig-2
...@@ -70,7 +70,6 @@ test "comptime slice of undefined pointer of length 0" {...@@ -70,7 +70,6 @@ test "comptime slice of undefined pointer of length 0" {
70test "implicitly cast array of size 0 to slice" {70test "implicitly cast array of size 0 to slice" {
71 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;71 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
72 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO72 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
73 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7473
75 var msg = [_]u8{};74 var msg = [_]u8{};
76 try assertLenIsZero(&msg);75 try assertLenIsZero(&msg);
...@@ -206,7 +205,6 @@ const y = x[0x100..];...@@ -206,7 +205,6 @@ const y = x[0x100..];
206test "compile time slice of pointer to hard coded address" {205test "compile time slice of pointer to hard coded address" {
207 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO206 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
208 if (builtin.zig_backend == .stage1) return error.SkipZigTest;207 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
209 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
210 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;208 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
211 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;209 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest;
212210
test/behavior/struct.zig-2
...@@ -926,7 +926,6 @@ test "anonymous struct literal syntax" {...@@ -926,7 +926,6 @@ test "anonymous struct literal syntax" {
926926
927test "fully anonymous struct" {927test "fully anonymous struct" {
928 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO928 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
929 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
930929
931 const S = struct {930 const S = struct {
932 fn doTheTest() !void {931 fn doTheTest() !void {
...@@ -951,7 +950,6 @@ test "fully anonymous struct" {...@@ -951,7 +950,6 @@ test "fully anonymous struct" {
951950
952test "fully anonymous list literal" {951test "fully anonymous list literal" {
953 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO952 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
954 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
955953
956 const S = struct {954 const S = struct {
957 fn doTheTest() !void {955 fn doTheTest() !void {
test/behavior/struct_contains_null_ptr_itself.zig-1
...@@ -3,7 +3,6 @@ const expect = std.testing.expect;...@@ -3,7 +3,6 @@ const expect = std.testing.expect;
3const builtin = @import("builtin");3const builtin = @import("builtin");
44
5test "struct contains null pointer which contains original struct" {5test "struct contains null pointer which contains original struct" {
6 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
7 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
8 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;7 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;8 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
test/behavior/var_args.zig-5
...@@ -14,7 +14,6 @@ fn add(args: anytype) i32 {...@@ -14,7 +14,6 @@ fn add(args: anytype) i32 {
1414
15test "add arbitrary args" {15test "add arbitrary args" {
16 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO16 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1817
19 try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);18 try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
20 try expect(add(.{@as(i32, 1234)}) == 1234);19 try expect(add(.{@as(i32, 1234)}) == 1234);
...@@ -27,14 +26,12 @@ fn readFirstVarArg(args: anytype) void {...@@ -27,14 +26,12 @@ fn readFirstVarArg(args: anytype) void {
2726
28test "send void arg to var args" {27test "send void arg to var args" {
29 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO28 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
30 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3129
32 readFirstVarArg(.{{}});30 readFirstVarArg(.{{}});
33}31}
3432
35test "pass args directly" {33test "pass args directly" {
36 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO34 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
37 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
38 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO35 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
3936
40 try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);37 try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
...@@ -89,7 +86,6 @@ fn foo2(args: anytype) bool {...@@ -89,7 +86,6 @@ fn foo2(args: anytype) bool {
8986
90test "array of var args functions" {87test "array of var args functions" {
91 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO88 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
92 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9389
94 try expect(foos[0](.{}));90 try expect(foos[0](.{}));
95 try expect(!foos[1](.{}));91 try expect(!foos[1](.{}));
...@@ -97,7 +93,6 @@ test "array of var args functions" {...@@ -97,7 +93,6 @@ test "array of var args functions" {
9793
98test "pass zero length array to var args param" {94test "pass zero length array to var args param" {
99 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO95 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
100 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10196
102 doNothingWithFirstArg(.{""});97 doNothingWithFirstArg(.{""});
103}98}