1; RUN: llc < %s -march=x86 -mattr=+sse2,+ssse3 | FileCheck %s 2; There are no MMX operations in @t1 3 4define void @t1(i32 %a, x86_mmx* %P) nounwind { 5; CHECK-LABEL: t1: 6; CHECK: # BB#0: 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) 13; CHECK-NEXT: retl 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 19 ret void 20} 21 22define <4 x float> @t2(<4 x float>* %P) nounwind { 23; CHECK-LABEL: t2: 24; CHECK: # BB#0: 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[0,0] 29; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0] 30; CHECK-NEXT: retl 31 %tmp1 = load <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 > 33 ret <4 x float> %tmp2 34} 35 36define <4 x float> @t3(<4 x float>* %P) nounwind { 37; CHECK-LABEL: t3: 38; CHECK: # BB#0: 39; CHECK-NEXT: movl {{[0-9]+}}(%esp), %eax 40; CHECK-NEXT: movaps (%eax), %xmm0 41; CHECK-NEXT: xorps %xmm1, %xmm1 42; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,3],xmm1[0,0] 43; CHECK-NEXT: retl 44 %tmp1 = load <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 > 46 ret <4 x float> %tmp2 47} 48 49define <4 x float> @t4(<4 x float>* %P) nounwind { 50; CHECK-LABEL: t4: 51; CHECK: # BB#0: 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[0,0] 56; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,0] 57; CHECK-NEXT: retl 58 %tmp1 = load <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 > 60 ret <4 x float> %tmp2 61} 62 63define <16 x i8> @t5(<16 x i8> %x) nounwind { 64; CHECK-LABEL: t5: 65; CHECK: # BB#0: 66; CHECK-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero 67; CHECK-NEXT: retl 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> 69 ret <16 x i8> %s 70} 71 72define <16 x i8> @t6(<16 x i8> %x) nounwind { 73; CHECK-LABEL: t6: 74; CHECK: # BB#0: 75; CHECK-NEXT: psrldq {{.*#+}} xmm0 = xmm0[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero 76; CHECK-NEXT: retl 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> 78 ret <16 x i8> %s 79} 80 81define <16 x i8> @t7(<16 x i8> %x) nounwind { 82; CHECK-LABEL: t7: 83; CHECK: # BB#0: 84; CHECK-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2] 85; CHECK-NEXT: retl 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> 87 ret <16 x i8> %s 88} 89