11; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2- ; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s
2+ ; RUN: llc < %s -mtriple=aarch64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,CHECK-SD
3+ ; RUN: llc < %s -mtriple=aarch64-unknown-unknown -global-isel | FileCheck %s --check-prefixes=CHECK,CHECK-GI
34
45define i64 @sub1_disguised_constant (i64 %x ) {
5- ; CHECK-LABEL: sub1_disguised_constant:
6- ; CHECK: // %bb.0:
7- ; CHECK-NEXT: sub w8, w0, #1
8- ; CHECK-NEXT: and w8, w0, w8
9- ; CHECK-NEXT: and x0, x8, #0xffff
10- ; CHECK-NEXT: ret
6+ ; CHECK-SD-LABEL: sub1_disguised_constant:
7+ ; CHECK-SD: // %bb.0:
8+ ; CHECK-SD-NEXT: sub w8, w0, #1
9+ ; CHECK-SD-NEXT: and w8, w0, w8
10+ ; CHECK-SD-NEXT: and x0, x8, #0xffff
11+ ; CHECK-SD-NEXT: ret
12+ ;
13+ ; CHECK-GI-LABEL: sub1_disguised_constant:
14+ ; CHECK-GI: // %bb.0:
15+ ; CHECK-GI-NEXT: mov w8, #65535 // =0xffff
16+ ; CHECK-GI-NEXT: and x9, x0, #0xffff
17+ ; CHECK-GI-NEXT: add x8, x0, x8
18+ ; CHECK-GI-NEXT: and x0, x9, x8
19+ ; CHECK-GI-NEXT: ret
1120 %a1 = and i64 %x , 65535
1221 %a2 = add i64 %x , 65535
1322 %r = and i64 %a1 , %a2
1423 ret i64 %r
1524}
1625
1726define i8 @masked_sub_i8 (i8 %x ) {
18- ; CHECK-LABEL: masked_sub_i8:
19- ; CHECK: // %bb.0:
20- ; CHECK-NEXT: mov w8, #5
21- ; CHECK-NEXT: and w8, w0, w8
22- ; CHECK-NEXT: eor w0, w8, #0x7
23- ; CHECK-NEXT: ret
27+ ; CHECK-SD-LABEL: masked_sub_i8:
28+ ; CHECK-SD: // %bb.0:
29+ ; CHECK-SD-NEXT: mov w8, #5 // =0x5
30+ ; CHECK-SD-NEXT: and w8, w0, w8
31+ ; CHECK-SD-NEXT: eor w0, w8, #0x7
32+ ; CHECK-SD-NEXT: ret
33+ ;
34+ ; CHECK-GI-LABEL: masked_sub_i8:
35+ ; CHECK-GI: // %bb.0:
36+ ; CHECK-GI-NEXT: mov w8, #5 // =0x5
37+ ; CHECK-GI-NEXT: mov w9, #7 // =0x7
38+ ; CHECK-GI-NEXT: and w8, w0, w8
39+ ; CHECK-GI-NEXT: sub w0, w9, w8
40+ ; CHECK-GI-NEXT: ret
2441 %a = and i8 %x , 5
2542 %m = sub i8 7 , %a
2643 ret i8 %m
@@ -29,12 +46,20 @@ define i8 @masked_sub_i8(i8 %x) {
2946; Borrow from the MSB is ok.
3047
3148define i8 @masked_sub_high_bit_mask_i8 (i8 %x ) {
32- ; CHECK-LABEL: masked_sub_high_bit_mask_i8:
33- ; CHECK: // %bb.0:
34- ; CHECK-NEXT: mov w8, #-96
35- ; CHECK-NEXT: and w8, w0, w8
36- ; CHECK-NEXT: eor w0, w8, #0x3c
37- ; CHECK-NEXT: ret
49+ ; CHECK-SD-LABEL: masked_sub_high_bit_mask_i8:
50+ ; CHECK-SD: // %bb.0:
51+ ; CHECK-SD-NEXT: mov w8, #-96 // =0xffffffa0
52+ ; CHECK-SD-NEXT: and w8, w0, w8
53+ ; CHECK-SD-NEXT: eor w0, w8, #0x3c
54+ ; CHECK-SD-NEXT: ret
55+ ;
56+ ; CHECK-GI-LABEL: masked_sub_high_bit_mask_i8:
57+ ; CHECK-GI: // %bb.0:
58+ ; CHECK-GI-NEXT: mov w8, #-96 // =0xffffffa0
59+ ; CHECK-GI-NEXT: mov w9, #60 // =0x3c
60+ ; CHECK-GI-NEXT: and w8, w0, w8
61+ ; CHECK-GI-NEXT: sub w0, w9, w8
62+ ; CHECK-GI-NEXT: ret
3863 %maskx = and i8 %x , 160 ; 0b10100000
3964 %s = sub i8 60 , %maskx ; 0b00111100
4065 ret i8 %s
@@ -43,7 +68,7 @@ define i8 @masked_sub_high_bit_mask_i8(i8 %x) {
4368define i8 @not_masked_sub_i8 (i8 %x ) {
4469; CHECK-LABEL: not_masked_sub_i8:
4570; CHECK: // %bb.0:
46- ; CHECK-NEXT: mov w8, #7
71+ ; CHECK-NEXT: mov w8, #7 // =0x7
4772; CHECK-NEXT: and w9, w0, #0x8
4873; CHECK-NEXT: sub w0, w8, w9
4974; CHECK-NEXT: ret
@@ -53,25 +78,41 @@ define i8 @not_masked_sub_i8(i8 %x) {
5378}
5479
5580define i32 @masked_sub_i32 (i32 %x ) {
56- ; CHECK-LABEL: masked_sub_i32:
57- ; CHECK: // %bb.0:
58- ; CHECK-NEXT: mov w8, #9
59- ; CHECK-NEXT: and w8, w0, w8
60- ; CHECK-NEXT: eor w0, w8, #0x1f
61- ; CHECK-NEXT: ret
81+ ; CHECK-SD-LABEL: masked_sub_i32:
82+ ; CHECK-SD: // %bb.0:
83+ ; CHECK-SD-NEXT: mov w8, #9 // =0x9
84+ ; CHECK-SD-NEXT: and w8, w0, w8
85+ ; CHECK-SD-NEXT: eor w0, w8, #0x1f
86+ ; CHECK-SD-NEXT: ret
87+ ;
88+ ; CHECK-GI-LABEL: masked_sub_i32:
89+ ; CHECK-GI: // %bb.0:
90+ ; CHECK-GI-NEXT: mov w8, #9 // =0x9
91+ ; CHECK-GI-NEXT: mov w9, #31 // =0x1f
92+ ; CHECK-GI-NEXT: and w8, w0, w8
93+ ; CHECK-GI-NEXT: sub w0, w9, w8
94+ ; CHECK-GI-NEXT: ret
6295 %a = and i32 %x , 9
6396 %m = sub i32 31 , %a
6497 ret i32 %m
6598}
6699
67100define <4 x i32 > @masked_sub_v4i32 (<4 x i32 > %x ) {
68- ; CHECK-LABEL: masked_sub_v4i32:
69- ; CHECK: // %bb.0:
70- ; CHECK-NEXT: movi v1.4s, #42
71- ; CHECK-NEXT: movi v2.4s, #1, msl #8
72- ; CHECK-NEXT: and v0.16b, v0.16b, v1.16b
73- ; CHECK-NEXT: eor v0.16b, v0.16b, v2.16b
74- ; CHECK-NEXT: ret
101+ ; CHECK-SD-LABEL: masked_sub_v4i32:
102+ ; CHECK-SD: // %bb.0:
103+ ; CHECK-SD-NEXT: movi v1.4s, #42
104+ ; CHECK-SD-NEXT: movi v2.4s, #1, msl #8
105+ ; CHECK-SD-NEXT: and v0.16b, v0.16b, v1.16b
106+ ; CHECK-SD-NEXT: eor v0.16b, v0.16b, v2.16b
107+ ; CHECK-SD-NEXT: ret
108+ ;
109+ ; CHECK-GI-LABEL: masked_sub_v4i32:
110+ ; CHECK-GI: // %bb.0:
111+ ; CHECK-GI-NEXT: movi v1.4s, #42
112+ ; CHECK-GI-NEXT: movi v2.4s, #1, msl #8
113+ ; CHECK-GI-NEXT: and v0.16b, v0.16b, v1.16b
114+ ; CHECK-GI-NEXT: sub v0.4s, v2.4s, v0.4s
115+ ; CHECK-GI-NEXT: ret
75116 %a = and <4 x i32 > %x , <i32 42 , i32 42 , i32 42 , i32 42 >
76117 %m = sub <4 x i32 > <i32 511 , i32 511 , i32 511 , i32 511 >, %a
77118 ret <4 x i32 > %m
0 commit comments