[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / bmi2.ll
blob114f9ac5479af1eaff2a4b949eee98ba40d107cf
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+bmi,+bmi2 | FileCheck %s --check-prefixes=CHECK,X86
3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi,+bmi2 | FileCheck %s --check-prefixes=CHECK,X64
5 define i32 @bzhi32(i32 %x, i32 %y)   {
6 ; X86-LABEL: bzhi32:
7 ; X86:       # %bb.0:
8 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
9 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
10 ; X86-NEXT:    addl %ecx, %ecx
11 ; X86-NEXT:    bzhil %eax, %ecx, %eax
12 ; X86-NEXT:    retl
14 ; X64-LABEL: bzhi32:
15 ; X64:       # %bb.0:
16 ; X64-NEXT:    addl %edi, %edi
17 ; X64-NEXT:    bzhil %esi, %edi, %eax
18 ; X64-NEXT:    retq
19   %x1 = add i32 %x, %x
20   %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x1, i32 %y)
21   ret i32 %tmp
24 define i32 @bzhi32_load(i32* %x, i32 %y)   {
25 ; X86-LABEL: bzhi32_load:
26 ; X86:       # %bb.0:
27 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
28 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
29 ; X86-NEXT:    bzhil %eax, (%ecx), %eax
30 ; X86-NEXT:    retl
32 ; X64-LABEL: bzhi32_load:
33 ; X64:       # %bb.0:
34 ; X64-NEXT:    bzhil %esi, (%rdi), %eax
35 ; X64-NEXT:    retq
36   %x1 = load i32, i32* %x
37   %tmp = tail call i32 @llvm.x86.bmi.bzhi.32(i32 %x1, i32 %y)
38   ret i32 %tmp
41 declare i32 @llvm.x86.bmi.bzhi.32(i32, i32)
43 define i32 @pdep32(i32 %x, i32 %y)   {
44 ; X86-LABEL: pdep32:
45 ; X86:       # %bb.0:
46 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
47 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
48 ; X86-NEXT:    addl %ecx, %ecx
49 ; X86-NEXT:    pdepl %ecx, %eax, %eax
50 ; X86-NEXT:    retl
52 ; X64-LABEL: pdep32:
53 ; X64:       # %bb.0:
54 ; X64-NEXT:    addl %esi, %esi
55 ; X64-NEXT:    pdepl %esi, %edi, %eax
56 ; X64-NEXT:    retq
57   %y1 = add i32 %y, %y
58   %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y1)
59   ret i32 %tmp
62 define i32 @pdep32_load(i32 %x, i32* %y)   {
63 ; X86-LABEL: pdep32_load:
64 ; X86:       # %bb.0:
65 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
66 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
67 ; X86-NEXT:    pdepl (%eax), %ecx, %eax
68 ; X86-NEXT:    retl
70 ; X64-LABEL: pdep32_load:
71 ; X64:       # %bb.0:
72 ; X64-NEXT:    pdepl (%rsi), %edi, %eax
73 ; X64-NEXT:    retq
74   %y1 = load i32, i32* %y
75   %tmp = tail call i32 @llvm.x86.bmi.pdep.32(i32 %x, i32 %y1)
76   ret i32 %tmp
79 declare i32 @llvm.x86.bmi.pdep.32(i32, i32)
81 define i32 @pext32(i32 %x, i32 %y)   {
82 ; X86-LABEL: pext32:
83 ; X86:       # %bb.0:
84 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
85 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
86 ; X86-NEXT:    addl %ecx, %ecx
87 ; X86-NEXT:    pextl %ecx, %eax, %eax
88 ; X86-NEXT:    retl
90 ; X64-LABEL: pext32:
91 ; X64:       # %bb.0:
92 ; X64-NEXT:    addl %esi, %esi
93 ; X64-NEXT:    pextl %esi, %edi, %eax
94 ; X64-NEXT:    retq
95   %y1 = add i32 %y, %y
96   %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y1)
97   ret i32 %tmp
100 define i32 @pext32_load(i32 %x, i32* %y)   {
101 ; X86-LABEL: pext32_load:
102 ; X86:       # %bb.0:
103 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
104 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
105 ; X86-NEXT:    pextl (%eax), %ecx, %eax
106 ; X86-NEXT:    retl
108 ; X64-LABEL: pext32_load:
109 ; X64:       # %bb.0:
110 ; X64-NEXT:    pextl (%rsi), %edi, %eax
111 ; X64-NEXT:    retq
112   %y1 = load i32, i32* %y
113   %tmp = tail call i32 @llvm.x86.bmi.pext.32(i32 %x, i32 %y1)
114   ret i32 %tmp
117 declare i32 @llvm.x86.bmi.pext.32(i32, i32)
119 define i32 @mulx32(i32 %x, i32 %y, i32* %p)   {
120 ; X86-LABEL: mulx32:
121 ; X86:       # %bb.0:
122 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
123 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
124 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
125 ; X86-NEXT:    addl %eax, %eax
126 ; X86-NEXT:    addl %edx, %edx
127 ; X86-NEXT:    mull %edx
128 ; X86-NEXT:    movl %edx, (%ecx)
129 ; X86-NEXT:    retl
131 ; X64-LABEL: mulx32:
132 ; X64:       # %bb.0:
133 ; X64-NEXT:    movl %esi, %eax
134 ; X64-NEXT:    # kill: def $edi killed $edi def $rdi
135 ; X64-NEXT:    addl %edi, %edi
136 ; X64-NEXT:    addl %eax, %eax
137 ; X64-NEXT:    imulq %rdi, %rax
138 ; X64-NEXT:    movq %rax, %rcx
139 ; X64-NEXT:    shrq $32, %rcx
140 ; X64-NEXT:    movl %ecx, (%rdx)
141 ; X64-NEXT:    # kill: def $eax killed $eax killed $rax
142 ; X64-NEXT:    retq
143   %x1 = add i32 %x, %x
144   %y1 = add i32 %y, %y
145   %x2 = zext i32 %x1 to i64
146   %y2 = zext i32 %y1 to i64
147   %r1 = mul i64 %x2, %y2
148   %h1 = lshr i64 %r1, 32
149   %h  = trunc i64 %h1 to i32
150   %l  = trunc i64 %r1 to i32
151   store i32 %h, i32* %p
152   ret i32 %l
155 define i32 @mulx32_load(i32 %x, i32* %y, i32* %p)   {
156 ; X86-LABEL: mulx32_load:
157 ; X86:       # %bb.0:
158 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx
159 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx
160 ; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax
161 ; X86-NEXT:    addl %eax, %eax
162 ; X86-NEXT:    mull (%edx)
163 ; X86-NEXT:    movl %edx, (%ecx)
164 ; X86-NEXT:    retl
166 ; X64-LABEL: mulx32_load:
167 ; X64:       # %bb.0:
168 ; X64-NEXT:    movl %edi, %eax
169 ; X64-NEXT:    addl %eax, %eax
170 ; X64-NEXT:    movl (%rsi), %ecx
171 ; X64-NEXT:    imulq %rcx, %rax
172 ; X64-NEXT:    movq %rax, %rcx
173 ; X64-NEXT:    shrq $32, %rcx
174 ; X64-NEXT:    movl %ecx, (%rdx)
175 ; X64-NEXT:    # kill: def $eax killed $eax killed $rax
176 ; X64-NEXT:    retq
177   %x1 = add i32 %x, %x
178   %y1 = load i32, i32* %y
179   %x2 = zext i32 %x1 to i64
180   %y2 = zext i32 %y1 to i64
181   %r1 = mul i64 %x2, %y2
182   %h1 = lshr i64 %r1, 32
183   %h  = trunc i64 %h1 to i32
184   %l  = trunc i64 %r1 to i32
185   store i32 %h, i32* %p
186   ret i32 %l