| 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 | 530 | switch (air_tags[inst]) { |
| 531 | 531 | // zig fmt: off |
| 532 | 532 | .add, .ptr_add => try self.airBinOp(inst), |
| 533 | .addwrap => try self.airAddWrap(inst), | |
| 533 | .addwrap => try self.airBinOp(inst), | |
| 534 | 534 | .add_sat => try self.airAddSat(inst), |
| 535 | 535 | .sub, .ptr_sub => try self.airBinOp(inst), |
| 536 | .subwrap => try self.airSubWrap(inst), | |
| 536 | .subwrap => try self.airBinOp(inst), | |
| 537 | 537 | .sub_sat => try self.airSubSat(inst), |
| 538 | 538 | .mul => try self.airBinOp(inst), |
| 539 | .mulwrap => try self.airMulWrap(inst), | |
| 539 | .mulwrap => try self.airBinOp(inst), | |
| 540 | 540 | .mul_sat => try self.airMulSat(inst), |
| 541 | 541 | .rem => try self.airRem(inst), |
| 542 | 542 | .mod => try self.airMod(inst), |
| ... | ... | @@ -2237,6 +2237,39 @@ fn binOp( |
| 2237 | 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 | 2273 | .bit_and, |
| 2241 | 2274 | .bit_or, |
| 2242 | 2275 | .xor, |
test/behavior/bugs/11181.zig-2| ... | ... | @@ -2,7 +2,6 @@ const builtin = @import("builtin"); |
| 2 | 2 | |
| 3 | 3 | test "const inferred array of slices" { |
| 4 | 4 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 5 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 6 | 5 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 7 | 6 | |
| 8 | 7 | const T = struct { v: bool }; |
| ... | ... | @@ -17,7 +16,6 @@ test "const inferred array of slices" { |
| 17 | 16 | |
| 18 | 17 | test "var inferred array of slices" { |
| 19 | 18 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 20 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 21 | 19 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 22 | 20 | |
| 23 | 21 | const T = struct { v: bool }; |
test/behavior/cast.zig-1| ... | ... | @@ -1080,7 +1080,6 @@ test "compile time int to ptr of function" { |
| 1080 | 1080 | |
| 1081 | 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1082 | 1082 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1083 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 1084 | 1083 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1085 | 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 | 389 | test "function with inferred error set but returning no error" { |
| 390 | 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 391 | 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 | 393 | const S = struct { |
| 395 | 394 | fn foo() !void {} |
test/behavior/math.zig-4| ... | ... | @@ -484,7 +484,6 @@ fn mod(comptime T: type, a: T, b: T) T { |
| 484 | 484 | test "unsigned wrapping" { |
| 485 | 485 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 486 | 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 | 488 | try testUnsignedWrappingEval(maxInt(u32)); |
| 490 | 489 | comptime try testUnsignedWrappingEval(maxInt(u32)); |
| ... | ... | @@ -499,7 +498,6 @@ fn testUnsignedWrappingEval(x: u32) !void { |
| 499 | 498 | test "signed wrapping" { |
| 500 | 499 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 501 | 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 | 502 | try testSignedWrappingEval(maxInt(i32)); |
| 505 | 503 | comptime try testSignedWrappingEval(maxInt(i32)); |
| ... | ... | @@ -514,7 +512,6 @@ fn testSignedWrappingEval(x: i32) !void { |
| 514 | 512 | test "signed negation wrapping" { |
| 515 | 513 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 516 | 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 | 516 | try testSignedNegationWrappingEval(minInt(i16)); |
| 520 | 517 | comptime try testSignedNegationWrappingEval(minInt(i16)); |
| ... | ... | @@ -528,7 +525,6 @@ fn testSignedNegationWrappingEval(x: i16) !void { |
| 528 | 525 | test "unsigned negation wrapping" { |
| 529 | 526 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 530 | 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 | 529 | try testUnsignedNegationWrappingEval(1); |
| 534 | 530 | comptime try testUnsignedNegationWrappingEval(1); |
test/behavior/ptrcast.zig-1| ... | ... | @@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void { |
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | test "reinterpret bytes of an array into an extern struct" { |
| 62 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 63 | 62 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 64 | 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 | 468 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 469 | 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 470 | 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 471 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 472 | 471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 473 | 472 | |
| 474 | 473 | const Tag = @Type(.{ |
| ... | ... | @@ -500,7 +499,6 @@ test "Type.Union from regular enum" { |
| 500 | 499 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 501 | 500 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 502 | 501 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 503 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 504 | 502 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 505 | 503 | |
| 506 | 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 | 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; |
| 386 | 386 | |
| 387 | 387 | test "type info: generic function types" { |
| 388 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 389 | 388 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 390 | 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 | 19 | } |
| 20 | 20 | |
| 21 | 21 | test "iterate over a void slice" { |
| 22 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 23 | 22 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 24 | 23 | |
| 25 | 24 | var j: usize = 0; |