21
21
define i32 @bzhi32_a0 (i32 %val , i32 %numlowbits ) nounwind {
22
22
; CHECK-LABEL: bzhi32_a0:
23
23
; CHECK: // %bb.0:
24
- ; CHECK-NEXT: mov w8, #1
24
+ ; CHECK-NEXT: mov w8, #1 // =0x1
25
25
; CHECK-NEXT: lsl w8, w8, w1
26
26
; CHECK-NEXT: sub w8, w8, #1
27
27
; CHECK-NEXT: and w0, w8, w0
@@ -35,7 +35,7 @@ define i32 @bzhi32_a0(i32 %val, i32 %numlowbits) nounwind {
35
35
define i32 @bzhi32_a1_indexzext (i32 %val , i8 zeroext %numlowbits ) nounwind {
36
36
; CHECK-LABEL: bzhi32_a1_indexzext:
37
37
; CHECK: // %bb.0:
38
- ; CHECK-NEXT: mov w8, #1
38
+ ; CHECK-NEXT: mov w8, #1 // =0x1
39
39
; CHECK-NEXT: lsl w8, w8, w1
40
40
; CHECK-NEXT: sub w8, w8, #1
41
41
; CHECK-NEXT: and w0, w8, w0
@@ -50,7 +50,7 @@ define i32 @bzhi32_a1_indexzext(i32 %val, i8 zeroext %numlowbits) nounwind {
50
50
define i32 @bzhi32_a2_load (ptr %w , i32 %numlowbits ) nounwind {
51
51
; CHECK-LABEL: bzhi32_a2_load:
52
52
; CHECK: // %bb.0:
53
- ; CHECK-NEXT: mov w8, #1
53
+ ; CHECK-NEXT: mov w8, #1 // =0x1
54
54
; CHECK-NEXT: ldr w9, [x0]
55
55
; CHECK-NEXT: lsl w8, w8, w1
56
56
; CHECK-NEXT: sub w8, w8, #1
@@ -66,7 +66,7 @@ define i32 @bzhi32_a2_load(ptr %w, i32 %numlowbits) nounwind {
66
66
define i32 @bzhi32_a3_load_indexzext (ptr %w , i8 zeroext %numlowbits ) nounwind {
67
67
; CHECK-LABEL: bzhi32_a3_load_indexzext:
68
68
; CHECK: // %bb.0:
69
- ; CHECK-NEXT: mov w8, #1
69
+ ; CHECK-NEXT: mov w8, #1 // =0x1
70
70
; CHECK-NEXT: ldr w9, [x0]
71
71
; CHECK-NEXT: lsl w8, w8, w1
72
72
; CHECK-NEXT: sub w8, w8, #1
@@ -83,7 +83,7 @@ define i32 @bzhi32_a3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
83
83
define i32 @bzhi32_a4_commutative (i32 %val , i32 %numlowbits ) nounwind {
84
84
; CHECK-LABEL: bzhi32_a4_commutative:
85
85
; CHECK: // %bb.0:
86
- ; CHECK-NEXT: mov w8, #1
86
+ ; CHECK-NEXT: mov w8, #1 // =0x1
87
87
; CHECK-NEXT: lsl w8, w8, w1
88
88
; CHECK-NEXT: sub w8, w8, #1
89
89
; CHECK-NEXT: and w0, w0, w8
@@ -99,7 +99,7 @@ define i32 @bzhi32_a4_commutative(i32 %val, i32 %numlowbits) nounwind {
99
99
define i64 @bzhi64_a0 (i64 %val , i64 %numlowbits ) nounwind {
100
100
; CHECK-LABEL: bzhi64_a0:
101
101
; CHECK: // %bb.0:
102
- ; CHECK-NEXT: mov w8, #1
102
+ ; CHECK-NEXT: mov w8, #1 // =0x1
103
103
; CHECK-NEXT: lsl x8, x8, x1
104
104
; CHECK-NEXT: sub x8, x8, #1
105
105
; CHECK-NEXT: and x0, x8, x0
@@ -110,10 +110,26 @@ define i64 @bzhi64_a0(i64 %val, i64 %numlowbits) nounwind {
110
110
ret i64 %masked
111
111
}
112
112
113
+ ; Check that we don't throw away the vreg_width-1 mask if not using shifts
114
+ define i64 @bzhi64_a0_masked (i64 %val , i64 %numlowbits ) nounwind {
115
+ ; CHECK-LABEL: bzhi64_a0_masked:
116
+ ; CHECK: // %bb.0:
117
+ ; CHECK-NEXT: mov w8, #1 // =0x1
118
+ ; CHECK-NEXT: lsl x8, x8, x1
119
+ ; CHECK-NEXT: sub x8, x8, #1
120
+ ; CHECK-NEXT: and x0, x8, x0
121
+ ; CHECK-NEXT: ret
122
+ %numlowbits.masked = and i64 %numlowbits , 63
123
+ %onebit = shl i64 1 , %numlowbits.masked
124
+ %mask = add nsw i64 %onebit , -1
125
+ %masked = and i64 %mask , %val
126
+ ret i64 %masked
127
+ }
128
+
113
129
define i64 @bzhi64_a1_indexzext (i64 %val , i8 zeroext %numlowbits ) nounwind {
114
130
; CHECK-LABEL: bzhi64_a1_indexzext:
115
131
; CHECK: // %bb.0:
116
- ; CHECK-NEXT: mov w8, #1
132
+ ; CHECK-NEXT: mov w8, #1 // =0x1
117
133
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
118
134
; CHECK-NEXT: lsl x8, x8, x1
119
135
; CHECK-NEXT: sub x8, x8, #1
@@ -129,7 +145,7 @@ define i64 @bzhi64_a1_indexzext(i64 %val, i8 zeroext %numlowbits) nounwind {
129
145
define i64 @bzhi64_a2_load (ptr %w , i64 %numlowbits ) nounwind {
130
146
; CHECK-LABEL: bzhi64_a2_load:
131
147
; CHECK: // %bb.0:
132
- ; CHECK-NEXT: mov w8, #1
148
+ ; CHECK-NEXT: mov w8, #1 // =0x1
133
149
; CHECK-NEXT: ldr x9, [x0]
134
150
; CHECK-NEXT: lsl x8, x8, x1
135
151
; CHECK-NEXT: sub x8, x8, #1
@@ -145,7 +161,7 @@ define i64 @bzhi64_a2_load(ptr %w, i64 %numlowbits) nounwind {
145
161
define i64 @bzhi64_a3_load_indexzext (ptr %w , i8 zeroext %numlowbits ) nounwind {
146
162
; CHECK-LABEL: bzhi64_a3_load_indexzext:
147
163
; CHECK: // %bb.0:
148
- ; CHECK-NEXT: mov w8, #1
164
+ ; CHECK-NEXT: mov w8, #1 // =0x1
149
165
; CHECK-NEXT: ldr x9, [x0]
150
166
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
151
167
; CHECK-NEXT: lsl x8, x8, x1
@@ -163,7 +179,7 @@ define i64 @bzhi64_a3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
163
179
define i64 @bzhi64_a4_commutative (i64 %val , i64 %numlowbits ) nounwind {
164
180
; CHECK-LABEL: bzhi64_a4_commutative:
165
181
; CHECK: // %bb.0:
166
- ; CHECK-NEXT: mov w8, #1
182
+ ; CHECK-NEXT: mov w8, #1 // =0x1
167
183
; CHECK-NEXT: lsl x8, x8, x1
168
184
; CHECK-NEXT: sub x8, x8, #1
169
185
; CHECK-NEXT: and x0, x0, x8
@@ -181,7 +197,7 @@ define i64 @bzhi64_a4_commutative(i64 %val, i64 %numlowbits) nounwind {
181
197
define i32 @bzhi32_b0 (i32 %val , i32 %numlowbits ) nounwind {
182
198
; CHECK-LABEL: bzhi32_b0:
183
199
; CHECK: // %bb.0:
184
- ; CHECK-NEXT: mov w8, #-1
200
+ ; CHECK-NEXT: mov w8, #-1 // =0xffffffff
185
201
; CHECK-NEXT: lsl w8, w8, w1
186
202
; CHECK-NEXT: bic w0, w0, w8
187
203
; CHECK-NEXT: ret
@@ -194,7 +210,7 @@ define i32 @bzhi32_b0(i32 %val, i32 %numlowbits) nounwind {
194
210
define i32 @bzhi32_b1_indexzext (i32 %val , i8 zeroext %numlowbits ) nounwind {
195
211
; CHECK-LABEL: bzhi32_b1_indexzext:
196
212
; CHECK: // %bb.0:
197
- ; CHECK-NEXT: mov w8, #-1
213
+ ; CHECK-NEXT: mov w8, #-1 // =0xffffffff
198
214
; CHECK-NEXT: lsl w8, w8, w1
199
215
; CHECK-NEXT: bic w0, w0, w8
200
216
; CHECK-NEXT: ret
@@ -209,7 +225,7 @@ define i32 @bzhi32_b2_load(ptr %w, i32 %numlowbits) nounwind {
209
225
; CHECK-LABEL: bzhi32_b2_load:
210
226
; CHECK: // %bb.0:
211
227
; CHECK-NEXT: ldr w8, [x0]
212
- ; CHECK-NEXT: mov w9, #-1
228
+ ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
213
229
; CHECK-NEXT: lsl w9, w9, w1
214
230
; CHECK-NEXT: bic w0, w8, w9
215
231
; CHECK-NEXT: ret
@@ -224,7 +240,7 @@ define i32 @bzhi32_b3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
224
240
; CHECK-LABEL: bzhi32_b3_load_indexzext:
225
241
; CHECK: // %bb.0:
226
242
; CHECK-NEXT: ldr w8, [x0]
227
- ; CHECK-NEXT: mov w9, #-1
243
+ ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
228
244
; CHECK-NEXT: lsl w9, w9, w1
229
245
; CHECK-NEXT: bic w0, w8, w9
230
246
; CHECK-NEXT: ret
@@ -239,7 +255,7 @@ define i32 @bzhi32_b3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
239
255
define i32 @bzhi32_b4_commutative (i32 %val , i32 %numlowbits ) nounwind {
240
256
; CHECK-LABEL: bzhi32_b4_commutative:
241
257
; CHECK: // %bb.0:
242
- ; CHECK-NEXT: mov w8, #-1
258
+ ; CHECK-NEXT: mov w8, #-1 // =0xffffffff
243
259
; CHECK-NEXT: lsl w8, w8, w1
244
260
; CHECK-NEXT: bic w0, w0, w8
245
261
; CHECK-NEXT: ret
@@ -254,7 +270,7 @@ define i32 @bzhi32_b4_commutative(i32 %val, i32 %numlowbits) nounwind {
254
270
define i64 @bzhi64_b0 (i64 %val , i64 %numlowbits ) nounwind {
255
271
; CHECK-LABEL: bzhi64_b0:
256
272
; CHECK: // %bb.0:
257
- ; CHECK-NEXT: mov x8, #-1
273
+ ; CHECK-NEXT: mov x8, #-1 // =0xffffffffffffffff
258
274
; CHECK-NEXT: lsl x8, x8, x1
259
275
; CHECK-NEXT: bic x0, x0, x8
260
276
; CHECK-NEXT: ret
@@ -267,7 +283,7 @@ define i64 @bzhi64_b0(i64 %val, i64 %numlowbits) nounwind {
267
283
define i64 @bzhi64_b1_indexzext (i64 %val , i8 zeroext %numlowbits ) nounwind {
268
284
; CHECK-LABEL: bzhi64_b1_indexzext:
269
285
; CHECK: // %bb.0:
270
- ; CHECK-NEXT: mov x8, #-1
286
+ ; CHECK-NEXT: mov x8, #-1 // =0xffffffffffffffff
271
287
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
272
288
; CHECK-NEXT: lsl x8, x8, x1
273
289
; CHECK-NEXT: bic x0, x0, x8
@@ -283,7 +299,7 @@ define i64 @bzhi64_b2_load(ptr %w, i64 %numlowbits) nounwind {
283
299
; CHECK-LABEL: bzhi64_b2_load:
284
300
; CHECK: // %bb.0:
285
301
; CHECK-NEXT: ldr x8, [x0]
286
- ; CHECK-NEXT: mov x9, #-1
302
+ ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
287
303
; CHECK-NEXT: lsl x9, x9, x1
288
304
; CHECK-NEXT: bic x0, x8, x9
289
305
; CHECK-NEXT: ret
@@ -298,7 +314,7 @@ define i64 @bzhi64_b3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
298
314
; CHECK-LABEL: bzhi64_b3_load_indexzext:
299
315
; CHECK: // %bb.0:
300
316
; CHECK-NEXT: ldr x8, [x0]
301
- ; CHECK-NEXT: mov x9, #-1
317
+ ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
302
318
; CHECK-NEXT: // kill: def $w1 killed $w1 def $x1
303
319
; CHECK-NEXT: lsl x9, x9, x1
304
320
; CHECK-NEXT: bic x0, x8, x9
@@ -314,7 +330,7 @@ define i64 @bzhi64_b3_load_indexzext(ptr %w, i8 zeroext %numlowbits) nounwind {
314
330
define i64 @bzhi64_b4_commutative (i64 %val , i64 %numlowbits ) nounwind {
315
331
; CHECK-LABEL: bzhi64_b4_commutative:
316
332
; CHECK: // %bb.0:
317
- ; CHECK-NEXT: mov x8, #-1
333
+ ; CHECK-NEXT: mov x8, #-1 // =0xffffffffffffffff
318
334
; CHECK-NEXT: lsl x8, x8, x1
319
335
; CHECK-NEXT: bic x0, x0, x8
320
336
; CHECK-NEXT: ret
@@ -332,7 +348,7 @@ define i32 @bzhi32_c0(i32 %val, i32 %numlowbits) nounwind {
332
348
; CHECK-LABEL: bzhi32_c0:
333
349
; CHECK: // %bb.0:
334
350
; CHECK-NEXT: neg w8, w1
335
- ; CHECK-NEXT: mov w9, #-1
351
+ ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
336
352
; CHECK-NEXT: lsr w8, w9, w8
337
353
; CHECK-NEXT: and w0, w8, w0
338
354
; CHECK-NEXT: ret
@@ -345,8 +361,8 @@ define i32 @bzhi32_c0(i32 %val, i32 %numlowbits) nounwind {
345
361
define i32 @bzhi32_c1_indexzext (i32 %val , i8 %numlowbits ) nounwind {
346
362
; CHECK-LABEL: bzhi32_c1_indexzext:
347
363
; CHECK: // %bb.0:
348
- ; CHECK-NEXT: mov w8, #32
349
- ; CHECK-NEXT: mov w9, #-1
364
+ ; CHECK-NEXT: mov w8, #32 // =0x20
365
+ ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
350
366
; CHECK-NEXT: sub w8, w8, w1
351
367
; CHECK-NEXT: lsr w8, w9, w8
352
368
; CHECK-NEXT: and w0, w8, w0
@@ -363,7 +379,7 @@ define i32 @bzhi32_c2_load(ptr %w, i32 %numlowbits) nounwind {
363
379
; CHECK: // %bb.0:
364
380
; CHECK-NEXT: neg w8, w1
365
381
; CHECK-NEXT: ldr w9, [x0]
366
- ; CHECK-NEXT: mov w10, #-1
382
+ ; CHECK-NEXT: mov w10, #-1 // =0xffffffff
367
383
; CHECK-NEXT: lsr w8, w10, w8
368
384
; CHECK-NEXT: and w0, w8, w9
369
385
; CHECK-NEXT: ret
@@ -377,10 +393,10 @@ define i32 @bzhi32_c2_load(ptr %w, i32 %numlowbits) nounwind {
377
393
define i32 @bzhi32_c3_load_indexzext (ptr %w , i8 %numlowbits ) nounwind {
378
394
; CHECK-LABEL: bzhi32_c3_load_indexzext:
379
395
; CHECK: // %bb.0:
380
- ; CHECK-NEXT: mov w8, #32
396
+ ; CHECK-NEXT: mov w8, #32 // =0x20
381
397
; CHECK-NEXT: ldr w9, [x0]
382
398
; CHECK-NEXT: sub w8, w8, w1
383
- ; CHECK-NEXT: mov w10, #-1
399
+ ; CHECK-NEXT: mov w10, #-1 // =0xffffffff
384
400
; CHECK-NEXT: lsr w8, w10, w8
385
401
; CHECK-NEXT: and w0, w8, w9
386
402
; CHECK-NEXT: ret
@@ -396,7 +412,7 @@ define i32 @bzhi32_c4_commutative(i32 %val, i32 %numlowbits) nounwind {
396
412
; CHECK-LABEL: bzhi32_c4_commutative:
397
413
; CHECK: // %bb.0:
398
414
; CHECK-NEXT: neg w8, w1
399
- ; CHECK-NEXT: mov w9, #-1
415
+ ; CHECK-NEXT: mov w9, #-1 // =0xffffffff
400
416
; CHECK-NEXT: lsr w8, w9, w8
401
417
; CHECK-NEXT: and w0, w0, w8
402
418
; CHECK-NEXT: ret
@@ -412,7 +428,7 @@ define i64 @bzhi64_c0(i64 %val, i64 %numlowbits) nounwind {
412
428
; CHECK-LABEL: bzhi64_c0:
413
429
; CHECK: // %bb.0:
414
430
; CHECK-NEXT: neg x8, x1
415
- ; CHECK-NEXT: mov x9, #-1
431
+ ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
416
432
; CHECK-NEXT: lsr x8, x9, x8
417
433
; CHECK-NEXT: and x0, x8, x0
418
434
; CHECK-NEXT: ret
@@ -425,8 +441,8 @@ define i64 @bzhi64_c0(i64 %val, i64 %numlowbits) nounwind {
425
441
define i64 @bzhi64_c1_indexzext (i64 %val , i8 %numlowbits ) nounwind {
426
442
; CHECK-LABEL: bzhi64_c1_indexzext:
427
443
; CHECK: // %bb.0:
428
- ; CHECK-NEXT: mov w8, #64
429
- ; CHECK-NEXT: mov x9, #-1
444
+ ; CHECK-NEXT: mov w8, #64 // =0x40
445
+ ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
430
446
; CHECK-NEXT: sub w8, w8, w1
431
447
; CHECK-NEXT: lsr x8, x9, x8
432
448
; CHECK-NEXT: and x0, x8, x0
@@ -443,7 +459,7 @@ define i64 @bzhi64_c2_load(ptr %w, i64 %numlowbits) nounwind {
443
459
; CHECK: // %bb.0:
444
460
; CHECK-NEXT: neg x8, x1
445
461
; CHECK-NEXT: ldr x9, [x0]
446
- ; CHECK-NEXT: mov x10, #-1
462
+ ; CHECK-NEXT: mov x10, #-1 // =0xffffffffffffffff
447
463
; CHECK-NEXT: lsr x8, x10, x8
448
464
; CHECK-NEXT: and x0, x8, x9
449
465
; CHECK-NEXT: ret
@@ -457,10 +473,10 @@ define i64 @bzhi64_c2_load(ptr %w, i64 %numlowbits) nounwind {
457
473
define i64 @bzhi64_c3_load_indexzext (ptr %w , i8 %numlowbits ) nounwind {
458
474
; CHECK-LABEL: bzhi64_c3_load_indexzext:
459
475
; CHECK: // %bb.0:
460
- ; CHECK-NEXT: mov w8, #64
476
+ ; CHECK-NEXT: mov w8, #64 // =0x40
461
477
; CHECK-NEXT: ldr x9, [x0]
462
478
; CHECK-NEXT: sub w8, w8, w1
463
- ; CHECK-NEXT: mov x10, #-1
479
+ ; CHECK-NEXT: mov x10, #-1 // =0xffffffffffffffff
464
480
; CHECK-NEXT: lsr x8, x10, x8
465
481
; CHECK-NEXT: and x0, x8, x9
466
482
; CHECK-NEXT: ret
@@ -476,7 +492,7 @@ define i64 @bzhi64_c4_commutative(i64 %val, i64 %numlowbits) nounwind {
476
492
; CHECK-LABEL: bzhi64_c4_commutative:
477
493
; CHECK: // %bb.0:
478
494
; CHECK-NEXT: neg x8, x1
479
- ; CHECK-NEXT: mov x9, #-1
495
+ ; CHECK-NEXT: mov x9, #-1 // =0xffffffffffffffff
480
496
; CHECK-NEXT: lsr x8, x9, x8
481
497
; CHECK-NEXT: and x0, x0, x8
482
498
; CHECK-NEXT: ret
@@ -506,7 +522,7 @@ define i32 @bzhi32_d0(i32 %val, i32 %numlowbits) nounwind {
506
522
define i32 @bzhi32_d1_indexzext (i32 %val , i8 %numlowbits ) nounwind {
507
523
; CHECK-LABEL: bzhi32_d1_indexzext:
508
524
; CHECK: // %bb.0:
509
- ; CHECK-NEXT: mov w8, #32
525
+ ; CHECK-NEXT: mov w8, #32 // =0x20
510
526
; CHECK-NEXT: sub w8, w8, w1
511
527
; CHECK-NEXT: lsl w9, w0, w8
512
528
; CHECK-NEXT: lsr w0, w9, w8
@@ -536,7 +552,7 @@ define i32 @bzhi32_d2_load(ptr %w, i32 %numlowbits) nounwind {
536
552
define i32 @bzhi32_d3_load_indexzext (ptr %w , i8 %numlowbits ) nounwind {
537
553
; CHECK-LABEL: bzhi32_d3_load_indexzext:
538
554
; CHECK: // %bb.0:
539
- ; CHECK-NEXT: mov w8, #32
555
+ ; CHECK-NEXT: mov w8, #32 // =0x20
540
556
; CHECK-NEXT: ldr w9, [x0]
541
557
; CHECK-NEXT: sub w8, w8, w1
542
558
; CHECK-NEXT: lsl w9, w9, w8
@@ -568,7 +584,7 @@ define i64 @bzhi64_d0(i64 %val, i64 %numlowbits) nounwind {
568
584
define i64 @bzhi64_d1_indexzext (i64 %val , i8 %numlowbits ) nounwind {
569
585
; CHECK-LABEL: bzhi64_d1_indexzext:
570
586
; CHECK: // %bb.0:
571
- ; CHECK-NEXT: mov w8, #64
587
+ ; CHECK-NEXT: mov w8, #64 // =0x40
572
588
; CHECK-NEXT: sub w8, w8, w1
573
589
; CHECK-NEXT: lsl x9, x0, x8
574
590
; CHECK-NEXT: lsr x0, x9, x8
@@ -598,7 +614,7 @@ define i64 @bzhi64_d2_load(ptr %w, i64 %numlowbits) nounwind {
598
614
define i64 @bzhi64_d3_load_indexzext (ptr %w , i8 %numlowbits ) nounwind {
599
615
; CHECK-LABEL: bzhi64_d3_load_indexzext:
600
616
; CHECK: // %bb.0:
601
- ; CHECK-NEXT: mov w8, #64
617
+ ; CHECK-NEXT: mov w8, #64 // =0x40
602
618
; CHECK-NEXT: ldr x9, [x0]
603
619
; CHECK-NEXT: sub w8, w8, w1
604
620
; CHECK-NEXT: lsl x9, x9, x8
0 commit comments