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