1 ; RUN: llc < %s -march=x86 -mattr=+sse2,+ssse3 | FileCheck %s
2 ; There are no MMX operations in @t1
4 define void @t1(i32 %a, x86_mmx* %P) nounwind {
7 ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
8 ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %ecx
9 ; CHECK-NEXT: shll $12, %ecx
10 ; CHECK-NEXT: movd %ecx, %xmm0
11 ; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,0,1]
12 ; CHECK-NEXT: movlpd %xmm0, (%eax)
14 %tmp12 = shl i32 %a, 12
15 %tmp21 = insertelement <2 x i32> undef, i32 %tmp12, i32 1
16 %tmp22 = insertelement <2 x i32> %tmp21, i32 0, i32 0
17 %tmp23 = bitcast <2 x i32> %tmp22 to x86_mmx
18 store x86_mmx %tmp23, x86_mmx* %P
22 define <4 x float> @t2(<4 x float>* %P) nounwind {
25 ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
26 ; CHECK-NEXT: movaps (%eax), %xmm1
27 ; CHECK-NEXT: xorps %xmm0, %xmm0
28 ; CHECK-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0]
29 ; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0]
31 %tmp1 = load <4 x float>, <4 x float>* %P
32 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 4, i32 4, i32 4, i32 0 >
36 define <4 x float> @t3(<4 x float>* %P) nounwind {
39 ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
40 ; CHECK-NEXT: movapd (%eax), %xmm0
41 ; CHECK-NEXT: xorpd %xmm1, %xmm1
42 ; CHECK-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]
44 %tmp1 = load <4 x float>, <4 x float>* %P
45 %tmp2 = shufflevector <4 x float> %tmp1, <4 x float> zeroinitializer, <4 x i32> < i32 2, i32 3, i32 4, i32 4 >
49 define <4 x float> @t4(<4 x float>* %P) nounwind {
52 ; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax
53 ; CHECK-NEXT: movaps (%eax), %xmm0
54 ; CHECK-NEXT: xorps %xmm1, %xmm1
55 ; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0],xmm1[1,0]
56 ; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3]
58 %tmp1 = load <4 x float>, <4 x float>* %P
59 %tmp2 = shufflevector <4 x float> zeroinitializer, <4 x float> %tmp1, <4 x i32> < i32 7, i32 0, i32 0, i32 0 >
63 define <16 x i8> @t5(<16 x i8> %x) nounwind {
66 ; CHECK-NEXT: psrlw $8, %xmm0
68 %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>
72 define <16 x i8> @t6(<16 x i8> %x) nounwind {
75 ; CHECK-NEXT: psrlw $8, %xmm0
77 %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>
81 define <16 x i8> @t7(<16 x i8> %x) nounwind {
84 ; CHECK-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
86 %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>
90 define <16 x i8> @t8(<16 x i8> %x) nounwind {
93 ; CHECK-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
95 %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>
99 define <16 x i8> @t9(<16 x i8> %x) nounwind {
102 ; CHECK-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
104 %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>