5
5
define i64 @load32_and16_and (i32* %p , i64 %y ) {
6
6
; CHECK-LABEL: load32_and16_and:
7
7
; CHECK: // %bb.0:
8
- ; CHECK-NEXT: ldrh w8, [x0]
9
- ; CHECK-NEXT: and w0, w1, w8
8
+ ; CHECK-NEXT: ldr w8, [x0]
9
+ ; CHECK-NEXT: and w8, w1, w8
10
+ ; CHECK-NEXT: and x0, x8, #0xffff
10
11
; CHECK-NEXT: ret
11
12
;
12
13
; CHECKBE-LABEL: load32_and16_and:
13
14
; CHECKBE: // %bb.0:
14
- ; CHECKBE-NEXT: ldrh w8, [x0, #2]
15
- ; CHECKBE-NEXT: and w0, w1, w8
15
+ ; CHECKBE-NEXT: ldr w8, [x0]
16
+ ; CHECKBE-NEXT: and w8, w1, w8
17
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
16
18
; CHECKBE-NEXT: ret
17
19
%x = load i32 , i32* %p , align 4
18
20
%xz = zext i32 %x to i64
@@ -24,14 +26,16 @@ define i64 @load32_and16_and(i32* %p, i64 %y) {
24
26
define i64 @load32_and16_andr (i32* %p , i64 %y ) {
25
27
; CHECK-LABEL: load32_and16_andr:
26
28
; CHECK: // %bb.0:
27
- ; CHECK-NEXT: ldrh w8, [x0]
28
- ; CHECK-NEXT: and w0, w1, w8
29
+ ; CHECK-NEXT: ldr w8, [x0]
30
+ ; CHECK-NEXT: and w8, w1, w8
31
+ ; CHECK-NEXT: and x0, x8, #0xffff
29
32
; CHECK-NEXT: ret
30
33
;
31
34
; CHECKBE-LABEL: load32_and16_andr:
32
35
; CHECKBE: // %bb.0:
33
- ; CHECKBE-NEXT: ldrh w8, [x0, #2]
34
- ; CHECKBE-NEXT: and w0, w1, w8
36
+ ; CHECKBE-NEXT: ldr w8, [x0]
37
+ ; CHECKBE-NEXT: and w8, w1, w8
38
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
35
39
; CHECKBE-NEXT: ret
36
40
%x = load i32 , i32* %p , align 4
37
41
%xz = zext i32 %x to i64
@@ -43,14 +47,16 @@ define i64 @load32_and16_andr(i32* %p, i64 %y) {
43
47
define i64 @load32_and16_and_sext (i32* %p , i64 %y ) {
44
48
; CHECK-LABEL: load32_and16_and_sext:
45
49
; CHECK: // %bb.0:
46
- ; CHECK-NEXT: ldrh w8, [x0]
47
- ; CHECK-NEXT: and w0, w1, w8
50
+ ; CHECK-NEXT: ldr w8, [x0]
51
+ ; CHECK-NEXT: and w8, w1, w8
52
+ ; CHECK-NEXT: and x0, x8, #0xffff
48
53
; CHECK-NEXT: ret
49
54
;
50
55
; CHECKBE-LABEL: load32_and16_and_sext:
51
56
; CHECKBE: // %bb.0:
52
- ; CHECKBE-NEXT: ldrh w8, [x0, #2]
53
- ; CHECKBE-NEXT: and w0, w1, w8
57
+ ; CHECKBE-NEXT: ldr w8, [x0]
58
+ ; CHECKBE-NEXT: and w8, w1, w8
59
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
54
60
; CHECKBE-NEXT: ret
55
61
%x = load i32 , i32* %p , align 4
56
62
%xz = sext i32 %x to i64
@@ -62,16 +68,16 @@ define i64 @load32_and16_and_sext(i32* %p, i64 %y) {
62
68
define i64 @load32_and16_or (i32* %p , i64 %y ) {
63
69
; CHECK-LABEL: load32_and16_or:
64
70
; CHECK: // %bb.0:
65
- ; CHECK-NEXT: ldrh w8, [x0]
66
- ; CHECK-NEXT: and w9 , w1, #0xffff
67
- ; CHECK-NEXT: orr w0, w9, w8
71
+ ; CHECK-NEXT: ldr w8, [x0]
72
+ ; CHECK-NEXT: orr w8 , w1, w8
73
+ ; CHECK-NEXT: and x0, x8, #0xffff
68
74
; CHECK-NEXT: ret
69
75
;
70
76
; CHECKBE-LABEL: load32_and16_or:
71
77
; CHECKBE: // %bb.0:
72
- ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
73
- ; CHECKBE-NEXT: and w9 , w1, #0xffff
74
- ; CHECKBE-NEXT: orr w0, w9, w8
78
+ ; CHECKBE-NEXT: ldr w8, [x0]
79
+ ; CHECKBE-NEXT: orr w8 , w1, w8
80
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
75
81
; CHECKBE-NEXT: ret
76
82
%x = load i32 , i32* %p , align 4
77
83
%xz = zext i32 %x to i64
@@ -164,14 +170,16 @@ define i64 @load16_and16(i16* %p, i64 %y) {
164
170
define i64 @load16_and8 (i16* %p , i64 %y ) {
165
171
; CHECK-LABEL: load16_and8:
166
172
; CHECK: // %bb.0:
167
- ; CHECK-NEXT: ldrb w8, [x0]
168
- ; CHECK-NEXT: and w0, w1, w8
173
+ ; CHECK-NEXT: ldrh w8, [x0]
174
+ ; CHECK-NEXT: and w8, w1, w8
175
+ ; CHECK-NEXT: and x0, x8, #0xff
169
176
; CHECK-NEXT: ret
170
177
;
171
178
; CHECKBE-LABEL: load16_and8:
172
179
; CHECKBE: // %bb.0:
173
- ; CHECKBE-NEXT: ldrb w8, [x0, #1]
174
- ; CHECKBE-NEXT: and w0, w1, w8
180
+ ; CHECKBE-NEXT: ldrh w8, [x0]
181
+ ; CHECKBE-NEXT: and w8, w1, w8
182
+ ; CHECKBE-NEXT: and x0, x8, #0xff
175
183
; CHECKBE-NEXT: ret
176
184
%x = load i16 , i16* %p , align 4
177
185
%xz = zext i16 %x to i64
@@ -224,13 +232,15 @@ define i64 @load8_and16_zext(i8* %p, i8 %y) {
224
232
; CHECK-LABEL: load8_and16_zext:
225
233
; CHECK: // %bb.0:
226
234
; CHECK-NEXT: ldrb w8, [x0]
227
- ; CHECK-NEXT: and w0, w1, w8
235
+ ; CHECK-NEXT: and w8, w1, w8
236
+ ; CHECK-NEXT: and x0, x8, #0xff
228
237
; CHECK-NEXT: ret
229
238
;
230
239
; CHECKBE-LABEL: load8_and16_zext:
231
240
; CHECKBE: // %bb.0:
232
241
; CHECKBE-NEXT: ldrb w8, [x0]
233
- ; CHECKBE-NEXT: and w0, w1, w8
242
+ ; CHECKBE-NEXT: and w8, w1, w8
243
+ ; CHECKBE-NEXT: and x0, x8, #0xff
234
244
; CHECKBE-NEXT: ret
235
245
%x = load i8 , i8* %p , align 4
236
246
%xz = zext i8 %x to i64
@@ -286,14 +296,16 @@ define i64 @load8_and16_or(i8* %p, i64 %y) {
286
296
define i64 @load16_and8_manyext (i16* %p , i32 %y ) {
287
297
; CHECK-LABEL: load16_and8_manyext:
288
298
; CHECK: // %bb.0:
289
- ; CHECK-NEXT: ldrb w8, [x0]
290
- ; CHECK-NEXT: and w0, w1, w8
299
+ ; CHECK-NEXT: ldrh w8, [x0]
300
+ ; CHECK-NEXT: and w8, w1, w8
301
+ ; CHECK-NEXT: and x0, x8, #0xff
291
302
; CHECK-NEXT: ret
292
303
;
293
304
; CHECKBE-LABEL: load16_and8_manyext:
294
305
; CHECKBE: // %bb.0:
295
- ; CHECKBE-NEXT: ldrb w8, [x0, #1]
296
- ; CHECKBE-NEXT: and w0, w1, w8
306
+ ; CHECKBE-NEXT: ldrh w8, [x0]
307
+ ; CHECKBE-NEXT: and w8, w1, w8
308
+ ; CHECKBE-NEXT: and x0, x8, #0xff
297
309
; CHECKBE-NEXT: ret
298
310
%x = load i16 , i16* %p , align 4
299
311
%xz = zext i16 %x to i32
@@ -306,16 +318,18 @@ define i64 @load16_and8_manyext(i16* %p, i32 %y) {
306
318
define i64 @multiple_load (i16* %p , i32* %q ) {
307
319
; CHECK-LABEL: multiple_load:
308
320
; CHECK: // %bb.0:
309
- ; CHECK-NEXT: ldrb w8, [x0]
310
- ; CHECK-NEXT: ldrb w9, [x1]
311
- ; CHECK-NEXT: and w0, w9, w8
321
+ ; CHECK-NEXT: ldrh w8, [x0]
322
+ ; CHECK-NEXT: ldr w9, [x1]
323
+ ; CHECK-NEXT: and w8, w9, w8
324
+ ; CHECK-NEXT: and x0, x8, #0xff
312
325
; CHECK-NEXT: ret
313
326
;
314
327
; CHECKBE-LABEL: multiple_load:
315
328
; CHECKBE: // %bb.0:
316
- ; CHECKBE-NEXT: ldrb w8, [x0, #1]
317
- ; CHECKBE-NEXT: ldrb w9, [x1, #3]
318
- ; CHECKBE-NEXT: and w0, w9, w8
329
+ ; CHECKBE-NEXT: ldrh w8, [x0]
330
+ ; CHECKBE-NEXT: ldr w9, [x1]
331
+ ; CHECKBE-NEXT: and w8, w9, w8
332
+ ; CHECKBE-NEXT: and x0, x8, #0xff
319
333
; CHECKBE-NEXT: ret
320
334
%x = load i16 , i16* %p , align 4
321
335
%xz = zext i16 %x to i64
@@ -329,16 +343,18 @@ define i64 @multiple_load(i16* %p, i32* %q) {
329
343
define i64 @multiple_load_or (i16* %p , i32* %q ) {
330
344
; CHECK-LABEL: multiple_load_or:
331
345
; CHECK: // %bb.0:
332
- ; CHECK-NEXT: ldrb w8, [x0]
333
- ; CHECK-NEXT: ldrb w9, [x1]
334
- ; CHECK-NEXT: orr w0, w9, w8
346
+ ; CHECK-NEXT: ldrh w8, [x0]
347
+ ; CHECK-NEXT: ldr w9, [x1]
348
+ ; CHECK-NEXT: orr w8, w9, w8
349
+ ; CHECK-NEXT: and x0, x8, #0xff
335
350
; CHECK-NEXT: ret
336
351
;
337
352
; CHECKBE-LABEL: multiple_load_or:
338
353
; CHECKBE: // %bb.0:
339
- ; CHECKBE-NEXT: ldrb w8, [x0, #1]
340
- ; CHECKBE-NEXT: ldrb w9, [x1, #3]
341
- ; CHECKBE-NEXT: orr w0, w9, w8
354
+ ; CHECKBE-NEXT: ldrh w8, [x0]
355
+ ; CHECKBE-NEXT: ldr w9, [x1]
356
+ ; CHECKBE-NEXT: orr w8, w9, w8
357
+ ; CHECKBE-NEXT: and x0, x8, #0xff
342
358
; CHECKBE-NEXT: ret
343
359
%x = load i16 , i16* %p , align 4
344
360
%xz = zext i16 %x to i64
@@ -352,16 +368,16 @@ define i64 @multiple_load_or(i16* %p, i32* %q) {
352
368
define i64 @load32_and16_zexty (i32* %p , i32 %y ) {
353
369
; CHECK-LABEL: load32_and16_zexty:
354
370
; CHECK: // %bb.0:
355
- ; CHECK-NEXT: ldrh w8, [x0]
356
- ; CHECK-NEXT: and w9 , w1, #0xffff
357
- ; CHECK-NEXT: orr w0, w9, w8
371
+ ; CHECK-NEXT: ldr w8, [x0]
372
+ ; CHECK-NEXT: orr w8 , w1, w8
373
+ ; CHECK-NEXT: and x0, x8, #0xffff
358
374
; CHECK-NEXT: ret
359
375
;
360
376
; CHECKBE-LABEL: load32_and16_zexty:
361
377
; CHECKBE: // %bb.0:
362
- ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
363
- ; CHECKBE-NEXT: and w9 , w1, #0xffff
364
- ; CHECKBE-NEXT: orr w0, w9, w8
378
+ ; CHECKBE-NEXT: ldr w8, [x0]
379
+ ; CHECKBE-NEXT: orr w8 , w1, w8
380
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
365
381
; CHECKBE-NEXT: ret
366
382
%x = load i32 , i32* %p , align 4
367
383
%xz = zext i32 %x to i64
@@ -374,16 +390,16 @@ define i64 @load32_and16_zexty(i32* %p, i32 %y) {
374
390
define i64 @load32_and16_sexty (i32* %p , i32 %y ) {
375
391
; CHECK-LABEL: load32_and16_sexty:
376
392
; CHECK: // %bb.0:
377
- ; CHECK-NEXT: ldrh w8, [x0]
378
- ; CHECK-NEXT: and w9 , w1, #0xffff
379
- ; CHECK-NEXT: orr w0, w9, w8
393
+ ; CHECK-NEXT: ldr w8, [x0]
394
+ ; CHECK-NEXT: orr w8 , w1, w8
395
+ ; CHECK-NEXT: and x0, x8, #0xffff
380
396
; CHECK-NEXT: ret
381
397
;
382
398
; CHECKBE-LABEL: load32_and16_sexty:
383
399
; CHECKBE: // %bb.0:
384
- ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
385
- ; CHECKBE-NEXT: and w9 , w1, #0xffff
386
- ; CHECKBE-NEXT: orr w0, w9, w8
400
+ ; CHECKBE-NEXT: ldr w8, [x0]
401
+ ; CHECKBE-NEXT: orr w8 , w1, w8
402
+ ; CHECKBE-NEXT: and x0, x8, #0xffff
387
403
; CHECKBE-NEXT: ret
388
404
%x = load i32 , i32* %p , align 4
389
405
%xz = zext i32 %x to i64
0 commit comments