1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=x86-64 -mattr=+sse2 | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker 3*9880d681SAndroid Build Coastguard Worker; Splat patterns below 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @shl4(<4 x i32> %A) nounwind { 7*9880d681SAndroid Build Coastguard Workerentry: 8*9880d681SAndroid Build Coastguard Worker; CHECK: shl4 9*9880d681SAndroid Build Coastguard Worker; CHECK: pslld 10*9880d681SAndroid Build Coastguard Worker; CHECK: padd 11*9880d681SAndroid Build Coastguard Worker; CHECK: ret 12*9880d681SAndroid Build Coastguard Worker %B = shl <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 13*9880d681SAndroid Build Coastguard Worker %C = shl <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 14*9880d681SAndroid Build Coastguard Worker %K = xor <4 x i32> %B, %C 15*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %K 16*9880d681SAndroid Build Coastguard Worker} 17*9880d681SAndroid Build Coastguard Worker 18*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @shr4(<4 x i32> %A) nounwind { 19*9880d681SAndroid Build Coastguard Workerentry: 20*9880d681SAndroid Build Coastguard Worker; CHECK: shr4 21*9880d681SAndroid Build Coastguard Worker; CHECK: psrld 22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrld 23*9880d681SAndroid Build Coastguard Worker; CHECK: ret 24*9880d681SAndroid Build Coastguard Worker %B = lshr <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 25*9880d681SAndroid Build Coastguard Worker %C = lshr <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 26*9880d681SAndroid Build Coastguard Worker %K = xor <4 x i32> %B, %C 27*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %K 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @sra4(<4 x i32> %A) nounwind { 31*9880d681SAndroid Build Coastguard Workerentry: 32*9880d681SAndroid Build Coastguard Worker; CHECK: sra4 33*9880d681SAndroid Build Coastguard Worker; CHECK: psrad 34*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrad 35*9880d681SAndroid Build Coastguard Worker; CHECK: ret 36*9880d681SAndroid Build Coastguard Worker %B = ashr <4 x i32> %A, < i32 2, i32 2, i32 2, i32 2> 37*9880d681SAndroid Build Coastguard Worker %C = ashr <4 x i32> %A, < i32 1, i32 1, i32 1, i32 1> 38*9880d681SAndroid Build Coastguard Worker %K = xor <4 x i32> %B, %C 39*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %K 40*9880d681SAndroid Build Coastguard Worker} 41*9880d681SAndroid Build Coastguard Worker 42*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shl2(<2 x i64> %A) nounwind { 43*9880d681SAndroid Build Coastguard Workerentry: 44*9880d681SAndroid Build Coastguard Worker; CHECK: shl2 45*9880d681SAndroid Build Coastguard Worker; CHECK: psllq 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psllq 47*9880d681SAndroid Build Coastguard Worker; CHECK: ret 48*9880d681SAndroid Build Coastguard Worker %B = shl <2 x i64> %A, < i64 2, i64 2> 49*9880d681SAndroid Build Coastguard Worker %C = shl <2 x i64> %A, < i64 9, i64 9> 50*9880d681SAndroid Build Coastguard Worker %K = xor <2 x i64> %B, %C 51*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %K 52*9880d681SAndroid Build Coastguard Worker} 53*9880d681SAndroid Build Coastguard Worker 54*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shr2(<2 x i64> %A) nounwind { 55*9880d681SAndroid Build Coastguard Workerentry: 56*9880d681SAndroid Build Coastguard Worker; CHECK: shr2 57*9880d681SAndroid Build Coastguard Worker; CHECK: psrlq 58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq 59*9880d681SAndroid Build Coastguard Worker; CHECK: ret 60*9880d681SAndroid Build Coastguard Worker %B = lshr <2 x i64> %A, < i64 8, i64 8> 61*9880d681SAndroid Build Coastguard Worker %C = lshr <2 x i64> %A, < i64 1, i64 1> 62*9880d681SAndroid Build Coastguard Worker %K = xor <2 x i64> %B, %C 63*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %K 64*9880d681SAndroid Build Coastguard Worker} 65*9880d681SAndroid Build Coastguard Worker 66*9880d681SAndroid Build Coastguard Worker 67*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @shl8(<8 x i16> %A) nounwind { 68*9880d681SAndroid Build Coastguard Workerentry: 69*9880d681SAndroid Build Coastguard Worker; CHECK: shl8 70*9880d681SAndroid Build Coastguard Worker; CHECK: psllw 71*9880d681SAndroid Build Coastguard Worker; CHECK: padd 72*9880d681SAndroid Build Coastguard Worker; CHECK: ret 73*9880d681SAndroid Build Coastguard Worker %B = shl <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 74*9880d681SAndroid Build Coastguard Worker %C = shl <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 75*9880d681SAndroid Build Coastguard Worker %K = xor <8 x i16> %B, %C 76*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %K 77*9880d681SAndroid Build Coastguard Worker} 78*9880d681SAndroid Build Coastguard Worker 79*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @shr8(<8 x i16> %A) nounwind { 80*9880d681SAndroid Build Coastguard Workerentry: 81*9880d681SAndroid Build Coastguard Worker; CHECK: shr8 82*9880d681SAndroid Build Coastguard Worker; CHECK: psrlw 83*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlw 84*9880d681SAndroid Build Coastguard Worker; CHECK: ret 85*9880d681SAndroid Build Coastguard Worker %B = lshr <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 86*9880d681SAndroid Build Coastguard Worker %C = lshr <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 87*9880d681SAndroid Build Coastguard Worker %K = xor <8 x i16> %B, %C 88*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %K 89*9880d681SAndroid Build Coastguard Worker} 90*9880d681SAndroid Build Coastguard Worker 91*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @sra8(<8 x i16> %A) nounwind { 92*9880d681SAndroid Build Coastguard Workerentry: 93*9880d681SAndroid Build Coastguard Worker; CHECK: sra8 94*9880d681SAndroid Build Coastguard Worker; CHECK: psraw 95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psraw 96*9880d681SAndroid Build Coastguard Worker; CHECK: ret 97*9880d681SAndroid Build Coastguard Worker %B = ashr <8 x i16> %A, < i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 98*9880d681SAndroid Build Coastguard Worker %C = ashr <8 x i16> %A, < i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 99*9880d681SAndroid Build Coastguard Worker %K = xor <8 x i16> %B, %C 100*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %K 101*9880d681SAndroid Build Coastguard Worker} 102*9880d681SAndroid Build Coastguard Worker 103*9880d681SAndroid Build Coastguard Worker; non-splat test 104*9880d681SAndroid Build Coastguard Worker 105*9880d681SAndroid Build Coastguard Worker 106*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @sll8_nosplat(<8 x i16> %A) nounwind { 107*9880d681SAndroid Build Coastguard Workerentry: 108*9880d681SAndroid Build Coastguard Worker; CHECK: sll8_nosplat 109*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: psll 110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: psll 111*9880d681SAndroid Build Coastguard Worker; CHECK: ret 112*9880d681SAndroid Build Coastguard Worker %B = shl <8 x i16> %A, < i16 1, i16 2, i16 3, i16 6, i16 2, i16 2, i16 2, i16 2> 113*9880d681SAndroid Build Coastguard Worker %C = shl <8 x i16> %A, < i16 9, i16 7, i16 5, i16 1, i16 4, i16 1, i16 1, i16 1> 114*9880d681SAndroid Build Coastguard Worker %K = xor <8 x i16> %B, %C 115*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %K 116*9880d681SAndroid Build Coastguard Worker} 117*9880d681SAndroid Build Coastguard Worker 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @shr2_nosplat(<2 x i64> %A) nounwind { 120*9880d681SAndroid Build Coastguard Workerentry: 121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr2_nosplat 122*9880d681SAndroid Build Coastguard Worker; CHECK: movdqa %xmm0, %xmm1 123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $1, %xmm1 124*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movdqa %xmm0, %xmm2 125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: psrlq $8, %xmm2 126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] 127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] 128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xorpd %xmm0, %xmm1 129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movapd %xmm1, %xmm0 130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 131*9880d681SAndroid Build Coastguard Worker %B = lshr <2 x i64> %A, < i64 8, i64 1> 132*9880d681SAndroid Build Coastguard Worker %C = lshr <2 x i64> %A, < i64 1, i64 0> 133*9880d681SAndroid Build Coastguard Worker %K = xor <2 x i64> %B, %C 134*9880d681SAndroid Build Coastguard Worker ret <2 x i64> %K 135*9880d681SAndroid Build Coastguard Worker} 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker 138*9880d681SAndroid Build Coastguard Worker; Other shifts 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @shl2_other(<2 x i32> %A) nounwind { 141*9880d681SAndroid Build Coastguard Workerentry: 142*9880d681SAndroid Build Coastguard Worker; CHECK: shl2_other 143*9880d681SAndroid Build Coastguard Worker; CHECK: psllq 144*9880d681SAndroid Build Coastguard Worker; CHECK: ret 145*9880d681SAndroid Build Coastguard Worker %B = shl <2 x i32> %A, < i32 2, i32 2> 146*9880d681SAndroid Build Coastguard Worker %C = shl <2 x i32> %A, < i32 9, i32 9> 147*9880d681SAndroid Build Coastguard Worker %K = xor <2 x i32> %B, %C 148*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %K 149*9880d681SAndroid Build Coastguard Worker} 150*9880d681SAndroid Build Coastguard Worker 151*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @shr2_other(<2 x i32> %A) nounwind { 152*9880d681SAndroid Build Coastguard Workerentry: 153*9880d681SAndroid Build Coastguard Worker; CHECK: shr2_other 154*9880d681SAndroid Build Coastguard Worker; CHECK: psrlq 155*9880d681SAndroid Build Coastguard Worker; CHECK: ret 156*9880d681SAndroid Build Coastguard Worker %B = lshr <2 x i32> %A, < i32 8, i32 8> 157*9880d681SAndroid Build Coastguard Worker %C = lshr <2 x i32> %A, < i32 1, i32 1> 158*9880d681SAndroid Build Coastguard Worker %K = xor <2 x i32> %B, %C 159*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %K 160*9880d681SAndroid Build Coastguard Worker} 161*9880d681SAndroid Build Coastguard Worker 162*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @shl9(<16 x i8> %A) nounwind { 163*9880d681SAndroid Build Coastguard Worker %B = shl <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 164*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %B 165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shl9: 166*9880d681SAndroid Build Coastguard Worker; CHECK: psllw $3 167*9880d681SAndroid Build Coastguard Worker; CHECK: pand 168*9880d681SAndroid Build Coastguard Worker; CHECK: ret 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @shr9(<16 x i8> %A) nounwind { 172*9880d681SAndroid Build Coastguard Worker %B = lshr <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 173*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %B 174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: shr9: 175*9880d681SAndroid Build Coastguard Worker; CHECK: psrlw $3 176*9880d681SAndroid Build Coastguard Worker; CHECK: pand 177*9880d681SAndroid Build Coastguard Worker; CHECK: ret 178*9880d681SAndroid Build Coastguard Worker} 179*9880d681SAndroid Build Coastguard Worker 180*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @sra_v16i8_7(<16 x i8> %A) nounwind { 181*9880d681SAndroid Build Coastguard Worker %B = ashr <16 x i8> %A, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7> 182*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %B 183*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v16i8_7: 184*9880d681SAndroid Build Coastguard Worker; CHECK: pxor 185*9880d681SAndroid Build Coastguard Worker; CHECK: pcmpgtb 186*9880d681SAndroid Build Coastguard Worker; CHECK: ret 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @sra_v16i8(<16 x i8> %A) nounwind { 190*9880d681SAndroid Build Coastguard Worker %B = ashr <16 x i8> %A, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3> 191*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %B 192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: sra_v16i8: 193*9880d681SAndroid Build Coastguard Worker; CHECK: psrlw $3 194*9880d681SAndroid Build Coastguard Worker; CHECK: pand 195*9880d681SAndroid Build Coastguard Worker; CHECK: pxor 196*9880d681SAndroid Build Coastguard Worker; CHECK: psubb 197*9880d681SAndroid Build Coastguard Worker; CHECK: ret 198*9880d681SAndroid Build Coastguard Worker} 199