1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=core2 -mattr=+ssse3 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -march=x86 -mcpu=yonah | FileCheck --check-prefix=CHECK-YONAH %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test1(<4 x i32> %A, <4 x i32> %B) nounwind { 6*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 7*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0] 9*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 10*9880d681SAndroid Build Coastguard Worker; 11*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test1: 12*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 13*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,3,0] 14*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 15*9880d681SAndroid Build Coastguard Worker %C = shufflevector <4 x i32> %A, <4 x i32> undef, <4 x i32> < i32 1, i32 2, i32 3, i32 0 > 16*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %C 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %A, <4 x i32> %B) nounwind { 20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 21*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3] 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 25*9880d681SAndroid Build Coastguard Worker; 26*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test2: 27*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 28*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 29*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,2],xmm1[2,0] 30*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 31*9880d681SAndroid Build Coastguard Worker %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 3, i32 4 > 32*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %C 33*9880d681SAndroid Build Coastguard Worker} 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test3(<4 x i32> %A, <4 x i32> %B) nounwind { 36*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 37*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 38*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[4,5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3] 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 41*9880d681SAndroid Build Coastguard Worker; 42*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test3: 43*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 44*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1] 45*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,2,2,3] 46*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 47*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 48*9880d681SAndroid Build Coastguard Worker %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 1, i32 2, i32 undef, i32 4 > 49*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %C 50*9880d681SAndroid Build Coastguard Worker} 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %A, <4 x i32> %B) nounwind { 53*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 54*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm0 = xmm1[8,9,10,11,12,13,14,15],xmm0[0,1,2,3,4,5,6,7] 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 57*9880d681SAndroid Build Coastguard Worker; 58*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test4: 59*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 60*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 61*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0 62*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 63*9880d681SAndroid Build Coastguard Worker %C = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 > 64*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %C 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test5(<4 x float> %A, <4 x float> %B) nounwind { 68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 69*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 73*9880d681SAndroid Build Coastguard Worker; 74*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test5: 75*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 76*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: shufpd {{.*#+}} xmm1 = xmm1[1],xmm0[0] 77*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: movapd %xmm1, %xmm0 78*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 79*9880d681SAndroid Build Coastguard Worker %C = shufflevector <4 x float> %A, <4 x float> %B, <4 x i32> < i32 6, i32 7, i32 undef, i32 1 > 80*9880d681SAndroid Build Coastguard Worker ret <4 x float> %C 81*9880d681SAndroid Build Coastguard Worker} 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test6(<8 x i16> %A, <8 x i16> %B) nounwind { 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 85*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 86*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4,5] 87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 89*9880d681SAndroid Build Coastguard Worker; 90*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test6: 91*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 92*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero 93*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5] 94*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: por %xmm1, %xmm0 95*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 96*9880d681SAndroid Build Coastguard Worker %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 3, i32 4, i32 undef, i32 6, i32 7, i32 8, i32 9, i32 10 > 97*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %C 98*9880d681SAndroid Build Coastguard Worker} 99*9880d681SAndroid Build Coastguard Worker 100*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test7(<8 x i16> %A, <8 x i16> %B) nounwind { 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 102*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[10,11,12,13,14,15],xmm1[0,1,2,3,4,5,6,7,8,9] 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 105*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 106*9880d681SAndroid Build Coastguard Worker; 107*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test7: 108*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 109*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[10,11,12,13,14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero 110*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6,7,8,9] 111*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: por %xmm1, %xmm0 112*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 113*9880d681SAndroid Build Coastguard Worker %C = shufflevector <8 x i16> %A, <8 x i16> %B, <8 x i32> < i32 undef, i32 6, i32 undef, i32 8, i32 9, i32 10, i32 11, i32 12 > 114*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %C 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker 117*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @test8(<16 x i8> %A, <16 x i8> %B) nounwind { 118*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 119*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm0[5,6,7,8,9,10,11,12,13,14,15],xmm1[0,1,2,3,4] 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 123*9880d681SAndroid Build Coastguard Worker; 124*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test8: 125*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 126*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[5,6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero 127*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4] 128*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: por %xmm1, %xmm0 129*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 130*9880d681SAndroid Build Coastguard Worker %C = shufflevector <16 x i8> %A, <16 x i8> %B, <16 x i32> < i32 5, i32 6, i32 7, i32 undef, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15, i32 16, i32 17, i32 18, i32 19, i32 20 > 131*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %C 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker; Check that we don't do unary (circular on single operand) palignr incorrectly. 135*9880d681SAndroid Build Coastguard Worker; (It is possible, but before this testcase was committed, it was being done 136*9880d681SAndroid Build Coastguard Worker; incorrectly. In particular, one of the operands of the palignr node 137*9880d681SAndroid Build Coastguard Worker; was an UNDEF.) 138*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test9(<8 x i16> %A, <8 x i16> %B) nounwind { 139*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 140*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: palignr {{.*#+}} xmm1 = xmm1[2,3,4,5,6,7,8,9,10,11,12,13,14,15,0,1] 142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retl 144*9880d681SAndroid Build Coastguard Worker; 145*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-LABEL: test9: 146*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH: # BB#0: 147*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0 148*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: psrldq {{.*#+}} xmm0 = xmm0[2,3,4,5,6,7,8,9,10,11,12,13,14,15],zero,zero 149*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1] 150*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: por %xmm0, %xmm1 151*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: movdqa %xmm1, %xmm0 152*9880d681SAndroid Build Coastguard Worker; CHECK-YONAH-NEXT: retl 153*9880d681SAndroid Build Coastguard Worker %C = shufflevector <8 x i16> %B, <8 x i16> %A, <8 x i32> < i32 undef, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 0 > 154*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %C 155*9880d681SAndroid Build Coastguard Worker} 156*9880d681SAndroid Build Coastguard Worker 157