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: psllq $32, %xmm0
15 ; X32-NEXT: movq %xmm0, (%eax)
20 ; X64-NEXT: shll $12, %edi
21 ; X64-NEXT: movd %edi, %xmm0
22 ; X64-NEXT: psllq $32, %xmm0
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: xorps %xmm0, %xmm0
38 ; X32-NEXT: xorps %xmm1, %xmm1
39 ; X32-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]
40 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
45 ; X64-NEXT: xorps %xmm0, %xmm0
46 ; X64-NEXT: xorps %xmm1, %xmm1
47 ; X64-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],mem[0]
48 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2]
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: xorps %xmm1, %xmm1
78 ; X32-NEXT: xorps %xmm0, %xmm0
79 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],mem[3,0]
80 ; X32-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3]
85 ; X64-NEXT: xorps %xmm1, %xmm1
86 ; X64-NEXT: xorps %xmm0, %xmm0
87 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],mem[3,0]
88 ; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],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>