1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
1
2
; RUN: llc -verify-machineinstrs < %s -mtriple=aarch64-linux-gnu | FileCheck %s
2
3
3
4
; Note that this should be refactored (for efficiency if nothing else)
11
12
; Add pure 12-bit immediates:
12
13
define void @add_small () {
13
14
; CHECK-LABEL: add_small:
15
+ ; CHECK: // %bb.0:
16
+ ; CHECK-NEXT: adrp x8, :got:var_i32
17
+ ; CHECK-NEXT: adrp x9, :got:var_i64
18
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var_i32]
19
+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:var_i64]
20
+ ; CHECK-NEXT: ldr w10, [x8]
21
+ ; CHECK-NEXT: ldr x11, [x9]
22
+ ; CHECK-NEXT: add w10, w10, #4095 // =4095
23
+ ; CHECK-NEXT: add x11, x11, #52 // =52
24
+ ; CHECK-NEXT: str w10, [x8]
25
+ ; CHECK-NEXT: str x11, [x9]
26
+ ; CHECK-NEXT: ret
14
27
15
- ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, #4095
16
28
%val32 = load i32 , i32* @var_i32
17
29
%newval32 = add i32 %val32 , 4095
18
30
store i32 %newval32 , i32* @var_i32
19
31
20
- ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, #52
21
32
%val64 = load i64 , i64* @var_i64
22
33
%newval64 = add i64 %val64 , 52
23
34
store i64 %newval64 , i64* @var_i64
@@ -36,33 +47,47 @@ define void @add_small() {
36
47
; xC = add xA, #12 ; <- xA implicitly zero extend wA.
37
48
define void @add_small_imm (i8* %p , i64* %q , i32 %b , i32* %addr ) {
38
49
; CHECK-LABEL: add_small_imm:
50
+ ; CHECK: // %bb.0: // %entry
51
+ ; CHECK-NEXT: ldrb w8, [x0]
52
+ ; CHECK-NEXT: add w9, w8, w2
53
+ ; CHECK-NEXT: add x8, x8, #12 // =12
54
+ ; CHECK-NEXT: str w9, [x3]
55
+ ; CHECK-NEXT: str x8, [x1]
56
+ ; CHECK-NEXT: ret
39
57
entry:
40
58
41
- ; CHECK: ldrb w[[LOAD32:[0-9]+]], [x0]
42
59
%t = load i8 , i8* %p
43
60
%promoted = zext i8 %t to i64
44
61
%zextt = zext i8 %t to i32
45
62
%add = add nuw i32 %zextt , %b
46
63
47
- ; CHECK: add [[ADD2:x[0-9]+]], x[[LOAD32]], #12
48
64
%add2 = add nuw i64 %promoted , 12
49
65
store i32 %add , i32* %addr
50
66
51
- ; CHECK: str [[ADD2]], [x1]
52
67
store i64 %add2 , i64* %q
53
68
ret void
54
69
}
55
70
56
71
; Add 12-bit immediates, shifted left by 12 bits
57
72
define void @add_med () {
58
73
; CHECK-LABEL: add_med:
74
+ ; CHECK: // %bb.0:
75
+ ; CHECK-NEXT: adrp x8, :got:var_i32
76
+ ; CHECK-NEXT: adrp x9, :got:var_i64
77
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var_i32]
78
+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:var_i64]
79
+ ; CHECK-NEXT: ldr w10, [x8]
80
+ ; CHECK-NEXT: ldr x11, [x9]
81
+ ; CHECK-NEXT: add w10, w10, #3567, lsl #12 // =14610432
82
+ ; CHECK-NEXT: add x11, x11, #4095, lsl #12 // =16773120
83
+ ; CHECK-NEXT: str w10, [x8]
84
+ ; CHECK-NEXT: str x11, [x9]
85
+ ; CHECK-NEXT: ret
59
86
60
- ; CHECK: add {{w[0-9]+}}, {{w[0-9]+}}, {{#3567, lsl #12|#14610432}}
61
87
%val32 = load i32 , i32* @var_i32
62
88
%newval32 = add i32 %val32 , 14610432 ; =0xdef000
63
89
store i32 %newval32 , i32* @var_i32
64
90
65
- ; CHECK: add {{x[0-9]+}}, {{x[0-9]+}}, {{#4095, lsl #12|#16773120}}
66
91
%val64 = load i64 , i64* @var_i64
67
92
%newval64 = add i64 %val64 , 16773120 ; =0xfff000
68
93
store i64 %newval64 , i64* @var_i64
@@ -73,13 +98,23 @@ define void @add_med() {
73
98
; Subtract 12-bit immediates
74
99
define void @sub_small () {
75
100
; CHECK-LABEL: sub_small:
101
+ ; CHECK: // %bb.0:
102
+ ; CHECK-NEXT: adrp x8, :got:var_i32
103
+ ; CHECK-NEXT: adrp x9, :got:var_i64
104
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var_i32]
105
+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:var_i64]
106
+ ; CHECK-NEXT: ldr w10, [x8]
107
+ ; CHECK-NEXT: ldr x11, [x9]
108
+ ; CHECK-NEXT: sub w10, w10, #4095 // =4095
109
+ ; CHECK-NEXT: sub x11, x11, #52 // =52
110
+ ; CHECK-NEXT: str w10, [x8]
111
+ ; CHECK-NEXT: str x11, [x9]
112
+ ; CHECK-NEXT: ret
76
113
77
- ; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, #4095
78
114
%val32 = load i32 , i32* @var_i32
79
115
%newval32 = sub i32 %val32 , 4095
80
116
store i32 %newval32 , i32* @var_i32
81
117
82
- ; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, #52
83
118
%val64 = load i64 , i64* @var_i64
84
119
%newval64 = sub i64 %val64 , 52
85
120
store i64 %newval64 , i64* @var_i64
@@ -90,13 +125,23 @@ define void @sub_small() {
90
125
; Subtract 12-bit immediates, shifted left by 12 bits
91
126
define void @sub_med () {
92
127
; CHECK-LABEL: sub_med:
128
+ ; CHECK: // %bb.0:
129
+ ; CHECK-NEXT: adrp x8, :got:var_i32
130
+ ; CHECK-NEXT: adrp x9, :got:var_i64
131
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var_i32]
132
+ ; CHECK-NEXT: ldr x9, [x9, :got_lo12:var_i64]
133
+ ; CHECK-NEXT: ldr w10, [x8]
134
+ ; CHECK-NEXT: ldr x11, [x9]
135
+ ; CHECK-NEXT: sub w10, w10, #3567, lsl #12 // =14610432
136
+ ; CHECK-NEXT: sub x11, x11, #4095, lsl #12 // =16773120
137
+ ; CHECK-NEXT: str w10, [x8]
138
+ ; CHECK-NEXT: str x11, [x9]
139
+ ; CHECK-NEXT: ret
93
140
94
- ; CHECK: sub {{w[0-9]+}}, {{w[0-9]+}}, {{#3567, lsl #12|#14610432}}
95
141
%val32 = load i32 , i32* @var_i32
96
142
%newval32 = sub i32 %val32 , 14610432 ; =0xdef000
97
143
store i32 %newval32 , i32* @var_i32
98
144
99
- ; CHECK: sub {{x[0-9]+}}, {{x[0-9]+}}, {{#4095, lsl #12|#16773120}}
100
145
%val64 = load i64 , i64* @var_i64
101
146
%newval64 = sub i64 %val64 , 16773120 ; =0xfff000
102
147
store i64 %newval64 , i64* @var_i64
@@ -106,41 +151,65 @@ define void @sub_med() {
106
151
107
152
define void @testing () {
108
153
; CHECK-LABEL: testing:
154
+ ; CHECK: // %bb.0:
155
+ ; CHECK-NEXT: adrp x8, :got:var_i32
156
+ ; CHECK-NEXT: ldr x8, [x8, :got_lo12:var_i32]
157
+ ; CHECK-NEXT: ldr w9, [x8]
158
+ ; CHECK-NEXT: cmp w9, #4095 // =4095
159
+ ; CHECK-NEXT: b.ne .LBB5_6
160
+ ; CHECK-NEXT: // %bb.1: // %test2
161
+ ; CHECK-NEXT: adrp x10, :got:var2_i32
162
+ ; CHECK-NEXT: ldr x10, [x10, :got_lo12:var2_i32]
163
+ ; CHECK-NEXT: add w11, w9, #1 // =1
164
+ ; CHECK-NEXT: str w11, [x8]
165
+ ; CHECK-NEXT: ldr w10, [x10]
166
+ ; CHECK-NEXT: cmp w10, #3567, lsl #12 // =14610432
167
+ ; CHECK-NEXT: b.lo .LBB5_6
168
+ ; CHECK-NEXT: // %bb.2: // %test3
169
+ ; CHECK-NEXT: add w11, w9, #2 // =2
170
+ ; CHECK-NEXT: cmp w9, #123 // =123
171
+ ; CHECK-NEXT: str w11, [x8]
172
+ ; CHECK-NEXT: b.lt .LBB5_6
173
+ ; CHECK-NEXT: // %bb.3: // %test4
174
+ ; CHECK-NEXT: add w11, w9, #3 // =3
175
+ ; CHECK-NEXT: cmp w10, #321 // =321
176
+ ; CHECK-NEXT: str w11, [x8]
177
+ ; CHECK-NEXT: b.gt .LBB5_6
178
+ ; CHECK-NEXT: // %bb.4: // %test5
179
+ ; CHECK-NEXT: add w11, w9, #4 // =4
180
+ ; CHECK-NEXT: cmn w10, #444 // =444
181
+ ; CHECK-NEXT: str w11, [x8]
182
+ ; CHECK-NEXT: b.gt .LBB5_6
183
+ ; CHECK-NEXT: // %bb.5: // %test6
184
+ ; CHECK-NEXT: add w9, w9, #5 // =5
185
+ ; CHECK-NEXT: str w9, [x8]
186
+ ; CHECK-NEXT: .LBB5_6: // %ret
187
+ ; CHECK-NEXT: ret
109
188
%val = load i32 , i32* @var_i32
110
189
%val2 = load i32 , i32* @var2_i32
111
190
112
- ; CHECK: cmp {{w[0-9]+}}, #4095
113
- ; CHECK: b.ne [[RET:.?LBB[0-9]+_[0-9]+]]
114
191
%cmp_pos_small = icmp ne i32 %val , 4095
115
192
br i1 %cmp_pos_small , label %ret , label %test2
116
193
117
194
test2:
118
- ; CHECK: cmp {{w[0-9]+}}, {{#3567, lsl #12|#14610432}}
119
- ; CHECK: b.lo [[RET]]
120
195
%newval2 = add i32 %val , 1
121
196
store i32 %newval2 , i32* @var_i32
122
197
%cmp_pos_big = icmp ult i32 %val2 , 14610432
123
198
br i1 %cmp_pos_big , label %ret , label %test3
124
199
125
200
test3:
126
- ; CHECK: cmp {{w[0-9]+}}, #123
127
- ; CHECK: b.lt [[RET]]
128
201
%newval3 = add i32 %val , 2
129
202
store i32 %newval3 , i32* @var_i32
130
203
%cmp_pos_slt = icmp slt i32 %val , 123
131
204
br i1 %cmp_pos_slt , label %ret , label %test4
132
205
133
206
test4:
134
- ; CHECK: cmp {{w[0-9]+}}, #321
135
- ; CHECK: b.gt [[RET]]
136
207
%newval4 = add i32 %val , 3
137
208
store i32 %newval4 , i32* @var_i32
138
209
%cmp_pos_sgt = icmp sgt i32 %val2 , 321
139
210
br i1 %cmp_pos_sgt , label %ret , label %test5
140
211
141
212
test5:
142
- ; CHECK: cmn {{w[0-9]+}}, #444
143
- ; CHECK: b.gt [[RET]]
144
213
%newval5 = add i32 %val , 4
145
214
store i32 %newval5 , i32* @var_i32
146
215
%cmp_neg_uge = icmp sgt i32 %val2 , -444
0 commit comments