[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / sse41-pmovxrm.ll
blob98356c55004fa3becd47d251e1ea252c5a32cff6
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE41
3 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+avx2 | FileCheck %s --check-prefix=AVX
4 ; RUN: llc < %s -disable-peephole -mtriple=x86_64-apple-darwin -mattr=+avx512vl,avx512bw | FileCheck %s --check-prefix=AVX
6 define <8 x i16> @test_llvm_x86_sse41_pmovsxbw(ptr %a) {
7 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxbw:
8 ; SSE41:       ## %bb.0:
9 ; SSE41-NEXT:    pmovsxbw (%rdi), %xmm0
10 ; SSE41-NEXT:    retq
12 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxbw:
13 ; AVX:       ## %bb.0:
14 ; AVX-NEXT:    vpmovsxbw (%rdi), %xmm0
15 ; AVX-NEXT:    retq
16   %1 = load <16 x i8>, ptr %a, align 1
17   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
18   %3 = sext <8 x i8> %2 to <8 x i16>
19   ret <8 x i16> %3
22 define <4 x i32> @test_llvm_x86_sse41_pmovsxbd(ptr %a) {
23 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxbd:
24 ; SSE41:       ## %bb.0:
25 ; SSE41-NEXT:    pmovsxbd (%rdi), %xmm0
26 ; SSE41-NEXT:    retq
28 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxbd:
29 ; AVX:       ## %bb.0:
30 ; AVX-NEXT:    vpmovsxbd (%rdi), %xmm0
31 ; AVX-NEXT:    retq
32   %1 = load <16 x i8>, ptr %a, align 1
33   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
34   %3 = sext <4 x i8> %2 to <4 x i32>
35   ret <4 x i32> %3
38 define <2 x i64> @test_llvm_x86_sse41_pmovsxbq(ptr %a) {
39 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxbq:
40 ; SSE41:       ## %bb.0:
41 ; SSE41-NEXT:    pmovsxbq (%rdi), %xmm0
42 ; SSE41-NEXT:    retq
44 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxbq:
45 ; AVX:       ## %bb.0:
46 ; AVX-NEXT:    vpmovsxbq (%rdi), %xmm0
47 ; AVX-NEXT:    retq
48   %1 = load <16 x i8>, ptr %a, align 1
49   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
50   %3 = sext <2 x i8> %2 to <2 x i64>
51   ret <2 x i64> %3
54 define <4 x i32> @test_llvm_x86_sse41_pmovsxwd(ptr %a) {
55 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxwd:
56 ; SSE41:       ## %bb.0:
57 ; SSE41-NEXT:    pmovsxwd (%rdi), %xmm0
58 ; SSE41-NEXT:    retq
60 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxwd:
61 ; AVX:       ## %bb.0:
62 ; AVX-NEXT:    vpmovsxwd (%rdi), %xmm0
63 ; AVX-NEXT:    retq
64   %1 = load <8 x i16>, ptr %a, align 1
65   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
66   %3 = sext <4 x i16> %2 to <4 x i32>
67   ret <4 x i32> %3
70 define <2 x i64> @test_llvm_x86_sse41_pmovsxwq(ptr %a) {
71 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxwq:
72 ; SSE41:       ## %bb.0:
73 ; SSE41-NEXT:    pmovsxwq (%rdi), %xmm0
74 ; SSE41-NEXT:    retq
76 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxwq:
77 ; AVX:       ## %bb.0:
78 ; AVX-NEXT:    vpmovsxwq (%rdi), %xmm0
79 ; AVX-NEXT:    retq
80   %1 = load <8 x i16>, ptr %a, align 1
81   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
82   %3 = sext <2 x i16> %2 to <2 x i64>
83   ret <2 x i64> %3
86 define <2 x i64> @test_llvm_x86_sse41_pmovsxdq(ptr %a) {
87 ; SSE41-LABEL: test_llvm_x86_sse41_pmovsxdq:
88 ; SSE41:       ## %bb.0:
89 ; SSE41-NEXT:    pmovsxdq (%rdi), %xmm0
90 ; SSE41-NEXT:    retq
92 ; AVX-LABEL: test_llvm_x86_sse41_pmovsxdq:
93 ; AVX:       ## %bb.0:
94 ; AVX-NEXT:    vpmovsxdq (%rdi), %xmm0
95 ; AVX-NEXT:    retq
96   %1 = load <4 x i32>, ptr %a, align 1
97   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
98   %3 = sext <2 x i32> %2 to <2 x i64>
99   ret <2 x i64> %3
102 define <8 x i16> @test_llvm_x86_sse41_pmovzxbw(ptr %a) {
103 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxbw:
104 ; SSE41:       ## %bb.0:
105 ; SSE41-NEXT:    pmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
106 ; SSE41-NEXT:    retq
108 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxbw:
109 ; AVX:       ## %bb.0:
110 ; AVX-NEXT:    vpmovzxbw {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero,mem[4],zero,mem[5],zero,mem[6],zero,mem[7],zero
111 ; AVX-NEXT:    retq
112   %1 = load <16 x i8>, ptr %a, align 1
113   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
114   %3 = zext <8 x i8> %2 to <8 x i16>
115   ret <8 x i16> %3
118 define <4 x i32> @test_llvm_x86_sse41_pmovzxbd(ptr %a) {
119 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxbd:
120 ; SSE41:       ## %bb.0:
121 ; SSE41-NEXT:    pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
122 ; SSE41-NEXT:    retq
124 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxbd:
125 ; AVX:       ## %bb.0:
126 ; AVX-NEXT:    vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero
127 ; AVX-NEXT:    retq
128   %1 = load <16 x i8>, ptr %a, align 1
129   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
130   %3 = zext <4 x i8> %2 to <4 x i32>
131   ret <4 x i32> %3
134 define <2 x i64> @test_llvm_x86_sse41_pmovzxbq(ptr %a) {
135 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxbq:
136 ; SSE41:       ## %bb.0:
137 ; SSE41-NEXT:    pmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
138 ; SSE41-NEXT:    retq
140 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxbq:
141 ; AVX:       ## %bb.0:
142 ; AVX-NEXT:    vpmovzxbq {{.*#+}} xmm0 = mem[0],zero,zero,zero,zero,zero,zero,zero,mem[1],zero,zero,zero,zero,zero,zero,zero
143 ; AVX-NEXT:    retq
144   %1 = load <16 x i8>, ptr %a, align 1
145   %2 = shufflevector <16 x i8> %1, <16 x i8> undef, <2 x i32> <i32 0, i32 1>
146   %3 = zext <2 x i8> %2 to <2 x i64>
147   ret <2 x i64> %3
150 define <4 x i32> @test_llvm_x86_sse41_pmovzxwd(ptr %a) {
151 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxwd:
152 ; SSE41:       ## %bb.0:
153 ; SSE41-NEXT:    pmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
154 ; SSE41-NEXT:    retq
156 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxwd:
157 ; AVX:       ## %bb.0:
158 ; AVX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = mem[0],zero,mem[1],zero,mem[2],zero,mem[3],zero
159 ; AVX-NEXT:    retq
160   %1 = load <8 x i16>, ptr %a, align 1
161   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
162   %3 = zext <4 x i16> %2 to <4 x i32>
163   ret <4 x i32> %3
166 define <2 x i64> @test_llvm_x86_sse41_pmovzxwq(ptr %a) {
167 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxwq:
168 ; SSE41:       ## %bb.0:
169 ; SSE41-NEXT:    pmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
170 ; SSE41-NEXT:    retq
172 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxwq:
173 ; AVX:       ## %bb.0:
174 ; AVX-NEXT:    vpmovzxwq {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero
175 ; AVX-NEXT:    retq
176   %1 = load <8 x i16>, ptr %a, align 1
177   %2 = shufflevector <8 x i16> %1, <8 x i16> undef, <2 x i32> <i32 0, i32 1>
178   %3 = zext <2 x i16> %2 to <2 x i64>
179   ret <2 x i64> %3
182 define <2 x i64> @test_llvm_x86_sse41_pmovzxdq(ptr %a) {
183 ; SSE41-LABEL: test_llvm_x86_sse41_pmovzxdq:
184 ; SSE41:       ## %bb.0:
185 ; SSE41-NEXT:    pmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
186 ; SSE41-NEXT:    retq
188 ; AVX-LABEL: test_llvm_x86_sse41_pmovzxdq:
189 ; AVX:       ## %bb.0:
190 ; AVX-NEXT:    vpmovzxdq {{.*#+}} xmm0 = mem[0],zero,mem[1],zero
191 ; AVX-NEXT:    retq
192   %1 = load <4 x i32>, ptr %a, align 1
193   %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <2 x i32> <i32 0, i32 1>
194   %3 = zext <2 x i32> %2 to <2 x i64>
195   ret <2 x i64> %3