| author | |
| committer | |
| log | dcc1de12b097db4971b85cfc0b4e18fec2c8b2c4 |
| tree | 0d211f69755e1a1f1576a8e6854bda559ea69334 |
| parent | 2412ac2c5ffe9ef02fdcfa2806b5f5862d4e42f3 |
| signature |
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: off | 531 | // 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"); |
| 2 | 2 | ||
| 3 | test "const inferred array of slices" { | 3 | test "const inferred array of slices" { |
| 4 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 4 | 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; // TODO | 5 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 7 | 6 | ||
| 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" { |
| 17 | 16 | ||
| 18 | test "var inferred array of slices" { | 17 | test "var inferred array of slices" { |
| 19 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 18 | 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; // TODO | 19 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 22 | 20 | ||
| 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" { |
| 1080 | 1080 | ||
| 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1082 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1082 | 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; // TODO | 1083 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1085 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1084 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1086 | 1085 |
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" { |
| 389 | test "function with inferred error set but returning no error" { | 389 | test "function with inferred error set but returning no error" { |
| 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 391 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 391 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 392 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 393 | 392 | ||
| 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 { |
| 484 | test "unsigned wrapping" { | 484 | test "unsigned wrapping" { |
| 485 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 485 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 486 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 486 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 487 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 488 | 487 | ||
| 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 { |
| 499 | test "signed wrapping" { | 498 | test "signed wrapping" { |
| 500 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 499 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 501 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 500 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 502 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 503 | 501 | ||
| 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 { |
| 514 | test "signed negation wrapping" { | 512 | test "signed negation wrapping" { |
| 515 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 513 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 516 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 514 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 517 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 518 | 515 | ||
| 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 { |
| 528 | test "unsigned negation wrapping" { | 525 | test "unsigned negation wrapping" { |
| 529 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 526 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 530 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 527 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 531 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 532 | 528 | ||
| 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 | } |
| 60 | 60 | ||
| 61 | test "reinterpret bytes of an array into an extern struct" { | 61 | test "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; // TODO | 62 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 64 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 63 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 65 | 64 |
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; // TODO | 468 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 470 | 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; // TODO | 471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 473 | 472 | ||
| 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; // TODO | 499 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 501 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 500 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 502 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 501 | 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; // TODO | 502 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 505 | 503 | ||
| 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; |
| 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; | 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; |
| 386 | 386 | ||
| 387 | test "type info: generic function types" { | 387 | test "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; |
| 391 | 390 |
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 | } |
| 20 | 20 | ||
| 21 | test "iterate over a void slice" { | 21 | test "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; |
| 24 | 23 | ||
| 25 | var j: usize = 0; | 24 | var j: usize = 0; |