xref: /llvm-project/llvm/test/CodeGen/X86/select-to-and-zext.ll (revision de7881ebf5e112f978940cbff5582c19fab90eb1)
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