1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f | FileCheck %s --check-prefix=ALL --check-prefix=KNL 3 ; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+avx512f -mattr=+avx512vl -mattr=+avx512bw -mattr=+avx512dq | FileCheck %s --check-prefix=ALL --check-prefix=SKX 4 5 attributes #0 = { nounwind } 6 7 define <16 x i8> @trunc_16x32_to_16x8(<16 x i32> %i) #0 { 8 ; ALL-LABEL: trunc_16x32_to_16x8: 9 ; ALL: ## BB#0: 10 ; ALL-NEXT: vpmovdb %zmm0, %xmm0 11 ; ALL-NEXT: retq 12 %x = trunc <16 x i32> %i to <16 x i8> 13 ret <16 x i8> %x 14 } 15 16 define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) #0 { 17 ; ALL-LABEL: trunc_8x64_to_8x16: 18 ; ALL: ## BB#0: 19 ; ALL-NEXT: vpmovqw %zmm0, %xmm0 20 ; ALL-NEXT: retq 21 %x = trunc <8 x i64> %i to <8 x i16> 22 ret <8 x i16> %x 23 } 24 25 define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) #0 { 26 ; ALL-LABEL: trunc_v16i32_to_v16i16: 27 ; ALL: ## BB#0: 28 ; ALL-NEXT: vpmovdw %zmm0, %ymm0 29 ; ALL-NEXT: retq 30 %1 = trunc <16 x i32> %x to <16 x i16> 31 ret <16 x i16> %1 32 } 33 34 define <8 x i8> @trunc_qb_512(<8 x i64> %i) #0 { 35 ; ALL-LABEL: trunc_qb_512: 36 ; ALL: ## BB#0: 37 ; ALL-NEXT: vpmovqw %zmm0, %xmm0 38 ; ALL-NEXT: retq 39 %x = trunc <8 x i64> %i to <8 x i8> 40 ret <8 x i8> %x 41 } 42 43 define void @trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) #0 { 44 ; ALL-LABEL: trunc_qb_512_mem: 45 ; ALL: ## BB#0: 46 ; ALL-NEXT: vpmovqb %zmm0, (%rdi) 47 ; ALL-NEXT: retq 48 %x = trunc <8 x i64> %i to <8 x i8> 49 store <8 x i8> %x, <8 x i8>* %res 50 ret void 51 } 52 53 define <4 x i8> @trunc_qb_256(<4 x i64> %i) #0 { 54 ; KNL-LABEL: trunc_qb_256: 55 ; KNL: ## BB#0: 56 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 57 ; KNL-NEXT: retq 58 ; 59 ; SKX-LABEL: trunc_qb_256: 60 ; SKX: ## BB#0: 61 ; SKX-NEXT: vpmovqd %ymm0, %xmm0 62 ; SKX-NEXT: retq 63 %x = trunc <4 x i64> %i to <4 x i8> 64 ret <4 x i8> %x 65 } 66 67 define void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 { 68 ; KNL-LABEL: trunc_qb_256_mem: 69 ; KNL: ## BB#0: 70 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 71 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 72 ; KNL-NEXT: vmovd %xmm0, (%rdi) 73 ; KNL-NEXT: retq 74 ; 75 ; SKX-LABEL: trunc_qb_256_mem: 76 ; SKX: ## BB#0: 77 ; SKX-NEXT: vpmovqb %ymm0, (%rdi) 78 ; SKX-NEXT: retq 79 %x = trunc <4 x i64> %i to <4 x i8> 80 store <4 x i8> %x, <4 x i8>* %res 81 ret void 82 } 83 84 define <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 { 85 ; ALL-LABEL: trunc_qb_128: 86 ; ALL: ## BB#0: 87 ; ALL-NEXT: retq 88 %x = trunc <2 x i64> %i to <2 x i8> 89 ret <2 x i8> %x 90 } 91 92 define void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 { 93 ; KNL-LABEL: trunc_qb_128_mem: 94 ; KNL: ## BB#0: 95 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 96 ; KNL-NEXT: vmovd %xmm0, %eax 97 ; KNL-NEXT: movw %ax, (%rdi) 98 ; KNL-NEXT: retq 99 ; 100 ; SKX-LABEL: trunc_qb_128_mem: 101 ; SKX: ## BB#0: 102 ; SKX-NEXT: vpmovqb %xmm0, (%rdi) 103 ; SKX-NEXT: retq 104 %x = trunc <2 x i64> %i to <2 x i8> 105 store <2 x i8> %x, <2 x i8>* %res 106 ret void 107 } 108 109 define <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 { 110 ; ALL-LABEL: trunc_qw_512: 111 ; ALL: ## BB#0: 112 ; ALL-NEXT: vpmovqw %zmm0, %xmm0 113 ; ALL-NEXT: retq 114 %x = trunc <8 x i64> %i to <8 x i16> 115 ret <8 x i16> %x 116 } 117 118 define void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 { 119 ; ALL-LABEL: trunc_qw_512_mem: 120 ; ALL: ## BB#0: 121 ; ALL-NEXT: vpmovqw %zmm0, (%rdi) 122 ; ALL-NEXT: retq 123 %x = trunc <8 x i64> %i to <8 x i16> 124 store <8 x i16> %x, <8 x i16>* %res 125 ret void 126 } 127 128 define <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 { 129 ; KNL-LABEL: trunc_qw_256: 130 ; KNL: ## BB#0: 131 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 132 ; KNL-NEXT: retq 133 ; 134 ; SKX-LABEL: trunc_qw_256: 135 ; SKX: ## BB#0: 136 ; SKX-NEXT: vpmovqd %ymm0, %xmm0 137 ; SKX-NEXT: retq 138 %x = trunc <4 x i64> %i to <4 x i16> 139 ret <4 x i16> %x 140 } 141 142 define void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 { 143 ; KNL-LABEL: trunc_qw_256_mem: 144 ; KNL: ## BB#0: 145 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 146 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 147 ; KNL-NEXT: vmovq %xmm0, (%rdi) 148 ; KNL-NEXT: retq 149 ; 150 ; SKX-LABEL: trunc_qw_256_mem: 151 ; SKX: ## BB#0: 152 ; SKX-NEXT: vpmovqw %ymm0, (%rdi) 153 ; SKX-NEXT: retq 154 %x = trunc <4 x i64> %i to <4 x i16> 155 store <4 x i16> %x, <4 x i16>* %res 156 ret void 157 } 158 159 define <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 { 160 ; ALL-LABEL: trunc_qw_128: 161 ; ALL: ## BB#0: 162 ; ALL-NEXT: retq 163 %x = trunc <2 x i64> %i to <2 x i16> 164 ret <2 x i16> %x 165 } 166 167 define void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 { 168 ; KNL-LABEL: trunc_qw_128_mem: 169 ; KNL: ## BB#0: 170 ; KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 171 ; KNL-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 172 ; KNL-NEXT: vmovd %xmm0, (%rdi) 173 ; KNL-NEXT: retq 174 ; 175 ; SKX-LABEL: trunc_qw_128_mem: 176 ; SKX: ## BB#0: 177 ; SKX-NEXT: vpmovqw %xmm0, (%rdi) 178 ; SKX-NEXT: retq 179 %x = trunc <2 x i64> %i to <2 x i16> 180 store <2 x i16> %x, <2 x i16>* %res 181 ret void 182 } 183 184 define <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 { 185 ; ALL-LABEL: trunc_qd_512: 186 ; ALL: ## BB#0: 187 ; ALL-NEXT: vpmovqd %zmm0, %ymm0 188 ; ALL-NEXT: retq 189 %x = trunc <8 x i64> %i to <8 x i32> 190 ret <8 x i32> %x 191 } 192 193 define void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 { 194 ; ALL-LABEL: trunc_qd_512_mem: 195 ; ALL: ## BB#0: 196 ; ALL-NEXT: vpmovqd %zmm0, (%rdi) 197 ; ALL-NEXT: retq 198 %x = trunc <8 x i64> %i to <8 x i32> 199 store <8 x i32> %x, <8 x i32>* %res 200 ret void 201 } 202 203 define <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 { 204 ; KNL-LABEL: trunc_qd_256: 205 ; KNL: ## BB#0: 206 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 207 ; KNL-NEXT: retq 208 ; 209 ; SKX-LABEL: trunc_qd_256: 210 ; SKX: ## BB#0: 211 ; SKX-NEXT: vpmovqd %ymm0, %xmm0 212 ; SKX-NEXT: retq 213 %x = trunc <4 x i64> %i to <4 x i32> 214 ret <4 x i32> %x 215 } 216 217 define void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 { 218 ; KNL-LABEL: trunc_qd_256_mem: 219 ; KNL: ## BB#0: 220 ; KNL-NEXT: vpmovqd %zmm0, %ymm0 221 ; KNL-NEXT: vmovaps %xmm0, (%rdi) 222 ; KNL-NEXT: retq 223 ; 224 ; SKX-LABEL: trunc_qd_256_mem: 225 ; SKX: ## BB#0: 226 ; SKX-NEXT: vpmovqd %ymm0, (%rdi) 227 ; SKX-NEXT: retq 228 %x = trunc <4 x i64> %i to <4 x i32> 229 store <4 x i32> %x, <4 x i32>* %res 230 ret void 231 } 232 233 define <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 { 234 ; ALL-LABEL: trunc_qd_128: 235 ; ALL: ## BB#0: 236 ; ALL-NEXT: retq 237 %x = trunc <2 x i64> %i to <2 x i32> 238 ret <2 x i32> %x 239 } 240 241 define void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 { 242 ; KNL-LABEL: trunc_qd_128_mem: 243 ; KNL: ## BB#0: 244 ; KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 245 ; KNL-NEXT: vmovq %xmm0, (%rdi) 246 ; KNL-NEXT: retq 247 ; 248 ; SKX-LABEL: trunc_qd_128_mem: 249 ; SKX: ## BB#0: 250 ; SKX-NEXT: vpmovqd %xmm0, (%rdi) 251 ; SKX-NEXT: retq 252 %x = trunc <2 x i64> %i to <2 x i32> 253 store <2 x i32> %x, <2 x i32>* %res 254 ret void 255 } 256 257 define <16 x i8> @trunc_db_512(<16 x i32> %i) #0 { 258 ; ALL-LABEL: trunc_db_512: 259 ; ALL: ## BB#0: 260 ; ALL-NEXT: vpmovdb %zmm0, %xmm0 261 ; ALL-NEXT: retq 262 %x = trunc <16 x i32> %i to <16 x i8> 263 ret <16 x i8> %x 264 } 265 266 define void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 { 267 ; ALL-LABEL: trunc_db_512_mem: 268 ; ALL: ## BB#0: 269 ; ALL-NEXT: vpmovdb %zmm0, (%rdi) 270 ; ALL-NEXT: retq 271 %x = trunc <16 x i32> %i to <16 x i8> 272 store <16 x i8> %x, <16 x i8>* %res 273 ret void 274 } 275 276 define <8 x i8> @trunc_db_256(<8 x i32> %i) #0 { 277 ; KNL-LABEL: trunc_db_256: 278 ; KNL: ## BB#0: 279 ; KNL-NEXT: vpmovdw %zmm0, %ymm0 280 ; KNL-NEXT: retq 281 ; 282 ; SKX-LABEL: trunc_db_256: 283 ; SKX: ## BB#0: 284 ; SKX-NEXT: vpmovdw %ymm0, %xmm0 285 ; SKX-NEXT: retq 286 %x = trunc <8 x i32> %i to <8 x i8> 287 ret <8 x i8> %x 288 } 289 290 define void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 { 291 ; KNL-LABEL: trunc_db_256_mem: 292 ; KNL: ## BB#0: 293 ; KNL-NEXT: vpmovdw %zmm0, %ymm0 294 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 295 ; KNL-NEXT: vmovq %xmm0, (%rdi) 296 ; KNL-NEXT: retq 297 ; 298 ; SKX-LABEL: trunc_db_256_mem: 299 ; SKX: ## BB#0: 300 ; SKX-NEXT: vpmovdb %ymm0, (%rdi) 301 ; SKX-NEXT: retq 302 %x = trunc <8 x i32> %i to <8 x i8> 303 store <8 x i8> %x, <8 x i8>* %res 304 ret void 305 } 306 307 define <4 x i8> @trunc_db_128(<4 x i32> %i) #0 { 308 ; ALL-LABEL: trunc_db_128: 309 ; ALL: ## BB#0: 310 ; ALL-NEXT: retq 311 %x = trunc <4 x i32> %i to <4 x i8> 312 ret <4 x i8> %x 313 } 314 315 define void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 { 316 ; KNL-LABEL: trunc_db_128_mem: 317 ; KNL: ## BB#0: 318 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 319 ; KNL-NEXT: vmovd %xmm0, (%rdi) 320 ; KNL-NEXT: retq 321 ; 322 ; SKX-LABEL: trunc_db_128_mem: 323 ; SKX: ## BB#0: 324 ; SKX-NEXT: vpmovdb %xmm0, (%rdi) 325 ; SKX-NEXT: retq 326 %x = trunc <4 x i32> %i to <4 x i8> 327 store <4 x i8> %x, <4 x i8>* %res 328 ret void 329 } 330 331 define <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 { 332 ; ALL-LABEL: trunc_dw_512: 333 ; ALL: ## BB#0: 334 ; ALL-NEXT: vpmovdw %zmm0, %ymm0 335 ; ALL-NEXT: retq 336 %x = trunc <16 x i32> %i to <16 x i16> 337 ret <16 x i16> %x 338 } 339 340 define void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 { 341 ; ALL-LABEL: trunc_dw_512_mem: 342 ; ALL: ## BB#0: 343 ; ALL-NEXT: vpmovdw %zmm0, (%rdi) 344 ; ALL-NEXT: retq 345 %x = trunc <16 x i32> %i to <16 x i16> 346 store <16 x i16> %x, <16 x i16>* %res 347 ret void 348 } 349 350 define <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 { 351 ; KNL-LABEL: trunc_dw_256: 352 ; KNL: ## BB#0: 353 ; KNL-NEXT: vpmovdw %zmm0, %ymm0 354 ; KNL-NEXT: retq 355 ; 356 ; SKX-LABEL: trunc_dw_256: 357 ; SKX: ## BB#0: 358 ; SKX-NEXT: vpmovdw %ymm0, %xmm0 359 ; SKX-NEXT: retq 360 %x = trunc <8 x i32> %i to <8 x i16> 361 ret <8 x i16> %x 362 } 363 364 define void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 { 365 ; KNL-LABEL: trunc_dw_256_mem: 366 ; KNL: ## BB#0: 367 ; KNL-NEXT: vpmovdw %zmm0, %ymm0 368 ; KNL-NEXT: vmovaps %xmm0, (%rdi) 369 ; KNL-NEXT: retq 370 ; 371 ; SKX-LABEL: trunc_dw_256_mem: 372 ; SKX: ## BB#0: 373 ; SKX-NEXT: vpmovdw %ymm0, (%rdi) 374 ; SKX-NEXT: retq 375 %x = trunc <8 x i32> %i to <8 x i16> 376 store <8 x i16> %x, <8 x i16>* %res 377 ret void 378 } 379 380 define void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 { 381 ; KNL-LABEL: trunc_dw_128_mem: 382 ; KNL: ## BB#0: 383 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 384 ; KNL-NEXT: vmovq %xmm0, (%rdi) 385 ; KNL-NEXT: retq 386 ; 387 ; SKX-LABEL: trunc_dw_128_mem: 388 ; SKX: ## BB#0: 389 ; SKX-NEXT: vpmovdw %xmm0, (%rdi) 390 ; SKX-NEXT: retq 391 %x = trunc <4 x i32> %i to <4 x i16> 392 store <4 x i16> %x, <4 x i16>* %res 393 ret void 394 } 395 396 define <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 { 397 ; KNL-LABEL: trunc_wb_512: 398 ; KNL: ## BB#0: 399 ; KNL-NEXT: vpmovsxwd %ymm0, %zmm0 400 ; KNL-NEXT: vpmovdb %zmm0, %xmm0 401 ; KNL-NEXT: vpmovsxwd %ymm1, %zmm1 402 ; KNL-NEXT: vpmovdb %zmm1, %xmm1 403 ; KNL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 404 ; KNL-NEXT: retq 405 ; 406 ; SKX-LABEL: trunc_wb_512: 407 ; SKX: ## BB#0: 408 ; SKX-NEXT: vpmovwb %zmm0, %ymm0 409 ; SKX-NEXT: retq 410 %x = trunc <32 x i16> %i to <32 x i8> 411 ret <32 x i8> %x 412 } 413 414 define void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 { 415 ; KNL-LABEL: trunc_wb_512_mem: 416 ; KNL: ## BB#0: 417 ; KNL-NEXT: vpmovsxwd %ymm0, %zmm0 418 ; KNL-NEXT: vpmovdb %zmm0, %xmm0 419 ; KNL-NEXT: vpmovsxwd %ymm1, %zmm1 420 ; KNL-NEXT: vpmovdb %zmm1, %xmm1 421 ; KNL-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 422 ; KNL-NEXT: vmovaps %ymm0, (%rdi) 423 ; KNL-NEXT: retq 424 ; 425 ; SKX-LABEL: trunc_wb_512_mem: 426 ; SKX: ## BB#0: 427 ; SKX-NEXT: vpmovwb %zmm0, (%rdi) 428 ; SKX-NEXT: retq 429 %x = trunc <32 x i16> %i to <32 x i8> 430 store <32 x i8> %x, <32 x i8>* %res 431 ret void 432 } 433 434 define <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 { 435 ; KNL-LABEL: trunc_wb_256: 436 ; KNL: ## BB#0: 437 ; KNL-NEXT: vpmovsxwd %ymm0, %zmm0 438 ; KNL-NEXT: vpmovdb %zmm0, %xmm0 439 ; KNL-NEXT: retq 440 ; 441 ; SKX-LABEL: trunc_wb_256: 442 ; SKX: ## BB#0: 443 ; SKX-NEXT: vpmovwb %ymm0, %xmm0 444 ; SKX-NEXT: retq 445 %x = trunc <16 x i16> %i to <16 x i8> 446 ret <16 x i8> %x 447 } 448 449 define void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 { 450 ; KNL-LABEL: trunc_wb_256_mem: 451 ; KNL: ## BB#0: 452 ; KNL-NEXT: vpmovsxwd %ymm0, %zmm0 453 ; KNL-NEXT: vpmovdb %zmm0, %xmm0 454 ; KNL-NEXT: vmovaps %xmm0, (%rdi) 455 ; KNL-NEXT: retq 456 ; 457 ; SKX-LABEL: trunc_wb_256_mem: 458 ; SKX: ## BB#0: 459 ; SKX-NEXT: vpmovwb %ymm0, (%rdi) 460 ; SKX-NEXT: retq 461 %x = trunc <16 x i16> %i to <16 x i8> 462 store <16 x i8> %x, <16 x i8>* %res 463 ret void 464 } 465 466 define <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 { 467 ; ALL-LABEL: trunc_wb_128: 468 ; ALL: ## BB#0: 469 ; ALL-NEXT: retq 470 %x = trunc <8 x i16> %i to <8 x i8> 471 ret <8 x i8> %x 472 } 473 474 define void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 { 475 ; KNL-LABEL: trunc_wb_128_mem: 476 ; KNL: ## BB#0: 477 ; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 478 ; KNL-NEXT: vmovq %xmm0, (%rdi) 479 ; KNL-NEXT: retq 480 ; 481 ; SKX-LABEL: trunc_wb_128_mem: 482 ; SKX: ## BB#0: 483 ; SKX-NEXT: vpmovwb %xmm0, (%rdi) 484 ; SKX-NEXT: retq 485 %x = trunc <8 x i16> %i to <8 x i8> 486 store <8 x i8> %x, <8 x i8>* %res 487 ret void 488 } 489