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 -mcpu=x86-64 -mattr=+sse2 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE2 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+ssse3 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSSE3 4*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+sse4.1 | FileCheck %s --check-prefix=ALL --check-prefix=SSE --check-prefix=SSE41 5*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+avx | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX1 6*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mcpu=x86-64 -mattr=+avx2 | FileCheck %s --check-prefix=ALL --check-prefix=AVX --check-prefix=AVX2 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker; Verify that the DAG combiner correctly folds bitwise operations across 9*9880d681SAndroid Build Coastguard Worker; shuffles, nested shuffles with undef, pairs of nested shuffles, and other 10*9880d681SAndroid Build Coastguard Worker; basic and always-safe patterns. Also test that the DAG combiner will combine 11*9880d681SAndroid Build Coastguard Worker; target-specific shuffle instructions where reasonable. 12*9880d681SAndroid Build Coastguard Worker 13*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-unknown" 14*9880d681SAndroid Build Coastguard Worker 15*9880d681SAndroid Build Coastguard Workerdeclare <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32>, i8) 16*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16>, i8) 17*9880d681SAndroid Build Coastguard Workerdeclare <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16>, i8) 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd1(<4 x i32> %a) { 20*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd1: 21*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: # %entry 22*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 23*9880d681SAndroid Build Coastguard Workerentry: 24*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27) 25*9880d681SAndroid Build Coastguard Worker %c = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %b, i8 27) 26*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %c 27*9880d681SAndroid Build Coastguard Worker} 28*9880d681SAndroid Build Coastguard Worker 29*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd2(<4 x i32> %a) { 30*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd2: 31*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: # %entry 32*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 33*9880d681SAndroid Build Coastguard Workerentry: 34*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27) 35*9880d681SAndroid Build Coastguard Worker %b.cast = bitcast <4 x i32> %b to <8 x i16> 36*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b.cast, i8 -28) 37*9880d681SAndroid Build Coastguard Worker %c.cast = bitcast <8 x i16> %c to <4 x i32> 38*9880d681SAndroid Build Coastguard Worker %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 27) 39*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %d 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd3(<4 x i32> %a) { 43*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshufd3: 44*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: # %entry 45*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 46*9880d681SAndroid Build Coastguard Workerentry: 47*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 27) 48*9880d681SAndroid Build Coastguard Worker %b.cast = bitcast <4 x i32> %b to <8 x i16> 49*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b.cast, i8 -28) 50*9880d681SAndroid Build Coastguard Worker %c.cast = bitcast <8 x i16> %c to <4 x i32> 51*9880d681SAndroid Build Coastguard Worker %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 27) 52*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %d 53*9880d681SAndroid Build Coastguard Worker} 54*9880d681SAndroid Build Coastguard Worker 55*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd4(<4 x i32> %a) { 56*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd4: 57*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 58*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 59*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 60*9880d681SAndroid Build Coastguard Worker; 61*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufd4: 62*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 63*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 64*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 65*9880d681SAndroid Build Coastguard Workerentry: 66*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 -31) 67*9880d681SAndroid Build Coastguard Worker %b.cast = bitcast <4 x i32> %b to <8 x i16> 68*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b.cast, i8 27) 69*9880d681SAndroid Build Coastguard Worker %c.cast = bitcast <8 x i16> %c to <4 x i32> 70*9880d681SAndroid Build Coastguard Worker %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 -31) 71*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %d 72*9880d681SAndroid Build Coastguard Worker} 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd5(<4 x i32> %a) { 75*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd5: 76*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 77*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 78*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 79*9880d681SAndroid Build Coastguard Worker; 80*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufd5: 81*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 82*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 83*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 84*9880d681SAndroid Build Coastguard Workerentry: 85*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 -76) 86*9880d681SAndroid Build Coastguard Worker %b.cast = bitcast <4 x i32> %b to <8 x i16> 87*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b.cast, i8 27) 88*9880d681SAndroid Build Coastguard Worker %c.cast = bitcast <8 x i16> %c to <4 x i32> 89*9880d681SAndroid Build Coastguard Worker %d = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %c.cast, i8 -76) 90*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %d 91*9880d681SAndroid Build Coastguard Worker} 92*9880d681SAndroid Build Coastguard Worker 93*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_pshufd6(<4 x i32> %a) { 94*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufd6: 95*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 96*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 97*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 98*9880d681SAndroid Build Coastguard Worker; 99*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_pshufd6: 100*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: # %entry 101*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,0,0,0] 102*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 103*9880d681SAndroid Build Coastguard Worker; 104*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_pshufd6: 105*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: # %entry 106*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vbroadcastss %xmm0, %xmm0 107*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 108*9880d681SAndroid Build Coastguard Workerentry: 109*9880d681SAndroid Build Coastguard Worker %b = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %a, i8 0) 110*9880d681SAndroid Build Coastguard Worker %c = call <4 x i32> @llvm.x86.sse2.pshuf.d(<4 x i32> %b, i8 8) 111*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %c 112*9880d681SAndroid Build Coastguard Worker} 113*9880d681SAndroid Build Coastguard Worker 114*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw1(<8 x i16> %a) { 115*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshuflw1: 116*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: # %entry 117*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 118*9880d681SAndroid Build Coastguard Workerentry: 119*9880d681SAndroid Build Coastguard Worker %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27) 120*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b, i8 27) 121*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %c 122*9880d681SAndroid Build Coastguard Worker} 123*9880d681SAndroid Build Coastguard Worker 124*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw2(<8 x i16> %a) { 125*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_pshuflw2: 126*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: # %entry 127*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 128*9880d681SAndroid Build Coastguard Workerentry: 129*9880d681SAndroid Build Coastguard Worker %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27) 130*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b, i8 -28) 131*9880d681SAndroid Build Coastguard Worker %d = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %c, i8 27) 132*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %d 133*9880d681SAndroid Build Coastguard Worker} 134*9880d681SAndroid Build Coastguard Worker 135*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshuflw3(<8 x i16> %a) { 136*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshuflw3: 137*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 138*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 139*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 140*9880d681SAndroid Build Coastguard Worker; 141*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshuflw3: 142*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 143*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,7,6,5,4] 144*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 145*9880d681SAndroid Build Coastguard Workerentry: 146*9880d681SAndroid Build Coastguard Worker %b = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %a, i8 27) 147*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %b, i8 27) 148*9880d681SAndroid Build Coastguard Worker %d = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %c, i8 27) 149*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %d 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @combine_pshufhw1(<8 x i16> %a) { 153*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_pshufhw1: 154*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 155*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 156*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 157*9880d681SAndroid Build Coastguard Worker; 158*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_pshufhw1: 159*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 160*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[3,2,1,0,4,5,6,7] 161*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 162*9880d681SAndroid Build Coastguard Workerentry: 163*9880d681SAndroid Build Coastguard Worker %b = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %a, i8 27) 164*9880d681SAndroid Build Coastguard Worker %c = call <8 x i16> @llvm.x86.sse2.pshufl.w(<8 x i16> %b, i8 27) 165*9880d681SAndroid Build Coastguard Worker %d = call <8 x i16> @llvm.x86.sse2.pshufh.w(<8 x i16> %c, i8 27) 166*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %d 167*9880d681SAndroid Build Coastguard Worker} 168*9880d681SAndroid Build Coastguard Worker 169*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 170*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test1: 171*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 172*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pand %xmm1, %xmm0 173*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 174*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 175*9880d681SAndroid Build Coastguard Worker; 176*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test1: 177*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 178*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 179*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 180*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 181*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 182*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 183*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 184*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 185*9880d681SAndroid Build Coastguard Worker} 186*9880d681SAndroid Build Coastguard Worker 187*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 188*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test2: 189*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 190*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: por %xmm1, %xmm0 191*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 192*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 193*9880d681SAndroid Build Coastguard Worker; 194*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test2: 195*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 196*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 197*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 198*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 199*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 200*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 201*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 202*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 203*9880d681SAndroid Build Coastguard Worker} 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 206*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test3: 207*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 208*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pxor %xmm1, %xmm0 209*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 210*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 211*9880d681SAndroid Build Coastguard Worker; 212*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test3: 213*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 214*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 215*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 216*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 217*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 218*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 1, i32 3> 219*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 220*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 221*9880d681SAndroid Build Coastguard Worker} 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 224*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test4: 225*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 226*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pand %xmm1, %xmm0 227*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 228*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 229*9880d681SAndroid Build Coastguard Worker; 230*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test4: 231*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 232*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpand %xmm1, %xmm0, %xmm0 233*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 234*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 235*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7> 236*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7> 237*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 238*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 239*9880d681SAndroid Build Coastguard Worker} 240*9880d681SAndroid Build Coastguard Worker 241*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 242*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test5: 243*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 244*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: por %xmm1, %xmm0 245*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 246*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 247*9880d681SAndroid Build Coastguard Worker; 248*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test5: 249*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 250*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpor %xmm1, %xmm0, %xmm0 251*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 252*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 253*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7> 254*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7> 255*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 256*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 257*9880d681SAndroid Build Coastguard Worker} 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 260*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_bitwise_ops_test6: 261*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 262*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pxor %xmm1, %xmm0 263*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 264*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 265*9880d681SAndroid Build Coastguard Worker; 266*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test6: 267*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 268*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 269*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 270*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 271*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 4, i32 6, i32 5, i32 7> 272*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 4, i32 6, i32 5, i32 7> 273*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 274*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker 278*9880d681SAndroid Build Coastguard Worker; Verify that DAGCombiner moves the shuffle after the xor/and/or even if shuffles 279*9880d681SAndroid Build Coastguard Worker; are not performing a swizzle operations. 280*9880d681SAndroid Build Coastguard Worker 281*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 282*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test1b: 283*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 284*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pand %xmm1, %xmm0 285*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 286*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 287*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 288*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 289*9880d681SAndroid Build Coastguard Worker; 290*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test1b: 291*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 292*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pand %xmm1, %xmm0 293*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 294*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 295*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 296*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 297*9880d681SAndroid Build Coastguard Worker; 298*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test1b: 299*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 300*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pand %xmm1, %xmm0 301*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 302*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 303*9880d681SAndroid Build Coastguard Worker; 304*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test1b: 305*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 306*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 307*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 308*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 309*9880d681SAndroid Build Coastguard Worker; 310*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test1b: 311*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 312*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 313*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3] 314*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 315*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 316*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 317*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 318*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 319*9880d681SAndroid Build Coastguard Worker} 320*9880d681SAndroid Build Coastguard Worker 321*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 322*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test2b: 323*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 324*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: por %xmm1, %xmm0 325*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 326*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 327*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 328*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 329*9880d681SAndroid Build Coastguard Worker; 330*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test2b: 331*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 332*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: por %xmm1, %xmm0 333*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 334*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 335*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 336*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 337*9880d681SAndroid Build Coastguard Worker; 338*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test2b: 339*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 340*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: por %xmm1, %xmm0 341*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 342*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 343*9880d681SAndroid Build Coastguard Worker; 344*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test2b: 345*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 346*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 347*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 348*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 349*9880d681SAndroid Build Coastguard Worker; 350*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test2b: 351*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 352*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 353*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3] 354*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 355*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 356*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 357*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 358*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 359*9880d681SAndroid Build Coastguard Worker} 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 362*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test3b: 363*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 364*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm1, %xmm0 365*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: andps {{.*}}(%rip), %xmm0 366*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 367*9880d681SAndroid Build Coastguard Worker; 368*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test3b: 369*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 370*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: xorps %xmm1, %xmm0 371*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: andps {{.*}}(%rip), %xmm0 372*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 373*9880d681SAndroid Build Coastguard Worker; 374*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test3b: 375*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 376*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm0 377*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm1 378*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 379*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 380*9880d681SAndroid Build Coastguard Worker; 381*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test3b: 382*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 383*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 384*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 385*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 386*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 387*9880d681SAndroid Build Coastguard Worker; 388*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test3b: 389*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 390*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 391*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 392*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] 393*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 394*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 395*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 5, i32 2, i32 7> 396*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 397*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 398*9880d681SAndroid Build Coastguard Worker} 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 401*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test4b: 402*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 403*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pand %xmm1, %xmm0 404*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 405*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 406*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 407*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 408*9880d681SAndroid Build Coastguard Worker; 409*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test4b: 410*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 411*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pand %xmm1, %xmm0 412*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 413*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 414*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 415*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 416*9880d681SAndroid Build Coastguard Worker; 417*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test4b: 418*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 419*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pand %xmm1, %xmm0 420*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 421*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 422*9880d681SAndroid Build Coastguard Worker; 423*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test4b: 424*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 425*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 426*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 427*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 428*9880d681SAndroid Build Coastguard Worker; 429*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test4b: 430*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 431*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 432*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3] 433*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 434*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7> 435*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7> 436*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 437*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 438*9880d681SAndroid Build Coastguard Worker} 439*9880d681SAndroid Build Coastguard Worker 440*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 441*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test5b: 442*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 443*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: por %xmm1, %xmm0 444*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 445*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 446*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 447*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 448*9880d681SAndroid Build Coastguard Worker; 449*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test5b: 450*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 451*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: por %xmm1, %xmm0 452*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 453*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 454*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 455*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 456*9880d681SAndroid Build Coastguard Worker; 457*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test5b: 458*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 459*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: por %xmm1, %xmm0 460*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 461*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 462*9880d681SAndroid Build Coastguard Worker; 463*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test5b: 464*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 465*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 466*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 467*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 468*9880d681SAndroid Build Coastguard Worker; 469*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test5b: 470*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 471*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 472*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3] 473*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 474*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7> 475*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7> 476*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 477*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 478*9880d681SAndroid Build Coastguard Worker} 479*9880d681SAndroid Build Coastguard Worker 480*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6b(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 481*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test6b: 482*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 483*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm1, %xmm0 484*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: andps {{.*}}(%rip), %xmm0 485*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 486*9880d681SAndroid Build Coastguard Worker; 487*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test6b: 488*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 489*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: xorps %xmm1, %xmm0 490*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: andps {{.*}}(%rip), %xmm0 491*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 492*9880d681SAndroid Build Coastguard Worker; 493*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test6b: 494*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 495*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm0 496*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm1 497*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7] 498*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 499*9880d681SAndroid Build Coastguard Worker; 500*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test6b: 501*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 502*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 503*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 504*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7] 505*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 506*9880d681SAndroid Build Coastguard Worker; 507*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test6b: 508*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 509*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 510*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 511*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3] 512*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 513*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 5, i32 2, i32 7> 514*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 5, i32 2, i32 7> 515*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 516*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 517*9880d681SAndroid Build Coastguard Worker} 518*9880d681SAndroid Build Coastguard Worker 519*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test1c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 520*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test1c: 521*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 522*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pand %xmm1, %xmm0 523*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 524*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 525*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 526*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 527*9880d681SAndroid Build Coastguard Worker; 528*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test1c: 529*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 530*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pand %xmm1, %xmm0 531*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 532*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 533*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 534*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 535*9880d681SAndroid Build Coastguard Worker; 536*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test1c: 537*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 538*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pand %xmm1, %xmm0 539*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 540*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 541*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 542*9880d681SAndroid Build Coastguard Worker; 543*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test1c: 544*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 545*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 546*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 547*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 548*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 549*9880d681SAndroid Build Coastguard Worker; 550*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test1c: 551*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 552*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 553*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3] 554*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 555*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 556*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 557*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 558*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 559*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 560*9880d681SAndroid Build Coastguard Worker} 561*9880d681SAndroid Build Coastguard Worker 562*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test2c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 563*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test2c: 564*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 565*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: por %xmm1, %xmm0 566*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 567*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 568*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 569*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 570*9880d681SAndroid Build Coastguard Worker; 571*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test2c: 572*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 573*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: por %xmm1, %xmm0 574*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 575*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,3,2,3] 576*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 577*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 578*9880d681SAndroid Build Coastguard Worker; 579*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test2c: 580*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 581*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: por %xmm1, %xmm0 582*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 583*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 584*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 585*9880d681SAndroid Build Coastguard Worker; 586*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test2c: 587*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 588*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 589*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] 590*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 591*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 592*9880d681SAndroid Build Coastguard Worker; 593*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test2c: 594*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 595*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 596*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm2[1],xmm0[2],xmm2[3] 597*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 598*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 599*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 600*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 601*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 602*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 603*9880d681SAndroid Build Coastguard Worker} 604*9880d681SAndroid Build Coastguard Worker 605*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test3c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 606*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test3c: 607*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 608*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pxor %xmm1, %xmm0 609*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2] 610*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pxor %xmm1, %xmm1 611*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 612*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 613*9880d681SAndroid Build Coastguard Worker; 614*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test3c: 615*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 616*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pxor %xmm1, %xmm0 617*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,2] 618*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pxor %xmm1, %xmm1 619*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 620*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 621*9880d681SAndroid Build Coastguard Worker; 622*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test3c: 623*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 624*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm0 625*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 626*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movq {{.*#+}} xmm0 = xmm0[0],zero 627*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 628*9880d681SAndroid Build Coastguard Worker; 629*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_bitwise_ops_test3c: 630*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 631*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 632*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 633*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovq {{.*#+}} xmm0 = xmm0[0],zero 634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 635*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %a, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 636*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %b, <4 x i32> %c, <4 x i32><i32 0, i32 2, i32 5, i32 7> 637*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 638*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 639*9880d681SAndroid Build Coastguard Worker} 640*9880d681SAndroid Build Coastguard Worker 641*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test4c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 642*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test4c: 643*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 644*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pand %xmm1, %xmm0 645*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 646*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 647*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 648*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 649*9880d681SAndroid Build Coastguard Worker; 650*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test4c: 651*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 652*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pand %xmm1, %xmm0 653*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 654*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 655*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 656*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 657*9880d681SAndroid Build Coastguard Worker; 658*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test4c: 659*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 660*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pand %xmm1, %xmm0 661*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 662*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 663*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 664*9880d681SAndroid Build Coastguard Worker; 665*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test4c: 666*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 667*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0 668*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 669*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 670*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 671*9880d681SAndroid Build Coastguard Worker; 672*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test4c: 673*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 674*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0 675*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3] 676*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 677*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 678*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7> 679*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7> 680*9880d681SAndroid Build Coastguard Worker %and = and <4 x i32> %shuf1, %shuf2 681*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %and 682*9880d681SAndroid Build Coastguard Worker} 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test5c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 685*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test5c: 686*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 687*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: por %xmm1, %xmm0 688*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 689*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 690*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 691*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 692*9880d681SAndroid Build Coastguard Worker; 693*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test5c: 694*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 695*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: por %xmm1, %xmm0 696*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 697*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 698*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 699*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 700*9880d681SAndroid Build Coastguard Worker; 701*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test5c: 702*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 703*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: por %xmm1, %xmm0 704*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 705*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 706*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 707*9880d681SAndroid Build Coastguard Worker; 708*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test5c: 709*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 710*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpor %xmm1, %xmm0, %xmm0 711*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm2[0,1],xmm0[2,3],xmm2[4,5],xmm0[6,7] 712*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 713*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 714*9880d681SAndroid Build Coastguard Worker; 715*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test5c: 716*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 717*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpor %xmm1, %xmm0, %xmm0 718*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1],xmm2[2],xmm0[3] 719*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 720*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 721*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7> 722*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7> 723*9880d681SAndroid Build Coastguard Worker %or = or <4 x i32> %shuf1, %shuf2 724*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %or 725*9880d681SAndroid Build Coastguard Worker} 726*9880d681SAndroid Build Coastguard Worker 727*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_bitwise_ops_test6c(<4 x i32> %a, <4 x i32> %b, <4 x i32> %c) { 728*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_bitwise_ops_test6c: 729*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 730*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pxor %xmm1, %xmm0 731*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 732*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pxor %xmm0, %xmm0 733*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 734*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 735*9880d681SAndroid Build Coastguard Worker; 736*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_bitwise_ops_test6c: 737*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 738*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pxor %xmm1, %xmm0 739*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,3,2,3] 740*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pxor %xmm0, %xmm0 741*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 742*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 743*9880d681SAndroid Build Coastguard Worker; 744*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_bitwise_ops_test6c: 745*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 746*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm1, %xmm0 747*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[0,1,1,3] 748*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pxor %xmm0, %xmm0 749*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1,2,3],xmm1[4,5,6,7] 750*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 751*9880d681SAndroid Build Coastguard Worker; 752*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_bitwise_ops_test6c: 753*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 754*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0 755*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 756*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 757*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 758*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 759*9880d681SAndroid Build Coastguard Worker; 760*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_bitwise_ops_test6c: 761*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 762*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0 763*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,3] 764*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 765*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 766*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 767*9880d681SAndroid Build Coastguard Worker %shuf1 = shufflevector <4 x i32> %c, <4 x i32> %a, <4 x i32><i32 0, i32 2, i32 5, i32 7> 768*9880d681SAndroid Build Coastguard Worker %shuf2 = shufflevector <4 x i32> %c, <4 x i32> %b, <4 x i32><i32 0, i32 2, i32 5, i32 7> 769*9880d681SAndroid Build Coastguard Worker %xor = xor <4 x i32> %shuf1, %shuf2 770*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %xor 771*9880d681SAndroid Build Coastguard Worker} 772*9880d681SAndroid Build Coastguard Worker 773*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test1(<4 x i32> %A, <4 x i32> %B) { 774*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test1: 775*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 776*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 777*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 778*9880d681SAndroid Build Coastguard Worker; 779*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test1: 780*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 781*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 782*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 783*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 3, i32 1> 784*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3> 785*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 786*9880d681SAndroid Build Coastguard Worker} 787*9880d681SAndroid Build Coastguard Worker 788*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test2(<4 x i32> %A, <4 x i32> %B) { 789*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test2: 790*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 791*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3] 792*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 793*9880d681SAndroid Build Coastguard Worker; 794*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test2: 795*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 796*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,0,3] 797*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 798*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 3> 799*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3> 800*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 801*9880d681SAndroid Build Coastguard Worker} 802*9880d681SAndroid Build Coastguard Worker 803*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test3(<4 x i32> %A, <4 x i32> %B) { 804*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test3: 805*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 806*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,1,0,3] 807*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 808*9880d681SAndroid Build Coastguard Worker; 809*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test3: 810*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 811*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,1,0,3] 812*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 813*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 3> 814*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 3> 815*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 816*9880d681SAndroid Build Coastguard Worker} 817*9880d681SAndroid Build Coastguard Worker 818*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test4(<4 x i32> %A, <4 x i32> %B) { 819*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test4: 820*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 821*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 822*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 823*9880d681SAndroid Build Coastguard Worker; 824*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test4: 825*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 826*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 827*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 828*9880d681SAndroid Build Coastguard Worker; 829*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test4: 830*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 831*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 832*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 833*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 7, i32 1> 834*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 4, i32 4, i32 0, i32 3> 835*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 836*9880d681SAndroid Build Coastguard Worker} 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test5(<4 x i32> %A, <4 x i32> %B) { 839*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test5: 840*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 841*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 842*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 843*9880d681SAndroid Build Coastguard Worker; 844*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test5: 845*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 846*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 847*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 848*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 5, i32 5, i32 2, i32 3> 849*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 4, i32 3> 850*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 851*9880d681SAndroid Build Coastguard Worker} 852*9880d681SAndroid Build Coastguard Worker 853*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test6(<4 x i32> %A, <4 x i32> %B) { 854*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test6: 855*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 856*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 857*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 858*9880d681SAndroid Build Coastguard Worker; 859*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test6: 860*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 861*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 862*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 863*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 4> 864*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 4, i32 0, i32 4> 865*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 866*9880d681SAndroid Build Coastguard Worker} 867*9880d681SAndroid Build Coastguard Worker 868*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test7(<4 x i32> %A, <4 x i32> %B) { 869*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test7: 870*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 871*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,0,2] 872*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 873*9880d681SAndroid Build Coastguard Worker; 874*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test7: 875*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 876*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,0,2] 877*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 878*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 879*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 2, i32 0, i32 2> 880*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 881*9880d681SAndroid Build Coastguard Worker} 882*9880d681SAndroid Build Coastguard Worker 883*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test8(<4 x i32> %A, <4 x i32> %B) { 884*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test8: 885*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 886*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 887*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 888*9880d681SAndroid Build Coastguard Worker; 889*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test8: 890*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 891*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 892*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 893*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 894*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 4, i32 3, i32 4> 895*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 896*9880d681SAndroid Build Coastguard Worker} 897*9880d681SAndroid Build Coastguard Worker 898*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test9(<4 x i32> %A, <4 x i32> %B) { 899*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test9: 900*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 901*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,3,2,2] 902*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 903*9880d681SAndroid Build Coastguard Worker; 904*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test9: 905*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 906*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,3,2,2] 907*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 908*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 3, i32 2, i32 5> 909*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 4, i32 2> 910*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 911*9880d681SAndroid Build Coastguard Worker} 912*9880d681SAndroid Build Coastguard Worker 913*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test10(<4 x i32> %A, <4 x i32> %B) { 914*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test10: 915*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 916*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,3] 917*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 918*9880d681SAndroid Build Coastguard Worker; 919*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test10: 920*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 921*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,1,3] 922*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 923*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 1, i32 5, i32 5> 924*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 4> 925*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 926*9880d681SAndroid Build Coastguard Worker} 927*9880d681SAndroid Build Coastguard Worker 928*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test11(<4 x i32> %A, <4 x i32> %B) { 929*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test11: 930*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 931*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,1] 932*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 933*9880d681SAndroid Build Coastguard Worker; 934*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test11: 935*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 936*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,1,2,1] 937*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 938*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 2, i32 5, i32 4> 939*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 0> 940*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 941*9880d681SAndroid Build Coastguard Worker} 942*9880d681SAndroid Build Coastguard Worker 943*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test12(<4 x i32> %A, <4 x i32> %B) { 944*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test12: 945*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 946*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 947*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 948*9880d681SAndroid Build Coastguard Worker; 949*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test12: 950*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 951*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 952*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 953*9880d681SAndroid Build Coastguard Worker; 954*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test12: 955*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 956*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 957*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 958*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 0, i32 2, i32 4> 959*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 4, i32 0, i32 4> 960*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 961*9880d681SAndroid Build Coastguard Worker} 962*9880d681SAndroid Build Coastguard Worker 963*9880d681SAndroid Build Coastguard Worker; The following pair of shuffles is folded into vector %A. 964*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test13(<4 x i32> %A, <4 x i32> %B) { 965*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_nested_undef_test13: 966*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 967*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 968*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 1, i32 4, i32 2, i32 6> 969*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 4, i32 0, i32 2, i32 4> 970*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 971*9880d681SAndroid Build Coastguard Worker} 972*9880d681SAndroid Build Coastguard Worker 973*9880d681SAndroid Build Coastguard Worker; The following pair of shuffles is folded into vector %B. 974*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test14(<4 x i32> %A, <4 x i32> %B) { 975*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test14: 976*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 977*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm1, %xmm0 978*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 979*9880d681SAndroid Build Coastguard Worker; 980*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test14: 981*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 982*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovaps %xmm1, %xmm0 983*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 984*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 6, i32 2, i32 4> 985*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 4, i32 1, i32 4> 986*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 987*9880d681SAndroid Build Coastguard Worker} 988*9880d681SAndroid Build Coastguard Worker 989*9880d681SAndroid Build Coastguard Worker 990*9880d681SAndroid Build Coastguard Worker; Verify that we don't optimize the following cases. We expect more than one shuffle. 991*9880d681SAndroid Build Coastguard Worker; 992*9880d681SAndroid Build Coastguard Worker; FIXME: Many of these already don't make sense, and the rest should stop 993*9880d681SAndroid Build Coastguard Worker; making sense with th enew vector shuffle lowering. Revisit at least testing for 994*9880d681SAndroid Build Coastguard Worker; it. 995*9880d681SAndroid Build Coastguard Worker 996*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test15(<4 x i32> %A, <4 x i32> %B) { 997*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test15: 998*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 999*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 1000*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,1] 1001*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1002*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1003*9880d681SAndroid Build Coastguard Worker; 1004*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test15: 1005*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1006*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 1007*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,1] 1008*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1009*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1010*9880d681SAndroid Build Coastguard Worker; 1011*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test15: 1012*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1013*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1] 1014*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1015*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 1016*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1017*9880d681SAndroid Build Coastguard Worker; 1018*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test15: 1019*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1020*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,1,1] 1021*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1022*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 1023*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1024*9880d681SAndroid Build Coastguard Worker; 1025*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test15: 1026*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1027*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastd %xmm1, %xmm1 1028*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1029*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3] 1030*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1031*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 3, i32 1> 1032*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3> 1033*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1034*9880d681SAndroid Build Coastguard Worker} 1035*9880d681SAndroid Build Coastguard Worker 1036*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test16(<4 x i32> %A, <4 x i32> %B) { 1037*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test16: 1038*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1039*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 1040*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3] 1041*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1042*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1043*9880d681SAndroid Build Coastguard Worker; 1044*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test16: 1045*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1046*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,3,2,3] 1047*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,0,2,3] 1048*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1049*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1050*9880d681SAndroid Build Coastguard Worker; 1051*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test16: 1052*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1053*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1054*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 1055*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1056*9880d681SAndroid Build Coastguard Worker; 1057*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test16: 1058*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1059*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1060*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] 1061*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1062*9880d681SAndroid Build Coastguard Worker; 1063*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test16: 1064*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1065*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 1066*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2],xmm1[3] 1067*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1068*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1069*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3> 1070*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1071*9880d681SAndroid Build Coastguard Worker} 1072*9880d681SAndroid Build Coastguard Worker 1073*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test17(<4 x i32> %A, <4 x i32> %B) { 1074*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test17: 1075*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1076*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[1,0] 1077*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1],xmm1[0,2] 1078*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1079*9880d681SAndroid Build Coastguard Worker; 1080*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test17: 1081*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1082*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[1,0] 1083*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1],xmm1[0,2] 1084*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1085*9880d681SAndroid Build Coastguard Worker; 1086*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test17: 1087*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1088*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 1089*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1090*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1091*9880d681SAndroid Build Coastguard Worker; 1092*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test17: 1093*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1094*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 1095*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1096*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1097*9880d681SAndroid Build Coastguard Worker; 1098*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test17: 1099*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1100*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 1101*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[3,1,0,1] 1102*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1103*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 3, i32 1> 1104*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3> 1105*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1106*9880d681SAndroid Build Coastguard Worker} 1107*9880d681SAndroid Build Coastguard Worker 1108*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test18(<4 x i32> %A, <4 x i32> %B) { 1109*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test18: 1110*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1111*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,0,3] 1112*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1113*9880d681SAndroid Build Coastguard Worker; 1114*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test18: 1115*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1116*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[1,1,0,3] 1117*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1118*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7> 1119*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 0, i32 3> 1120*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1121*9880d681SAndroid Build Coastguard Worker} 1122*9880d681SAndroid Build Coastguard Worker 1123*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test19(<4 x i32> %A, <4 x i32> %B) { 1124*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test19: 1125*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1126*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1127*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,0,0,0] 1128*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1129*9880d681SAndroid Build Coastguard Worker; 1130*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test19: 1131*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1132*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1133*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,0,0,0] 1134*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1135*9880d681SAndroid Build Coastguard Worker; 1136*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test19: 1137*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1138*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 1139*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,0,0,0] 1140*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1141*9880d681SAndroid Build Coastguard Worker; 1142*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test19: 1143*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1144*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 1145*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0] 1146*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1147*9880d681SAndroid Build Coastguard Worker; 1148*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test19: 1149*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1150*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1],xmm0[2,3] 1151*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[1,0,0,0] 1152*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1153*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 0, i32 4, i32 5, i32 6> 1154*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 0, i32 0, i32 0> 1155*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1156*9880d681SAndroid Build Coastguard Worker} 1157*9880d681SAndroid Build Coastguard Worker 1158*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test20(<4 x i32> %A, <4 x i32> %B) { 1159*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test20: 1160*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1161*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,3] 1162*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,3,1] 1163*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1164*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1165*9880d681SAndroid Build Coastguard Worker; 1166*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test20: 1167*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1168*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,3] 1169*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,3,1] 1170*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1171*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1172*9880d681SAndroid Build Coastguard Worker; 1173*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test20: 1174*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1175*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1176*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,3,0] 1177*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1178*9880d681SAndroid Build Coastguard Worker; 1179*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test20: 1180*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1181*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1,2,3],xmm0[4,5,6,7] 1182*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,3,0] 1183*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1184*9880d681SAndroid Build Coastguard Worker; 1185*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test20: 1186*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1187*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3] 1188*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,3,0] 1189*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1190*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 3, i32 2, i32 4, i32 4> 1191*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 1, i32 0, i32 3> 1192*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1193*9880d681SAndroid Build Coastguard Worker} 1194*9880d681SAndroid Build Coastguard Worker 1195*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test21(<4 x i32> %A, <4 x i32> %B) { 1196*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_nested_undef_test21: 1197*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1198*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1199*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,3,0,3] 1200*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1201*9880d681SAndroid Build Coastguard Worker; 1202*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_nested_undef_test21: 1203*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1204*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] 1205*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,3,0,3] 1206*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1207*9880d681SAndroid Build Coastguard Worker; 1208*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_nested_undef_test21: 1209*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1210*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1211*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1212*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1213*9880d681SAndroid Build Coastguard Worker; 1214*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test21: 1215*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1216*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1217*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1218*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1219*9880d681SAndroid Build Coastguard Worker; 1220*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test21: 1221*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1222*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1223*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 1224*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1225*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 3, i32 1> 1226*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 3> 1227*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1228*9880d681SAndroid Build Coastguard Worker} 1229*9880d681SAndroid Build Coastguard Worker 1230*9880d681SAndroid Build Coastguard Worker 1231*9880d681SAndroid Build Coastguard Worker; Test that we correctly combine shuffles according to rule 1232*9880d681SAndroid Build Coastguard Worker; shuffle(shuffle(x, y), undef) -> shuffle(y, undef) 1233*9880d681SAndroid Build Coastguard Worker 1234*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test22(<4 x i32> %A, <4 x i32> %B) { 1235*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test22: 1236*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1237*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,1,3] 1238*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1239*9880d681SAndroid Build Coastguard Worker; 1240*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test22: 1241*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1242*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[1,1,1,3] 1243*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1244*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7> 1245*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 1, i32 1, i32 1, i32 3> 1246*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1247*9880d681SAndroid Build Coastguard Worker} 1248*9880d681SAndroid Build Coastguard Worker 1249*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test23(<4 x i32> %A, <4 x i32> %B) { 1250*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test23: 1251*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1252*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,1,0,3] 1253*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1254*9880d681SAndroid Build Coastguard Worker; 1255*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test23: 1256*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1257*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,1,0,3] 1258*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1259*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 5, i32 2, i32 7> 1260*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 1, i32 0, i32 3> 1261*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1262*9880d681SAndroid Build Coastguard Worker} 1263*9880d681SAndroid Build Coastguard Worker 1264*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test24(<4 x i32> %A, <4 x i32> %B) { 1265*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test24: 1266*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1267*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[0,3,2,3] 1268*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1269*9880d681SAndroid Build Coastguard Worker; 1270*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test24: 1271*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1272*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,3,2,3] 1273*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1274*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %A, <4 x i32> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 7> 1275*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 0, i32 3, i32 2, i32 4> 1276*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1277*9880d681SAndroid Build Coastguard Worker} 1278*9880d681SAndroid Build Coastguard Worker 1279*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test25(<4 x i32> %A, <4 x i32> %B) { 1280*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test25: 1281*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1282*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1283*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1284*9880d681SAndroid Build Coastguard Worker; 1285*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test25: 1286*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1287*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1288*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1289*9880d681SAndroid Build Coastguard Worker; 1290*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test25: 1291*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1292*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 1293*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1294*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 5, i32 2, i32 4> 1295*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 1, i32 3, i32 1> 1296*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1297*9880d681SAndroid Build Coastguard Worker} 1298*9880d681SAndroid Build Coastguard Worker 1299*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test26(<4 x i32> %A, <4 x i32> %B) { 1300*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test26: 1301*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1302*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 1303*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1304*9880d681SAndroid Build Coastguard Worker; 1305*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test26: 1306*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1307*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[2,3,2,3] 1308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1309*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 2, i32 6, i32 7> 1310*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 2, i32 3> 1311*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1312*9880d681SAndroid Build Coastguard Worker} 1313*9880d681SAndroid Build Coastguard Worker 1314*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test27(<4 x i32> %A, <4 x i32> %B) { 1315*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test27: 1316*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1317*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1318*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1319*9880d681SAndroid Build Coastguard Worker; 1320*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_nested_undef_test27: 1321*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1322*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,0,1] 1323*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1324*9880d681SAndroid Build Coastguard Worker; 1325*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_nested_undef_test27: 1326*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1327*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpbroadcastq %xmm0, %xmm0 1328*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1329*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 2, i32 1, i32 5, i32 4> 1330*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 3, i32 2, i32 3, i32 2> 1331*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1332*9880d681SAndroid Build Coastguard Worker} 1333*9880d681SAndroid Build Coastguard Worker 1334*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_nested_undef_test28(<4 x i32> %A, <4 x i32> %B) { 1335*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_nested_undef_test28: 1336*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1337*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,1,1,0] 1338*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1339*9880d681SAndroid Build Coastguard Worker; 1340*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_nested_undef_test28: 1341*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1342*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,1,1,0] 1343*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1344*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %B, <4 x i32> %A, <4 x i32> <i32 1, i32 2, i32 4, i32 5> 1345*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> undef, <4 x i32> <i32 2, i32 3, i32 3, i32 2> 1346*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1347*9880d681SAndroid Build Coastguard Worker} 1348*9880d681SAndroid Build Coastguard Worker 1349*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test1(<4 x float> %a, <4 x float> %b) { 1350*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test1: 1351*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1352*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm1, %xmm0 1353*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1354*9880d681SAndroid Build Coastguard Worker; 1355*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test1: 1356*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1357*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovaps %xmm1, %xmm0 1358*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1359*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1360*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1361*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1362*9880d681SAndroid Build Coastguard Worker} 1363*9880d681SAndroid Build Coastguard Worker 1364*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test2(<4 x float> %a, <4 x float> %b) { 1365*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2: 1366*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1367*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1368*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1369*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1370*9880d681SAndroid Build Coastguard Worker; 1371*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2: 1372*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1373*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1374*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1375*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1376*9880d681SAndroid Build Coastguard Worker; 1377*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2: 1378*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1379*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1380*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1381*9880d681SAndroid Build Coastguard Worker; 1382*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2: 1383*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1384*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1385*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1386*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1387*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3> 1388*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1389*9880d681SAndroid Build Coastguard Worker} 1390*9880d681SAndroid Build Coastguard Worker 1391*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test3(<4 x float> %a, <4 x float> %b) { 1392*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test3: 1393*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1394*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1395*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1396*9880d681SAndroid Build Coastguard Worker; 1397*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3: 1398*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1399*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1400*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1401*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 1402*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1> 1403*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1404*9880d681SAndroid Build Coastguard Worker} 1405*9880d681SAndroid Build Coastguard Worker 1406*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test4(<4 x float> %a, <4 x float> %b) { 1407*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test4: 1408*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1409*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 1410*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movapd %xmm1, %xmm0 1411*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1412*9880d681SAndroid Build Coastguard Worker; 1413*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test4: 1414*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1415*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] 1416*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1417*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 1418*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 1419*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1420*9880d681SAndroid Build Coastguard Worker} 1421*9880d681SAndroid Build Coastguard Worker 1422*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test5(<4 x float> %a, <4 x float> %b) { 1423*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test5: 1424*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1425*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1426*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1427*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1428*9880d681SAndroid Build Coastguard Worker; 1429*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test5: 1430*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1431*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1432*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1433*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1434*9880d681SAndroid Build Coastguard Worker; 1435*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test5: 1436*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1437*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1438*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1439*9880d681SAndroid Build Coastguard Worker; 1440*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test5: 1441*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1442*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1443*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1444*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1445*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7> 1446*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1447*9880d681SAndroid Build Coastguard Worker} 1448*9880d681SAndroid Build Coastguard Worker 1449*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test6(<4 x i32> %a, <4 x i32> %b) { 1450*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test6: 1451*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1452*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm1, %xmm0 1453*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1454*9880d681SAndroid Build Coastguard Worker; 1455*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test6: 1456*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1457*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovaps %xmm1, %xmm0 1458*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1459*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1460*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1461*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1462*9880d681SAndroid Build Coastguard Worker} 1463*9880d681SAndroid Build Coastguard Worker 1464*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test7(<4 x i32> %a, <4 x i32> %b) { 1465*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test7: 1466*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1467*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1468*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1469*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1470*9880d681SAndroid Build Coastguard Worker; 1471*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test7: 1472*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1473*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1474*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1475*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1476*9880d681SAndroid Build Coastguard Worker; 1477*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test7: 1478*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1479*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 1480*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1481*9880d681SAndroid Build Coastguard Worker; 1482*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test7: 1483*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1484*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 1485*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1486*9880d681SAndroid Build Coastguard Worker; 1487*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test7: 1488*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1489*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1490*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1491*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1492*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3> 1493*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1494*9880d681SAndroid Build Coastguard Worker} 1495*9880d681SAndroid Build Coastguard Worker 1496*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test8(<4 x i32> %a, <4 x i32> %b) { 1497*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test8: 1498*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1499*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1500*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1501*9880d681SAndroid Build Coastguard Worker; 1502*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test8: 1503*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1504*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1505*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1506*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 1507*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1> 1508*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1509*9880d681SAndroid Build Coastguard Worker} 1510*9880d681SAndroid Build Coastguard Worker 1511*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test9(<4 x i32> %a, <4 x i32> %b) { 1512*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test9: 1513*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1514*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1] 1515*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm1, %xmm0 1516*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1517*9880d681SAndroid Build Coastguard Worker; 1518*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test9: 1519*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1520*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 1521*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1522*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 1523*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 1524*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1525*9880d681SAndroid Build Coastguard Worker} 1526*9880d681SAndroid Build Coastguard Worker 1527*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test10(<4 x i32> %a, <4 x i32> %b) { 1528*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test10: 1529*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1530*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1531*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1532*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1533*9880d681SAndroid Build Coastguard Worker; 1534*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test10: 1535*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1536*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1537*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1538*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1539*9880d681SAndroid Build Coastguard Worker; 1540*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test10: 1541*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1542*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1543*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1544*9880d681SAndroid Build Coastguard Worker; 1545*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test10: 1546*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1547*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1548*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1549*9880d681SAndroid Build Coastguard Worker; 1550*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test10: 1551*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1552*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1553*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1554*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1555*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7> 1556*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1557*9880d681SAndroid Build Coastguard Worker} 1558*9880d681SAndroid Build Coastguard Worker 1559*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test11(<4 x float> %a, <4 x float> %b) { 1560*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_test11: 1561*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 1562*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 1563*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1564*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1565*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1566*9880d681SAndroid Build Coastguard Worker} 1567*9880d681SAndroid Build Coastguard Worker 1568*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test12(<4 x float> %a, <4 x float> %b) { 1569*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test12: 1570*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1571*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1572*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1573*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1574*9880d681SAndroid Build Coastguard Worker; 1575*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test12: 1576*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1577*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1578*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1579*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1580*9880d681SAndroid Build Coastguard Worker; 1581*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test12: 1582*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1583*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1584*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1585*9880d681SAndroid Build Coastguard Worker; 1586*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test12: 1587*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1588*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1589*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1590*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7> 1591*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3> 1592*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1593*9880d681SAndroid Build Coastguard Worker} 1594*9880d681SAndroid Build Coastguard Worker 1595*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test13(<4 x float> %a, <4 x float> %b) { 1596*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test13: 1597*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1598*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1599*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1600*9880d681SAndroid Build Coastguard Worker; 1601*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test13: 1602*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1603*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1604*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1605*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5> 1606*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 5, i32 2, i32 3> 1607*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1608*9880d681SAndroid Build Coastguard Worker} 1609*9880d681SAndroid Build Coastguard Worker 1610*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test14(<4 x float> %a, <4 x float> %b) { 1611*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test14: 1612*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1613*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1614*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1615*9880d681SAndroid Build Coastguard Worker; 1616*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test14: 1617*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1618*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1619*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1620*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 5, i32 5> 1621*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 1622*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1623*9880d681SAndroid Build Coastguard Worker} 1624*9880d681SAndroid Build Coastguard Worker 1625*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test15(<4 x float> %a, <4 x float> %b) { 1626*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test15: 1627*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1628*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1629*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1630*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1631*9880d681SAndroid Build Coastguard Worker; 1632*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test15: 1633*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1634*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1635*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1636*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1637*9880d681SAndroid Build Coastguard Worker; 1638*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test15: 1639*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1640*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1641*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1642*9880d681SAndroid Build Coastguard Worker; 1643*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test15: 1644*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1645*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1646*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1647*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7> 1648*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 5, i32 2, i32 3> 1649*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1650*9880d681SAndroid Build Coastguard Worker} 1651*9880d681SAndroid Build Coastguard Worker 1652*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test16(<4 x i32> %a, <4 x i32> %b) { 1653*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_test16: 1654*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 1655*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 1656*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1657*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1658*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1659*9880d681SAndroid Build Coastguard Worker} 1660*9880d681SAndroid Build Coastguard Worker 1661*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test17(<4 x i32> %a, <4 x i32> %b) { 1662*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test17: 1663*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1664*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1665*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1666*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1667*9880d681SAndroid Build Coastguard Worker; 1668*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test17: 1669*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1670*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 1671*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 1672*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1673*9880d681SAndroid Build Coastguard Worker; 1674*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test17: 1675*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1676*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 1677*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1678*9880d681SAndroid Build Coastguard Worker; 1679*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test17: 1680*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1681*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 1682*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1683*9880d681SAndroid Build Coastguard Worker; 1684*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test17: 1685*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1686*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1687*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1688*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 5, i32 6, i32 7> 1689*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 1, i32 2, i32 3> 1690*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1691*9880d681SAndroid Build Coastguard Worker} 1692*9880d681SAndroid Build Coastguard Worker 1693*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test18(<4 x i32> %a, <4 x i32> %b) { 1694*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test18: 1695*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1696*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1697*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1698*9880d681SAndroid Build Coastguard Worker; 1699*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test18: 1700*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1701*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1702*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1703*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 0, i32 1, i32 4, i32 5> 1704*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 4, i32 5, i32 2, i32 3> 1705*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1706*9880d681SAndroid Build Coastguard Worker} 1707*9880d681SAndroid Build Coastguard Worker 1708*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test19(<4 x i32> %a, <4 x i32> %b) { 1709*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test19: 1710*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1711*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1712*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1713*9880d681SAndroid Build Coastguard Worker; 1714*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test19: 1715*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1716*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1717*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1718*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 6, i32 7, i32 5, i32 5> 1719*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 1720*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1721*9880d681SAndroid Build Coastguard Worker} 1722*9880d681SAndroid Build Coastguard Worker 1723*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test20(<4 x i32> %a, <4 x i32> %b) { 1724*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test20: 1725*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1726*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1727*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1728*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1729*9880d681SAndroid Build Coastguard Worker; 1730*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test20: 1731*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1732*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 1733*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 1734*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1735*9880d681SAndroid Build Coastguard Worker; 1736*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test20: 1737*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1738*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1739*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1740*9880d681SAndroid Build Coastguard Worker; 1741*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test20: 1742*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1743*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 1744*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1745*9880d681SAndroid Build Coastguard Worker; 1746*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test20: 1747*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1748*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 1749*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1750*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 7> 1751*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %a, <4 x i32> <i32 0, i32 5, i32 2, i32 3> 1752*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1753*9880d681SAndroid Build Coastguard Worker} 1754*9880d681SAndroid Build Coastguard Worker 1755*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test21(<8 x i32> %a, <4 x i32>* %ptr) { 1756*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test21: 1757*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1758*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm0, %xmm2 1759*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0] 1760*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1761*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm2, (%rdi) 1762*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1763*9880d681SAndroid Build Coastguard Worker; 1764*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test21: 1765*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1766*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 1767*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm0[0],xmm1[0] 1768*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1769*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vmovdqa %xmm2, (%rdi) 1770*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vzeroupper 1771*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1772*9880d681SAndroid Build Coastguard Worker; 1773*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test21: 1774*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1775*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1776*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm2 = xmm0[0],xmm1[0] 1777*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 1778*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovdqa %xmm2, (%rdi) 1779*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vzeroupper 1780*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1781*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <8 x i32> %a, <8 x i32> %a, <4 x i32> <i32 0, i32 1, i32 4, i32 5> 1782*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <8 x i32> %a, <8 x i32> %a, <4 x i32> <i32 2, i32 3, i32 6, i32 7> 1783*9880d681SAndroid Build Coastguard Worker store <4 x i32> %1, <4 x i32>* %ptr, align 16 1784*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 1785*9880d681SAndroid Build Coastguard Worker} 1786*9880d681SAndroid Build Coastguard Worker 1787*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @combine_test22(<2 x float>* %a, <2 x float>* %b) { 1788*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test22: 1789*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1790*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero 1791*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] 1792*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1793*9880d681SAndroid Build Coastguard Worker; 1794*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test22: 1795*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1796*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero 1797*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0] 1798*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1799*9880d681SAndroid Build Coastguard Worker; Current AVX2 lowering of this is still awful, not adding a test case. 1800*9880d681SAndroid Build Coastguard Worker %1 = load <2 x float>, <2 x float>* %a, align 8 1801*9880d681SAndroid Build Coastguard Worker %2 = load <2 x float>, <2 x float>* %b, align 8 1802*9880d681SAndroid Build Coastguard Worker %3 = shufflevector <2 x float> %1, <2 x float> %2, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 undef, i32 undef, i32 undef, i32 undef> 1803*9880d681SAndroid Build Coastguard Worker ret <8 x float> %3 1804*9880d681SAndroid Build Coastguard Worker} 1805*9880d681SAndroid Build Coastguard Worker 1806*9880d681SAndroid Build Coastguard Worker; PR22359 1807*9880d681SAndroid Build Coastguard Workerdefine void @combine_test23(<8 x float> %v, <2 x float>* %ptr) { 1808*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test23: 1809*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1810*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movups %xmm0, (%rdi) 1811*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1812*9880d681SAndroid Build Coastguard Worker; 1813*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test23: 1814*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1815*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilpd {{.*#+}} xmm1 = xmm0[1,0] 1816*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm1 = xmm0[0,1],xmm1[0],xmm0[3] 1817*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[3] 1818*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovups %xmm0, (%rdi) 1819*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vzeroupper 1820*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1821*9880d681SAndroid Build Coastguard Worker %idx2 = getelementptr inbounds <2 x float>, <2 x float>* %ptr, i64 1 1822*9880d681SAndroid Build Coastguard Worker %shuffle0 = shufflevector <8 x float> %v, <8 x float> undef, <2 x i32> <i32 0, i32 1> 1823*9880d681SAndroid Build Coastguard Worker %shuffle1 = shufflevector <8 x float> %v, <8 x float> undef, <2 x i32> <i32 2, i32 3> 1824*9880d681SAndroid Build Coastguard Worker store <2 x float> %shuffle0, <2 x float>* %ptr, align 8 1825*9880d681SAndroid Build Coastguard Worker store <2 x float> %shuffle1, <2 x float>* %idx2, align 8 1826*9880d681SAndroid Build Coastguard Worker ret void 1827*9880d681SAndroid Build Coastguard Worker} 1828*9880d681SAndroid Build Coastguard Worker 1829*9880d681SAndroid Build Coastguard Worker; Check some negative cases. 1830*9880d681SAndroid Build Coastguard Worker; FIXME: Do any of these really make sense? Are they redundant with the above tests? 1831*9880d681SAndroid Build Coastguard Worker 1832*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test1b(<4 x float> %a, <4 x float> %b) { 1833*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test1b: 1834*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1835*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1,2,0] 1836*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm1, %xmm0 1837*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1838*9880d681SAndroid Build Coastguard Worker; 1839*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test1b: 1840*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1841*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm1[0,1,2,0] 1842*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1843*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1844*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 0> 1845*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1846*9880d681SAndroid Build Coastguard Worker} 1847*9880d681SAndroid Build Coastguard Worker 1848*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test2b(<4 x float> %a, <4 x float> %b) { 1849*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2b: 1850*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1851*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0,0] 1852*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 1853*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1854*9880d681SAndroid Build Coastguard Worker; 1855*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2b: 1856*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1857*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0] 1858*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1859*9880d681SAndroid Build Coastguard Worker; 1860*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2b: 1861*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1862*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm1[0,0] 1863*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1864*9880d681SAndroid Build Coastguard Worker; 1865*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2b: 1866*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1867*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm1[0,0] 1868*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1869*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1870*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 0, i32 5> 1871*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1872*9880d681SAndroid Build Coastguard Worker} 1873*9880d681SAndroid Build Coastguard Worker 1874*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test3b(<4 x float> %a, <4 x float> %b) { 1875*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test3b: 1876*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1877*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0] 1878*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3] 1879*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1880*9880d681SAndroid Build Coastguard Worker; 1881*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test3b: 1882*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1883*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0] 1884*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[2,3] 1885*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1886*9880d681SAndroid Build Coastguard Worker; 1887*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test3b: 1888*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1889*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1890*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,3,2,3] 1891*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1892*9880d681SAndroid Build Coastguard Worker; 1893*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3b: 1894*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1895*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 1896*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,3,2,3] 1897*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1898*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 0, i32 6, i32 3> 1899*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 7, i32 2, i32 7> 1900*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1901*9880d681SAndroid Build Coastguard Worker} 1902*9880d681SAndroid Build Coastguard Worker 1903*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_test4b(<4 x float> %a, <4 x float> %b) { 1904*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test4b: 1905*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 1906*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] 1907*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm1, %xmm0 1908*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 1909*9880d681SAndroid Build Coastguard Worker; 1910*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test4b: 1911*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 1912*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm1[1,1,2,3] 1913*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 1914*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 1915*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 5, i32 5, i32 2, i32 7> 1916*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 1917*9880d681SAndroid Build Coastguard Worker} 1918*9880d681SAndroid Build Coastguard Worker 1919*9880d681SAndroid Build Coastguard Worker 1920*9880d681SAndroid Build Coastguard Worker; Verify that we correctly fold shuffles even when we use illegal vector types. 1921*9880d681SAndroid Build Coastguard Worker 1922*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test1c(<4 x i8>* %a, <4 x i8>* %b) { 1923*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test1c: 1924*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1925*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1926*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1927*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 1928*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1929*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1930*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1931*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 1932*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1933*9880d681SAndroid Build Coastguard Worker; 1934*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test1c: 1935*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1936*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1937*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1938*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 1939*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1940*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1941*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1942*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] 1943*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1944*9880d681SAndroid Build Coastguard Worker; 1945*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test1c: 1946*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1947*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1948*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1949*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3,4,5,6,7] 1950*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 1951*9880d681SAndroid Build Coastguard Worker; 1952*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test1c: 1953*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 1954*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1955*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1956*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3,4,5,6,7] 1957*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 1958*9880d681SAndroid Build Coastguard Worker; 1959*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test1c: 1960*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 1961*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1962*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1963*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 1964*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 1965*9880d681SAndroid Build Coastguard Worker %A = load <4 x i8>, <4 x i8>* %a 1966*9880d681SAndroid Build Coastguard Worker %B = load <4 x i8>, <4 x i8>* %b 1967*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 0, i32 5, i32 2, i32 7> 1968*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 1, i32 6, i32 3> 1969*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %2 1970*9880d681SAndroid Build Coastguard Worker} 1971*9880d681SAndroid Build Coastguard Worker 1972*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test2c(<4 x i8>* %a, <4 x i8>* %b) { 1973*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test2c: 1974*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 1975*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1976*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1977*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1978*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1979*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1980*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 1981*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1982*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 1983*9880d681SAndroid Build Coastguard Worker; 1984*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test2c: 1985*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 1986*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 1987*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 1988*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 1989*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 1990*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 1991*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 1992*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 1993*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 1994*9880d681SAndroid Build Coastguard Worker; 1995*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test2c: 1996*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 1997*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1998*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 1999*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2000*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2001*9880d681SAndroid Build Coastguard Worker; 2002*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test2c: 2003*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2004*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2005*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2006*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2007*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2008*9880d681SAndroid Build Coastguard Worker %A = load <4 x i8>, <4 x i8>* %a 2009*9880d681SAndroid Build Coastguard Worker %B = load <4 x i8>, <4 x i8>* %b 2010*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 0, i32 5, i32 1, i32 5> 2011*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 2, i32 4, i32 1> 2012*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %2 2013*9880d681SAndroid Build Coastguard Worker} 2014*9880d681SAndroid Build Coastguard Worker 2015*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test3c(<4 x i8>* %a, <4 x i8>* %b) { 2016*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test3c: 2017*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2018*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2019*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2020*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 2021*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2022*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2023*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 2024*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 2025*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2026*9880d681SAndroid Build Coastguard Worker; 2027*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test3c: 2028*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2029*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2030*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2031*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 2032*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2033*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2034*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 2035*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 2036*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2037*9880d681SAndroid Build Coastguard Worker; 2038*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test3c: 2039*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2040*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2041*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2042*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: punpckhqdq {{.*#+}} xmm0 = xmm0[1],xmm1[1] 2043*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2044*9880d681SAndroid Build Coastguard Worker; 2045*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test3c: 2046*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2047*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2048*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2049*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2050*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2051*9880d681SAndroid Build Coastguard Worker %A = load <4 x i8>, <4 x i8>* %a 2052*9880d681SAndroid Build Coastguard Worker %B = load <4 x i8>, <4 x i8>* %b 2053*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 2054*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 2055*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %2 2056*9880d681SAndroid Build Coastguard Worker} 2057*9880d681SAndroid Build Coastguard Worker 2058*9880d681SAndroid Build Coastguard Workerdefine <4 x i8> @combine_test4c(<4 x i8>* %a, <4 x i8>* %b) { 2059*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_test4c: 2060*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2061*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2062*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2063*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 2064*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2065*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2066*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 2067*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 2068*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 2069*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2070*9880d681SAndroid Build Coastguard Worker; 2071*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_test4c: 2072*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2073*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero 2074*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7] 2075*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3] 2076*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero 2077*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklbw {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3],xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7] 2078*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3] 2079*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm1[0,0] 2080*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] 2081*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2082*9880d681SAndroid Build Coastguard Worker; 2083*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_test4c: 2084*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2085*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2086*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2087*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5,6,7] 2088*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2089*9880d681SAndroid Build Coastguard Worker; 2090*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_test4c: 2091*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 2092*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2093*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2094*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm1[0,1],xmm0[2,3],xmm1[4,5,6,7] 2095*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 2096*9880d681SAndroid Build Coastguard Worker; 2097*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_test4c: 2098*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 2099*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm0 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2100*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpmovzxbd {{.*#+}} xmm1 = mem[0],zero,zero,zero,mem[1],zero,zero,zero,mem[2],zero,zero,zero,mem[3],zero,zero,zero 2101*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpblendd {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2,3] 2102*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 2103*9880d681SAndroid Build Coastguard Worker %A = load <4 x i8>, <4 x i8>* %a 2104*9880d681SAndroid Build Coastguard Worker %B = load <4 x i8>, <4 x i8>* %b 2105*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i8> %A, <4 x i8> %B, <4 x i32> <i32 4, i32 1, i32 6, i32 3> 2106*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i8> %1, <4 x i8> %B, <4 x i32> <i32 0, i32 1, i32 2, i32 7> 2107*9880d681SAndroid Build Coastguard Worker ret <4 x i8> %2 2108*9880d681SAndroid Build Coastguard Worker} 2109*9880d681SAndroid Build Coastguard Worker 2110*9880d681SAndroid Build Coastguard Worker 2111*9880d681SAndroid Build Coastguard Worker; The following test cases are generated from this C++ code 2112*9880d681SAndroid Build Coastguard Worker; 2113*9880d681SAndroid Build Coastguard Worker;__m128 blend_01(__m128 a, __m128 b) 2114*9880d681SAndroid Build Coastguard Worker;{ 2115*9880d681SAndroid Build Coastguard Worker; __m128 s = a; 2116*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<0 ); 2117*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<1 ); 2118*9880d681SAndroid Build Coastguard Worker; return s; 2119*9880d681SAndroid Build Coastguard Worker;} 2120*9880d681SAndroid Build Coastguard Worker; 2121*9880d681SAndroid Build Coastguard Worker;__m128 blend_02(__m128 a, __m128 b) 2122*9880d681SAndroid Build Coastguard Worker;{ 2123*9880d681SAndroid Build Coastguard Worker; __m128 s = a; 2124*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<0 ); 2125*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<2 ); 2126*9880d681SAndroid Build Coastguard Worker; return s; 2127*9880d681SAndroid Build Coastguard Worker;} 2128*9880d681SAndroid Build Coastguard Worker; 2129*9880d681SAndroid Build Coastguard Worker;__m128 blend_123(__m128 a, __m128 b) 2130*9880d681SAndroid Build Coastguard Worker;{ 2131*9880d681SAndroid Build Coastguard Worker; __m128 s = a; 2132*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<1 ); 2133*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<2 ); 2134*9880d681SAndroid Build Coastguard Worker; s = _mm_blend_ps( s, b, 1<<3 ); 2135*9880d681SAndroid Build Coastguard Worker; return s; 2136*9880d681SAndroid Build Coastguard Worker;} 2137*9880d681SAndroid Build Coastguard Worker 2138*9880d681SAndroid Build Coastguard Worker; Ideally, we should collapse the following shuffles into a single one. 2139*9880d681SAndroid Build Coastguard Worker 2140*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_01(<4 x float> %a, <4 x float> %b) { 2141*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_01: 2142*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2143*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2144*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2145*9880d681SAndroid Build Coastguard Worker; 2146*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_01: 2147*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2148*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2149*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2150*9880d681SAndroid Build Coastguard Worker; 2151*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_01: 2152*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2153*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2154*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2155*9880d681SAndroid Build Coastguard Worker; 2156*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_01: 2157*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2158*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2159*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2160*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 undef, i32 2, i32 3> 2161*9880d681SAndroid Build Coastguard Worker %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 2, i32 3> 2162*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shuffle6 2163*9880d681SAndroid Build Coastguard Worker} 2164*9880d681SAndroid Build Coastguard Worker 2165*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_02(<4 x float> %a, <4 x float> %b) { 2166*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_02: 2167*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2168*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,3] 2169*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 2170*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 2171*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2172*9880d681SAndroid Build Coastguard Worker; 2173*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_02: 2174*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2175*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[1,3] 2176*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2,1,3] 2177*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 2178*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2179*9880d681SAndroid Build Coastguard Worker; 2180*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_02: 2181*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2182*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3] 2183*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2184*9880d681SAndroid Build Coastguard Worker; 2185*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_02: 2186*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2187*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1],xmm1[2],xmm0[3] 2188*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2189*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 undef, i32 3> 2190*9880d681SAndroid Build Coastguard Worker %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 3> 2191*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shuffle6 2192*9880d681SAndroid Build Coastguard Worker} 2193*9880d681SAndroid Build Coastguard Worker 2194*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_blend_123(<4 x float> %a, <4 x float> %b) { 2195*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_blend_123: 2196*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2197*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 2198*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 2199*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2200*9880d681SAndroid Build Coastguard Worker; 2201*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_blend_123: 2202*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2203*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] 2204*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 2205*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2206*9880d681SAndroid Build Coastguard Worker; 2207*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_blend_123: 2208*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2209*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 2210*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2211*9880d681SAndroid Build Coastguard Worker; 2212*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_blend_123: 2213*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2214*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm0 = xmm0[0],xmm1[1,2,3] 2215*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2216*9880d681SAndroid Build Coastguard Worker %shuffle = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32> <i32 0, i32 5, i32 undef, i32 undef> 2217*9880d681SAndroid Build Coastguard Worker %shuffle6 = shufflevector <4 x float> %shuffle, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 6, i32 undef> 2218*9880d681SAndroid Build Coastguard Worker %shuffle12 = shufflevector <4 x float> %shuffle6, <4 x float> %b, <4 x i32> <i32 0, i32 1, i32 2, i32 7> 2219*9880d681SAndroid Build Coastguard Worker ret <4 x float> %shuffle12 2220*9880d681SAndroid Build Coastguard Worker} 2221*9880d681SAndroid Build Coastguard Worker 2222*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_1(<4 x i32> %a, <4 x i32> %b) { 2223*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_1: 2224*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2225*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1] 2226*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm1, %xmm0 2227*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2228*9880d681SAndroid Build Coastguard Worker; 2229*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_1: 2230*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2231*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2232*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2233*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 7, i32 5, i32 3> 2234*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 1, i32 0, i32 3> 2235*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 2236*9880d681SAndroid Build Coastguard Worker} 2237*9880d681SAndroid Build Coastguard Worker 2238*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_2(<4 x i32> %a, <4 x i32> %b) { 2239*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_2: 2240*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2241*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1] 2242*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm1, %xmm0 2243*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2244*9880d681SAndroid Build Coastguard Worker; 2245*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_2: 2246*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2247*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2248*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2249*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 2, i32 0, i32 3, i32 6> 2250*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 3, i32 7, i32 0, i32 2> 2251*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 2252*9880d681SAndroid Build Coastguard Worker} 2253*9880d681SAndroid Build Coastguard Worker 2254*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @combine_test_movhl_3(<4 x i32> %a, <4 x i32> %b) { 2255*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_test_movhl_3: 2256*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2257*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: punpckhqdq {{.*#+}} xmm1 = xmm1[1],xmm0[1] 2258*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm1, %xmm0 2259*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2260*9880d681SAndroid Build Coastguard Worker; 2261*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_test_movhl_3: 2262*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2263*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpunpckhqdq {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2264*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2265*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x i32> %a, <4 x i32> %b, <4 x i32> <i32 7, i32 6, i32 3, i32 2> 2266*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x i32> %1, <4 x i32> %b, <4 x i32> <i32 6, i32 0, i32 3, i32 2> 2267*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 2268*9880d681SAndroid Build Coastguard Worker} 2269*9880d681SAndroid Build Coastguard Worker 2270*9880d681SAndroid Build Coastguard Worker 2271*9880d681SAndroid Build Coastguard Worker; Verify that we fold shuffles according to rule: 2272*9880d681SAndroid Build Coastguard Worker; (shuffle(shuffle A, Undef, M0), B, M1) -> (shuffle A, B, M2) 2273*9880d681SAndroid Build Coastguard Worker 2274*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test1(<4 x float> %a, <4 x float> %b) { 2275*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test1: 2276*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2277*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2278*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2279*9880d681SAndroid Build Coastguard Worker; 2280*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test1: 2281*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2282*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2283*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2284*9880d681SAndroid Build Coastguard Worker; 2285*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test1: 2286*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2287*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2288*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2289*9880d681SAndroid Build Coastguard Worker; 2290*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test1: 2291*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2292*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2293*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2294*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1> 2295*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 4, i32 5, i32 1, i32 2> 2296*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2297*9880d681SAndroid Build Coastguard Worker} 2298*9880d681SAndroid Build Coastguard Worker 2299*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test2(<4 x float> %a, <4 x float> %b) { 2300*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test2: 2301*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2302*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2303*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2304*9880d681SAndroid Build Coastguard Worker; 2305*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test2: 2306*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2307*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2308*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2309*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7> 2310*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 1, i32 2, i32 4, i32 5> 2311*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2312*9880d681SAndroid Build Coastguard Worker} 2313*9880d681SAndroid Build Coastguard Worker 2314*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test3(<4 x float> %a, <4 x float> %b) { 2315*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test3: 2316*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2317*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2318*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2319*9880d681SAndroid Build Coastguard Worker; 2320*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test3: 2321*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2322*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2323*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2324*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 2325*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 4, i32 1> 2326*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2327*9880d681SAndroid Build Coastguard Worker} 2328*9880d681SAndroid Build Coastguard Worker 2329*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test4(<4 x float> %a, <4 x float> %b) { 2330*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test4: 2331*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2332*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 2333*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movapd %xmm1, %xmm0 2334*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2335*9880d681SAndroid Build Coastguard Worker; 2336*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test4: 2337*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2338*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2339*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2340*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 2341*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 2342*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2343*9880d681SAndroid Build Coastguard Worker} 2344*9880d681SAndroid Build Coastguard Worker 2345*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test5(<4 x float> %a, <4 x float> %b) { 2346*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test5: 2347*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2348*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 2349*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movapd %xmm1, %xmm0 2350*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2351*9880d681SAndroid Build Coastguard Worker; 2352*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test5: 2353*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2354*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 2355*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movapd %xmm1, %xmm0 2356*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2357*9880d681SAndroid Build Coastguard Worker; 2358*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test5: 2359*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2360*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 2361*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2362*9880d681SAndroid Build Coastguard Worker; 2363*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test5: 2364*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2365*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 2366*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2367*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3> 2368*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %b, <4 x i32> <i32 0, i32 2, i32 6, i32 7> 2369*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2370*9880d681SAndroid Build Coastguard Worker} 2371*9880d681SAndroid Build Coastguard Worker 2372*9880d681SAndroid Build Coastguard Worker 2373*9880d681SAndroid Build Coastguard Worker; Verify that we fold shuffles according to rule: 2374*9880d681SAndroid Build Coastguard Worker; (shuffle(shuffle A, Undef, M0), A, M1) -> (shuffle A, Undef, M2) 2375*9880d681SAndroid Build Coastguard Worker 2376*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test6(<4 x float> %a) { 2377*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test6: 2378*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 2379*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 2380*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1> 2381*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 4, i32 5, i32 1, i32 2> 2382*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2383*9880d681SAndroid Build Coastguard Worker} 2384*9880d681SAndroid Build Coastguard Worker 2385*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test7(<4 x float> %a) { 2386*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test7: 2387*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2388*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 2389*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2390*9880d681SAndroid Build Coastguard Worker; 2391*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test7: 2392*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2393*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2394*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2395*9880d681SAndroid Build Coastguard Worker; 2396*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test7: 2397*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2398*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2399*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2400*9880d681SAndroid Build Coastguard Worker; 2401*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test7: 2402*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2403*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2404*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2405*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7> 2406*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 1, i32 2, i32 4, i32 5> 2407*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2408*9880d681SAndroid Build Coastguard Worker} 2409*9880d681SAndroid Build Coastguard Worker 2410*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test8(<4 x float> %a) { 2411*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test8: 2412*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2413*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 2414*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2415*9880d681SAndroid Build Coastguard Worker; 2416*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test8: 2417*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2418*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2419*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2420*9880d681SAndroid Build Coastguard Worker; 2421*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test8: 2422*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2423*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2424*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2425*9880d681SAndroid Build Coastguard Worker; 2426*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test8: 2427*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2428*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2429*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2430*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 2431*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 2, i32 4, i32 1> 2432*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2433*9880d681SAndroid Build Coastguard Worker} 2434*9880d681SAndroid Build Coastguard Worker 2435*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test9(<4 x float> %a) { 2436*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test9: 2437*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2438*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 2439*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2440*9880d681SAndroid Build Coastguard Worker; 2441*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test9: 2442*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2443*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,1] 2444*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2445*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 2446*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 6, i32 7, i32 0, i32 1> 2447*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2448*9880d681SAndroid Build Coastguard Worker} 2449*9880d681SAndroid Build Coastguard Worker 2450*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test10(<4 x float> %a) { 2451*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test10: 2452*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 2453*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 2454*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3> 2455*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %1, <4 x float> %a, <4 x i32> <i32 0, i32 2, i32 6, i32 7> 2456*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2457*9880d681SAndroid Build Coastguard Worker} 2458*9880d681SAndroid Build Coastguard Worker 2459*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test11(<4 x float> %a, <4 x float> %b) { 2460*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test11: 2461*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2462*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2463*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2464*9880d681SAndroid Build Coastguard Worker; 2465*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test11: 2466*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2467*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2468*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2469*9880d681SAndroid Build Coastguard Worker; 2470*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test11: 2471*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2472*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2473*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2474*9880d681SAndroid Build Coastguard Worker; 2475*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test11: 2476*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2477*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 2478*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2479*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1> 2480*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 0, i32 1, i32 5, i32 6> 2481*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2482*9880d681SAndroid Build Coastguard Worker} 2483*9880d681SAndroid Build Coastguard Worker 2484*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test12(<4 x float> %a, <4 x float> %b) { 2485*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test12: 2486*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2487*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2488*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2489*9880d681SAndroid Build Coastguard Worker; 2490*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test12: 2491*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2492*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2493*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2494*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7> 2495*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 5, i32 6, i32 0, i32 1> 2496*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2497*9880d681SAndroid Build Coastguard Worker} 2498*9880d681SAndroid Build Coastguard Worker 2499*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test13(<4 x float> %a, <4 x float> %b) { 2500*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test13: 2501*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2502*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2503*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2504*9880d681SAndroid Build Coastguard Worker; 2505*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test13: 2506*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2507*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklpd {{.*#+}} xmm0 = xmm0[0],xmm1[0] 2508*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2509*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 2510*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 4, i32 5, i32 0, i32 5> 2511*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2512*9880d681SAndroid Build Coastguard Worker} 2513*9880d681SAndroid Build Coastguard Worker 2514*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test14(<4 x float> %a, <4 x float> %b) { 2515*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test14: 2516*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2517*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] 2518*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movapd %xmm1, %xmm0 2519*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2520*9880d681SAndroid Build Coastguard Worker; 2521*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test14: 2522*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2523*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpckhpd {{.*#+}} xmm0 = xmm1[1],xmm0[1] 2524*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2525*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 2526*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 2, i32 3, i32 4, i32 5> 2527*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2528*9880d681SAndroid Build Coastguard Worker} 2529*9880d681SAndroid Build Coastguard Worker 2530*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test15(<4 x float> %a, <4 x float> %b) { 2531*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test15: 2532*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2533*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 2534*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movapd %xmm1, %xmm0 2535*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2536*9880d681SAndroid Build Coastguard Worker; 2537*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test15: 2538*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2539*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 2540*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movapd %xmm1, %xmm0 2541*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2542*9880d681SAndroid Build Coastguard Worker; 2543*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test15: 2544*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2545*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 2546*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2547*9880d681SAndroid Build Coastguard Worker; 2548*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test15: 2549*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2550*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 2551*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2552*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3> 2553*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %b, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 2, i32 3> 2554*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2555*9880d681SAndroid Build Coastguard Worker} 2556*9880d681SAndroid Build Coastguard Worker 2557*9880d681SAndroid Build Coastguard Worker 2558*9880d681SAndroid Build Coastguard Worker; Verify that shuffles are canonicalized according to rules: 2559*9880d681SAndroid Build Coastguard Worker; shuffle(B, shuffle(A, Undef)) -> shuffle(shuffle(A, Undef), B) 2560*9880d681SAndroid Build Coastguard Worker; 2561*9880d681SAndroid Build Coastguard Worker; This allows to trigger the following combine rule: 2562*9880d681SAndroid Build Coastguard Worker; (shuffle(shuffle A, Undef, M0), A, M1) -> (shuffle A, Undef, M2) 2563*9880d681SAndroid Build Coastguard Worker; 2564*9880d681SAndroid Build Coastguard Worker; As a result, all the shuffle pairs in each function below should be 2565*9880d681SAndroid Build Coastguard Worker; combined into a single legal shuffle operation. 2566*9880d681SAndroid Build Coastguard Worker 2567*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test16(<4 x float> %a) { 2568*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test16: 2569*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 2570*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 2571*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 4, i32 2, i32 3, i32 1> 2572*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 0, i32 1, i32 5, i32 3> 2573*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2574*9880d681SAndroid Build Coastguard Worker} 2575*9880d681SAndroid Build Coastguard Worker 2576*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test17(<4 x float> %a) { 2577*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test17: 2578*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2579*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 2580*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2581*9880d681SAndroid Build Coastguard Worker; 2582*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test17: 2583*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2584*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2585*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2586*9880d681SAndroid Build Coastguard Worker; 2587*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test17: 2588*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2589*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2590*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2591*9880d681SAndroid Build Coastguard Worker; 2592*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test17: 2593*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2594*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2595*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2596*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 6, i32 0, i32 1, i32 7> 2597*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 5, i32 6, i32 0, i32 1> 2598*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2599*9880d681SAndroid Build Coastguard Worker} 2600*9880d681SAndroid Build Coastguard Worker 2601*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test18(<4 x float> %a) { 2602*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_undef_input_test18: 2603*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2604*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movlhps {{.*#+}} xmm0 = xmm0[0,0] 2605*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2606*9880d681SAndroid Build Coastguard Worker; 2607*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_undef_input_test18: 2608*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2609*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2610*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2611*9880d681SAndroid Build Coastguard Worker; 2612*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_undef_input_test18: 2613*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2614*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movddup {{.*#+}} xmm0 = xmm0[0,0] 2615*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2616*9880d681SAndroid Build Coastguard Worker; 2617*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test18: 2618*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2619*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovddup {{.*#+}} xmm0 = xmm0[0,0] 2620*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2621*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 5, i32 1, i32 7> 2622*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 0, i32 5> 2623*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2624*9880d681SAndroid Build Coastguard Worker} 2625*9880d681SAndroid Build Coastguard Worker 2626*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test19(<4 x float> %a) { 2627*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_undef_input_test19: 2628*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2629*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1] 2630*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2631*9880d681SAndroid Build Coastguard Worker; 2632*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_undef_input_test19: 2633*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2634*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilpd {{.*#+}} xmm0 = xmm0[1,1] 2635*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2636*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 2, i32 3, i32 5, i32 5> 2637*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 2, i32 3, i32 4, i32 5> 2638*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2639*9880d681SAndroid Build Coastguard Worker} 2640*9880d681SAndroid Build Coastguard Worker 2641*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_undef_input_test20(<4 x float> %a) { 2642*9880d681SAndroid Build Coastguard Worker; ALL-LABEL: combine_undef_input_test20: 2643*9880d681SAndroid Build Coastguard Worker; ALL: # BB#0: 2644*9880d681SAndroid Build Coastguard Worker; ALL-NEXT: retq 2645*9880d681SAndroid Build Coastguard Worker %1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 4, i32 1, i32 3> 2646*9880d681SAndroid Build Coastguard Worker %2 = shufflevector <4 x float> %a, <4 x float> %1, <4 x i32> <i32 4, i32 6, i32 2, i32 3> 2647*9880d681SAndroid Build Coastguard Worker ret <4 x float> %2 2648*9880d681SAndroid Build Coastguard Worker} 2649*9880d681SAndroid Build Coastguard Worker 2650*9880d681SAndroid Build Coastguard Worker; These tests are designed to test the ability to combine away unnecessary 2651*9880d681SAndroid Build Coastguard Worker; operations feeding into a shuffle. The AVX cases are the important ones as 2652*9880d681SAndroid Build Coastguard Worker; they leverage operations which cannot be done naturally on the entire vector 2653*9880d681SAndroid Build Coastguard Worker; and thus are decomposed into multiple smaller operations. 2654*9880d681SAndroid Build Coastguard Worker 2655*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @combine_unneeded_subvector1(<8 x i32> %a) { 2656*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_unneeded_subvector1: 2657*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2658*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: paddd {{.*}}(%rip), %xmm1 2659*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,2,1,0] 2660*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movdqa %xmm0, %xmm1 2661*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2662*9880d681SAndroid Build Coastguard Worker; 2663*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_unneeded_subvector1: 2664*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 2665*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2666*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 2667*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 2668*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4] 2669*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = ymm0[2,3,2,3] 2670*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 2671*9880d681SAndroid Build Coastguard Worker; 2672*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_unneeded_subvector1: 2673*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 2674*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpaddd {{.*}}(%rip), %ymm0, %ymm0 2675*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4] 2676*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vperm2i128 {{.*#+}} ymm0 = ymm0[2,3,2,3] 2677*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 2678*9880d681SAndroid Build Coastguard Worker %b = add <8 x i32> %a, <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8> 2679*9880d681SAndroid Build Coastguard Worker %c = shufflevector <8 x i32> %b, <8 x i32> undef, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 7, i32 6, i32 5, i32 4> 2680*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %c 2681*9880d681SAndroid Build Coastguard Worker} 2682*9880d681SAndroid Build Coastguard Worker 2683*9880d681SAndroid Build Coastguard Workerdefine <8 x i32> @combine_unneeded_subvector2(<8 x i32> %a, <8 x i32> %b) { 2684*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: combine_unneeded_subvector2: 2685*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: 2686*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: paddd {{.*}}(%rip), %xmm1 2687*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm3[3,2,1,0] 2688*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[3,2,1,0] 2689*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2690*9880d681SAndroid Build Coastguard Worker; 2691*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: combine_unneeded_subvector2: 2692*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: 2693*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2694*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpaddd {{.*}}(%rip), %xmm0, %xmm0 2695*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm0, %ymm0 2696*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vperm2f128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[2,3] 2697*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4] 2698*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 2699*9880d681SAndroid Build Coastguard Worker; 2700*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: combine_unneeded_subvector2: 2701*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: 2702*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpaddd {{.*}}(%rip), %ymm0, %ymm0 2703*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vperm2i128 {{.*#+}} ymm0 = ymm1[2,3],ymm0[2,3] 2704*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpshufd {{.*#+}} ymm0 = ymm0[3,2,1,0,7,6,5,4] 2705*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 2706*9880d681SAndroid Build Coastguard Worker %c = add <8 x i32> %a, <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8> 2707*9880d681SAndroid Build Coastguard Worker %d = shufflevector <8 x i32> %b, <8 x i32> %c, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 15, i32 14, i32 13, i32 12> 2708*9880d681SAndroid Build Coastguard Worker ret <8 x i32> %d 2709*9880d681SAndroid Build Coastguard Worker} 2710*9880d681SAndroid Build Coastguard Worker 2711*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps1(<4 x float> %a, <4 x float> %b) { 2712*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps1: 2713*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2714*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,0] 2715*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3] 2716*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 2717*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2718*9880d681SAndroid Build Coastguard Worker; 2719*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps1: 2720*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2721*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[1,0] 2722*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[2,3] 2723*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 2724*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2725*9880d681SAndroid Build Coastguard Worker; 2726*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps1: 2727*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2728*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm1[2],xmm0[1,2,3] 2729*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2730*9880d681SAndroid Build Coastguard Worker; 2731*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps1: 2732*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2733*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm1[2],xmm0[1,2,3] 2734*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2735*9880d681SAndroid Build Coastguard Worker 2736*9880d681SAndroid Build Coastguard Worker %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 6, i32 2, i32 4> 2737*9880d681SAndroid Build Coastguard Worker %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32> <i32 5, i32 1, i32 6, i32 3> 2738*9880d681SAndroid Build Coastguard Worker ret <4 x float> %d 2739*9880d681SAndroid Build Coastguard Worker} 2740*9880d681SAndroid Build Coastguard Worker 2741*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps2(<4 x float> %a, <4 x float> %b) { 2742*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps2: 2743*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2744*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,0] 2745*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3] 2746*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm1, %xmm0 2747*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2748*9880d681SAndroid Build Coastguard Worker; 2749*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps2: 2750*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2751*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[0,0] 2752*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3] 2753*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm1, %xmm0 2754*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2755*9880d681SAndroid Build Coastguard Worker; 2756*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps2: 2757*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2758*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[2,3] 2759*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2760*9880d681SAndroid Build Coastguard Worker; 2761*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps2: 2762*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2763*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[2],xmm0[2,3] 2764*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2765*9880d681SAndroid Build Coastguard Worker 2766*9880d681SAndroid Build Coastguard Worker %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 1, i32 6, i32 7> 2767*9880d681SAndroid Build Coastguard Worker %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32> <i32 4, i32 6, i32 2, i32 3> 2768*9880d681SAndroid Build Coastguard Worker ret <4 x float> %d 2769*9880d681SAndroid Build Coastguard Worker} 2770*9880d681SAndroid Build Coastguard Worker 2771*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps3(<4 x float> %a, <4 x float> %b) { 2772*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps3: 2773*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2774*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 2775*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2] 2776*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2777*9880d681SAndroid Build Coastguard Worker; 2778*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps3: 2779*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2780*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 2781*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2] 2782*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2783*9880d681SAndroid Build Coastguard Worker; 2784*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps3: 2785*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2786*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3] 2787*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2788*9880d681SAndroid Build Coastguard Worker; 2789*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps3: 2790*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2791*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0],xmm0[3] 2792*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2793*9880d681SAndroid Build Coastguard Worker 2794*9880d681SAndroid Build Coastguard Worker %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 4, i32 2, i32 5> 2795*9880d681SAndroid Build Coastguard Worker %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32><i32 4, i32 1, i32 5, i32 3> 2796*9880d681SAndroid Build Coastguard Worker ret <4 x float> %d 2797*9880d681SAndroid Build Coastguard Worker} 2798*9880d681SAndroid Build Coastguard Worker 2799*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @combine_insertps4(<4 x float> %a, <4 x float> %b) { 2800*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_insertps4: 2801*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2802*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0] 2803*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0] 2804*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2805*9880d681SAndroid Build Coastguard Worker; 2806*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_insertps4: 2807*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2808*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[2,0] 2809*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,0] 2810*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2811*9880d681SAndroid Build Coastguard Worker; 2812*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_insertps4: 2813*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2814*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0] 2815*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2816*9880d681SAndroid Build Coastguard Worker; 2817*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_insertps4: 2818*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2819*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],xmm1[0] 2820*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2821*9880d681SAndroid Build Coastguard Worker 2822*9880d681SAndroid Build Coastguard Worker %c = shufflevector <4 x float> %a, <4 x float> %b, <4 x i32><i32 0, i32 4, i32 2, i32 5> 2823*9880d681SAndroid Build Coastguard Worker %d = shufflevector <4 x float> %a, <4 x float> %c, <4 x i32><i32 4, i32 1, i32 6, i32 5> 2824*9880d681SAndroid Build Coastguard Worker ret <4 x float> %d 2825*9880d681SAndroid Build Coastguard Worker} 2826*9880d681SAndroid Build Coastguard Worker 2827*9880d681SAndroid Build Coastguard Worker; FIXME: Failed to recognise that the VMOVSD has already zero'd the upper element 2828*9880d681SAndroid Build Coastguard Workerdefine void @combine_scalar_load_with_blend_with_zero(double* %a0, <4 x float>* %a1) { 2829*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: combine_scalar_load_with_blend_with_zero: 2830*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: 2831*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 2832*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: xorps %xmm1, %xmm1 2833*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 2834*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2] 2835*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm0, (%rsi) 2836*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2837*9880d681SAndroid Build Coastguard Worker; 2838*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: combine_scalar_load_with_blend_with_zero: 2839*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: 2840*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 2841*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: xorps %xmm1, %xmm1 2842*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[3,0] 2843*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm1[0,2] 2844*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm0, (%rsi) 2845*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2846*9880d681SAndroid Build Coastguard Worker; 2847*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: combine_scalar_load_with_blend_with_zero: 2848*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: 2849*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero 2850*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: xorpd %xmm1, %xmm1 2851*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm1 = xmm0[0],xmm1[1] 2852*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movapd %xmm1, (%rsi) 2853*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2854*9880d681SAndroid Build Coastguard Worker; 2855*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: combine_scalar_load_with_blend_with_zero: 2856*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: 2857*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero 2858*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vxorpd %xmm1, %xmm1, %xmm1 2859*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendpd {{.*#+}} xmm0 = xmm0[0],xmm1[1] 2860*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovapd %xmm0, (%rsi) 2861*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2862*9880d681SAndroid Build Coastguard Worker %1 = load double, double* %a0, align 8 2863*9880d681SAndroid Build Coastguard Worker %2 = insertelement <2 x double> undef, double %1, i32 0 2864*9880d681SAndroid Build Coastguard Worker %3 = insertelement <2 x double> %2, double 0.000000e+00, i32 1 2865*9880d681SAndroid Build Coastguard Worker %4 = bitcast <2 x double> %3 to <4 x float> 2866*9880d681SAndroid Build Coastguard Worker %5 = shufflevector <4 x float> %4, <4 x float> <float 0.000000e+00, float undef, float undef, float undef>, <4 x i32> <i32 0, i32 1, i32 4, i32 3> 2867*9880d681SAndroid Build Coastguard Worker store <4 x float> %5, <4 x float>* %a1, align 16 2868*9880d681SAndroid Build Coastguard Worker ret void 2869*9880d681SAndroid Build Coastguard Worker} 2870*9880d681SAndroid Build Coastguard Worker 2871*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @PR22377(<4 x float> %a, <4 x float> %b) { 2872*9880d681SAndroid Build Coastguard Worker; SSE-LABEL: PR22377: 2873*9880d681SAndroid Build Coastguard Worker; SSE: # BB#0: # %entry 2874*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movaps %xmm0, %xmm1 2875*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,3,1,3] 2876*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2,0,2] 2877*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: addps %xmm0, %xmm1 2878*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2879*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: retq 2880*9880d681SAndroid Build Coastguard Worker; 2881*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: PR22377: 2882*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 2883*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm1 = xmm0[1,3,1,3] 2884*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,0,2] 2885*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddps %xmm0, %xmm1, %xmm1 2886*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vunpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 2887*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2888*9880d681SAndroid Build Coastguard Workerentry: 2889*9880d681SAndroid Build Coastguard Worker %s1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 1, i32 3, i32 1, i32 3> 2890*9880d681SAndroid Build Coastguard Worker %s2 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 0, i32 2, i32 0, i32 2> 2891*9880d681SAndroid Build Coastguard Worker %r2 = fadd <4 x float> %s1, %s2 2892*9880d681SAndroid Build Coastguard Worker %s3 = shufflevector <4 x float> %s2, <4 x float> %r2, <4 x i32> <i32 0, i32 4, i32 1, i32 5> 2893*9880d681SAndroid Build Coastguard Worker ret <4 x float> %s3 2894*9880d681SAndroid Build Coastguard Worker} 2895*9880d681SAndroid Build Coastguard Worker 2896*9880d681SAndroid Build Coastguard Workerdefine <4 x float> @PR22390(<4 x float> %a, <4 x float> %b) { 2897*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: PR22390: 2898*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 2899*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0,1,2] 2900*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm0, %xmm2 2901*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 2902*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: addps %xmm0, %xmm2 2903*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm2, %xmm0 2904*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2905*9880d681SAndroid Build Coastguard Worker; 2906*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: PR22390: 2907*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: # %entry 2908*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0,1,2] 2909*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm0, %xmm2 2910*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movss {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] 2911*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: addps %xmm0, %xmm2 2912*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm2, %xmm0 2913*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2914*9880d681SAndroid Build Coastguard Worker; 2915*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: PR22390: 2916*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: # %entry 2917*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,0,1,2] 2918*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendps {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3] 2919*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: addps %xmm1, %xmm0 2920*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2921*9880d681SAndroid Build Coastguard Worker; 2922*9880d681SAndroid Build Coastguard Worker; AVX-LABEL: PR22390: 2923*9880d681SAndroid Build Coastguard Worker; AVX: # BB#0: # %entry 2924*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[3,0,1,2] 2925*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vblendps {{.*#+}} xmm1 = xmm1[0],xmm0[1,2,3] 2926*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vaddps %xmm1, %xmm0, %xmm0 2927*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: retq 2928*9880d681SAndroid Build Coastguard Workerentry: 2929*9880d681SAndroid Build Coastguard Worker %s1 = shufflevector <4 x float> %a, <4 x float> undef, <4 x i32> <i32 3, i32 0, i32 1, i32 2> 2930*9880d681SAndroid Build Coastguard Worker %s2 = shufflevector <4 x float> %s1, <4 x float> %b, <4 x i32> <i32 4, i32 1, i32 2, i32 3> 2931*9880d681SAndroid Build Coastguard Worker %r2 = fadd <4 x float> %s1, %s2 2932*9880d681SAndroid Build Coastguard Worker ret <4 x float> %r2 2933*9880d681SAndroid Build Coastguard Worker} 2934*9880d681SAndroid Build Coastguard Worker 2935*9880d681SAndroid Build Coastguard Workerdefine <8 x float> @PR22412(<8 x float> %a, <8 x float> %b) { 2936*9880d681SAndroid Build Coastguard Worker; SSE2-LABEL: PR22412: 2937*9880d681SAndroid Build Coastguard Worker; SSE2: # BB#0: # %entry 2938*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 2939*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movapd %xmm2, %xmm0 2940*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm3[3,2] 2941*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,0],xmm2[3,2] 2942*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: movaps %xmm3, %xmm1 2943*9880d681SAndroid Build Coastguard Worker; SSE2-NEXT: retq 2944*9880d681SAndroid Build Coastguard Worker; 2945*9880d681SAndroid Build Coastguard Worker; SSSE3-LABEL: PR22412: 2946*9880d681SAndroid Build Coastguard Worker; SSSE3: # BB#0: # %entry 2947*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movsd {{.*#+}} xmm2 = xmm0[0],xmm2[1] 2948*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movapd %xmm2, %xmm0 2949*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,0],xmm3[3,2] 2950*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,0],xmm2[3,2] 2951*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: movaps %xmm3, %xmm1 2952*9880d681SAndroid Build Coastguard Worker; SSSE3-NEXT: retq 2953*9880d681SAndroid Build Coastguard Worker; 2954*9880d681SAndroid Build Coastguard Worker; SSE41-LABEL: PR22412: 2955*9880d681SAndroid Build Coastguard Worker; SSE41: # BB#0: # %entry 2956*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: blendpd {{.*#+}} xmm0 = xmm0[0],xmm2[1] 2957*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movapd %xmm0, %xmm1 2958*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,0],xmm3[3,2] 2959*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,0],xmm0[3,2] 2960*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movaps %xmm1, %xmm0 2961*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: movaps %xmm3, %xmm1 2962*9880d681SAndroid Build Coastguard Worker; SSE41-NEXT: retq 2963*9880d681SAndroid Build Coastguard Worker; 2964*9880d681SAndroid Build Coastguard Worker; AVX1-LABEL: PR22412: 2965*9880d681SAndroid Build Coastguard Worker; AVX1: # BB#0: # %entry 2966*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] 2967*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vperm2f128 {{.*#+}} ymm1 = ymm0[2,3,0,1] 2968*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[1,0],ymm1[3,2],ymm0[5,4],ymm1[7,6] 2969*9880d681SAndroid Build Coastguard Worker; AVX1-NEXT: retq 2970*9880d681SAndroid Build Coastguard Worker; 2971*9880d681SAndroid Build Coastguard Worker; AVX2-LABEL: PR22412: 2972*9880d681SAndroid Build Coastguard Worker; AVX2: # BB#0: # %entry 2973*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vblendpd {{.*#+}} ymm0 = ymm0[0],ymm1[1,2,3] 2974*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpermilps {{.*#+}} ymm0 = ymm0[1,0,3,2,5,4,7,6] 2975*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpermpd {{.*#+}} ymm0 = ymm0[0,3,2,1] 2976*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: retq 2977*9880d681SAndroid Build Coastguard Workerentry: 2978*9880d681SAndroid Build Coastguard Worker %s1 = shufflevector <8 x float> %a, <8 x float> %b, <8 x i32> <i32 0, i32 1, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 2979*9880d681SAndroid Build Coastguard Worker %s2 = shufflevector <8 x float> %s1, <8 x float> undef, <8 x i32> <i32 1, i32 0, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2> 2980*9880d681SAndroid Build Coastguard Worker ret <8 x float> %s2 2981*9880d681SAndroid Build Coastguard Worker} 2982