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: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1]
23 ; X64-NEXT: movq %xmm0, (%rsi)
25 %tmp12 = shl i32 %a, 12
26 %tmp21 = insertelement <2 x i32> undef, i32 %tmp12, i32 1
27 %tmp22 = insertelement <2 x i32> %tmp21, i32 0, i32 0
28 %tmp23 = bitcast <2 x i32> %tmp22 to x86_mmx
29 store x86_mmx %tmp23, x86_mmx* %P
33 define <4 x float> @t2(<4 x float>* %P) nounwind {
36 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
37 ; X32-NEXT: movaps (%eax), %xmm1
38 ; X32-NEXT: xorps %xmm0, %xmm0
39 ; X32-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
40 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
45 ; X64-NEXT: movaps (%rdi), %xmm1
46 ; X64-NEXT: xorps %xmm0, %xmm0
47 ; X64-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
48 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
50 %tmp1 = load <4 x float>, <4 x float>* %P
51 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 4, i32 4, i32 4, i32 0 >
55 define <4 x float> @t3(<4 x float>* %P) nounwind {
58 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
59 ; X32-NEXT: xorps %xmm0, %xmm0
60 ; X32-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
65 ; X64-NEXT: xorps %xmm0, %xmm0
66 ; X64-NEXT: movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
68 %tmp1 = load <4 x float>, <4 x float>* %P
69 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 2, i32 3, i32 4, i32 4 >
73 define <4 x float> @t4(<4 x float>* %P) nounwind {
76 ; X32-NEXT: movl {{[0-9]+}}(%esp), %eax
77 ; X32-NEXT: movaps (%eax), %xmm0
78 ; X32-NEXT: xorps %xmm1, %xmm1
79 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
80 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
85 ; X64-NEXT: movaps (%rdi), %xmm0
86 ; X64-NEXT: xorps %xmm1, %xmm1
87 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
88 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
90 %tmp1 = load <4 x float>, <4 x float>* %P
91 %tmp2 = shufflevector <4 x float> zeroinitializer, <4 x float> %tmp1, <4 x i32> < i32 7, i32 0, i32 0, i32 0 >
95 define <16 x i8> @t5(<16 x i8> %x) nounwind {
98 ; X32-NEXT: psrlw $8, %xmm0
103 ; X64-NEXT: psrlw $8, %xmm0
105 %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>
109 define <16 x i8> @t6(<16 x i8> %x) nounwind {
112 ; X32-NEXT: psrlw $8, %xmm0
117 ; X64-NEXT: psrlw $8, %xmm0
119 %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>
123 define <16 x i8> @t7(<16 x i8> %x) nounwind {
126 ; X32-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
131 ; X64-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
133 %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>
137 define <16 x i8> @t8(<16 x i8> %x) nounwind {
140 ; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
145 ; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
147 %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>
151 define <16 x i8> @t9(<16 x i8> %x) nounwind {
154 ; X32-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
159 ; X64-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
161 %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>