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 {
530530 switch (air_tags[inst]) {
531531 // zig fmt: off
532532 .add, .ptr_add => try self.airBinOp(inst),
533 .addwrap => try self.airAddWrap(inst),
533 .addwrap => try self.airBinOp(inst),
534534 .add_sat => try self.airAddSat(inst),
535535 .sub, .ptr_sub => try self.airBinOp(inst),
536 .subwrap => try self.airSubWrap(inst),
536 .subwrap => try self.airBinOp(inst),
537537 .sub_sat => try self.airSubSat(inst),
538538 .mul => try self.airBinOp(inst),
539 .mulwrap => try self.airMulWrap(inst),
539 .mulwrap => try self.airBinOp(inst),
540540 .mul_sat => try self.airMulSat(inst),
541541 .rem => try self.airRem(inst),
542542 .mod => try self.airMod(inst),
......@@ -2237,6 +2237,39 @@ fn binOp(
22372237 else => unreachable,
22382238 }
22392239 },
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 },
22402273 .bit_and,
22412274 .bit_or,
22422275 .xor,
test/behavior/bugs/11181.zig-2
......@@ -2,7 +2,6 @@ const builtin = @import("builtin");
22
33test "const inferred array of slices" {
44 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
5 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
65 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
76
87 const T = struct { v: bool };
......@@ -17,7 +16,6 @@ test "const inferred array of slices" {
1716
1817test "var inferred array of slices" {
1918 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
20 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
2119 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
2220
2321 const T = struct { v: bool };
test/behavior/cast.zig-1
......@@ -1080,7 +1080,6 @@ test "compile time int to ptr of function" {
10801080
10811081 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
10821082 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
1083 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
10841083 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
10851084 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" {
389389test "function with inferred error set but returning no error" {
390390 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
391391 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
392 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
393392
394393 const S = struct {
395394 fn foo() !void {}
test/behavior/math.zig-4
......@@ -484,7 +484,6 @@ fn mod(comptime T: type, a: T, b: T) T {
484484test "unsigned wrapping" {
485485 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
486486 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
487 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
488487
489488 try testUnsignedWrappingEval(maxInt(u32));
490489 comptime try testUnsignedWrappingEval(maxInt(u32));
......@@ -499,7 +498,6 @@ fn testUnsignedWrappingEval(x: u32) !void {
499498test "signed wrapping" {
500499 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
501500 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
502 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
503501
504502 try testSignedWrappingEval(maxInt(i32));
505503 comptime try testSignedWrappingEval(maxInt(i32));
......@@ -514,7 +512,6 @@ fn testSignedWrappingEval(x: i32) !void {
514512test "signed negation wrapping" {
515513 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
516514 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
517 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
518515
519516 try testSignedNegationWrappingEval(minInt(i16));
520517 comptime try testSignedNegationWrappingEval(minInt(i16));
......@@ -528,7 +525,6 @@ fn testSignedNegationWrappingEval(x: i16) !void {
528525test "unsigned negation wrapping" {
529526 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
530527 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
531 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
532528
533529 try testUnsignedNegationWrappingEval(1);
534530 comptime try testUnsignedNegationWrappingEval(1);
test/behavior/ptrcast.zig-1
......@@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void {
5959}
6060
6161test "reinterpret bytes of an array into an extern struct" {
62 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
6362 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
6463 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" {
468468 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
469469 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
470470 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
471 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
472471 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
473472
474473 const Tag = @Type(.{
......@@ -500,7 +499,6 @@ test "Type.Union from regular enum" {
500499 if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
501500 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
502501 if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
503 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
504502 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
505503
506504 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;
385385extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize;
386386
387387test "type info: generic function types" {
388 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
389388 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
390389 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" {
1919}
2020
2121test "iterate over a void slice" {
22 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest;
2322 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest;
2423
2524 var j: usize = 0;