1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512DQ 3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=knl -mattr=+avx512bw | FileCheck %s --check-prefix=ALL --check-prefix=AVX512 --check-prefix=AVX512BW 4 ; 5 ; Variable Shifts 6 ; 7 8 define <8 x i64> @var_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind { 9 ; ALL-LABEL: var_shift_v8i64: 10 ; ALL: ## BB#0: 11 ; ALL-NEXT: vpsravq %zmm1, %zmm0, %zmm0 12 ; ALL-NEXT: retq 13 %shift = ashr <8 x i64> %a, %b 14 ret <8 x i64> %shift 15 } 16 17 define <16 x i32> @var_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind { 18 ; ALL-LABEL: var_shift_v16i32: 19 ; ALL: ## BB#0: 20 ; ALL-NEXT: vpsravd %zmm1, %zmm0, %zmm0 21 ; ALL-NEXT: retq 22 %shift = ashr <16 x i32> %a, %b 23 ret <16 x i32> %shift 24 } 25 26 define <32 x i16> @var_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 27 ; AVX512DQ-LABEL: var_shift_v32i16: 28 ; AVX512DQ: ## BB#0: 29 ; AVX512DQ-NEXT: vpxor %ymm4, %ymm4, %ymm4 30 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm4[4],ymm2[5],ymm4[5],ymm2[6],ymm4[6],ymm2[7],ymm4[7],ymm2[12],ymm4[12],ymm2[13],ymm4[13],ymm2[14],ymm4[14],ymm2[15],ymm4[15] 31 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm6 = ymm4[4],ymm0[4],ymm4[5],ymm0[5],ymm4[6],ymm0[6],ymm4[7],ymm0[7],ymm4[12],ymm0[12],ymm4[13],ymm0[13],ymm4[14],ymm0[14],ymm4[15],ymm0[15] 32 ; AVX512DQ-NEXT: vpsravd %ymm5, %ymm6, %ymm5 33 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5 34 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm2 = ymm2[0],ymm4[0],ymm2[1],ymm4[1],ymm2[2],ymm4[2],ymm2[3],ymm4[3],ymm2[8],ymm4[8],ymm2[9],ymm4[9],ymm2[10],ymm4[10],ymm2[11],ymm4[11] 35 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm4[0],ymm0[0],ymm4[1],ymm0[1],ymm4[2],ymm0[2],ymm4[3],ymm0[3],ymm4[8],ymm0[8],ymm4[9],ymm0[9],ymm4[10],ymm0[10],ymm4[11],ymm0[11] 36 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm0, %ymm0 37 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0 38 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 39 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm2 = ymm3[4],ymm4[4],ymm3[5],ymm4[5],ymm3[6],ymm4[6],ymm3[7],ymm4[7],ymm3[12],ymm4[12],ymm3[13],ymm4[13],ymm3[14],ymm4[14],ymm3[15],ymm4[15] 40 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm4[4],ymm1[4],ymm4[5],ymm1[5],ymm4[6],ymm1[6],ymm4[7],ymm1[7],ymm4[12],ymm1[12],ymm4[13],ymm1[13],ymm4[14],ymm1[14],ymm4[15],ymm1[15] 41 ; AVX512DQ-NEXT: vpsravd %ymm2, %ymm5, %ymm2 42 ; AVX512DQ-NEXT: vpsrld $16, %ymm2, %ymm2 43 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm4[0],ymm3[1],ymm4[1],ymm3[2],ymm4[2],ymm3[3],ymm4[3],ymm3[8],ymm4[8],ymm3[9],ymm4[9],ymm3[10],ymm4[10],ymm3[11],ymm4[11] 44 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm4[0],ymm1[0],ymm4[1],ymm1[1],ymm4[2],ymm1[2],ymm4[3],ymm1[3],ymm4[8],ymm1[8],ymm4[9],ymm1[9],ymm4[10],ymm1[10],ymm4[11],ymm1[11] 45 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm1, %ymm1 46 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1 47 ; AVX512DQ-NEXT: vpackusdw %ymm2, %ymm1, %ymm1 48 ; AVX512DQ-NEXT: retq 49 ; 50 ; AVX512BW-LABEL: var_shift_v32i16: 51 ; AVX512BW: ## BB#0: 52 ; AVX512BW-NEXT: vpsravw %zmm1, %zmm0, %zmm0 53 ; AVX512BW-NEXT: retq 54 %shift = ashr <32 x i16> %a, %b 55 ret <32 x i16> %shift 56 } 57 58 define <64 x i8> @var_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 59 ; AVX512DQ-LABEL: var_shift_v64i8: 60 ; AVX512DQ: ## BB#0: 61 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2 62 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 63 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm5 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 64 ; AVX512DQ-NEXT: vpsraw $4, %ymm5, %ymm6 65 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5 66 ; AVX512DQ-NEXT: vpsraw $2, %ymm5, %ymm6 67 ; AVX512DQ-NEXT: vpaddw %ymm4, %ymm4, %ymm4 68 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm5 69 ; AVX512DQ-NEXT: vpsraw $1, %ymm5, %ymm6 70 ; AVX512DQ-NEXT: vpaddw %ymm4, %ymm4, %ymm4 71 ; AVX512DQ-NEXT: vpblendvb %ymm4, %ymm6, %ymm5, %ymm4 72 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4 73 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 74 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 75 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5 76 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 77 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5 78 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 79 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 80 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5 81 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 82 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 83 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 84 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 85 ; AVX512DQ-NEXT: vpsllw $5, %ymm3, %ymm2 86 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 87 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 88 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5 89 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 90 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5 91 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm3 92 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 93 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5 94 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm3 95 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 96 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3 97 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 98 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 99 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4 100 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 101 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm4 102 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 103 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 104 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm4 105 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm2 106 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 107 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1 108 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 109 ; AVX512DQ-NEXT: retq 110 %shift = ashr <64 x i8> %a, %b 111 ret <64 x i8> %shift 112 } 113 114 ; 115 ; Uniform Variable Shifts 116 ; 117 118 define <8 x i64> @splatvar_shift_v8i64(<8 x i64> %a, <8 x i64> %b) nounwind { 119 ; ALL-LABEL: splatvar_shift_v8i64: 120 ; ALL: ## BB#0: 121 ; ALL-NEXT: vpsraq %xmm1, %zmm0, %zmm0 122 ; ALL-NEXT: retq 123 %splat = shufflevector <8 x i64> %b, <8 x i64> undef, <8 x i32> zeroinitializer 124 %shift = ashr <8 x i64> %a, %splat 125 ret <8 x i64> %shift 126 } 127 128 define <16 x i32> @splatvar_shift_v16i32(<16 x i32> %a, <16 x i32> %b) nounwind { 129 ; ALL-LABEL: splatvar_shift_v16i32: 130 ; ALL: ## BB#0: 131 ; ALL-NEXT: vxorps %xmm2, %xmm2, %xmm2 132 ; ALL-NEXT: vmovss {{.*#+}} xmm1 = xmm1[0],xmm2[1,2,3] 133 ; ALL-NEXT: vpsrad %xmm1, %zmm0, %zmm0 134 ; ALL-NEXT: retq 135 %splat = shufflevector <16 x i32> %b, <16 x i32> undef, <16 x i32> zeroinitializer 136 %shift = ashr <16 x i32> %a, %splat 137 ret <16 x i32> %shift 138 } 139 140 define <32 x i16> @splatvar_shift_v32i16(<32 x i16> %a, <32 x i16> %b) nounwind { 141 ; AVX512DQ-LABEL: splatvar_shift_v32i16: 142 ; AVX512DQ: ## BB#0: 143 ; AVX512DQ-NEXT: vmovd %xmm2, %eax 144 ; AVX512DQ-NEXT: movzwl %ax, %eax 145 ; AVX512DQ-NEXT: vmovd %eax, %xmm2 146 ; AVX512DQ-NEXT: vpsraw %xmm2, %ymm0, %ymm0 147 ; AVX512DQ-NEXT: vpsraw %xmm2, %ymm1, %ymm1 148 ; AVX512DQ-NEXT: retq 149 ; 150 ; AVX512BW-LABEL: splatvar_shift_v32i16: 151 ; AVX512BW: ## BB#0: 152 ; AVX512BW-NEXT: vmovd %xmm1, %eax 153 ; AVX512BW-NEXT: movzwl %ax, %eax 154 ; AVX512BW-NEXT: vmovd %eax, %xmm1 155 ; AVX512BW-NEXT: vpsraw %xmm1, %zmm0, %zmm0 156 ; AVX512BW-NEXT: retq 157 %splat = shufflevector <32 x i16> %b, <32 x i16> undef, <32 x i32> zeroinitializer 158 %shift = ashr <32 x i16> %a, %splat 159 ret <32 x i16> %shift 160 } 161 162 define <64 x i8> @splatvar_shift_v64i8(<64 x i8> %a, <64 x i8> %b) nounwind { 163 ; AVX512DQ-LABEL: splatvar_shift_v64i8: 164 ; AVX512DQ: ## BB#0: 165 ; AVX512DQ-NEXT: vpbroadcastb %xmm2, %ymm2 166 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2 167 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 168 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 169 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5 170 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 171 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5 172 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm6 173 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4 174 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5 175 ; AVX512DQ-NEXT: vpaddw %ymm6, %ymm6, %ymm7 176 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4 177 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4 178 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 179 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 180 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5 181 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 182 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5 183 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm8 184 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0 185 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5 186 ; AVX512DQ-NEXT: vpaddw %ymm8, %ymm8, %ymm9 187 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0 188 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 189 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 190 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 191 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5 192 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 193 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 194 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3 195 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 196 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3 197 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3 198 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 199 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4 200 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 201 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm2 202 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 203 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm2 204 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1 205 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1 206 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 207 ; AVX512DQ-NEXT: retq 208 %splat = shufflevector <64 x i8> %b, <64 x i8> undef, <64 x i32> zeroinitializer 209 %shift = ashr <64 x i8> %a, %splat 210 ret <64 x i8> %shift 211 } 212 213 ; 214 ; Constant Shifts 215 ; 216 217 define <8 x i64> @constant_shift_v8i64(<8 x i64> %a) nounwind { 218 ; ALL-LABEL: constant_shift_v8i64: 219 ; ALL: ## BB#0: 220 ; ALL-NEXT: vpsravq {{.*}}(%rip), %zmm0, %zmm0 221 ; ALL-NEXT: retq 222 %shift = ashr <8 x i64> %a, <i64 1, i64 7, i64 31, i64 62, i64 1, i64 7, i64 31, i64 62> 223 ret <8 x i64> %shift 224 } 225 226 define <16 x i32> @constant_shift_v16i32(<16 x i32> %a) nounwind { 227 ; ALL-LABEL: constant_shift_v16i32: 228 ; ALL: ## BB#0: 229 ; ALL-NEXT: vpsravd {{.*}}(%rip), %zmm0, %zmm0 230 ; ALL-NEXT: retq 231 %shift = ashr <16 x i32> %a, <i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 8, i32 7> 232 ret <16 x i32> %shift 233 } 234 235 define <32 x i16> @constant_shift_v32i16(<32 x i16> %a) nounwind { 236 ; AVX512DQ-LABEL: constant_shift_v32i16: 237 ; AVX512DQ: ## BB#0: 238 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2 239 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15] 240 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm4 = ymm3[4],ymm2[4],ymm3[5],ymm2[5],ymm3[6],ymm2[6],ymm3[7],ymm2[7],ymm3[12],ymm2[12],ymm3[13],ymm2[13],ymm3[14],ymm2[14],ymm3[15],ymm2[15] 241 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm0[4],ymm2[5],ymm0[5],ymm2[6],ymm0[6],ymm2[7],ymm0[7],ymm2[12],ymm0[12],ymm2[13],ymm0[13],ymm2[14],ymm0[14],ymm2[15],ymm0[15] 242 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm5, %ymm5 243 ; AVX512DQ-NEXT: vpsrld $16, %ymm5, %ymm5 244 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm3 = ymm3[0],ymm2[0],ymm3[1],ymm2[1],ymm3[2],ymm2[2],ymm3[3],ymm2[3],ymm3[8],ymm2[8],ymm3[9],ymm2[9],ymm3[10],ymm2[10],ymm3[11],ymm2[11] 245 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm0 = ymm2[0],ymm0[0],ymm2[1],ymm0[1],ymm2[2],ymm0[2],ymm2[3],ymm0[3],ymm2[8],ymm0[8],ymm2[9],ymm0[9],ymm2[10],ymm0[10],ymm2[11],ymm0[11] 246 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm0, %ymm0 247 ; AVX512DQ-NEXT: vpsrld $16, %ymm0, %ymm0 248 ; AVX512DQ-NEXT: vpackusdw %ymm5, %ymm0, %ymm0 249 ; AVX512DQ-NEXT: vpunpckhwd {{.*#+}} ymm5 = ymm2[4],ymm1[4],ymm2[5],ymm1[5],ymm2[6],ymm1[6],ymm2[7],ymm1[7],ymm2[12],ymm1[12],ymm2[13],ymm1[13],ymm2[14],ymm1[14],ymm2[15],ymm1[15] 250 ; AVX512DQ-NEXT: vpsravd %ymm4, %ymm5, %ymm4 251 ; AVX512DQ-NEXT: vpsrld $16, %ymm4, %ymm4 252 ; AVX512DQ-NEXT: vpunpcklwd {{.*#+}} ymm1 = ymm2[0],ymm1[0],ymm2[1],ymm1[1],ymm2[2],ymm1[2],ymm2[3],ymm1[3],ymm2[8],ymm1[8],ymm2[9],ymm1[9],ymm2[10],ymm1[10],ymm2[11],ymm1[11] 253 ; AVX512DQ-NEXT: vpsravd %ymm3, %ymm1, %ymm1 254 ; AVX512DQ-NEXT: vpsrld $16, %ymm1, %ymm1 255 ; AVX512DQ-NEXT: vpackusdw %ymm4, %ymm1, %ymm1 256 ; AVX512DQ-NEXT: retq 257 ; 258 ; AVX512BW-LABEL: constant_shift_v32i16: 259 ; AVX512BW: ## BB#0: 260 ; AVX512BW-NEXT: vpsravw {{.*}}(%rip), %zmm0, %zmm0 261 ; AVX512BW-NEXT: retq 262 %shift = ashr <32 x i16> %a, <i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15, i16 0, i16 1, i16 2, i16 3, i16 4, i16 5, i16 6, i16 7, i16 8, i16 9, i16 10, i16 11, i16 12, i16 13, i16 14, i16 15> 263 ret <32 x i16> %shift 264 } 265 266 define <64 x i8> @constant_shift_v64i8(<64 x i8> %a) nounwind { 267 ; AVX512DQ-LABEL: constant_shift_v64i8: 268 ; AVX512DQ: ## BB#0: 269 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0,0,1,2,3,4,5,6,7,7,6,5,4,3,2,1,0] 270 ; AVX512DQ-NEXT: vpsllw $5, %ymm2, %ymm2 271 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm3 = ymm0[8],ymm2[8],ymm0[9],ymm2[9],ymm0[10],ymm2[10],ymm0[11],ymm2[11],ymm0[12],ymm2[12],ymm0[13],ymm2[13],ymm0[14],ymm2[14],ymm0[15],ymm2[15],ymm0[24],ymm2[24],ymm0[25],ymm2[25],ymm0[26],ymm2[26],ymm0[27],ymm2[27],ymm0[28],ymm2[28],ymm0[29],ymm2[29],ymm0[30],ymm2[30],ymm0[31],ymm2[31] 272 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15,24,24,25,25,26,26,27,27,28,28,29,29,30,30,31,31] 273 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5 274 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm4 275 ; AVX512DQ-NEXT: vpsraw $2, %ymm4, %ymm5 276 ; AVX512DQ-NEXT: vpaddw %ymm3, %ymm3, %ymm6 277 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm5, %ymm4, %ymm4 278 ; AVX512DQ-NEXT: vpsraw $1, %ymm4, %ymm5 279 ; AVX512DQ-NEXT: vpaddw %ymm6, %ymm6, %ymm7 280 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm5, %ymm4, %ymm4 281 ; AVX512DQ-NEXT: vpsrlw $8, %ymm4, %ymm4 282 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm2 = ymm0[0],ymm2[0],ymm0[1],ymm2[1],ymm0[2],ymm2[2],ymm0[3],ymm2[3],ymm0[4],ymm2[4],ymm0[5],ymm2[5],ymm0[6],ymm2[6],ymm0[7],ymm2[7],ymm0[16],ymm2[16],ymm0[17],ymm2[17],ymm0[18],ymm2[18],ymm0[19],ymm2[19],ymm0[20],ymm2[20],ymm0[21],ymm2[21],ymm0[22],ymm2[22],ymm0[23],ymm2[23] 283 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm0 = ymm0[0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,16,16,17,17,18,18,19,19,20,20,21,21,22,22,23,23] 284 ; AVX512DQ-NEXT: vpsraw $4, %ymm0, %ymm5 285 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm5, %ymm0, %ymm0 286 ; AVX512DQ-NEXT: vpsraw $2, %ymm0, %ymm5 287 ; AVX512DQ-NEXT: vpaddw %ymm2, %ymm2, %ymm8 288 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm5, %ymm0, %ymm0 289 ; AVX512DQ-NEXT: vpsraw $1, %ymm0, %ymm5 290 ; AVX512DQ-NEXT: vpaddw %ymm8, %ymm8, %ymm9 291 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm5, %ymm0, %ymm0 292 ; AVX512DQ-NEXT: vpsrlw $8, %ymm0, %ymm0 293 ; AVX512DQ-NEXT: vpackuswb %ymm4, %ymm0, %ymm0 294 ; AVX512DQ-NEXT: vpunpckhbw {{.*#+}} ymm4 = ymm0[8],ymm1[8],ymm0[9],ymm1[9],ymm0[10],ymm1[10],ymm0[11],ymm1[11],ymm0[12],ymm1[12],ymm0[13],ymm1[13],ymm0[14],ymm1[14],ymm0[15],ymm1[15],ymm0[24],ymm1[24],ymm0[25],ymm1[25],ymm0[26],ymm1[26],ymm0[27],ymm1[27],ymm0[28],ymm1[28],ymm0[29],ymm1[29],ymm0[30],ymm1[30],ymm0[31],ymm1[31] 295 ; AVX512DQ-NEXT: vpsraw $4, %ymm4, %ymm5 296 ; AVX512DQ-NEXT: vpblendvb %ymm3, %ymm5, %ymm4, %ymm3 297 ; AVX512DQ-NEXT: vpsraw $2, %ymm3, %ymm4 298 ; AVX512DQ-NEXT: vpblendvb %ymm6, %ymm4, %ymm3, %ymm3 299 ; AVX512DQ-NEXT: vpsraw $1, %ymm3, %ymm4 300 ; AVX512DQ-NEXT: vpblendvb %ymm7, %ymm4, %ymm3, %ymm3 301 ; AVX512DQ-NEXT: vpsrlw $8, %ymm3, %ymm3 302 ; AVX512DQ-NEXT: vpunpcklbw {{.*#+}} ymm1 = ymm0[0],ymm1[0],ymm0[1],ymm1[1],ymm0[2],ymm1[2],ymm0[3],ymm1[3],ymm0[4],ymm1[4],ymm0[5],ymm1[5],ymm0[6],ymm1[6],ymm0[7],ymm1[7],ymm0[16],ymm1[16],ymm0[17],ymm1[17],ymm0[18],ymm1[18],ymm0[19],ymm1[19],ymm0[20],ymm1[20],ymm0[21],ymm1[21],ymm0[22],ymm1[22],ymm0[23],ymm1[23] 303 ; AVX512DQ-NEXT: vpsraw $4, %ymm1, %ymm4 304 ; AVX512DQ-NEXT: vpblendvb %ymm2, %ymm4, %ymm1, %ymm1 305 ; AVX512DQ-NEXT: vpsraw $2, %ymm1, %ymm2 306 ; AVX512DQ-NEXT: vpblendvb %ymm8, %ymm2, %ymm1, %ymm1 307 ; AVX512DQ-NEXT: vpsraw $1, %ymm1, %ymm2 308 ; AVX512DQ-NEXT: vpblendvb %ymm9, %ymm2, %ymm1, %ymm1 309 ; AVX512DQ-NEXT: vpsrlw $8, %ymm1, %ymm1 310 ; AVX512DQ-NEXT: vpackuswb %ymm3, %ymm1, %ymm1 311 ; AVX512DQ-NEXT: retq 312 %shift = ashr <64 x i8> %a, <i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0, i8 0, i8 1, i8 2, i8 3, i8 4, i8 5, i8 6, i8 7, i8 7, i8 6, i8 5, i8 4, i8 3, i8 2, i8 1, i8 0> 313 ret <64 x i8> %shift 314 } 315 316 ; 317 ; Uniform Constant Shifts 318 ; 319 320 define <8 x i64> @splatconstant_shift_v8i64(<8 x i64> %a) nounwind { 321 ; ALL-LABEL: splatconstant_shift_v8i64: 322 ; ALL: ## BB#0: 323 ; ALL-NEXT: vpsraq $7, %zmm0, %zmm0 324 ; ALL-NEXT: retq 325 %shift = ashr <8 x i64> %a, <i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7, i64 7> 326 ret <8 x i64> %shift 327 } 328 329 define <16 x i32> @splatconstant_shift_v16i32(<16 x i32> %a) nounwind { 330 ; ALL-LABEL: splatconstant_shift_v16i32: 331 ; ALL: ## BB#0: 332 ; ALL-NEXT: vpsrad $5, %zmm0, %zmm0 333 ; ALL-NEXT: retq 334 %shift = ashr <16 x i32> %a, <i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5, i32 5> 335 ret <16 x i32> %shift 336 } 337 338 define <32 x i16> @splatconstant_shift_v32i16(<32 x i16> %a) nounwind { 339 ; AVX512DQ-LABEL: splatconstant_shift_v32i16: 340 ; AVX512DQ: ## BB#0: 341 ; AVX512DQ-NEXT: vpsraw $3, %ymm0, %ymm0 342 ; AVX512DQ-NEXT: vpsraw $3, %ymm1, %ymm1 343 ; AVX512DQ-NEXT: retq 344 ; 345 ; AVX512BW-LABEL: splatconstant_shift_v32i16: 346 ; AVX512BW: ## BB#0: 347 ; AVX512BW-NEXT: vpsraw $3, %zmm0, %zmm0 348 ; AVX512BW-NEXT: retq 349 %shift = ashr <32 x i16> %a, <i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3, i16 3> 350 ret <32 x i16> %shift 351 } 352 353 define <64 x i8> @splatconstant_shift_v64i8(<64 x i8> %a) nounwind { 354 ; AVX512DQ-LABEL: splatconstant_shift_v64i8: 355 ; AVX512DQ: ## BB#0: 356 ; AVX512DQ-NEXT: vpsrlw $3, %ymm0, %ymm0 357 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm2 = [31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31] 358 ; AVX512DQ-NEXT: vpand %ymm2, %ymm0, %ymm0 359 ; AVX512DQ-NEXT: vmovdqa {{.*#+}} ymm3 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 360 ; AVX512DQ-NEXT: vpxor %ymm3, %ymm0, %ymm0 361 ; AVX512DQ-NEXT: vpsubb %ymm3, %ymm0, %ymm0 362 ; AVX512DQ-NEXT: vpsrlw $3, %ymm1, %ymm1 363 ; AVX512DQ-NEXT: vpand %ymm2, %ymm1, %ymm1 364 ; AVX512DQ-NEXT: vpxor %ymm3, %ymm1, %ymm1 365 ; AVX512DQ-NEXT: vpsubb %ymm3, %ymm1, %ymm1 366 ; AVX512DQ-NEXT: retq 367 ; 368 ; AVX512BW-LABEL: splatconstant_shift_v64i8: 369 ; AVX512BW: ## BB#0: 370 ; AVX512BW-NEXT: vpsrlw $3, %zmm0, %zmm0 371 ; AVX512BW-NEXT: vpandq {{.*}}(%rip), %zmm0, %zmm0 372 ; AVX512BW-NEXT: vmovdqu8 {{.*#+}} zmm1 = [16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16] 373 ; AVX512BW-NEXT: vpxorq %zmm1, %zmm0, %zmm0 374 ; AVX512BW-NEXT: vpsubb %zmm1, %zmm0, %zmm0 375 ; AVX512BW-NEXT: retq 376 %shift = ashr <64 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, 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, 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, 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> 377 ret <64 x i8> %shift 378 } 379 380 define <64 x i8> @ashr_const7_v64i8(<64 x i8> %a) { 381 ; AVX512DQ-LABEL: ashr_const7_v64i8: 382 ; AVX512DQ: ## BB#0: 383 ; AVX512DQ-NEXT: vpxor %ymm2, %ymm2, %ymm2 384 ; AVX512DQ-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm0 385 ; AVX512DQ-NEXT: vpcmpgtb %ymm1, %ymm2, %ymm1 386 ; AVX512DQ-NEXT: retq 387 ; 388 ; AVX512BW-LABEL: ashr_const7_v64i8: 389 ; AVX512BW: ## BB#0: 390 ; AVX512BW-NEXT: vpxord %zmm1, %zmm1, %zmm1 391 ; AVX512BW-NEXT: vpcmpgtb %zmm0, %zmm1, %k0 392 ; AVX512BW-NEXT: vpmovm2b %k0, %zmm0 393 ; AVX512BW-NEXT: retq 394 %res = ashr <64 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, 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, 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, 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> 395 ret <64 x i8> %res 396 } 397