1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse2,-sse4.1 < %s | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker; Verify that we don't emit packed vector shifts instructions if the 5*9880d681SAndroid Build Coastguard Worker; condition used by the vector select is a vector of constants. 6*9880d681SAndroid Build Coastguard Worker 7*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test1(<4 x float> %a, <4 x float> %b) { 8*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 9*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[1,3] 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,1,3] 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 13*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 false, i1 true, i1 false>, <4 x float> %a, <4 x float> %b 14*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 15*9880d681SAndroid Build Coastguard Worker} 16*9880d681SAndroid Build Coastguard Worker 17*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test2(<4 x float> %a, <4 x float> %b) { 18*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 19*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 23*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 true, i1 false, i1 false>, <4 x float> %a, <4 x float> %b 24*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 25*9880d681SAndroid Build Coastguard Worker} 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test3(<4 x float> %a, <4 x float> %b) { 28*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 29*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 32*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 false, i1 false, i1 true, i1 true>, <4 x float> %a, <4 x float> %b 33*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 34*9880d681SAndroid Build Coastguard Worker} 35*9880d681SAndroid Build Coastguard Worker 36*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test4(<4 x float> %a, <4 x float> %b) { 37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 38*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 41*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 false, i1 false, i1 false, i1 false>, <4 x float> %a, <4 x float> %b 42*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 43*9880d681SAndroid Build Coastguard Worker} 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test5(<4 x float> %a, <4 x float> %b) { 46*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 47*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 49*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %b 50*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 51*9880d681SAndroid Build Coastguard Worker} 52*9880d681SAndroid Build Coastguard Worker 53*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test6(<8 x i16> %a, <8 x i16> %b) { 54*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 55*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 56*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 57*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 true, i1 false, i1 true, i1 false, i1 true, i1 false, i1 true, i1 false>, <8 x i16> %a, <8 x i16> %a 58*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 59*9880d681SAndroid Build Coastguard Worker} 60*9880d681SAndroid Build Coastguard Worker 61*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test7(<8 x i16> %a, <8 x i16> %b) { 62*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 63*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 67*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false>, <8 x i16> %a, <8 x i16> %b 68*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 69*9880d681SAndroid Build Coastguard Worker} 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test8(<8 x i16> %a, <8 x i16> %b) { 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 73*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 74*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 76*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 false, i1 false, i1 false, i1 false, i1 true, i1 true, i1 true, i1 true>, <8 x i16> %a, <8 x i16> %b 77*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test9(<8 x i16> %a, <8 x i16> %b) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 82*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 85*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <8 x i16> %a, <8 x i16> %b 86*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test10(<8 x i16> %a, <8 x i16> %b) { 90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 91*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 93*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true>, <8 x i16> %a, <8 x i16> %b 94*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 95*9880d681SAndroid Build Coastguard Worker} 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test11(<8 x i16> %a, <8 x i16> %b) { 98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 99*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{.*#+}} xmm2 = [0,65535,65535,0,65535,65535,65535,65535] 101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andps %xmm2, %xmm0 102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: andnps %xmm1, %xmm2 103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: orps %xmm2, %xmm0 104*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 105*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 false, i1 true, i1 true, i1 false, i1 undef, i1 true, i1 true, i1 undef>, <8 x i16> %a, <8 x i16> %b 106*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 107*9880d681SAndroid Build Coastguard Worker} 108*9880d681SAndroid Build Coastguard Worker 109*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test12(<8 x i16> %a, <8 x i16> %b) { 110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 111*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 113*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 114*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 false, i1 false, i1 undef, i1 false, i1 false, i1 false, i1 false, i1 undef>, <8 x i16> %a, <8 x i16> %b 115*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test13(<8 x i16> %a, <8 x i16> %b) { 119*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 120*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 121*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 123*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 undef, i1 undef, i1 undef, i1 undef, i1 undef, i1 undef, i1 undef, i1 undef>, <8 x i16> %a, <8 x i16> %b 124*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker; Fold (vselect (build_vector AllOnes), N1, N2) -> N1 128*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test14(<4 x float> %a, <4 x float> %b) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14: 130*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 132*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 undef, i1 true, i1 undef>, <4 x float> %a, <4 x float> %b 133*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 134*9880d681SAndroid Build Coastguard Worker} 135*9880d681SAndroid Build Coastguard Worker 136*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test15(<8 x i16> %a, <8 x i16> %b) { 137*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15: 138*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 140*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 true, i1 true, i1 true, i1 undef, i1 undef, i1 true, i1 true, i1 undef>, <8 x i16> %a, <8 x i16> %b 141*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 142*9880d681SAndroid Build Coastguard Worker} 143*9880d681SAndroid Build Coastguard Worker 144*9880d681SAndroid Build Coastguard Worker; Fold (vselect (build_vector AllZeros), N1, N2) -> N2 145*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test16(<4 x float> %a, <4 x float> %b) { 146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16: 147*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 150*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 false, i1 undef, i1 false, i1 undef>, <4 x float> %a, <4 x float> %b 151*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 152*9880d681SAndroid Build Coastguard Worker} 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test17(<8 x i16> %a, <8 x i16> %b) { 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17: 156*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 159*9880d681SAndroid Build Coastguard Worker %1 = select <8 x i1> <i1 false, i1 false, i1 false, i1 undef, i1 undef, i1 false, i1 false, i1 undef>, <8 x i16> %a, <8 x i16> %b 160*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %1 161*9880d681SAndroid Build Coastguard Worker} 162*9880d681SAndroid Build Coastguard Worker 163*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test18(<4 x float> %a, <4 x float> %b) { 164*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18: 165*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 168*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x float> %a, <4 x float> %b 169*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 170*9880d681SAndroid Build Coastguard Worker} 171*9880d681SAndroid Build Coastguard Worker 172*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test19(<4 x i32> %a, <4 x i32> %b) { 173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test19: 174*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 177*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 false, i1 true, i1 true, i1 true>, <4 x i32> %a, <4 x i32> %b 178*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 179*9880d681SAndroid Build Coastguard Worker} 180*9880d681SAndroid Build Coastguard Worker 181*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test20(<2 x double> %a, <2 x double> %b) { 182*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test20: 183*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 186*9880d681SAndroid Build Coastguard Worker %1 = select <2 x i1> <i1 false, i1 true>, <2 x double> %a, <2 x double> %b 187*9880d681SAndroid Build Coastguard Worker ret <2 x double> %1 188*9880d681SAndroid Build Coastguard Worker} 189*9880d681SAndroid Build Coastguard Worker 190*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test21(<2 x i64> %a, <2 x i64> %b) { 191*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test21: 192*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 193*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 194*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 195*9880d681SAndroid Build Coastguard Worker %1 = select <2 x i1> <i1 false, i1 true>, <2 x i64> %a, <2 x i64> %b 196*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 197*9880d681SAndroid Build Coastguard Worker} 198*9880d681SAndroid Build Coastguard Worker 199*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test22(<4 x float> %a, <4 x float> %b) { 200*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test22: 201*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 202*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 203*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 204*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 205*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x float> %a, <4 x float> %b 206*9880d681SAndroid Build Coastguard Worker ret <4 x float> %1 207*9880d681SAndroid Build Coastguard Worker} 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test23(<4 x i32> %a, <4 x i32> %b) { 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test23: 211*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, %xmm0 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 215*9880d681SAndroid Build Coastguard Worker %1 = select <4 x i1> <i1 true, i1 false, i1 false, i1 false>, <4 x i32> %a, <4 x i32> %b 216*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %1 217*9880d681SAndroid Build Coastguard Worker} 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test24(<2 x double> %a, <2 x double> %b) { 220*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test24: 221*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 222*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 223*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 224*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 225*9880d681SAndroid Build Coastguard Worker %1 = select <2 x i1> <i1 true, i1 false>, <2 x double> %a, <2 x double> %b 226*9880d681SAndroid Build Coastguard Worker ret <2 x double> %1 227*9880d681SAndroid Build Coastguard Worker} 228*9880d681SAndroid Build Coastguard Worker 229*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test25(<2 x i64> %a, <2 x i64> %b) { 230*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test25: 231*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 232*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 235*9880d681SAndroid Build Coastguard Worker %1 = select <2 x i1> <i1 true, i1 false>, <2 x i64> %a, <2 x i64> %b 236*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %1 237*9880d681SAndroid Build Coastguard Worker} 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @select_of_shuffles_0(<2 x float> %a0, <2 x float> %b0, <2 x float> %a1, <2 x float> %b1) { 240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_of_shuffles_0: 241*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm2[0] 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm3[0] 244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: subps %xmm1, %xmm0 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 246*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <2 x float> %a0, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 247*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <2 x float> %a1, <2 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 1> 248*9880d681SAndroid Build Coastguard Worker %3 = select <4 x i1> <i1 false, i1 false, i1 true, i1 true>, <4 x float> %2, <4 x float> %1 249*9880d681SAndroid Build Coastguard Worker %4 = shufflevector <2 x float> %b0, <2 x float> undef, <4 x i32> <i32 0, i32 1, i32 undef, i32 undef> 250*9880d681SAndroid Build Coastguard Worker %5 = shufflevector <2 x float> %b1, <2 x float> undef, <4 x i32> <i32 undef, i32 undef, i32 0, i32 1> 251*9880d681SAndroid Build Coastguard Worker %6 = select <4 x i1> <i1 false, i1 false, i1 true, i1 true>, <4 x float> %5, <4 x float> %4 252*9880d681SAndroid Build Coastguard Worker %7 = fsub <4 x float> %3, %6 253*9880d681SAndroid Build Coastguard Worker ret <4 x float> %7 254*9880d681SAndroid Build Coastguard Worker} 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker; PR20677 257*9880d681SAndroid Build Coastguard Workerdefine <16 x double> @select_illegal(<16 x double> %a, <16 x double> %b) { 258*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: select_illegal: 259*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm4 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm5 262*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm6 263*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps {{[0-9]+}}(%rsp), %xmm7 264*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm7, 112(%rdi) 265*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm6, 96(%rdi) 266*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm5, 80(%rdi) 267*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm4, 64(%rdi) 268*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm3, 48(%rdi) 269*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm2, 32(%rdi) 270*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm1, 16(%rdi) 271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movaps %xmm0, (%rdi) 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq %rdi, %rax 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 274*9880d681SAndroid Build Coastguard Worker %sel = select <16 x i1> <i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 true, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false, i1 false>, <16 x double> %a, <16 x double> %b 275*9880d681SAndroid Build Coastguard Worker ret <16 x double> %sel 276*9880d681SAndroid Build Coastguard Worker} 277