1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX2NOBW 6 ; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512bw | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 --check-prefix=AVX512BW 7 8 ; 9 ; sdiv by 7 10 ; 11 12 define <2 x i64> @test_div7_2i64(<2 x i64> %a) nounwind { 13 ; SSE2-LABEL: test_div7_2i64: 14 ; SSE2: # %bb.0: 15 ; SSE2-NEXT: movq %xmm0, %rax 16 ; SSE2-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925 17 ; SSE2-NEXT: imulq %rcx 18 ; SSE2-NEXT: movq %rdx, %rax 19 ; SSE2-NEXT: shrq $63, %rax 20 ; SSE2-NEXT: sarq %rdx 21 ; SSE2-NEXT: addq %rax, %rdx 22 ; SSE2-NEXT: movq %rdx, %xmm1 23 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 24 ; SSE2-NEXT: movq %xmm0, %rax 25 ; SSE2-NEXT: imulq %rcx 26 ; SSE2-NEXT: movq %rdx, %rax 27 ; SSE2-NEXT: shrq $63, %rax 28 ; SSE2-NEXT: sarq %rdx 29 ; SSE2-NEXT: addq %rax, %rdx 30 ; SSE2-NEXT: movq %rdx, %xmm0 31 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 32 ; SSE2-NEXT: movdqa %xmm1, %xmm0 33 ; SSE2-NEXT: retq 34 ; 35 ; SSE41-LABEL: test_div7_2i64: 36 ; SSE41: # %bb.0: 37 ; SSE41-NEXT: pextrq $1, %xmm0, %rax 38 ; SSE41-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925 39 ; SSE41-NEXT: imulq %rcx 40 ; SSE41-NEXT: movq %rdx, %rax 41 ; SSE41-NEXT: shrq $63, %rax 42 ; SSE41-NEXT: sarq %rdx 43 ; SSE41-NEXT: addq %rax, %rdx 44 ; SSE41-NEXT: movq %rdx, %xmm1 45 ; SSE41-NEXT: movq %xmm0, %rax 46 ; SSE41-NEXT: imulq %rcx 47 ; SSE41-NEXT: movq %rdx, %rax 48 ; SSE41-NEXT: shrq $63, %rax 49 ; SSE41-NEXT: sarq %rdx 50 ; SSE41-NEXT: addq %rax, %rdx 51 ; SSE41-NEXT: movq %rdx, %xmm0 52 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 53 ; SSE41-NEXT: retq 54 ; 55 ; AVX-LABEL: test_div7_2i64: 56 ; AVX: # %bb.0: 57 ; AVX-NEXT: vpextrq $1, %xmm0, %rax 58 ; AVX-NEXT: movabsq $5270498306774157605, %rcx # imm = 0x4924924924924925 59 ; AVX-NEXT: imulq %rcx 60 ; AVX-NEXT: movq %rdx, %rax 61 ; AVX-NEXT: shrq $63, %rax 62 ; AVX-NEXT: sarq %rdx 63 ; AVX-NEXT: addq %rax, %rdx 64 ; AVX-NEXT: vmovq %rdx, %xmm1 65 ; AVX-NEXT: vmovq %xmm0, %rax 66 ; AVX-NEXT: imulq %rcx 67 ; AVX-NEXT: movq %rdx, %rax 68 ; AVX-NEXT: shrq $63, %rax 69 ; AVX-NEXT: sarq %rdx 70 ; AVX-NEXT: addq %rax, %rdx 71 ; AVX-NEXT: vmovq %rdx, %xmm0 72 ; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 73 ; AVX-NEXT: retq 74 %res = sdiv <2 x i64> %a, <i64 7, i64 7> 75 ret <2 x i64> %res 76 } 77 78 define <4 x i32> @test_div7_4i32(<4 x i32> %a) nounwind { 79 ; SSE2-LABEL: test_div7_4i32: 80 ; SSE2: # %bb.0: 81 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 82 ; SSE2-NEXT: movdqa %xmm0, %xmm2 83 ; SSE2-NEXT: psrad $31, %xmm2 84 ; SSE2-NEXT: pand %xmm1, %xmm2 85 ; SSE2-NEXT: movdqa %xmm0, %xmm3 86 ; SSE2-NEXT: pmuludq %xmm1, %xmm3 87 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 88 ; SSE2-NEXT: psrad $31, %xmm1 89 ; SSE2-NEXT: pand %xmm0, %xmm1 90 ; SSE2-NEXT: paddd %xmm1, %xmm2 91 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3] 92 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 93 ; SSE2-NEXT: pmuludq %xmm4, %xmm3 94 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3] 95 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 96 ; SSE2-NEXT: psubd %xmm2, %xmm1 97 ; SSE2-NEXT: paddd %xmm0, %xmm1 98 ; SSE2-NEXT: movdqa %xmm1, %xmm0 99 ; SSE2-NEXT: psrld $31, %xmm0 100 ; SSE2-NEXT: psrad $2, %xmm1 101 ; SSE2-NEXT: paddd %xmm0, %xmm1 102 ; SSE2-NEXT: movdqa %xmm1, %xmm0 103 ; SSE2-NEXT: retq 104 ; 105 ; SSE41-LABEL: test_div7_4i32: 106 ; SSE41: # %bb.0: 107 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] 108 ; SSE41-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 109 ; SSE41-NEXT: pmuldq %xmm1, %xmm2 110 ; SSE41-NEXT: pmuldq %xmm0, %xmm1 111 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 112 ; SSE41-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,3],xmm1[4,5],xmm2[6,7] 113 ; SSE41-NEXT: paddd %xmm0, %xmm1 114 ; SSE41-NEXT: movdqa %xmm1, %xmm0 115 ; SSE41-NEXT: psrld $31, %xmm0 116 ; SSE41-NEXT: psrad $2, %xmm1 117 ; SSE41-NEXT: paddd %xmm0, %xmm1 118 ; SSE41-NEXT: movdqa %xmm1, %xmm0 119 ; SSE41-NEXT: retq 120 ; 121 ; AVX1-LABEL: test_div7_4i32: 122 ; AVX1: # %bb.0: 123 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 124 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 125 ; AVX1-NEXT: vpmuldq %xmm2, %xmm1, %xmm1 126 ; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm2 127 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 128 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 129 ; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm0 130 ; AVX1-NEXT: vpsrld $31, %xmm0, %xmm1 131 ; AVX1-NEXT: vpsrad $2, %xmm0, %xmm0 132 ; AVX1-NEXT: vpaddd %xmm1, %xmm0, %xmm0 133 ; AVX1-NEXT: retq 134 ; 135 ; AVX2-LABEL: test_div7_4i32: 136 ; AVX2: # %bb.0: 137 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 138 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 139 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 140 ; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 141 ; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm1 142 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 143 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] 144 ; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm0 145 ; AVX2-NEXT: vpsrld $31, %xmm0, %xmm1 146 ; AVX2-NEXT: vpsrad $2, %xmm0, %xmm0 147 ; AVX2-NEXT: vpaddd %xmm1, %xmm0, %xmm0 148 ; AVX2-NEXT: retq 149 %res = sdiv <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> 150 ret <4 x i32> %res 151 } 152 153 define <8 x i16> @test_div7_8i16(<8 x i16> %a) nounwind { 154 ; SSE-LABEL: test_div7_8i16: 155 ; SSE: # %bb.0: 156 ; SSE-NEXT: pmulhw {{.*}}(%rip), %xmm0 157 ; SSE-NEXT: movdqa %xmm0, %xmm1 158 ; SSE-NEXT: psrlw $15, %xmm1 159 ; SSE-NEXT: psraw $1, %xmm0 160 ; SSE-NEXT: paddw %xmm1, %xmm0 161 ; SSE-NEXT: retq 162 ; 163 ; AVX-LABEL: test_div7_8i16: 164 ; AVX: # %bb.0: 165 ; AVX-NEXT: vpmulhw {{.*}}(%rip), %xmm0, %xmm0 166 ; AVX-NEXT: vpsrlw $15, %xmm0, %xmm1 167 ; AVX-NEXT: vpsraw $1, %xmm0, %xmm0 168 ; AVX-NEXT: vpaddw %xmm1, %xmm0, %xmm0 169 ; AVX-NEXT: retq 170 %res = sdiv <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 171 ret <8 x i16> %res 172 } 173 174 define <16 x i8> @test_div7_16i8(<16 x i8> %a) nounwind { 175 ; SSE2-LABEL: test_div7_16i8: 176 ; SSE2: # %bb.0: 177 ; SSE2-NEXT: movdqa %xmm0, %xmm2 178 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 179 ; SSE2-NEXT: psraw $8, %xmm2 180 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [65427,65427,65427,65427,65427,65427,65427,65427] 181 ; SSE2-NEXT: pmullw %xmm3, %xmm2 182 ; SSE2-NEXT: psrlw $8, %xmm2 183 ; SSE2-NEXT: movdqa %xmm0, %xmm1 184 ; 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] 185 ; SSE2-NEXT: psraw $8, %xmm1 186 ; SSE2-NEXT: pmullw %xmm3, %xmm1 187 ; SSE2-NEXT: psrlw $8, %xmm1 188 ; SSE2-NEXT: packuswb %xmm2, %xmm1 189 ; SSE2-NEXT: paddb %xmm0, %xmm1 190 ; SSE2-NEXT: movdqa %xmm1, %xmm0 191 ; SSE2-NEXT: psrlw $2, %xmm0 192 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 193 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 194 ; SSE2-NEXT: pxor %xmm2, %xmm0 195 ; SSE2-NEXT: psubb %xmm2, %xmm0 196 ; SSE2-NEXT: psrlw $7, %xmm1 197 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 198 ; SSE2-NEXT: paddb %xmm0, %xmm1 199 ; SSE2-NEXT: movdqa %xmm1, %xmm0 200 ; SSE2-NEXT: retq 201 ; 202 ; SSE41-LABEL: test_div7_16i8: 203 ; SSE41: # %bb.0: 204 ; SSE41-NEXT: pmovsxbw %xmm0, %xmm1 205 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65427,65427,65427,65427,65427,65427,65427,65427] 206 ; SSE41-NEXT: pmullw %xmm2, %xmm1 207 ; SSE41-NEXT: psrlw $8, %xmm1 208 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 209 ; SSE41-NEXT: pmovsxbw %xmm3, %xmm3 210 ; SSE41-NEXT: pmullw %xmm2, %xmm3 211 ; SSE41-NEXT: psrlw $8, %xmm3 212 ; SSE41-NEXT: packuswb %xmm3, %xmm1 213 ; SSE41-NEXT: paddb %xmm0, %xmm1 214 ; SSE41-NEXT: movdqa %xmm1, %xmm0 215 ; SSE41-NEXT: psrlw $2, %xmm0 216 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm0 217 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 218 ; SSE41-NEXT: pxor %xmm2, %xmm0 219 ; SSE41-NEXT: psubb %xmm2, %xmm0 220 ; SSE41-NEXT: psrlw $7, %xmm1 221 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 222 ; SSE41-NEXT: paddb %xmm0, %xmm1 223 ; SSE41-NEXT: movdqa %xmm1, %xmm0 224 ; SSE41-NEXT: retq 225 ; 226 ; AVX1-LABEL: test_div7_16i8: 227 ; AVX1: # %bb.0: 228 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1 229 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65427,65427,65427,65427,65427,65427,65427,65427] 230 ; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1 231 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1 232 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 233 ; AVX1-NEXT: vpmovsxbw %xmm3, %xmm3 234 ; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 235 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 236 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 237 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0 238 ; AVX1-NEXT: vpsrlw $2, %xmm0, %xmm1 239 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 240 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 241 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 242 ; AVX1-NEXT: vpsubb %xmm2, %xmm1, %xmm1 243 ; AVX1-NEXT: vpsrlw $7, %xmm0, %xmm0 244 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 245 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm0 246 ; AVX1-NEXT: retq 247 ; 248 ; AVX2NOBW-LABEL: test_div7_16i8: 249 ; AVX2NOBW: # %bb.0: 250 ; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1 251 ; AVX2NOBW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 252 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1 253 ; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2 254 ; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 255 ; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm0 256 ; AVX2NOBW-NEXT: vpsrlw $2, %xmm0, %xmm1 257 ; AVX2NOBW-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 258 ; AVX2NOBW-NEXT: vmovdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 259 ; AVX2NOBW-NEXT: vpxor %xmm2, %xmm1, %xmm1 260 ; AVX2NOBW-NEXT: vpsubb %xmm2, %xmm1, %xmm1 261 ; AVX2NOBW-NEXT: vpsrlw $7, %xmm0, %xmm0 262 ; AVX2NOBW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 263 ; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm0 264 ; AVX2NOBW-NEXT: vzeroupper 265 ; AVX2NOBW-NEXT: retq 266 ; 267 ; AVX512BW-LABEL: test_div7_16i8: 268 ; AVX512BW: # %bb.0: 269 ; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm1 270 ; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 271 ; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm1 272 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1 273 ; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm0 274 ; AVX512BW-NEXT: vpsrlw $2, %xmm0, %xmm1 275 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 276 ; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm2 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 277 ; AVX512BW-NEXT: vpxor %xmm2, %xmm1, %xmm1 278 ; AVX512BW-NEXT: vpsubb %xmm2, %xmm1, %xmm1 279 ; AVX512BW-NEXT: vpsrlw $7, %xmm0, %xmm0 280 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm0, %xmm0 281 ; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm0 282 ; AVX512BW-NEXT: vzeroupper 283 ; AVX512BW-NEXT: retq 284 %res = sdiv <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> 285 ret <16 x i8> %res 286 } 287 288 ; 289 ; srem by 7 290 ; 291 292 define <2 x i64> @test_rem7_2i64(<2 x i64> %a) nounwind { 293 ; SSE2-LABEL: test_rem7_2i64: 294 ; SSE2: # %bb.0: 295 ; SSE2-NEXT: movq %xmm0, %rcx 296 ; SSE2-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925 297 ; SSE2-NEXT: movq %rcx, %rax 298 ; SSE2-NEXT: imulq %rsi 299 ; SSE2-NEXT: movq %rdx, %rax 300 ; SSE2-NEXT: shrq $63, %rax 301 ; SSE2-NEXT: sarq %rdx 302 ; SSE2-NEXT: addq %rax, %rdx 303 ; SSE2-NEXT: leaq (,%rdx,8), %rax 304 ; SSE2-NEXT: subq %rax, %rdx 305 ; SSE2-NEXT: addq %rcx, %rdx 306 ; SSE2-NEXT: movq %rdx, %xmm1 307 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] 308 ; SSE2-NEXT: movq %xmm0, %rcx 309 ; SSE2-NEXT: movq %rcx, %rax 310 ; SSE2-NEXT: imulq %rsi 311 ; SSE2-NEXT: movq %rdx, %rax 312 ; SSE2-NEXT: shrq $63, %rax 313 ; SSE2-NEXT: sarq %rdx 314 ; SSE2-NEXT: addq %rax, %rdx 315 ; SSE2-NEXT: leaq (,%rdx,8), %rax 316 ; SSE2-NEXT: subq %rax, %rdx 317 ; SSE2-NEXT: addq %rcx, %rdx 318 ; SSE2-NEXT: movq %rdx, %xmm0 319 ; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 320 ; SSE2-NEXT: movdqa %xmm1, %xmm0 321 ; SSE2-NEXT: retq 322 ; 323 ; SSE41-LABEL: test_rem7_2i64: 324 ; SSE41: # %bb.0: 325 ; SSE41-NEXT: pextrq $1, %xmm0, %rcx 326 ; SSE41-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925 327 ; SSE41-NEXT: movq %rcx, %rax 328 ; SSE41-NEXT: imulq %rsi 329 ; SSE41-NEXT: movq %rdx, %rax 330 ; SSE41-NEXT: shrq $63, %rax 331 ; SSE41-NEXT: sarq %rdx 332 ; SSE41-NEXT: addq %rax, %rdx 333 ; SSE41-NEXT: leaq (,%rdx,8), %rax 334 ; SSE41-NEXT: subq %rax, %rdx 335 ; SSE41-NEXT: addq %rcx, %rdx 336 ; SSE41-NEXT: movq %rdx, %xmm1 337 ; SSE41-NEXT: movq %xmm0, %rcx 338 ; SSE41-NEXT: movq %rcx, %rax 339 ; SSE41-NEXT: imulq %rsi 340 ; SSE41-NEXT: movq %rdx, %rax 341 ; SSE41-NEXT: shrq $63, %rax 342 ; SSE41-NEXT: sarq %rdx 343 ; SSE41-NEXT: addq %rax, %rdx 344 ; SSE41-NEXT: leaq (,%rdx,8), %rax 345 ; SSE41-NEXT: subq %rax, %rdx 346 ; SSE41-NEXT: addq %rcx, %rdx 347 ; SSE41-NEXT: movq %rdx, %xmm0 348 ; SSE41-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 349 ; SSE41-NEXT: retq 350 ; 351 ; AVX-LABEL: test_rem7_2i64: 352 ; AVX: # %bb.0: 353 ; AVX-NEXT: vpextrq $1, %xmm0, %rcx 354 ; AVX-NEXT: movabsq $5270498306774157605, %rsi # imm = 0x4924924924924925 355 ; AVX-NEXT: movq %rcx, %rax 356 ; AVX-NEXT: imulq %rsi 357 ; AVX-NEXT: movq %rdx, %rax 358 ; AVX-NEXT: shrq $63, %rax 359 ; AVX-NEXT: sarq %rdx 360 ; AVX-NEXT: addq %rax, %rdx 361 ; AVX-NEXT: leaq (,%rdx,8), %rax 362 ; AVX-NEXT: subq %rax, %rdx 363 ; AVX-NEXT: addq %rcx, %rdx 364 ; AVX-NEXT: vmovq %rdx, %xmm1 365 ; AVX-NEXT: vmovq %xmm0, %rcx 366 ; AVX-NEXT: movq %rcx, %rax 367 ; AVX-NEXT: imulq %rsi 368 ; AVX-NEXT: movq %rdx, %rax 369 ; AVX-NEXT: shrq $63, %rax 370 ; AVX-NEXT: sarq %rdx 371 ; AVX-NEXT: addq %rax, %rdx 372 ; AVX-NEXT: leaq (,%rdx,8), %rax 373 ; AVX-NEXT: subq %rax, %rdx 374 ; AVX-NEXT: addq %rcx, %rdx 375 ; AVX-NEXT: vmovq %rdx, %xmm0 376 ; AVX-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] 377 ; AVX-NEXT: retq 378 %res = srem <2 x i64> %a, <i64 7, i64 7> 379 ret <2 x i64> %res 380 } 381 382 define <4 x i32> @test_rem7_4i32(<4 x i32> %a) nounwind { 383 ; SSE2-LABEL: test_rem7_4i32: 384 ; SSE2: # %bb.0: 385 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 386 ; SSE2-NEXT: movdqa %xmm0, %xmm2 387 ; SSE2-NEXT: psrad $31, %xmm2 388 ; SSE2-NEXT: pand %xmm1, %xmm2 389 ; SSE2-NEXT: movdqa %xmm0, %xmm3 390 ; SSE2-NEXT: pmuludq %xmm1, %xmm3 391 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,3,3] 392 ; SSE2-NEXT: psrad $31, %xmm1 393 ; SSE2-NEXT: pand %xmm0, %xmm1 394 ; SSE2-NEXT: paddd %xmm1, %xmm2 395 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,3,2,3] 396 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 397 ; SSE2-NEXT: pmuludq %xmm4, %xmm3 398 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,3,2,3] 399 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1] 400 ; SSE2-NEXT: psubd %xmm2, %xmm1 401 ; SSE2-NEXT: paddd %xmm0, %xmm1 402 ; SSE2-NEXT: movdqa %xmm1, %xmm2 403 ; SSE2-NEXT: psrld $31, %xmm2 404 ; SSE2-NEXT: psrad $2, %xmm1 405 ; SSE2-NEXT: paddd %xmm2, %xmm1 406 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [7,7,7,7] 407 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] 408 ; SSE2-NEXT: pmuludq %xmm2, %xmm1 409 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 410 ; SSE2-NEXT: pmuludq %xmm2, %xmm3 411 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm3[0,2,2,3] 412 ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm2[0],xmm1[1],xmm2[1] 413 ; SSE2-NEXT: psubd %xmm1, %xmm0 414 ; SSE2-NEXT: retq 415 ; 416 ; SSE41-LABEL: test_rem7_4i32: 417 ; SSE41: # %bb.0: 418 ; SSE41-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 419 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 420 ; SSE41-NEXT: pmuldq %xmm2, %xmm1 421 ; SSE41-NEXT: pmuldq %xmm0, %xmm2 422 ; SSE41-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 423 ; SSE41-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 424 ; SSE41-NEXT: paddd %xmm0, %xmm2 425 ; SSE41-NEXT: movdqa %xmm2, %xmm1 426 ; SSE41-NEXT: psrld $31, %xmm1 427 ; SSE41-NEXT: psrad $2, %xmm2 428 ; SSE41-NEXT: paddd %xmm1, %xmm2 429 ; SSE41-NEXT: pmulld {{.*}}(%rip), %xmm2 430 ; SSE41-NEXT: psubd %xmm2, %xmm0 431 ; SSE41-NEXT: retq 432 ; 433 ; AVX1-LABEL: test_rem7_4i32: 434 ; AVX1: # %bb.0: 435 ; AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 436 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2454267027,2454267027,2454267027,2454267027] 437 ; AVX1-NEXT: vpmuldq %xmm2, %xmm1, %xmm1 438 ; AVX1-NEXT: vpmuldq %xmm2, %xmm0, %xmm2 439 ; AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] 440 ; AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3],xmm2[4,5],xmm1[6,7] 441 ; AVX1-NEXT: vpaddd %xmm0, %xmm1, %xmm1 442 ; AVX1-NEXT: vpsrld $31, %xmm1, %xmm2 443 ; AVX1-NEXT: vpsrad $2, %xmm1, %xmm1 444 ; AVX1-NEXT: vpaddd %xmm2, %xmm1, %xmm1 445 ; AVX1-NEXT: vpmulld {{.*}}(%rip), %xmm1, %xmm1 446 ; AVX1-NEXT: vpsubd %xmm1, %xmm0, %xmm0 447 ; AVX1-NEXT: retq 448 ; 449 ; AVX2-LABEL: test_rem7_4i32: 450 ; AVX2: # %bb.0: 451 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm1 = [2454267027,2454267027,2454267027,2454267027] 452 ; AVX2-NEXT: vpshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] 453 ; AVX2-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 454 ; AVX2-NEXT: vpmuldq %xmm2, %xmm3, %xmm2 455 ; AVX2-NEXT: vpmuldq %xmm1, %xmm0, %xmm1 456 ; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 457 ; AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] 458 ; AVX2-NEXT: vpaddd %xmm0, %xmm1, %xmm1 459 ; AVX2-NEXT: vpsrld $31, %xmm1, %xmm2 460 ; AVX2-NEXT: vpsrad $2, %xmm1, %xmm1 461 ; AVX2-NEXT: vpaddd %xmm2, %xmm1, %xmm1 462 ; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [7,7,7,7] 463 ; AVX2-NEXT: vpmulld %xmm2, %xmm1, %xmm1 464 ; AVX2-NEXT: vpsubd %xmm1, %xmm0, %xmm0 465 ; AVX2-NEXT: retq 466 %res = srem <4 x i32> %a, <i32 7, i32 7, i32 7, i32 7> 467 ret <4 x i32> %res 468 } 469 470 define <8 x i16> @test_rem7_8i16(<8 x i16> %a) nounwind { 471 ; SSE-LABEL: test_rem7_8i16: 472 ; SSE: # %bb.0: 473 ; SSE-NEXT: movdqa {{.*#+}} xmm1 = [18725,18725,18725,18725,18725,18725,18725,18725] 474 ; SSE-NEXT: pmulhw %xmm0, %xmm1 475 ; SSE-NEXT: movdqa %xmm1, %xmm2 476 ; SSE-NEXT: psrlw $15, %xmm2 477 ; SSE-NEXT: psraw $1, %xmm1 478 ; SSE-NEXT: paddw %xmm2, %xmm1 479 ; SSE-NEXT: pmullw {{.*}}(%rip), %xmm1 480 ; SSE-NEXT: psubw %xmm1, %xmm0 481 ; SSE-NEXT: retq 482 ; 483 ; AVX-LABEL: test_rem7_8i16: 484 ; AVX: # %bb.0: 485 ; AVX-NEXT: vpmulhw {{.*}}(%rip), %xmm0, %xmm1 486 ; AVX-NEXT: vpsrlw $15, %xmm1, %xmm2 487 ; AVX-NEXT: vpsraw $1, %xmm1, %xmm1 488 ; AVX-NEXT: vpaddw %xmm2, %xmm1, %xmm1 489 ; AVX-NEXT: vpmullw {{.*}}(%rip), %xmm1, %xmm1 490 ; AVX-NEXT: vpsubw %xmm1, %xmm0, %xmm0 491 ; AVX-NEXT: retq 492 %res = srem <8 x i16> %a, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7> 493 ret <8 x i16> %res 494 } 495 496 define <16 x i8> @test_rem7_16i8(<16 x i8> %a) nounwind { 497 ; SSE2-LABEL: test_rem7_16i8: 498 ; SSE2: # %bb.0: 499 ; SSE2-NEXT: movdqa %xmm0, %xmm2 500 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 501 ; SSE2-NEXT: psraw $8, %xmm2 502 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [65427,65427,65427,65427,65427,65427,65427,65427] 503 ; SSE2-NEXT: pmullw %xmm3, %xmm2 504 ; SSE2-NEXT: psrlw $8, %xmm2 505 ; SSE2-NEXT: movdqa %xmm0, %xmm1 506 ; 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] 507 ; SSE2-NEXT: psraw $8, %xmm1 508 ; SSE2-NEXT: pmullw %xmm3, %xmm1 509 ; SSE2-NEXT: psrlw $8, %xmm1 510 ; SSE2-NEXT: packuswb %xmm2, %xmm1 511 ; SSE2-NEXT: paddb %xmm0, %xmm1 512 ; SSE2-NEXT: movdqa %xmm1, %xmm2 513 ; SSE2-NEXT: psrlw $2, %xmm2 514 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 515 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 516 ; SSE2-NEXT: pxor %xmm3, %xmm2 517 ; SSE2-NEXT: psubb %xmm3, %xmm2 518 ; SSE2-NEXT: psrlw $7, %xmm1 519 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 520 ; SSE2-NEXT: paddb %xmm2, %xmm1 521 ; SSE2-NEXT: movdqa %xmm1, %xmm2 522 ; SSE2-NEXT: punpckhbw {{.*#+}} xmm2 = xmm2[8],xmm0[8],xmm2[9],xmm0[9],xmm2[10],xmm0[10],xmm2[11],xmm0[11],xmm2[12],xmm0[12],xmm2[13],xmm0[13],xmm2[14],xmm0[14],xmm2[15],xmm0[15] 523 ; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] 524 ; SSE2-NEXT: pmullw %xmm3, %xmm2 525 ; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 526 ; SSE2-NEXT: pand %xmm4, %xmm2 527 ; 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] 528 ; SSE2-NEXT: pmullw %xmm3, %xmm1 529 ; SSE2-NEXT: pand %xmm4, %xmm1 530 ; SSE2-NEXT: packuswb %xmm2, %xmm1 531 ; SSE2-NEXT: psubb %xmm1, %xmm0 532 ; SSE2-NEXT: retq 533 ; 534 ; SSE41-LABEL: test_rem7_16i8: 535 ; SSE41: # %bb.0: 536 ; SSE41-NEXT: pmovsxbw %xmm0, %xmm1 537 ; SSE41-NEXT: movdqa {{.*#+}} xmm2 = [65427,65427,65427,65427,65427,65427,65427,65427] 538 ; SSE41-NEXT: pmullw %xmm2, %xmm1 539 ; SSE41-NEXT: psrlw $8, %xmm1 540 ; SSE41-NEXT: pshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 541 ; SSE41-NEXT: pmovsxbw %xmm3, %xmm3 542 ; SSE41-NEXT: pmullw %xmm2, %xmm3 543 ; SSE41-NEXT: psrlw $8, %xmm3 544 ; SSE41-NEXT: packuswb %xmm3, %xmm1 545 ; SSE41-NEXT: paddb %xmm0, %xmm1 546 ; SSE41-NEXT: movdqa %xmm1, %xmm2 547 ; SSE41-NEXT: psrlw $2, %xmm2 548 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm2 549 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 550 ; SSE41-NEXT: pxor %xmm3, %xmm2 551 ; SSE41-NEXT: psubb %xmm3, %xmm2 552 ; SSE41-NEXT: psrlw $7, %xmm1 553 ; SSE41-NEXT: pand {{.*}}(%rip), %xmm1 554 ; SSE41-NEXT: paddb %xmm2, %xmm1 555 ; SSE41-NEXT: pmovzxbw {{.*#+}} xmm2 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 556 ; SSE41-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 557 ; SSE41-NEXT: movdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] 558 ; SSE41-NEXT: pmullw %xmm3, %xmm1 559 ; SSE41-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 560 ; SSE41-NEXT: pand %xmm4, %xmm1 561 ; SSE41-NEXT: pmullw %xmm3, %xmm2 562 ; SSE41-NEXT: pand %xmm4, %xmm2 563 ; SSE41-NEXT: packuswb %xmm1, %xmm2 564 ; SSE41-NEXT: psubb %xmm2, %xmm0 565 ; SSE41-NEXT: retq 566 ; 567 ; AVX1-LABEL: test_rem7_16i8: 568 ; AVX1: # %bb.0: 569 ; AVX1-NEXT: vpmovsxbw %xmm0, %xmm1 570 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [65427,65427,65427,65427,65427,65427,65427,65427] 571 ; AVX1-NEXT: vpmullw %xmm2, %xmm1, %xmm1 572 ; AVX1-NEXT: vpsrlw $8, %xmm1, %xmm1 573 ; AVX1-NEXT: vpshufd {{.*#+}} xmm3 = xmm0[2,3,0,1] 574 ; AVX1-NEXT: vpmovsxbw %xmm3, %xmm3 575 ; AVX1-NEXT: vpmullw %xmm2, %xmm3, %xmm2 576 ; AVX1-NEXT: vpsrlw $8, %xmm2, %xmm2 577 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 578 ; AVX1-NEXT: vpaddb %xmm0, %xmm1, %xmm1 579 ; AVX1-NEXT: vpsrlw $2, %xmm1, %xmm2 580 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 581 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 582 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 583 ; AVX1-NEXT: vpsubb %xmm3, %xmm2, %xmm2 584 ; AVX1-NEXT: vpsrlw $7, %xmm1, %xmm1 585 ; AVX1-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 586 ; AVX1-NEXT: vpaddb %xmm1, %xmm2, %xmm1 587 ; AVX1-NEXT: vpunpckhbw {{.*#+}} xmm2 = xmm1[8,8,9,9,10,10,11,11,12,12,13,13,14,14,15,15] 588 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7] 589 ; AVX1-NEXT: vpmullw %xmm3, %xmm2, %xmm2 590 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] 591 ; AVX1-NEXT: vpand %xmm4, %xmm2, %xmm2 592 ; AVX1-NEXT: vpmovzxbw {{.*#+}} xmm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero 593 ; AVX1-NEXT: vpmullw %xmm3, %xmm1, %xmm1 594 ; AVX1-NEXT: vpand %xmm4, %xmm1, %xmm1 595 ; AVX1-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 596 ; AVX1-NEXT: vpsubb %xmm1, %xmm0, %xmm0 597 ; AVX1-NEXT: retq 598 ; 599 ; AVX2NOBW-LABEL: test_rem7_16i8: 600 ; AVX2NOBW: # %bb.0: 601 ; AVX2NOBW-NEXT: vpmovsxbw %xmm0, %ymm1 602 ; AVX2NOBW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 603 ; AVX2NOBW-NEXT: vpsrlw $8, %ymm1, %ymm1 604 ; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2 605 ; AVX2NOBW-NEXT: vpackuswb %xmm2, %xmm1, %xmm1 606 ; AVX2NOBW-NEXT: vpaddb %xmm0, %xmm1, %xmm1 607 ; AVX2NOBW-NEXT: vpsrlw $2, %xmm1, %xmm2 608 ; AVX2NOBW-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 609 ; AVX2NOBW-NEXT: vmovdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 610 ; AVX2NOBW-NEXT: vpxor %xmm3, %xmm2, %xmm2 611 ; AVX2NOBW-NEXT: vpsubb %xmm3, %xmm2, %xmm2 612 ; AVX2NOBW-NEXT: vpsrlw $7, %xmm1, %xmm1 613 ; AVX2NOBW-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 614 ; AVX2NOBW-NEXT: vpaddb %xmm1, %xmm2, %xmm1 615 ; AVX2NOBW-NEXT: vpmovsxbw %xmm1, %ymm1 616 ; AVX2NOBW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 617 ; AVX2NOBW-NEXT: vextracti128 $1, %ymm1, %xmm2 618 ; AVX2NOBW-NEXT: vmovdqa {{.*#+}} xmm3 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> 619 ; AVX2NOBW-NEXT: vpshufb %xmm3, %xmm2, %xmm2 620 ; AVX2NOBW-NEXT: vpshufb %xmm3, %xmm1, %xmm1 621 ; AVX2NOBW-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm2[0] 622 ; AVX2NOBW-NEXT: vpsubb %xmm1, %xmm0, %xmm0 623 ; AVX2NOBW-NEXT: vzeroupper 624 ; AVX2NOBW-NEXT: retq 625 ; 626 ; AVX512BW-LABEL: test_rem7_16i8: 627 ; AVX512BW: # %bb.0: 628 ; AVX512BW-NEXT: vpmovsxbw %xmm0, %ymm1 629 ; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 630 ; AVX512BW-NEXT: vpsrlw $8, %ymm1, %ymm1 631 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1 632 ; AVX512BW-NEXT: vpaddb %xmm0, %xmm1, %xmm1 633 ; AVX512BW-NEXT: vpsrlw $2, %xmm1, %xmm2 634 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm2, %xmm2 635 ; AVX512BW-NEXT: vmovdqa {{.*#+}} xmm3 = [32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32] 636 ; AVX512BW-NEXT: vpxor %xmm3, %xmm2, %xmm2 637 ; AVX512BW-NEXT: vpsubb %xmm3, %xmm2, %xmm2 638 ; AVX512BW-NEXT: vpsrlw $7, %xmm1, %xmm1 639 ; AVX512BW-NEXT: vpand {{.*}}(%rip), %xmm1, %xmm1 640 ; AVX512BW-NEXT: vpaddb %xmm1, %xmm2, %xmm1 641 ; AVX512BW-NEXT: vpmovsxbw %xmm1, %ymm1 642 ; AVX512BW-NEXT: vpmullw {{.*}}(%rip), %ymm1, %ymm1 643 ; AVX512BW-NEXT: vpmovwb %zmm1, %ymm1 644 ; AVX512BW-NEXT: vpsubb %xmm1, %xmm0, %xmm0 645 ; AVX512BW-NEXT: vzeroupper 646 ; AVX512BW-NEXT: retq 647 %res = srem <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> 648 ret <16 x i8> %res 649 } 650