authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-12 21:02:53+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-13 11:32:08+01:00
logb74cd902c6abf46644329409dae493335a1708bc
tree660c3d3afaf2d3cd1c2f996d2ba1fe92ddd2baea
parent1f28c72c395e9418cbb074d1490426b3dc359a5f
signaturelock-open Commit is signed but in an unrecognized format.

stage2 AArch64: enable mul for ints with <= 64 bits


10 files changed, 4 insertions(+), 24 deletions(-)

src/arch/aarch64/CodeGen.zig+4-8
...@@ -538,7 +538,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {...@@ -538,7 +538,7 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
538 .sub, .ptr_sub => try self.airBinOp(inst),538 .sub, .ptr_sub => try self.airBinOp(inst),
539 .subwrap => try self.airSubWrap(inst),539 .subwrap => try self.airSubWrap(inst),
540 .sub_sat => try self.airSubSat(inst),540 .sub_sat => try self.airSubSat(inst),
541 .mul => try self.airMul(inst),541 .mul => try self.airBinOp(inst),
542 .mulwrap => try self.airMulWrap(inst),542 .mulwrap => try self.airMulWrap(inst),
543 .mul_sat => try self.airMulSat(inst),543 .mul_sat => try self.airMulSat(inst),
544 .rem => try self.airRem(inst),544 .rem => try self.airRem(inst),
...@@ -820,7 +820,9 @@ fn allocMemPtr(self: *Self, inst: Air.Inst.Index) !u32 {...@@ -820,7 +820,9 @@ fn allocMemPtr(self: *Self, inst: Air.Inst.Index) !u32 {
820 const elem_ty = self.air.typeOfIndex(inst).elemType();820 const elem_ty = self.air.typeOfIndex(inst).elemType();
821821
822 if (!elem_ty.hasRuntimeBits()) {822 if (!elem_ty.hasRuntimeBits()) {
823 return self.allocMem(inst, @sizeOf(usize), @alignOf(usize));823 // As this stack item will never be dereferenced at runtime,
824 // return the current stack offset
825 return self.next_stack_offset;
824 }826 }
825827
826 const abi_size = math.cast(u32, elem_ty.abiSize(self.target.*)) catch {828 const abi_size = math.cast(u32, elem_ty.abiSize(self.target.*)) catch {
...@@ -1540,12 +1542,6 @@ fn airSubSat(self: *Self, inst: Air.Inst.Index) !void {...@@ -1540,12 +1542,6 @@ fn airSubSat(self: *Self, inst: Air.Inst.Index) !void {
1540 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });1542 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
1541}1543}
15421544
1543fn airMul(self: *Self, inst: Air.Inst.Index) !void {
1544 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1545 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement mul for {}", .{self.target.cpu.arch});
1546 return self.finishAir(inst, result, .{ bin_op.lhs, bin_op.rhs, .none });
1547}
1548
1549fn airMulWrap(self: *Self, inst: Air.Inst.Index) !void {1545fn airMulWrap(self: *Self, inst: Air.Inst.Index) !void {
1550 const bin_op = self.air.instructions.items(.data)[inst].bin_op;1546 const bin_op = self.air.instructions.items(.data)[inst].bin_op;
1551 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement mulwrap for {}", .{self.target.cpu.arch});1547 const result: MCValue = if (self.liveness.isUnused(inst)) .dead else return self.fail("TODO implement mulwrap for {}", .{self.target.cpu.arch});
test/behavior/align.zig-1
...@@ -351,7 +351,6 @@ test "read 128-bit field from default aligned struct in global memory" {...@@ -351,7 +351,6 @@ test "read 128-bit field from default aligned struct in global memory" {
351}351}
352352
353test "struct field explicit alignment" {353test "struct field explicit alignment" {
354 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
355 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;354 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
356 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;355 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
357 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;356 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
test/behavior/array.zig-1
...@@ -7,7 +7,6 @@ const expectEqual = testing.expectEqual;...@@ -7,7 +7,6 @@ const expectEqual = testing.expectEqual;
77
8test "array to slice" {8test "array to slice" {
9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;9 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
10 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
1110
12 const a: u32 align(4) = 3;11 const a: u32 align(4) = 3;
13 const b: u32 align(8) = 4;12 const b: u32 align(8) = 4;
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_aarch64) return error.SkipZigTest;
273 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;272 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
274273
275 const S = struct {274 const S = struct {
test/behavior/bugs/5474.zig-2
...@@ -50,7 +50,6 @@ fn constant() !void {...@@ -50,7 +50,6 @@ fn constant() !void {
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; // TODO52 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
53 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
5453
55 try mutable();54 try mutable();
56 comptime try mutable();55 comptime try mutable();
...@@ -58,7 +57,6 @@ test "pointer-to-array constness for zero-size elements, var" {...@@ -58,7 +57,6 @@ test "pointer-to-array constness for zero-size elements, var" {
5857
59test "pointer-to-array constness for zero-size elements, const" {58test "pointer-to-array constness for zero-size elements, const" {
60 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO59 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
61 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6260
63 try constant();61 try constant();
64 comptime try constant();62 comptime try constant();
test/behavior/math.zig-1
...@@ -573,7 +573,6 @@ test "bit shift a u1" {...@@ -573,7 +573,6 @@ test "bit shift a u1" {
573573
574test "truncating shift right" {574test "truncating shift right" {
575 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO575 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
576// if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
577576
578 try testShrTrunc(maxInt(u16));577 try testShrTrunc(maxInt(u16));
579 comptime try testShrTrunc(maxInt(u16));578 comptime try testShrTrunc(maxInt(u16));
test/behavior/sizeof_and_typeof.zig-2
...@@ -187,7 +187,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {...@@ -187,7 +187,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" {
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;189 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
190 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
191 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;190 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
192 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;191 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
193 const S = struct {192 const S = struct {
...@@ -204,7 +203,6 @@ test "@TypeOf() has no runtime side effects" {...@@ -204,7 +203,6 @@ test "@TypeOf() has no runtime side effects" {
204203
205test "branching logic inside @TypeOf" {204test "branching logic inside @TypeOf" {
206 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;205 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
207 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
208 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;206 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest;
209 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;207 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
210 const S = struct {208 const S = struct {
test/behavior/slice.zig-1
...@@ -204,7 +204,6 @@ test "slicing zero length array" {...@@ -204,7 +204,6 @@ test "slicing zero length array" {
204const x = @intToPtr([*]i32, 0x1000)[0..0x500];204const x = @intToPtr([*]i32, 0x1000)[0..0x500];
205const y = x[0x100..];205const y = x[0x100..];
206test "compile time slice of pointer to hard coded address" {206test "compile time slice of pointer to hard coded address" {
207 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
208 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO207 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
209 if (builtin.zig_backend == .stage1) return error.SkipZigTest;208 if (builtin.zig_backend == .stage1) return error.SkipZigTest;
210 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;209 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
test/behavior/struct.zig-3
...@@ -927,7 +927,6 @@ test "anonymous struct literal syntax" {...@@ -927,7 +927,6 @@ test "anonymous struct literal syntax" {
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; // TODO929 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
930 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
931930
932 const S = struct {931 const S = struct {
933 fn doTheTest() !void {932 fn doTheTest() !void {
...@@ -953,7 +952,6 @@ test "fully anonymous struct" {...@@ -953,7 +952,6 @@ test "fully anonymous struct" {
953test "fully anonymous list literal" {952test "fully anonymous list literal" {
954 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO953 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
955 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO954 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
956 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
957955
958 const S = struct {956 const S = struct {
959 fn doTheTest() !void {957 fn doTheTest() !void {
...@@ -983,7 +981,6 @@ test "tuple assigned to variable" {...@@ -983,7 +981,6 @@ test "tuple assigned to variable" {
983981
984test "comptime struct field" {982test "comptime struct field" {
985 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO983 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
986 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
987984
988 const T = struct {985 const T = struct {
989 a: i32,986 a: i32,
test/behavior/var_args.zig-4
...@@ -15,7 +15,6 @@ fn add(args: anytype) i32 {...@@ -15,7 +15,6 @@ fn add(args: anytype) i32 {
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; // TODO17 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
18 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1918
20 try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);19 try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10);
21 try expect(add(.{@as(i32, 1234)}) == 1234);20 try expect(add(.{@as(i32, 1234)}) == 1234);
...@@ -27,7 +26,6 @@ fn readFirstVarArg(args: anytype) void {...@@ -27,7 +26,6 @@ fn readFirstVarArg(args: anytype) void {
27}26}
2827
29test "send void arg to var args" {28test "send void arg to var args" {
30 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
31 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO29 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
32 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO30 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
3331
...@@ -90,7 +88,6 @@ fn foo2(args: anytype) bool {...@@ -90,7 +88,6 @@ fn foo2(args: anytype) bool {
90}88}
9189
92test "array of var args functions" {90test "array of var args functions" {
93 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
94 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO91 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
95 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO92 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
9693
...@@ -99,7 +96,6 @@ test "array of var args functions" {...@@ -99,7 +96,6 @@ test "array of var args functions" {
99}96}
10097
101test "pass zero length array to var args param" {98test "pass zero length array to var args param" {
102 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
103 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO99 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
104 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO100 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
105101