1
1
; 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
3
4
4
5
define 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
11
20
%a1 = and i64 %x , 65535
12
21
%a2 = add i64 %x , 65535
13
22
%r = and i64 %a1 , %a2
14
23
ret i64 %r
15
24
}
16
25
17
26
define 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
24
41
%a = and i8 %x , 5
25
42
%m = sub i8 7 , %a
26
43
ret i8 %m
@@ -29,12 +46,20 @@ define i8 @masked_sub_i8(i8 %x) {
29
46
; Borrow from the MSB is ok.
30
47
31
48
define 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
38
63
%maskx = and i8 %x , 160 ; 0b10100000
39
64
%s = sub i8 60 , %maskx ; 0b00111100
40
65
ret i8 %s
@@ -43,7 +68,7 @@ define i8 @masked_sub_high_bit_mask_i8(i8 %x) {
43
68
define i8 @not_masked_sub_i8 (i8 %x ) {
44
69
; CHECK-LABEL: not_masked_sub_i8:
45
70
; CHECK: // %bb.0:
46
- ; CHECK-NEXT: mov w8, #7
71
+ ; CHECK-NEXT: mov w8, #7 // =0x7
47
72
; CHECK-NEXT: and w9, w0, #0x8
48
73
; CHECK-NEXT: sub w0, w8, w9
49
74
; CHECK-NEXT: ret
@@ -53,25 +78,41 @@ define i8 @not_masked_sub_i8(i8 %x) {
53
78
}
54
79
55
80
define 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
62
95
%a = and i32 %x , 9
63
96
%m = sub i32 31 , %a
64
97
ret i32 %m
65
98
}
66
99
67
100
define <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
75
116
%a = and <4 x i32 > %x , <i32 42 , i32 42 , i32 42 , i32 42 >
76
117
%m = sub <4 x i32 > <i32 511 , i32 511 , i32 511 , i32 511 >, %a
77
118
ret <4 x i32 > %m
0 commit comments