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: ldr w8, [x0]
9
- ; CHECK-NEXT: and w8, w1, w8
10
- ; CHECK-NEXT: and x0, x8, #0xffff
8
+ ; CHECK-NEXT: ldrh w8, [x0]
9
+ ; CHECK-NEXT: and w0, w1, w8
11
10
; CHECK-NEXT: ret
12
11
;
13
12
; CHECKBE-LABEL: load32_and16_and:
14
13
; CHECKBE: // %bb.0:
15
- ; CHECKBE-NEXT: ldr w8, [x0]
16
- ; CHECKBE-NEXT: and w8, w1, w8
17
- ; CHECKBE-NEXT: and x0, x8, #0xffff
14
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2]
15
+ ; CHECKBE-NEXT: and w0, w1, w8
18
16
; CHECKBE-NEXT: ret
19
17
%x = load i32 , i32* %p , align 4
20
18
%xz = zext i32 %x to i64
@@ -26,16 +24,14 @@ define i64 @load32_and16_and(i32* %p, i64 %y) {
26
24
define i64 @load32_and16_andr (i32* %p , i64 %y ) {
27
25
; CHECK-LABEL: load32_and16_andr:
28
26
; CHECK: // %bb.0:
29
- ; CHECK-NEXT: ldr w8, [x0]
30
- ; CHECK-NEXT: and w8, w1, w8
31
- ; CHECK-NEXT: and x0, x8, #0xffff
27
+ ; CHECK-NEXT: ldrh w8, [x0]
28
+ ; CHECK-NEXT: and w0, w1, w8
32
29
; CHECK-NEXT: ret
33
30
;
34
31
; CHECKBE-LABEL: load32_and16_andr:
35
32
; CHECKBE: // %bb.0:
36
- ; CHECKBE-NEXT: ldr w8, [x0]
37
- ; CHECKBE-NEXT: and w8, w1, w8
38
- ; CHECKBE-NEXT: and x0, x8, #0xffff
33
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2]
34
+ ; CHECKBE-NEXT: and w0, w1, w8
39
35
; CHECKBE-NEXT: ret
40
36
%x = load i32 , i32* %p , align 4
41
37
%xz = zext i32 %x to i64
@@ -47,16 +43,14 @@ define i64 @load32_and16_andr(i32* %p, i64 %y) {
47
43
define i64 @load32_and16_and_sext (i32* %p , i64 %y ) {
48
44
; CHECK-LABEL: load32_and16_and_sext:
49
45
; CHECK: // %bb.0:
50
- ; CHECK-NEXT: ldr w8, [x0]
51
- ; CHECK-NEXT: and w8, w1, w8
52
- ; CHECK-NEXT: and x0, x8, #0xffff
46
+ ; CHECK-NEXT: ldrh w8, [x0]
47
+ ; CHECK-NEXT: and w0, w1, w8
53
48
; CHECK-NEXT: ret
54
49
;
55
50
; CHECKBE-LABEL: load32_and16_and_sext:
56
51
; CHECKBE: // %bb.0:
57
- ; CHECKBE-NEXT: ldr w8, [x0]
58
- ; CHECKBE-NEXT: and w8, w1, w8
59
- ; CHECKBE-NEXT: and x0, x8, #0xffff
52
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2]
53
+ ; CHECKBE-NEXT: and w0, w1, w8
60
54
; CHECKBE-NEXT: ret
61
55
%x = load i32 , i32* %p , align 4
62
56
%xz = sext i32 %x to i64
@@ -68,16 +62,16 @@ define i64 @load32_and16_and_sext(i32* %p, i64 %y) {
68
62
define i64 @load32_and16_or (i32* %p , i64 %y ) {
69
63
; CHECK-LABEL: load32_and16_or:
70
64
; CHECK: // %bb.0:
71
- ; CHECK-NEXT: ldr w8, [x0]
72
- ; CHECK-NEXT: orr w8 , w1, w8
73
- ; CHECK-NEXT: and x0, x8, #0xffff
65
+ ; CHECK-NEXT: ldrh w8, [x0]
66
+ ; CHECK-NEXT: and w9 , w1, #0xffff
67
+ ; CHECK-NEXT: orr w0, w9, w8
74
68
; CHECK-NEXT: ret
75
69
;
76
70
; CHECKBE-LABEL: load32_and16_or:
77
71
; CHECKBE: // %bb.0:
78
- ; CHECKBE-NEXT: ldr w8, [x0]
79
- ; CHECKBE-NEXT: orr w8 , w1, w8
80
- ; CHECKBE-NEXT: and x0, x8, #0xffff
72
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
73
+ ; CHECKBE-NEXT: and w9 , w1, #0xffff
74
+ ; CHECKBE-NEXT: orr w0, w9, w8
81
75
; CHECKBE-NEXT: ret
82
76
%x = load i32 , i32* %p , align 4
83
77
%xz = zext i32 %x to i64
@@ -170,16 +164,14 @@ define i64 @load16_and16(i16* %p, i64 %y) {
170
164
define i64 @load16_and8 (i16* %p , i64 %y ) {
171
165
; CHECK-LABEL: load16_and8:
172
166
; CHECK: // %bb.0:
173
- ; CHECK-NEXT: ldrh w8, [x0]
174
- ; CHECK-NEXT: and w8, w1, w8
175
- ; CHECK-NEXT: and x0, x8, #0xff
167
+ ; CHECK-NEXT: ldrb w8, [x0]
168
+ ; CHECK-NEXT: and w0, w1, w8
176
169
; CHECK-NEXT: ret
177
170
;
178
171
; CHECKBE-LABEL: load16_and8:
179
172
; CHECKBE: // %bb.0:
180
- ; CHECKBE-NEXT: ldrh w8, [x0]
181
- ; CHECKBE-NEXT: and w8, w1, w8
182
- ; CHECKBE-NEXT: and x0, x8, #0xff
173
+ ; CHECKBE-NEXT: ldrb w8, [x0, #1]
174
+ ; CHECKBE-NEXT: and w0, w1, w8
183
175
; CHECKBE-NEXT: ret
184
176
%x = load i16 , i16* %p , align 4
185
177
%xz = zext i16 %x to i64
@@ -232,15 +224,13 @@ define i64 @load8_and16_zext(i8* %p, i8 %y) {
232
224
; CHECK-LABEL: load8_and16_zext:
233
225
; CHECK: // %bb.0:
234
226
; CHECK-NEXT: ldrb w8, [x0]
235
- ; CHECK-NEXT: and w8, w1, w8
236
- ; CHECK-NEXT: and x0, x8, #0xff
227
+ ; CHECK-NEXT: and w0, w1, w8
237
228
; CHECK-NEXT: ret
238
229
;
239
230
; CHECKBE-LABEL: load8_and16_zext:
240
231
; CHECKBE: // %bb.0:
241
232
; CHECKBE-NEXT: ldrb w8, [x0]
242
- ; CHECKBE-NEXT: and w8, w1, w8
243
- ; CHECKBE-NEXT: and x0, x8, #0xff
233
+ ; CHECKBE-NEXT: and w0, w1, w8
244
234
; CHECKBE-NEXT: ret
245
235
%x = load i8 , i8* %p , align 4
246
236
%xz = zext i8 %x to i64
@@ -296,16 +286,14 @@ define i64 @load8_and16_or(i8* %p, i64 %y) {
296
286
define i64 @load16_and8_manyext (i16* %p , i32 %y ) {
297
287
; CHECK-LABEL: load16_and8_manyext:
298
288
; CHECK: // %bb.0:
299
- ; CHECK-NEXT: ldrh w8, [x0]
300
- ; CHECK-NEXT: and w8, w1, w8
301
- ; CHECK-NEXT: and x0, x8, #0xff
289
+ ; CHECK-NEXT: ldrb w8, [x0]
290
+ ; CHECK-NEXT: and w0, w1, w8
302
291
; CHECK-NEXT: ret
303
292
;
304
293
; CHECKBE-LABEL: load16_and8_manyext:
305
294
; CHECKBE: // %bb.0:
306
- ; CHECKBE-NEXT: ldrh w8, [x0]
307
- ; CHECKBE-NEXT: and w8, w1, w8
308
- ; CHECKBE-NEXT: and x0, x8, #0xff
295
+ ; CHECKBE-NEXT: ldrb w8, [x0, #1]
296
+ ; CHECKBE-NEXT: and w0, w1, w8
309
297
; CHECKBE-NEXT: ret
310
298
%x = load i16 , i16* %p , align 4
311
299
%xz = zext i16 %x to i32
@@ -318,18 +306,16 @@ define i64 @load16_and8_manyext(i16* %p, i32 %y) {
318
306
define i64 @multiple_load (i16* %p , i32* %q ) {
319
307
; CHECK-LABEL: multiple_load:
320
308
; CHECK: // %bb.0:
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
309
+ ; CHECK-NEXT: ldrb w8, [x0]
310
+ ; CHECK-NEXT: ldrb w9, [x1]
311
+ ; CHECK-NEXT: and w0, w9, w8
325
312
; CHECK-NEXT: ret
326
313
;
327
314
; CHECKBE-LABEL: multiple_load:
328
315
; CHECKBE: // %bb.0:
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
316
+ ; CHECKBE-NEXT: ldrb w8, [x0, #1]
317
+ ; CHECKBE-NEXT: ldrb w9, [x1, #3]
318
+ ; CHECKBE-NEXT: and w0, w9, w8
333
319
; CHECKBE-NEXT: ret
334
320
%x = load i16 , i16* %p , align 4
335
321
%xz = zext i16 %x to i64
@@ -343,18 +329,16 @@ define i64 @multiple_load(i16* %p, i32* %q) {
343
329
define i64 @multiple_load_or (i16* %p , i32* %q ) {
344
330
; CHECK-LABEL: multiple_load_or:
345
331
; CHECK: // %bb.0:
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
332
+ ; CHECK-NEXT: ldrb w8, [x0]
333
+ ; CHECK-NEXT: ldrb w9, [x1]
334
+ ; CHECK-NEXT: orr w0, w9, w8
350
335
; CHECK-NEXT: ret
351
336
;
352
337
; CHECKBE-LABEL: multiple_load_or:
353
338
; CHECKBE: // %bb.0:
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
339
+ ; CHECKBE-NEXT: ldrb w8, [x0, #1]
340
+ ; CHECKBE-NEXT: ldrb w9, [x1, #3]
341
+ ; CHECKBE-NEXT: orr w0, w9, w8
358
342
; CHECKBE-NEXT: ret
359
343
%x = load i16 , i16* %p , align 4
360
344
%xz = zext i16 %x to i64
@@ -368,16 +352,16 @@ define i64 @multiple_load_or(i16* %p, i32* %q) {
368
352
define i64 @load32_and16_zexty (i32* %p , i32 %y ) {
369
353
; CHECK-LABEL: load32_and16_zexty:
370
354
; CHECK: // %bb.0:
371
- ; CHECK-NEXT: ldr w8, [x0]
372
- ; CHECK-NEXT: orr w8 , w1, w8
373
- ; CHECK-NEXT: and x0, x8, #0xffff
355
+ ; CHECK-NEXT: ldrh w8, [x0]
356
+ ; CHECK-NEXT: and w9 , w1, #0xffff
357
+ ; CHECK-NEXT: orr w0, w9, w8
374
358
; CHECK-NEXT: ret
375
359
;
376
360
; CHECKBE-LABEL: load32_and16_zexty:
377
361
; CHECKBE: // %bb.0:
378
- ; CHECKBE-NEXT: ldr w8, [x0]
379
- ; CHECKBE-NEXT: orr w8 , w1, w8
380
- ; CHECKBE-NEXT: and x0, x8, #0xffff
362
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
363
+ ; CHECKBE-NEXT: and w9 , w1, #0xffff
364
+ ; CHECKBE-NEXT: orr w0, w9, w8
381
365
; CHECKBE-NEXT: ret
382
366
%x = load i32 , i32* %p , align 4
383
367
%xz = zext i32 %x to i64
@@ -390,16 +374,16 @@ define i64 @load32_and16_zexty(i32* %p, i32 %y) {
390
374
define i64 @load32_and16_sexty (i32* %p , i32 %y ) {
391
375
; CHECK-LABEL: load32_and16_sexty:
392
376
; CHECK: // %bb.0:
393
- ; CHECK-NEXT: ldr w8, [x0]
394
- ; CHECK-NEXT: orr w8 , w1, w8
395
- ; CHECK-NEXT: and x0, x8, #0xffff
377
+ ; CHECK-NEXT: ldrh w8, [x0]
378
+ ; CHECK-NEXT: and w9 , w1, #0xffff
379
+ ; CHECK-NEXT: orr w0, w9, w8
396
380
; CHECK-NEXT: ret
397
381
;
398
382
; CHECKBE-LABEL: load32_and16_sexty:
399
383
; CHECKBE: // %bb.0:
400
- ; CHECKBE-NEXT: ldr w8, [x0]
401
- ; CHECKBE-NEXT: orr w8 , w1, w8
402
- ; CHECKBE-NEXT: and x0, x8, #0xffff
384
+ ; CHECKBE-NEXT: ldrh w8, [x0, #2 ]
385
+ ; CHECKBE-NEXT: and w9 , w1, #0xffff
386
+ ; CHECKBE-NEXT: orr w0, w9, w8
403
387
; CHECKBE-NEXT: ret
404
388
%x = load i32 , i32* %p , align 4
405
389
%xz = zext i32 %x to i64
@@ -408,3 +392,49 @@ define i64 @load32_and16_sexty(i32* %p, i32 %y) {
408
392
%r = and i64 %a , 65535
409
393
ret i64 %r
410
394
}
395
+
396
+ define zeroext i1 @bigger (i8* nocapture readonly %c , i8* nocapture readonly %e , i64 %d , i64 %p1 ) {
397
+ ; CHECK-LABEL: bigger:
398
+ ; CHECK: // %bb.0: // %entry
399
+ ; CHECK-NEXT: ldrb w8, [x0, x2]
400
+ ; CHECK-NEXT: and w10, w3, #0x7
401
+ ; CHECK-NEXT: ldrb w9, [x1, x2]
402
+ ; CHECK-NEXT: mov w11, #8
403
+ ; CHECK-NEXT: sub w10, w11, w10
404
+ ; CHECK-NEXT: eor w8, w9, w8
405
+ ; CHECK-NEXT: mov w9, #5
406
+ ; CHECK-NEXT: lsr w8, w8, w10
407
+ ; CHECK-NEXT: tst w8, w9
408
+ ; CHECK-NEXT: cset w0, eq
409
+ ; CHECK-NEXT: ret
410
+ ;
411
+ ; CHECKBE-LABEL: bigger:
412
+ ; CHECKBE: // %bb.0: // %entry
413
+ ; CHECKBE-NEXT: ldrb w8, [x0, x2]
414
+ ; CHECKBE-NEXT: and w10, w3, #0x7
415
+ ; CHECKBE-NEXT: ldrb w9, [x1, x2]
416
+ ; CHECKBE-NEXT: mov w11, #8
417
+ ; CHECKBE-NEXT: sub w10, w11, w10
418
+ ; CHECKBE-NEXT: eor w8, w9, w8
419
+ ; CHECKBE-NEXT: mov w9, #5
420
+ ; CHECKBE-NEXT: lsr w8, w8, w10
421
+ ; CHECKBE-NEXT: tst w8, w9
422
+ ; CHECKBE-NEXT: cset w0, eq
423
+ ; CHECKBE-NEXT: ret
424
+ entry:
425
+ %0 = trunc i64 %p1 to i16
426
+ %1 = and i16 %0 , 7
427
+ %sh_prom = sub nuw nsw i16 8 , %1
428
+ %shl = shl nuw nsw i16 5 , %sh_prom
429
+ %arrayidx = getelementptr inbounds i8 , i8* %c , i64 %d
430
+ %2 = load i8 , i8* %arrayidx , align 1
431
+ %3 = and i16 %shl , 255
432
+ %conv2 = zext i16 %3 to i32
433
+ %arrayidx3 = getelementptr inbounds i8 , i8* %e , i64 %d
434
+ %4 = load i8 , i8* %arrayidx3 , align 1
435
+ %5 = xor i8 %4 , %2
436
+ %6 = zext i8 %5 to i32
437
+ %7 = and i32 %6 , %conv2
438
+ %cmp.not = icmp eq i32 %7 , 0
439
+ ret i1 %cmp.not
440
+ }
0 commit comments