authorgravatar for kubkon@jakubkonka.comJakub Konka <kubkon@jakubkonka.com> 2022-05-14 21:24:48+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-05-16 13:55:26-07:00
log852c82084163eec9911384b325dbd5713ee4df90
tree677c9aa46b7e821aaeb7e4aa32bfb76b1e04295c
parenta84be7e988c91606bc42e1e1c8a34bbdcdb8a3f1

aarch64: sub_with_overflow should always track V flag


2 files changed, 65 insertions(+), 26 deletions(-)

src/arch/aarch64/CodeGen.zig+4
...@@ -1901,6 +1901,10 @@ fn airOverflow(self: *Self, inst: Air.Inst.Index) !void {...@@ -1901,6 +1901,10 @@ fn airOverflow(self: *Self, inst: Air.Inst.Index) !void {
1901 }1901 }
1902 };1902 };
19031903
1904 if (tag == .sub_with_overflow) {
1905 break :result MCValue{ .register_v_flag = dest.register };
1906 }
1907
1904 switch (int_info.signedness) {1908 switch (int_info.signedness) {
1905 .unsigned => break :result MCValue{ .register_c_flag = dest.register },1909 .unsigned => break :result MCValue{ .register_c_flag = dest.register },
1906 .signed => break :result MCValue{ .register_v_flag = dest.register },1910 .signed => break :result MCValue{ .register_v_flag = dest.register },
test/behavior/math.zig+61-26
...@@ -621,24 +621,41 @@ test "128-bit multiplication" {...@@ -621,24 +621,41 @@ test "128-bit multiplication" {
621test "@addWithOverflow" {621test "@addWithOverflow" {
622 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO622 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
623623
624 var result: u8 = undefined;624 {
625 try expect(@addWithOverflow(u8, 250, 100, &result));625 var result: u8 = undefined;
626 try expect(result == 94);626 try expect(@addWithOverflow(u8, 250, 100, &result));
627 try expect(!@addWithOverflow(u8, 100, 150, &result));627 try expect(result == 94);
628 try expect(result == 250);628 try expect(!@addWithOverflow(u8, 100, 150, &result));
629629 try expect(result == 250);
630 var a: u8 = 200;630
631 var b: u8 = 99;631 var a: u8 = 200;
632 try expect(@addWithOverflow(u8, a, b, &result));632 var b: u8 = 99;
633 try expect(result == 43);633 try expect(@addWithOverflow(u8, a, b, &result));
634 b = 55;634 try expect(result == 43);
635 try expect(!@addWithOverflow(u8, a, b, &result));635 b = 55;
636 try expect(result == 255);636 try expect(!@addWithOverflow(u8, a, b, &result));
637 try expect(result == 255);
638 }
639
640 {
641 var a: usize = 6;
642 var b: usize = 6;
643 var res: usize = undefined;
644 try expect(!@addWithOverflow(usize, a, b, &res));
645 try expect(res == 12);
646 }
647
648 {
649 var a: isize = -6;
650 var b: isize = -6;
651 var res: isize = undefined;
652 try expect(!@addWithOverflow(isize, a, b, &res));
653 try expect(res == -12);
654 }
637}655}
638656
639test "small int addition" {657test "small int addition" {
640 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO658 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
641 if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO
642 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO659 if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
643660
644 var x: u2 = 0;661 var x: u2 = 0;
...@@ -886,19 +903,37 @@ test "@mulWithOverflow bitsize > 32" {...@@ -886,19 +903,37 @@ test "@mulWithOverflow bitsize > 32" {
886test "@subWithOverflow" {903test "@subWithOverflow" {
887 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO904 if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
888905
889 var result: u8 = undefined;906 {
890 try expect(@subWithOverflow(u8, 1, 2, &result));907 var result: u8 = undefined;
891 try expect(result == 255);908 try expect(@subWithOverflow(u8, 1, 2, &result));
892 try expect(!@subWithOverflow(u8, 1, 1, &result));909 try expect(result == 255);
893 try expect(result == 0);910 try expect(!@subWithOverflow(u8, 1, 1, &result));
911 try expect(result == 0);
894912
895 var a: u8 = 1;913 var a: u8 = 1;
896 var b: u8 = 2;914 var b: u8 = 2;
897 try expect(@subWithOverflow(u8, a, b, &result));915 try expect(@subWithOverflow(u8, a, b, &result));
898 try expect(result == 255);916 try expect(result == 255);
899 b = 1;917 b = 1;
900 try expect(!@subWithOverflow(u8, a, b, &result));918 try expect(!@subWithOverflow(u8, a, b, &result));
901 try expect(result == 0);919 try expect(result == 0);
920 }
921
922 {
923 var a: usize = 6;
924 var b: usize = 6;
925 var res: usize = undefined;
926 try expect(!@subWithOverflow(usize, a, b, &res));
927 try expect(res == 0);
928 }
929
930 {
931 var a: isize = -6;
932 var b: isize = -6;
933 var res: isize = undefined;
934 try expect(!@subWithOverflow(isize, a, b, &res));
935 try expect(res == 0);
936 }
902}937}
903938
904test "@shlWithOverflow" {939test "@shlWithOverflow" {