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 -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7 | FileCheck %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; Verify that each of the following test cases is folded into a single 6*9880d681SAndroid Build Coastguard Worker; instruction which performs a blend operation. 7*9880d681SAndroid Build Coastguard Worker 8*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test1(<2 x i64> %a, <2 x i64> %b) { 9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1: 10*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 13*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 14*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 1> 15*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 16*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 17*9880d681SAndroid Build Coastguard Worker} 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Worker 20*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2(<4 x i32> %a, <4 x i32> %b) { 21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2: 22*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 24*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 25*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3> 26*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4> 27*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 28*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 29*9880d681SAndroid Build Coastguard Worker} 30*9880d681SAndroid Build Coastguard Worker 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test3(<2 x i64> %a, <2 x i64> %b) { 33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3: 34*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 35*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 36*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 37*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 1> 38*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 39*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 40*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 41*9880d681SAndroid Build Coastguard Worker} 42*9880d681SAndroid Build Coastguard Worker 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %a, <4 x i32> %b) { 45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4: 46*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 49*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4> 50*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 1, i32 2, i32 3> 51*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 52*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test5(<4 x i32> %a, <4 x i32> %b) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test5: 58*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 61*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 1, i32 2, i32 3> 62*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4> 63*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 64*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 65*9880d681SAndroid Build Coastguard Worker} 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test6(<4 x i32> %a, <4 x i32> %b) { 69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6: 70*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 72*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 73*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4> 74*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3> 75*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 76*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test7(<4 x i32> %a, <4 x i32> %b) { 81*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7: 82*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 84*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 85*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 -1, i32 -1, i32 0, i32 0> 86*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 0, i32 0, i32 -1, i32 -1> 87*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 88*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test8(<2 x i64> %a, <2 x i64> %b) { 93*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8: 94*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 96*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 97*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %a, <i64 -1, i64 0> 98*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %b, <i64 0, i64 -1> 99*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 100*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test9(<4 x i32> %a, <4 x i32> %b) { 105*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test9: 106*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 107*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 108*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 109*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 0, i32 0, i32 -1, i32 -1> 110*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 -1, i32 -1, i32 0, i32 0> 111*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 112*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 113*9880d681SAndroid Build Coastguard Worker} 114*9880d681SAndroid Build Coastguard Worker 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test10(<2 x i64> %a, <2 x i64> %b) { 117*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test10: 118*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 119*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 120*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 121*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %a, <i64 0, i64 -1> 122*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %b, <i64 -1, i64 0> 123*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 124*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 125*9880d681SAndroid Build Coastguard Worker} 126*9880d681SAndroid Build Coastguard Worker 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test11(<4 x i32> %a, <4 x i32> %b) { 129*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test11: 130*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 132*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 133*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 -1, i32 0, i32 0, i32 0> 134*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 0, i32 -1, i32 -1, i32 -1> 135*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 136*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 137*9880d681SAndroid Build Coastguard Worker} 138*9880d681SAndroid Build Coastguard Worker 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test12(<4 x i32> %a, <4 x i32> %b) { 141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test12: 142*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 144*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 145*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %a, <i32 0, i32 -1, i32 -1, i32 -1> 146*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %b, <i32 -1, i32 0, i32 0, i32 0> 147*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 148*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker; Verify that the following test cases are folded into single shuffles. 153*9880d681SAndroid Build Coastguard Worker 154*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test13(<4 x i32> %a, <4 x i32> %b) { 155*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test13: 156*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 157*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] 158*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 160*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 1, i32 1, i32 4, i32 4> 161*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3> 162*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 163*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 164*9880d681SAndroid Build Coastguard Worker} 165*9880d681SAndroid Build Coastguard Worker 166*9880d681SAndroid Build Coastguard Worker 167*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test14(<2 x i64> %a, <2 x i64> %b) { 168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test14: 169*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 171*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 172*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 173*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0> 174*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 175*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 176*9880d681SAndroid Build Coastguard Worker} 177*9880d681SAndroid Build Coastguard Worker 178*9880d681SAndroid Build Coastguard Worker 179*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test15(<4 x i32> %a, <4 x i32> %b) { 180*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test15: 181*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 182*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,1,2,1] 183*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,1,2,3] 184*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm2[4,5,6,7] 185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 186*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 1> 187*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 2, i32 1, i32 4, i32 4> 188*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 189*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 190*9880d681SAndroid Build Coastguard Worker} 191*9880d681SAndroid Build Coastguard Worker 192*9880d681SAndroid Build Coastguard Worker 193*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test16(<2 x i64> %a, <2 x i64> %b) { 194*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test16: 195*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm1, %xmm0 198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 199*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0> 200*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 201*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 202*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker 206*9880d681SAndroid Build Coastguard Worker; Verify that the dag-combiner does not fold a OR of two shuffles into a single 207*9880d681SAndroid Build Coastguard Worker; shuffle instruction when the shuffle indexes are not compatible. 208*9880d681SAndroid Build Coastguard Worker 209*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test17(<4 x i32> %a, <4 x i32> %b) { 210*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test17: 211*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psllq $32, %xmm0 213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq {{.*#+}} xmm1 = xmm1[0],zero 214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por %xmm1, %xmm0 215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 216*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 2> 217*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4> 218*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 219*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 220*9880d681SAndroid Build Coastguard Worker} 221*9880d681SAndroid Build Coastguard Worker 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test18(<4 x i32> %a, <4 x i32> %b) { 224*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test18: 225*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 226*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm2, %xmm2 227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3,4,5,6,7] 228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,1,1] 229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3,4,5,6,7] 230*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por %xmm1, %xmm0 231*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 232*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 4> 233*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 4, i32 4> 234*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 235*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 236*9880d681SAndroid Build Coastguard Worker} 237*9880d681SAndroid Build Coastguard Worker 238*9880d681SAndroid Build Coastguard Worker 239*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test19(<4 x i32> %a, <4 x i32> %b) { 240*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test19: 241*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm2 = xmm0[0,0,2,3] 243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pxor %xmm3, %xmm3 244*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm2 = xmm3[0,1],xmm2[2,3],xmm3[4,5],xmm2[6,7] 245*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,2,2] 246*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,3],xmm0[4,5,6,7] 247*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por %xmm2, %xmm0 248*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 249*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 0, i32 4, i32 3> 250*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 4, i32 2, i32 2> 251*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 252*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 253*9880d681SAndroid Build Coastguard Worker} 254*9880d681SAndroid Build Coastguard Worker 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test20(<2 x i64> %a, <2 x i64> %b) { 257*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test20: 258*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 259*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por %xmm1, %xmm0 260*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 261*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 262*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 263*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 0, i32 2> 264*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 265*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 266*9880d681SAndroid Build Coastguard Worker} 267*9880d681SAndroid Build Coastguard Worker 268*9880d681SAndroid Build Coastguard Worker 269*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test21(<2 x i64> %a, <2 x i64> %b) { 270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test21: 271*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: por %xmm1, %xmm0 273*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0,1,2,3,4,5,6,7] 274*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 275*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <2 x i64> %a, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0> 276*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <2 x i64> %b, <2 x i64> zeroinitializer, <2 x i32><i32 2, i32 0> 277*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %shuf1, %shuf2 278*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %or 279*9880d681SAndroid Build Coastguard Worker} 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Worker 282*9880d681SAndroid Build Coastguard Worker; Verify that the dag-combiner keeps the correct domain for float/double vectors 283*9880d681SAndroid Build Coastguard Worker; bitcast to use the mask-or blend combine. 284*9880d681SAndroid Build Coastguard Worker 285*9880d681SAndroid Build Coastguard Workerdefine <2 x double> @test22(<2 x double> %a0, <2 x double> %a1) { 286*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test22: 287*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 288*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 289*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 290*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <2 x double> %a0 to <2 x i64> 291*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <2 x double> %a1 to <2 x i64> 292*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, <i64 0, i64 -1> 293*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, <i64 -1, i64 0> 294*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 295*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast <2 x i64> %or to <2 x double> 296*9880d681SAndroid Build Coastguard Worker ret <2 x double> %bc3 297*9880d681SAndroid Build Coastguard Worker} 298*9880d681SAndroid Build Coastguard Worker 299*9880d681SAndroid Build Coastguard Worker 300*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test23(<4 x float> %a0, <4 x float> %a1) { 301*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test23: 302*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 303*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2],xmm1[3] 304*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 305*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x float> %a0 to <4 x i32> 306*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x float> %a1 to <4 x i32> 307*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %bc1, <i32 0, i32 -1, i32 -1, i32 0> 308*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %bc2, <i32 -1, i32 0, i32 0, i32 -1> 309*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 310*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast <4 x i32> %or to <4 x float> 311*9880d681SAndroid Build Coastguard Worker ret <4 x float> %bc3 312*9880d681SAndroid Build Coastguard Worker} 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker 315*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test24(<4 x float> %a0, <4 x float> %a1) { 316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test24: 317*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 319*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 320*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x float> %a0 to <2 x i64> 321*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x float> %a1 to <2 x i64> 322*9880d681SAndroid Build Coastguard Worker %and1 = and <2 x i64> %bc1, <i64 0, i64 -1> 323*9880d681SAndroid Build Coastguard Worker %and2 = and <2 x i64> %bc2, <i64 -1, i64 0> 324*9880d681SAndroid Build Coastguard Worker %or = or <2 x i64> %and1, %and2 325*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast <2 x i64> %or to <4 x float> 326*9880d681SAndroid Build Coastguard Worker ret <4 x float> %bc3 327*9880d681SAndroid Build Coastguard Worker} 328*9880d681SAndroid Build Coastguard Worker 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @test25(<4 x float> %a0) { 331*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test25: 332*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 333*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: blendps {{.*#+}} xmm0 = mem[0],xmm0[1,2],mem[3] 334*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 335*9880d681SAndroid Build Coastguard Worker %bc1 = bitcast <4 x float> %a0 to <4 x i32> 336*9880d681SAndroid Build Coastguard Worker %bc2 = bitcast <4 x float> <float 1.0, float 1.0, float 1.0, float 1.0> to <4 x i32> 337*9880d681SAndroid Build Coastguard Worker %and1 = and <4 x i32> %bc1, <i32 0, i32 -1, i32 -1, i32 0> 338*9880d681SAndroid Build Coastguard Worker %and2 = and <4 x i32> %bc2, <i32 -1, i32 0, i32 0, i32 -1> 339*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %and1, %and2 340*9880d681SAndroid Build Coastguard Worker %bc3 = bitcast <4 x i32> %or to <4 x float> 341*9880d681SAndroid Build Coastguard Worker ret <4 x float> %bc3 342*9880d681SAndroid Build Coastguard Worker} 343*9880d681SAndroid Build Coastguard Worker 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker; Verify that the DAGCombiner doesn't crash in the attempt to check if a shuffle 346*9880d681SAndroid Build Coastguard Worker; with illegal type has a legal mask. Method 'isShuffleMaskLegal' only knows how to 347*9880d681SAndroid Build Coastguard Worker; handle legal vector value types. 348*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @test_crash(<4 x i8> %a, <4 x i8> %b) { 349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_crash: 350*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 353*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i8> %a, <4 x i8> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3> 354*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i8> %b, <4 x i8> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4> 355*9880d681SAndroid Build Coastguard Worker %or = or <4 x i8> %shuf1, %shuf2 356*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %or 357*9880d681SAndroid Build Coastguard Worker} 358*9880d681SAndroid Build Coastguard Worker 359*9880d681SAndroid Build Coastguard Worker; Verify that we can fold regardless of which operand is the zeroinitializer 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2b(<4 x i32> %a, <4 x i32> %b) { 362*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2b: 363*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 365*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 366*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32><i32 0, i32 0, i32 6, i32 7> 367*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> zeroinitializer, <4 x i32><i32 0, i32 1, i32 4, i32 4> 368*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 369*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 370*9880d681SAndroid Build Coastguard Worker} 371*9880d681SAndroid Build Coastguard Worker 372*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2c(<4 x i32> %a, <4 x i32> %b) { 373*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2c: 374*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 375*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 377*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %a, <4 x i32><i32 0, i32 0, i32 6, i32 7> 378*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %b, <4 x i32><i32 4, i32 5, i32 0, i32 0> 379*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 380*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 381*9880d681SAndroid Build Coastguard Worker} 382*9880d681SAndroid Build Coastguard Worker 383*9880d681SAndroid Build Coastguard Worker 384*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2d(<4 x i32> %a, <4 x i32> %b) { 385*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2d: 386*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 387*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 388*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 389*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> zeroinitializer, <4 x i32><i32 4, i32 4, i32 2, i32 3> 390*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> zeroinitializer, <4 x i32> %b, <4 x i32><i32 4, i32 5, i32 0, i32 0> 391*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 392*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 393*9880d681SAndroid Build Coastguard Worker} 394*9880d681SAndroid Build Coastguard Worker 395*9880d681SAndroid Build Coastguard Worker; Make sure we can have an undef where an index pointing to the zero vector should be 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2e(<4 x i32> %a, <4 x i32> %b) { 398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2e: 399*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 402*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 undef, i32 4, i32 2, i32 3> 403*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 0, i32 1, i32 4, i32 4> 404*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 405*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 406*9880d681SAndroid Build Coastguard Worker} 407*9880d681SAndroid Build Coastguard Worker 408*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test2f(<4 x i32> %a, <4 x i32> %b) { 409*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2f: 410*9880d681SAndroid Build Coastguard Worker; CHECK: # BB#0: 411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 412*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: retq 413*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 4, i32 4, i32 2, i32 3> 414*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> <i32 0, i32 undef, i32 undef, i32 undef>, <4 x i32><i32 undef, i32 1, i32 4, i32 4> 415*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 416*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 417*9880d681SAndroid Build Coastguard Worker} 418