1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+tbm < %s | FileCheck %s
4 ; TODO - Patterns fail to fold with ZF flags and prevents TBM instruction selection.
6 define i32 @test_x86_tbm_bextri_u32(i32 %a) nounwind {
7 ; CHECK-LABEL: test_x86_tbm_bextri_u32:
9 ; CHECK-NEXT: bextr $3076, %edi, %eax # imm = 0xC04
12 %t1 = and i32 %t0, 4095
16 ; Make sure we still use AH subreg trick for extracting bits 15:8
17 define i32 @test_x86_tbm_bextri_u32_subreg(i32 %a) nounwind {
18 ; CHECK-LABEL: test_x86_tbm_bextri_u32_subreg:
20 ; CHECK-NEXT: movl %edi, %eax
21 ; CHECK-NEXT: movzbl %ah, %eax # NOREX
24 %t1 = and i32 %t0, 255
28 define i32 @test_x86_tbm_bextri_u32_m(i32* nocapture %a) nounwind {
29 ; CHECK-LABEL: test_x86_tbm_bextri_u32_m:
31 ; CHECK-NEXT: bextr $3076, (%rdi), %eax # imm = 0xC04
33 %t0 = load i32, i32* %a
35 %t2 = and i32 %t1, 4095
39 define i32 @test_x86_tbm_bextri_u32_z(i32 %a, i32 %b) nounwind {
40 ; CHECK-LABEL: test_x86_tbm_bextri_u32_z:
42 ; CHECK-NEXT: bextr $3076, %edi, %eax # imm = 0xC04
43 ; CHECK-NEXT: cmovel %esi, %eax
46 %t1 = and i32 %t0, 4095
47 %t2 = icmp eq i32 %t1, 0
48 %t3 = select i1 %t2, i32 %b, i32 %t1
52 define i32 @test_x86_tbm_bextri_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
53 ; CHECK-LABEL: test_x86_tbm_bextri_u32_z2:
55 ; CHECK-NEXT: shrl $4, %edi
56 ; CHECK-NEXT: testl $4095, %edi # imm = 0xFFF
57 ; CHECK-NEXT: cmovnel %edx, %esi
58 ; CHECK-NEXT: movl %esi, %eax
61 %t1 = and i32 %t0, 4095
62 %t2 = icmp eq i32 %t1, 0
63 %t3 = select i1 %t2, i32 %b, i32 %c
67 define i64 @test_x86_tbm_bextri_u64(i64 %a) nounwind {
68 ; CHECK-LABEL: test_x86_tbm_bextri_u64:
70 ; CHECK-NEXT: bextr $3076, %edi, %eax # imm = 0xC04
73 %t1 = and i64 %t0, 4095
77 ; Make sure we still use AH subreg trick for extracting bits 15:8
78 define i64 @test_x86_tbm_bextri_u64_subreg(i64 %a) nounwind {
79 ; CHECK-LABEL: test_x86_tbm_bextri_u64_subreg:
81 ; CHECK-NEXT: movq %rdi, %rax
82 ; CHECK-NEXT: movzbl %ah, %eax # NOREX
85 %t1 = and i64 %t0, 255
89 define i64 @test_x86_tbm_bextri_u64_m(i64* nocapture %a) nounwind {
90 ; CHECK-LABEL: test_x86_tbm_bextri_u64_m:
92 ; CHECK-NEXT: bextr $3076, (%rdi), %eax # imm = 0xC04
94 %t0 = load i64, i64* %a
96 %t2 = and i64 %t1, 4095
100 define i64 @test_x86_tbm_bextri_u64_z(i64 %a, i64 %b) nounwind {
101 ; CHECK-LABEL: test_x86_tbm_bextri_u64_z:
103 ; CHECK-NEXT: bextr $3076, %edi, %eax # imm = 0xC04
104 ; CHECK-NEXT: cmoveq %rsi, %rax
107 %t1 = and i64 %t0, 4095
108 %t2 = icmp eq i64 %t1, 0
109 %t3 = select i1 %t2, i64 %b, i64 %t1
113 define i64 @test_x86_tbm_bextri_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
114 ; CHECK-LABEL: test_x86_tbm_bextri_u64_z2:
116 ; CHECK-NEXT: shrl $4, %edi
117 ; CHECK-NEXT: testl $4095, %edi # imm = 0xFFF
118 ; CHECK-NEXT: cmovneq %rdx, %rsi
119 ; CHECK-NEXT: movq %rsi, %rax
122 %t1 = and i64 %t0, 4095
123 %t2 = icmp eq i64 %t1, 0
124 %t3 = select i1 %t2, i64 %b, i64 %c
128 define i32 @test_x86_tbm_blcfill_u32(i32 %a) nounwind {
129 ; CHECK-LABEL: test_x86_tbm_blcfill_u32:
131 ; CHECK-NEXT: blcfill %edi, %eax
134 %t1 = and i32 %t0, %a
138 define i32 @test_x86_tbm_blcfill_u32_z(i32 %a, i32 %b) nounwind {
139 ; CHECK-LABEL: test_x86_tbm_blcfill_u32_z:
141 ; CHECK-NEXT: blcfill %edi, %eax
142 ; CHECK-NEXT: cmovel %esi, %eax
145 %t1 = and i32 %t0, %a
146 %t2 = icmp eq i32 %t1, 0
147 %t3 = select i1 %t2, i32 %b, i32 %t1
151 define i32 @test_x86_tbm_blcfill_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
152 ; CHECK-LABEL: test_x86_tbm_blcfill_u32_z2:
154 ; CHECK-NEXT: # kill: %edi<def> %edi<kill> %rdi<def>
155 ; CHECK-NEXT: leal 1(%rdi), %eax
156 ; CHECK-NEXT: testl %edi, %eax
157 ; CHECK-NEXT: cmovnel %edx, %esi
158 ; CHECK-NEXT: movl %esi, %eax
161 %t1 = and i32 %t0, %a
162 %t2 = icmp eq i32 %t1, 0
163 %t3 = select i1 %t2, i32 %b, i32 %c
167 define i64 @test_x86_tbm_blcfill_u64(i64 %a) nounwind {
168 ; CHECK-LABEL: test_x86_tbm_blcfill_u64:
170 ; CHECK-NEXT: blcfill %rdi, %rax
173 %t1 = and i64 %t0, %a
177 define i64 @test_x86_tbm_blcfill_u64_z(i64 %a, i64 %b) nounwind {
178 ; CHECK-LABEL: test_x86_tbm_blcfill_u64_z:
180 ; CHECK-NEXT: blcfill %rdi, %rax
181 ; CHECK-NEXT: cmoveq %rsi, %rax
184 %t1 = and i64 %t0, %a
185 %t2 = icmp eq i64 %t1, 0
186 %t3 = select i1 %t2, i64 %b, i64 %t1
190 define i64 @test_x86_tbm_blcfill_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
191 ; CHECK-LABEL: test_x86_tbm_blcfill_u64_z2:
193 ; CHECK-NEXT: leaq 1(%rdi), %rax
194 ; CHECK-NEXT: testq %rdi, %rax
195 ; CHECK-NEXT: cmovneq %rdx, %rsi
196 ; CHECK-NEXT: movq %rsi, %rax
199 %t1 = and i64 %t0, %a
200 %t2 = icmp eq i64 %t1, 0
201 %t3 = select i1 %t2, i64 %b, i64 %c
205 define i32 @test_x86_tbm_blci_u32(i32 %a) nounwind {
206 ; CHECK-LABEL: test_x86_tbm_blci_u32:
208 ; CHECK-NEXT: blci %edi, %eax
211 %t1 = xor i32 %t0, -1
216 define i32 @test_x86_tbm_blci_u32_z(i32 %a, i32 %b) nounwind {
217 ; CHECK-LABEL: test_x86_tbm_blci_u32_z:
219 ; CHECK-NEXT: blci %edi, %eax
220 ; CHECK-NEXT: cmovel %esi, %eax
223 %t1 = xor i32 %t0, -1
225 %t3 = icmp eq i32 %t2, 0
226 %t4 = select i1 %t3, i32 %b, i32 %t2
230 define i32 @test_x86_tbm_blci_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
231 ; CHECK-LABEL: test_x86_tbm_blci_u32_z2:
233 ; CHECK-NEXT: # kill: %edi<def> %edi<kill> %rdi<def>
234 ; CHECK-NEXT: leal 1(%rdi), %eax
235 ; CHECK-NEXT: notl %eax
236 ; CHECK-NEXT: orl %edi, %eax
237 ; CHECK-NEXT: cmovnel %edx, %esi
238 ; CHECK-NEXT: movl %esi, %eax
241 %t1 = xor i32 %t0, -1
243 %t3 = icmp eq i32 %t2, 0
244 %t4 = select i1 %t3, i32 %b, i32 %c
248 define i64 @test_x86_tbm_blci_u64(i64 %a) nounwind {
249 ; CHECK-LABEL: test_x86_tbm_blci_u64:
251 ; CHECK-NEXT: blci %rdi, %rax
254 %t1 = xor i64 %t0, -1
259 define i64 @test_x86_tbm_blci_u64_z(i64 %a, i64 %b) nounwind {
260 ; CHECK-LABEL: test_x86_tbm_blci_u64_z:
262 ; CHECK-NEXT: blci %rdi, %rax
263 ; CHECK-NEXT: cmoveq %rsi, %rax
266 %t1 = xor i64 %t0, -1
268 %t3 = icmp eq i64 %t2, 0
269 %t4 = select i1 %t3, i64 %b, i64 %t2
273 define i64 @test_x86_tbm_blci_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
274 ; CHECK-LABEL: test_x86_tbm_blci_u64_z2:
276 ; CHECK-NEXT: leaq 1(%rdi), %rax
277 ; CHECK-NEXT: notq %rax
278 ; CHECK-NEXT: orq %rdi, %rax
279 ; CHECK-NEXT: cmovneq %rdx, %rsi
280 ; CHECK-NEXT: movq %rsi, %rax
283 %t1 = xor i64 %t0, -1
285 %t3 = icmp eq i64 %t2, 0
286 %t4 = select i1 %t3, i64 %b, i64 %c
290 define i32 @test_x86_tbm_blci_u32_b(i32 %a) nounwind {
291 ; CHECK-LABEL: test_x86_tbm_blci_u32_b:
293 ; CHECK-NEXT: blci %edi, %eax
300 define i64 @test_x86_tbm_blci_u64_b(i64 %a) nounwind {
301 ; CHECK-LABEL: test_x86_tbm_blci_u64_b:
303 ; CHECK-NEXT: blci %rdi, %rax
310 define i32 @test_x86_tbm_blcic_u32(i32 %a) nounwind {
311 ; CHECK-LABEL: test_x86_tbm_blcic_u32:
313 ; CHECK-NEXT: blcic %edi, %eax
317 %t2 = and i32 %t1, %t0
321 define i32 @test_x86_tbm_blcic_u32_z(i32 %a, i32 %b) nounwind {
322 ; CHECK-LABEL: test_x86_tbm_blcic_u32_z:
324 ; CHECK-NEXT: blcic %edi, %eax
325 ; CHECK-NEXT: cmovel %esi, %eax
329 %t2 = and i32 %t1, %t0
330 %t3 = icmp eq i32 %t2, 0
331 %t4 = select i1 %t3, i32 %b, i32 %t2
335 define i32 @test_x86_tbm_blcic_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
336 ; CHECK-LABEL: test_x86_tbm_blcic_u32_z2:
338 ; CHECK-NEXT: movl %edi, %eax
339 ; CHECK-NEXT: notl %eax
340 ; CHECK-NEXT: incl %edi
341 ; CHECK-NEXT: testl %eax, %edi
342 ; CHECK-NEXT: cmovnel %edx, %esi
343 ; CHECK-NEXT: movl %esi, %eax
347 %t2 = and i32 %t1, %t0
348 %t3 = icmp eq i32 %t2, 0
349 %t4 = select i1 %t3, i32 %b, i32 %c
353 define i64 @test_x86_tbm_blcic_u64(i64 %a) nounwind {
354 ; CHECK-LABEL: test_x86_tbm_blcic_u64:
356 ; CHECK-NEXT: blcic %rdi, %rax
360 %t2 = and i64 %t1, %t0
364 define i64 @test_x86_tbm_blcic_u64_z(i64 %a, i64 %b) nounwind {
365 ; CHECK-LABEL: test_x86_tbm_blcic_u64_z:
367 ; CHECK-NEXT: blcic %rdi, %rax
368 ; CHECK-NEXT: cmoveq %rsi, %rax
372 %t2 = and i64 %t1, %t0
373 %t3 = icmp eq i64 %t2, 0
374 %t4 = select i1 %t3, i64 %b, i64 %t2
378 define i64 @test_x86_tbm_blcic_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
379 ; CHECK-LABEL: test_x86_tbm_blcic_u64_z2:
381 ; CHECK-NEXT: movq %rdi, %rax
382 ; CHECK-NEXT: notq %rax
383 ; CHECK-NEXT: incq %rdi
384 ; CHECK-NEXT: testq %rax, %rdi
385 ; CHECK-NEXT: cmovneq %rdx, %rsi
386 ; CHECK-NEXT: movq %rsi, %rax
390 %t2 = and i64 %t1, %t0
391 %t3 = icmp eq i64 %t2, 0
392 %t4 = select i1 %t3, i64 %b, i64 %c
396 define i32 @test_x86_tbm_blcmsk_u32(i32 %a) nounwind {
397 ; CHECK-LABEL: test_x86_tbm_blcmsk_u32:
399 ; CHECK-NEXT: blcmsk %edi, %eax
402 %t1 = xor i32 %t0, %a
406 define i32 @test_x86_tbm_blcmsk_u32_z(i32 %a, i32 %b) nounwind {
407 ; CHECK-LABEL: test_x86_tbm_blcmsk_u32_z:
409 ; CHECK-NEXT: blcmsk %edi, %eax
410 ; CHECK-NEXT: cmovel %esi, %eax
413 %t1 = xor i32 %t0, %a
414 %t2 = icmp eq i32 %t1, 0
415 %t3 = select i1 %t2, i32 %b, i32 %t1
419 define i32 @test_x86_tbm_blcmsk_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
420 ; CHECK-LABEL: test_x86_tbm_blcmsk_u32_z2:
422 ; CHECK-NEXT: # kill: %edi<def> %edi<kill> %rdi<def>
423 ; CHECK-NEXT: leal 1(%rdi), %eax
424 ; CHECK-NEXT: xorl %edi, %eax
425 ; CHECK-NEXT: cmovnel %edx, %esi
426 ; CHECK-NEXT: movl %esi, %eax
429 %t1 = xor i32 %t0, %a
430 %t2 = icmp eq i32 %t1, 0
431 %t3 = select i1 %t2, i32 %b, i32 %c
435 define i64 @test_x86_tbm_blcmsk_u64(i64 %a) nounwind {
436 ; CHECK-LABEL: test_x86_tbm_blcmsk_u64:
438 ; CHECK-NEXT: blcmsk %rdi, %rax
441 %t1 = xor i64 %t0, %a
445 define i64 @test_x86_tbm_blcmsk_u64_z(i64 %a, i64 %b) nounwind {
446 ; CHECK-LABEL: test_x86_tbm_blcmsk_u64_z:
448 ; CHECK-NEXT: blcmsk %rdi, %rax
449 ; CHECK-NEXT: cmoveq %rsi, %rax
452 %t1 = xor i64 %t0, %a
453 %t2 = icmp eq i64 %t1, 0
454 %t3 = select i1 %t2, i64 %b, i64 %t1
458 define i64 @test_x86_tbm_blcmsk_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
459 ; CHECK-LABEL: test_x86_tbm_blcmsk_u64_z2:
461 ; CHECK-NEXT: leaq 1(%rdi), %rax
462 ; CHECK-NEXT: xorq %rdi, %rax
463 ; CHECK-NEXT: cmovneq %rdx, %rsi
464 ; CHECK-NEXT: movq %rsi, %rax
467 %t1 = xor i64 %t0, %a
468 %t2 = icmp eq i64 %t1, 0
469 %t3 = select i1 %t2, i64 %b, i64 %c
473 define i32 @test_x86_tbm_blcs_u32(i32 %a) nounwind {
474 ; CHECK-LABEL: test_x86_tbm_blcs_u32:
476 ; CHECK-NEXT: blcs %edi, %eax
483 define i32 @test_x86_tbm_blcs_u32_z(i32 %a, i32 %b) nounwind {
484 ; CHECK-LABEL: test_x86_tbm_blcs_u32_z:
486 ; CHECK-NEXT: blcs %edi, %eax
487 ; CHECK-NEXT: cmovel %esi, %eax
491 %t2 = icmp eq i32 %t1, 0
492 %t3 = select i1 %t2, i32 %b, i32 %t1
496 define i32 @test_x86_tbm_blcs_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
497 ; CHECK-LABEL: test_x86_tbm_blcs_u32_z2:
499 ; CHECK-NEXT: # kill: %edi<def> %edi<kill> %rdi<def>
500 ; CHECK-NEXT: leal 1(%rdi), %eax
501 ; CHECK-NEXT: orl %edi, %eax
502 ; CHECK-NEXT: cmovnel %edx, %esi
503 ; CHECK-NEXT: movl %esi, %eax
507 %t2 = icmp eq i32 %t1, 0
508 %t3 = select i1 %t2, i32 %b, i32 %c
512 define i64 @test_x86_tbm_blcs_u64(i64 %a) nounwind {
513 ; CHECK-LABEL: test_x86_tbm_blcs_u64:
515 ; CHECK-NEXT: blcs %rdi, %rax
522 define i64 @test_x86_tbm_blcs_u64_z(i64 %a, i64 %b) nounwind {
523 ; CHECK-LABEL: test_x86_tbm_blcs_u64_z:
525 ; CHECK-NEXT: blcs %rdi, %rax
526 ; CHECK-NEXT: cmoveq %rsi, %rax
530 %t2 = icmp eq i64 %t1, 0
531 %t3 = select i1 %t2, i64 %b, i64 %t1
535 define i64 @test_x86_tbm_blcs_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
536 ; CHECK-LABEL: test_x86_tbm_blcs_u64_z2:
538 ; CHECK-NEXT: leaq 1(%rdi), %rax
539 ; CHECK-NEXT: orq %rdi, %rax
540 ; CHECK-NEXT: cmovneq %rdx, %rsi
541 ; CHECK-NEXT: movq %rsi, %rax
545 %t2 = icmp eq i64 %t1, 0
546 %t3 = select i1 %t2, i64 %b, i64 %c
550 define i32 @test_x86_tbm_blsfill_u32(i32 %a) nounwind {
551 ; CHECK-LABEL: test_x86_tbm_blsfill_u32:
553 ; CHECK-NEXT: blsfill %edi, %eax
560 define i32 @test_x86_tbm_blsfill_u32_z(i32 %a, i32 %b) nounwind {
561 ; CHECK-LABEL: test_x86_tbm_blsfill_u32_z:
563 ; CHECK-NEXT: blsfill %edi, %eax
564 ; CHECK-NEXT: cmovel %esi, %eax
568 %t2 = icmp eq i32 %t1, 0
569 %t3 = select i1 %t2, i32 %b, i32 %t1
573 define i32 @test_x86_tbm_blsfill_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
574 ; CHECK-LABEL: test_x86_tbm_blsfill_u32_z2:
576 ; CHECK-NEXT: # kill: %edi<def> %edi<kill> %rdi<def>
577 ; CHECK-NEXT: leal -1(%rdi), %eax
578 ; CHECK-NEXT: orl %edi, %eax
579 ; CHECK-NEXT: cmovnel %edx, %esi
580 ; CHECK-NEXT: movl %esi, %eax
584 %t2 = icmp eq i32 %t1, 0
585 %t3 = select i1 %t2, i32 %b, i32 %c
589 define i64 @test_x86_tbm_blsfill_u64(i64 %a) nounwind {
590 ; CHECK-LABEL: test_x86_tbm_blsfill_u64:
592 ; CHECK-NEXT: blsfill %rdi, %rax
599 define i64 @test_x86_tbm_blsfill_u64_z(i64 %a, i64 %b) nounwind {
600 ; CHECK-LABEL: test_x86_tbm_blsfill_u64_z:
602 ; CHECK-NEXT: blsfill %rdi, %rax
603 ; CHECK-NEXT: cmoveq %rsi, %rax
607 %t2 = icmp eq i64 %t1, 0
608 %t3 = select i1 %t2, i64 %b, i64 %t1
612 define i64 @test_x86_tbm_blsfill_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
613 ; CHECK-LABEL: test_x86_tbm_blsfill_u64_z2:
615 ; CHECK-NEXT: leaq -1(%rdi), %rax
616 ; CHECK-NEXT: orq %rdi, %rax
617 ; CHECK-NEXT: cmovneq %rdx, %rsi
618 ; CHECK-NEXT: movq %rsi, %rax
622 %t2 = icmp eq i64 %t1, 0
623 %t3 = select i1 %t2, i64 %b, i64 %c
627 define i32 @test_x86_tbm_blsic_u32(i32 %a) nounwind {
628 ; CHECK-LABEL: test_x86_tbm_blsic_u32:
630 ; CHECK-NEXT: blsic %edi, %eax
634 %t2 = or i32 %t0, %t1
638 define i32 @test_x86_tbm_blsic_u32_z(i32 %a, i32 %b) nounwind {
639 ; CHECK-LABEL: test_x86_tbm_blsic_u32_z:
641 ; CHECK-NEXT: blsic %edi, %eax
642 ; CHECK-NEXT: cmovel %esi, %eax
646 %t2 = or i32 %t0, %t1
647 %t3 = icmp eq i32 %t2, 0
648 %t4 = select i1 %t3, i32 %b, i32 %t2
652 define i32 @test_x86_tbm_blsic_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
653 ; CHECK-LABEL: test_x86_tbm_blsic_u32_z2:
655 ; CHECK-NEXT: movl %edi, %eax
656 ; CHECK-NEXT: notl %eax
657 ; CHECK-NEXT: decl %edi
658 ; CHECK-NEXT: orl %eax, %edi
659 ; CHECK-NEXT: cmovnel %edx, %esi
660 ; CHECK-NEXT: movl %esi, %eax
664 %t2 = or i32 %t0, %t1
665 %t3 = icmp eq i32 %t2, 0
666 %t4 = select i1 %t3, i32 %b, i32 %c
670 define i64 @test_x86_tbm_blsic_u64(i64 %a) nounwind {
671 ; CHECK-LABEL: test_x86_tbm_blsic_u64:
673 ; CHECK-NEXT: blsic %rdi, %rax
677 %t2 = or i64 %t0, %t1
681 define i64 @test_x86_tbm_blsic_u64_z(i64 %a, i64 %b) nounwind {
682 ; CHECK-LABEL: test_x86_tbm_blsic_u64_z:
684 ; CHECK-NEXT: blsic %rdi, %rax
685 ; CHECK-NEXT: cmoveq %rsi, %rax
689 %t2 = or i64 %t0, %t1
690 %t3 = icmp eq i64 %t2, 0
691 %t4 = select i1 %t3, i64 %b, i64 %t2
695 define i64 @test_x86_tbm_blsic_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
696 ; CHECK-LABEL: test_x86_tbm_blsic_u64_z2:
698 ; CHECK-NEXT: movq %rdi, %rax
699 ; CHECK-NEXT: notq %rax
700 ; CHECK-NEXT: decq %rdi
701 ; CHECK-NEXT: orq %rax, %rdi
702 ; CHECK-NEXT: cmovneq %rdx, %rsi
703 ; CHECK-NEXT: movq %rsi, %rax
707 %t2 = or i64 %t0, %t1
708 %t3 = icmp eq i64 %t2, 0
709 %t4 = select i1 %t3, i64 %b, i64 %c
713 define i32 @test_x86_tbm_t1mskc_u32(i32 %a) nounwind {
714 ; CHECK-LABEL: test_x86_tbm_t1mskc_u32:
716 ; CHECK-NEXT: t1mskc %edi, %eax
720 %t2 = or i32 %t0, %t1
724 define i32 @test_x86_tbm_t1mskc_u32_z(i32 %a, i32 %b) nounwind {
725 ; CHECK-LABEL: test_x86_tbm_t1mskc_u32_z:
727 ; CHECK-NEXT: t1mskc %edi, %eax
728 ; CHECK-NEXT: testl %eax, %eax
729 ; CHECK-NEXT: cmovel %esi, %eax
733 %t2 = or i32 %t0, %t1
734 %t3 = icmp eq i32 %t2, 0
735 %t4 = select i1 %t3, i32 %b, i32 %t2
739 define i32 @test_x86_tbm_t1mskc_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
740 ; CHECK-LABEL: test_x86_tbm_t1mskc_u32_z2:
742 ; CHECK-NEXT: movl %edi, %eax
743 ; CHECK-NEXT: notl %eax
744 ; CHECK-NEXT: incl %edi
745 ; CHECK-NEXT: orl %eax, %edi
746 ; CHECK-NEXT: cmovnel %edx, %esi
747 ; CHECK-NEXT: movl %esi, %eax
751 %t2 = or i32 %t0, %t1
752 %t3 = icmp eq i32 %t2, 0
753 %t4 = select i1 %t3, i32 %b, i32 %c
757 define i64 @test_x86_tbm_t1mskc_u64(i64 %a) nounwind {
758 ; CHECK-LABEL: test_x86_tbm_t1mskc_u64:
760 ; CHECK-NEXT: t1mskc %rdi, %rax
764 %t2 = or i64 %t0, %t1
768 define i64 @test_x86_tbm_t1mskc_u64_z(i64 %a, i64 %b) nounwind {
769 ; CHECK-LABEL: test_x86_tbm_t1mskc_u64_z:
771 ; CHECK-NEXT: t1mskc %rdi, %rax
772 ; CHECK-NEXT: testq %rax, %rax
773 ; CHECK-NEXT: cmoveq %rsi, %rax
777 %t2 = or i64 %t0, %t1
778 %t3 = icmp eq i64 %t2, 0
779 %t4 = select i1 %t3, i64 %b, i64 %t2
783 define i64 @test_x86_tbm_t1mskc_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
784 ; CHECK-LABEL: test_x86_tbm_t1mskc_u64_z2:
786 ; CHECK-NEXT: movq %rdi, %rax
787 ; CHECK-NEXT: notq %rax
788 ; CHECK-NEXT: incq %rdi
789 ; CHECK-NEXT: orq %rax, %rdi
790 ; CHECK-NEXT: cmovneq %rdx, %rsi
791 ; CHECK-NEXT: movq %rsi, %rax
795 %t2 = or i64 %t0, %t1
796 %t3 = icmp eq i64 %t2, 0
797 %t4 = select i1 %t3, i64 %b, i64 %c
801 define i32 @test_x86_tbm_tzmsk_u32(i32 %a) nounwind {
802 ; CHECK-LABEL: test_x86_tbm_tzmsk_u32:
804 ; CHECK-NEXT: tzmsk %edi, %eax
808 %t2 = and i32 %t0, %t1
812 define i32 @test_x86_tbm_tzmsk_u32_z(i32 %a, i32 %b) nounwind {
813 ; CHECK-LABEL: test_x86_tbm_tzmsk_u32_z:
815 ; CHECK-NEXT: tzmsk %edi, %eax
816 ; CHECK-NEXT: testl %eax, %eax
817 ; CHECK-NEXT: cmovel %esi, %eax
821 %t2 = and i32 %t0, %t1
822 %t3 = icmp eq i32 %t2, 0
823 %t4 = select i1 %t3, i32 %b, i32 %t2
827 define i32 @test_x86_tbm_tzmsk_u32_z2(i32 %a, i32 %b, i32 %c) nounwind {
828 ; CHECK-LABEL: test_x86_tbm_tzmsk_u32_z2:
830 ; CHECK-NEXT: movl %edi, %eax
831 ; CHECK-NEXT: notl %eax
832 ; CHECK-NEXT: decl %edi
833 ; CHECK-NEXT: testl %edi, %eax
834 ; CHECK-NEXT: cmovnel %edx, %esi
835 ; CHECK-NEXT: movl %esi, %eax
839 %t2 = and i32 %t0, %t1
840 %t3 = icmp eq i32 %t2, 0
841 %t4 = select i1 %t3, i32 %b, i32 %c
845 define i64 @test_x86_tbm_tzmsk_u64(i64 %a) nounwind {
846 ; CHECK-LABEL: test_x86_tbm_tzmsk_u64:
848 ; CHECK-NEXT: tzmsk %rdi, %rax
852 %t2 = and i64 %t0, %t1
856 define i64 @test_x86_tbm_tzmsk_u64_z(i64 %a, i64 %b) nounwind {
857 ; CHECK-LABEL: test_x86_tbm_tzmsk_u64_z:
859 ; CHECK-NEXT: tzmsk %rdi, %rax
860 ; CHECK-NEXT: testq %rax, %rax
861 ; CHECK-NEXT: cmoveq %rsi, %rax
865 %t2 = and i64 %t0, %t1
866 %t3 = icmp eq i64 %t2, 0
867 %t4 = select i1 %t3, i64 %b, i64 %t2
871 define i64 @test_x86_tbm_tzmsk_u64_z2(i64 %a, i64 %b, i64 %c) nounwind {
872 ; CHECK-LABEL: test_x86_tbm_tzmsk_u64_z2:
874 ; CHECK-NEXT: movq %rdi, %rax
875 ; CHECK-NEXT: notq %rax
876 ; CHECK-NEXT: decq %rdi
877 ; CHECK-NEXT: testq %rdi, %rax
878 ; CHECK-NEXT: cmovneq %rdx, %rsi
879 ; CHECK-NEXT: movq %rsi, %rax
883 %t2 = and i64 %t0, %t1
884 %t3 = icmp eq i64 %t2, 0
885 %t4 = select i1 %t3, i64 %b, i64 %c
889 define i64 @test_and_large_constant_mask(i64 %x) {
890 ; CHECK-LABEL: test_and_large_constant_mask:
891 ; CHECK: # BB#0: # %entry
892 ; CHECK-NEXT: bextr $15872, %rdi, %rax # imm = 0x3E00
895 %and = and i64 %x, 4611686018427387903
899 define i64 @test_and_large_constant_mask_load(i64* %x) {
900 ; CHECK-LABEL: test_and_large_constant_mask_load:
901 ; CHECK: # BB#0: # %entry
902 ; CHECK-NEXT: bextr $15872, (%rdi), %rax # imm = 0x3E00
905 %x1 = load i64, i64* %x
906 %and = and i64 %x1, 4611686018427387903