[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / CodeGen / X86 / vec_insert-5.ll
blob3f8bc4adb1bd1f266ce50a0019c811c546e1d768
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 {
8 ; X32-LABEL: t1:
9 ; X32:       # %bb.0:
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)
16 ; X32-NEXT:    retl
18 ; X64-LABEL: t1:
19 ; X64:       # %bb.0:
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)
25 ; X64-NEXT:    retq
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
31  ret void
34 define <4 x float> @t2(<4 x float>* %P) nounwind {
35 ; X32-LABEL: t2:
36 ; X32:       # %bb.0:
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]
42 ; X32-NEXT:    retl
44 ; X64-LABEL: t2:
45 ; X64:       # %bb.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]
50 ; X64-NEXT:    retq
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 >
53   ret <4 x float> %tmp2
56 define <4 x float> @t3(<4 x float>* %P) nounwind {
57 ; X32-LABEL: t3:
58 ; X32:       # %bb.0:
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]
62 ; X32-NEXT:    retl
64 ; X64-LABEL: t3:
65 ; X64:       # %bb.0:
66 ; X64-NEXT:    xorps %xmm0, %xmm0
67 ; X64-NEXT:    movlps {{.*#+}} xmm0 = mem[0,1],xmm0[2,3]
68 ; X64-NEXT:    retq
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 >
71   ret <4 x float> %tmp2
74 define <4 x float> @t4(<4 x float>* %P) nounwind {
75 ; X32-LABEL: t4:
76 ; X32:       # %bb.0:
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]
82 ; X32-NEXT:    retl
84 ; X64-LABEL: t4:
85 ; X64:       # %bb.0:
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]
90 ; X64-NEXT:    retq
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 >
93   ret <4 x float> %tmp2
96 define <16 x i8> @t5(<16 x i8> %x) nounwind {
97 ; X32-LABEL: t5:
98 ; X32:       # %bb.0:
99 ; X32-NEXT:    psrlw $8, %xmm0
100 ; X32-NEXT:    retl
102 ; X64-LABEL: t5:
103 ; X64:       # %bb.0:
104 ; X64-NEXT:    psrlw $8, %xmm0
105 ; X64-NEXT:    retq
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>
107   ret <16 x i8> %s
110 define <16 x i8> @t6(<16 x i8> %x) nounwind {
111 ; X32-LABEL: t6:
112 ; X32:       # %bb.0:
113 ; X32-NEXT:    psrlw $8, %xmm0
114 ; X32-NEXT:    retl
116 ; X64-LABEL: t6:
117 ; X64:       # %bb.0:
118 ; X64-NEXT:    psrlw $8, %xmm0
119 ; X64-NEXT:    retq
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>
121   ret <16 x i8> %s
124 define <16 x i8> @t7(<16 x i8> %x) nounwind {
125 ; X32-LABEL: t7:
126 ; X32:       # %bb.0:
127 ; X32-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
128 ; X32-NEXT:    retl
130 ; X64-LABEL: t7:
131 ; X64:       # %bb.0:
132 ; X64-NEXT:    pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2]
133 ; X64-NEXT:    retq
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>
135   ret <16 x i8> %s
138 define <16 x i8> @t8(<16 x i8> %x) nounwind {
139 ; X32-LABEL: t8:
140 ; X32:       # %bb.0:
141 ; X32-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
142 ; X32-NEXT:    retl
144 ; X64-LABEL: t8:
145 ; X64:       # %bb.0:
146 ; X64-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
147 ; X64-NEXT:    retq
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>
149   ret <16 x i8> %s
152 define <16 x i8> @t9(<16 x i8> %x) nounwind {
153 ; X32-LABEL: t9:
154 ; X32:       # %bb.0:
155 ; X32-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
156 ; X32-NEXT:    retl
158 ; X64-LABEL: t9:
159 ; X64:       # %bb.0:
160 ; X64-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero
161 ; X64-NEXT:    retq
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>
163   ret <16 x i8> %s