1*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=corei7-avx | FileCheck %s --check-prefix=CHECK --check-prefix=AVX 2*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core2 | FileCheck %s --check-prefix=CHECK --check-prefix=SSE 3*9880d681SAndroid Build Coastguard Worker; RUN: llc < %s -mtriple=x86_64-unknown-linux-gnu -mcpu=core-avx2 | FileCheck %s --check-prefix=CHECK --check-prefix=AVX2 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker 6*9880d681SAndroid Build Coastguard Worker; Verify that the following shifts are lowered into a sequence of two shifts plus 7*9880d681SAndroid Build Coastguard Worker; a blend. On pre-avx2 targets, instead of scalarizing logical and arithmetic 8*9880d681SAndroid Build Coastguard Worker; packed shift right by a constant build_vector the backend should always try to 9*9880d681SAndroid Build Coastguard Worker; emit a simpler sequence of two shifts + blend when possible. 10*9880d681SAndroid Build Coastguard Worker 11*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test1(<8 x i16> %a) { 12*9880d681SAndroid Build Coastguard Worker %lshr = lshr <8 x i16> %a, <i16 3, i16 3, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 13*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %lshr 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test1 16*9880d681SAndroid Build Coastguard Worker; SSE: psrlw 17*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrlw 18*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss 19*9880d681SAndroid Build Coastguard Worker; AVX: vpsrlw 20*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlw 21*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss 22*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlw 23*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsrlw 24*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovss 25*9880d681SAndroid Build Coastguard Worker; CHECK: ret 26*9880d681SAndroid Build Coastguard Worker 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test2(<8 x i16> %a) { 29*9880d681SAndroid Build Coastguard Worker %lshr = lshr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 2, i16 2, i16 2, i16 2> 30*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %lshr 31*9880d681SAndroid Build Coastguard Worker} 32*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test2 33*9880d681SAndroid Build Coastguard Worker; SSE: psrlw 34*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrlw 35*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd 36*9880d681SAndroid Build Coastguard Worker; AVX: vpsrlw 37*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrlw 38*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd 39*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlw 40*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsrlw 41*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovsd 42*9880d681SAndroid Build Coastguard Worker; CHECK: ret 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker 45*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test3(<4 x i32> %a) { 46*9880d681SAndroid Build Coastguard Worker %lshr = lshr <4 x i32> %a, <i32 3, i32 2, i32 2, i32 2> 47*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %lshr 48*9880d681SAndroid Build Coastguard Worker} 49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test3 50*9880d681SAndroid Build Coastguard Worker; SSE: psrld 51*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrld 52*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss 53*9880d681SAndroid Build Coastguard Worker; AVX: vpsrld 54*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrld 55*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss 56*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlvd 57*9880d681SAndroid Build Coastguard Worker; CHECK: ret 58*9880d681SAndroid Build Coastguard Worker 59*9880d681SAndroid Build Coastguard Worker 60*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test4(<4 x i32> %a) { 61*9880d681SAndroid Build Coastguard Worker %lshr = lshr <4 x i32> %a, <i32 3, i32 3, i32 2, i32 2> 62*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %lshr 63*9880d681SAndroid Build Coastguard Worker} 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test4 65*9880d681SAndroid Build Coastguard Worker; SSE: psrld 66*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrld 67*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd 68*9880d681SAndroid Build Coastguard Worker; AVX: vpsrld 69*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrld 70*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd 71*9880d681SAndroid Build Coastguard Worker; AVX2: vpsrlvd 72*9880d681SAndroid Build Coastguard Worker; CHECK: ret 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker 75*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test5(<8 x i16> %a) { 76*9880d681SAndroid Build Coastguard Worker %lshr = ashr <8 x i16> %a, <i16 3, i16 3, i16 2, i16 2, i16 2, i16 2, i16 2, i16 2> 77*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %lshr 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @test6(<8 x i16> %a) { 81*9880d681SAndroid Build Coastguard Worker %lshr = ashr <8 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 2, i16 2, i16 2, i16 2> 82*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %lshr 83*9880d681SAndroid Build Coastguard Worker} 84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test6 85*9880d681SAndroid Build Coastguard Worker; SSE: psraw 86*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psraw 87*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd 88*9880d681SAndroid Build Coastguard Worker; AVX: vpsraw 89*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsraw 90*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd 91*9880d681SAndroid Build Coastguard Worker; AVX2: vpsraw 92*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vpsraw 93*9880d681SAndroid Build Coastguard Worker; AVX2-NEXT: vmovsd 94*9880d681SAndroid Build Coastguard Worker; CHECK: ret 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker 97*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test7(<4 x i32> %a) { 98*9880d681SAndroid Build Coastguard Worker %lshr = ashr <4 x i32> %a, <i32 3, i32 2, i32 2, i32 2> 99*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %lshr 100*9880d681SAndroid Build Coastguard Worker} 101*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test7 102*9880d681SAndroid Build Coastguard Worker; SSE: psrad 103*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrad 104*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movss 105*9880d681SAndroid Build Coastguard Worker; AVX: vpsrad 106*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrad 107*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovss 108*9880d681SAndroid Build Coastguard Worker; AVX2: vpsravd 109*9880d681SAndroid Build Coastguard Worker; CHECK: ret 110*9880d681SAndroid Build Coastguard Worker 111*9880d681SAndroid Build Coastguard Worker 112*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @test8(<4 x i32> %a) { 113*9880d681SAndroid Build Coastguard Worker %lshr = ashr <4 x i32> %a, <i32 3, i32 3, i32 2, i32 2> 114*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %lshr 115*9880d681SAndroid Build Coastguard Worker} 116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test8 117*9880d681SAndroid Build Coastguard Worker; SSE: psrad 118*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: psrad 119*9880d681SAndroid Build Coastguard Worker; SSE-NEXT: movsd 120*9880d681SAndroid Build Coastguard Worker; AVX: vpsrad 121*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vpsrad 122*9880d681SAndroid Build Coastguard Worker; AVX-NEXT: vmovsd 123*9880d681SAndroid Build Coastguard Worker; AVX2: vpsravd 124*9880d681SAndroid Build Coastguard Worker; CHECK: ret 125*9880d681SAndroid Build Coastguard Worker 126