authorgravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-13 21:41:08+01:00
committergravatar for joachim.schmidt557@outlook.comJoachim Schmidt <joachim.schmidt557@outlook.com> 2022-03-16 20:20:07+01:00
logdcc1de12b097db4971b85cfc0b4e18fec2c8b2c4
tree0d211f69755e1a1f1576a8e6854bda559ea69334
parent2412ac2c5ffe9ef02fdcfa2806b5f5862d4e42f3
signaturelock-open Commit is signed but in an unrecognized format.

stage2 ARM: implement addwrap, subwrap, mulwrap


9 files changed, 36 insertions(+), 16 deletions(-)

src/arch/arm/CodeGen.zig+36-3
...@@ -530,13 +530,13 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {...@@ -530,13 +530,13 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void {
530 switch (air_tags[inst]) {530 switch (air_tags[inst]) {
531 // zig fmt: off531 // zig fmt: off
532 .add, .ptr_add => try self.airBinOp(inst),532 .add, .ptr_add => try self.airBinOp(inst),
533 .addwrap => try self.airAddWrap(inst),533 .addwrap => try self.airBinOp(inst),
534 .add_sat => try self.airAddSat(inst),534 .add_sat => try self.airAddSat(inst),
535 .sub, .ptr_sub => try self.airBinOp(inst),535 .sub, .ptr_sub => try self.airBinOp(inst),
536 .subwrap => try self.airSubWrap(inst),536 .subwrap => try self.airBinOp(inst),
537 .sub_sat => try self.airSubSat(inst),537 .sub_sat => try self.airSubSat(inst),
538 .mul => try self.airBinOp(inst),538 .mul => try self.airBinOp(inst),
539 .mulwrap => try self.airMulWrap(inst),539 .mulwrap => try self.airBinOp(inst),
540 .mul_sat => try self.airMulSat(inst),540 .mul_sat => try self.airMulSat(inst),
541 .rem => try self.airRem(inst),541 .rem => try self.airRem(inst),
542 .mod => try self.airMod(inst),542 .mod => try self.airMod(inst),
...@@ -2237,6 +2237,39 @@ fn binOp(...@@ -2237,6 +2237,39 @@ fn binOp(
2237 else => unreachable,2237 else => unreachable,
2238 }2238 }
2239 },2239 },
2240 .addwrap,
2241 .subwrap,
2242 .mulwrap,
2243 => {
2244 const base_tag: Air.Inst.Tag = switch (tag) {
2245 .addwrap => .add,
2246 .subwrap => .sub,
2247 .mulwrap => .mul,
2248 else => unreachable,
2249 };
2250
2251 // Generate an add/sub/mul
2252 const result = try self.binOp(base_tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty);
2253
2254 // Truncate if necessary
2255 switch (lhs_ty.zigTypeTag()) {
2256 .Vector => return self.fail("TODO ARM binary operations on vectors", .{}),
2257 .Int => {
2258 const int_info = lhs_ty.intInfo(self.target.*);
2259 if (int_info.bits <= 32) {
2260 const result_reg = result.register;
2261
2262 if (int_info.bits < 32) {
2263 try self.truncRegister(result_reg, result_reg, int_info.signedness, int_info.bits);
2264 return result;
2265 } else return result;
2266 } else {
2267 return self.fail("TODO ARM binary operations on integers > u32/i32", .{});
2268 }
2269 },
2270 else => unreachable,
2271 }
2272 },
2240 .bit_and,2273 .bit_and,
2241 .bit_or,2274 .bit_or,
2242 .xor,2275 .xor,
test/behavior/bugs/11181.zig-2
...@@ -2,7 +2,6 @@ const builtin = @import("builtin");...@@ -2,7 +2,6 @@ const builtin = @import("builtin");
22
3test "const inferred array of slices" {3test "const inferred array of slices" {
4 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO4 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
5 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO5 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
76
8 const T = struct { v: bool };7 const T = struct { v: bool };
...@@ -17,7 +16,6 @@ test "const inferred array of slices" {...@@ -17,7 +16,6 @@ test "const inferred array of slices" {
1716
18test "var inferred array of slices" {17test "var inferred array of slices" {
19 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO18 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
20 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
21 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO19 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2220
23 const T = struct { v: bool };21 const T = struct { v: bool };
test/behavior/cast.zig-1
...@@ -1080,7 +1080,6 @@ test "compile time int to ptr of function" {...@@ -1080,7 +1080,6 @@ test "compile time int to ptr of function" {
10801080
1081 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO1081 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
1082 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO1082 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1083 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
1084 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO1083 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
1085 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO1084 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
10861085
test/behavior/fn.zig-1
...@@ -389,7 +389,6 @@ test "ability to give comptime types and non comptime types to same parameter" {...@@ -389,7 +389,6 @@ test "ability to give comptime types and non comptime types to same parameter" {
389test "function with inferred error set but returning no error" {389test "function with inferred error set but returning no error" {
390 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO390 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
391 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO391 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
392 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
393392
394 const S = struct {393 const S = struct {
395 fn foo() !void {}394 fn foo() !void {}
test/behavior/math.zig-4
...@@ -484,7 +484,6 @@ fn mod(comptime T: type, a: T, b: T) T {...@@ -484,7 +484,6 @@ fn mod(comptime T: type, a: T, b: T) T {
484test "unsigned wrapping" {484test "unsigned wrapping" {
485 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO485 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
486 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO486 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
487 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
488487
489 try testUnsignedWrappingEval(maxInt(u32));488 try testUnsignedWrappingEval(maxInt(u32));
490 comptime try testUnsignedWrappingEval(maxInt(u32));489 comptime try testUnsignedWrappingEval(maxInt(u32));
...@@ -499,7 +498,6 @@ fn testUnsignedWrappingEval(x: u32) !void {...@@ -499,7 +498,6 @@ fn testUnsignedWrappingEval(x: u32) !void {
499test "signed wrapping" {498test "signed wrapping" {
500 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO499 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO500 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
503501
504 try testSignedWrappingEval(maxInt(i32));502 try testSignedWrappingEval(maxInt(i32));
505 comptime try testSignedWrappingEval(maxInt(i32));503 comptime try testSignedWrappingEval(maxInt(i32));
...@@ -514,7 +512,6 @@ fn testSignedWrappingEval(x: i32) !void {...@@ -514,7 +512,6 @@ fn testSignedWrappingEval(x: i32) !void {
514test "signed negation wrapping" {512test "signed negation wrapping" {
515 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO513 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
516 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO514 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
517 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
518515
519 try testSignedNegationWrappingEval(minInt(i16));516 try testSignedNegationWrappingEval(minInt(i16));
520 comptime try testSignedNegationWrappingEval(minInt(i16));517 comptime try testSignedNegationWrappingEval(minInt(i16));
...@@ -528,7 +525,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {...@@ -528,7 +525,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {
528test "unsigned negation wrapping" {525test "unsigned negation wrapping" {
529 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO526 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
530 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
531 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
532528
533 try testUnsignedNegationWrappingEval(1);529 try testUnsignedNegationWrappingEval(1);
534 comptime try testUnsignedNegationWrappingEval(1);530 comptime try testUnsignedNegationWrappingEval(1);
test/behavior/ptrcast.zig-1
...@@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void {...@@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void {
59}59}
6060
61test "reinterpret bytes of an array into an extern struct" {61test "reinterpret bytes of an array into an extern struct" {
62 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
63 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO62 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
64 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO63 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
6564
test/behavior/type.zig-2
...@@ -468,7 +468,6 @@ test "Type.Union from Type.Enum" {...@@ -468,7 +468,6 @@ test "Type.Union from Type.Enum" {
468 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO468 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
469 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO469 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
470 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO470 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
471 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
472 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO471 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
473472
474 const Tag = @Type(.{473 const Tag = @Type(.{
...@@ -500,7 +499,6 @@ test "Type.Union from regular enum" {...@@ -500,7 +499,6 @@ test "Type.Union from regular enum" {
500 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO499 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
501 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO500 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO501 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
503 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
504 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO502 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
505503
506 const E = enum { working_as_expected };504 const E = enum { working_as_expected };
test/behavior/type_info.zig-1
...@@ -385,7 +385,6 @@ extern fn foo(a: usize, b: bool, ...) callconv(.C) usize;...@@ -385,7 +385,6 @@ extern fn foo(a: usize, b: bool, ...) callconv(.C) usize;
385extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize;385extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize;
386386
387test "type info: generic function types" {387test "type info: generic function types" {
388 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
389 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;388 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
390 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;389 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest;
391390
test/behavior/void.zig-1
...@@ -19,7 +19,6 @@ test "compare void with void compile time known" {...@@ -19,7 +19,6 @@ test "compare void with void compile time known" {
19}19}
2020
21test "iterate over a void slice" {21test "iterate over a void slice" {
22 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
23 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;22 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2423
25 var j: usize = 0;24 var j: usize = 0;