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