1e3e9c940SNoah Goldstein; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2e3e9c940SNoah Goldstein; RUN: llc < %s -mtriple=i686-pc-linux-gnu | FileCheck %s --check-prefix=X86 3e3e9c940SNoah Goldstein; RUN: llc < %s -mtriple=x86_64-pc-linux-gnu | FileCheck %s --check-prefix=X64 4e3e9c940SNoah Goldstein 5e3e9c940SNoah Goldsteindefine i32 @from_cmpeq(i32 %xx, i32 %y) { 6e3e9c940SNoah Goldstein; X86-LABEL: from_cmpeq: 7e3e9c940SNoah Goldstein; X86: # %bb.0: 8e3e9c940SNoah Goldstein; X86-NEXT: xorl %eax, %eax 9*de7881ebSNoah Goldstein; X86-NEXT: cmpl $9, {{[0-9]+}}(%esp) 10*de7881ebSNoah Goldstein; X86-NEXT: sete %al 11*de7881ebSNoah Goldstein; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 12e3e9c940SNoah Goldstein; X86-NEXT: retl 13e3e9c940SNoah Goldstein; 14e3e9c940SNoah Goldstein; X64-LABEL: from_cmpeq: 15e3e9c940SNoah Goldstein; X64: # %bb.0: 16e3e9c940SNoah Goldstein; X64-NEXT: xorl %eax, %eax 17e3e9c940SNoah Goldstein; X64-NEXT: cmpl $9, %edi 18*de7881ebSNoah Goldstein; X64-NEXT: sete %al 19*de7881ebSNoah Goldstein; X64-NEXT: andl %esi, %eax 20e3e9c940SNoah Goldstein; X64-NEXT: retq 21e3e9c940SNoah Goldstein %x = icmp eq i32 %xx, 9 22e3e9c940SNoah Goldstein %masked = and i32 %y, 1 23e3e9c940SNoah Goldstein 24e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 0 25e3e9c940SNoah Goldstein ret i32 %r 26e3e9c940SNoah Goldstein} 27e3e9c940SNoah Goldstein 28e3e9c940SNoah Goldsteindefine i32 @from_cmpeq_fail_bad_andmask(i32 %xx, i32 %y) { 29e3e9c940SNoah Goldstein; X86-LABEL: from_cmpeq_fail_bad_andmask: 30e3e9c940SNoah Goldstein; X86: # %bb.0: 31e3e9c940SNoah Goldstein; X86-NEXT: cmpl $9, {{[0-9]+}}(%esp) 32e3e9c940SNoah Goldstein; X86-NEXT: je .LBB1_1 33e3e9c940SNoah Goldstein; X86-NEXT: # %bb.2: 34e3e9c940SNoah Goldstein; X86-NEXT: xorl %eax, %eax 35e3e9c940SNoah Goldstein; X86-NEXT: retl 36e3e9c940SNoah Goldstein; X86-NEXT: .LBB1_1: 37e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 38e3e9c940SNoah Goldstein; X86-NEXT: andl $3, %eax 39e3e9c940SNoah Goldstein; X86-NEXT: retl 40e3e9c940SNoah Goldstein; 41e3e9c940SNoah Goldstein; X64-LABEL: from_cmpeq_fail_bad_andmask: 42e3e9c940SNoah Goldstein; X64: # %bb.0: 43e3e9c940SNoah Goldstein; X64-NEXT: andl $3, %esi 44e3e9c940SNoah Goldstein; X64-NEXT: xorl %eax, %eax 45e3e9c940SNoah Goldstein; X64-NEXT: cmpl $9, %edi 46e3e9c940SNoah Goldstein; X64-NEXT: cmovel %esi, %eax 47e3e9c940SNoah Goldstein; X64-NEXT: retq 48e3e9c940SNoah Goldstein %x = icmp eq i32 %xx, 9 49e3e9c940SNoah Goldstein %masked = and i32 %y, 3 50e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 0 51e3e9c940SNoah Goldstein ret i32 %r 52e3e9c940SNoah Goldstein} 53e3e9c940SNoah Goldstein 54e3e9c940SNoah Goldsteindefine i32 @from_i1(i1 %x, i32 %y) { 55e3e9c940SNoah Goldstein; X86-LABEL: from_i1: 56e3e9c940SNoah Goldstein; X86: # %bb.0: 57e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 58*de7881ebSNoah Goldstein; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 59e3e9c940SNoah Goldstein; X86-NEXT: andl $1, %eax 60e3e9c940SNoah Goldstein; X86-NEXT: retl 61e3e9c940SNoah Goldstein; 62e3e9c940SNoah Goldstein; X64-LABEL: from_i1: 63e3e9c940SNoah Goldstein; X64: # %bb.0: 64*de7881ebSNoah Goldstein; X64-NEXT: movl %edi, %eax 65*de7881ebSNoah Goldstein; X64-NEXT: andl %esi, %eax 66*de7881ebSNoah Goldstein; X64-NEXT: andl $1, %eax 67e3e9c940SNoah Goldstein; X64-NEXT: retq 68e3e9c940SNoah Goldstein %masked = and i32 %y, 1 69e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 0 70e3e9c940SNoah Goldstein ret i32 %r 71e3e9c940SNoah Goldstein} 72e3e9c940SNoah Goldstein 73e3e9c940SNoah Goldsteindefine i32 @from_trunc_i8(i8 %xx, i32 %y) { 74e3e9c940SNoah Goldstein; X86-LABEL: from_trunc_i8: 75e3e9c940SNoah Goldstein; X86: # %bb.0: 76e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 77*de7881ebSNoah Goldstein; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 78e3e9c940SNoah Goldstein; X86-NEXT: andl $1, %eax 79e3e9c940SNoah Goldstein; X86-NEXT: retl 80e3e9c940SNoah Goldstein; 81e3e9c940SNoah Goldstein; X64-LABEL: from_trunc_i8: 82e3e9c940SNoah Goldstein; X64: # %bb.0: 83*de7881ebSNoah Goldstein; X64-NEXT: movl %edi, %eax 84*de7881ebSNoah Goldstein; X64-NEXT: andl %esi, %eax 85*de7881ebSNoah Goldstein; X64-NEXT: andl $1, %eax 86e3e9c940SNoah Goldstein; X64-NEXT: retq 87e3e9c940SNoah Goldstein %masked = and i32 %y, 1 88e3e9c940SNoah Goldstein %x = trunc i8 %xx to i1 89e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 0 90e3e9c940SNoah Goldstein ret i32 %r 91e3e9c940SNoah Goldstein} 92e3e9c940SNoah Goldstein 93e3e9c940SNoah Goldsteindefine i32 @from_trunc_i64(i64 %xx, i32 %y) { 94e3e9c940SNoah Goldstein; X86-LABEL: from_trunc_i64: 95e3e9c940SNoah Goldstein; X86: # %bb.0: 96e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 97*de7881ebSNoah Goldstein; X86-NEXT: andl {{[0-9]+}}(%esp), %eax 98e3e9c940SNoah Goldstein; X86-NEXT: andl $1, %eax 99e3e9c940SNoah Goldstein; X86-NEXT: retl 100e3e9c940SNoah Goldstein; 101e3e9c940SNoah Goldstein; X64-LABEL: from_trunc_i64: 102e3e9c940SNoah Goldstein; X64: # %bb.0: 103*de7881ebSNoah Goldstein; X64-NEXT: movq %rdi, %rax 104*de7881ebSNoah Goldstein; X64-NEXT: andl %esi, %eax 105*de7881ebSNoah Goldstein; X64-NEXT: andl $1, %eax 106*de7881ebSNoah Goldstein; X64-NEXT: # kill: def $eax killed $eax killed $rax 107e3e9c940SNoah Goldstein; X64-NEXT: retq 108e3e9c940SNoah Goldstein %masked = and i32 %y, 1 109e3e9c940SNoah Goldstein %x = trunc i64 %xx to i1 110e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 0 111e3e9c940SNoah Goldstein ret i32 %r 112e3e9c940SNoah Goldstein} 113e3e9c940SNoah Goldstein 114e3e9c940SNoah Goldsteindefine i32 @from_i1_fail_bad_select0(i1 %x, i32 %y) { 115e3e9c940SNoah Goldstein; X86-LABEL: from_i1_fail_bad_select0: 116e3e9c940SNoah Goldstein; X86: # %bb.0: 117e3e9c940SNoah Goldstein; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 118e3e9c940SNoah Goldstein; X86-NEXT: jne .LBB5_1 119e3e9c940SNoah Goldstein; X86-NEXT: # %bb.2: 120e3e9c940SNoah Goldstein; X86-NEXT: movl $1, %eax 121e3e9c940SNoah Goldstein; X86-NEXT: retl 122e3e9c940SNoah Goldstein; X86-NEXT: .LBB5_1: 123e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 124e3e9c940SNoah Goldstein; X86-NEXT: andl $1, %eax 125e3e9c940SNoah Goldstein; X86-NEXT: retl 126e3e9c940SNoah Goldstein; 127e3e9c940SNoah Goldstein; X64-LABEL: from_i1_fail_bad_select0: 128e3e9c940SNoah Goldstein; X64: # %bb.0: 129e3e9c940SNoah Goldstein; X64-NEXT: andl $1, %esi 130e3e9c940SNoah Goldstein; X64-NEXT: testb $1, %dil 131e3e9c940SNoah Goldstein; X64-NEXT: movl $1, %eax 132e3e9c940SNoah Goldstein; X64-NEXT: cmovnel %esi, %eax 133e3e9c940SNoah Goldstein; X64-NEXT: retq 134e3e9c940SNoah Goldstein %masked = and i32 %y, 1 135e3e9c940SNoah Goldstein %r = select i1 %x, i32 %masked, i32 1 136e3e9c940SNoah Goldstein ret i32 %r 137e3e9c940SNoah Goldstein} 138e3e9c940SNoah Goldstein 139e3e9c940SNoah Goldsteindefine i32 @from_i1_fail_bad_select1(i1 %x, i32 %y) { 140e3e9c940SNoah Goldstein; X86-LABEL: from_i1_fail_bad_select1: 141e3e9c940SNoah Goldstein; X86: # %bb.0: 142e3e9c940SNoah Goldstein; X86-NEXT: xorl %eax, %eax 143e3e9c940SNoah Goldstein; X86-NEXT: testb $1, {{[0-9]+}}(%esp) 144e3e9c940SNoah Goldstein; X86-NEXT: jne .LBB6_2 145e3e9c940SNoah Goldstein; X86-NEXT: # %bb.1: 146e3e9c940SNoah Goldstein; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 147e3e9c940SNoah Goldstein; X86-NEXT: andl $1, %eax 148e3e9c940SNoah Goldstein; X86-NEXT: .LBB6_2: 149e3e9c940SNoah Goldstein; X86-NEXT: retl 150e3e9c940SNoah Goldstein; 151e3e9c940SNoah Goldstein; X64-LABEL: from_i1_fail_bad_select1: 152e3e9c940SNoah Goldstein; X64: # %bb.0: 153e3e9c940SNoah Goldstein; X64-NEXT: andl $1, %esi 154e3e9c940SNoah Goldstein; X64-NEXT: xorl %eax, %eax 155e3e9c940SNoah Goldstein; X64-NEXT: testb $1, %dil 156e3e9c940SNoah Goldstein; X64-NEXT: cmovel %esi, %eax 157e3e9c940SNoah Goldstein; X64-NEXT: retq 158e3e9c940SNoah Goldstein %masked = and i32 %y, 1 159e3e9c940SNoah Goldstein %r = select i1 %x, i32 0, i32 %masked 160e3e9c940SNoah Goldstein ret i32 %r 161e3e9c940SNoah Goldstein} 162