| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py |
| ; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s --check-prefix=X86 |
| ; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64 |
| |
| define i32 @from_cmpeq(i32 %xx, i32 %y) { |
| ; X86-LABEL: from_cmpeq: |
| ; X86: # %bb.0: |
| ; X86-NEXT: xorl %eax, %eax |
| ; X86-NEXT: cmpl $9, {{[0-9]+}}(%esp) |
| ; X86-NEXT: sete %al |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_cmpeq: |
| ; X64: # %bb.0: |
| ; X64-NEXT: xorl %eax, %eax |
| ; X64-NEXT: cmpl $9, %edi |
| ; X64-NEXT: sete %al |
| ; X64-NEXT: andl %esi, %eax |
| ; X64-NEXT: retq |
| %x = icmp eq i32 %xx, 9 |
| %masked = and i32 %y, 1 |
| |
| %r = select i1 %x, i32 %masked, i32 0 |
| ret i32 %r |
| } |
| |
| define i32 @from_cmpeq_fail_bad_andmask(i32 %xx, i32 %y) { |
| ; X86-LABEL: from_cmpeq_fail_bad_andmask: |
| ; X86: # %bb.0: |
| ; X86-NEXT: cmpl $9, {{[0-9]+}}(%esp) |
| ; X86-NEXT: je .LBB1_1 |
| ; X86-NEXT: # %bb.2: |
| ; X86-NEXT: xorl %eax, %eax |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB1_1: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $3, %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_cmpeq_fail_bad_andmask: |
| ; X64: # %bb.0: |
| ; X64-NEXT: andl $3, %esi |
| ; X64-NEXT: xorl %eax, %eax |
| ; X64-NEXT: cmpl $9, %edi |
| ; X64-NEXT: cmovel %esi, %eax |
| ; X64-NEXT: retq |
| %x = icmp eq i32 %xx, 9 |
| %masked = and i32 %y, 3 |
| %r = select i1 %x, i32 %masked, i32 0 |
| ret i32 %r |
| } |
| |
| define i32 @from_i1(i1 %x, i32 %y) { |
| ; X86-LABEL: from_i1: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $1, %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_i1: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movl %edi, %eax |
| ; X64-NEXT: andl %esi, %eax |
| ; X64-NEXT: andl $1, %eax |
| ; X64-NEXT: retq |
| %masked = and i32 %y, 1 |
| %r = select i1 %x, i32 %masked, i32 0 |
| ret i32 %r |
| } |
| |
| define i32 @from_trunc_i8(i8 %xx, i32 %y) { |
| ; X86-LABEL: from_trunc_i8: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $1, %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_trunc_i8: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movl %edi, %eax |
| ; X64-NEXT: andl %esi, %eax |
| ; X64-NEXT: andl $1, %eax |
| ; X64-NEXT: retq |
| %masked = and i32 %y, 1 |
| %x = trunc i8 %xx to i1 |
| %r = select i1 %x, i32 %masked, i32 0 |
| ret i32 %r |
| } |
| |
| define i32 @from_trunc_i64(i64 %xx, i32 %y) { |
| ; X86-LABEL: from_trunc_i64: |
| ; X86: # %bb.0: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $1, %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_trunc_i64: |
| ; X64: # %bb.0: |
| ; X64-NEXT: movq %rdi, %rax |
| ; X64-NEXT: andl %esi, %eax |
| ; X64-NEXT: andl $1, %eax |
| ; X64-NEXT: # kill: def $eax killed $eax killed $rax |
| ; X64-NEXT: retq |
| %masked = and i32 %y, 1 |
| %x = trunc i64 %xx to i1 |
| %r = select i1 %x, i32 %masked, i32 0 |
| ret i32 %r |
| } |
| |
| define i32 @from_i1_fail_bad_select0(i1 %x, i32 %y) { |
| ; X86-LABEL: from_i1_fail_bad_select0: |
| ; X86: # %bb.0: |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) |
| ; X86-NEXT: jne .LBB5_1 |
| ; X86-NEXT: # %bb.2: |
| ; X86-NEXT: movl $1, %eax |
| ; X86-NEXT: retl |
| ; X86-NEXT: .LBB5_1: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $1, %eax |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_i1_fail_bad_select0: |
| ; X64: # %bb.0: |
| ; X64-NEXT: andl $1, %esi |
| ; X64-NEXT: testb $1, %dil |
| ; X64-NEXT: movl $1, %eax |
| ; X64-NEXT: cmovnel %esi, %eax |
| ; X64-NEXT: retq |
| %masked = and i32 %y, 1 |
| %r = select i1 %x, i32 %masked, i32 1 |
| ret i32 %r |
| } |
| |
| define i32 @from_i1_fail_bad_select1(i1 %x, i32 %y) { |
| ; X86-LABEL: from_i1_fail_bad_select1: |
| ; X86: # %bb.0: |
| ; X86-NEXT: xorl %eax, %eax |
| ; X86-NEXT: testb $1, {{[0-9]+}}(%esp) |
| ; X86-NEXT: jne .LBB6_2 |
| ; X86-NEXT: # %bb.1: |
| ; X86-NEXT: movl {{[0-9]+}}(%esp), %eax |
| ; X86-NEXT: andl $1, %eax |
| ; X86-NEXT: .LBB6_2: |
| ; X86-NEXT: retl |
| ; |
| ; X64-LABEL: from_i1_fail_bad_select1: |
| ; X64: # %bb.0: |
| ; X64-NEXT: andl $1, %esi |
| ; X64-NEXT: xorl %eax, %eax |
| ; X64-NEXT: testb $1, %dil |
| ; X64-NEXT: cmovel %esi, %eax |
| ; X64-NEXT: retq |
| %masked = and i32 %y, 1 |
| %r = select i1 %x, i32 0, i32 %masked |
| ret i32 %r |
| } |