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,+avx512vl,+avx512bw,+avx512dq,+fast-variable-shuffle | FileCheck %s --check-prefixes=ALL,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: vzeroupper 12; ALL-NEXT: retq 13 %x = trunc <16 x i32> %i to <16 x i8> 14 ret <16 x i8> %x 15} 16 17define <8 x i16> @trunc_8x64_to_8x16(<8 x i64> %i) #0 { 18; ALL-LABEL: trunc_8x64_to_8x16: 19; ALL: ## %bb.0: 20; ALL-NEXT: vpmovqw %zmm0, %xmm0 21; ALL-NEXT: vzeroupper 22; ALL-NEXT: retq 23 %x = trunc <8 x i64> %i to <8 x i16> 24 ret <8 x i16> %x 25} 26 27define <16 x i16> @trunc_v16i32_to_v16i16(<16 x i32> %x) #0 { 28; ALL-LABEL: trunc_v16i32_to_v16i16: 29; ALL: ## %bb.0: 30; ALL-NEXT: vpmovdw %zmm0, %ymm0 31; ALL-NEXT: retq 32 %1 = trunc <16 x i32> %x to <16 x i16> 33 ret <16 x i16> %1 34} 35 36define <8 x i8> @trunc_qb_512(<8 x i64> %i) #0 { 37; ALL-LABEL: trunc_qb_512: 38; ALL: ## %bb.0: 39; ALL-NEXT: vpmovqb %zmm0, %xmm0 40; ALL-NEXT: vzeroupper 41; ALL-NEXT: retq 42 %x = trunc <8 x i64> %i to <8 x i8> 43 ret <8 x i8> %x 44} 45 46define void @trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) #0 { 47; ALL-LABEL: trunc_qb_512_mem: 48; ALL: ## %bb.0: 49; ALL-NEXT: vpmovqb %zmm0, (%rdi) 50; ALL-NEXT: vzeroupper 51; ALL-NEXT: retq 52 %x = trunc <8 x i64> %i to <8 x i8> 53 store <8 x i8> %x, <8 x i8>* %res 54 ret void 55} 56 57define <4 x i8> @trunc_qb_256(<4 x i64> %i) #0 { 58; KNL-LABEL: trunc_qb_256: 59; KNL: ## %bb.0: 60; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 61; KNL-NEXT: vpmovqb %zmm0, %xmm0 62; KNL-NEXT: vzeroupper 63; KNL-NEXT: retq 64; 65; SKX-LABEL: trunc_qb_256: 66; SKX: ## %bb.0: 67; SKX-NEXT: vpmovqb %ymm0, %xmm0 68; SKX-NEXT: vzeroupper 69; SKX-NEXT: retq 70 %x = trunc <4 x i64> %i to <4 x i8> 71 ret <4 x i8> %x 72} 73 74define void @trunc_qb_256_mem(<4 x i64> %i, <4 x i8>* %res) #0 { 75; KNL-LABEL: trunc_qb_256_mem: 76; KNL: ## %bb.0: 77; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 78; KNL-NEXT: vpmovqb %zmm0, %xmm0 79; KNL-NEXT: vmovd %xmm0, (%rdi) 80; KNL-NEXT: vzeroupper 81; KNL-NEXT: retq 82; 83; SKX-LABEL: trunc_qb_256_mem: 84; SKX: ## %bb.0: 85; SKX-NEXT: vpmovqb %ymm0, (%rdi) 86; SKX-NEXT: vzeroupper 87; SKX-NEXT: retq 88 %x = trunc <4 x i64> %i to <4 x i8> 89 store <4 x i8> %x, <4 x i8>* %res 90 ret void 91} 92 93define <2 x i8> @trunc_qb_128(<2 x i64> %i) #0 { 94; KNL-LABEL: trunc_qb_128: 95; KNL: ## %bb.0: 96; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 97; KNL-NEXT: retq 98; 99; SKX-LABEL: trunc_qb_128: 100; SKX: ## %bb.0: 101; SKX-NEXT: vpmovqb %xmm0, %xmm0 102; SKX-NEXT: retq 103 %x = trunc <2 x i64> %i to <2 x i8> 104 ret <2 x i8> %x 105} 106 107define void @trunc_qb_128_mem(<2 x i64> %i, <2 x i8>* %res) #0 { 108; KNL-LABEL: trunc_qb_128_mem: 109; KNL: ## %bb.0: 110; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 111; KNL-NEXT: vpextrw $0, %xmm0, (%rdi) 112; KNL-NEXT: retq 113; 114; SKX-LABEL: trunc_qb_128_mem: 115; SKX: ## %bb.0: 116; SKX-NEXT: vpmovqb %xmm0, (%rdi) 117; SKX-NEXT: retq 118 %x = trunc <2 x i64> %i to <2 x i8> 119 store <2 x i8> %x, <2 x i8>* %res 120 ret void 121} 122 123define <8 x i16> @trunc_qw_512(<8 x i64> %i) #0 { 124; ALL-LABEL: trunc_qw_512: 125; ALL: ## %bb.0: 126; ALL-NEXT: vpmovqw %zmm0, %xmm0 127; ALL-NEXT: vzeroupper 128; ALL-NEXT: retq 129 %x = trunc <8 x i64> %i to <8 x i16> 130 ret <8 x i16> %x 131} 132 133define void @trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) #0 { 134; ALL-LABEL: trunc_qw_512_mem: 135; ALL: ## %bb.0: 136; ALL-NEXT: vpmovqw %zmm0, (%rdi) 137; ALL-NEXT: vzeroupper 138; ALL-NEXT: retq 139 %x = trunc <8 x i64> %i to <8 x i16> 140 store <8 x i16> %x, <8 x i16>* %res 141 ret void 142} 143 144define <4 x i16> @trunc_qw_256(<4 x i64> %i) #0 { 145; KNL-LABEL: trunc_qw_256: 146; KNL: ## %bb.0: 147; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 148; KNL-NEXT: vpmovqw %zmm0, %xmm0 149; KNL-NEXT: vzeroupper 150; KNL-NEXT: retq 151; 152; SKX-LABEL: trunc_qw_256: 153; SKX: ## %bb.0: 154; SKX-NEXT: vpmovqw %ymm0, %xmm0 155; SKX-NEXT: vzeroupper 156; SKX-NEXT: retq 157 %x = trunc <4 x i64> %i to <4 x i16> 158 ret <4 x i16> %x 159} 160 161define void @trunc_qw_256_mem(<4 x i64> %i, <4 x i16>* %res) #0 { 162; KNL-LABEL: trunc_qw_256_mem: 163; KNL: ## %bb.0: 164; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 165; KNL-NEXT: vpmovqw %zmm0, %xmm0 166; KNL-NEXT: vmovq %xmm0, (%rdi) 167; KNL-NEXT: vzeroupper 168; KNL-NEXT: retq 169; 170; SKX-LABEL: trunc_qw_256_mem: 171; SKX: ## %bb.0: 172; SKX-NEXT: vpmovqw %ymm0, (%rdi) 173; SKX-NEXT: vzeroupper 174; SKX-NEXT: retq 175 %x = trunc <4 x i64> %i to <4 x i16> 176 store <4 x i16> %x, <4 x i16>* %res 177 ret void 178} 179 180define <2 x i16> @trunc_qw_128(<2 x i64> %i) #0 { 181; KNL-LABEL: trunc_qw_128: 182; KNL: ## %bb.0: 183; KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 184; KNL-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 185; KNL-NEXT: retq 186; 187; SKX-LABEL: trunc_qw_128: 188; SKX: ## %bb.0: 189; SKX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,8,9,8,9,10,11,8,9,10,11,12,13,14,15] 190; SKX-NEXT: retq 191 %x = trunc <2 x i64> %i to <2 x i16> 192 ret <2 x i16> %x 193} 194 195define void @trunc_qw_128_mem(<2 x i64> %i, <2 x i16>* %res) #0 { 196; KNL-LABEL: trunc_qw_128_mem: 197; KNL: ## %bb.0: 198; KNL-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 199; KNL-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 200; KNL-NEXT: vmovd %xmm0, (%rdi) 201; KNL-NEXT: retq 202; 203; SKX-LABEL: trunc_qw_128_mem: 204; SKX: ## %bb.0: 205; SKX-NEXT: vpmovqw %xmm0, (%rdi) 206; SKX-NEXT: retq 207 %x = trunc <2 x i64> %i to <2 x i16> 208 store <2 x i16> %x, <2 x i16>* %res 209 ret void 210} 211 212define <8 x i32> @trunc_qd_512(<8 x i64> %i) #0 { 213; ALL-LABEL: trunc_qd_512: 214; ALL: ## %bb.0: 215; ALL-NEXT: vpmovqd %zmm0, %ymm0 216; ALL-NEXT: retq 217 %x = trunc <8 x i64> %i to <8 x i32> 218 ret <8 x i32> %x 219} 220 221define void @trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) #0 { 222; ALL-LABEL: trunc_qd_512_mem: 223; ALL: ## %bb.0: 224; ALL-NEXT: vpmovqd %zmm0, (%rdi) 225; ALL-NEXT: vzeroupper 226; ALL-NEXT: retq 227 %x = trunc <8 x i64> %i to <8 x i32> 228 store <8 x i32> %x, <8 x i32>* %res 229 ret void 230} 231 232define <4 x i32> @trunc_qd_256(<4 x i64> %i) #0 { 233; KNL-LABEL: trunc_qd_256: 234; KNL: ## %bb.0: 235; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 236; KNL-NEXT: vpmovqd %zmm0, %ymm0 237; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 killed $ymm0 238; KNL-NEXT: vzeroupper 239; KNL-NEXT: retq 240; 241; SKX-LABEL: trunc_qd_256: 242; SKX: ## %bb.0: 243; SKX-NEXT: vpmovqd %ymm0, %xmm0 244; SKX-NEXT: vzeroupper 245; SKX-NEXT: retq 246 %x = trunc <4 x i64> %i to <4 x i32> 247 ret <4 x i32> %x 248} 249 250define void @trunc_qd_256_mem(<4 x i64> %i, <4 x i32>* %res) #0 { 251; KNL-LABEL: trunc_qd_256_mem: 252; KNL: ## %bb.0: 253; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 254; KNL-NEXT: vpmovqd %zmm0, %ymm0 255; KNL-NEXT: vmovdqa %xmm0, (%rdi) 256; KNL-NEXT: vzeroupper 257; KNL-NEXT: retq 258; 259; SKX-LABEL: trunc_qd_256_mem: 260; SKX: ## %bb.0: 261; SKX-NEXT: vpmovqd %ymm0, (%rdi) 262; SKX-NEXT: vzeroupper 263; SKX-NEXT: retq 264 %x = trunc <4 x i64> %i to <4 x i32> 265 store <4 x i32> %x, <4 x i32>* %res 266 ret void 267} 268 269define <2 x i32> @trunc_qd_128(<2 x i64> %i) #0 { 270; ALL-LABEL: trunc_qd_128: 271; ALL: ## %bb.0: 272; ALL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 273; ALL-NEXT: retq 274 %x = trunc <2 x i64> %i to <2 x i32> 275 ret <2 x i32> %x 276} 277 278define void @trunc_qd_128_mem(<2 x i64> %i, <2 x i32>* %res) #0 { 279; KNL-LABEL: trunc_qd_128_mem: 280; KNL: ## %bb.0: 281; KNL-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 282; KNL-NEXT: vmovlps %xmm0, (%rdi) 283; KNL-NEXT: retq 284; 285; SKX-LABEL: trunc_qd_128_mem: 286; SKX: ## %bb.0: 287; SKX-NEXT: vpmovqd %xmm0, (%rdi) 288; SKX-NEXT: retq 289 %x = trunc <2 x i64> %i to <2 x i32> 290 store <2 x i32> %x, <2 x i32>* %res 291 ret void 292} 293 294define <16 x i8> @trunc_db_512(<16 x i32> %i) #0 { 295; ALL-LABEL: trunc_db_512: 296; ALL: ## %bb.0: 297; ALL-NEXT: vpmovdb %zmm0, %xmm0 298; ALL-NEXT: vzeroupper 299; ALL-NEXT: retq 300 %x = trunc <16 x i32> %i to <16 x i8> 301 ret <16 x i8> %x 302} 303 304define void @trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) #0 { 305; ALL-LABEL: trunc_db_512_mem: 306; ALL: ## %bb.0: 307; ALL-NEXT: vpmovdb %zmm0, (%rdi) 308; ALL-NEXT: vzeroupper 309; ALL-NEXT: retq 310 %x = trunc <16 x i32> %i to <16 x i8> 311 store <16 x i8> %x, <16 x i8>* %res 312 ret void 313} 314 315define <8 x i8> @trunc_db_256(<8 x i32> %i) #0 { 316; KNL-LABEL: trunc_db_256: 317; KNL: ## %bb.0: 318; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 319; KNL-NEXT: vpmovdb %zmm0, %xmm0 320; KNL-NEXT: vzeroupper 321; KNL-NEXT: retq 322; 323; SKX-LABEL: trunc_db_256: 324; SKX: ## %bb.0: 325; SKX-NEXT: vpmovdb %ymm0, %xmm0 326; SKX-NEXT: vzeroupper 327; SKX-NEXT: retq 328 %x = trunc <8 x i32> %i to <8 x i8> 329 ret <8 x i8> %x 330} 331 332define void @trunc_db_256_mem(<8 x i32> %i, <8 x i8>* %res) #0 { 333; KNL-LABEL: trunc_db_256_mem: 334; KNL: ## %bb.0: 335; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 336; KNL-NEXT: vpmovdb %zmm0, %xmm0 337; KNL-NEXT: vmovq %xmm0, (%rdi) 338; KNL-NEXT: vzeroupper 339; KNL-NEXT: retq 340; 341; SKX-LABEL: trunc_db_256_mem: 342; SKX: ## %bb.0: 343; SKX-NEXT: vpmovdb %ymm0, (%rdi) 344; SKX-NEXT: vzeroupper 345; SKX-NEXT: retq 346 %x = trunc <8 x i32> %i to <8 x i8> 347 store <8 x i8> %x, <8 x i8>* %res 348 ret void 349} 350 351define <4 x i8> @trunc_db_128(<4 x i32> %i) #0 { 352; KNL-LABEL: trunc_db_128: 353; KNL: ## %bb.0: 354; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 355; KNL-NEXT: retq 356; 357; SKX-LABEL: trunc_db_128: 358; SKX: ## %bb.0: 359; SKX-NEXT: vpmovdb %xmm0, %xmm0 360; SKX-NEXT: retq 361 %x = trunc <4 x i32> %i to <4 x i8> 362 ret <4 x i8> %x 363} 364 365define void @trunc_db_128_mem(<4 x i32> %i, <4 x i8>* %res) #0 { 366; KNL-LABEL: trunc_db_128_mem: 367; KNL: ## %bb.0: 368; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 369; KNL-NEXT: vmovd %xmm0, (%rdi) 370; KNL-NEXT: retq 371; 372; SKX-LABEL: trunc_db_128_mem: 373; SKX: ## %bb.0: 374; SKX-NEXT: vpmovdb %xmm0, (%rdi) 375; SKX-NEXT: retq 376 %x = trunc <4 x i32> %i to <4 x i8> 377 store <4 x i8> %x, <4 x i8>* %res 378 ret void 379} 380 381define <16 x i16> @trunc_dw_512(<16 x i32> %i) #0 { 382; ALL-LABEL: trunc_dw_512: 383; ALL: ## %bb.0: 384; ALL-NEXT: vpmovdw %zmm0, %ymm0 385; ALL-NEXT: retq 386 %x = trunc <16 x i32> %i to <16 x i16> 387 ret <16 x i16> %x 388} 389 390define void @trunc_dw_512_mem(<16 x i32> %i, <16 x i16>* %res) #0 { 391; ALL-LABEL: trunc_dw_512_mem: 392; ALL: ## %bb.0: 393; ALL-NEXT: vpmovdw %zmm0, (%rdi) 394; ALL-NEXT: vzeroupper 395; ALL-NEXT: retq 396 %x = trunc <16 x i32> %i to <16 x i16> 397 store <16 x i16> %x, <16 x i16>* %res 398 ret void 399} 400 401define <8 x i16> @trunc_dw_256(<8 x i32> %i) #0 { 402; KNL-LABEL: trunc_dw_256: 403; KNL: ## %bb.0: 404; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 405; KNL-NEXT: vpmovdw %zmm0, %ymm0 406; KNL-NEXT: ## kill: def $xmm0 killed $xmm0 killed $ymm0 407; KNL-NEXT: vzeroupper 408; KNL-NEXT: retq 409; 410; SKX-LABEL: trunc_dw_256: 411; SKX: ## %bb.0: 412; SKX-NEXT: vpmovdw %ymm0, %xmm0 413; SKX-NEXT: vzeroupper 414; SKX-NEXT: retq 415 %x = trunc <8 x i32> %i to <8 x i16> 416 ret <8 x i16> %x 417} 418 419define void @trunc_dw_256_mem(<8 x i32> %i, <8 x i16>* %res) #0 { 420; KNL-LABEL: trunc_dw_256_mem: 421; KNL: ## %bb.0: 422; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 423; KNL-NEXT: vpmovdw %zmm0, %ymm0 424; KNL-NEXT: vmovdqa %xmm0, (%rdi) 425; KNL-NEXT: vzeroupper 426; KNL-NEXT: retq 427; 428; SKX-LABEL: trunc_dw_256_mem: 429; SKX: ## %bb.0: 430; SKX-NEXT: vpmovdw %ymm0, (%rdi) 431; SKX-NEXT: vzeroupper 432; SKX-NEXT: retq 433 %x = trunc <8 x i32> %i to <8 x i16> 434 store <8 x i16> %x, <8 x i16>* %res 435 ret void 436} 437 438define void @trunc_dw_128_mem(<4 x i32> %i, <4 x i16>* %res) #0 { 439; KNL-LABEL: trunc_dw_128_mem: 440; KNL: ## %bb.0: 441; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u] 442; KNL-NEXT: vmovq %xmm0, (%rdi) 443; KNL-NEXT: retq 444; 445; SKX-LABEL: trunc_dw_128_mem: 446; SKX: ## %bb.0: 447; SKX-NEXT: vpmovdw %xmm0, (%rdi) 448; SKX-NEXT: retq 449 %x = trunc <4 x i32> %i to <4 x i16> 450 store <4 x i16> %x, <4 x i16>* %res 451 ret void 452} 453 454define <32 x i8> @trunc_wb_512(<32 x i16> %i) #0 { 455; KNL-LABEL: trunc_wb_512: 456; KNL: ## %bb.0: 457; KNL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 458; KNL-NEXT: vpmovdb %zmm1, %xmm1 459; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm0 460; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 461; KNL-NEXT: vpmovdb %zmm0, %xmm0 462; KNL-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 463; KNL-NEXT: retq 464; 465; SKX-LABEL: trunc_wb_512: 466; SKX: ## %bb.0: 467; SKX-NEXT: vpmovwb %zmm0, %ymm0 468; SKX-NEXT: retq 469 %x = trunc <32 x i16> %i to <32 x i8> 470 ret <32 x i8> %x 471} 472 473define void @trunc_wb_512_mem(<32 x i16> %i, <32 x i8>* %res) #0 { 474; KNL-LABEL: trunc_wb_512_mem: 475; KNL: ## %bb.0: 476; KNL-NEXT: vextracti64x4 $1, %zmm0, %ymm1 477; KNL-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero 478; KNL-NEXT: vpmovdb %zmm1, 16(%rdi) 479; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 480; KNL-NEXT: vpmovdb %zmm0, (%rdi) 481; KNL-NEXT: vzeroupper 482; KNL-NEXT: retq 483; 484; SKX-LABEL: trunc_wb_512_mem: 485; SKX: ## %bb.0: 486; SKX-NEXT: vpmovwb %zmm0, (%rdi) 487; SKX-NEXT: vzeroupper 488; SKX-NEXT: retq 489 %x = trunc <32 x i16> %i to <32 x i8> 490 store <32 x i8> %x, <32 x i8>* %res 491 ret void 492} 493 494define <16 x i8> @trunc_wb_256(<16 x i16> %i) #0 { 495; KNL-LABEL: trunc_wb_256: 496; KNL: ## %bb.0: 497; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 498; KNL-NEXT: vpmovdb %zmm0, %xmm0 499; KNL-NEXT: vzeroupper 500; KNL-NEXT: retq 501; 502; SKX-LABEL: trunc_wb_256: 503; SKX: ## %bb.0: 504; SKX-NEXT: vpmovwb %ymm0, %xmm0 505; SKX-NEXT: vzeroupper 506; SKX-NEXT: retq 507 %x = trunc <16 x i16> %i to <16 x i8> 508 ret <16 x i8> %x 509} 510 511define void @trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) #0 { 512; KNL-LABEL: trunc_wb_256_mem: 513; KNL: ## %bb.0: 514; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 515; KNL-NEXT: vpmovdb %zmm0, (%rdi) 516; KNL-NEXT: vzeroupper 517; KNL-NEXT: retq 518; 519; SKX-LABEL: trunc_wb_256_mem: 520; SKX: ## %bb.0: 521; SKX-NEXT: vpmovwb %ymm0, (%rdi) 522; SKX-NEXT: vzeroupper 523; SKX-NEXT: retq 524 %x = trunc <16 x i16> %i to <16 x i8> 525 store <16 x i8> %x, <16 x i8>* %res 526 ret void 527} 528 529define <16 x i8> @trunc_wb_256_mem_and_ret(<16 x i16> %i, <16 x i8>* %res) #0 { 530; KNL-LABEL: trunc_wb_256_mem_and_ret: 531; KNL: ## %bb.0: 532; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 533; KNL-NEXT: vpmovdb %zmm0, %xmm0 534; KNL-NEXT: vmovdqa %xmm0, (%rdi) 535; KNL-NEXT: vzeroupper 536; KNL-NEXT: retq 537; 538; SKX-LABEL: trunc_wb_256_mem_and_ret: 539; SKX: ## %bb.0: 540; SKX-NEXT: vpmovwb %ymm0, %xmm0 541; SKX-NEXT: vmovdqa %xmm0, (%rdi) 542; SKX-NEXT: vzeroupper 543; SKX-NEXT: retq 544 %x = trunc <16 x i16> %i to <16 x i8> 545 store <16 x i8> %x, <16 x i8>* %res 546 ret <16 x i8> %x 547} 548 549define <8 x i8> @trunc_wb_128(<8 x i16> %i) #0 { 550; KNL-LABEL: trunc_wb_128: 551; KNL: ## %bb.0: 552; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 553; KNL-NEXT: retq 554; 555; SKX-LABEL: trunc_wb_128: 556; SKX: ## %bb.0: 557; SKX-NEXT: vpmovwb %xmm0, %xmm0 558; SKX-NEXT: retq 559 %x = trunc <8 x i16> %i to <8 x i8> 560 ret <8 x i8> %x 561} 562 563define void @trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) #0 { 564; KNL-LABEL: trunc_wb_128_mem: 565; KNL: ## %bb.0: 566; KNL-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 567; KNL-NEXT: vmovq %xmm0, (%rdi) 568; KNL-NEXT: retq 569; 570; SKX-LABEL: trunc_wb_128_mem: 571; SKX: ## %bb.0: 572; SKX-NEXT: vpmovwb %xmm0, (%rdi) 573; SKX-NEXT: retq 574 %x = trunc <8 x i16> %i to <8 x i8> 575 store <8 x i8> %x, <8 x i8>* %res 576 ret void 577} 578 579 580define void @usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) { 581; KNL-LABEL: usat_trunc_wb_256_mem: 582; KNL: ## %bb.0: 583; KNL-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 584; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 585; KNL-NEXT: vpmovdb %zmm0, (%rdi) 586; KNL-NEXT: vzeroupper 587; KNL-NEXT: retq 588; 589; SKX-LABEL: usat_trunc_wb_256_mem: 590; SKX: ## %bb.0: 591; SKX-NEXT: vpmovuswb %ymm0, (%rdi) 592; SKX-NEXT: vzeroupper 593; SKX-NEXT: retq 594 %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 595 %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 596 %x6 = trunc <16 x i16> %x5 to <16 x i8> 597 store <16 x i8> %x6, <16 x i8>* %res, align 1 598 ret void 599} 600 601define <16 x i8> @usat_trunc_wb_256(<16 x i16> %i) { 602; KNL-LABEL: usat_trunc_wb_256: 603; KNL: ## %bb.0: 604; KNL-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 605; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 606; KNL-NEXT: vpmovdb %zmm0, %xmm0 607; KNL-NEXT: vzeroupper 608; KNL-NEXT: retq 609; 610; SKX-LABEL: usat_trunc_wb_256: 611; SKX: ## %bb.0: 612; SKX-NEXT: vpmovuswb %ymm0, %xmm0 613; SKX-NEXT: vzeroupper 614; SKX-NEXT: retq 615 %x3 = icmp ult <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 616 %x5 = select <16 x i1> %x3, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 617 %x6 = trunc <16 x i16> %x5 to <16 x i8> 618 ret <16 x i8> %x6 619} 620 621define void @usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) { 622; KNL-LABEL: usat_trunc_wb_128_mem: 623; KNL: ## %bb.0: 624; KNL-NEXT: vpminuw {{.*}}(%rip), %xmm0, %xmm0 625; KNL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 626; KNL-NEXT: vmovq %xmm0, (%rdi) 627; KNL-NEXT: retq 628; 629; SKX-LABEL: usat_trunc_wb_128_mem: 630; SKX: ## %bb.0: 631; SKX-NEXT: vpmovuswb %xmm0, (%rdi) 632; SKX-NEXT: retq 633 %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 634 %x5 = select <8 x i1> %x3, <8 x i16> %i, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 635 %x6 = trunc <8 x i16> %x5 to <8 x i8> 636 store <8 x i8> %x6, <8 x i8>* %res, align 1 637 ret void 638} 639 640define void @usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) { 641; ALL-LABEL: usat_trunc_db_512_mem: 642; ALL: ## %bb.0: 643; ALL-NEXT: vpmovusdb %zmm0, (%rdi) 644; ALL-NEXT: vzeroupper 645; ALL-NEXT: retq 646 %x3 = icmp ult <16 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 647 %x5 = select <16 x i1> %x3, <16 x i32> %i, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 648 %x6 = trunc <16 x i32> %x5 to <16 x i8> 649 store <16 x i8> %x6, <16 x i8>* %res, align 1 650 ret void 651} 652 653define void @usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) { 654; ALL-LABEL: usat_trunc_qb_512_mem: 655; ALL: ## %bb.0: 656; ALL-NEXT: vpmovusqb %zmm0, (%rdi) 657; ALL-NEXT: vzeroupper 658; ALL-NEXT: retq 659 %x3 = icmp ult <8 x i64> %i, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 660 %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 661 %x6 = trunc <8 x i64> %x5 to <8 x i8> 662 store <8 x i8> %x6, <8 x i8>* %res, align 1 663 ret void 664} 665 666define void @usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) { 667; ALL-LABEL: usat_trunc_qd_512_mem: 668; ALL: ## %bb.0: 669; ALL-NEXT: vpmovusqd %zmm0, (%rdi) 670; ALL-NEXT: vzeroupper 671; ALL-NEXT: retq 672 %x3 = icmp ult <8 x i64> %i, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 673 %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 674 %x6 = trunc <8 x i64> %x5 to <8 x i32> 675 store <8 x i32> %x6, <8 x i32>* %res, align 1 676 ret void 677} 678 679define void @usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) { 680; ALL-LABEL: usat_trunc_qw_512_mem: 681; ALL: ## %bb.0: 682; ALL-NEXT: vpmovusqw %zmm0, (%rdi) 683; ALL-NEXT: vzeroupper 684; ALL-NEXT: retq 685 %x3 = icmp ult <8 x i64> %i, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 686 %x5 = select <8 x i1> %x3, <8 x i64> %i, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 687 %x6 = trunc <8 x i64> %x5 to <8 x i16> 688 store <8 x i16> %x6, <8 x i16>* %res, align 1 689 ret void 690} 691 692define <32 x i8> @usat_trunc_db_1024(<32 x i32> %i) { 693; ALL-LABEL: usat_trunc_db_1024: 694; ALL: ## %bb.0: 695; ALL-NEXT: vpmovusdb %zmm0, %xmm0 696; ALL-NEXT: vpmovusdb %zmm1, %xmm1 697; ALL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 698; ALL-NEXT: retq 699 %x3 = icmp ult <32 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 700 %x5 = select <32 x i1> %x3, <32 x i32> %i, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 701 %x6 = trunc <32 x i32> %x5 to <32 x i8> 702 ret <32 x i8> %x6 703} 704 705define void @usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) { 706; ALL-LABEL: usat_trunc_db_1024_mem: 707; ALL: ## %bb.0: 708; ALL-NEXT: vpmovusdb %zmm1, 16(%rdi) 709; ALL-NEXT: vpmovusdb %zmm0, (%rdi) 710; ALL-NEXT: vzeroupper 711; ALL-NEXT: retq 712 %x3 = icmp ult <32 x i32> %i, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 713 %x5 = select <32 x i1> %x3, <32 x i32> %i, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 714 %x6 = trunc <32 x i32> %x5 to <32 x i8> 715 store <32 x i8>%x6, <32 x i8>* %p, align 1 716 ret void 717} 718 719define <16 x i16> @usat_trunc_dw_512(<16 x i32> %i) { 720; ALL-LABEL: usat_trunc_dw_512: 721; ALL: ## %bb.0: 722; ALL-NEXT: vpmovusdw %zmm0, %ymm0 723; ALL-NEXT: retq 724 %x3 = icmp ult <16 x i32> %i, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 725 %x5 = select <16 x i1> %x3, <16 x i32> %i, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 726 %x6 = trunc <16 x i32> %x5 to <16 x i16> 727 ret <16 x i16> %x6 728} 729 730define <8 x i8> @usat_trunc_wb_128(<8 x i16> %i) { 731; KNL-LABEL: usat_trunc_wb_128: 732; KNL: ## %bb.0: 733; KNL-NEXT: vpminuw {{.*}}(%rip), %xmm0, %xmm0 734; KNL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 735; KNL-NEXT: retq 736; 737; SKX-LABEL: usat_trunc_wb_128: 738; SKX: ## %bb.0: 739; SKX-NEXT: vpmovuswb %xmm0, %xmm0 740; SKX-NEXT: retq 741 %x3 = icmp ult <8 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 742 %x5 = select <8 x i1> %x3, <8 x i16> %i, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 743 %x6 = trunc <8 x i16> %x5 to <8 x i8> 744 ret <8 x i8>%x6 745} 746 747define <16 x i16> @usat_trunc_qw_1024(<16 x i64> %i) { 748; ALL-LABEL: usat_trunc_qw_1024: 749; ALL: ## %bb.0: 750; ALL-NEXT: vpmovusqw %zmm0, %xmm0 751; ALL-NEXT: vpmovusqw %zmm1, %xmm1 752; ALL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 753; ALL-NEXT: retq 754 %x3 = icmp ult <16 x i64> %i, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 755 %x5 = select <16 x i1> %x3, <16 x i64> %i, <16 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 756 %x6 = trunc <16 x i64> %x5 to <16 x i16> 757 ret <16 x i16> %x6 758} 759 760define <16 x i8> @usat_trunc_db_256(<8 x i32> %x) { 761; KNL-LABEL: usat_trunc_db_256: 762; KNL: ## %bb.0: 763; KNL-NEXT: ## kill: def $ymm0 killed $ymm0 def $zmm0 764; KNL-NEXT: vpmovusdb %zmm0, %xmm0 765; KNL-NEXT: vzeroupper 766; KNL-NEXT: retq 767; 768; SKX-LABEL: usat_trunc_db_256: 769; SKX: ## %bb.0: 770; SKX-NEXT: vpmovusdb %ymm0, %xmm0 771; SKX-NEXT: vzeroupper 772; SKX-NEXT: retq 773 %tmp1 = icmp ult <8 x i32> %x, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 774 %tmp2 = select <8 x i1> %tmp1, <8 x i32> %x, <8 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 775 %tmp3 = trunc <8 x i32> %tmp2 to <8 x i8> 776 %tmp4 = shufflevector <8 x i8> %tmp3, <8 x i8> undef, <16 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 8, i32 9, i32 10, i32 11, i32 12, i32 13, i32 14, i32 15> 777 ret <16 x i8> %tmp4 778} 779 780 781 782; Tests for the following unsigned saturation pattern: 783 784; %a = icmp sgt %x, C1 785; %b = select %a, %x, C2 786; %c = icmp slt %b, C2 787; %d = select %c, %b, C2 788; %res = trunc %d 789 790 791define void @smax_usat_trunc_wb_256_mem1(<16 x i16> %i, <16 x i8>* %res) { 792; KNL-LABEL: smax_usat_trunc_wb_256_mem1: 793; KNL: ## %bb.0: 794; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 795; KNL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 796; KNL-NEXT: vmovdqu %xmm0, (%rdi) 797; KNL-NEXT: vzeroupper 798; KNL-NEXT: retq 799; 800; SKX-LABEL: smax_usat_trunc_wb_256_mem1: 801; SKX: ## %bb.0: 802; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 803; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 804; SKX-NEXT: vpmovuswb %ymm0, (%rdi) 805; SKX-NEXT: vzeroupper 806; SKX-NEXT: retq 807 %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 808 %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 809 %x3 = icmp slt <16 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 810 %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 811 %x6 = trunc <16 x i16> %x5 to <16 x i8> 812 store <16 x i8> %x6, <16 x i8>* %res, align 1 813 ret void 814} 815 816; Test for smax(smin(x, C2), C1). 817define void @smax_usat_trunc_wb_256_mem2(<16 x i16> %i, <16 x i8>* %res) { 818; KNL-LABEL: smax_usat_trunc_wb_256_mem2: 819; KNL: ## %bb.0: 820; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 821; KNL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 822; KNL-NEXT: vmovdqu %xmm0, (%rdi) 823; KNL-NEXT: vzeroupper 824; KNL-NEXT: retq 825; 826; SKX-LABEL: smax_usat_trunc_wb_256_mem2: 827; SKX: ## %bb.0: 828; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 829; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 830; SKX-NEXT: vpmovuswb %ymm0, (%rdi) 831; SKX-NEXT: vzeroupper 832; SKX-NEXT: retq 833 %x1 = icmp slt <16 x i16> %i, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 834 %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 835 %x3 = icmp sgt <16 x i16> %x2, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 836 %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 837 %x6 = trunc <16 x i16> %x5 to <16 x i8> 838 store <16 x i8> %x6, <16 x i8>* %res, align 1 839 ret void 840} 841 842define <16 x i8> @smax_usat_trunc_wb_256(<16 x i16> %i) { 843; KNL-LABEL: smax_usat_trunc_wb_256: 844; KNL: ## %bb.0: 845; KNL-NEXT: vextracti128 $1, %ymm0, %xmm1 846; KNL-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 847; KNL-NEXT: vzeroupper 848; KNL-NEXT: retq 849; 850; SKX-LABEL: smax_usat_trunc_wb_256: 851; SKX: ## %bb.0: 852; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 853; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 854; SKX-NEXT: vpmovuswb %ymm0, %xmm0 855; SKX-NEXT: vzeroupper 856; SKX-NEXT: retq 857 %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 858 %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 859 %x3 = icmp slt <16 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 860 %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 861 %x6 = trunc <16 x i16> %x5 to <16 x i8> 862 ret <16 x i8> %x6 863 } 864 865define void @smax_usat_trunc_wb_128_mem(<8 x i16> %i, <8 x i8>* %res) { 866; KNL-LABEL: smax_usat_trunc_wb_128_mem: 867; KNL: ## %bb.0: 868; KNL-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 869; KNL-NEXT: vmovq %xmm0, (%rdi) 870; KNL-NEXT: retq 871; 872; SKX-LABEL: smax_usat_trunc_wb_128_mem: 873; SKX: ## %bb.0: 874; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 875; SKX-NEXT: vpmaxsw %xmm1, %xmm0, %xmm0 876; SKX-NEXT: vpmovuswb %xmm0, (%rdi) 877; SKX-NEXT: retq 878 %x1 = icmp sgt <8 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 879 %x2 = select <8 x i1> %x1, <8 x i16> %i, <8 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 880 %x3 = icmp slt <8 x i16> %x2, <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 881 %x5 = select <8 x i1> %x3, <8 x i16> %x2, <8 x i16> <i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255, i16 255> 882 %x6 = trunc <8 x i16> %x5 to <8 x i8> 883 store <8 x i8> %x6, <8 x i8>* %res, align 1 884 ret void 885} 886 887define void @smax_usat_trunc_db_512_mem(<16 x i32> %i, <16 x i8>* %res) { 888; ALL-LABEL: smax_usat_trunc_db_512_mem: 889; ALL: ## %bb.0: 890; ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1 891; ALL-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 892; ALL-NEXT: vpmovusdb %zmm0, (%rdi) 893; ALL-NEXT: vzeroupper 894; ALL-NEXT: retq 895 %x1 = icmp sgt <16 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 896 %x2 = select <16 x i1> %x1, <16 x i32> %i, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 897 %x3 = icmp slt <16 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 898 %x5 = select <16 x i1> %x3, <16 x i32> %x2, <16 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 899 %x6 = trunc <16 x i32> %x5 to <16 x i8> 900 store <16 x i8> %x6, <16 x i8>* %res, align 1 901 ret void 902} 903 904define void @smax_usat_trunc_qb_512_mem(<8 x i64> %i, <8 x i8>* %res) { 905; ALL-LABEL: smax_usat_trunc_qb_512_mem: 906; ALL: ## %bb.0: 907; ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1 908; ALL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 909; ALL-NEXT: vpmovusqb %zmm0, (%rdi) 910; ALL-NEXT: vzeroupper 911; ALL-NEXT: retq 912 %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 913 %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 914 %x3 = icmp slt <8 x i64> %x2, <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 915 %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255, i64 255> 916 %x6 = trunc <8 x i64> %x5 to <8 x i8> 917 store <8 x i8> %x6, <8 x i8>* %res, align 1 918 ret void 919} 920 921define void @smax_usat_trunc_qd_512_mem(<8 x i64> %i, <8 x i32>* %res) { 922; ALL-LABEL: smax_usat_trunc_qd_512_mem: 923; ALL: ## %bb.0: 924; ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1 925; ALL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 926; ALL-NEXT: vpmovusqd %zmm0, (%rdi) 927; ALL-NEXT: vzeroupper 928; ALL-NEXT: retq 929 %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 930 %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 931 %x3 = icmp slt <8 x i64> %x2, <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 932 %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295, i64 4294967295> 933 %x6 = trunc <8 x i64> %x5 to <8 x i32> 934 store <8 x i32> %x6, <8 x i32>* %res, align 1 935 ret void 936} 937 938define void @smax_usat_trunc_qw_512_mem(<8 x i64> %i, <8 x i16>* %res) { 939; ALL-LABEL: smax_usat_trunc_qw_512_mem: 940; ALL: ## %bb.0: 941; ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1 942; ALL-NEXT: vpmaxsq %zmm1, %zmm0, %zmm0 943; ALL-NEXT: vpmovusqw %zmm0, (%rdi) 944; ALL-NEXT: vzeroupper 945; ALL-NEXT: retq 946 %x1 = icmp sgt <8 x i64> %i, <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 947 %x2 = select <8 x i1> %x1, <8 x i64> %i, <8 x i64> <i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0, i64 0> 948 %x3 = icmp slt <8 x i64> %x2, <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 949 %x5 = select <8 x i1> %x3, <8 x i64> %x2, <8 x i64> <i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535, i64 65535> 950 %x6 = trunc <8 x i64> %x5 to <8 x i16> 951 store <8 x i16> %x6, <8 x i16>* %res, align 1 952 ret void 953} 954 955define <32 x i8> @smax_usat_trunc_db_1024(<32 x i32> %i) { 956; ALL-LABEL: smax_usat_trunc_db_1024: 957; ALL: ## %bb.0: 958; ALL-NEXT: vpxor %xmm2, %xmm2, %xmm2 959; ALL-NEXT: vpmaxsd %zmm2, %zmm1, %zmm1 960; ALL-NEXT: vpmaxsd %zmm2, %zmm0, %zmm0 961; ALL-NEXT: vpmovusdb %zmm0, %xmm0 962; ALL-NEXT: vpmovusdb %zmm1, %xmm1 963; ALL-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 964; ALL-NEXT: retq 965 %x1 = icmp sgt <32 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 966 %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 967 %x3 = icmp slt <32 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 968 %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 969 %x6 = trunc <32 x i32> %x5 to <32 x i8> 970 ret <32 x i8> %x6 971} 972 973define void @smax_usat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) { 974; ALL-LABEL: smax_usat_trunc_db_1024_mem: 975; ALL: ## %bb.0: 976; ALL-NEXT: vpxor %xmm2, %xmm2, %xmm2 977; ALL-NEXT: vpmaxsd %zmm2, %zmm0, %zmm0 978; ALL-NEXT: vpmaxsd %zmm2, %zmm1, %zmm1 979; ALL-NEXT: vpmovusdb %zmm1, 16(%rdi) 980; ALL-NEXT: vpmovusdb %zmm0, (%rdi) 981; ALL-NEXT: vzeroupper 982; ALL-NEXT: retq 983 %x1 = icmp sgt <32 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 984 %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 985 %x3 = icmp slt <32 x i32> %x2, <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 986 %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255, i32 255> 987 %x6 = trunc <32 x i32> %x5 to <32 x i8> 988 store <32 x i8>%x6, <32 x i8>* %p, align 1 989 ret void 990} 991 992define <16 x i16> @smax_usat_trunc_dw_512(<16 x i32> %i) { 993; ALL-LABEL: smax_usat_trunc_dw_512: 994; ALL: ## %bb.0: 995; ALL-NEXT: vpxor %xmm1, %xmm1, %xmm1 996; ALL-NEXT: vpmaxsd %zmm1, %zmm0, %zmm0 997; ALL-NEXT: vpmovusdw %zmm0, %ymm0 998; ALL-NEXT: retq 999 %x1 = icmp sgt <16 x i32> %i, <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 1000 %x2 = select <16 x i1> %x1, <16 x i32> %i, <16 x i32> <i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0, i32 0> 1001 %x3 = icmp slt <16 x i32> %x2, <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 1002 %x5 = select <16 x i1> %x3, <16 x i32> %x2, <16 x i32> <i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535, i32 65535> 1003 %x6 = trunc <16 x i32> %x5 to <16 x i16> 1004 ret <16 x i16> %x6 1005} 1006 1007define void @negative_test1_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) { 1008; KNL-LABEL: negative_test1_smax_usat_trunc_wb_256_mem: 1009; KNL: ## %bb.0: 1010; KNL-NEXT: vpxor %xmm1, %xmm1, %xmm1 1011; KNL-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1012; KNL-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 1013; KNL-NEXT: vpminsw %ymm1, %ymm0, %ymm0 1014; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1015; KNL-NEXT: vpmovdb %zmm0, (%rdi) 1016; KNL-NEXT: vzeroupper 1017; KNL-NEXT: retq 1018; 1019; SKX-LABEL: negative_test1_smax_usat_trunc_wb_256_mem: 1020; SKX: ## %bb.0: 1021; SKX-NEXT: vpxor %xmm1, %xmm1, %xmm1 1022; SKX-NEXT: vpmaxsw %ymm1, %ymm0, %ymm0 1023; SKX-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1 1024; SKX-NEXT: vpminsw %ymm1, %ymm0, %ymm0 1025; SKX-NEXT: vpmovwb %ymm0, (%rdi) 1026; SKX-NEXT: vzeroupper 1027; SKX-NEXT: retq 1028 %x1 = icmp sgt <16 x i16> %i, <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 1029 %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0, i16 0> 1030 %x3 = icmp slt <16 x i16> %x2, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 1031 %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> 1032 %x6 = trunc <16 x i16> %x5 to <16 x i8> 1033 store <16 x i8> %x6, <16 x i8>* %res, align 1 1034 ret void 1035} 1036 1037define void @negative_test2_smax_usat_trunc_wb_256_mem(<16 x i16> %i, <16 x i8>* %res) { 1038; KNL-LABEL: negative_test2_smax_usat_trunc_wb_256_mem: 1039; KNL: ## %bb.0: 1040; KNL-NEXT: vpmaxsw {{.*}}(%rip), %ymm0, %ymm0 1041; KNL-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 1042; KNL-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero 1043; KNL-NEXT: vpmovdb %zmm0, (%rdi) 1044; KNL-NEXT: vzeroupper 1045; KNL-NEXT: retq 1046; 1047; SKX-LABEL: negative_test2_smax_usat_trunc_wb_256_mem: 1048; SKX: ## %bb.0: 1049; SKX-NEXT: vpmaxsw {{.*}}(%rip), %ymm0, %ymm0 1050; SKX-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 1051; SKX-NEXT: vpmovwb %ymm0, (%rdi) 1052; SKX-NEXT: vzeroupper 1053; SKX-NEXT: retq 1054 %x1 = icmp sgt <16 x i16> %i, <i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10> 1055 %x2 = select <16 x i1> %x1, <16 x i16> %i, <16 x i16> <i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10, i16 -10> 1056 %x3 = icmp slt <16 x i16> %x2, <i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5> 1057 %x5 = select <16 x i1> %x3, <16 x i16> %x2, <16 x i16> <i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5, i16 -5> 1058 %x6 = trunc <16 x i16> %x5 to <16 x i8> 1059 store <16 x i8> %x6, <16 x i8>* %res, align 1 1060 ret void 1061} 1062 1063define void @ssat_trunc_db_1024_mem(<32 x i32> %i, <32 x i8>* %p) { 1064; ALL-LABEL: ssat_trunc_db_1024_mem: 1065; ALL: ## %bb.0: 1066; ALL-NEXT: vpmovsdb %zmm1, 16(%rdi) 1067; ALL-NEXT: vpmovsdb %zmm0, (%rdi) 1068; ALL-NEXT: vzeroupper 1069; ALL-NEXT: retq 1070 %x1 = icmp sgt <32 x i32> %i, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 1071-128, i32 -128> 1072 %x2 = select <32 x i1> %x1, <32 x i32> %i, <32 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128> 1073 %x3 = icmp slt <32 x i32> %x2, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 1074 %x5 = select <32 x i1> %x3, <32 x i32> %x2, <32 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 1075 %x6 = trunc <32 x i32> %x5 to <32 x i8> 1076 store <32 x i8>%x6, <32 x i8>* %p, align 1 1077 ret void 1078} 1079 1080