1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc < %s -mtriple=i386-unknown -mattr=+sse2,+ssse3 | FileCheck %s --check-prefix=X32
3 ; RUN: llc < %s -mtriple=x86_64-unknown -mattr=+sse2,+ssse3 | FileCheck %s --check-prefix=X64
5 ; There are no MMX operations in @t1
7 define void @t1(i32 %a, x86_mmx* %P) nounwind {
10 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
11 ; X32-NEXT: movl {{[0-9]+}}(%esp), %ecx
12 ; X32-NEXT: shll $12, %ecx
13 ; X32-NEXT: movd %ecx, %xmm0
14 ; X32-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
15 ; X32-NEXT: movq %xmm0, (%eax)
20 ; X64-NEXT: shll $12, %edi
21 ; X64-NEXT: movd %edi, %xmm0
22 ; X64-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7]
23 ; X64-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]
24 ; X64-NEXT: movq %xmm0, (%rsi)
26 %tmp12 = shl i32 %a, 12
27 %tmp21 = insertelement <2 x i32> undef, i32 %tmp12, i32 1
28 %tmp22 = insertelement <2 x i32> %tmp21, i32 0, i32 0
29 %tmp23 = bitcast <2 x i32> %tmp22 to x86_mmx
30 store x86_mmx %tmp23, x86_mmx* %P
34 define <4 x float> @t2(<4 x float>* %P) nounwind {
37 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
38 ; X32-NEXT: movaps (%eax), %xmm1
39 ; X32-NEXT: xorps %xmm0, %xmm0
40 ; X32-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
41 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
46 ; X64-NEXT: movaps (%rdi), %xmm1
47 ; X64-NEXT: xorps %xmm0, %xmm0
48 ; X64-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
49 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
51 %tmp1 = load <4 x float>, <4 x float>* %P
52 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 4, i32 4, i32 4, i32 0 >
56 define <4 x float> @t3(<4 x float>* %P) nounwind {
59 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
60 ; X32-NEXT: xorps %xmm0, %xmm0
61 ; X32-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
66 ; X64-NEXT: xorps %xmm0, %xmm0
67 ; X64-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
69 %tmp1 = load <4 x float>, <4 x float>* %P
70 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 2, i32 3, i32 4, i32 4 >
74 define <4 x float> @t4(<4 x float>* %P) nounwind {
77 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
78 ; X32-NEXT: movaps (%eax), %xmm0
79 ; X32-NEXT: xorps %xmm1, %xmm1
80 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
81 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
86 ; X64-NEXT: movaps (%rdi), %xmm0
87 ; X64-NEXT: xorps %xmm1, %xmm1
88 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
89 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
91 %tmp1 = load <4 x float>, <4 x float>* %P
92 %tmp2 = shufflevector <4 x float> zeroinitializer, <4 x float> %tmp1, <4 x i32> < i32 7, i32 0, i32 0, i32 0 >
96 define <16 x i8> @t5(<16 x i8> %x) nounwind {
99 ; X32-NEXT: psrlw $8, %xmm0
104 ; X64-NEXT: psrlw $8, %xmm0
106 %s = shufflevector <16 x i8> %x, <16 x i8> zeroinitializer, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 17>
110 define <16 x i8> @t6(<16 x i8> %x) nounwind {
113 ; X32-NEXT: psrlw $8, %xmm0
118 ; X64-NEXT: psrlw $8, %xmm0
120 %s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef>
124 define <16 x i8> @t7(<16 x i8> %x) nounwind {
127 ; X32-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
132 ; X64-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
134 %s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 1, i32 2>
138 define <16 x i8> @t8(<16 x i8> %x) nounwind {
141 ; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
146 ; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
148 %s = shufflevector <16 x i8> %x, <16 x i8> zeroinitializer, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 8, i32 9, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 17>
152 define <16 x i8> @t9(<16 x i8> %x) nounwind {
155 ; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
160 ; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
162 %s = shufflevector <16 x i8> %x, <16 x i8> undef, <16 x i32> <i32 1, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 7, i32 8, i32 undef, i32 undef, i32 undef, i32 undef, i32 undef, i32 14, i32 undef, i32 undef>