1*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl | FileCheck %s 2*9880d681SAndroid Build Coastguard Worker;RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck --check-prefix=SKX %s 3*9880d681SAndroid Build Coastguard Worker 4*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: shift_16_i32 5*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrld 6*9880d681SAndroid Build Coastguard Worker;CHECK: vpslld 7*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrad 8*9880d681SAndroid Build Coastguard Worker;CHECK: ret 9*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @shift_16_i32(<16 x i32> %a) { 10*9880d681SAndroid Build Coastguard Worker %b = lshr <16 x i32> %a, <i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1, i32 1> 11*9880d681SAndroid Build Coastguard Worker %c = shl <16 x i32> %b, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12> 12*9880d681SAndroid Build Coastguard Worker %d = ashr <16 x i32> %c, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12> 13*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %d; 14*9880d681SAndroid Build Coastguard Worker} 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker;CHECK-LABEL: shift_8_i64 17*9880d681SAndroid Build Coastguard Worker;CHECK: vpsrlq 18*9880d681SAndroid Build Coastguard Worker;CHECK: vpsllq 19*9880d681SAndroid Build Coastguard Worker;CHECK: vpsraq 20*9880d681SAndroid Build Coastguard Worker;CHECK: ret 21*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @shift_8_i64(<8 x i64> %a) { 22*9880d681SAndroid Build Coastguard Worker %b = lshr <8 x i64> %a, <i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1, i64 1> 23*9880d681SAndroid Build Coastguard Worker %c = shl <8 x i64> %b, <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12> 24*9880d681SAndroid Build Coastguard Worker %d = ashr <8 x i64> %c, <i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12, i64 12> 25*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %d; 26*9880d681SAndroid Build Coastguard Worker} 27*9880d681SAndroid Build Coastguard Worker 28*9880d681SAndroid Build Coastguard Worker;SKX-LABEL: shift_4_i64 29*9880d681SAndroid Build Coastguard Worker;SKX: vpsrlq 30*9880d681SAndroid Build Coastguard Worker;SKX: vpsllq 31*9880d681SAndroid Build Coastguard Worker;SKX: vpsraq 32*9880d681SAndroid Build Coastguard Worker;SKX: ret 33*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @shift_4_i64(<4 x i64> %a) { 34*9880d681SAndroid Build Coastguard Worker %b = lshr <4 x i64> %a, <i64 1, i64 1, i64 1, i64 1> 35*9880d681SAndroid Build Coastguard Worker %c = shl <4 x i64> %b, <i64 12, i64 12, i64 12, i64 12> 36*9880d681SAndroid Build Coastguard Worker %d = ashr <4 x i64> %c, <i64 12, i64 12, i64 12, i64 12> 37*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %d; 38*9880d681SAndroid Build Coastguard Worker} 39*9880d681SAndroid Build Coastguard Worker 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl4 41*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvq %zmm 42*9880d681SAndroid Build Coastguard Worker; CHECK: ret 43*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_shl4(<8 x i64> %x, <8 x i64> %y) { 44*9880d681SAndroid Build Coastguard Worker %k = shl <8 x i64> %x, %y 45*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %k 46*9880d681SAndroid Build Coastguard Worker} 47*9880d681SAndroid Build Coastguard Worker 48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl5 49*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd %zmm 50*9880d681SAndroid Build Coastguard Worker; CHECK: ret 51*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_shl5(<16 x i32> %x, <16 x i32> %y) { 52*9880d681SAndroid Build Coastguard Worker %k = shl <16 x i32> %x, %y 53*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_srl0 57*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd 58*9880d681SAndroid Build Coastguard Worker; CHECK: ret 59*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_srl0(<16 x i32> %x, <16 x i32> %y) { 60*9880d681SAndroid Build Coastguard Worker %k = lshr <16 x i32> %x, %y 61*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 62*9880d681SAndroid Build Coastguard Worker} 63*9880d681SAndroid Build Coastguard Worker 64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_srl2 65*9880d681SAndroid Build Coastguard Worker; CHECK: psrlvq 66*9880d681SAndroid Build Coastguard Worker; CHECK: ret 67*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_srl2(<8 x i64> %x, <8 x i64> %y) { 68*9880d681SAndroid Build Coastguard Worker %k = lshr <8 x i64> %x, %y 69*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %k 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra1 73*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd 74*9880d681SAndroid Build Coastguard Worker; CHECK: ret 75*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_sra1(<16 x i32> %x, <16 x i32> %y) { 76*9880d681SAndroid Build Coastguard Worker %k = ashr <16 x i32> %x, %y 77*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 78*9880d681SAndroid Build Coastguard Worker} 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra2 81*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravq %zmm 82*9880d681SAndroid Build Coastguard Worker; CHECK: ret 83*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_sra2(<8 x i64> %x, <8 x i64> %y) { 84*9880d681SAndroid Build Coastguard Worker %k = ashr <8 x i64> %x, %y 85*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %k 86*9880d681SAndroid Build Coastguard Worker} 87*9880d681SAndroid Build Coastguard Worker 88*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: variable_sra3 89*9880d681SAndroid Build Coastguard Worker; SKX: vpsravq %ymm 90*9880d681SAndroid Build Coastguard Worker; SKX: ret 91*9880d681SAndroid Build Coastguard Workerdefine <4 x i64> @variable_sra3(<4 x i64> %x, <4 x i64> %y) { 92*9880d681SAndroid Build Coastguard Worker %k = ashr <4 x i64> %x, %y 93*9880d681SAndroid Build Coastguard Worker ret <4 x i64> %k 94*9880d681SAndroid Build Coastguard Worker} 95*9880d681SAndroid Build Coastguard Worker 96*9880d681SAndroid Build Coastguard Worker; SKX-LABEL: variable_sra4 97*9880d681SAndroid Build Coastguard Worker; SKX: vpsravw %xmm 98*9880d681SAndroid Build Coastguard Worker; SKX: ret 99*9880d681SAndroid Build Coastguard Workerdefine <8 x i16> @variable_sra4(<8 x i16> %x, <8 x i16> %y) { 100*9880d681SAndroid Build Coastguard Worker %k = ashr <8 x i16> %x, %y 101*9880d681SAndroid Build Coastguard Worker ret <8 x i16> %k 102*9880d681SAndroid Build Coastguard Worker} 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_sra01_load 105*9880d681SAndroid Build Coastguard Worker; CHECK: vpsravd (% 106*9880d681SAndroid Build Coastguard Worker; CHECK: ret 107*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_sra01_load(<16 x i32> %x, <16 x i32>* %y) { 108*9880d681SAndroid Build Coastguard Worker %y1 = load <16 x i32>, <16 x i32>* %y 109*9880d681SAndroid Build Coastguard Worker %k = ashr <16 x i32> %x, %y1 110*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 111*9880d681SAndroid Build Coastguard Worker} 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: variable_shl1_load 114*9880d681SAndroid Build Coastguard Worker; CHECK: vpsllvd (% 115*9880d681SAndroid Build Coastguard Worker; CHECK: ret 116*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_shl1_load(<16 x i32> %x, <16 x i32>* %y) { 117*9880d681SAndroid Build Coastguard Worker %y1 = load <16 x i32>, <16 x i32>* %y 118*9880d681SAndroid Build Coastguard Worker %k = shl <16 x i32> %x, %y1 119*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 120*9880d681SAndroid Build Coastguard Worker} 121*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl0_load 122*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvd (% 123*9880d681SAndroid Build Coastguard Worker; CHECK: ret 124*9880d681SAndroid Build Coastguard Workerdefine <16 x i32> @variable_srl0_load(<16 x i32> %x, <16 x i32>* %y) { 125*9880d681SAndroid Build Coastguard Worker %y1 = load <16 x i32>, <16 x i32>* %y 126*9880d681SAndroid Build Coastguard Worker %k = lshr <16 x i32> %x, %y1 127*9880d681SAndroid Build Coastguard Worker ret <16 x i32> %k 128*9880d681SAndroid Build Coastguard Worker} 129*9880d681SAndroid Build Coastguard Worker 130*9880d681SAndroid Build Coastguard Worker; CHECK: variable_srl3_load 131*9880d681SAndroid Build Coastguard Worker; CHECK: vpsrlvq (% 132*9880d681SAndroid Build Coastguard Worker; CHECK: ret 133*9880d681SAndroid Build Coastguard Workerdefine <8 x i64> @variable_srl3_load(<8 x i64> %x, <8 x i64>* %y) { 134*9880d681SAndroid Build Coastguard Worker %y1 = load <8 x i64>, <8 x i64>* %y 135*9880d681SAndroid Build Coastguard Worker %k = lshr <8 x i64> %x, %y1 136*9880d681SAndroid Build Coastguard Worker ret <8 x i64> %k 137*9880d681SAndroid Build Coastguard Worker} 138