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=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s --check-prefix=SSE4 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=AVX,AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=AVX,AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl | FileCheck %s --check-prefix=AVX512VL 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=AVX512BW 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL 10 11define void @truncstore_v8i64_v8i32(<8 x i64> %x, <8 x i32>* %p, <8 x i32> %mask) { 12; SSE2-LABEL: truncstore_v8i64_v8i32: 13; SSE2: # %bb.0: 14; SSE2-NEXT: pxor %xmm6, %xmm6 15; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 16; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 17; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 18; SSE2-NEXT: pxor %xmm1, %xmm5 19; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 20; SSE2-NEXT: pxor %xmm1, %xmm4 21; SSE2-NEXT: packssdw %xmm5, %xmm4 22; SSE2-NEXT: packsswb %xmm4, %xmm4 23; SSE2-NEXT: pmovmskb %xmm4, %eax 24; SSE2-NEXT: testb $1, %al 25; SSE2-NEXT: jne .LBB0_1 26; SSE2-NEXT: # %bb.2: # %else 27; SSE2-NEXT: testb $2, %al 28; SSE2-NEXT: jne .LBB0_3 29; SSE2-NEXT: .LBB0_4: # %else2 30; SSE2-NEXT: testb $4, %al 31; SSE2-NEXT: jne .LBB0_5 32; SSE2-NEXT: .LBB0_6: # %else4 33; SSE2-NEXT: testb $8, %al 34; SSE2-NEXT: je .LBB0_8 35; SSE2-NEXT: .LBB0_7: # %cond.store5 36; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3] 37; SSE2-NEXT: movd %xmm0, 12(%rdi) 38; SSE2-NEXT: .LBB0_8: # %else6 39; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] 40; SSE2-NEXT: testb $16, %al 41; SSE2-NEXT: jne .LBB0_9 42; SSE2-NEXT: # %bb.10: # %else8 43; SSE2-NEXT: testb $32, %al 44; SSE2-NEXT: jne .LBB0_11 45; SSE2-NEXT: .LBB0_12: # %else10 46; SSE2-NEXT: testb $64, %al 47; SSE2-NEXT: jne .LBB0_13 48; SSE2-NEXT: .LBB0_14: # %else12 49; SSE2-NEXT: testb $-128, %al 50; SSE2-NEXT: jne .LBB0_15 51; SSE2-NEXT: .LBB0_16: # %else14 52; SSE2-NEXT: retq 53; SSE2-NEXT: .LBB0_1: # %cond.store 54; SSE2-NEXT: movd %xmm0, (%rdi) 55; SSE2-NEXT: testb $2, %al 56; SSE2-NEXT: je .LBB0_4 57; SSE2-NEXT: .LBB0_3: # %cond.store1 58; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 59; SSE2-NEXT: movd %xmm1, 4(%rdi) 60; SSE2-NEXT: testb $4, %al 61; SSE2-NEXT: je .LBB0_6 62; SSE2-NEXT: .LBB0_5: # %cond.store3 63; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 64; SSE2-NEXT: movd %xmm1, 8(%rdi) 65; SSE2-NEXT: testb $8, %al 66; SSE2-NEXT: jne .LBB0_7 67; SSE2-NEXT: jmp .LBB0_8 68; SSE2-NEXT: .LBB0_9: # %cond.store7 69; SSE2-NEXT: movss %xmm2, 16(%rdi) 70; SSE2-NEXT: testb $32, %al 71; SSE2-NEXT: je .LBB0_12 72; SSE2-NEXT: .LBB0_11: # %cond.store9 73; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,1,1] 74; SSE2-NEXT: movd %xmm0, 20(%rdi) 75; SSE2-NEXT: testb $64, %al 76; SSE2-NEXT: je .LBB0_14 77; SSE2-NEXT: .LBB0_13: # %cond.store11 78; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 79; SSE2-NEXT: movd %xmm0, 24(%rdi) 80; SSE2-NEXT: testb $-128, %al 81; SSE2-NEXT: je .LBB0_16 82; SSE2-NEXT: .LBB0_15: # %cond.store13 83; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[3,3,3,3] 84; SSE2-NEXT: movd %xmm0, 28(%rdi) 85; SSE2-NEXT: retq 86; 87; SSE4-LABEL: truncstore_v8i64_v8i32: 88; SSE4: # %bb.0: 89; SSE4-NEXT: pxor %xmm6, %xmm6 90; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 91; SSE4-NEXT: pcmpeqd %xmm6, %xmm5 92; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 93; SSE4-NEXT: pxor %xmm1, %xmm5 94; SSE4-NEXT: pcmpeqd %xmm6, %xmm4 95; SSE4-NEXT: pxor %xmm1, %xmm4 96; SSE4-NEXT: packssdw %xmm5, %xmm4 97; SSE4-NEXT: packsswb %xmm4, %xmm4 98; SSE4-NEXT: pmovmskb %xmm4, %eax 99; SSE4-NEXT: testb $1, %al 100; SSE4-NEXT: jne .LBB0_1 101; SSE4-NEXT: # %bb.2: # %else 102; SSE4-NEXT: testb $2, %al 103; SSE4-NEXT: jne .LBB0_3 104; SSE4-NEXT: .LBB0_4: # %else2 105; SSE4-NEXT: testb $4, %al 106; SSE4-NEXT: jne .LBB0_5 107; SSE4-NEXT: .LBB0_6: # %else4 108; SSE4-NEXT: testb $8, %al 109; SSE4-NEXT: je .LBB0_8 110; SSE4-NEXT: .LBB0_7: # %cond.store5 111; SSE4-NEXT: pextrd $3, %xmm0, 12(%rdi) 112; SSE4-NEXT: .LBB0_8: # %else6 113; SSE4-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] 114; SSE4-NEXT: testb $16, %al 115; SSE4-NEXT: jne .LBB0_9 116; SSE4-NEXT: # %bb.10: # %else8 117; SSE4-NEXT: testb $32, %al 118; SSE4-NEXT: jne .LBB0_11 119; SSE4-NEXT: .LBB0_12: # %else10 120; SSE4-NEXT: testb $64, %al 121; SSE4-NEXT: jne .LBB0_13 122; SSE4-NEXT: .LBB0_14: # %else12 123; SSE4-NEXT: testb $-128, %al 124; SSE4-NEXT: jne .LBB0_15 125; SSE4-NEXT: .LBB0_16: # %else14 126; SSE4-NEXT: retq 127; SSE4-NEXT: .LBB0_1: # %cond.store 128; SSE4-NEXT: movd %xmm0, (%rdi) 129; SSE4-NEXT: testb $2, %al 130; SSE4-NEXT: je .LBB0_4 131; SSE4-NEXT: .LBB0_3: # %cond.store1 132; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) 133; SSE4-NEXT: testb $4, %al 134; SSE4-NEXT: je .LBB0_6 135; SSE4-NEXT: .LBB0_5: # %cond.store3 136; SSE4-NEXT: pextrd $2, %xmm0, 8(%rdi) 137; SSE4-NEXT: testb $8, %al 138; SSE4-NEXT: jne .LBB0_7 139; SSE4-NEXT: jmp .LBB0_8 140; SSE4-NEXT: .LBB0_9: # %cond.store7 141; SSE4-NEXT: movss %xmm2, 16(%rdi) 142; SSE4-NEXT: testb $32, %al 143; SSE4-NEXT: je .LBB0_12 144; SSE4-NEXT: .LBB0_11: # %cond.store9 145; SSE4-NEXT: extractps $1, %xmm2, 20(%rdi) 146; SSE4-NEXT: testb $64, %al 147; SSE4-NEXT: je .LBB0_14 148; SSE4-NEXT: .LBB0_13: # %cond.store11 149; SSE4-NEXT: extractps $2, %xmm2, 24(%rdi) 150; SSE4-NEXT: testb $-128, %al 151; SSE4-NEXT: je .LBB0_16 152; SSE4-NEXT: .LBB0_15: # %cond.store13 153; SSE4-NEXT: extractps $3, %xmm2, 28(%rdi) 154; SSE4-NEXT: retq 155; 156; AVX1-LABEL: truncstore_v8i64_v8i32: 157; AVX1: # %bb.0: 158; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 159; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 160; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 161; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 162; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 163; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 164; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 165; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm2 166; AVX1-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3] 167; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 168; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6] 169; AVX1-NEXT: vmaskmovps %ymm0, %ymm2, (%rdi) 170; AVX1-NEXT: vzeroupper 171; AVX1-NEXT: retq 172; 173; AVX2-LABEL: truncstore_v8i64_v8i32: 174; AVX2: # %bb.0: 175; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 176; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 177; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 178; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 179; AVX2-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3] 180; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 181; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6] 182; AVX2-NEXT: vpmaskmovd %ymm0, %ymm2, (%rdi) 183; AVX2-NEXT: vzeroupper 184; AVX2-NEXT: retq 185; 186; AVX512F-LABEL: truncstore_v8i64_v8i32: 187; AVX512F: # %bb.0: 188; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 189; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1 190; AVX512F-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 191; AVX512F-NEXT: vzeroupper 192; AVX512F-NEXT: retq 193; 194; AVX512VL-LABEL: truncstore_v8i64_v8i32: 195; AVX512VL: # %bb.0: 196; AVX512VL-NEXT: vptestmd %ymm1, %ymm1, %k1 197; AVX512VL-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 198; AVX512VL-NEXT: vzeroupper 199; AVX512VL-NEXT: retq 200; 201; AVX512BW-LABEL: truncstore_v8i64_v8i32: 202; AVX512BW: # %bb.0: 203; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 204; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 205; AVX512BW-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 206; AVX512BW-NEXT: vzeroupper 207; AVX512BW-NEXT: retq 208 %a = icmp ne <8 x i32> %mask, zeroinitializer 209 %b = trunc <8 x i64> %x to <8 x i32> 210 call void @llvm.masked.store.v8i32.p0v8i32(<8 x i32> %b, <8 x i32>* %p, i32 1, <8 x i1> %a) 211 ret void 212} 213 214define void @truncstore_v8i64_v8i16(<8 x i64> %x, <8 x i16>* %p, <8 x i32> %mask) { 215; SSE2-LABEL: truncstore_v8i64_v8i16: 216; SSE2: # %bb.0: 217; SSE2-NEXT: pxor %xmm6, %xmm6 218; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 219; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 220; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 221; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm0[0,2,2,3,4,5,6,7] 222; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm1[0],xmm7[1],xmm1[1] 223; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 224; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] 225; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 226; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] 227; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 228; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm7[0],xmm0[1] 229; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 230; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 231; SSE2-NEXT: pxor %xmm1, %xmm5 232; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 233; SSE2-NEXT: pxor %xmm1, %xmm4 234; SSE2-NEXT: packssdw %xmm5, %xmm4 235; SSE2-NEXT: packsswb %xmm4, %xmm4 236; SSE2-NEXT: pmovmskb %xmm4, %eax 237; SSE2-NEXT: testb $1, %al 238; SSE2-NEXT: jne .LBB1_1 239; SSE2-NEXT: # %bb.2: # %else 240; SSE2-NEXT: testb $2, %al 241; SSE2-NEXT: jne .LBB1_3 242; SSE2-NEXT: .LBB1_4: # %else2 243; SSE2-NEXT: testb $4, %al 244; SSE2-NEXT: jne .LBB1_5 245; SSE2-NEXT: .LBB1_6: # %else4 246; SSE2-NEXT: testb $8, %al 247; SSE2-NEXT: jne .LBB1_7 248; SSE2-NEXT: .LBB1_8: # %else6 249; SSE2-NEXT: testb $16, %al 250; SSE2-NEXT: jne .LBB1_9 251; SSE2-NEXT: .LBB1_10: # %else8 252; SSE2-NEXT: testb $32, %al 253; SSE2-NEXT: jne .LBB1_11 254; SSE2-NEXT: .LBB1_12: # %else10 255; SSE2-NEXT: testb $64, %al 256; SSE2-NEXT: jne .LBB1_13 257; SSE2-NEXT: .LBB1_14: # %else12 258; SSE2-NEXT: testb $-128, %al 259; SSE2-NEXT: jne .LBB1_15 260; SSE2-NEXT: .LBB1_16: # %else14 261; SSE2-NEXT: retq 262; SSE2-NEXT: .LBB1_1: # %cond.store 263; SSE2-NEXT: movd %xmm0, %ecx 264; SSE2-NEXT: movw %cx, (%rdi) 265; SSE2-NEXT: testb $2, %al 266; SSE2-NEXT: je .LBB1_4 267; SSE2-NEXT: .LBB1_3: # %cond.store1 268; SSE2-NEXT: pextrw $1, %xmm0, %ecx 269; SSE2-NEXT: movw %cx, 2(%rdi) 270; SSE2-NEXT: testb $4, %al 271; SSE2-NEXT: je .LBB1_6 272; SSE2-NEXT: .LBB1_5: # %cond.store3 273; SSE2-NEXT: pextrw $2, %xmm0, %ecx 274; SSE2-NEXT: movw %cx, 4(%rdi) 275; SSE2-NEXT: testb $8, %al 276; SSE2-NEXT: je .LBB1_8 277; SSE2-NEXT: .LBB1_7: # %cond.store5 278; SSE2-NEXT: pextrw $3, %xmm0, %ecx 279; SSE2-NEXT: movw %cx, 6(%rdi) 280; SSE2-NEXT: testb $16, %al 281; SSE2-NEXT: je .LBB1_10 282; SSE2-NEXT: .LBB1_9: # %cond.store7 283; SSE2-NEXT: pextrw $4, %xmm0, %ecx 284; SSE2-NEXT: movw %cx, 8(%rdi) 285; SSE2-NEXT: testb $32, %al 286; SSE2-NEXT: je .LBB1_12 287; SSE2-NEXT: .LBB1_11: # %cond.store9 288; SSE2-NEXT: pextrw $5, %xmm0, %ecx 289; SSE2-NEXT: movw %cx, 10(%rdi) 290; SSE2-NEXT: testb $64, %al 291; SSE2-NEXT: je .LBB1_14 292; SSE2-NEXT: .LBB1_13: # %cond.store11 293; SSE2-NEXT: pextrw $6, %xmm0, %ecx 294; SSE2-NEXT: movw %cx, 12(%rdi) 295; SSE2-NEXT: testb $-128, %al 296; SSE2-NEXT: je .LBB1_16 297; SSE2-NEXT: .LBB1_15: # %cond.store13 298; SSE2-NEXT: pextrw $7, %xmm0, %eax 299; SSE2-NEXT: movw %ax, 14(%rdi) 300; SSE2-NEXT: retq 301; 302; SSE4-LABEL: truncstore_v8i64_v8i16: 303; SSE4: # %bb.0: 304; SSE4-NEXT: pxor %xmm6, %xmm6 305; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm6[1,2,3],xmm3[4],xmm6[5,6,7] 306; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm6[1,2,3],xmm2[4],xmm6[5,6,7] 307; SSE4-NEXT: packusdw %xmm3, %xmm2 308; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm6[1,2,3],xmm1[4],xmm6[5,6,7] 309; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm6[1,2,3],xmm0[4],xmm6[5,6,7] 310; SSE4-NEXT: packusdw %xmm1, %xmm0 311; SSE4-NEXT: packusdw %xmm2, %xmm0 312; SSE4-NEXT: pcmpeqd %xmm6, %xmm5 313; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 314; SSE4-NEXT: pxor %xmm1, %xmm5 315; SSE4-NEXT: pcmpeqd %xmm6, %xmm4 316; SSE4-NEXT: pxor %xmm1, %xmm4 317; SSE4-NEXT: packssdw %xmm5, %xmm4 318; SSE4-NEXT: packsswb %xmm4, %xmm4 319; SSE4-NEXT: pmovmskb %xmm4, %eax 320; SSE4-NEXT: testb $1, %al 321; SSE4-NEXT: jne .LBB1_1 322; SSE4-NEXT: # %bb.2: # %else 323; SSE4-NEXT: testb $2, %al 324; SSE4-NEXT: jne .LBB1_3 325; SSE4-NEXT: .LBB1_4: # %else2 326; SSE4-NEXT: testb $4, %al 327; SSE4-NEXT: jne .LBB1_5 328; SSE4-NEXT: .LBB1_6: # %else4 329; SSE4-NEXT: testb $8, %al 330; SSE4-NEXT: jne .LBB1_7 331; SSE4-NEXT: .LBB1_8: # %else6 332; SSE4-NEXT: testb $16, %al 333; SSE4-NEXT: jne .LBB1_9 334; SSE4-NEXT: .LBB1_10: # %else8 335; SSE4-NEXT: testb $32, %al 336; SSE4-NEXT: jne .LBB1_11 337; SSE4-NEXT: .LBB1_12: # %else10 338; SSE4-NEXT: testb $64, %al 339; SSE4-NEXT: jne .LBB1_13 340; SSE4-NEXT: .LBB1_14: # %else12 341; SSE4-NEXT: testb $-128, %al 342; SSE4-NEXT: jne .LBB1_15 343; SSE4-NEXT: .LBB1_16: # %else14 344; SSE4-NEXT: retq 345; SSE4-NEXT: .LBB1_1: # %cond.store 346; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 347; SSE4-NEXT: testb $2, %al 348; SSE4-NEXT: je .LBB1_4 349; SSE4-NEXT: .LBB1_3: # %cond.store1 350; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 351; SSE4-NEXT: testb $4, %al 352; SSE4-NEXT: je .LBB1_6 353; SSE4-NEXT: .LBB1_5: # %cond.store3 354; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 355; SSE4-NEXT: testb $8, %al 356; SSE4-NEXT: je .LBB1_8 357; SSE4-NEXT: .LBB1_7: # %cond.store5 358; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 359; SSE4-NEXT: testb $16, %al 360; SSE4-NEXT: je .LBB1_10 361; SSE4-NEXT: .LBB1_9: # %cond.store7 362; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) 363; SSE4-NEXT: testb $32, %al 364; SSE4-NEXT: je .LBB1_12 365; SSE4-NEXT: .LBB1_11: # %cond.store9 366; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) 367; SSE4-NEXT: testb $64, %al 368; SSE4-NEXT: je .LBB1_14 369; SSE4-NEXT: .LBB1_13: # %cond.store11 370; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) 371; SSE4-NEXT: testb $-128, %al 372; SSE4-NEXT: je .LBB1_16 373; SSE4-NEXT: .LBB1_15: # %cond.store13 374; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) 375; SSE4-NEXT: retq 376; 377; AVX1-LABEL: truncstore_v8i64_v8i16: 378; AVX1: # %bb.0: 379; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [65535,65535,65535,65535] 380; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 381; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 382; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1 383; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0 384; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 385; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 386; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 387; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1 388; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 389; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 390; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 391; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 392; AVX1-NEXT: vmovmskps %ymm1, %eax 393; AVX1-NEXT: notl %eax 394; AVX1-NEXT: testb $1, %al 395; AVX1-NEXT: jne .LBB1_1 396; AVX1-NEXT: # %bb.2: # %else 397; AVX1-NEXT: testb $2, %al 398; AVX1-NEXT: jne .LBB1_3 399; AVX1-NEXT: .LBB1_4: # %else2 400; AVX1-NEXT: testb $4, %al 401; AVX1-NEXT: jne .LBB1_5 402; AVX1-NEXT: .LBB1_6: # %else4 403; AVX1-NEXT: testb $8, %al 404; AVX1-NEXT: jne .LBB1_7 405; AVX1-NEXT: .LBB1_8: # %else6 406; AVX1-NEXT: testb $16, %al 407; AVX1-NEXT: jne .LBB1_9 408; AVX1-NEXT: .LBB1_10: # %else8 409; AVX1-NEXT: testb $32, %al 410; AVX1-NEXT: jne .LBB1_11 411; AVX1-NEXT: .LBB1_12: # %else10 412; AVX1-NEXT: testb $64, %al 413; AVX1-NEXT: jne .LBB1_13 414; AVX1-NEXT: .LBB1_14: # %else12 415; AVX1-NEXT: testb $-128, %al 416; AVX1-NEXT: jne .LBB1_15 417; AVX1-NEXT: .LBB1_16: # %else14 418; AVX1-NEXT: vzeroupper 419; AVX1-NEXT: retq 420; AVX1-NEXT: .LBB1_1: # %cond.store 421; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 422; AVX1-NEXT: testb $2, %al 423; AVX1-NEXT: je .LBB1_4 424; AVX1-NEXT: .LBB1_3: # %cond.store1 425; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 426; AVX1-NEXT: testb $4, %al 427; AVX1-NEXT: je .LBB1_6 428; AVX1-NEXT: .LBB1_5: # %cond.store3 429; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 430; AVX1-NEXT: testb $8, %al 431; AVX1-NEXT: je .LBB1_8 432; AVX1-NEXT: .LBB1_7: # %cond.store5 433; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 434; AVX1-NEXT: testb $16, %al 435; AVX1-NEXT: je .LBB1_10 436; AVX1-NEXT: .LBB1_9: # %cond.store7 437; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 438; AVX1-NEXT: testb $32, %al 439; AVX1-NEXT: je .LBB1_12 440; AVX1-NEXT: .LBB1_11: # %cond.store9 441; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 442; AVX1-NEXT: testb $64, %al 443; AVX1-NEXT: je .LBB1_14 444; AVX1-NEXT: .LBB1_13: # %cond.store11 445; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 446; AVX1-NEXT: testb $-128, %al 447; AVX1-NEXT: je .LBB1_16 448; AVX1-NEXT: .LBB1_15: # %cond.store13 449; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 450; AVX1-NEXT: vzeroupper 451; AVX1-NEXT: retq 452; 453; AVX2-LABEL: truncstore_v8i64_v8i16: 454; AVX2: # %bb.0: 455; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 456; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm3[1,2,3],ymm1[4],ymm3[5,6,7],ymm1[8],ymm3[9,10,11],ymm1[12],ymm3[13,14,15] 457; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm3[1,2,3],ymm0[4],ymm3[5,6,7],ymm0[8],ymm3[9,10,11],ymm0[12],ymm3[13,14,15] 458; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 459; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 460; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 461; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 462; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1 463; AVX2-NEXT: vmovmskps %ymm1, %eax 464; AVX2-NEXT: notl %eax 465; AVX2-NEXT: testb $1, %al 466; AVX2-NEXT: jne .LBB1_1 467; AVX2-NEXT: # %bb.2: # %else 468; AVX2-NEXT: testb $2, %al 469; AVX2-NEXT: jne .LBB1_3 470; AVX2-NEXT: .LBB1_4: # %else2 471; AVX2-NEXT: testb $4, %al 472; AVX2-NEXT: jne .LBB1_5 473; AVX2-NEXT: .LBB1_6: # %else4 474; AVX2-NEXT: testb $8, %al 475; AVX2-NEXT: jne .LBB1_7 476; AVX2-NEXT: .LBB1_8: # %else6 477; AVX2-NEXT: testb $16, %al 478; AVX2-NEXT: jne .LBB1_9 479; AVX2-NEXT: .LBB1_10: # %else8 480; AVX2-NEXT: testb $32, %al 481; AVX2-NEXT: jne .LBB1_11 482; AVX2-NEXT: .LBB1_12: # %else10 483; AVX2-NEXT: testb $64, %al 484; AVX2-NEXT: jne .LBB1_13 485; AVX2-NEXT: .LBB1_14: # %else12 486; AVX2-NEXT: testb $-128, %al 487; AVX2-NEXT: jne .LBB1_15 488; AVX2-NEXT: .LBB1_16: # %else14 489; AVX2-NEXT: vzeroupper 490; AVX2-NEXT: retq 491; AVX2-NEXT: .LBB1_1: # %cond.store 492; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 493; AVX2-NEXT: testb $2, %al 494; AVX2-NEXT: je .LBB1_4 495; AVX2-NEXT: .LBB1_3: # %cond.store1 496; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 497; AVX2-NEXT: testb $4, %al 498; AVX2-NEXT: je .LBB1_6 499; AVX2-NEXT: .LBB1_5: # %cond.store3 500; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 501; AVX2-NEXT: testb $8, %al 502; AVX2-NEXT: je .LBB1_8 503; AVX2-NEXT: .LBB1_7: # %cond.store5 504; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 505; AVX2-NEXT: testb $16, %al 506; AVX2-NEXT: je .LBB1_10 507; AVX2-NEXT: .LBB1_9: # %cond.store7 508; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 509; AVX2-NEXT: testb $32, %al 510; AVX2-NEXT: je .LBB1_12 511; AVX2-NEXT: .LBB1_11: # %cond.store9 512; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 513; AVX2-NEXT: testb $64, %al 514; AVX2-NEXT: je .LBB1_14 515; AVX2-NEXT: .LBB1_13: # %cond.store11 516; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 517; AVX2-NEXT: testb $-128, %al 518; AVX2-NEXT: je .LBB1_16 519; AVX2-NEXT: .LBB1_15: # %cond.store13 520; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 521; AVX2-NEXT: vzeroupper 522; AVX2-NEXT: retq 523; 524; AVX512F-LABEL: truncstore_v8i64_v8i16: 525; AVX512F: # %bb.0: 526; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 527; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 528; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 529; AVX512F-NEXT: kmovw %k0, %eax 530; AVX512F-NEXT: testb $1, %al 531; AVX512F-NEXT: jne .LBB1_1 532; AVX512F-NEXT: # %bb.2: # %else 533; AVX512F-NEXT: testb $2, %al 534; AVX512F-NEXT: jne .LBB1_3 535; AVX512F-NEXT: .LBB1_4: # %else2 536; AVX512F-NEXT: testb $4, %al 537; AVX512F-NEXT: jne .LBB1_5 538; AVX512F-NEXT: .LBB1_6: # %else4 539; AVX512F-NEXT: testb $8, %al 540; AVX512F-NEXT: jne .LBB1_7 541; AVX512F-NEXT: .LBB1_8: # %else6 542; AVX512F-NEXT: testb $16, %al 543; AVX512F-NEXT: jne .LBB1_9 544; AVX512F-NEXT: .LBB1_10: # %else8 545; AVX512F-NEXT: testb $32, %al 546; AVX512F-NEXT: jne .LBB1_11 547; AVX512F-NEXT: .LBB1_12: # %else10 548; AVX512F-NEXT: testb $64, %al 549; AVX512F-NEXT: jne .LBB1_13 550; AVX512F-NEXT: .LBB1_14: # %else12 551; AVX512F-NEXT: testb $-128, %al 552; AVX512F-NEXT: jne .LBB1_15 553; AVX512F-NEXT: .LBB1_16: # %else14 554; AVX512F-NEXT: vzeroupper 555; AVX512F-NEXT: retq 556; AVX512F-NEXT: .LBB1_1: # %cond.store 557; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 558; AVX512F-NEXT: testb $2, %al 559; AVX512F-NEXT: je .LBB1_4 560; AVX512F-NEXT: .LBB1_3: # %cond.store1 561; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 562; AVX512F-NEXT: testb $4, %al 563; AVX512F-NEXT: je .LBB1_6 564; AVX512F-NEXT: .LBB1_5: # %cond.store3 565; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 566; AVX512F-NEXT: testb $8, %al 567; AVX512F-NEXT: je .LBB1_8 568; AVX512F-NEXT: .LBB1_7: # %cond.store5 569; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 570; AVX512F-NEXT: testb $16, %al 571; AVX512F-NEXT: je .LBB1_10 572; AVX512F-NEXT: .LBB1_9: # %cond.store7 573; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 574; AVX512F-NEXT: testb $32, %al 575; AVX512F-NEXT: je .LBB1_12 576; AVX512F-NEXT: .LBB1_11: # %cond.store9 577; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 578; AVX512F-NEXT: testb $64, %al 579; AVX512F-NEXT: je .LBB1_14 580; AVX512F-NEXT: .LBB1_13: # %cond.store11 581; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 582; AVX512F-NEXT: testb $-128, %al 583; AVX512F-NEXT: je .LBB1_16 584; AVX512F-NEXT: .LBB1_15: # %cond.store13 585; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 586; AVX512F-NEXT: vzeroupper 587; AVX512F-NEXT: retq 588; 589; AVX512BW-LABEL: truncstore_v8i64_v8i16: 590; AVX512BW: # %bb.0: 591; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 592; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 593; AVX512BW-NEXT: vpmovqw %zmm0, (%rdi) {%k1} 594; AVX512BW-NEXT: vzeroupper 595; AVX512BW-NEXT: retq 596; 597; AVX512BWVL-LABEL: truncstore_v8i64_v8i16: 598; AVX512BWVL: # %bb.0: 599; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 600; AVX512BWVL-NEXT: vpmovqw %zmm0, (%rdi) {%k1} 601; AVX512BWVL-NEXT: vzeroupper 602; AVX512BWVL-NEXT: retq 603 %a = icmp ne <8 x i32> %mask, zeroinitializer 604 %b = trunc <8 x i64> %x to <8 x i16> 605 call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %b, <8 x i16>* %p, i32 1, <8 x i1> %a) 606 ret void 607} 608 609define void @truncstore_v8i64_v8i8(<8 x i64> %x, <8 x i8>* %p, <8 x i32> %mask) { 610; SSE2-LABEL: truncstore_v8i64_v8i8: 611; SSE2: # %bb.0: 612; SSE2-NEXT: pxor %xmm6, %xmm6 613; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 614; SSE2-NEXT: pand %xmm7, %xmm3 615; SSE2-NEXT: pand %xmm7, %xmm2 616; SSE2-NEXT: packuswb %xmm3, %xmm2 617; SSE2-NEXT: pand %xmm7, %xmm1 618; SSE2-NEXT: pand %xmm7, %xmm0 619; SSE2-NEXT: packuswb %xmm1, %xmm0 620; SSE2-NEXT: packuswb %xmm2, %xmm0 621; SSE2-NEXT: packuswb %xmm0, %xmm0 622; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 623; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 624; SSE2-NEXT: pxor %xmm1, %xmm5 625; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 626; SSE2-NEXT: pxor %xmm1, %xmm4 627; SSE2-NEXT: packssdw %xmm5, %xmm4 628; SSE2-NEXT: packsswb %xmm4, %xmm4 629; SSE2-NEXT: pmovmskb %xmm4, %eax 630; SSE2-NEXT: testb $1, %al 631; SSE2-NEXT: movd %xmm0, %ecx 632; SSE2-NEXT: jne .LBB2_1 633; SSE2-NEXT: # %bb.2: # %else 634; SSE2-NEXT: testb $2, %al 635; SSE2-NEXT: jne .LBB2_3 636; SSE2-NEXT: .LBB2_4: # %else2 637; SSE2-NEXT: testb $4, %al 638; SSE2-NEXT: jne .LBB2_5 639; SSE2-NEXT: .LBB2_6: # %else4 640; SSE2-NEXT: testb $8, %al 641; SSE2-NEXT: je .LBB2_8 642; SSE2-NEXT: .LBB2_7: # %cond.store5 643; SSE2-NEXT: shrl $24, %ecx 644; SSE2-NEXT: movb %cl, 3(%rdi) 645; SSE2-NEXT: .LBB2_8: # %else6 646; SSE2-NEXT: testb $16, %al 647; SSE2-NEXT: pextrw $2, %xmm0, %ecx 648; SSE2-NEXT: je .LBB2_10 649; SSE2-NEXT: # %bb.9: # %cond.store7 650; SSE2-NEXT: movb %cl, 4(%rdi) 651; SSE2-NEXT: .LBB2_10: # %else8 652; SSE2-NEXT: testb $32, %al 653; SSE2-NEXT: je .LBB2_12 654; SSE2-NEXT: # %bb.11: # %cond.store9 655; SSE2-NEXT: movb %ch, 5(%rdi) 656; SSE2-NEXT: .LBB2_12: # %else10 657; SSE2-NEXT: testb $64, %al 658; SSE2-NEXT: pextrw $3, %xmm0, %ecx 659; SSE2-NEXT: jne .LBB2_13 660; SSE2-NEXT: # %bb.14: # %else12 661; SSE2-NEXT: testb $-128, %al 662; SSE2-NEXT: jne .LBB2_15 663; SSE2-NEXT: .LBB2_16: # %else14 664; SSE2-NEXT: retq 665; SSE2-NEXT: .LBB2_1: # %cond.store 666; SSE2-NEXT: movb %cl, (%rdi) 667; SSE2-NEXT: testb $2, %al 668; SSE2-NEXT: je .LBB2_4 669; SSE2-NEXT: .LBB2_3: # %cond.store1 670; SSE2-NEXT: movb %ch, 1(%rdi) 671; SSE2-NEXT: testb $4, %al 672; SSE2-NEXT: je .LBB2_6 673; SSE2-NEXT: .LBB2_5: # %cond.store3 674; SSE2-NEXT: movl %ecx, %edx 675; SSE2-NEXT: shrl $16, %edx 676; SSE2-NEXT: movb %dl, 2(%rdi) 677; SSE2-NEXT: testb $8, %al 678; SSE2-NEXT: jne .LBB2_7 679; SSE2-NEXT: jmp .LBB2_8 680; SSE2-NEXT: .LBB2_13: # %cond.store11 681; SSE2-NEXT: movb %cl, 6(%rdi) 682; SSE2-NEXT: testb $-128, %al 683; SSE2-NEXT: je .LBB2_16 684; SSE2-NEXT: .LBB2_15: # %cond.store13 685; SSE2-NEXT: movb %ch, 7(%rdi) 686; SSE2-NEXT: retq 687; 688; SSE4-LABEL: truncstore_v8i64_v8i8: 689; SSE4: # %bb.0: 690; SSE4-NEXT: pxor %xmm6, %xmm6 691; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0] 692; SSE4-NEXT: pand %xmm7, %xmm3 693; SSE4-NEXT: pand %xmm7, %xmm2 694; SSE4-NEXT: packusdw %xmm3, %xmm2 695; SSE4-NEXT: pand %xmm7, %xmm1 696; SSE4-NEXT: pand %xmm7, %xmm0 697; SSE4-NEXT: packusdw %xmm1, %xmm0 698; SSE4-NEXT: packusdw %xmm2, %xmm0 699; SSE4-NEXT: packuswb %xmm0, %xmm0 700; SSE4-NEXT: pcmpeqd %xmm6, %xmm5 701; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 702; SSE4-NEXT: pxor %xmm1, %xmm5 703; SSE4-NEXT: pcmpeqd %xmm6, %xmm4 704; SSE4-NEXT: pxor %xmm1, %xmm4 705; SSE4-NEXT: packssdw %xmm5, %xmm4 706; SSE4-NEXT: packsswb %xmm4, %xmm4 707; SSE4-NEXT: pmovmskb %xmm4, %eax 708; SSE4-NEXT: testb $1, %al 709; SSE4-NEXT: jne .LBB2_1 710; SSE4-NEXT: # %bb.2: # %else 711; SSE4-NEXT: testb $2, %al 712; SSE4-NEXT: jne .LBB2_3 713; SSE4-NEXT: .LBB2_4: # %else2 714; SSE4-NEXT: testb $4, %al 715; SSE4-NEXT: jne .LBB2_5 716; SSE4-NEXT: .LBB2_6: # %else4 717; SSE4-NEXT: testb $8, %al 718; SSE4-NEXT: jne .LBB2_7 719; SSE4-NEXT: .LBB2_8: # %else6 720; SSE4-NEXT: testb $16, %al 721; SSE4-NEXT: jne .LBB2_9 722; SSE4-NEXT: .LBB2_10: # %else8 723; SSE4-NEXT: testb $32, %al 724; SSE4-NEXT: jne .LBB2_11 725; SSE4-NEXT: .LBB2_12: # %else10 726; SSE4-NEXT: testb $64, %al 727; SSE4-NEXT: jne .LBB2_13 728; SSE4-NEXT: .LBB2_14: # %else12 729; SSE4-NEXT: testb $-128, %al 730; SSE4-NEXT: jne .LBB2_15 731; SSE4-NEXT: .LBB2_16: # %else14 732; SSE4-NEXT: retq 733; SSE4-NEXT: .LBB2_1: # %cond.store 734; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 735; SSE4-NEXT: testb $2, %al 736; SSE4-NEXT: je .LBB2_4 737; SSE4-NEXT: .LBB2_3: # %cond.store1 738; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 739; SSE4-NEXT: testb $4, %al 740; SSE4-NEXT: je .LBB2_6 741; SSE4-NEXT: .LBB2_5: # %cond.store3 742; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 743; SSE4-NEXT: testb $8, %al 744; SSE4-NEXT: je .LBB2_8 745; SSE4-NEXT: .LBB2_7: # %cond.store5 746; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 747; SSE4-NEXT: testb $16, %al 748; SSE4-NEXT: je .LBB2_10 749; SSE4-NEXT: .LBB2_9: # %cond.store7 750; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 751; SSE4-NEXT: testb $32, %al 752; SSE4-NEXT: je .LBB2_12 753; SSE4-NEXT: .LBB2_11: # %cond.store9 754; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 755; SSE4-NEXT: testb $64, %al 756; SSE4-NEXT: je .LBB2_14 757; SSE4-NEXT: .LBB2_13: # %cond.store11 758; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 759; SSE4-NEXT: testb $-128, %al 760; SSE4-NEXT: je .LBB2_16 761; SSE4-NEXT: .LBB2_15: # %cond.store13 762; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 763; SSE4-NEXT: retq 764; 765; AVX1-LABEL: truncstore_v8i64_v8i8: 766; AVX1: # %bb.0: 767; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [255,255,255,255] 768; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 769; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 770; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1 771; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0 772; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 773; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 774; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 775; AVX1-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 776; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1 777; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 778; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 779; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 780; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 781; AVX1-NEXT: vmovmskps %ymm1, %eax 782; AVX1-NEXT: notl %eax 783; AVX1-NEXT: testb $1, %al 784; AVX1-NEXT: jne .LBB2_1 785; AVX1-NEXT: # %bb.2: # %else 786; AVX1-NEXT: testb $2, %al 787; AVX1-NEXT: jne .LBB2_3 788; AVX1-NEXT: .LBB2_4: # %else2 789; AVX1-NEXT: testb $4, %al 790; AVX1-NEXT: jne .LBB2_5 791; AVX1-NEXT: .LBB2_6: # %else4 792; AVX1-NEXT: testb $8, %al 793; AVX1-NEXT: jne .LBB2_7 794; AVX1-NEXT: .LBB2_8: # %else6 795; AVX1-NEXT: testb $16, %al 796; AVX1-NEXT: jne .LBB2_9 797; AVX1-NEXT: .LBB2_10: # %else8 798; AVX1-NEXT: testb $32, %al 799; AVX1-NEXT: jne .LBB2_11 800; AVX1-NEXT: .LBB2_12: # %else10 801; AVX1-NEXT: testb $64, %al 802; AVX1-NEXT: jne .LBB2_13 803; AVX1-NEXT: .LBB2_14: # %else12 804; AVX1-NEXT: testb $-128, %al 805; AVX1-NEXT: jne .LBB2_15 806; AVX1-NEXT: .LBB2_16: # %else14 807; AVX1-NEXT: vzeroupper 808; AVX1-NEXT: retq 809; AVX1-NEXT: .LBB2_1: # %cond.store 810; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 811; AVX1-NEXT: testb $2, %al 812; AVX1-NEXT: je .LBB2_4 813; AVX1-NEXT: .LBB2_3: # %cond.store1 814; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 815; AVX1-NEXT: testb $4, %al 816; AVX1-NEXT: je .LBB2_6 817; AVX1-NEXT: .LBB2_5: # %cond.store3 818; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 819; AVX1-NEXT: testb $8, %al 820; AVX1-NEXT: je .LBB2_8 821; AVX1-NEXT: .LBB2_7: # %cond.store5 822; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 823; AVX1-NEXT: testb $16, %al 824; AVX1-NEXT: je .LBB2_10 825; AVX1-NEXT: .LBB2_9: # %cond.store7 826; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 827; AVX1-NEXT: testb $32, %al 828; AVX1-NEXT: je .LBB2_12 829; AVX1-NEXT: .LBB2_11: # %cond.store9 830; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 831; AVX1-NEXT: testb $64, %al 832; AVX1-NEXT: je .LBB2_14 833; AVX1-NEXT: .LBB2_13: # %cond.store11 834; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 835; AVX1-NEXT: testb $-128, %al 836; AVX1-NEXT: je .LBB2_16 837; AVX1-NEXT: .LBB2_15: # %cond.store13 838; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 839; AVX1-NEXT: vzeroupper 840; AVX1-NEXT: retq 841; 842; AVX2-LABEL: truncstore_v8i64_v8i8: 843; AVX2: # %bb.0: 844; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 845; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [255,255,255,255] 846; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1 847; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 848; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 849; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 850; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 851; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 852; AVX2-NEXT: vpackuswb %xmm0, %xmm0, %xmm0 853; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1 854; AVX2-NEXT: vmovmskps %ymm1, %eax 855; AVX2-NEXT: notl %eax 856; AVX2-NEXT: testb $1, %al 857; AVX2-NEXT: jne .LBB2_1 858; AVX2-NEXT: # %bb.2: # %else 859; AVX2-NEXT: testb $2, %al 860; AVX2-NEXT: jne .LBB2_3 861; AVX2-NEXT: .LBB2_4: # %else2 862; AVX2-NEXT: testb $4, %al 863; AVX2-NEXT: jne .LBB2_5 864; AVX2-NEXT: .LBB2_6: # %else4 865; AVX2-NEXT: testb $8, %al 866; AVX2-NEXT: jne .LBB2_7 867; AVX2-NEXT: .LBB2_8: # %else6 868; AVX2-NEXT: testb $16, %al 869; AVX2-NEXT: jne .LBB2_9 870; AVX2-NEXT: .LBB2_10: # %else8 871; AVX2-NEXT: testb $32, %al 872; AVX2-NEXT: jne .LBB2_11 873; AVX2-NEXT: .LBB2_12: # %else10 874; AVX2-NEXT: testb $64, %al 875; AVX2-NEXT: jne .LBB2_13 876; AVX2-NEXT: .LBB2_14: # %else12 877; AVX2-NEXT: testb $-128, %al 878; AVX2-NEXT: jne .LBB2_15 879; AVX2-NEXT: .LBB2_16: # %else14 880; AVX2-NEXT: vzeroupper 881; AVX2-NEXT: retq 882; AVX2-NEXT: .LBB2_1: # %cond.store 883; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 884; AVX2-NEXT: testb $2, %al 885; AVX2-NEXT: je .LBB2_4 886; AVX2-NEXT: .LBB2_3: # %cond.store1 887; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 888; AVX2-NEXT: testb $4, %al 889; AVX2-NEXT: je .LBB2_6 890; AVX2-NEXT: .LBB2_5: # %cond.store3 891; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 892; AVX2-NEXT: testb $8, %al 893; AVX2-NEXT: je .LBB2_8 894; AVX2-NEXT: .LBB2_7: # %cond.store5 895; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 896; AVX2-NEXT: testb $16, %al 897; AVX2-NEXT: je .LBB2_10 898; AVX2-NEXT: .LBB2_9: # %cond.store7 899; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 900; AVX2-NEXT: testb $32, %al 901; AVX2-NEXT: je .LBB2_12 902; AVX2-NEXT: .LBB2_11: # %cond.store9 903; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 904; AVX2-NEXT: testb $64, %al 905; AVX2-NEXT: je .LBB2_14 906; AVX2-NEXT: .LBB2_13: # %cond.store11 907; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 908; AVX2-NEXT: testb $-128, %al 909; AVX2-NEXT: je .LBB2_16 910; AVX2-NEXT: .LBB2_15: # %cond.store13 911; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 912; AVX2-NEXT: vzeroupper 913; AVX2-NEXT: retq 914; 915; AVX512F-LABEL: truncstore_v8i64_v8i8: 916; AVX512F: # %bb.0: 917; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 918; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 919; AVX512F-NEXT: vpmovqb %zmm0, %xmm0 920; AVX512F-NEXT: kmovw %k0, %eax 921; AVX512F-NEXT: testb $1, %al 922; AVX512F-NEXT: jne .LBB2_1 923; AVX512F-NEXT: # %bb.2: # %else 924; AVX512F-NEXT: testb $2, %al 925; AVX512F-NEXT: jne .LBB2_3 926; AVX512F-NEXT: .LBB2_4: # %else2 927; AVX512F-NEXT: testb $4, %al 928; AVX512F-NEXT: jne .LBB2_5 929; AVX512F-NEXT: .LBB2_6: # %else4 930; AVX512F-NEXT: testb $8, %al 931; AVX512F-NEXT: jne .LBB2_7 932; AVX512F-NEXT: .LBB2_8: # %else6 933; AVX512F-NEXT: testb $16, %al 934; AVX512F-NEXT: jne .LBB2_9 935; AVX512F-NEXT: .LBB2_10: # %else8 936; AVX512F-NEXT: testb $32, %al 937; AVX512F-NEXT: jne .LBB2_11 938; AVX512F-NEXT: .LBB2_12: # %else10 939; AVX512F-NEXT: testb $64, %al 940; AVX512F-NEXT: jne .LBB2_13 941; AVX512F-NEXT: .LBB2_14: # %else12 942; AVX512F-NEXT: testb $-128, %al 943; AVX512F-NEXT: jne .LBB2_15 944; AVX512F-NEXT: .LBB2_16: # %else14 945; AVX512F-NEXT: vzeroupper 946; AVX512F-NEXT: retq 947; AVX512F-NEXT: .LBB2_1: # %cond.store 948; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 949; AVX512F-NEXT: testb $2, %al 950; AVX512F-NEXT: je .LBB2_4 951; AVX512F-NEXT: .LBB2_3: # %cond.store1 952; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 953; AVX512F-NEXT: testb $4, %al 954; AVX512F-NEXT: je .LBB2_6 955; AVX512F-NEXT: .LBB2_5: # %cond.store3 956; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 957; AVX512F-NEXT: testb $8, %al 958; AVX512F-NEXT: je .LBB2_8 959; AVX512F-NEXT: .LBB2_7: # %cond.store5 960; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 961; AVX512F-NEXT: testb $16, %al 962; AVX512F-NEXT: je .LBB2_10 963; AVX512F-NEXT: .LBB2_9: # %cond.store7 964; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 965; AVX512F-NEXT: testb $32, %al 966; AVX512F-NEXT: je .LBB2_12 967; AVX512F-NEXT: .LBB2_11: # %cond.store9 968; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 969; AVX512F-NEXT: testb $64, %al 970; AVX512F-NEXT: je .LBB2_14 971; AVX512F-NEXT: .LBB2_13: # %cond.store11 972; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 973; AVX512F-NEXT: testb $-128, %al 974; AVX512F-NEXT: je .LBB2_16 975; AVX512F-NEXT: .LBB2_15: # %cond.store13 976; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 977; AVX512F-NEXT: vzeroupper 978; AVX512F-NEXT: retq 979; 980; AVX512BW-LABEL: truncstore_v8i64_v8i8: 981; AVX512BW: # %bb.0: 982; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 983; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 984; AVX512BW-NEXT: vpmovqb %zmm0, (%rdi) {%k1} 985; AVX512BW-NEXT: vzeroupper 986; AVX512BW-NEXT: retq 987; 988; AVX512BWVL-LABEL: truncstore_v8i64_v8i8: 989; AVX512BWVL: # %bb.0: 990; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 991; AVX512BWVL-NEXT: vpmovqb %zmm0, (%rdi) {%k1} 992; AVX512BWVL-NEXT: vzeroupper 993; AVX512BWVL-NEXT: retq 994 %a = icmp ne <8 x i32> %mask, zeroinitializer 995 %b = trunc <8 x i64> %x to <8 x i8> 996 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %b, <8 x i8>* %p, i32 1, <8 x i1> %a) 997 ret void 998} 999 1000define void @truncstore_v4i64_v4i32(<4 x i64> %x, <4 x i32>* %p, <4 x i32> %mask) { 1001; SSE2-LABEL: truncstore_v4i64_v4i32: 1002; SSE2: # %bb.0: 1003; SSE2-NEXT: pxor %xmm3, %xmm3 1004; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1005; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 1006; SSE2-NEXT: movmskps %xmm3, %eax 1007; SSE2-NEXT: xorl $15, %eax 1008; SSE2-NEXT: testb $1, %al 1009; SSE2-NEXT: jne .LBB3_1 1010; SSE2-NEXT: # %bb.2: # %else 1011; SSE2-NEXT: testb $2, %al 1012; SSE2-NEXT: jne .LBB3_3 1013; SSE2-NEXT: .LBB3_4: # %else2 1014; SSE2-NEXT: testb $4, %al 1015; SSE2-NEXT: jne .LBB3_5 1016; SSE2-NEXT: .LBB3_6: # %else4 1017; SSE2-NEXT: testb $8, %al 1018; SSE2-NEXT: jne .LBB3_7 1019; SSE2-NEXT: .LBB3_8: # %else6 1020; SSE2-NEXT: retq 1021; SSE2-NEXT: .LBB3_1: # %cond.store 1022; SSE2-NEXT: movss %xmm0, (%rdi) 1023; SSE2-NEXT: testb $2, %al 1024; SSE2-NEXT: je .LBB3_4 1025; SSE2-NEXT: .LBB3_3: # %cond.store1 1026; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1027; SSE2-NEXT: movd %xmm1, 4(%rdi) 1028; SSE2-NEXT: testb $4, %al 1029; SSE2-NEXT: je .LBB3_6 1030; SSE2-NEXT: .LBB3_5: # %cond.store3 1031; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1032; SSE2-NEXT: movd %xmm1, 8(%rdi) 1033; SSE2-NEXT: testb $8, %al 1034; SSE2-NEXT: je .LBB3_8 1035; SSE2-NEXT: .LBB3_7: # %cond.store5 1036; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3] 1037; SSE2-NEXT: movd %xmm0, 12(%rdi) 1038; SSE2-NEXT: retq 1039; 1040; SSE4-LABEL: truncstore_v4i64_v4i32: 1041; SSE4: # %bb.0: 1042; SSE4-NEXT: pxor %xmm3, %xmm3 1043; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1044; SSE4-NEXT: pcmpeqd %xmm2, %xmm3 1045; SSE4-NEXT: movmskps %xmm3, %eax 1046; SSE4-NEXT: xorl $15, %eax 1047; SSE4-NEXT: testb $1, %al 1048; SSE4-NEXT: jne .LBB3_1 1049; SSE4-NEXT: # %bb.2: # %else 1050; SSE4-NEXT: testb $2, %al 1051; SSE4-NEXT: jne .LBB3_3 1052; SSE4-NEXT: .LBB3_4: # %else2 1053; SSE4-NEXT: testb $4, %al 1054; SSE4-NEXT: jne .LBB3_5 1055; SSE4-NEXT: .LBB3_6: # %else4 1056; SSE4-NEXT: testb $8, %al 1057; SSE4-NEXT: jne .LBB3_7 1058; SSE4-NEXT: .LBB3_8: # %else6 1059; SSE4-NEXT: retq 1060; SSE4-NEXT: .LBB3_1: # %cond.store 1061; SSE4-NEXT: movss %xmm0, (%rdi) 1062; SSE4-NEXT: testb $2, %al 1063; SSE4-NEXT: je .LBB3_4 1064; SSE4-NEXT: .LBB3_3: # %cond.store1 1065; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi) 1066; SSE4-NEXT: testb $4, %al 1067; SSE4-NEXT: je .LBB3_6 1068; SSE4-NEXT: .LBB3_5: # %cond.store3 1069; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi) 1070; SSE4-NEXT: testb $8, %al 1071; SSE4-NEXT: je .LBB3_8 1072; SSE4-NEXT: .LBB3_7: # %cond.store5 1073; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi) 1074; SSE4-NEXT: retq 1075; 1076; AVX1-LABEL: truncstore_v4i64_v4i32: 1077; AVX1: # %bb.0: 1078; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1079; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1080; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1081; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 1082; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1083; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1084; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi) 1085; AVX1-NEXT: vzeroupper 1086; AVX1-NEXT: retq 1087; 1088; AVX2-LABEL: truncstore_v4i64_v4i32: 1089; AVX2: # %bb.0: 1090; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1091; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1092; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1093; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 1094; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 1095; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1096; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi) 1097; AVX2-NEXT: vzeroupper 1098; AVX2-NEXT: retq 1099; 1100; AVX512F-LABEL: truncstore_v4i64_v4i32: 1101; AVX512F: # %bb.0: 1102; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1103; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1104; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1105; AVX512F-NEXT: kshiftlw $12, %k0, %k0 1106; AVX512F-NEXT: kshiftrw $12, %k0, %k1 1107; AVX512F-NEXT: vpmovqd %zmm0, %ymm0 1108; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1109; AVX512F-NEXT: vzeroupper 1110; AVX512F-NEXT: retq 1111; 1112; AVX512VL-LABEL: truncstore_v4i64_v4i32: 1113; AVX512VL: # %bb.0: 1114; AVX512VL-NEXT: vptestmd %xmm1, %xmm1, %k1 1115; AVX512VL-NEXT: vpmovqd %ymm0, (%rdi) {%k1} 1116; AVX512VL-NEXT: vzeroupper 1117; AVX512VL-NEXT: retq 1118; 1119; AVX512BW-LABEL: truncstore_v4i64_v4i32: 1120; AVX512BW: # %bb.0: 1121; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1122; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1123; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 1124; AVX512BW-NEXT: kshiftlw $12, %k0, %k0 1125; AVX512BW-NEXT: kshiftrw $12, %k0, %k1 1126; AVX512BW-NEXT: vpmovqd %zmm0, %ymm0 1127; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1128; AVX512BW-NEXT: vzeroupper 1129; AVX512BW-NEXT: retq 1130 %a = icmp ne <4 x i32> %mask, zeroinitializer 1131 %b = trunc <4 x i64> %x to <4 x i32> 1132 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %b, <4 x i32>* %p, i32 1, <4 x i1> %a) 1133 ret void 1134} 1135 1136define void @truncstore_v4i64_v4i16(<4 x i64> %x, <4 x i16>* %p, <4 x i32> %mask) { 1137; SSE2-LABEL: truncstore_v4i64_v4i16: 1138; SSE2: # %bb.0: 1139; SSE2-NEXT: pxor %xmm3, %xmm3 1140; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] 1141; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] 1142; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1143; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1144; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 1145; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 1146; SSE2-NEXT: movmskps %xmm3, %eax 1147; SSE2-NEXT: xorl $15, %eax 1148; SSE2-NEXT: testb $1, %al 1149; SSE2-NEXT: jne .LBB4_1 1150; SSE2-NEXT: # %bb.2: # %else 1151; SSE2-NEXT: testb $2, %al 1152; SSE2-NEXT: jne .LBB4_3 1153; SSE2-NEXT: .LBB4_4: # %else2 1154; SSE2-NEXT: testb $4, %al 1155; SSE2-NEXT: jne .LBB4_5 1156; SSE2-NEXT: .LBB4_6: # %else4 1157; SSE2-NEXT: testb $8, %al 1158; SSE2-NEXT: jne .LBB4_7 1159; SSE2-NEXT: .LBB4_8: # %else6 1160; SSE2-NEXT: retq 1161; SSE2-NEXT: .LBB4_1: # %cond.store 1162; SSE2-NEXT: movd %xmm0, %ecx 1163; SSE2-NEXT: movw %cx, (%rdi) 1164; SSE2-NEXT: testb $2, %al 1165; SSE2-NEXT: je .LBB4_4 1166; SSE2-NEXT: .LBB4_3: # %cond.store1 1167; SSE2-NEXT: pextrw $1, %xmm0, %ecx 1168; SSE2-NEXT: movw %cx, 2(%rdi) 1169; SSE2-NEXT: testb $4, %al 1170; SSE2-NEXT: je .LBB4_6 1171; SSE2-NEXT: .LBB4_5: # %cond.store3 1172; SSE2-NEXT: pextrw $2, %xmm0, %ecx 1173; SSE2-NEXT: movw %cx, 4(%rdi) 1174; SSE2-NEXT: testb $8, %al 1175; SSE2-NEXT: je .LBB4_8 1176; SSE2-NEXT: .LBB4_7: # %cond.store5 1177; SSE2-NEXT: pextrw $3, %xmm0, %eax 1178; SSE2-NEXT: movw %ax, 6(%rdi) 1179; SSE2-NEXT: retq 1180; 1181; SSE4-LABEL: truncstore_v4i64_v4i16: 1182; SSE4: # %bb.0: 1183; SSE4-NEXT: pxor %xmm3, %xmm3 1184; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm3[1,2,3],xmm1[4],xmm3[5,6,7] 1185; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm3[1,2,3],xmm0[4],xmm3[5,6,7] 1186; SSE4-NEXT: packusdw %xmm1, %xmm0 1187; SSE4-NEXT: packusdw %xmm0, %xmm0 1188; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 1189; SSE4-NEXT: movmskps %xmm2, %eax 1190; SSE4-NEXT: xorl $15, %eax 1191; SSE4-NEXT: testb $1, %al 1192; SSE4-NEXT: jne .LBB4_1 1193; SSE4-NEXT: # %bb.2: # %else 1194; SSE4-NEXT: testb $2, %al 1195; SSE4-NEXT: jne .LBB4_3 1196; SSE4-NEXT: .LBB4_4: # %else2 1197; SSE4-NEXT: testb $4, %al 1198; SSE4-NEXT: jne .LBB4_5 1199; SSE4-NEXT: .LBB4_6: # %else4 1200; SSE4-NEXT: testb $8, %al 1201; SSE4-NEXT: jne .LBB4_7 1202; SSE4-NEXT: .LBB4_8: # %else6 1203; SSE4-NEXT: retq 1204; SSE4-NEXT: .LBB4_1: # %cond.store 1205; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 1206; SSE4-NEXT: testb $2, %al 1207; SSE4-NEXT: je .LBB4_4 1208; SSE4-NEXT: .LBB4_3: # %cond.store1 1209; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 1210; SSE4-NEXT: testb $4, %al 1211; SSE4-NEXT: je .LBB4_6 1212; SSE4-NEXT: .LBB4_5: # %cond.store3 1213; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 1214; SSE4-NEXT: testb $8, %al 1215; SSE4-NEXT: je .LBB4_8 1216; SSE4-NEXT: .LBB4_7: # %cond.store5 1217; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 1218; SSE4-NEXT: retq 1219; 1220; AVX1-LABEL: truncstore_v4i64_v4i16: 1221; AVX1: # %bb.0: 1222; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1223; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1224; AVX1-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3],xmm3[4],xmm2[5,6,7] 1225; AVX1-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7] 1226; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1227; AVX1-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1228; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1229; AVX1-NEXT: vmovmskps %xmm1, %eax 1230; AVX1-NEXT: xorl $15, %eax 1231; AVX1-NEXT: testb $1, %al 1232; AVX1-NEXT: jne .LBB4_1 1233; AVX1-NEXT: # %bb.2: # %else 1234; AVX1-NEXT: testb $2, %al 1235; AVX1-NEXT: jne .LBB4_3 1236; AVX1-NEXT: .LBB4_4: # %else2 1237; AVX1-NEXT: testb $4, %al 1238; AVX1-NEXT: jne .LBB4_5 1239; AVX1-NEXT: .LBB4_6: # %else4 1240; AVX1-NEXT: testb $8, %al 1241; AVX1-NEXT: jne .LBB4_7 1242; AVX1-NEXT: .LBB4_8: # %else6 1243; AVX1-NEXT: vzeroupper 1244; AVX1-NEXT: retq 1245; AVX1-NEXT: .LBB4_1: # %cond.store 1246; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 1247; AVX1-NEXT: testb $2, %al 1248; AVX1-NEXT: je .LBB4_4 1249; AVX1-NEXT: .LBB4_3: # %cond.store1 1250; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1251; AVX1-NEXT: testb $4, %al 1252; AVX1-NEXT: je .LBB4_6 1253; AVX1-NEXT: .LBB4_5: # %cond.store3 1254; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 1255; AVX1-NEXT: testb $8, %al 1256; AVX1-NEXT: je .LBB4_8 1257; AVX1-NEXT: .LBB4_7: # %cond.store5 1258; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 1259; AVX1-NEXT: vzeroupper 1260; AVX1-NEXT: retq 1261; 1262; AVX2-LABEL: truncstore_v4i64_v4i16: 1263; AVX2: # %bb.0: 1264; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1265; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 1266; AVX2-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0],xmm2[1,2,3],xmm3[4],xmm2[5,6,7] 1267; AVX2-NEXT: vpblendw {{.*#+}} xmm0 = xmm0[0],xmm2[1,2,3],xmm0[4],xmm2[5,6,7] 1268; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 1269; AVX2-NEXT: vpackusdw %xmm0, %xmm0, %xmm0 1270; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1271; AVX2-NEXT: vmovmskps %xmm1, %eax 1272; AVX2-NEXT: xorl $15, %eax 1273; AVX2-NEXT: testb $1, %al 1274; AVX2-NEXT: jne .LBB4_1 1275; AVX2-NEXT: # %bb.2: # %else 1276; AVX2-NEXT: testb $2, %al 1277; AVX2-NEXT: jne .LBB4_3 1278; AVX2-NEXT: .LBB4_4: # %else2 1279; AVX2-NEXT: testb $4, %al 1280; AVX2-NEXT: jne .LBB4_5 1281; AVX2-NEXT: .LBB4_6: # %else4 1282; AVX2-NEXT: testb $8, %al 1283; AVX2-NEXT: jne .LBB4_7 1284; AVX2-NEXT: .LBB4_8: # %else6 1285; AVX2-NEXT: vzeroupper 1286; AVX2-NEXT: retq 1287; AVX2-NEXT: .LBB4_1: # %cond.store 1288; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 1289; AVX2-NEXT: testb $2, %al 1290; AVX2-NEXT: je .LBB4_4 1291; AVX2-NEXT: .LBB4_3: # %cond.store1 1292; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1293; AVX2-NEXT: testb $4, %al 1294; AVX2-NEXT: je .LBB4_6 1295; AVX2-NEXT: .LBB4_5: # %cond.store3 1296; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 1297; AVX2-NEXT: testb $8, %al 1298; AVX2-NEXT: je .LBB4_8 1299; AVX2-NEXT: .LBB4_7: # %cond.store5 1300; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 1301; AVX2-NEXT: vzeroupper 1302; AVX2-NEXT: retq 1303; 1304; AVX512F-LABEL: truncstore_v4i64_v4i16: 1305; AVX512F: # %bb.0: 1306; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1307; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1308; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1309; AVX512F-NEXT: vpmovqw %zmm0, %xmm0 1310; AVX512F-NEXT: kmovw %k0, %eax 1311; AVX512F-NEXT: testb $1, %al 1312; AVX512F-NEXT: jne .LBB4_1 1313; AVX512F-NEXT: # %bb.2: # %else 1314; AVX512F-NEXT: testb $2, %al 1315; AVX512F-NEXT: jne .LBB4_3 1316; AVX512F-NEXT: .LBB4_4: # %else2 1317; AVX512F-NEXT: testb $4, %al 1318; AVX512F-NEXT: jne .LBB4_5 1319; AVX512F-NEXT: .LBB4_6: # %else4 1320; AVX512F-NEXT: testb $8, %al 1321; AVX512F-NEXT: jne .LBB4_7 1322; AVX512F-NEXT: .LBB4_8: # %else6 1323; AVX512F-NEXT: vzeroupper 1324; AVX512F-NEXT: retq 1325; AVX512F-NEXT: .LBB4_1: # %cond.store 1326; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 1327; AVX512F-NEXT: testb $2, %al 1328; AVX512F-NEXT: je .LBB4_4 1329; AVX512F-NEXT: .LBB4_3: # %cond.store1 1330; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1331; AVX512F-NEXT: testb $4, %al 1332; AVX512F-NEXT: je .LBB4_6 1333; AVX512F-NEXT: .LBB4_5: # %cond.store3 1334; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 1335; AVX512F-NEXT: testb $8, %al 1336; AVX512F-NEXT: je .LBB4_8 1337; AVX512F-NEXT: .LBB4_7: # %cond.store5 1338; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 1339; AVX512F-NEXT: vzeroupper 1340; AVX512F-NEXT: retq 1341; 1342; AVX512BW-LABEL: truncstore_v4i64_v4i16: 1343; AVX512BW: # %bb.0: 1344; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1345; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1346; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 1347; AVX512BW-NEXT: kshiftld $28, %k0, %k0 1348; AVX512BW-NEXT: kshiftrd $28, %k0, %k1 1349; AVX512BW-NEXT: vpmovqw %zmm0, %xmm0 1350; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 1351; AVX512BW-NEXT: vzeroupper 1352; AVX512BW-NEXT: retq 1353; 1354; AVX512BWVL-LABEL: truncstore_v4i64_v4i16: 1355; AVX512BWVL: # %bb.0: 1356; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 1357; AVX512BWVL-NEXT: vpmovqw %ymm0, (%rdi) {%k1} 1358; AVX512BWVL-NEXT: vzeroupper 1359; AVX512BWVL-NEXT: retq 1360 %a = icmp ne <4 x i32> %mask, zeroinitializer 1361 %b = trunc <4 x i64> %x to <4 x i16> 1362 call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %b, <4 x i16>* %p, i32 1, <4 x i1> %a) 1363 ret void 1364} 1365 1366define void @truncstore_v4i64_v4i8(<4 x i64> %x, <4 x i8>* %p, <4 x i32> %mask) { 1367; SSE2-LABEL: truncstore_v4i64_v4i8: 1368; SSE2: # %bb.0: 1369; SSE2-NEXT: pxor %xmm3, %xmm3 1370; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,0,0,255,0,0,0] 1371; SSE2-NEXT: pand %xmm4, %xmm1 1372; SSE2-NEXT: pand %xmm4, %xmm0 1373; SSE2-NEXT: packuswb %xmm1, %xmm0 1374; SSE2-NEXT: packuswb %xmm0, %xmm0 1375; SSE2-NEXT: packuswb %xmm0, %xmm0 1376; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 1377; SSE2-NEXT: movmskps %xmm3, %ecx 1378; SSE2-NEXT: xorl $15, %ecx 1379; SSE2-NEXT: testb $1, %cl 1380; SSE2-NEXT: movd %xmm0, %eax 1381; SSE2-NEXT: jne .LBB5_1 1382; SSE2-NEXT: # %bb.2: # %else 1383; SSE2-NEXT: testb $2, %cl 1384; SSE2-NEXT: jne .LBB5_3 1385; SSE2-NEXT: .LBB5_4: # %else2 1386; SSE2-NEXT: testb $4, %cl 1387; SSE2-NEXT: jne .LBB5_5 1388; SSE2-NEXT: .LBB5_6: # %else4 1389; SSE2-NEXT: testb $8, %cl 1390; SSE2-NEXT: jne .LBB5_7 1391; SSE2-NEXT: .LBB5_8: # %else6 1392; SSE2-NEXT: retq 1393; SSE2-NEXT: .LBB5_1: # %cond.store 1394; SSE2-NEXT: movb %al, (%rdi) 1395; SSE2-NEXT: testb $2, %cl 1396; SSE2-NEXT: je .LBB5_4 1397; SSE2-NEXT: .LBB5_3: # %cond.store1 1398; SSE2-NEXT: movb %ah, 1(%rdi) 1399; SSE2-NEXT: testb $4, %cl 1400; SSE2-NEXT: je .LBB5_6 1401; SSE2-NEXT: .LBB5_5: # %cond.store3 1402; SSE2-NEXT: movl %eax, %edx 1403; SSE2-NEXT: shrl $16, %edx 1404; SSE2-NEXT: movb %dl, 2(%rdi) 1405; SSE2-NEXT: testb $8, %cl 1406; SSE2-NEXT: je .LBB5_8 1407; SSE2-NEXT: .LBB5_7: # %cond.store5 1408; SSE2-NEXT: shrl $24, %eax 1409; SSE2-NEXT: movb %al, 3(%rdi) 1410; SSE2-NEXT: retq 1411; 1412; SSE4-LABEL: truncstore_v4i64_v4i8: 1413; SSE4: # %bb.0: 1414; SSE4-NEXT: pxor %xmm3, %xmm3 1415; SSE4-NEXT: movdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 1416; SSE4-NEXT: pshufb %xmm4, %xmm1 1417; SSE4-NEXT: pshufb %xmm4, %xmm0 1418; SSE4-NEXT: punpcklwd {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1],xmm0[2],xmm1[2],xmm0[3],xmm1[3] 1419; SSE4-NEXT: pcmpeqd %xmm2, %xmm3 1420; SSE4-NEXT: movmskps %xmm3, %eax 1421; SSE4-NEXT: xorl $15, %eax 1422; SSE4-NEXT: testb $1, %al 1423; SSE4-NEXT: jne .LBB5_1 1424; SSE4-NEXT: # %bb.2: # %else 1425; SSE4-NEXT: testb $2, %al 1426; SSE4-NEXT: jne .LBB5_3 1427; SSE4-NEXT: .LBB5_4: # %else2 1428; SSE4-NEXT: testb $4, %al 1429; SSE4-NEXT: jne .LBB5_5 1430; SSE4-NEXT: .LBB5_6: # %else4 1431; SSE4-NEXT: testb $8, %al 1432; SSE4-NEXT: jne .LBB5_7 1433; SSE4-NEXT: .LBB5_8: # %else6 1434; SSE4-NEXT: retq 1435; SSE4-NEXT: .LBB5_1: # %cond.store 1436; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 1437; SSE4-NEXT: testb $2, %al 1438; SSE4-NEXT: je .LBB5_4 1439; SSE4-NEXT: .LBB5_3: # %cond.store1 1440; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 1441; SSE4-NEXT: testb $4, %al 1442; SSE4-NEXT: je .LBB5_6 1443; SSE4-NEXT: .LBB5_5: # %cond.store3 1444; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 1445; SSE4-NEXT: testb $8, %al 1446; SSE4-NEXT: je .LBB5_8 1447; SSE4-NEXT: .LBB5_7: # %cond.store5 1448; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 1449; SSE4-NEXT: retq 1450; 1451; AVX1-LABEL: truncstore_v4i64_v4i8: 1452; AVX1: # %bb.0: 1453; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1454; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1455; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 1456; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3 1457; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0 1458; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 1459; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1460; AVX1-NEXT: vmovmskps %xmm1, %eax 1461; AVX1-NEXT: xorl $15, %eax 1462; AVX1-NEXT: testb $1, %al 1463; AVX1-NEXT: jne .LBB5_1 1464; AVX1-NEXT: # %bb.2: # %else 1465; AVX1-NEXT: testb $2, %al 1466; AVX1-NEXT: jne .LBB5_3 1467; AVX1-NEXT: .LBB5_4: # %else2 1468; AVX1-NEXT: testb $4, %al 1469; AVX1-NEXT: jne .LBB5_5 1470; AVX1-NEXT: .LBB5_6: # %else4 1471; AVX1-NEXT: testb $8, %al 1472; AVX1-NEXT: jne .LBB5_7 1473; AVX1-NEXT: .LBB5_8: # %else6 1474; AVX1-NEXT: vzeroupper 1475; AVX1-NEXT: retq 1476; AVX1-NEXT: .LBB5_1: # %cond.store 1477; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 1478; AVX1-NEXT: testb $2, %al 1479; AVX1-NEXT: je .LBB5_4 1480; AVX1-NEXT: .LBB5_3: # %cond.store1 1481; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1482; AVX1-NEXT: testb $4, %al 1483; AVX1-NEXT: je .LBB5_6 1484; AVX1-NEXT: .LBB5_5: # %cond.store3 1485; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1486; AVX1-NEXT: testb $8, %al 1487; AVX1-NEXT: je .LBB5_8 1488; AVX1-NEXT: .LBB5_7: # %cond.store5 1489; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1490; AVX1-NEXT: vzeroupper 1491; AVX1-NEXT: retq 1492; 1493; AVX2-LABEL: truncstore_v4i64_v4i8: 1494; AVX2: # %bb.0: 1495; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1496; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 1497; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 1498; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 1499; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 1500; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 1501; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1502; AVX2-NEXT: vmovmskps %xmm1, %eax 1503; AVX2-NEXT: xorl $15, %eax 1504; AVX2-NEXT: testb $1, %al 1505; AVX2-NEXT: jne .LBB5_1 1506; AVX2-NEXT: # %bb.2: # %else 1507; AVX2-NEXT: testb $2, %al 1508; AVX2-NEXT: jne .LBB5_3 1509; AVX2-NEXT: .LBB5_4: # %else2 1510; AVX2-NEXT: testb $4, %al 1511; AVX2-NEXT: jne .LBB5_5 1512; AVX2-NEXT: .LBB5_6: # %else4 1513; AVX2-NEXT: testb $8, %al 1514; AVX2-NEXT: jne .LBB5_7 1515; AVX2-NEXT: .LBB5_8: # %else6 1516; AVX2-NEXT: vzeroupper 1517; AVX2-NEXT: retq 1518; AVX2-NEXT: .LBB5_1: # %cond.store 1519; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 1520; AVX2-NEXT: testb $2, %al 1521; AVX2-NEXT: je .LBB5_4 1522; AVX2-NEXT: .LBB5_3: # %cond.store1 1523; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1524; AVX2-NEXT: testb $4, %al 1525; AVX2-NEXT: je .LBB5_6 1526; AVX2-NEXT: .LBB5_5: # %cond.store3 1527; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1528; AVX2-NEXT: testb $8, %al 1529; AVX2-NEXT: je .LBB5_8 1530; AVX2-NEXT: .LBB5_7: # %cond.store5 1531; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1532; AVX2-NEXT: vzeroupper 1533; AVX2-NEXT: retq 1534; 1535; AVX512F-LABEL: truncstore_v4i64_v4i8: 1536; AVX512F: # %bb.0: 1537; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1538; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1539; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1540; AVX512F-NEXT: vpmovqb %zmm0, %xmm0 1541; AVX512F-NEXT: kmovw %k0, %eax 1542; AVX512F-NEXT: testb $1, %al 1543; AVX512F-NEXT: jne .LBB5_1 1544; AVX512F-NEXT: # %bb.2: # %else 1545; AVX512F-NEXT: testb $2, %al 1546; AVX512F-NEXT: jne .LBB5_3 1547; AVX512F-NEXT: .LBB5_4: # %else2 1548; AVX512F-NEXT: testb $4, %al 1549; AVX512F-NEXT: jne .LBB5_5 1550; AVX512F-NEXT: .LBB5_6: # %else4 1551; AVX512F-NEXT: testb $8, %al 1552; AVX512F-NEXT: jne .LBB5_7 1553; AVX512F-NEXT: .LBB5_8: # %else6 1554; AVX512F-NEXT: vzeroupper 1555; AVX512F-NEXT: retq 1556; AVX512F-NEXT: .LBB5_1: # %cond.store 1557; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 1558; AVX512F-NEXT: testb $2, %al 1559; AVX512F-NEXT: je .LBB5_4 1560; AVX512F-NEXT: .LBB5_3: # %cond.store1 1561; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1562; AVX512F-NEXT: testb $4, %al 1563; AVX512F-NEXT: je .LBB5_6 1564; AVX512F-NEXT: .LBB5_5: # %cond.store3 1565; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1566; AVX512F-NEXT: testb $8, %al 1567; AVX512F-NEXT: je .LBB5_8 1568; AVX512F-NEXT: .LBB5_7: # %cond.store5 1569; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1570; AVX512F-NEXT: vzeroupper 1571; AVX512F-NEXT: retq 1572; 1573; AVX512BW-LABEL: truncstore_v4i64_v4i8: 1574; AVX512BW: # %bb.0: 1575; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1576; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1577; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 1578; AVX512BW-NEXT: kshiftlq $60, %k0, %k0 1579; AVX512BW-NEXT: kshiftrq $60, %k0, %k1 1580; AVX512BW-NEXT: vpmovqb %zmm0, %xmm0 1581; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 1582; AVX512BW-NEXT: vzeroupper 1583; AVX512BW-NEXT: retq 1584; 1585; AVX512BWVL-LABEL: truncstore_v4i64_v4i8: 1586; AVX512BWVL: # %bb.0: 1587; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 1588; AVX512BWVL-NEXT: vpmovqb %ymm0, (%rdi) {%k1} 1589; AVX512BWVL-NEXT: vzeroupper 1590; AVX512BWVL-NEXT: retq 1591 %a = icmp ne <4 x i32> %mask, zeroinitializer 1592 %b = trunc <4 x i64> %x to <4 x i8> 1593 call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %b, <4 x i8>* %p, i32 1, <4 x i1> %a) 1594 ret void 1595} 1596 1597define void @truncstore_v2i64_v2i32(<2 x i64> %x, <2 x i32>* %p, <2 x i64> %mask) { 1598; SSE2-LABEL: truncstore_v2i64_v2i32: 1599; SSE2: # %bb.0: 1600; SSE2-NEXT: pxor %xmm2, %xmm2 1601; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1602; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 1603; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] 1604; SSE2-NEXT: pand %xmm2, %xmm1 1605; SSE2-NEXT: movmskpd %xmm1, %eax 1606; SSE2-NEXT: xorl $3, %eax 1607; SSE2-NEXT: testb $1, %al 1608; SSE2-NEXT: jne .LBB6_1 1609; SSE2-NEXT: # %bb.2: # %else 1610; SSE2-NEXT: testb $2, %al 1611; SSE2-NEXT: jne .LBB6_3 1612; SSE2-NEXT: .LBB6_4: # %else2 1613; SSE2-NEXT: retq 1614; SSE2-NEXT: .LBB6_1: # %cond.store 1615; SSE2-NEXT: movd %xmm0, (%rdi) 1616; SSE2-NEXT: testb $2, %al 1617; SSE2-NEXT: je .LBB6_4 1618; SSE2-NEXT: .LBB6_3: # %cond.store1 1619; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 1620; SSE2-NEXT: movd %xmm0, 4(%rdi) 1621; SSE2-NEXT: retq 1622; 1623; SSE4-LABEL: truncstore_v2i64_v2i32: 1624; SSE4: # %bb.0: 1625; SSE4-NEXT: pxor %xmm2, %xmm2 1626; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1627; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 1628; SSE4-NEXT: movmskpd %xmm2, %eax 1629; SSE4-NEXT: xorl $3, %eax 1630; SSE4-NEXT: testb $1, %al 1631; SSE4-NEXT: jne .LBB6_1 1632; SSE4-NEXT: # %bb.2: # %else 1633; SSE4-NEXT: testb $2, %al 1634; SSE4-NEXT: jne .LBB6_3 1635; SSE4-NEXT: .LBB6_4: # %else2 1636; SSE4-NEXT: retq 1637; SSE4-NEXT: .LBB6_1: # %cond.store 1638; SSE4-NEXT: movd %xmm0, (%rdi) 1639; SSE4-NEXT: testb $2, %al 1640; SSE4-NEXT: je .LBB6_4 1641; SSE4-NEXT: .LBB6_3: # %cond.store1 1642; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) 1643; SSE4-NEXT: retq 1644; 1645; AVX1-LABEL: truncstore_v2i64_v2i32: 1646; AVX1: # %bb.0: 1647; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1648; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 1649; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1650; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 1651; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero 1652; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 1653; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi) 1654; AVX1-NEXT: retq 1655; 1656; AVX2-LABEL: truncstore_v2i64_v2i32: 1657; AVX2: # %bb.0: 1658; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1659; AVX2-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 1660; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1661; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 1662; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero 1663; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1664; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi) 1665; AVX2-NEXT: retq 1666; 1667; AVX512F-LABEL: truncstore_v2i64_v2i32: 1668; AVX512F: # %bb.0: 1669; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1670; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 1671; AVX512F-NEXT: kshiftlw $14, %k0, %k0 1672; AVX512F-NEXT: kshiftrw $14, %k0, %k1 1673; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1674; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1675; AVX512F-NEXT: vzeroupper 1676; AVX512F-NEXT: retq 1677; 1678; AVX512VL-LABEL: truncstore_v2i64_v2i32: 1679; AVX512VL: # %bb.0: 1680; AVX512VL-NEXT: vptestmq %xmm1, %xmm1, %k1 1681; AVX512VL-NEXT: vpmovqd %xmm0, (%rdi) {%k1} 1682; AVX512VL-NEXT: retq 1683; 1684; AVX512BW-LABEL: truncstore_v2i64_v2i32: 1685; AVX512BW: # %bb.0: 1686; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1687; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 1688; AVX512BW-NEXT: kshiftlw $14, %k0, %k0 1689; AVX512BW-NEXT: kshiftrw $14, %k0, %k1 1690; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1691; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1692; AVX512BW-NEXT: vzeroupper 1693; AVX512BW-NEXT: retq 1694 %a = icmp ne <2 x i64> %mask, zeroinitializer 1695 %b = trunc <2 x i64> %x to <2 x i32> 1696 call void @llvm.masked.store.v2i32.p0v2i32(<2 x i32> %b, <2 x i32>* %p, i32 1, <2 x i1> %a) 1697 ret void 1698} 1699 1700define void @truncstore_v2i64_v2i16(<2 x i64> %x, <2 x i16>* %p, <2 x i64> %mask) { 1701; SSE2-LABEL: truncstore_v2i64_v2i16: 1702; SSE2: # %bb.0: 1703; SSE2-NEXT: pxor %xmm2, %xmm2 1704; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1705; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1706; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 1707; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] 1708; SSE2-NEXT: pand %xmm2, %xmm1 1709; SSE2-NEXT: movmskpd %xmm1, %eax 1710; SSE2-NEXT: xorl $3, %eax 1711; SSE2-NEXT: testb $1, %al 1712; SSE2-NEXT: jne .LBB7_1 1713; SSE2-NEXT: # %bb.2: # %else 1714; SSE2-NEXT: testb $2, %al 1715; SSE2-NEXT: jne .LBB7_3 1716; SSE2-NEXT: .LBB7_4: # %else2 1717; SSE2-NEXT: retq 1718; SSE2-NEXT: .LBB7_1: # %cond.store 1719; SSE2-NEXT: movd %xmm0, %ecx 1720; SSE2-NEXT: movw %cx, (%rdi) 1721; SSE2-NEXT: testb $2, %al 1722; SSE2-NEXT: je .LBB7_4 1723; SSE2-NEXT: .LBB7_3: # %cond.store1 1724; SSE2-NEXT: pextrw $1, %xmm0, %eax 1725; SSE2-NEXT: movw %ax, 2(%rdi) 1726; SSE2-NEXT: retq 1727; 1728; SSE4-LABEL: truncstore_v2i64_v2i16: 1729; SSE4: # %bb.0: 1730; SSE4-NEXT: pxor %xmm2, %xmm2 1731; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1732; SSE4-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1733; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 1734; SSE4-NEXT: movmskpd %xmm2, %eax 1735; SSE4-NEXT: xorl $3, %eax 1736; SSE4-NEXT: testb $1, %al 1737; SSE4-NEXT: jne .LBB7_1 1738; SSE4-NEXT: # %bb.2: # %else 1739; SSE4-NEXT: testb $2, %al 1740; SSE4-NEXT: jne .LBB7_3 1741; SSE4-NEXT: .LBB7_4: # %else2 1742; SSE4-NEXT: retq 1743; SSE4-NEXT: .LBB7_1: # %cond.store 1744; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 1745; SSE4-NEXT: testb $2, %al 1746; SSE4-NEXT: je .LBB7_4 1747; SSE4-NEXT: .LBB7_3: # %cond.store1 1748; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 1749; SSE4-NEXT: retq 1750; 1751; AVX-LABEL: truncstore_v2i64_v2i16: 1752; AVX: # %bb.0: 1753; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 1754; AVX-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1755; AVX-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1756; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 1757; AVX-NEXT: vmovmskpd %xmm1, %eax 1758; AVX-NEXT: xorl $3, %eax 1759; AVX-NEXT: testb $1, %al 1760; AVX-NEXT: jne .LBB7_1 1761; AVX-NEXT: # %bb.2: # %else 1762; AVX-NEXT: testb $2, %al 1763; AVX-NEXT: jne .LBB7_3 1764; AVX-NEXT: .LBB7_4: # %else2 1765; AVX-NEXT: retq 1766; AVX-NEXT: .LBB7_1: # %cond.store 1767; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 1768; AVX-NEXT: testb $2, %al 1769; AVX-NEXT: je .LBB7_4 1770; AVX-NEXT: .LBB7_3: # %cond.store1 1771; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1772; AVX-NEXT: retq 1773; 1774; AVX512F-LABEL: truncstore_v2i64_v2i16: 1775; AVX512F: # %bb.0: 1776; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1777; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 1778; AVX512F-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1779; AVX512F-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1780; AVX512F-NEXT: kmovw %k0, %eax 1781; AVX512F-NEXT: testb $1, %al 1782; AVX512F-NEXT: jne .LBB7_1 1783; AVX512F-NEXT: # %bb.2: # %else 1784; AVX512F-NEXT: testb $2, %al 1785; AVX512F-NEXT: jne .LBB7_3 1786; AVX512F-NEXT: .LBB7_4: # %else2 1787; AVX512F-NEXT: vzeroupper 1788; AVX512F-NEXT: retq 1789; AVX512F-NEXT: .LBB7_1: # %cond.store 1790; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 1791; AVX512F-NEXT: testb $2, %al 1792; AVX512F-NEXT: je .LBB7_4 1793; AVX512F-NEXT: .LBB7_3: # %cond.store1 1794; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1795; AVX512F-NEXT: vzeroupper 1796; AVX512F-NEXT: retq 1797; 1798; AVX512BW-LABEL: truncstore_v2i64_v2i16: 1799; AVX512BW: # %bb.0: 1800; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1801; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 1802; AVX512BW-NEXT: kshiftld $30, %k0, %k0 1803; AVX512BW-NEXT: kshiftrd $30, %k0, %k1 1804; AVX512BW-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 1805; AVX512BW-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 1806; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 1807; AVX512BW-NEXT: vzeroupper 1808; AVX512BW-NEXT: retq 1809; 1810; AVX512BWVL-LABEL: truncstore_v2i64_v2i16: 1811; AVX512BWVL: # %bb.0: 1812; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1 1813; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rdi) {%k1} 1814; AVX512BWVL-NEXT: retq 1815 %a = icmp ne <2 x i64> %mask, zeroinitializer 1816 %b = trunc <2 x i64> %x to <2 x i16> 1817 call void @llvm.masked.store.v2i16.p0v2i16(<2 x i16> %b, <2 x i16>* %p, i32 1, <2 x i1> %a) 1818 ret void 1819} 1820 1821define void @truncstore_v2i64_v2i8(<2 x i64> %x, <2 x i8>* %p, <2 x i64> %mask) { 1822; SSE2-LABEL: truncstore_v2i64_v2i8: 1823; SSE2: # %bb.0: 1824; SSE2-NEXT: pxor %xmm2, %xmm2 1825; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 1826; SSE2-NEXT: packuswb %xmm0, %xmm0 1827; SSE2-NEXT: packuswb %xmm0, %xmm0 1828; SSE2-NEXT: packuswb %xmm0, %xmm0 1829; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 1830; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] 1831; SSE2-NEXT: pand %xmm2, %xmm1 1832; SSE2-NEXT: movmskpd %xmm1, %eax 1833; SSE2-NEXT: xorl $3, %eax 1834; SSE2-NEXT: testb $1, %al 1835; SSE2-NEXT: movd %xmm0, %ecx 1836; SSE2-NEXT: jne .LBB8_1 1837; SSE2-NEXT: # %bb.2: # %else 1838; SSE2-NEXT: testb $2, %al 1839; SSE2-NEXT: jne .LBB8_3 1840; SSE2-NEXT: .LBB8_4: # %else2 1841; SSE2-NEXT: retq 1842; SSE2-NEXT: .LBB8_1: # %cond.store 1843; SSE2-NEXT: movb %cl, (%rdi) 1844; SSE2-NEXT: testb $2, %al 1845; SSE2-NEXT: je .LBB8_4 1846; SSE2-NEXT: .LBB8_3: # %cond.store1 1847; SSE2-NEXT: movb %ch, 1(%rdi) 1848; SSE2-NEXT: retq 1849; 1850; SSE4-LABEL: truncstore_v2i64_v2i8: 1851; SSE4: # %bb.0: 1852; SSE4-NEXT: pxor %xmm2, %xmm2 1853; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 1854; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 1855; SSE4-NEXT: movmskpd %xmm2, %eax 1856; SSE4-NEXT: xorl $3, %eax 1857; SSE4-NEXT: testb $1, %al 1858; SSE4-NEXT: jne .LBB8_1 1859; SSE4-NEXT: # %bb.2: # %else 1860; SSE4-NEXT: testb $2, %al 1861; SSE4-NEXT: jne .LBB8_3 1862; SSE4-NEXT: .LBB8_4: # %else2 1863; SSE4-NEXT: retq 1864; SSE4-NEXT: .LBB8_1: # %cond.store 1865; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 1866; SSE4-NEXT: testb $2, %al 1867; SSE4-NEXT: je .LBB8_4 1868; SSE4-NEXT: .LBB8_3: # %cond.store1 1869; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 1870; SSE4-NEXT: retq 1871; 1872; AVX-LABEL: truncstore_v2i64_v2i8: 1873; AVX: # %bb.0: 1874; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 1875; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 1876; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 1877; AVX-NEXT: vmovmskpd %xmm1, %eax 1878; AVX-NEXT: xorl $3, %eax 1879; AVX-NEXT: testb $1, %al 1880; AVX-NEXT: jne .LBB8_1 1881; AVX-NEXT: # %bb.2: # %else 1882; AVX-NEXT: testb $2, %al 1883; AVX-NEXT: jne .LBB8_3 1884; AVX-NEXT: .LBB8_4: # %else2 1885; AVX-NEXT: retq 1886; AVX-NEXT: .LBB8_1: # %cond.store 1887; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) 1888; AVX-NEXT: testb $2, %al 1889; AVX-NEXT: je .LBB8_4 1890; AVX-NEXT: .LBB8_3: # %cond.store1 1891; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1892; AVX-NEXT: retq 1893; 1894; AVX512F-LABEL: truncstore_v2i64_v2i8: 1895; AVX512F: # %bb.0: 1896; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1897; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 1898; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 1899; AVX512F-NEXT: kmovw %k0, %eax 1900; AVX512F-NEXT: testb $1, %al 1901; AVX512F-NEXT: jne .LBB8_1 1902; AVX512F-NEXT: # %bb.2: # %else 1903; AVX512F-NEXT: testb $2, %al 1904; AVX512F-NEXT: jne .LBB8_3 1905; AVX512F-NEXT: .LBB8_4: # %else2 1906; AVX512F-NEXT: vzeroupper 1907; AVX512F-NEXT: retq 1908; AVX512F-NEXT: .LBB8_1: # %cond.store 1909; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 1910; AVX512F-NEXT: testb $2, %al 1911; AVX512F-NEXT: je .LBB8_4 1912; AVX512F-NEXT: .LBB8_3: # %cond.store1 1913; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1914; AVX512F-NEXT: vzeroupper 1915; AVX512F-NEXT: retq 1916; 1917; AVX512BW-LABEL: truncstore_v2i64_v2i8: 1918; AVX512BW: # %bb.0: 1919; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1920; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 1921; AVX512BW-NEXT: kshiftlq $62, %k0, %k0 1922; AVX512BW-NEXT: kshiftrq $62, %k0, %k1 1923; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 1924; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 1925; AVX512BW-NEXT: vzeroupper 1926; AVX512BW-NEXT: retq 1927; 1928; AVX512BWVL-LABEL: truncstore_v2i64_v2i8: 1929; AVX512BWVL: # %bb.0: 1930; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1 1931; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rdi) {%k1} 1932; AVX512BWVL-NEXT: retq 1933 %a = icmp ne <2 x i64> %mask, zeroinitializer 1934 %b = trunc <2 x i64> %x to <2 x i8> 1935 call void @llvm.masked.store.v2i8.p0v2i8(<2 x i8> %b, <2 x i8>* %p, i32 1, <2 x i1> %a) 1936 ret void 1937} 1938 1939define void @truncstore_v16i32_v16i16(<16 x i32> %x, <16 x i16>* %p, <16 x i32> %mask) { 1940; SSE2-LABEL: truncstore_v16i32_v16i16: 1941; SSE2: # %bb.0: 1942; SSE2-NEXT: pxor %xmm8, %xmm8 1943; SSE2-NEXT: pslld $16, %xmm1 1944; SSE2-NEXT: psrad $16, %xmm1 1945; SSE2-NEXT: pslld $16, %xmm0 1946; SSE2-NEXT: psrad $16, %xmm0 1947; SSE2-NEXT: packssdw %xmm1, %xmm0 1948; SSE2-NEXT: pcmpeqd %xmm8, %xmm7 1949; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1950; SSE2-NEXT: pxor %xmm1, %xmm7 1951; SSE2-NEXT: pcmpeqd %xmm8, %xmm6 1952; SSE2-NEXT: pxor %xmm1, %xmm6 1953; SSE2-NEXT: packssdw %xmm7, %xmm6 1954; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 1955; SSE2-NEXT: pxor %xmm1, %xmm5 1956; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 1957; SSE2-NEXT: pxor %xmm1, %xmm4 1958; SSE2-NEXT: packssdw %xmm5, %xmm4 1959; SSE2-NEXT: packsswb %xmm6, %xmm4 1960; SSE2-NEXT: pmovmskb %xmm4, %eax 1961; SSE2-NEXT: testb $1, %al 1962; SSE2-NEXT: jne .LBB9_1 1963; SSE2-NEXT: # %bb.2: # %else 1964; SSE2-NEXT: testb $2, %al 1965; SSE2-NEXT: jne .LBB9_3 1966; SSE2-NEXT: .LBB9_4: # %else2 1967; SSE2-NEXT: testb $4, %al 1968; SSE2-NEXT: jne .LBB9_5 1969; SSE2-NEXT: .LBB9_6: # %else4 1970; SSE2-NEXT: testb $8, %al 1971; SSE2-NEXT: jne .LBB9_7 1972; SSE2-NEXT: .LBB9_8: # %else6 1973; SSE2-NEXT: testb $16, %al 1974; SSE2-NEXT: jne .LBB9_9 1975; SSE2-NEXT: .LBB9_10: # %else8 1976; SSE2-NEXT: testb $32, %al 1977; SSE2-NEXT: je .LBB9_12 1978; SSE2-NEXT: .LBB9_11: # %cond.store9 1979; SSE2-NEXT: pextrw $5, %xmm0, %ecx 1980; SSE2-NEXT: movw %cx, 10(%rdi) 1981; SSE2-NEXT: .LBB9_12: # %else10 1982; SSE2-NEXT: pslld $16, %xmm3 1983; SSE2-NEXT: pslld $16, %xmm2 1984; SSE2-NEXT: testb $64, %al 1985; SSE2-NEXT: je .LBB9_14 1986; SSE2-NEXT: # %bb.13: # %cond.store11 1987; SSE2-NEXT: pextrw $6, %xmm0, %ecx 1988; SSE2-NEXT: movw %cx, 12(%rdi) 1989; SSE2-NEXT: .LBB9_14: # %else12 1990; SSE2-NEXT: psrad $16, %xmm3 1991; SSE2-NEXT: psrad $16, %xmm2 1992; SSE2-NEXT: testb $-128, %al 1993; SSE2-NEXT: je .LBB9_16 1994; SSE2-NEXT: # %bb.15: # %cond.store13 1995; SSE2-NEXT: pextrw $7, %xmm0, %ecx 1996; SSE2-NEXT: movw %cx, 14(%rdi) 1997; SSE2-NEXT: .LBB9_16: # %else14 1998; SSE2-NEXT: packssdw %xmm3, %xmm2 1999; SSE2-NEXT: testl $256, %eax # imm = 0x100 2000; SSE2-NEXT: jne .LBB9_17 2001; SSE2-NEXT: # %bb.18: # %else16 2002; SSE2-NEXT: testl $512, %eax # imm = 0x200 2003; SSE2-NEXT: jne .LBB9_19 2004; SSE2-NEXT: .LBB9_20: # %else18 2005; SSE2-NEXT: testl $1024, %eax # imm = 0x400 2006; SSE2-NEXT: jne .LBB9_21 2007; SSE2-NEXT: .LBB9_22: # %else20 2008; SSE2-NEXT: testl $2048, %eax # imm = 0x800 2009; SSE2-NEXT: jne .LBB9_23 2010; SSE2-NEXT: .LBB9_24: # %else22 2011; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 2012; SSE2-NEXT: jne .LBB9_25 2013; SSE2-NEXT: .LBB9_26: # %else24 2014; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 2015; SSE2-NEXT: jne .LBB9_27 2016; SSE2-NEXT: .LBB9_28: # %else26 2017; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 2018; SSE2-NEXT: jne .LBB9_29 2019; SSE2-NEXT: .LBB9_30: # %else28 2020; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 2021; SSE2-NEXT: jne .LBB9_31 2022; SSE2-NEXT: .LBB9_32: # %else30 2023; SSE2-NEXT: retq 2024; SSE2-NEXT: .LBB9_1: # %cond.store 2025; SSE2-NEXT: movd %xmm0, %ecx 2026; SSE2-NEXT: movw %cx, (%rdi) 2027; SSE2-NEXT: testb $2, %al 2028; SSE2-NEXT: je .LBB9_4 2029; SSE2-NEXT: .LBB9_3: # %cond.store1 2030; SSE2-NEXT: pextrw $1, %xmm0, %ecx 2031; SSE2-NEXT: movw %cx, 2(%rdi) 2032; SSE2-NEXT: testb $4, %al 2033; SSE2-NEXT: je .LBB9_6 2034; SSE2-NEXT: .LBB9_5: # %cond.store3 2035; SSE2-NEXT: pextrw $2, %xmm0, %ecx 2036; SSE2-NEXT: movw %cx, 4(%rdi) 2037; SSE2-NEXT: testb $8, %al 2038; SSE2-NEXT: je .LBB9_8 2039; SSE2-NEXT: .LBB9_7: # %cond.store5 2040; SSE2-NEXT: pextrw $3, %xmm0, %ecx 2041; SSE2-NEXT: movw %cx, 6(%rdi) 2042; SSE2-NEXT: testb $16, %al 2043; SSE2-NEXT: je .LBB9_10 2044; SSE2-NEXT: .LBB9_9: # %cond.store7 2045; SSE2-NEXT: pextrw $4, %xmm0, %ecx 2046; SSE2-NEXT: movw %cx, 8(%rdi) 2047; SSE2-NEXT: testb $32, %al 2048; SSE2-NEXT: jne .LBB9_11 2049; SSE2-NEXT: jmp .LBB9_12 2050; SSE2-NEXT: .LBB9_17: # %cond.store15 2051; SSE2-NEXT: movd %xmm2, %ecx 2052; SSE2-NEXT: movw %cx, 16(%rdi) 2053; SSE2-NEXT: testl $512, %eax # imm = 0x200 2054; SSE2-NEXT: je .LBB9_20 2055; SSE2-NEXT: .LBB9_19: # %cond.store17 2056; SSE2-NEXT: pextrw $1, %xmm2, %ecx 2057; SSE2-NEXT: movw %cx, 18(%rdi) 2058; SSE2-NEXT: testl $1024, %eax # imm = 0x400 2059; SSE2-NEXT: je .LBB9_22 2060; SSE2-NEXT: .LBB9_21: # %cond.store19 2061; SSE2-NEXT: pextrw $2, %xmm2, %ecx 2062; SSE2-NEXT: movw %cx, 20(%rdi) 2063; SSE2-NEXT: testl $2048, %eax # imm = 0x800 2064; SSE2-NEXT: je .LBB9_24 2065; SSE2-NEXT: .LBB9_23: # %cond.store21 2066; SSE2-NEXT: pextrw $3, %xmm2, %ecx 2067; SSE2-NEXT: movw %cx, 22(%rdi) 2068; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 2069; SSE2-NEXT: je .LBB9_26 2070; SSE2-NEXT: .LBB9_25: # %cond.store23 2071; SSE2-NEXT: pextrw $4, %xmm2, %ecx 2072; SSE2-NEXT: movw %cx, 24(%rdi) 2073; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 2074; SSE2-NEXT: je .LBB9_28 2075; SSE2-NEXT: .LBB9_27: # %cond.store25 2076; SSE2-NEXT: pextrw $5, %xmm2, %ecx 2077; SSE2-NEXT: movw %cx, 26(%rdi) 2078; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 2079; SSE2-NEXT: je .LBB9_30 2080; SSE2-NEXT: .LBB9_29: # %cond.store27 2081; SSE2-NEXT: pextrw $6, %xmm2, %ecx 2082; SSE2-NEXT: movw %cx, 28(%rdi) 2083; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 2084; SSE2-NEXT: je .LBB9_32 2085; SSE2-NEXT: .LBB9_31: # %cond.store29 2086; SSE2-NEXT: pextrw $7, %xmm2, %eax 2087; SSE2-NEXT: movw %ax, 30(%rdi) 2088; SSE2-NEXT: retq 2089; 2090; SSE4-LABEL: truncstore_v16i32_v16i16: 2091; SSE4: # %bb.0: 2092; SSE4-NEXT: pxor %xmm8, %xmm8 2093; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm8[1],xmm1[2],xmm8[3],xmm1[4],xmm8[5],xmm1[6],xmm8[7] 2094; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1],xmm0[2],xmm8[3],xmm0[4],xmm8[5],xmm0[6],xmm8[7] 2095; SSE4-NEXT: packusdw %xmm1, %xmm0 2096; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 2097; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 2098; SSE4-NEXT: pxor %xmm1, %xmm7 2099; SSE4-NEXT: pcmpeqd %xmm8, %xmm6 2100; SSE4-NEXT: pxor %xmm1, %xmm6 2101; SSE4-NEXT: packssdw %xmm7, %xmm6 2102; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 2103; SSE4-NEXT: pxor %xmm1, %xmm5 2104; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 2105; SSE4-NEXT: pxor %xmm1, %xmm4 2106; SSE4-NEXT: packssdw %xmm5, %xmm4 2107; SSE4-NEXT: packsswb %xmm6, %xmm4 2108; SSE4-NEXT: pmovmskb %xmm4, %eax 2109; SSE4-NEXT: testb $1, %al 2110; SSE4-NEXT: jne .LBB9_1 2111; SSE4-NEXT: # %bb.2: # %else 2112; SSE4-NEXT: testb $2, %al 2113; SSE4-NEXT: jne .LBB9_3 2114; SSE4-NEXT: .LBB9_4: # %else2 2115; SSE4-NEXT: testb $4, %al 2116; SSE4-NEXT: jne .LBB9_5 2117; SSE4-NEXT: .LBB9_6: # %else4 2118; SSE4-NEXT: testb $8, %al 2119; SSE4-NEXT: jne .LBB9_7 2120; SSE4-NEXT: .LBB9_8: # %else6 2121; SSE4-NEXT: testb $16, %al 2122; SSE4-NEXT: jne .LBB9_9 2123; SSE4-NEXT: .LBB9_10: # %else8 2124; SSE4-NEXT: testb $32, %al 2125; SSE4-NEXT: jne .LBB9_11 2126; SSE4-NEXT: .LBB9_12: # %else10 2127; SSE4-NEXT: testb $64, %al 2128; SSE4-NEXT: je .LBB9_14 2129; SSE4-NEXT: .LBB9_13: # %cond.store11 2130; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) 2131; SSE4-NEXT: .LBB9_14: # %else12 2132; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm8[1],xmm3[2],xmm8[3],xmm3[4],xmm8[5],xmm3[6],xmm8[7] 2133; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm8[1],xmm2[2],xmm8[3],xmm2[4],xmm8[5],xmm2[6],xmm8[7] 2134; SSE4-NEXT: testb $-128, %al 2135; SSE4-NEXT: je .LBB9_16 2136; SSE4-NEXT: # %bb.15: # %cond.store13 2137; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) 2138; SSE4-NEXT: .LBB9_16: # %else14 2139; SSE4-NEXT: packusdw %xmm3, %xmm2 2140; SSE4-NEXT: testl $256, %eax # imm = 0x100 2141; SSE4-NEXT: jne .LBB9_17 2142; SSE4-NEXT: # %bb.18: # %else16 2143; SSE4-NEXT: testl $512, %eax # imm = 0x200 2144; SSE4-NEXT: jne .LBB9_19 2145; SSE4-NEXT: .LBB9_20: # %else18 2146; SSE4-NEXT: testl $1024, %eax # imm = 0x400 2147; SSE4-NEXT: jne .LBB9_21 2148; SSE4-NEXT: .LBB9_22: # %else20 2149; SSE4-NEXT: testl $2048, %eax # imm = 0x800 2150; SSE4-NEXT: jne .LBB9_23 2151; SSE4-NEXT: .LBB9_24: # %else22 2152; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 2153; SSE4-NEXT: jne .LBB9_25 2154; SSE4-NEXT: .LBB9_26: # %else24 2155; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 2156; SSE4-NEXT: jne .LBB9_27 2157; SSE4-NEXT: .LBB9_28: # %else26 2158; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 2159; SSE4-NEXT: jne .LBB9_29 2160; SSE4-NEXT: .LBB9_30: # %else28 2161; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 2162; SSE4-NEXT: jne .LBB9_31 2163; SSE4-NEXT: .LBB9_32: # %else30 2164; SSE4-NEXT: retq 2165; SSE4-NEXT: .LBB9_1: # %cond.store 2166; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 2167; SSE4-NEXT: testb $2, %al 2168; SSE4-NEXT: je .LBB9_4 2169; SSE4-NEXT: .LBB9_3: # %cond.store1 2170; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 2171; SSE4-NEXT: testb $4, %al 2172; SSE4-NEXT: je .LBB9_6 2173; SSE4-NEXT: .LBB9_5: # %cond.store3 2174; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 2175; SSE4-NEXT: testb $8, %al 2176; SSE4-NEXT: je .LBB9_8 2177; SSE4-NEXT: .LBB9_7: # %cond.store5 2178; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 2179; SSE4-NEXT: testb $16, %al 2180; SSE4-NEXT: je .LBB9_10 2181; SSE4-NEXT: .LBB9_9: # %cond.store7 2182; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) 2183; SSE4-NEXT: testb $32, %al 2184; SSE4-NEXT: je .LBB9_12 2185; SSE4-NEXT: .LBB9_11: # %cond.store9 2186; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) 2187; SSE4-NEXT: testb $64, %al 2188; SSE4-NEXT: jne .LBB9_13 2189; SSE4-NEXT: jmp .LBB9_14 2190; SSE4-NEXT: .LBB9_17: # %cond.store15 2191; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi) 2192; SSE4-NEXT: testl $512, %eax # imm = 0x200 2193; SSE4-NEXT: je .LBB9_20 2194; SSE4-NEXT: .LBB9_19: # %cond.store17 2195; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi) 2196; SSE4-NEXT: testl $1024, %eax # imm = 0x400 2197; SSE4-NEXT: je .LBB9_22 2198; SSE4-NEXT: .LBB9_21: # %cond.store19 2199; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi) 2200; SSE4-NEXT: testl $2048, %eax # imm = 0x800 2201; SSE4-NEXT: je .LBB9_24 2202; SSE4-NEXT: .LBB9_23: # %cond.store21 2203; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi) 2204; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 2205; SSE4-NEXT: je .LBB9_26 2206; SSE4-NEXT: .LBB9_25: # %cond.store23 2207; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi) 2208; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 2209; SSE4-NEXT: je .LBB9_28 2210; SSE4-NEXT: .LBB9_27: # %cond.store25 2211; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi) 2212; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 2213; SSE4-NEXT: je .LBB9_30 2214; SSE4-NEXT: .LBB9_29: # %cond.store27 2215; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi) 2216; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 2217; SSE4-NEXT: je .LBB9_32 2218; SSE4-NEXT: .LBB9_31: # %cond.store29 2219; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi) 2220; SSE4-NEXT: retq 2221; 2222; AVX1-LABEL: truncstore_v16i32_v16i16: 2223; AVX1: # %bb.0: 2224; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [65535,65535,65535,65535,65535,65535,65535,65535] 2225; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 2226; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2227; AVX1-NEXT: vpackusdw %xmm5, %xmm1, %xmm1 2228; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 2229; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 2230; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 2231; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 2232; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 2233; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 2234; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1 2235; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 2236; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 2237; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 2238; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 2239; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1 2240; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2241; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 2242; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 2243; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 2244; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 2245; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 2246; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1 2247; AVX1-NEXT: vpmovmskb %xmm1, %eax 2248; AVX1-NEXT: testb $1, %al 2249; AVX1-NEXT: jne .LBB9_1 2250; AVX1-NEXT: # %bb.2: # %else 2251; AVX1-NEXT: testb $2, %al 2252; AVX1-NEXT: jne .LBB9_3 2253; AVX1-NEXT: .LBB9_4: # %else2 2254; AVX1-NEXT: testb $4, %al 2255; AVX1-NEXT: jne .LBB9_5 2256; AVX1-NEXT: .LBB9_6: # %else4 2257; AVX1-NEXT: testb $8, %al 2258; AVX1-NEXT: jne .LBB9_7 2259; AVX1-NEXT: .LBB9_8: # %else6 2260; AVX1-NEXT: testb $16, %al 2261; AVX1-NEXT: jne .LBB9_9 2262; AVX1-NEXT: .LBB9_10: # %else8 2263; AVX1-NEXT: testb $32, %al 2264; AVX1-NEXT: jne .LBB9_11 2265; AVX1-NEXT: .LBB9_12: # %else10 2266; AVX1-NEXT: testb $64, %al 2267; AVX1-NEXT: jne .LBB9_13 2268; AVX1-NEXT: .LBB9_14: # %else12 2269; AVX1-NEXT: testb $-128, %al 2270; AVX1-NEXT: je .LBB9_16 2271; AVX1-NEXT: .LBB9_15: # %cond.store13 2272; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 2273; AVX1-NEXT: .LBB9_16: # %else14 2274; AVX1-NEXT: testl $256, %eax # imm = 0x100 2275; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 2276; AVX1-NEXT: jne .LBB9_17 2277; AVX1-NEXT: # %bb.18: # %else16 2278; AVX1-NEXT: testl $512, %eax # imm = 0x200 2279; AVX1-NEXT: jne .LBB9_19 2280; AVX1-NEXT: .LBB9_20: # %else18 2281; AVX1-NEXT: testl $1024, %eax # imm = 0x400 2282; AVX1-NEXT: jne .LBB9_21 2283; AVX1-NEXT: .LBB9_22: # %else20 2284; AVX1-NEXT: testl $2048, %eax # imm = 0x800 2285; AVX1-NEXT: jne .LBB9_23 2286; AVX1-NEXT: .LBB9_24: # %else22 2287; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 2288; AVX1-NEXT: jne .LBB9_25 2289; AVX1-NEXT: .LBB9_26: # %else24 2290; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 2291; AVX1-NEXT: jne .LBB9_27 2292; AVX1-NEXT: .LBB9_28: # %else26 2293; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 2294; AVX1-NEXT: jne .LBB9_29 2295; AVX1-NEXT: .LBB9_30: # %else28 2296; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 2297; AVX1-NEXT: jne .LBB9_31 2298; AVX1-NEXT: .LBB9_32: # %else30 2299; AVX1-NEXT: vzeroupper 2300; AVX1-NEXT: retq 2301; AVX1-NEXT: .LBB9_1: # %cond.store 2302; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 2303; AVX1-NEXT: testb $2, %al 2304; AVX1-NEXT: je .LBB9_4 2305; AVX1-NEXT: .LBB9_3: # %cond.store1 2306; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2307; AVX1-NEXT: testb $4, %al 2308; AVX1-NEXT: je .LBB9_6 2309; AVX1-NEXT: .LBB9_5: # %cond.store3 2310; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 2311; AVX1-NEXT: testb $8, %al 2312; AVX1-NEXT: je .LBB9_8 2313; AVX1-NEXT: .LBB9_7: # %cond.store5 2314; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 2315; AVX1-NEXT: testb $16, %al 2316; AVX1-NEXT: je .LBB9_10 2317; AVX1-NEXT: .LBB9_9: # %cond.store7 2318; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 2319; AVX1-NEXT: testb $32, %al 2320; AVX1-NEXT: je .LBB9_12 2321; AVX1-NEXT: .LBB9_11: # %cond.store9 2322; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 2323; AVX1-NEXT: testb $64, %al 2324; AVX1-NEXT: je .LBB9_14 2325; AVX1-NEXT: .LBB9_13: # %cond.store11 2326; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 2327; AVX1-NEXT: testb $-128, %al 2328; AVX1-NEXT: jne .LBB9_15 2329; AVX1-NEXT: jmp .LBB9_16 2330; AVX1-NEXT: .LBB9_17: # %cond.store15 2331; AVX1-NEXT: vpextrw $0, %xmm0, 16(%rdi) 2332; AVX1-NEXT: testl $512, %eax # imm = 0x200 2333; AVX1-NEXT: je .LBB9_20 2334; AVX1-NEXT: .LBB9_19: # %cond.store17 2335; AVX1-NEXT: vpextrw $1, %xmm0, 18(%rdi) 2336; AVX1-NEXT: testl $1024, %eax # imm = 0x400 2337; AVX1-NEXT: je .LBB9_22 2338; AVX1-NEXT: .LBB9_21: # %cond.store19 2339; AVX1-NEXT: vpextrw $2, %xmm0, 20(%rdi) 2340; AVX1-NEXT: testl $2048, %eax # imm = 0x800 2341; AVX1-NEXT: je .LBB9_24 2342; AVX1-NEXT: .LBB9_23: # %cond.store21 2343; AVX1-NEXT: vpextrw $3, %xmm0, 22(%rdi) 2344; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 2345; AVX1-NEXT: je .LBB9_26 2346; AVX1-NEXT: .LBB9_25: # %cond.store23 2347; AVX1-NEXT: vpextrw $4, %xmm0, 24(%rdi) 2348; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 2349; AVX1-NEXT: je .LBB9_28 2350; AVX1-NEXT: .LBB9_27: # %cond.store25 2351; AVX1-NEXT: vpextrw $5, %xmm0, 26(%rdi) 2352; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 2353; AVX1-NEXT: je .LBB9_30 2354; AVX1-NEXT: .LBB9_29: # %cond.store27 2355; AVX1-NEXT: vpextrw $6, %xmm0, 28(%rdi) 2356; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 2357; AVX1-NEXT: je .LBB9_32 2358; AVX1-NEXT: .LBB9_31: # %cond.store29 2359; AVX1-NEXT: vpextrw $7, %xmm0, 30(%rdi) 2360; AVX1-NEXT: vzeroupper 2361; AVX1-NEXT: retq 2362; 2363; AVX2-LABEL: truncstore_v16i32_v16i16: 2364; AVX2: # %bb.0: 2365; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 2366; AVX2-NEXT: vpblendw {{.*#+}} ymm1 = ymm1[0],ymm4[1],ymm1[2],ymm4[3],ymm1[4],ymm4[5],ymm1[6],ymm4[7],ymm1[8],ymm4[9],ymm1[10],ymm4[11],ymm1[12],ymm4[13],ymm1[14],ymm4[15] 2367; AVX2-NEXT: vpblendw {{.*#+}} ymm0 = ymm0[0],ymm4[1],ymm0[2],ymm4[3],ymm0[4],ymm4[5],ymm0[6],ymm4[7],ymm0[8],ymm4[9],ymm0[10],ymm4[11],ymm0[12],ymm4[13],ymm0[14],ymm4[15] 2368; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 2369; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 2370; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1 2371; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 2372; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 2373; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 2374; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 2375; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1 2376; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 2377; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1 2378; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 2379; AVX2-NEXT: vpmovmskb %xmm1, %eax 2380; AVX2-NEXT: testb $1, %al 2381; AVX2-NEXT: jne .LBB9_1 2382; AVX2-NEXT: # %bb.2: # %else 2383; AVX2-NEXT: testb $2, %al 2384; AVX2-NEXT: jne .LBB9_3 2385; AVX2-NEXT: .LBB9_4: # %else2 2386; AVX2-NEXT: testb $4, %al 2387; AVX2-NEXT: jne .LBB9_5 2388; AVX2-NEXT: .LBB9_6: # %else4 2389; AVX2-NEXT: testb $8, %al 2390; AVX2-NEXT: jne .LBB9_7 2391; AVX2-NEXT: .LBB9_8: # %else6 2392; AVX2-NEXT: testb $16, %al 2393; AVX2-NEXT: jne .LBB9_9 2394; AVX2-NEXT: .LBB9_10: # %else8 2395; AVX2-NEXT: testb $32, %al 2396; AVX2-NEXT: jne .LBB9_11 2397; AVX2-NEXT: .LBB9_12: # %else10 2398; AVX2-NEXT: testb $64, %al 2399; AVX2-NEXT: jne .LBB9_13 2400; AVX2-NEXT: .LBB9_14: # %else12 2401; AVX2-NEXT: testb $-128, %al 2402; AVX2-NEXT: je .LBB9_16 2403; AVX2-NEXT: .LBB9_15: # %cond.store13 2404; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 2405; AVX2-NEXT: .LBB9_16: # %else14 2406; AVX2-NEXT: testl $256, %eax # imm = 0x100 2407; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 2408; AVX2-NEXT: jne .LBB9_17 2409; AVX2-NEXT: # %bb.18: # %else16 2410; AVX2-NEXT: testl $512, %eax # imm = 0x200 2411; AVX2-NEXT: jne .LBB9_19 2412; AVX2-NEXT: .LBB9_20: # %else18 2413; AVX2-NEXT: testl $1024, %eax # imm = 0x400 2414; AVX2-NEXT: jne .LBB9_21 2415; AVX2-NEXT: .LBB9_22: # %else20 2416; AVX2-NEXT: testl $2048, %eax # imm = 0x800 2417; AVX2-NEXT: jne .LBB9_23 2418; AVX2-NEXT: .LBB9_24: # %else22 2419; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 2420; AVX2-NEXT: jne .LBB9_25 2421; AVX2-NEXT: .LBB9_26: # %else24 2422; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 2423; AVX2-NEXT: jne .LBB9_27 2424; AVX2-NEXT: .LBB9_28: # %else26 2425; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 2426; AVX2-NEXT: jne .LBB9_29 2427; AVX2-NEXT: .LBB9_30: # %else28 2428; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 2429; AVX2-NEXT: jne .LBB9_31 2430; AVX2-NEXT: .LBB9_32: # %else30 2431; AVX2-NEXT: vzeroupper 2432; AVX2-NEXT: retq 2433; AVX2-NEXT: .LBB9_1: # %cond.store 2434; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 2435; AVX2-NEXT: testb $2, %al 2436; AVX2-NEXT: je .LBB9_4 2437; AVX2-NEXT: .LBB9_3: # %cond.store1 2438; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2439; AVX2-NEXT: testb $4, %al 2440; AVX2-NEXT: je .LBB9_6 2441; AVX2-NEXT: .LBB9_5: # %cond.store3 2442; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 2443; AVX2-NEXT: testb $8, %al 2444; AVX2-NEXT: je .LBB9_8 2445; AVX2-NEXT: .LBB9_7: # %cond.store5 2446; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 2447; AVX2-NEXT: testb $16, %al 2448; AVX2-NEXT: je .LBB9_10 2449; AVX2-NEXT: .LBB9_9: # %cond.store7 2450; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 2451; AVX2-NEXT: testb $32, %al 2452; AVX2-NEXT: je .LBB9_12 2453; AVX2-NEXT: .LBB9_11: # %cond.store9 2454; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 2455; AVX2-NEXT: testb $64, %al 2456; AVX2-NEXT: je .LBB9_14 2457; AVX2-NEXT: .LBB9_13: # %cond.store11 2458; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 2459; AVX2-NEXT: testb $-128, %al 2460; AVX2-NEXT: jne .LBB9_15 2461; AVX2-NEXT: jmp .LBB9_16 2462; AVX2-NEXT: .LBB9_17: # %cond.store15 2463; AVX2-NEXT: vpextrw $0, %xmm0, 16(%rdi) 2464; AVX2-NEXT: testl $512, %eax # imm = 0x200 2465; AVX2-NEXT: je .LBB9_20 2466; AVX2-NEXT: .LBB9_19: # %cond.store17 2467; AVX2-NEXT: vpextrw $1, %xmm0, 18(%rdi) 2468; AVX2-NEXT: testl $1024, %eax # imm = 0x400 2469; AVX2-NEXT: je .LBB9_22 2470; AVX2-NEXT: .LBB9_21: # %cond.store19 2471; AVX2-NEXT: vpextrw $2, %xmm0, 20(%rdi) 2472; AVX2-NEXT: testl $2048, %eax # imm = 0x800 2473; AVX2-NEXT: je .LBB9_24 2474; AVX2-NEXT: .LBB9_23: # %cond.store21 2475; AVX2-NEXT: vpextrw $3, %xmm0, 22(%rdi) 2476; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 2477; AVX2-NEXT: je .LBB9_26 2478; AVX2-NEXT: .LBB9_25: # %cond.store23 2479; AVX2-NEXT: vpextrw $4, %xmm0, 24(%rdi) 2480; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 2481; AVX2-NEXT: je .LBB9_28 2482; AVX2-NEXT: .LBB9_27: # %cond.store25 2483; AVX2-NEXT: vpextrw $5, %xmm0, 26(%rdi) 2484; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 2485; AVX2-NEXT: je .LBB9_30 2486; AVX2-NEXT: .LBB9_29: # %cond.store27 2487; AVX2-NEXT: vpextrw $6, %xmm0, 28(%rdi) 2488; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 2489; AVX2-NEXT: je .LBB9_32 2490; AVX2-NEXT: .LBB9_31: # %cond.store29 2491; AVX2-NEXT: vpextrw $7, %xmm0, 30(%rdi) 2492; AVX2-NEXT: vzeroupper 2493; AVX2-NEXT: retq 2494; 2495; AVX512F-LABEL: truncstore_v16i32_v16i16: 2496; AVX512F: # %bb.0: 2497; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 2498; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 2499; AVX512F-NEXT: kmovw %k0, %eax 2500; AVX512F-NEXT: testb $1, %al 2501; AVX512F-NEXT: jne .LBB9_1 2502; AVX512F-NEXT: # %bb.2: # %else 2503; AVX512F-NEXT: testb $2, %al 2504; AVX512F-NEXT: jne .LBB9_3 2505; AVX512F-NEXT: .LBB9_4: # %else2 2506; AVX512F-NEXT: testb $4, %al 2507; AVX512F-NEXT: jne .LBB9_5 2508; AVX512F-NEXT: .LBB9_6: # %else4 2509; AVX512F-NEXT: testb $8, %al 2510; AVX512F-NEXT: jne .LBB9_7 2511; AVX512F-NEXT: .LBB9_8: # %else6 2512; AVX512F-NEXT: testb $16, %al 2513; AVX512F-NEXT: jne .LBB9_9 2514; AVX512F-NEXT: .LBB9_10: # %else8 2515; AVX512F-NEXT: testb $32, %al 2516; AVX512F-NEXT: jne .LBB9_11 2517; AVX512F-NEXT: .LBB9_12: # %else10 2518; AVX512F-NEXT: testb $64, %al 2519; AVX512F-NEXT: jne .LBB9_13 2520; AVX512F-NEXT: .LBB9_14: # %else12 2521; AVX512F-NEXT: testb $-128, %al 2522; AVX512F-NEXT: je .LBB9_16 2523; AVX512F-NEXT: .LBB9_15: # %cond.store13 2524; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 2525; AVX512F-NEXT: .LBB9_16: # %else14 2526; AVX512F-NEXT: testl $256, %eax # imm = 0x100 2527; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 2528; AVX512F-NEXT: jne .LBB9_17 2529; AVX512F-NEXT: # %bb.18: # %else16 2530; AVX512F-NEXT: testl $512, %eax # imm = 0x200 2531; AVX512F-NEXT: jne .LBB9_19 2532; AVX512F-NEXT: .LBB9_20: # %else18 2533; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 2534; AVX512F-NEXT: jne .LBB9_21 2535; AVX512F-NEXT: .LBB9_22: # %else20 2536; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 2537; AVX512F-NEXT: jne .LBB9_23 2538; AVX512F-NEXT: .LBB9_24: # %else22 2539; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 2540; AVX512F-NEXT: jne .LBB9_25 2541; AVX512F-NEXT: .LBB9_26: # %else24 2542; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 2543; AVX512F-NEXT: jne .LBB9_27 2544; AVX512F-NEXT: .LBB9_28: # %else26 2545; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 2546; AVX512F-NEXT: jne .LBB9_29 2547; AVX512F-NEXT: .LBB9_30: # %else28 2548; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 2549; AVX512F-NEXT: jne .LBB9_31 2550; AVX512F-NEXT: .LBB9_32: # %else30 2551; AVX512F-NEXT: vzeroupper 2552; AVX512F-NEXT: retq 2553; AVX512F-NEXT: .LBB9_1: # %cond.store 2554; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 2555; AVX512F-NEXT: testb $2, %al 2556; AVX512F-NEXT: je .LBB9_4 2557; AVX512F-NEXT: .LBB9_3: # %cond.store1 2558; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2559; AVX512F-NEXT: testb $4, %al 2560; AVX512F-NEXT: je .LBB9_6 2561; AVX512F-NEXT: .LBB9_5: # %cond.store3 2562; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 2563; AVX512F-NEXT: testb $8, %al 2564; AVX512F-NEXT: je .LBB9_8 2565; AVX512F-NEXT: .LBB9_7: # %cond.store5 2566; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 2567; AVX512F-NEXT: testb $16, %al 2568; AVX512F-NEXT: je .LBB9_10 2569; AVX512F-NEXT: .LBB9_9: # %cond.store7 2570; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 2571; AVX512F-NEXT: testb $32, %al 2572; AVX512F-NEXT: je .LBB9_12 2573; AVX512F-NEXT: .LBB9_11: # %cond.store9 2574; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 2575; AVX512F-NEXT: testb $64, %al 2576; AVX512F-NEXT: je .LBB9_14 2577; AVX512F-NEXT: .LBB9_13: # %cond.store11 2578; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 2579; AVX512F-NEXT: testb $-128, %al 2580; AVX512F-NEXT: jne .LBB9_15 2581; AVX512F-NEXT: jmp .LBB9_16 2582; AVX512F-NEXT: .LBB9_17: # %cond.store15 2583; AVX512F-NEXT: vpextrw $0, %xmm0, 16(%rdi) 2584; AVX512F-NEXT: testl $512, %eax # imm = 0x200 2585; AVX512F-NEXT: je .LBB9_20 2586; AVX512F-NEXT: .LBB9_19: # %cond.store17 2587; AVX512F-NEXT: vpextrw $1, %xmm0, 18(%rdi) 2588; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 2589; AVX512F-NEXT: je .LBB9_22 2590; AVX512F-NEXT: .LBB9_21: # %cond.store19 2591; AVX512F-NEXT: vpextrw $2, %xmm0, 20(%rdi) 2592; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 2593; AVX512F-NEXT: je .LBB9_24 2594; AVX512F-NEXT: .LBB9_23: # %cond.store21 2595; AVX512F-NEXT: vpextrw $3, %xmm0, 22(%rdi) 2596; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 2597; AVX512F-NEXT: je .LBB9_26 2598; AVX512F-NEXT: .LBB9_25: # %cond.store23 2599; AVX512F-NEXT: vpextrw $4, %xmm0, 24(%rdi) 2600; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 2601; AVX512F-NEXT: je .LBB9_28 2602; AVX512F-NEXT: .LBB9_27: # %cond.store25 2603; AVX512F-NEXT: vpextrw $5, %xmm0, 26(%rdi) 2604; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 2605; AVX512F-NEXT: je .LBB9_30 2606; AVX512F-NEXT: .LBB9_29: # %cond.store27 2607; AVX512F-NEXT: vpextrw $6, %xmm0, 28(%rdi) 2608; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 2609; AVX512F-NEXT: je .LBB9_32 2610; AVX512F-NEXT: .LBB9_31: # %cond.store29 2611; AVX512F-NEXT: vpextrw $7, %xmm0, 30(%rdi) 2612; AVX512F-NEXT: vzeroupper 2613; AVX512F-NEXT: retq 2614; 2615; AVX512BW-LABEL: truncstore_v16i32_v16i16: 2616; AVX512BW: # %bb.0: 2617; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 2618; AVX512BW-NEXT: vpmovdw %zmm0, (%rdi) {%k1} 2619; AVX512BW-NEXT: vzeroupper 2620; AVX512BW-NEXT: retq 2621; 2622; AVX512BWVL-LABEL: truncstore_v16i32_v16i16: 2623; AVX512BWVL: # %bb.0: 2624; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1 2625; AVX512BWVL-NEXT: vpmovdw %zmm0, (%rdi) {%k1} 2626; AVX512BWVL-NEXT: vzeroupper 2627; AVX512BWVL-NEXT: retq 2628 %a = icmp ne <16 x i32> %mask, zeroinitializer 2629 %b = trunc <16 x i32> %x to <16 x i16> 2630 call void @llvm.masked.store.v16i16.p0v16i16(<16 x i16> %b, <16 x i16>* %p, i32 1, <16 x i1> %a) 2631 ret void 2632} 2633 2634define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) { 2635; SSE2-LABEL: truncstore_v16i32_v16i8: 2636; SSE2: # %bb.0: 2637; SSE2-NEXT: pxor %xmm8, %xmm8 2638; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 2639; SSE2-NEXT: pand %xmm9, %xmm3 2640; SSE2-NEXT: pand %xmm9, %xmm2 2641; SSE2-NEXT: packuswb %xmm3, %xmm2 2642; SSE2-NEXT: pand %xmm9, %xmm1 2643; SSE2-NEXT: pand %xmm9, %xmm0 2644; SSE2-NEXT: packuswb %xmm1, %xmm0 2645; SSE2-NEXT: packuswb %xmm2, %xmm0 2646; SSE2-NEXT: pcmpeqd %xmm8, %xmm7 2647; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 2648; SSE2-NEXT: pxor %xmm1, %xmm7 2649; SSE2-NEXT: pcmpeqd %xmm8, %xmm6 2650; SSE2-NEXT: pxor %xmm1, %xmm6 2651; SSE2-NEXT: packssdw %xmm7, %xmm6 2652; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 2653; SSE2-NEXT: pxor %xmm1, %xmm5 2654; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 2655; SSE2-NEXT: pxor %xmm1, %xmm4 2656; SSE2-NEXT: packssdw %xmm5, %xmm4 2657; SSE2-NEXT: packsswb %xmm6, %xmm4 2658; SSE2-NEXT: pmovmskb %xmm4, %eax 2659; SSE2-NEXT: testb $1, %al 2660; SSE2-NEXT: movd %xmm0, %ecx 2661; SSE2-NEXT: jne .LBB10_1 2662; SSE2-NEXT: # %bb.2: # %else 2663; SSE2-NEXT: testb $2, %al 2664; SSE2-NEXT: jne .LBB10_3 2665; SSE2-NEXT: .LBB10_4: # %else2 2666; SSE2-NEXT: testb $4, %al 2667; SSE2-NEXT: jne .LBB10_5 2668; SSE2-NEXT: .LBB10_6: # %else4 2669; SSE2-NEXT: testb $8, %al 2670; SSE2-NEXT: je .LBB10_8 2671; SSE2-NEXT: .LBB10_7: # %cond.store5 2672; SSE2-NEXT: shrl $24, %ecx 2673; SSE2-NEXT: movb %cl, 3(%rdi) 2674; SSE2-NEXT: .LBB10_8: # %else6 2675; SSE2-NEXT: testb $16, %al 2676; SSE2-NEXT: pextrw $2, %xmm0, %ecx 2677; SSE2-NEXT: je .LBB10_10 2678; SSE2-NEXT: # %bb.9: # %cond.store7 2679; SSE2-NEXT: movb %cl, 4(%rdi) 2680; SSE2-NEXT: .LBB10_10: # %else8 2681; SSE2-NEXT: testb $32, %al 2682; SSE2-NEXT: je .LBB10_12 2683; SSE2-NEXT: # %bb.11: # %cond.store9 2684; SSE2-NEXT: movb %ch, 5(%rdi) 2685; SSE2-NEXT: .LBB10_12: # %else10 2686; SSE2-NEXT: testb $64, %al 2687; SSE2-NEXT: pextrw $3, %xmm0, %ecx 2688; SSE2-NEXT: je .LBB10_14 2689; SSE2-NEXT: # %bb.13: # %cond.store11 2690; SSE2-NEXT: movb %cl, 6(%rdi) 2691; SSE2-NEXT: .LBB10_14: # %else12 2692; SSE2-NEXT: testb $-128, %al 2693; SSE2-NEXT: je .LBB10_16 2694; SSE2-NEXT: # %bb.15: # %cond.store13 2695; SSE2-NEXT: movb %ch, 7(%rdi) 2696; SSE2-NEXT: .LBB10_16: # %else14 2697; SSE2-NEXT: testl $256, %eax # imm = 0x100 2698; SSE2-NEXT: pextrw $4, %xmm0, %ecx 2699; SSE2-NEXT: je .LBB10_18 2700; SSE2-NEXT: # %bb.17: # %cond.store15 2701; SSE2-NEXT: movb %cl, 8(%rdi) 2702; SSE2-NEXT: .LBB10_18: # %else16 2703; SSE2-NEXT: testl $512, %eax # imm = 0x200 2704; SSE2-NEXT: je .LBB10_20 2705; SSE2-NEXT: # %bb.19: # %cond.store17 2706; SSE2-NEXT: movb %ch, 9(%rdi) 2707; SSE2-NEXT: .LBB10_20: # %else18 2708; SSE2-NEXT: testl $1024, %eax # imm = 0x400 2709; SSE2-NEXT: pextrw $5, %xmm0, %ecx 2710; SSE2-NEXT: je .LBB10_22 2711; SSE2-NEXT: # %bb.21: # %cond.store19 2712; SSE2-NEXT: movb %cl, 10(%rdi) 2713; SSE2-NEXT: .LBB10_22: # %else20 2714; SSE2-NEXT: testl $2048, %eax # imm = 0x800 2715; SSE2-NEXT: je .LBB10_24 2716; SSE2-NEXT: # %bb.23: # %cond.store21 2717; SSE2-NEXT: movb %ch, 11(%rdi) 2718; SSE2-NEXT: .LBB10_24: # %else22 2719; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 2720; SSE2-NEXT: pextrw $6, %xmm0, %ecx 2721; SSE2-NEXT: je .LBB10_26 2722; SSE2-NEXT: # %bb.25: # %cond.store23 2723; SSE2-NEXT: movb %cl, 12(%rdi) 2724; SSE2-NEXT: .LBB10_26: # %else24 2725; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 2726; SSE2-NEXT: je .LBB10_28 2727; SSE2-NEXT: # %bb.27: # %cond.store25 2728; SSE2-NEXT: movb %ch, 13(%rdi) 2729; SSE2-NEXT: .LBB10_28: # %else26 2730; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 2731; SSE2-NEXT: pextrw $7, %xmm0, %ecx 2732; SSE2-NEXT: jne .LBB10_29 2733; SSE2-NEXT: # %bb.30: # %else28 2734; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 2735; SSE2-NEXT: jne .LBB10_31 2736; SSE2-NEXT: .LBB10_32: # %else30 2737; SSE2-NEXT: retq 2738; SSE2-NEXT: .LBB10_1: # %cond.store 2739; SSE2-NEXT: movb %cl, (%rdi) 2740; SSE2-NEXT: testb $2, %al 2741; SSE2-NEXT: je .LBB10_4 2742; SSE2-NEXT: .LBB10_3: # %cond.store1 2743; SSE2-NEXT: movb %ch, 1(%rdi) 2744; SSE2-NEXT: testb $4, %al 2745; SSE2-NEXT: je .LBB10_6 2746; SSE2-NEXT: .LBB10_5: # %cond.store3 2747; SSE2-NEXT: movl %ecx, %edx 2748; SSE2-NEXT: shrl $16, %edx 2749; SSE2-NEXT: movb %dl, 2(%rdi) 2750; SSE2-NEXT: testb $8, %al 2751; SSE2-NEXT: jne .LBB10_7 2752; SSE2-NEXT: jmp .LBB10_8 2753; SSE2-NEXT: .LBB10_29: # %cond.store27 2754; SSE2-NEXT: movb %cl, 14(%rdi) 2755; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 2756; SSE2-NEXT: je .LBB10_32 2757; SSE2-NEXT: .LBB10_31: # %cond.store29 2758; SSE2-NEXT: movb %ch, 15(%rdi) 2759; SSE2-NEXT: retq 2760; 2761; SSE4-LABEL: truncstore_v16i32_v16i8: 2762; SSE4: # %bb.0: 2763; SSE4-NEXT: pxor %xmm8, %xmm8 2764; SSE4-NEXT: movdqa {{.*#+}} xmm9 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 2765; SSE4-NEXT: pand %xmm9, %xmm3 2766; SSE4-NEXT: pand %xmm9, %xmm2 2767; SSE4-NEXT: packusdw %xmm3, %xmm2 2768; SSE4-NEXT: pand %xmm9, %xmm1 2769; SSE4-NEXT: pand %xmm9, %xmm0 2770; SSE4-NEXT: packusdw %xmm1, %xmm0 2771; SSE4-NEXT: packuswb %xmm2, %xmm0 2772; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 2773; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 2774; SSE4-NEXT: pxor %xmm1, %xmm7 2775; SSE4-NEXT: pcmpeqd %xmm8, %xmm6 2776; SSE4-NEXT: pxor %xmm1, %xmm6 2777; SSE4-NEXT: packssdw %xmm7, %xmm6 2778; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 2779; SSE4-NEXT: pxor %xmm1, %xmm5 2780; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 2781; SSE4-NEXT: pxor %xmm1, %xmm4 2782; SSE4-NEXT: packssdw %xmm5, %xmm4 2783; SSE4-NEXT: packsswb %xmm6, %xmm4 2784; SSE4-NEXT: pmovmskb %xmm4, %eax 2785; SSE4-NEXT: testb $1, %al 2786; SSE4-NEXT: jne .LBB10_1 2787; SSE4-NEXT: # %bb.2: # %else 2788; SSE4-NEXT: testb $2, %al 2789; SSE4-NEXT: jne .LBB10_3 2790; SSE4-NEXT: .LBB10_4: # %else2 2791; SSE4-NEXT: testb $4, %al 2792; SSE4-NEXT: jne .LBB10_5 2793; SSE4-NEXT: .LBB10_6: # %else4 2794; SSE4-NEXT: testb $8, %al 2795; SSE4-NEXT: jne .LBB10_7 2796; SSE4-NEXT: .LBB10_8: # %else6 2797; SSE4-NEXT: testb $16, %al 2798; SSE4-NEXT: jne .LBB10_9 2799; SSE4-NEXT: .LBB10_10: # %else8 2800; SSE4-NEXT: testb $32, %al 2801; SSE4-NEXT: jne .LBB10_11 2802; SSE4-NEXT: .LBB10_12: # %else10 2803; SSE4-NEXT: testb $64, %al 2804; SSE4-NEXT: jne .LBB10_13 2805; SSE4-NEXT: .LBB10_14: # %else12 2806; SSE4-NEXT: testb $-128, %al 2807; SSE4-NEXT: jne .LBB10_15 2808; SSE4-NEXT: .LBB10_16: # %else14 2809; SSE4-NEXT: testl $256, %eax # imm = 0x100 2810; SSE4-NEXT: jne .LBB10_17 2811; SSE4-NEXT: .LBB10_18: # %else16 2812; SSE4-NEXT: testl $512, %eax # imm = 0x200 2813; SSE4-NEXT: jne .LBB10_19 2814; SSE4-NEXT: .LBB10_20: # %else18 2815; SSE4-NEXT: testl $1024, %eax # imm = 0x400 2816; SSE4-NEXT: jne .LBB10_21 2817; SSE4-NEXT: .LBB10_22: # %else20 2818; SSE4-NEXT: testl $2048, %eax # imm = 0x800 2819; SSE4-NEXT: jne .LBB10_23 2820; SSE4-NEXT: .LBB10_24: # %else22 2821; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 2822; SSE4-NEXT: jne .LBB10_25 2823; SSE4-NEXT: .LBB10_26: # %else24 2824; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 2825; SSE4-NEXT: jne .LBB10_27 2826; SSE4-NEXT: .LBB10_28: # %else26 2827; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 2828; SSE4-NEXT: jne .LBB10_29 2829; SSE4-NEXT: .LBB10_30: # %else28 2830; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 2831; SSE4-NEXT: jne .LBB10_31 2832; SSE4-NEXT: .LBB10_32: # %else30 2833; SSE4-NEXT: retq 2834; SSE4-NEXT: .LBB10_1: # %cond.store 2835; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 2836; SSE4-NEXT: testb $2, %al 2837; SSE4-NEXT: je .LBB10_4 2838; SSE4-NEXT: .LBB10_3: # %cond.store1 2839; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 2840; SSE4-NEXT: testb $4, %al 2841; SSE4-NEXT: je .LBB10_6 2842; SSE4-NEXT: .LBB10_5: # %cond.store3 2843; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 2844; SSE4-NEXT: testb $8, %al 2845; SSE4-NEXT: je .LBB10_8 2846; SSE4-NEXT: .LBB10_7: # %cond.store5 2847; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 2848; SSE4-NEXT: testb $16, %al 2849; SSE4-NEXT: je .LBB10_10 2850; SSE4-NEXT: .LBB10_9: # %cond.store7 2851; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 2852; SSE4-NEXT: testb $32, %al 2853; SSE4-NEXT: je .LBB10_12 2854; SSE4-NEXT: .LBB10_11: # %cond.store9 2855; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 2856; SSE4-NEXT: testb $64, %al 2857; SSE4-NEXT: je .LBB10_14 2858; SSE4-NEXT: .LBB10_13: # %cond.store11 2859; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 2860; SSE4-NEXT: testb $-128, %al 2861; SSE4-NEXT: je .LBB10_16 2862; SSE4-NEXT: .LBB10_15: # %cond.store13 2863; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 2864; SSE4-NEXT: testl $256, %eax # imm = 0x100 2865; SSE4-NEXT: je .LBB10_18 2866; SSE4-NEXT: .LBB10_17: # %cond.store15 2867; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 2868; SSE4-NEXT: testl $512, %eax # imm = 0x200 2869; SSE4-NEXT: je .LBB10_20 2870; SSE4-NEXT: .LBB10_19: # %cond.store17 2871; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 2872; SSE4-NEXT: testl $1024, %eax # imm = 0x400 2873; SSE4-NEXT: je .LBB10_22 2874; SSE4-NEXT: .LBB10_21: # %cond.store19 2875; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 2876; SSE4-NEXT: testl $2048, %eax # imm = 0x800 2877; SSE4-NEXT: je .LBB10_24 2878; SSE4-NEXT: .LBB10_23: # %cond.store21 2879; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 2880; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 2881; SSE4-NEXT: je .LBB10_26 2882; SSE4-NEXT: .LBB10_25: # %cond.store23 2883; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 2884; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 2885; SSE4-NEXT: je .LBB10_28 2886; SSE4-NEXT: .LBB10_27: # %cond.store25 2887; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 2888; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 2889; SSE4-NEXT: je .LBB10_30 2890; SSE4-NEXT: .LBB10_29: # %cond.store27 2891; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 2892; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 2893; SSE4-NEXT: je .LBB10_32 2894; SSE4-NEXT: .LBB10_31: # %cond.store29 2895; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 2896; SSE4-NEXT: retq 2897; 2898; AVX1-LABEL: truncstore_v16i32_v16i8: 2899; AVX1: # %bb.0: 2900; AVX1-NEXT: vmovaps {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255] 2901; AVX1-NEXT: vandps %ymm4, %ymm1, %ymm1 2902; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 2903; AVX1-NEXT: vpackusdw %xmm5, %xmm1, %xmm1 2904; AVX1-NEXT: vandps %ymm4, %ymm0, %ymm0 2905; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 2906; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 2907; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 2908; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 2909; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 2910; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1 2911; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 2912; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 2913; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 2914; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 2915; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1 2916; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 2917; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 2918; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 2919; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 2920; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 2921; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 2922; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1 2923; AVX1-NEXT: vpmovmskb %xmm1, %eax 2924; AVX1-NEXT: testb $1, %al 2925; AVX1-NEXT: jne .LBB10_1 2926; AVX1-NEXT: # %bb.2: # %else 2927; AVX1-NEXT: testb $2, %al 2928; AVX1-NEXT: jne .LBB10_3 2929; AVX1-NEXT: .LBB10_4: # %else2 2930; AVX1-NEXT: testb $4, %al 2931; AVX1-NEXT: jne .LBB10_5 2932; AVX1-NEXT: .LBB10_6: # %else4 2933; AVX1-NEXT: testb $8, %al 2934; AVX1-NEXT: jne .LBB10_7 2935; AVX1-NEXT: .LBB10_8: # %else6 2936; AVX1-NEXT: testb $16, %al 2937; AVX1-NEXT: jne .LBB10_9 2938; AVX1-NEXT: .LBB10_10: # %else8 2939; AVX1-NEXT: testb $32, %al 2940; AVX1-NEXT: jne .LBB10_11 2941; AVX1-NEXT: .LBB10_12: # %else10 2942; AVX1-NEXT: testb $64, %al 2943; AVX1-NEXT: jne .LBB10_13 2944; AVX1-NEXT: .LBB10_14: # %else12 2945; AVX1-NEXT: testb $-128, %al 2946; AVX1-NEXT: jne .LBB10_15 2947; AVX1-NEXT: .LBB10_16: # %else14 2948; AVX1-NEXT: testl $256, %eax # imm = 0x100 2949; AVX1-NEXT: jne .LBB10_17 2950; AVX1-NEXT: .LBB10_18: # %else16 2951; AVX1-NEXT: testl $512, %eax # imm = 0x200 2952; AVX1-NEXT: jne .LBB10_19 2953; AVX1-NEXT: .LBB10_20: # %else18 2954; AVX1-NEXT: testl $1024, %eax # imm = 0x400 2955; AVX1-NEXT: jne .LBB10_21 2956; AVX1-NEXT: .LBB10_22: # %else20 2957; AVX1-NEXT: testl $2048, %eax # imm = 0x800 2958; AVX1-NEXT: jne .LBB10_23 2959; AVX1-NEXT: .LBB10_24: # %else22 2960; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 2961; AVX1-NEXT: jne .LBB10_25 2962; AVX1-NEXT: .LBB10_26: # %else24 2963; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 2964; AVX1-NEXT: jne .LBB10_27 2965; AVX1-NEXT: .LBB10_28: # %else26 2966; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 2967; AVX1-NEXT: jne .LBB10_29 2968; AVX1-NEXT: .LBB10_30: # %else28 2969; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 2970; AVX1-NEXT: jne .LBB10_31 2971; AVX1-NEXT: .LBB10_32: # %else30 2972; AVX1-NEXT: vzeroupper 2973; AVX1-NEXT: retq 2974; AVX1-NEXT: .LBB10_1: # %cond.store 2975; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 2976; AVX1-NEXT: testb $2, %al 2977; AVX1-NEXT: je .LBB10_4 2978; AVX1-NEXT: .LBB10_3: # %cond.store1 2979; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2980; AVX1-NEXT: testb $4, %al 2981; AVX1-NEXT: je .LBB10_6 2982; AVX1-NEXT: .LBB10_5: # %cond.store3 2983; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 2984; AVX1-NEXT: testb $8, %al 2985; AVX1-NEXT: je .LBB10_8 2986; AVX1-NEXT: .LBB10_7: # %cond.store5 2987; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 2988; AVX1-NEXT: testb $16, %al 2989; AVX1-NEXT: je .LBB10_10 2990; AVX1-NEXT: .LBB10_9: # %cond.store7 2991; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 2992; AVX1-NEXT: testb $32, %al 2993; AVX1-NEXT: je .LBB10_12 2994; AVX1-NEXT: .LBB10_11: # %cond.store9 2995; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 2996; AVX1-NEXT: testb $64, %al 2997; AVX1-NEXT: je .LBB10_14 2998; AVX1-NEXT: .LBB10_13: # %cond.store11 2999; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3000; AVX1-NEXT: testb $-128, %al 3001; AVX1-NEXT: je .LBB10_16 3002; AVX1-NEXT: .LBB10_15: # %cond.store13 3003; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3004; AVX1-NEXT: testl $256, %eax # imm = 0x100 3005; AVX1-NEXT: je .LBB10_18 3006; AVX1-NEXT: .LBB10_17: # %cond.store15 3007; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 3008; AVX1-NEXT: testl $512, %eax # imm = 0x200 3009; AVX1-NEXT: je .LBB10_20 3010; AVX1-NEXT: .LBB10_19: # %cond.store17 3011; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 3012; AVX1-NEXT: testl $1024, %eax # imm = 0x400 3013; AVX1-NEXT: je .LBB10_22 3014; AVX1-NEXT: .LBB10_21: # %cond.store19 3015; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 3016; AVX1-NEXT: testl $2048, %eax # imm = 0x800 3017; AVX1-NEXT: je .LBB10_24 3018; AVX1-NEXT: .LBB10_23: # %cond.store21 3019; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 3020; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 3021; AVX1-NEXT: je .LBB10_26 3022; AVX1-NEXT: .LBB10_25: # %cond.store23 3023; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 3024; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 3025; AVX1-NEXT: je .LBB10_28 3026; AVX1-NEXT: .LBB10_27: # %cond.store25 3027; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 3028; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 3029; AVX1-NEXT: je .LBB10_30 3030; AVX1-NEXT: .LBB10_29: # %cond.store27 3031; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 3032; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 3033; AVX1-NEXT: je .LBB10_32 3034; AVX1-NEXT: .LBB10_31: # %cond.store29 3035; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 3036; AVX1-NEXT: vzeroupper 3037; AVX1-NEXT: retq 3038; 3039; AVX2-LABEL: truncstore_v16i32_v16i8: 3040; AVX2: # %bb.0: 3041; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 3042; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255] 3043; AVX2-NEXT: vpand %ymm5, %ymm1, %ymm1 3044; AVX2-NEXT: vpand %ymm5, %ymm0, %ymm0 3045; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 3046; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3047; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 3048; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 3049; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1 3050; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 3051; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 3052; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 3053; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 3054; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1 3055; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 3056; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1 3057; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 3058; AVX2-NEXT: vpmovmskb %xmm1, %eax 3059; AVX2-NEXT: testb $1, %al 3060; AVX2-NEXT: jne .LBB10_1 3061; AVX2-NEXT: # %bb.2: # %else 3062; AVX2-NEXT: testb $2, %al 3063; AVX2-NEXT: jne .LBB10_3 3064; AVX2-NEXT: .LBB10_4: # %else2 3065; AVX2-NEXT: testb $4, %al 3066; AVX2-NEXT: jne .LBB10_5 3067; AVX2-NEXT: .LBB10_6: # %else4 3068; AVX2-NEXT: testb $8, %al 3069; AVX2-NEXT: jne .LBB10_7 3070; AVX2-NEXT: .LBB10_8: # %else6 3071; AVX2-NEXT: testb $16, %al 3072; AVX2-NEXT: jne .LBB10_9 3073; AVX2-NEXT: .LBB10_10: # %else8 3074; AVX2-NEXT: testb $32, %al 3075; AVX2-NEXT: jne .LBB10_11 3076; AVX2-NEXT: .LBB10_12: # %else10 3077; AVX2-NEXT: testb $64, %al 3078; AVX2-NEXT: jne .LBB10_13 3079; AVX2-NEXT: .LBB10_14: # %else12 3080; AVX2-NEXT: testb $-128, %al 3081; AVX2-NEXT: jne .LBB10_15 3082; AVX2-NEXT: .LBB10_16: # %else14 3083; AVX2-NEXT: testl $256, %eax # imm = 0x100 3084; AVX2-NEXT: jne .LBB10_17 3085; AVX2-NEXT: .LBB10_18: # %else16 3086; AVX2-NEXT: testl $512, %eax # imm = 0x200 3087; AVX2-NEXT: jne .LBB10_19 3088; AVX2-NEXT: .LBB10_20: # %else18 3089; AVX2-NEXT: testl $1024, %eax # imm = 0x400 3090; AVX2-NEXT: jne .LBB10_21 3091; AVX2-NEXT: .LBB10_22: # %else20 3092; AVX2-NEXT: testl $2048, %eax # imm = 0x800 3093; AVX2-NEXT: jne .LBB10_23 3094; AVX2-NEXT: .LBB10_24: # %else22 3095; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 3096; AVX2-NEXT: jne .LBB10_25 3097; AVX2-NEXT: .LBB10_26: # %else24 3098; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 3099; AVX2-NEXT: jne .LBB10_27 3100; AVX2-NEXT: .LBB10_28: # %else26 3101; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 3102; AVX2-NEXT: jne .LBB10_29 3103; AVX2-NEXT: .LBB10_30: # %else28 3104; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 3105; AVX2-NEXT: jne .LBB10_31 3106; AVX2-NEXT: .LBB10_32: # %else30 3107; AVX2-NEXT: vzeroupper 3108; AVX2-NEXT: retq 3109; AVX2-NEXT: .LBB10_1: # %cond.store 3110; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 3111; AVX2-NEXT: testb $2, %al 3112; AVX2-NEXT: je .LBB10_4 3113; AVX2-NEXT: .LBB10_3: # %cond.store1 3114; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 3115; AVX2-NEXT: testb $4, %al 3116; AVX2-NEXT: je .LBB10_6 3117; AVX2-NEXT: .LBB10_5: # %cond.store3 3118; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 3119; AVX2-NEXT: testb $8, %al 3120; AVX2-NEXT: je .LBB10_8 3121; AVX2-NEXT: .LBB10_7: # %cond.store5 3122; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 3123; AVX2-NEXT: testb $16, %al 3124; AVX2-NEXT: je .LBB10_10 3125; AVX2-NEXT: .LBB10_9: # %cond.store7 3126; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 3127; AVX2-NEXT: testb $32, %al 3128; AVX2-NEXT: je .LBB10_12 3129; AVX2-NEXT: .LBB10_11: # %cond.store9 3130; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 3131; AVX2-NEXT: testb $64, %al 3132; AVX2-NEXT: je .LBB10_14 3133; AVX2-NEXT: .LBB10_13: # %cond.store11 3134; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3135; AVX2-NEXT: testb $-128, %al 3136; AVX2-NEXT: je .LBB10_16 3137; AVX2-NEXT: .LBB10_15: # %cond.store13 3138; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3139; AVX2-NEXT: testl $256, %eax # imm = 0x100 3140; AVX2-NEXT: je .LBB10_18 3141; AVX2-NEXT: .LBB10_17: # %cond.store15 3142; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 3143; AVX2-NEXT: testl $512, %eax # imm = 0x200 3144; AVX2-NEXT: je .LBB10_20 3145; AVX2-NEXT: .LBB10_19: # %cond.store17 3146; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 3147; AVX2-NEXT: testl $1024, %eax # imm = 0x400 3148; AVX2-NEXT: je .LBB10_22 3149; AVX2-NEXT: .LBB10_21: # %cond.store19 3150; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 3151; AVX2-NEXT: testl $2048, %eax # imm = 0x800 3152; AVX2-NEXT: je .LBB10_24 3153; AVX2-NEXT: .LBB10_23: # %cond.store21 3154; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 3155; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 3156; AVX2-NEXT: je .LBB10_26 3157; AVX2-NEXT: .LBB10_25: # %cond.store23 3158; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 3159; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 3160; AVX2-NEXT: je .LBB10_28 3161; AVX2-NEXT: .LBB10_27: # %cond.store25 3162; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 3163; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 3164; AVX2-NEXT: je .LBB10_30 3165; AVX2-NEXT: .LBB10_29: # %cond.store27 3166; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 3167; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 3168; AVX2-NEXT: je .LBB10_32 3169; AVX2-NEXT: .LBB10_31: # %cond.store29 3170; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 3171; AVX2-NEXT: vzeroupper 3172; AVX2-NEXT: retq 3173; 3174; AVX512F-LABEL: truncstore_v16i32_v16i8: 3175; AVX512F: # %bb.0: 3176; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 3177; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3178; AVX512F-NEXT: kmovw %k0, %eax 3179; AVX512F-NEXT: testb $1, %al 3180; AVX512F-NEXT: jne .LBB10_1 3181; AVX512F-NEXT: # %bb.2: # %else 3182; AVX512F-NEXT: testb $2, %al 3183; AVX512F-NEXT: jne .LBB10_3 3184; AVX512F-NEXT: .LBB10_4: # %else2 3185; AVX512F-NEXT: testb $4, %al 3186; AVX512F-NEXT: jne .LBB10_5 3187; AVX512F-NEXT: .LBB10_6: # %else4 3188; AVX512F-NEXT: testb $8, %al 3189; AVX512F-NEXT: jne .LBB10_7 3190; AVX512F-NEXT: .LBB10_8: # %else6 3191; AVX512F-NEXT: testb $16, %al 3192; AVX512F-NEXT: jne .LBB10_9 3193; AVX512F-NEXT: .LBB10_10: # %else8 3194; AVX512F-NEXT: testb $32, %al 3195; AVX512F-NEXT: jne .LBB10_11 3196; AVX512F-NEXT: .LBB10_12: # %else10 3197; AVX512F-NEXT: testb $64, %al 3198; AVX512F-NEXT: jne .LBB10_13 3199; AVX512F-NEXT: .LBB10_14: # %else12 3200; AVX512F-NEXT: testb $-128, %al 3201; AVX512F-NEXT: jne .LBB10_15 3202; AVX512F-NEXT: .LBB10_16: # %else14 3203; AVX512F-NEXT: testl $256, %eax # imm = 0x100 3204; AVX512F-NEXT: jne .LBB10_17 3205; AVX512F-NEXT: .LBB10_18: # %else16 3206; AVX512F-NEXT: testl $512, %eax # imm = 0x200 3207; AVX512F-NEXT: jne .LBB10_19 3208; AVX512F-NEXT: .LBB10_20: # %else18 3209; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 3210; AVX512F-NEXT: jne .LBB10_21 3211; AVX512F-NEXT: .LBB10_22: # %else20 3212; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 3213; AVX512F-NEXT: jne .LBB10_23 3214; AVX512F-NEXT: .LBB10_24: # %else22 3215; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 3216; AVX512F-NEXT: jne .LBB10_25 3217; AVX512F-NEXT: .LBB10_26: # %else24 3218; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 3219; AVX512F-NEXT: jne .LBB10_27 3220; AVX512F-NEXT: .LBB10_28: # %else26 3221; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 3222; AVX512F-NEXT: jne .LBB10_29 3223; AVX512F-NEXT: .LBB10_30: # %else28 3224; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 3225; AVX512F-NEXT: jne .LBB10_31 3226; AVX512F-NEXT: .LBB10_32: # %else30 3227; AVX512F-NEXT: vzeroupper 3228; AVX512F-NEXT: retq 3229; AVX512F-NEXT: .LBB10_1: # %cond.store 3230; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 3231; AVX512F-NEXT: testb $2, %al 3232; AVX512F-NEXT: je .LBB10_4 3233; AVX512F-NEXT: .LBB10_3: # %cond.store1 3234; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 3235; AVX512F-NEXT: testb $4, %al 3236; AVX512F-NEXT: je .LBB10_6 3237; AVX512F-NEXT: .LBB10_5: # %cond.store3 3238; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 3239; AVX512F-NEXT: testb $8, %al 3240; AVX512F-NEXT: je .LBB10_8 3241; AVX512F-NEXT: .LBB10_7: # %cond.store5 3242; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 3243; AVX512F-NEXT: testb $16, %al 3244; AVX512F-NEXT: je .LBB10_10 3245; AVX512F-NEXT: .LBB10_9: # %cond.store7 3246; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 3247; AVX512F-NEXT: testb $32, %al 3248; AVX512F-NEXT: je .LBB10_12 3249; AVX512F-NEXT: .LBB10_11: # %cond.store9 3250; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 3251; AVX512F-NEXT: testb $64, %al 3252; AVX512F-NEXT: je .LBB10_14 3253; AVX512F-NEXT: .LBB10_13: # %cond.store11 3254; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3255; AVX512F-NEXT: testb $-128, %al 3256; AVX512F-NEXT: je .LBB10_16 3257; AVX512F-NEXT: .LBB10_15: # %cond.store13 3258; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3259; AVX512F-NEXT: testl $256, %eax # imm = 0x100 3260; AVX512F-NEXT: je .LBB10_18 3261; AVX512F-NEXT: .LBB10_17: # %cond.store15 3262; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 3263; AVX512F-NEXT: testl $512, %eax # imm = 0x200 3264; AVX512F-NEXT: je .LBB10_20 3265; AVX512F-NEXT: .LBB10_19: # %cond.store17 3266; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 3267; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 3268; AVX512F-NEXT: je .LBB10_22 3269; AVX512F-NEXT: .LBB10_21: # %cond.store19 3270; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 3271; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 3272; AVX512F-NEXT: je .LBB10_24 3273; AVX512F-NEXT: .LBB10_23: # %cond.store21 3274; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 3275; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 3276; AVX512F-NEXT: je .LBB10_26 3277; AVX512F-NEXT: .LBB10_25: # %cond.store23 3278; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 3279; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 3280; AVX512F-NEXT: je .LBB10_28 3281; AVX512F-NEXT: .LBB10_27: # %cond.store25 3282; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 3283; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 3284; AVX512F-NEXT: je .LBB10_30 3285; AVX512F-NEXT: .LBB10_29: # %cond.store27 3286; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 3287; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 3288; AVX512F-NEXT: je .LBB10_32 3289; AVX512F-NEXT: .LBB10_31: # %cond.store29 3290; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 3291; AVX512F-NEXT: vzeroupper 3292; AVX512F-NEXT: retq 3293; 3294; AVX512BW-LABEL: truncstore_v16i32_v16i8: 3295; AVX512BW: # %bb.0: 3296; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 3297; AVX512BW-NEXT: vpmovdb %zmm0, (%rdi) {%k1} 3298; AVX512BW-NEXT: vzeroupper 3299; AVX512BW-NEXT: retq 3300; 3301; AVX512BWVL-LABEL: truncstore_v16i32_v16i8: 3302; AVX512BWVL: # %bb.0: 3303; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1 3304; AVX512BWVL-NEXT: vpmovdb %zmm0, (%rdi) {%k1} 3305; AVX512BWVL-NEXT: vzeroupper 3306; AVX512BWVL-NEXT: retq 3307 %a = icmp ne <16 x i32> %mask, zeroinitializer 3308 %b = trunc <16 x i32> %x to <16 x i8> 3309 call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %b, <16 x i8>* %p, i32 1, <16 x i1> %a) 3310 ret void 3311} 3312 3313define void @truncstore_v8i32_v8i16(<8 x i32> %x, <8 x i16>* %p, <8 x i32> %mask) { 3314; SSE2-LABEL: truncstore_v8i32_v8i16: 3315; SSE2: # %bb.0: 3316; SSE2-NEXT: pxor %xmm4, %xmm4 3317; SSE2-NEXT: pslld $16, %xmm1 3318; SSE2-NEXT: psrad $16, %xmm1 3319; SSE2-NEXT: pslld $16, %xmm0 3320; SSE2-NEXT: psrad $16, %xmm0 3321; SSE2-NEXT: packssdw %xmm1, %xmm0 3322; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 3323; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 3324; SSE2-NEXT: pxor %xmm1, %xmm3 3325; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 3326; SSE2-NEXT: pxor %xmm1, %xmm2 3327; SSE2-NEXT: packssdw %xmm3, %xmm2 3328; SSE2-NEXT: packsswb %xmm2, %xmm2 3329; SSE2-NEXT: pmovmskb %xmm2, %eax 3330; SSE2-NEXT: testb $1, %al 3331; SSE2-NEXT: jne .LBB11_1 3332; SSE2-NEXT: # %bb.2: # %else 3333; SSE2-NEXT: testb $2, %al 3334; SSE2-NEXT: jne .LBB11_3 3335; SSE2-NEXT: .LBB11_4: # %else2 3336; SSE2-NEXT: testb $4, %al 3337; SSE2-NEXT: jne .LBB11_5 3338; SSE2-NEXT: .LBB11_6: # %else4 3339; SSE2-NEXT: testb $8, %al 3340; SSE2-NEXT: jne .LBB11_7 3341; SSE2-NEXT: .LBB11_8: # %else6 3342; SSE2-NEXT: testb $16, %al 3343; SSE2-NEXT: jne .LBB11_9 3344; SSE2-NEXT: .LBB11_10: # %else8 3345; SSE2-NEXT: testb $32, %al 3346; SSE2-NEXT: jne .LBB11_11 3347; SSE2-NEXT: .LBB11_12: # %else10 3348; SSE2-NEXT: testb $64, %al 3349; SSE2-NEXT: jne .LBB11_13 3350; SSE2-NEXT: .LBB11_14: # %else12 3351; SSE2-NEXT: testb $-128, %al 3352; SSE2-NEXT: jne .LBB11_15 3353; SSE2-NEXT: .LBB11_16: # %else14 3354; SSE2-NEXT: retq 3355; SSE2-NEXT: .LBB11_1: # %cond.store 3356; SSE2-NEXT: movd %xmm0, %ecx 3357; SSE2-NEXT: movw %cx, (%rdi) 3358; SSE2-NEXT: testb $2, %al 3359; SSE2-NEXT: je .LBB11_4 3360; SSE2-NEXT: .LBB11_3: # %cond.store1 3361; SSE2-NEXT: pextrw $1, %xmm0, %ecx 3362; SSE2-NEXT: movw %cx, 2(%rdi) 3363; SSE2-NEXT: testb $4, %al 3364; SSE2-NEXT: je .LBB11_6 3365; SSE2-NEXT: .LBB11_5: # %cond.store3 3366; SSE2-NEXT: pextrw $2, %xmm0, %ecx 3367; SSE2-NEXT: movw %cx, 4(%rdi) 3368; SSE2-NEXT: testb $8, %al 3369; SSE2-NEXT: je .LBB11_8 3370; SSE2-NEXT: .LBB11_7: # %cond.store5 3371; SSE2-NEXT: pextrw $3, %xmm0, %ecx 3372; SSE2-NEXT: movw %cx, 6(%rdi) 3373; SSE2-NEXT: testb $16, %al 3374; SSE2-NEXT: je .LBB11_10 3375; SSE2-NEXT: .LBB11_9: # %cond.store7 3376; SSE2-NEXT: pextrw $4, %xmm0, %ecx 3377; SSE2-NEXT: movw %cx, 8(%rdi) 3378; SSE2-NEXT: testb $32, %al 3379; SSE2-NEXT: je .LBB11_12 3380; SSE2-NEXT: .LBB11_11: # %cond.store9 3381; SSE2-NEXT: pextrw $5, %xmm0, %ecx 3382; SSE2-NEXT: movw %cx, 10(%rdi) 3383; SSE2-NEXT: testb $64, %al 3384; SSE2-NEXT: je .LBB11_14 3385; SSE2-NEXT: .LBB11_13: # %cond.store11 3386; SSE2-NEXT: pextrw $6, %xmm0, %ecx 3387; SSE2-NEXT: movw %cx, 12(%rdi) 3388; SSE2-NEXT: testb $-128, %al 3389; SSE2-NEXT: je .LBB11_16 3390; SSE2-NEXT: .LBB11_15: # %cond.store13 3391; SSE2-NEXT: pextrw $7, %xmm0, %eax 3392; SSE2-NEXT: movw %ax, 14(%rdi) 3393; SSE2-NEXT: retq 3394; 3395; SSE4-LABEL: truncstore_v8i32_v8i16: 3396; SSE4: # %bb.0: 3397; SSE4-NEXT: pxor %xmm4, %xmm4 3398; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm4[1],xmm1[2],xmm4[3],xmm1[4],xmm4[5],xmm1[6],xmm4[7] 3399; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm4[1],xmm0[2],xmm4[3],xmm0[4],xmm4[5],xmm0[6],xmm4[7] 3400; SSE4-NEXT: packusdw %xmm1, %xmm0 3401; SSE4-NEXT: pcmpeqd %xmm4, %xmm3 3402; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 3403; SSE4-NEXT: pxor %xmm1, %xmm3 3404; SSE4-NEXT: pcmpeqd %xmm4, %xmm2 3405; SSE4-NEXT: pxor %xmm1, %xmm2 3406; SSE4-NEXT: packssdw %xmm3, %xmm2 3407; SSE4-NEXT: packsswb %xmm2, %xmm2 3408; SSE4-NEXT: pmovmskb %xmm2, %eax 3409; SSE4-NEXT: testb $1, %al 3410; SSE4-NEXT: jne .LBB11_1 3411; SSE4-NEXT: # %bb.2: # %else 3412; SSE4-NEXT: testb $2, %al 3413; SSE4-NEXT: jne .LBB11_3 3414; SSE4-NEXT: .LBB11_4: # %else2 3415; SSE4-NEXT: testb $4, %al 3416; SSE4-NEXT: jne .LBB11_5 3417; SSE4-NEXT: .LBB11_6: # %else4 3418; SSE4-NEXT: testb $8, %al 3419; SSE4-NEXT: jne .LBB11_7 3420; SSE4-NEXT: .LBB11_8: # %else6 3421; SSE4-NEXT: testb $16, %al 3422; SSE4-NEXT: jne .LBB11_9 3423; SSE4-NEXT: .LBB11_10: # %else8 3424; SSE4-NEXT: testb $32, %al 3425; SSE4-NEXT: jne .LBB11_11 3426; SSE4-NEXT: .LBB11_12: # %else10 3427; SSE4-NEXT: testb $64, %al 3428; SSE4-NEXT: jne .LBB11_13 3429; SSE4-NEXT: .LBB11_14: # %else12 3430; SSE4-NEXT: testb $-128, %al 3431; SSE4-NEXT: jne .LBB11_15 3432; SSE4-NEXT: .LBB11_16: # %else14 3433; SSE4-NEXT: retq 3434; SSE4-NEXT: .LBB11_1: # %cond.store 3435; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 3436; SSE4-NEXT: testb $2, %al 3437; SSE4-NEXT: je .LBB11_4 3438; SSE4-NEXT: .LBB11_3: # %cond.store1 3439; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 3440; SSE4-NEXT: testb $4, %al 3441; SSE4-NEXT: je .LBB11_6 3442; SSE4-NEXT: .LBB11_5: # %cond.store3 3443; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 3444; SSE4-NEXT: testb $8, %al 3445; SSE4-NEXT: je .LBB11_8 3446; SSE4-NEXT: .LBB11_7: # %cond.store5 3447; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 3448; SSE4-NEXT: testb $16, %al 3449; SSE4-NEXT: je .LBB11_10 3450; SSE4-NEXT: .LBB11_9: # %cond.store7 3451; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) 3452; SSE4-NEXT: testb $32, %al 3453; SSE4-NEXT: je .LBB11_12 3454; SSE4-NEXT: .LBB11_11: # %cond.store9 3455; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) 3456; SSE4-NEXT: testb $64, %al 3457; SSE4-NEXT: je .LBB11_14 3458; SSE4-NEXT: .LBB11_13: # %cond.store11 3459; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) 3460; SSE4-NEXT: testb $-128, %al 3461; SSE4-NEXT: je .LBB11_16 3462; SSE4-NEXT: .LBB11_15: # %cond.store13 3463; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) 3464; SSE4-NEXT: retq 3465; 3466; AVX1-LABEL: truncstore_v8i32_v8i16: 3467; AVX1: # %bb.0: 3468; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3469; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = <0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u> 3470; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3471; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 3472; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm2[0] 3473; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3474; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 3475; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 3476; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 3477; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 3478; AVX1-NEXT: vmovmskps %ymm1, %eax 3479; AVX1-NEXT: notl %eax 3480; AVX1-NEXT: testb $1, %al 3481; AVX1-NEXT: jne .LBB11_1 3482; AVX1-NEXT: # %bb.2: # %else 3483; AVX1-NEXT: testb $2, %al 3484; AVX1-NEXT: jne .LBB11_3 3485; AVX1-NEXT: .LBB11_4: # %else2 3486; AVX1-NEXT: testb $4, %al 3487; AVX1-NEXT: jne .LBB11_5 3488; AVX1-NEXT: .LBB11_6: # %else4 3489; AVX1-NEXT: testb $8, %al 3490; AVX1-NEXT: jne .LBB11_7 3491; AVX1-NEXT: .LBB11_8: # %else6 3492; AVX1-NEXT: testb $16, %al 3493; AVX1-NEXT: jne .LBB11_9 3494; AVX1-NEXT: .LBB11_10: # %else8 3495; AVX1-NEXT: testb $32, %al 3496; AVX1-NEXT: jne .LBB11_11 3497; AVX1-NEXT: .LBB11_12: # %else10 3498; AVX1-NEXT: testb $64, %al 3499; AVX1-NEXT: jne .LBB11_13 3500; AVX1-NEXT: .LBB11_14: # %else12 3501; AVX1-NEXT: testb $-128, %al 3502; AVX1-NEXT: jne .LBB11_15 3503; AVX1-NEXT: .LBB11_16: # %else14 3504; AVX1-NEXT: vzeroupper 3505; AVX1-NEXT: retq 3506; AVX1-NEXT: .LBB11_1: # %cond.store 3507; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 3508; AVX1-NEXT: testb $2, %al 3509; AVX1-NEXT: je .LBB11_4 3510; AVX1-NEXT: .LBB11_3: # %cond.store1 3511; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3512; AVX1-NEXT: testb $4, %al 3513; AVX1-NEXT: je .LBB11_6 3514; AVX1-NEXT: .LBB11_5: # %cond.store3 3515; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3516; AVX1-NEXT: testb $8, %al 3517; AVX1-NEXT: je .LBB11_8 3518; AVX1-NEXT: .LBB11_7: # %cond.store5 3519; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3520; AVX1-NEXT: testb $16, %al 3521; AVX1-NEXT: je .LBB11_10 3522; AVX1-NEXT: .LBB11_9: # %cond.store7 3523; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3524; AVX1-NEXT: testb $32, %al 3525; AVX1-NEXT: je .LBB11_12 3526; AVX1-NEXT: .LBB11_11: # %cond.store9 3527; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3528; AVX1-NEXT: testb $64, %al 3529; AVX1-NEXT: je .LBB11_14 3530; AVX1-NEXT: .LBB11_13: # %cond.store11 3531; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3532; AVX1-NEXT: testb $-128, %al 3533; AVX1-NEXT: je .LBB11_16 3534; AVX1-NEXT: .LBB11_15: # %cond.store13 3535; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3536; AVX1-NEXT: vzeroupper 3537; AVX1-NEXT: retq 3538; 3539; AVX2-LABEL: truncstore_v8i32_v8i16: 3540; AVX2: # %bb.0: 3541; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 3542; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u] 3543; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] 3544; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 3545; AVX2-NEXT: vmovmskps %ymm1, %eax 3546; AVX2-NEXT: notl %eax 3547; AVX2-NEXT: testb $1, %al 3548; AVX2-NEXT: jne .LBB11_1 3549; AVX2-NEXT: # %bb.2: # %else 3550; AVX2-NEXT: testb $2, %al 3551; AVX2-NEXT: jne .LBB11_3 3552; AVX2-NEXT: .LBB11_4: # %else2 3553; AVX2-NEXT: testb $4, %al 3554; AVX2-NEXT: jne .LBB11_5 3555; AVX2-NEXT: .LBB11_6: # %else4 3556; AVX2-NEXT: testb $8, %al 3557; AVX2-NEXT: jne .LBB11_7 3558; AVX2-NEXT: .LBB11_8: # %else6 3559; AVX2-NEXT: testb $16, %al 3560; AVX2-NEXT: jne .LBB11_9 3561; AVX2-NEXT: .LBB11_10: # %else8 3562; AVX2-NEXT: testb $32, %al 3563; AVX2-NEXT: jne .LBB11_11 3564; AVX2-NEXT: .LBB11_12: # %else10 3565; AVX2-NEXT: testb $64, %al 3566; AVX2-NEXT: jne .LBB11_13 3567; AVX2-NEXT: .LBB11_14: # %else12 3568; AVX2-NEXT: testb $-128, %al 3569; AVX2-NEXT: jne .LBB11_15 3570; AVX2-NEXT: .LBB11_16: # %else14 3571; AVX2-NEXT: vzeroupper 3572; AVX2-NEXT: retq 3573; AVX2-NEXT: .LBB11_1: # %cond.store 3574; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 3575; AVX2-NEXT: testb $2, %al 3576; AVX2-NEXT: je .LBB11_4 3577; AVX2-NEXT: .LBB11_3: # %cond.store1 3578; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3579; AVX2-NEXT: testb $4, %al 3580; AVX2-NEXT: je .LBB11_6 3581; AVX2-NEXT: .LBB11_5: # %cond.store3 3582; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3583; AVX2-NEXT: testb $8, %al 3584; AVX2-NEXT: je .LBB11_8 3585; AVX2-NEXT: .LBB11_7: # %cond.store5 3586; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3587; AVX2-NEXT: testb $16, %al 3588; AVX2-NEXT: je .LBB11_10 3589; AVX2-NEXT: .LBB11_9: # %cond.store7 3590; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3591; AVX2-NEXT: testb $32, %al 3592; AVX2-NEXT: je .LBB11_12 3593; AVX2-NEXT: .LBB11_11: # %cond.store9 3594; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3595; AVX2-NEXT: testb $64, %al 3596; AVX2-NEXT: je .LBB11_14 3597; AVX2-NEXT: .LBB11_13: # %cond.store11 3598; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3599; AVX2-NEXT: testb $-128, %al 3600; AVX2-NEXT: je .LBB11_16 3601; AVX2-NEXT: .LBB11_15: # %cond.store13 3602; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3603; AVX2-NEXT: vzeroupper 3604; AVX2-NEXT: retq 3605; 3606; AVX512F-LABEL: truncstore_v8i32_v8i16: 3607; AVX512F: # %bb.0: 3608; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 3609; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3610; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 3611; AVX512F-NEXT: vpmovdw %zmm0, %ymm0 3612; AVX512F-NEXT: kmovw %k0, %eax 3613; AVX512F-NEXT: testb $1, %al 3614; AVX512F-NEXT: jne .LBB11_1 3615; AVX512F-NEXT: # %bb.2: # %else 3616; AVX512F-NEXT: testb $2, %al 3617; AVX512F-NEXT: jne .LBB11_3 3618; AVX512F-NEXT: .LBB11_4: # %else2 3619; AVX512F-NEXT: testb $4, %al 3620; AVX512F-NEXT: jne .LBB11_5 3621; AVX512F-NEXT: .LBB11_6: # %else4 3622; AVX512F-NEXT: testb $8, %al 3623; AVX512F-NEXT: jne .LBB11_7 3624; AVX512F-NEXT: .LBB11_8: # %else6 3625; AVX512F-NEXT: testb $16, %al 3626; AVX512F-NEXT: jne .LBB11_9 3627; AVX512F-NEXT: .LBB11_10: # %else8 3628; AVX512F-NEXT: testb $32, %al 3629; AVX512F-NEXT: jne .LBB11_11 3630; AVX512F-NEXT: .LBB11_12: # %else10 3631; AVX512F-NEXT: testb $64, %al 3632; AVX512F-NEXT: jne .LBB11_13 3633; AVX512F-NEXT: .LBB11_14: # %else12 3634; AVX512F-NEXT: testb $-128, %al 3635; AVX512F-NEXT: jne .LBB11_15 3636; AVX512F-NEXT: .LBB11_16: # %else14 3637; AVX512F-NEXT: vzeroupper 3638; AVX512F-NEXT: retq 3639; AVX512F-NEXT: .LBB11_1: # %cond.store 3640; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 3641; AVX512F-NEXT: testb $2, %al 3642; AVX512F-NEXT: je .LBB11_4 3643; AVX512F-NEXT: .LBB11_3: # %cond.store1 3644; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3645; AVX512F-NEXT: testb $4, %al 3646; AVX512F-NEXT: je .LBB11_6 3647; AVX512F-NEXT: .LBB11_5: # %cond.store3 3648; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3649; AVX512F-NEXT: testb $8, %al 3650; AVX512F-NEXT: je .LBB11_8 3651; AVX512F-NEXT: .LBB11_7: # %cond.store5 3652; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3653; AVX512F-NEXT: testb $16, %al 3654; AVX512F-NEXT: je .LBB11_10 3655; AVX512F-NEXT: .LBB11_9: # %cond.store7 3656; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3657; AVX512F-NEXT: testb $32, %al 3658; AVX512F-NEXT: je .LBB11_12 3659; AVX512F-NEXT: .LBB11_11: # %cond.store9 3660; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3661; AVX512F-NEXT: testb $64, %al 3662; AVX512F-NEXT: je .LBB11_14 3663; AVX512F-NEXT: .LBB11_13: # %cond.store11 3664; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3665; AVX512F-NEXT: testb $-128, %al 3666; AVX512F-NEXT: je .LBB11_16 3667; AVX512F-NEXT: .LBB11_15: # %cond.store13 3668; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3669; AVX512F-NEXT: vzeroupper 3670; AVX512F-NEXT: retq 3671; 3672; AVX512BW-LABEL: truncstore_v8i32_v8i16: 3673; AVX512BW: # %bb.0: 3674; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 3675; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3676; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 3677; AVX512BW-NEXT: kshiftld $24, %k0, %k0 3678; AVX512BW-NEXT: kshiftrd $24, %k0, %k1 3679; AVX512BW-NEXT: vpmovdw %zmm0, %ymm0 3680; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 3681; AVX512BW-NEXT: vzeroupper 3682; AVX512BW-NEXT: retq 3683; 3684; AVX512BWVL-LABEL: truncstore_v8i32_v8i16: 3685; AVX512BWVL: # %bb.0: 3686; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 3687; AVX512BWVL-NEXT: vpmovdw %ymm0, (%rdi) {%k1} 3688; AVX512BWVL-NEXT: vzeroupper 3689; AVX512BWVL-NEXT: retq 3690 %a = icmp ne <8 x i32> %mask, zeroinitializer 3691 %b = trunc <8 x i32> %x to <8 x i16> 3692 call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %b, <8 x i16>* %p, i32 1, <8 x i1> %a) 3693 ret void 3694} 3695 3696define void @truncstore_v8i32_v8i8(<8 x i32> %x, <8 x i8>* %p, <8 x i32> %mask) { 3697; SSE2-LABEL: truncstore_v8i32_v8i8: 3698; SSE2: # %bb.0: 3699; SSE2-NEXT: pxor %xmm4, %xmm4 3700; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] 3701; SSE2-NEXT: pand %xmm5, %xmm1 3702; SSE2-NEXT: pand %xmm5, %xmm0 3703; SSE2-NEXT: packuswb %xmm1, %xmm0 3704; SSE2-NEXT: packuswb %xmm0, %xmm0 3705; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 3706; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 3707; SSE2-NEXT: pxor %xmm1, %xmm3 3708; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 3709; SSE2-NEXT: pxor %xmm1, %xmm2 3710; SSE2-NEXT: packssdw %xmm3, %xmm2 3711; SSE2-NEXT: packsswb %xmm2, %xmm2 3712; SSE2-NEXT: pmovmskb %xmm2, %eax 3713; SSE2-NEXT: testb $1, %al 3714; SSE2-NEXT: movd %xmm0, %ecx 3715; SSE2-NEXT: jne .LBB12_1 3716; SSE2-NEXT: # %bb.2: # %else 3717; SSE2-NEXT: testb $2, %al 3718; SSE2-NEXT: jne .LBB12_3 3719; SSE2-NEXT: .LBB12_4: # %else2 3720; SSE2-NEXT: testb $4, %al 3721; SSE2-NEXT: jne .LBB12_5 3722; SSE2-NEXT: .LBB12_6: # %else4 3723; SSE2-NEXT: testb $8, %al 3724; SSE2-NEXT: je .LBB12_8 3725; SSE2-NEXT: .LBB12_7: # %cond.store5 3726; SSE2-NEXT: shrl $24, %ecx 3727; SSE2-NEXT: movb %cl, 3(%rdi) 3728; SSE2-NEXT: .LBB12_8: # %else6 3729; SSE2-NEXT: testb $16, %al 3730; SSE2-NEXT: pextrw $2, %xmm0, %ecx 3731; SSE2-NEXT: je .LBB12_10 3732; SSE2-NEXT: # %bb.9: # %cond.store7 3733; SSE2-NEXT: movb %cl, 4(%rdi) 3734; SSE2-NEXT: .LBB12_10: # %else8 3735; SSE2-NEXT: testb $32, %al 3736; SSE2-NEXT: je .LBB12_12 3737; SSE2-NEXT: # %bb.11: # %cond.store9 3738; SSE2-NEXT: movb %ch, 5(%rdi) 3739; SSE2-NEXT: .LBB12_12: # %else10 3740; SSE2-NEXT: testb $64, %al 3741; SSE2-NEXT: pextrw $3, %xmm0, %ecx 3742; SSE2-NEXT: jne .LBB12_13 3743; SSE2-NEXT: # %bb.14: # %else12 3744; SSE2-NEXT: testb $-128, %al 3745; SSE2-NEXT: jne .LBB12_15 3746; SSE2-NEXT: .LBB12_16: # %else14 3747; SSE2-NEXT: retq 3748; SSE2-NEXT: .LBB12_1: # %cond.store 3749; SSE2-NEXT: movb %cl, (%rdi) 3750; SSE2-NEXT: testb $2, %al 3751; SSE2-NEXT: je .LBB12_4 3752; SSE2-NEXT: .LBB12_3: # %cond.store1 3753; SSE2-NEXT: movb %ch, 1(%rdi) 3754; SSE2-NEXT: testb $4, %al 3755; SSE2-NEXT: je .LBB12_6 3756; SSE2-NEXT: .LBB12_5: # %cond.store3 3757; SSE2-NEXT: movl %ecx, %edx 3758; SSE2-NEXT: shrl $16, %edx 3759; SSE2-NEXT: movb %dl, 2(%rdi) 3760; SSE2-NEXT: testb $8, %al 3761; SSE2-NEXT: jne .LBB12_7 3762; SSE2-NEXT: jmp .LBB12_8 3763; SSE2-NEXT: .LBB12_13: # %cond.store11 3764; SSE2-NEXT: movb %cl, 6(%rdi) 3765; SSE2-NEXT: testb $-128, %al 3766; SSE2-NEXT: je .LBB12_16 3767; SSE2-NEXT: .LBB12_15: # %cond.store13 3768; SSE2-NEXT: movb %ch, 7(%rdi) 3769; SSE2-NEXT: retq 3770; 3771; SSE4-LABEL: truncstore_v8i32_v8i8: 3772; SSE4: # %bb.0: 3773; SSE4-NEXT: pxor %xmm4, %xmm4 3774; SSE4-NEXT: movdqa {{.*#+}} xmm5 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u> 3775; SSE4-NEXT: pshufb %xmm5, %xmm1 3776; SSE4-NEXT: pshufb %xmm5, %xmm0 3777; SSE4-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] 3778; SSE4-NEXT: pcmpeqd %xmm4, %xmm3 3779; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 3780; SSE4-NEXT: pxor %xmm1, %xmm3 3781; SSE4-NEXT: pcmpeqd %xmm4, %xmm2 3782; SSE4-NEXT: pxor %xmm1, %xmm2 3783; SSE4-NEXT: packssdw %xmm3, %xmm2 3784; SSE4-NEXT: packsswb %xmm2, %xmm2 3785; SSE4-NEXT: pmovmskb %xmm2, %eax 3786; SSE4-NEXT: testb $1, %al 3787; SSE4-NEXT: jne .LBB12_1 3788; SSE4-NEXT: # %bb.2: # %else 3789; SSE4-NEXT: testb $2, %al 3790; SSE4-NEXT: jne .LBB12_3 3791; SSE4-NEXT: .LBB12_4: # %else2 3792; SSE4-NEXT: testb $4, %al 3793; SSE4-NEXT: jne .LBB12_5 3794; SSE4-NEXT: .LBB12_6: # %else4 3795; SSE4-NEXT: testb $8, %al 3796; SSE4-NEXT: jne .LBB12_7 3797; SSE4-NEXT: .LBB12_8: # %else6 3798; SSE4-NEXT: testb $16, %al 3799; SSE4-NEXT: jne .LBB12_9 3800; SSE4-NEXT: .LBB12_10: # %else8 3801; SSE4-NEXT: testb $32, %al 3802; SSE4-NEXT: jne .LBB12_11 3803; SSE4-NEXT: .LBB12_12: # %else10 3804; SSE4-NEXT: testb $64, %al 3805; SSE4-NEXT: jne .LBB12_13 3806; SSE4-NEXT: .LBB12_14: # %else12 3807; SSE4-NEXT: testb $-128, %al 3808; SSE4-NEXT: jne .LBB12_15 3809; SSE4-NEXT: .LBB12_16: # %else14 3810; SSE4-NEXT: retq 3811; SSE4-NEXT: .LBB12_1: # %cond.store 3812; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 3813; SSE4-NEXT: testb $2, %al 3814; SSE4-NEXT: je .LBB12_4 3815; SSE4-NEXT: .LBB12_3: # %cond.store1 3816; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 3817; SSE4-NEXT: testb $4, %al 3818; SSE4-NEXT: je .LBB12_6 3819; SSE4-NEXT: .LBB12_5: # %cond.store3 3820; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 3821; SSE4-NEXT: testb $8, %al 3822; SSE4-NEXT: je .LBB12_8 3823; SSE4-NEXT: .LBB12_7: # %cond.store5 3824; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 3825; SSE4-NEXT: testb $16, %al 3826; SSE4-NEXT: je .LBB12_10 3827; SSE4-NEXT: .LBB12_9: # %cond.store7 3828; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 3829; SSE4-NEXT: testb $32, %al 3830; SSE4-NEXT: je .LBB12_12 3831; SSE4-NEXT: .LBB12_11: # %cond.store9 3832; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 3833; SSE4-NEXT: testb $64, %al 3834; SSE4-NEXT: je .LBB12_14 3835; SSE4-NEXT: .LBB12_13: # %cond.store11 3836; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 3837; SSE4-NEXT: testb $-128, %al 3838; SSE4-NEXT: je .LBB12_16 3839; SSE4-NEXT: .LBB12_15: # %cond.store13 3840; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 3841; SSE4-NEXT: retq 3842; 3843; AVX1-LABEL: truncstore_v8i32_v8i8: 3844; AVX1: # %bb.0: 3845; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 3846; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u> 3847; AVX1-NEXT: vpshufb %xmm3, %xmm2, %xmm2 3848; AVX1-NEXT: vpshufb %xmm3, %xmm0, %xmm0 3849; AVX1-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] 3850; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 3851; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 3852; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 3853; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 3854; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 3855; AVX1-NEXT: vmovmskps %ymm1, %eax 3856; AVX1-NEXT: notl %eax 3857; AVX1-NEXT: testb $1, %al 3858; AVX1-NEXT: jne .LBB12_1 3859; AVX1-NEXT: # %bb.2: # %else 3860; AVX1-NEXT: testb $2, %al 3861; AVX1-NEXT: jne .LBB12_3 3862; AVX1-NEXT: .LBB12_4: # %else2 3863; AVX1-NEXT: testb $4, %al 3864; AVX1-NEXT: jne .LBB12_5 3865; AVX1-NEXT: .LBB12_6: # %else4 3866; AVX1-NEXT: testb $8, %al 3867; AVX1-NEXT: jne .LBB12_7 3868; AVX1-NEXT: .LBB12_8: # %else6 3869; AVX1-NEXT: testb $16, %al 3870; AVX1-NEXT: jne .LBB12_9 3871; AVX1-NEXT: .LBB12_10: # %else8 3872; AVX1-NEXT: testb $32, %al 3873; AVX1-NEXT: jne .LBB12_11 3874; AVX1-NEXT: .LBB12_12: # %else10 3875; AVX1-NEXT: testb $64, %al 3876; AVX1-NEXT: jne .LBB12_13 3877; AVX1-NEXT: .LBB12_14: # %else12 3878; AVX1-NEXT: testb $-128, %al 3879; AVX1-NEXT: jne .LBB12_15 3880; AVX1-NEXT: .LBB12_16: # %else14 3881; AVX1-NEXT: vzeroupper 3882; AVX1-NEXT: retq 3883; AVX1-NEXT: .LBB12_1: # %cond.store 3884; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 3885; AVX1-NEXT: testb $2, %al 3886; AVX1-NEXT: je .LBB12_4 3887; AVX1-NEXT: .LBB12_3: # %cond.store1 3888; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 3889; AVX1-NEXT: testb $4, %al 3890; AVX1-NEXT: je .LBB12_6 3891; AVX1-NEXT: .LBB12_5: # %cond.store3 3892; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 3893; AVX1-NEXT: testb $8, %al 3894; AVX1-NEXT: je .LBB12_8 3895; AVX1-NEXT: .LBB12_7: # %cond.store5 3896; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 3897; AVX1-NEXT: testb $16, %al 3898; AVX1-NEXT: je .LBB12_10 3899; AVX1-NEXT: .LBB12_9: # %cond.store7 3900; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 3901; AVX1-NEXT: testb $32, %al 3902; AVX1-NEXT: je .LBB12_12 3903; AVX1-NEXT: .LBB12_11: # %cond.store9 3904; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 3905; AVX1-NEXT: testb $64, %al 3906; AVX1-NEXT: je .LBB12_14 3907; AVX1-NEXT: .LBB12_13: # %cond.store11 3908; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3909; AVX1-NEXT: testb $-128, %al 3910; AVX1-NEXT: je .LBB12_16 3911; AVX1-NEXT: .LBB12_15: # %cond.store13 3912; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3913; AVX1-NEXT: vzeroupper 3914; AVX1-NEXT: retq 3915; 3916; AVX2-LABEL: truncstore_v8i32_v8i8: 3917; AVX2: # %bb.0: 3918; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 3919; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 3920; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u> 3921; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 3922; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 3923; AVX2-NEXT: vpunpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] 3924; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 3925; AVX2-NEXT: vmovmskps %ymm1, %eax 3926; AVX2-NEXT: notl %eax 3927; AVX2-NEXT: testb $1, %al 3928; AVX2-NEXT: jne .LBB12_1 3929; AVX2-NEXT: # %bb.2: # %else 3930; AVX2-NEXT: testb $2, %al 3931; AVX2-NEXT: jne .LBB12_3 3932; AVX2-NEXT: .LBB12_4: # %else2 3933; AVX2-NEXT: testb $4, %al 3934; AVX2-NEXT: jne .LBB12_5 3935; AVX2-NEXT: .LBB12_6: # %else4 3936; AVX2-NEXT: testb $8, %al 3937; AVX2-NEXT: jne .LBB12_7 3938; AVX2-NEXT: .LBB12_8: # %else6 3939; AVX2-NEXT: testb $16, %al 3940; AVX2-NEXT: jne .LBB12_9 3941; AVX2-NEXT: .LBB12_10: # %else8 3942; AVX2-NEXT: testb $32, %al 3943; AVX2-NEXT: jne .LBB12_11 3944; AVX2-NEXT: .LBB12_12: # %else10 3945; AVX2-NEXT: testb $64, %al 3946; AVX2-NEXT: jne .LBB12_13 3947; AVX2-NEXT: .LBB12_14: # %else12 3948; AVX2-NEXT: testb $-128, %al 3949; AVX2-NEXT: jne .LBB12_15 3950; AVX2-NEXT: .LBB12_16: # %else14 3951; AVX2-NEXT: vzeroupper 3952; AVX2-NEXT: retq 3953; AVX2-NEXT: .LBB12_1: # %cond.store 3954; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 3955; AVX2-NEXT: testb $2, %al 3956; AVX2-NEXT: je .LBB12_4 3957; AVX2-NEXT: .LBB12_3: # %cond.store1 3958; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 3959; AVX2-NEXT: testb $4, %al 3960; AVX2-NEXT: je .LBB12_6 3961; AVX2-NEXT: .LBB12_5: # %cond.store3 3962; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 3963; AVX2-NEXT: testb $8, %al 3964; AVX2-NEXT: je .LBB12_8 3965; AVX2-NEXT: .LBB12_7: # %cond.store5 3966; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 3967; AVX2-NEXT: testb $16, %al 3968; AVX2-NEXT: je .LBB12_10 3969; AVX2-NEXT: .LBB12_9: # %cond.store7 3970; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 3971; AVX2-NEXT: testb $32, %al 3972; AVX2-NEXT: je .LBB12_12 3973; AVX2-NEXT: .LBB12_11: # %cond.store9 3974; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 3975; AVX2-NEXT: testb $64, %al 3976; AVX2-NEXT: je .LBB12_14 3977; AVX2-NEXT: .LBB12_13: # %cond.store11 3978; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3979; AVX2-NEXT: testb $-128, %al 3980; AVX2-NEXT: je .LBB12_16 3981; AVX2-NEXT: .LBB12_15: # %cond.store13 3982; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3983; AVX2-NEXT: vzeroupper 3984; AVX2-NEXT: retq 3985; 3986; AVX512F-LABEL: truncstore_v8i32_v8i8: 3987; AVX512F: # %bb.0: 3988; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 3989; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 3990; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 3991; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 3992; AVX512F-NEXT: kmovw %k0, %eax 3993; AVX512F-NEXT: testb $1, %al 3994; AVX512F-NEXT: jne .LBB12_1 3995; AVX512F-NEXT: # %bb.2: # %else 3996; AVX512F-NEXT: testb $2, %al 3997; AVX512F-NEXT: jne .LBB12_3 3998; AVX512F-NEXT: .LBB12_4: # %else2 3999; AVX512F-NEXT: testb $4, %al 4000; AVX512F-NEXT: jne .LBB12_5 4001; AVX512F-NEXT: .LBB12_6: # %else4 4002; AVX512F-NEXT: testb $8, %al 4003; AVX512F-NEXT: jne .LBB12_7 4004; AVX512F-NEXT: .LBB12_8: # %else6 4005; AVX512F-NEXT: testb $16, %al 4006; AVX512F-NEXT: jne .LBB12_9 4007; AVX512F-NEXT: .LBB12_10: # %else8 4008; AVX512F-NEXT: testb $32, %al 4009; AVX512F-NEXT: jne .LBB12_11 4010; AVX512F-NEXT: .LBB12_12: # %else10 4011; AVX512F-NEXT: testb $64, %al 4012; AVX512F-NEXT: jne .LBB12_13 4013; AVX512F-NEXT: .LBB12_14: # %else12 4014; AVX512F-NEXT: testb $-128, %al 4015; AVX512F-NEXT: jne .LBB12_15 4016; AVX512F-NEXT: .LBB12_16: # %else14 4017; AVX512F-NEXT: vzeroupper 4018; AVX512F-NEXT: retq 4019; AVX512F-NEXT: .LBB12_1: # %cond.store 4020; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 4021; AVX512F-NEXT: testb $2, %al 4022; AVX512F-NEXT: je .LBB12_4 4023; AVX512F-NEXT: .LBB12_3: # %cond.store1 4024; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4025; AVX512F-NEXT: testb $4, %al 4026; AVX512F-NEXT: je .LBB12_6 4027; AVX512F-NEXT: .LBB12_5: # %cond.store3 4028; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4029; AVX512F-NEXT: testb $8, %al 4030; AVX512F-NEXT: je .LBB12_8 4031; AVX512F-NEXT: .LBB12_7: # %cond.store5 4032; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4033; AVX512F-NEXT: testb $16, %al 4034; AVX512F-NEXT: je .LBB12_10 4035; AVX512F-NEXT: .LBB12_9: # %cond.store7 4036; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4037; AVX512F-NEXT: testb $32, %al 4038; AVX512F-NEXT: je .LBB12_12 4039; AVX512F-NEXT: .LBB12_11: # %cond.store9 4040; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4041; AVX512F-NEXT: testb $64, %al 4042; AVX512F-NEXT: je .LBB12_14 4043; AVX512F-NEXT: .LBB12_13: # %cond.store11 4044; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4045; AVX512F-NEXT: testb $-128, %al 4046; AVX512F-NEXT: je .LBB12_16 4047; AVX512F-NEXT: .LBB12_15: # %cond.store13 4048; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4049; AVX512F-NEXT: vzeroupper 4050; AVX512F-NEXT: retq 4051; 4052; AVX512BW-LABEL: truncstore_v8i32_v8i8: 4053; AVX512BW: # %bb.0: 4054; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 4055; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 4056; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 4057; AVX512BW-NEXT: kshiftlq $56, %k0, %k0 4058; AVX512BW-NEXT: kshiftrq $56, %k0, %k1 4059; AVX512BW-NEXT: vpmovdb %zmm0, %xmm0 4060; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 4061; AVX512BW-NEXT: vzeroupper 4062; AVX512BW-NEXT: retq 4063; 4064; AVX512BWVL-LABEL: truncstore_v8i32_v8i8: 4065; AVX512BWVL: # %bb.0: 4066; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 4067; AVX512BWVL-NEXT: vpmovdb %ymm0, (%rdi) {%k1} 4068; AVX512BWVL-NEXT: vzeroupper 4069; AVX512BWVL-NEXT: retq 4070 %a = icmp ne <8 x i32> %mask, zeroinitializer 4071 %b = trunc <8 x i32> %x to <8 x i8> 4072 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %b, <8 x i8>* %p, i32 1, <8 x i1> %a) 4073 ret void 4074} 4075 4076define void @truncstore_v4i32_v4i16(<4 x i32> %x, <4 x i16>* %p, <4 x i32> %mask) { 4077; SSE2-LABEL: truncstore_v4i32_v4i16: 4078; SSE2: # %bb.0: 4079; SSE2-NEXT: pxor %xmm2, %xmm2 4080; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 4081; SSE2-NEXT: pshufhw {{.*#+}} xmm0 = xmm0[0,1,2,3,4,6,6,7] 4082; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] 4083; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4084; SSE2-NEXT: movmskps %xmm2, %eax 4085; SSE2-NEXT: xorl $15, %eax 4086; SSE2-NEXT: testb $1, %al 4087; SSE2-NEXT: jne .LBB13_1 4088; SSE2-NEXT: # %bb.2: # %else 4089; SSE2-NEXT: testb $2, %al 4090; SSE2-NEXT: jne .LBB13_3 4091; SSE2-NEXT: .LBB13_4: # %else2 4092; SSE2-NEXT: testb $4, %al 4093; SSE2-NEXT: jne .LBB13_5 4094; SSE2-NEXT: .LBB13_6: # %else4 4095; SSE2-NEXT: testb $8, %al 4096; SSE2-NEXT: jne .LBB13_7 4097; SSE2-NEXT: .LBB13_8: # %else6 4098; SSE2-NEXT: retq 4099; SSE2-NEXT: .LBB13_1: # %cond.store 4100; SSE2-NEXT: movd %xmm0, %ecx 4101; SSE2-NEXT: movw %cx, (%rdi) 4102; SSE2-NEXT: testb $2, %al 4103; SSE2-NEXT: je .LBB13_4 4104; SSE2-NEXT: .LBB13_3: # %cond.store1 4105; SSE2-NEXT: pextrw $1, %xmm0, %ecx 4106; SSE2-NEXT: movw %cx, 2(%rdi) 4107; SSE2-NEXT: testb $4, %al 4108; SSE2-NEXT: je .LBB13_6 4109; SSE2-NEXT: .LBB13_5: # %cond.store3 4110; SSE2-NEXT: pextrw $2, %xmm0, %ecx 4111; SSE2-NEXT: movw %cx, 4(%rdi) 4112; SSE2-NEXT: testb $8, %al 4113; SSE2-NEXT: je .LBB13_8 4114; SSE2-NEXT: .LBB13_7: # %cond.store5 4115; SSE2-NEXT: pextrw $3, %xmm0, %eax 4116; SSE2-NEXT: movw %ax, 6(%rdi) 4117; SSE2-NEXT: retq 4118; 4119; SSE4-LABEL: truncstore_v4i32_v4i16: 4120; SSE4: # %bb.0: 4121; SSE4-NEXT: pxor %xmm2, %xmm2 4122; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4123; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 4124; SSE4-NEXT: movmskps %xmm2, %eax 4125; SSE4-NEXT: xorl $15, %eax 4126; SSE4-NEXT: testb $1, %al 4127; SSE4-NEXT: jne .LBB13_1 4128; SSE4-NEXT: # %bb.2: # %else 4129; SSE4-NEXT: testb $2, %al 4130; SSE4-NEXT: jne .LBB13_3 4131; SSE4-NEXT: .LBB13_4: # %else2 4132; SSE4-NEXT: testb $4, %al 4133; SSE4-NEXT: jne .LBB13_5 4134; SSE4-NEXT: .LBB13_6: # %else4 4135; SSE4-NEXT: testb $8, %al 4136; SSE4-NEXT: jne .LBB13_7 4137; SSE4-NEXT: .LBB13_8: # %else6 4138; SSE4-NEXT: retq 4139; SSE4-NEXT: .LBB13_1: # %cond.store 4140; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 4141; SSE4-NEXT: testb $2, %al 4142; SSE4-NEXT: je .LBB13_4 4143; SSE4-NEXT: .LBB13_3: # %cond.store1 4144; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 4145; SSE4-NEXT: testb $4, %al 4146; SSE4-NEXT: je .LBB13_6 4147; SSE4-NEXT: .LBB13_5: # %cond.store3 4148; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 4149; SSE4-NEXT: testb $8, %al 4150; SSE4-NEXT: je .LBB13_8 4151; SSE4-NEXT: .LBB13_7: # %cond.store5 4152; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 4153; SSE4-NEXT: retq 4154; 4155; AVX-LABEL: truncstore_v4i32_v4i16: 4156; AVX: # %bb.0: 4157; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 4158; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4159; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 4160; AVX-NEXT: vmovmskps %xmm1, %eax 4161; AVX-NEXT: xorl $15, %eax 4162; AVX-NEXT: testb $1, %al 4163; AVX-NEXT: jne .LBB13_1 4164; AVX-NEXT: # %bb.2: # %else 4165; AVX-NEXT: testb $2, %al 4166; AVX-NEXT: jne .LBB13_3 4167; AVX-NEXT: .LBB13_4: # %else2 4168; AVX-NEXT: testb $4, %al 4169; AVX-NEXT: jne .LBB13_5 4170; AVX-NEXT: .LBB13_6: # %else4 4171; AVX-NEXT: testb $8, %al 4172; AVX-NEXT: jne .LBB13_7 4173; AVX-NEXT: .LBB13_8: # %else6 4174; AVX-NEXT: retq 4175; AVX-NEXT: .LBB13_1: # %cond.store 4176; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 4177; AVX-NEXT: testb $2, %al 4178; AVX-NEXT: je .LBB13_4 4179; AVX-NEXT: .LBB13_3: # %cond.store1 4180; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi) 4181; AVX-NEXT: testb $4, %al 4182; AVX-NEXT: je .LBB13_6 4183; AVX-NEXT: .LBB13_5: # %cond.store3 4184; AVX-NEXT: vpextrw $2, %xmm0, 4(%rdi) 4185; AVX-NEXT: testb $8, %al 4186; AVX-NEXT: je .LBB13_8 4187; AVX-NEXT: .LBB13_7: # %cond.store5 4188; AVX-NEXT: vpextrw $3, %xmm0, 6(%rdi) 4189; AVX-NEXT: retq 4190; 4191; AVX512F-LABEL: truncstore_v4i32_v4i16: 4192; AVX512F: # %bb.0: 4193; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 4194; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 4195; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4196; AVX512F-NEXT: kmovw %k0, %eax 4197; AVX512F-NEXT: testb $1, %al 4198; AVX512F-NEXT: jne .LBB13_1 4199; AVX512F-NEXT: # %bb.2: # %else 4200; AVX512F-NEXT: testb $2, %al 4201; AVX512F-NEXT: jne .LBB13_3 4202; AVX512F-NEXT: .LBB13_4: # %else2 4203; AVX512F-NEXT: testb $4, %al 4204; AVX512F-NEXT: jne .LBB13_5 4205; AVX512F-NEXT: .LBB13_6: # %else4 4206; AVX512F-NEXT: testb $8, %al 4207; AVX512F-NEXT: jne .LBB13_7 4208; AVX512F-NEXT: .LBB13_8: # %else6 4209; AVX512F-NEXT: vzeroupper 4210; AVX512F-NEXT: retq 4211; AVX512F-NEXT: .LBB13_1: # %cond.store 4212; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 4213; AVX512F-NEXT: testb $2, %al 4214; AVX512F-NEXT: je .LBB13_4 4215; AVX512F-NEXT: .LBB13_3: # %cond.store1 4216; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 4217; AVX512F-NEXT: testb $4, %al 4218; AVX512F-NEXT: je .LBB13_6 4219; AVX512F-NEXT: .LBB13_5: # %cond.store3 4220; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 4221; AVX512F-NEXT: testb $8, %al 4222; AVX512F-NEXT: je .LBB13_8 4223; AVX512F-NEXT: .LBB13_7: # %cond.store5 4224; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 4225; AVX512F-NEXT: vzeroupper 4226; AVX512F-NEXT: retq 4227; 4228; AVX512BW-LABEL: truncstore_v4i32_v4i16: 4229; AVX512BW: # %bb.0: 4230; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 4231; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 4232; AVX512BW-NEXT: kshiftld $28, %k0, %k0 4233; AVX512BW-NEXT: kshiftrd $28, %k0, %k1 4234; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] 4235; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 4236; AVX512BW-NEXT: vzeroupper 4237; AVX512BW-NEXT: retq 4238; 4239; AVX512BWVL-LABEL: truncstore_v4i32_v4i16: 4240; AVX512BWVL: # %bb.0: 4241; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 4242; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rdi) {%k1} 4243; AVX512BWVL-NEXT: retq 4244 %a = icmp ne <4 x i32> %mask, zeroinitializer 4245 %b = trunc <4 x i32> %x to <4 x i16> 4246 call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %b, <4 x i16>* %p, i32 1, <4 x i1> %a) 4247 ret void 4248} 4249 4250define void @truncstore_v4i32_v4i8(<4 x i32> %x, <4 x i8>* %p, <4 x i32> %mask) { 4251; SSE2-LABEL: truncstore_v4i32_v4i8: 4252; SSE2: # %bb.0: 4253; SSE2-NEXT: pxor %xmm2, %xmm2 4254; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 4255; SSE2-NEXT: packuswb %xmm0, %xmm0 4256; SSE2-NEXT: packuswb %xmm0, %xmm0 4257; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4258; SSE2-NEXT: movmskps %xmm2, %ecx 4259; SSE2-NEXT: xorl $15, %ecx 4260; SSE2-NEXT: testb $1, %cl 4261; SSE2-NEXT: movd %xmm0, %eax 4262; SSE2-NEXT: jne .LBB14_1 4263; SSE2-NEXT: # %bb.2: # %else 4264; SSE2-NEXT: testb $2, %cl 4265; SSE2-NEXT: jne .LBB14_3 4266; SSE2-NEXT: .LBB14_4: # %else2 4267; SSE2-NEXT: testb $4, %cl 4268; SSE2-NEXT: jne .LBB14_5 4269; SSE2-NEXT: .LBB14_6: # %else4 4270; SSE2-NEXT: testb $8, %cl 4271; SSE2-NEXT: jne .LBB14_7 4272; SSE2-NEXT: .LBB14_8: # %else6 4273; SSE2-NEXT: retq 4274; SSE2-NEXT: .LBB14_1: # %cond.store 4275; SSE2-NEXT: movb %al, (%rdi) 4276; SSE2-NEXT: testb $2, %cl 4277; SSE2-NEXT: je .LBB14_4 4278; SSE2-NEXT: .LBB14_3: # %cond.store1 4279; SSE2-NEXT: movb %ah, 1(%rdi) 4280; SSE2-NEXT: testb $4, %cl 4281; SSE2-NEXT: je .LBB14_6 4282; SSE2-NEXT: .LBB14_5: # %cond.store3 4283; SSE2-NEXT: movl %eax, %edx 4284; SSE2-NEXT: shrl $16, %edx 4285; SSE2-NEXT: movb %dl, 2(%rdi) 4286; SSE2-NEXT: testb $8, %cl 4287; SSE2-NEXT: je .LBB14_8 4288; SSE2-NEXT: .LBB14_7: # %cond.store5 4289; SSE2-NEXT: shrl $24, %eax 4290; SSE2-NEXT: movb %al, 3(%rdi) 4291; SSE2-NEXT: retq 4292; 4293; SSE4-LABEL: truncstore_v4i32_v4i8: 4294; SSE4: # %bb.0: 4295; SSE4-NEXT: pxor %xmm2, %xmm2 4296; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 4297; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 4298; SSE4-NEXT: movmskps %xmm2, %eax 4299; SSE4-NEXT: xorl $15, %eax 4300; SSE4-NEXT: testb $1, %al 4301; SSE4-NEXT: jne .LBB14_1 4302; SSE4-NEXT: # %bb.2: # %else 4303; SSE4-NEXT: testb $2, %al 4304; SSE4-NEXT: jne .LBB14_3 4305; SSE4-NEXT: .LBB14_4: # %else2 4306; SSE4-NEXT: testb $4, %al 4307; SSE4-NEXT: jne .LBB14_5 4308; SSE4-NEXT: .LBB14_6: # %else4 4309; SSE4-NEXT: testb $8, %al 4310; SSE4-NEXT: jne .LBB14_7 4311; SSE4-NEXT: .LBB14_8: # %else6 4312; SSE4-NEXT: retq 4313; SSE4-NEXT: .LBB14_1: # %cond.store 4314; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 4315; SSE4-NEXT: testb $2, %al 4316; SSE4-NEXT: je .LBB14_4 4317; SSE4-NEXT: .LBB14_3: # %cond.store1 4318; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 4319; SSE4-NEXT: testb $4, %al 4320; SSE4-NEXT: je .LBB14_6 4321; SSE4-NEXT: .LBB14_5: # %cond.store3 4322; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 4323; SSE4-NEXT: testb $8, %al 4324; SSE4-NEXT: je .LBB14_8 4325; SSE4-NEXT: .LBB14_7: # %cond.store5 4326; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 4327; SSE4-NEXT: retq 4328; 4329; AVX-LABEL: truncstore_v4i32_v4i8: 4330; AVX: # %bb.0: 4331; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 4332; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 4333; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 4334; AVX-NEXT: vmovmskps %xmm1, %eax 4335; AVX-NEXT: xorl $15, %eax 4336; AVX-NEXT: testb $1, %al 4337; AVX-NEXT: jne .LBB14_1 4338; AVX-NEXT: # %bb.2: # %else 4339; AVX-NEXT: testb $2, %al 4340; AVX-NEXT: jne .LBB14_3 4341; AVX-NEXT: .LBB14_4: # %else2 4342; AVX-NEXT: testb $4, %al 4343; AVX-NEXT: jne .LBB14_5 4344; AVX-NEXT: .LBB14_6: # %else4 4345; AVX-NEXT: testb $8, %al 4346; AVX-NEXT: jne .LBB14_7 4347; AVX-NEXT: .LBB14_8: # %else6 4348; AVX-NEXT: retq 4349; AVX-NEXT: .LBB14_1: # %cond.store 4350; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) 4351; AVX-NEXT: testb $2, %al 4352; AVX-NEXT: je .LBB14_4 4353; AVX-NEXT: .LBB14_3: # %cond.store1 4354; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4355; AVX-NEXT: testb $4, %al 4356; AVX-NEXT: je .LBB14_6 4357; AVX-NEXT: .LBB14_5: # %cond.store3 4358; AVX-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4359; AVX-NEXT: testb $8, %al 4360; AVX-NEXT: je .LBB14_8 4361; AVX-NEXT: .LBB14_7: # %cond.store5 4362; AVX-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4363; AVX-NEXT: retq 4364; 4365; AVX512F-LABEL: truncstore_v4i32_v4i8: 4366; AVX512F: # %bb.0: 4367; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 4368; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 4369; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 4370; AVX512F-NEXT: kmovw %k0, %eax 4371; AVX512F-NEXT: testb $1, %al 4372; AVX512F-NEXT: jne .LBB14_1 4373; AVX512F-NEXT: # %bb.2: # %else 4374; AVX512F-NEXT: testb $2, %al 4375; AVX512F-NEXT: jne .LBB14_3 4376; AVX512F-NEXT: .LBB14_4: # %else2 4377; AVX512F-NEXT: testb $4, %al 4378; AVX512F-NEXT: jne .LBB14_5 4379; AVX512F-NEXT: .LBB14_6: # %else4 4380; AVX512F-NEXT: testb $8, %al 4381; AVX512F-NEXT: jne .LBB14_7 4382; AVX512F-NEXT: .LBB14_8: # %else6 4383; AVX512F-NEXT: vzeroupper 4384; AVX512F-NEXT: retq 4385; AVX512F-NEXT: .LBB14_1: # %cond.store 4386; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 4387; AVX512F-NEXT: testb $2, %al 4388; AVX512F-NEXT: je .LBB14_4 4389; AVX512F-NEXT: .LBB14_3: # %cond.store1 4390; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4391; AVX512F-NEXT: testb $4, %al 4392; AVX512F-NEXT: je .LBB14_6 4393; AVX512F-NEXT: .LBB14_5: # %cond.store3 4394; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4395; AVX512F-NEXT: testb $8, %al 4396; AVX512F-NEXT: je .LBB14_8 4397; AVX512F-NEXT: .LBB14_7: # %cond.store5 4398; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4399; AVX512F-NEXT: vzeroupper 4400; AVX512F-NEXT: retq 4401; 4402; AVX512BW-LABEL: truncstore_v4i32_v4i8: 4403; AVX512BW: # %bb.0: 4404; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 4405; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 4406; AVX512BW-NEXT: kshiftlq $60, %k0, %k0 4407; AVX512BW-NEXT: kshiftrq $60, %k0, %k1 4408; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,4,8,12,u,u,u,u,u,u,u,u,u,u,u,u] 4409; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 4410; AVX512BW-NEXT: vzeroupper 4411; AVX512BW-NEXT: retq 4412; 4413; AVX512BWVL-LABEL: truncstore_v4i32_v4i8: 4414; AVX512BWVL: # %bb.0: 4415; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 4416; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rdi) {%k1} 4417; AVX512BWVL-NEXT: retq 4418 %a = icmp ne <4 x i32> %mask, zeroinitializer 4419 %b = trunc <4 x i32> %x to <4 x i8> 4420 call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %b, <4 x i8>* %p, i32 1, <4 x i1> %a) 4421 ret void 4422} 4423 4424define void @truncstore_v32i16_v32i8(<32 x i16> %x, <32 x i8>* %p, <32 x i8> %mask) { 4425; SSE2-LABEL: truncstore_v32i16_v32i8: 4426; SSE2: # %bb.0: 4427; SSE2-NEXT: pxor %xmm7, %xmm7 4428; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 4429; SSE2-NEXT: pand %xmm6, %xmm1 4430; SSE2-NEXT: pand %xmm6, %xmm0 4431; SSE2-NEXT: packuswb %xmm1, %xmm0 4432; SSE2-NEXT: pcmpeqb %xmm7, %xmm4 4433; SSE2-NEXT: pmovmskb %xmm4, %ecx 4434; SSE2-NEXT: xorl $65535, %ecx # imm = 0xFFFF 4435; SSE2-NEXT: pcmpeqb %xmm7, %xmm5 4436; SSE2-NEXT: pmovmskb %xmm5, %eax 4437; SSE2-NEXT: notl %eax 4438; SSE2-NEXT: shll $16, %eax 4439; SSE2-NEXT: orl %ecx, %eax 4440; SSE2-NEXT: testb $1, %al 4441; SSE2-NEXT: movd %xmm0, %ecx 4442; SSE2-NEXT: jne .LBB15_1 4443; SSE2-NEXT: # %bb.2: # %else 4444; SSE2-NEXT: testb $2, %al 4445; SSE2-NEXT: jne .LBB15_3 4446; SSE2-NEXT: .LBB15_4: # %else2 4447; SSE2-NEXT: testb $4, %al 4448; SSE2-NEXT: jne .LBB15_5 4449; SSE2-NEXT: .LBB15_6: # %else4 4450; SSE2-NEXT: testb $8, %al 4451; SSE2-NEXT: je .LBB15_8 4452; SSE2-NEXT: .LBB15_7: # %cond.store5 4453; SSE2-NEXT: shrl $24, %ecx 4454; SSE2-NEXT: movb %cl, 3(%rdi) 4455; SSE2-NEXT: .LBB15_8: # %else6 4456; SSE2-NEXT: testb $16, %al 4457; SSE2-NEXT: pextrw $2, %xmm0, %ecx 4458; SSE2-NEXT: je .LBB15_10 4459; SSE2-NEXT: # %bb.9: # %cond.store7 4460; SSE2-NEXT: movb %cl, 4(%rdi) 4461; SSE2-NEXT: .LBB15_10: # %else8 4462; SSE2-NEXT: testb $32, %al 4463; SSE2-NEXT: je .LBB15_12 4464; SSE2-NEXT: # %bb.11: # %cond.store9 4465; SSE2-NEXT: movb %ch, 5(%rdi) 4466; SSE2-NEXT: .LBB15_12: # %else10 4467; SSE2-NEXT: testb $64, %al 4468; SSE2-NEXT: pextrw $3, %xmm0, %ecx 4469; SSE2-NEXT: je .LBB15_14 4470; SSE2-NEXT: # %bb.13: # %cond.store11 4471; SSE2-NEXT: movb %cl, 6(%rdi) 4472; SSE2-NEXT: .LBB15_14: # %else12 4473; SSE2-NEXT: testb $-128, %al 4474; SSE2-NEXT: je .LBB15_16 4475; SSE2-NEXT: # %bb.15: # %cond.store13 4476; SSE2-NEXT: movb %ch, 7(%rdi) 4477; SSE2-NEXT: .LBB15_16: # %else14 4478; SSE2-NEXT: testl $256, %eax # imm = 0x100 4479; SSE2-NEXT: pextrw $4, %xmm0, %ecx 4480; SSE2-NEXT: je .LBB15_18 4481; SSE2-NEXT: # %bb.17: # %cond.store15 4482; SSE2-NEXT: movb %cl, 8(%rdi) 4483; SSE2-NEXT: .LBB15_18: # %else16 4484; SSE2-NEXT: testl $512, %eax # imm = 0x200 4485; SSE2-NEXT: je .LBB15_20 4486; SSE2-NEXT: # %bb.19: # %cond.store17 4487; SSE2-NEXT: movb %ch, 9(%rdi) 4488; SSE2-NEXT: .LBB15_20: # %else18 4489; SSE2-NEXT: testl $1024, %eax # imm = 0x400 4490; SSE2-NEXT: pextrw $5, %xmm0, %ecx 4491; SSE2-NEXT: je .LBB15_22 4492; SSE2-NEXT: # %bb.21: # %cond.store19 4493; SSE2-NEXT: movb %cl, 10(%rdi) 4494; SSE2-NEXT: .LBB15_22: # %else20 4495; SSE2-NEXT: testl $2048, %eax # imm = 0x800 4496; SSE2-NEXT: je .LBB15_24 4497; SSE2-NEXT: # %bb.23: # %cond.store21 4498; SSE2-NEXT: movb %ch, 11(%rdi) 4499; SSE2-NEXT: .LBB15_24: # %else22 4500; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 4501; SSE2-NEXT: pextrw $6, %xmm0, %ecx 4502; SSE2-NEXT: je .LBB15_26 4503; SSE2-NEXT: # %bb.25: # %cond.store23 4504; SSE2-NEXT: movb %cl, 12(%rdi) 4505; SSE2-NEXT: .LBB15_26: # %else24 4506; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 4507; SSE2-NEXT: je .LBB15_28 4508; SSE2-NEXT: # %bb.27: # %cond.store25 4509; SSE2-NEXT: movb %ch, 13(%rdi) 4510; SSE2-NEXT: .LBB15_28: # %else26 4511; SSE2-NEXT: pand %xmm6, %xmm3 4512; SSE2-NEXT: pand %xmm6, %xmm2 4513; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 4514; SSE2-NEXT: pextrw $7, %xmm0, %ecx 4515; SSE2-NEXT: je .LBB15_30 4516; SSE2-NEXT: # %bb.29: # %cond.store27 4517; SSE2-NEXT: movb %cl, 14(%rdi) 4518; SSE2-NEXT: .LBB15_30: # %else28 4519; SSE2-NEXT: packuswb %xmm3, %xmm2 4520; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 4521; SSE2-NEXT: je .LBB15_32 4522; SSE2-NEXT: # %bb.31: # %cond.store29 4523; SSE2-NEXT: movb %ch, 15(%rdi) 4524; SSE2-NEXT: .LBB15_32: # %else30 4525; SSE2-NEXT: testl $65536, %eax # imm = 0x10000 4526; SSE2-NEXT: movd %xmm2, %ecx 4527; SSE2-NEXT: jne .LBB15_33 4528; SSE2-NEXT: # %bb.34: # %else32 4529; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 4530; SSE2-NEXT: jne .LBB15_35 4531; SSE2-NEXT: .LBB15_36: # %else34 4532; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 4533; SSE2-NEXT: jne .LBB15_37 4534; SSE2-NEXT: .LBB15_38: # %else36 4535; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 4536; SSE2-NEXT: je .LBB15_40 4537; SSE2-NEXT: .LBB15_39: # %cond.store37 4538; SSE2-NEXT: shrl $24, %ecx 4539; SSE2-NEXT: movb %cl, 19(%rdi) 4540; SSE2-NEXT: .LBB15_40: # %else38 4541; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000 4542; SSE2-NEXT: pextrw $2, %xmm2, %ecx 4543; SSE2-NEXT: je .LBB15_42 4544; SSE2-NEXT: # %bb.41: # %cond.store39 4545; SSE2-NEXT: movb %cl, 20(%rdi) 4546; SSE2-NEXT: .LBB15_42: # %else40 4547; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000 4548; SSE2-NEXT: je .LBB15_44 4549; SSE2-NEXT: # %bb.43: # %cond.store41 4550; SSE2-NEXT: movb %ch, 21(%rdi) 4551; SSE2-NEXT: .LBB15_44: # %else42 4552; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000 4553; SSE2-NEXT: pextrw $3, %xmm2, %ecx 4554; SSE2-NEXT: je .LBB15_46 4555; SSE2-NEXT: # %bb.45: # %cond.store43 4556; SSE2-NEXT: movb %cl, 22(%rdi) 4557; SSE2-NEXT: .LBB15_46: # %else44 4558; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000 4559; SSE2-NEXT: je .LBB15_48 4560; SSE2-NEXT: # %bb.47: # %cond.store45 4561; SSE2-NEXT: movb %ch, 23(%rdi) 4562; SSE2-NEXT: .LBB15_48: # %else46 4563; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000 4564; SSE2-NEXT: pextrw $4, %xmm2, %ecx 4565; SSE2-NEXT: je .LBB15_50 4566; SSE2-NEXT: # %bb.49: # %cond.store47 4567; SSE2-NEXT: movb %cl, 24(%rdi) 4568; SSE2-NEXT: .LBB15_50: # %else48 4569; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000 4570; SSE2-NEXT: je .LBB15_52 4571; SSE2-NEXT: # %bb.51: # %cond.store49 4572; SSE2-NEXT: movb %ch, 25(%rdi) 4573; SSE2-NEXT: .LBB15_52: # %else50 4574; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000 4575; SSE2-NEXT: pextrw $5, %xmm2, %ecx 4576; SSE2-NEXT: je .LBB15_54 4577; SSE2-NEXT: # %bb.53: # %cond.store51 4578; SSE2-NEXT: movb %cl, 26(%rdi) 4579; SSE2-NEXT: .LBB15_54: # %else52 4580; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000 4581; SSE2-NEXT: je .LBB15_56 4582; SSE2-NEXT: # %bb.55: # %cond.store53 4583; SSE2-NEXT: movb %ch, 27(%rdi) 4584; SSE2-NEXT: .LBB15_56: # %else54 4585; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000 4586; SSE2-NEXT: pextrw $6, %xmm2, %ecx 4587; SSE2-NEXT: je .LBB15_58 4588; SSE2-NEXT: # %bb.57: # %cond.store55 4589; SSE2-NEXT: movb %cl, 28(%rdi) 4590; SSE2-NEXT: .LBB15_58: # %else56 4591; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000 4592; SSE2-NEXT: je .LBB15_60 4593; SSE2-NEXT: # %bb.59: # %cond.store57 4594; SSE2-NEXT: movb %ch, 29(%rdi) 4595; SSE2-NEXT: .LBB15_60: # %else58 4596; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000 4597; SSE2-NEXT: pextrw $7, %xmm2, %ecx 4598; SSE2-NEXT: jne .LBB15_61 4599; SSE2-NEXT: # %bb.62: # %else60 4600; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 4601; SSE2-NEXT: jne .LBB15_63 4602; SSE2-NEXT: .LBB15_64: # %else62 4603; SSE2-NEXT: retq 4604; SSE2-NEXT: .LBB15_1: # %cond.store 4605; SSE2-NEXT: movb %cl, (%rdi) 4606; SSE2-NEXT: testb $2, %al 4607; SSE2-NEXT: je .LBB15_4 4608; SSE2-NEXT: .LBB15_3: # %cond.store1 4609; SSE2-NEXT: movb %ch, 1(%rdi) 4610; SSE2-NEXT: testb $4, %al 4611; SSE2-NEXT: je .LBB15_6 4612; SSE2-NEXT: .LBB15_5: # %cond.store3 4613; SSE2-NEXT: movl %ecx, %edx 4614; SSE2-NEXT: shrl $16, %edx 4615; SSE2-NEXT: movb %dl, 2(%rdi) 4616; SSE2-NEXT: testb $8, %al 4617; SSE2-NEXT: jne .LBB15_7 4618; SSE2-NEXT: jmp .LBB15_8 4619; SSE2-NEXT: .LBB15_33: # %cond.store31 4620; SSE2-NEXT: movb %cl, 16(%rdi) 4621; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 4622; SSE2-NEXT: je .LBB15_36 4623; SSE2-NEXT: .LBB15_35: # %cond.store33 4624; SSE2-NEXT: movb %ch, 17(%rdi) 4625; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 4626; SSE2-NEXT: je .LBB15_38 4627; SSE2-NEXT: .LBB15_37: # %cond.store35 4628; SSE2-NEXT: movl %ecx, %edx 4629; SSE2-NEXT: shrl $16, %edx 4630; SSE2-NEXT: movb %dl, 18(%rdi) 4631; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 4632; SSE2-NEXT: jne .LBB15_39 4633; SSE2-NEXT: jmp .LBB15_40 4634; SSE2-NEXT: .LBB15_61: # %cond.store59 4635; SSE2-NEXT: movb %cl, 30(%rdi) 4636; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 4637; SSE2-NEXT: je .LBB15_64 4638; SSE2-NEXT: .LBB15_63: # %cond.store61 4639; SSE2-NEXT: movb %ch, 31(%rdi) 4640; SSE2-NEXT: retq 4641; 4642; SSE4-LABEL: truncstore_v32i16_v32i8: 4643; SSE4: # %bb.0: 4644; SSE4-NEXT: pxor %xmm7, %xmm7 4645; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 4646; SSE4-NEXT: pand %xmm6, %xmm1 4647; SSE4-NEXT: pand %xmm6, %xmm0 4648; SSE4-NEXT: packuswb %xmm1, %xmm0 4649; SSE4-NEXT: pcmpeqb %xmm7, %xmm4 4650; SSE4-NEXT: pmovmskb %xmm4, %ecx 4651; SSE4-NEXT: xorl $65535, %ecx # imm = 0xFFFF 4652; SSE4-NEXT: pcmpeqb %xmm7, %xmm5 4653; SSE4-NEXT: pmovmskb %xmm5, %eax 4654; SSE4-NEXT: notl %eax 4655; SSE4-NEXT: shll $16, %eax 4656; SSE4-NEXT: orl %ecx, %eax 4657; SSE4-NEXT: testb $1, %al 4658; SSE4-NEXT: jne .LBB15_1 4659; SSE4-NEXT: # %bb.2: # %else 4660; SSE4-NEXT: testb $2, %al 4661; SSE4-NEXT: jne .LBB15_3 4662; SSE4-NEXT: .LBB15_4: # %else2 4663; SSE4-NEXT: testb $4, %al 4664; SSE4-NEXT: jne .LBB15_5 4665; SSE4-NEXT: .LBB15_6: # %else4 4666; SSE4-NEXT: testb $8, %al 4667; SSE4-NEXT: jne .LBB15_7 4668; SSE4-NEXT: .LBB15_8: # %else6 4669; SSE4-NEXT: testb $16, %al 4670; SSE4-NEXT: jne .LBB15_9 4671; SSE4-NEXT: .LBB15_10: # %else8 4672; SSE4-NEXT: testb $32, %al 4673; SSE4-NEXT: jne .LBB15_11 4674; SSE4-NEXT: .LBB15_12: # %else10 4675; SSE4-NEXT: testb $64, %al 4676; SSE4-NEXT: jne .LBB15_13 4677; SSE4-NEXT: .LBB15_14: # %else12 4678; SSE4-NEXT: testb $-128, %al 4679; SSE4-NEXT: jne .LBB15_15 4680; SSE4-NEXT: .LBB15_16: # %else14 4681; SSE4-NEXT: testl $256, %eax # imm = 0x100 4682; SSE4-NEXT: jne .LBB15_17 4683; SSE4-NEXT: .LBB15_18: # %else16 4684; SSE4-NEXT: testl $512, %eax # imm = 0x200 4685; SSE4-NEXT: jne .LBB15_19 4686; SSE4-NEXT: .LBB15_20: # %else18 4687; SSE4-NEXT: testl $1024, %eax # imm = 0x400 4688; SSE4-NEXT: jne .LBB15_21 4689; SSE4-NEXT: .LBB15_22: # %else20 4690; SSE4-NEXT: testl $2048, %eax # imm = 0x800 4691; SSE4-NEXT: jne .LBB15_23 4692; SSE4-NEXT: .LBB15_24: # %else22 4693; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 4694; SSE4-NEXT: jne .LBB15_25 4695; SSE4-NEXT: .LBB15_26: # %else24 4696; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 4697; SSE4-NEXT: jne .LBB15_27 4698; SSE4-NEXT: .LBB15_28: # %else26 4699; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 4700; SSE4-NEXT: je .LBB15_30 4701; SSE4-NEXT: .LBB15_29: # %cond.store27 4702; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 4703; SSE4-NEXT: .LBB15_30: # %else28 4704; SSE4-NEXT: pand %xmm6, %xmm3 4705; SSE4-NEXT: pand %xmm6, %xmm2 4706; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 4707; SSE4-NEXT: je .LBB15_32 4708; SSE4-NEXT: # %bb.31: # %cond.store29 4709; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 4710; SSE4-NEXT: .LBB15_32: # %else30 4711; SSE4-NEXT: packuswb %xmm3, %xmm2 4712; SSE4-NEXT: testl $65536, %eax # imm = 0x10000 4713; SSE4-NEXT: jne .LBB15_33 4714; SSE4-NEXT: # %bb.34: # %else32 4715; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 4716; SSE4-NEXT: jne .LBB15_35 4717; SSE4-NEXT: .LBB15_36: # %else34 4718; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 4719; SSE4-NEXT: jne .LBB15_37 4720; SSE4-NEXT: .LBB15_38: # %else36 4721; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 4722; SSE4-NEXT: jne .LBB15_39 4723; SSE4-NEXT: .LBB15_40: # %else38 4724; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 4725; SSE4-NEXT: jne .LBB15_41 4726; SSE4-NEXT: .LBB15_42: # %else40 4727; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 4728; SSE4-NEXT: jne .LBB15_43 4729; SSE4-NEXT: .LBB15_44: # %else42 4730; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 4731; SSE4-NEXT: jne .LBB15_45 4732; SSE4-NEXT: .LBB15_46: # %else44 4733; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 4734; SSE4-NEXT: jne .LBB15_47 4735; SSE4-NEXT: .LBB15_48: # %else46 4736; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 4737; SSE4-NEXT: jne .LBB15_49 4738; SSE4-NEXT: .LBB15_50: # %else48 4739; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 4740; SSE4-NEXT: jne .LBB15_51 4741; SSE4-NEXT: .LBB15_52: # %else50 4742; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 4743; SSE4-NEXT: jne .LBB15_53 4744; SSE4-NEXT: .LBB15_54: # %else52 4745; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 4746; SSE4-NEXT: jne .LBB15_55 4747; SSE4-NEXT: .LBB15_56: # %else54 4748; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 4749; SSE4-NEXT: jne .LBB15_57 4750; SSE4-NEXT: .LBB15_58: # %else56 4751; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 4752; SSE4-NEXT: jne .LBB15_59 4753; SSE4-NEXT: .LBB15_60: # %else58 4754; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 4755; SSE4-NEXT: jne .LBB15_61 4756; SSE4-NEXT: .LBB15_62: # %else60 4757; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 4758; SSE4-NEXT: jne .LBB15_63 4759; SSE4-NEXT: .LBB15_64: # %else62 4760; SSE4-NEXT: retq 4761; SSE4-NEXT: .LBB15_1: # %cond.store 4762; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 4763; SSE4-NEXT: testb $2, %al 4764; SSE4-NEXT: je .LBB15_4 4765; SSE4-NEXT: .LBB15_3: # %cond.store1 4766; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 4767; SSE4-NEXT: testb $4, %al 4768; SSE4-NEXT: je .LBB15_6 4769; SSE4-NEXT: .LBB15_5: # %cond.store3 4770; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 4771; SSE4-NEXT: testb $8, %al 4772; SSE4-NEXT: je .LBB15_8 4773; SSE4-NEXT: .LBB15_7: # %cond.store5 4774; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 4775; SSE4-NEXT: testb $16, %al 4776; SSE4-NEXT: je .LBB15_10 4777; SSE4-NEXT: .LBB15_9: # %cond.store7 4778; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 4779; SSE4-NEXT: testb $32, %al 4780; SSE4-NEXT: je .LBB15_12 4781; SSE4-NEXT: .LBB15_11: # %cond.store9 4782; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 4783; SSE4-NEXT: testb $64, %al 4784; SSE4-NEXT: je .LBB15_14 4785; SSE4-NEXT: .LBB15_13: # %cond.store11 4786; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 4787; SSE4-NEXT: testb $-128, %al 4788; SSE4-NEXT: je .LBB15_16 4789; SSE4-NEXT: .LBB15_15: # %cond.store13 4790; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 4791; SSE4-NEXT: testl $256, %eax # imm = 0x100 4792; SSE4-NEXT: je .LBB15_18 4793; SSE4-NEXT: .LBB15_17: # %cond.store15 4794; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 4795; SSE4-NEXT: testl $512, %eax # imm = 0x200 4796; SSE4-NEXT: je .LBB15_20 4797; SSE4-NEXT: .LBB15_19: # %cond.store17 4798; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 4799; SSE4-NEXT: testl $1024, %eax # imm = 0x400 4800; SSE4-NEXT: je .LBB15_22 4801; SSE4-NEXT: .LBB15_21: # %cond.store19 4802; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 4803; SSE4-NEXT: testl $2048, %eax # imm = 0x800 4804; SSE4-NEXT: je .LBB15_24 4805; SSE4-NEXT: .LBB15_23: # %cond.store21 4806; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 4807; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 4808; SSE4-NEXT: je .LBB15_26 4809; SSE4-NEXT: .LBB15_25: # %cond.store23 4810; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 4811; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 4812; SSE4-NEXT: je .LBB15_28 4813; SSE4-NEXT: .LBB15_27: # %cond.store25 4814; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 4815; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 4816; SSE4-NEXT: jne .LBB15_29 4817; SSE4-NEXT: jmp .LBB15_30 4818; SSE4-NEXT: .LBB15_33: # %cond.store31 4819; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi) 4820; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 4821; SSE4-NEXT: je .LBB15_36 4822; SSE4-NEXT: .LBB15_35: # %cond.store33 4823; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi) 4824; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 4825; SSE4-NEXT: je .LBB15_38 4826; SSE4-NEXT: .LBB15_37: # %cond.store35 4827; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi) 4828; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 4829; SSE4-NEXT: je .LBB15_40 4830; SSE4-NEXT: .LBB15_39: # %cond.store37 4831; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi) 4832; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 4833; SSE4-NEXT: je .LBB15_42 4834; SSE4-NEXT: .LBB15_41: # %cond.store39 4835; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi) 4836; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 4837; SSE4-NEXT: je .LBB15_44 4838; SSE4-NEXT: .LBB15_43: # %cond.store41 4839; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi) 4840; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 4841; SSE4-NEXT: je .LBB15_46 4842; SSE4-NEXT: .LBB15_45: # %cond.store43 4843; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi) 4844; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 4845; SSE4-NEXT: je .LBB15_48 4846; SSE4-NEXT: .LBB15_47: # %cond.store45 4847; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi) 4848; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 4849; SSE4-NEXT: je .LBB15_50 4850; SSE4-NEXT: .LBB15_49: # %cond.store47 4851; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi) 4852; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 4853; SSE4-NEXT: je .LBB15_52 4854; SSE4-NEXT: .LBB15_51: # %cond.store49 4855; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi) 4856; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 4857; SSE4-NEXT: je .LBB15_54 4858; SSE4-NEXT: .LBB15_53: # %cond.store51 4859; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi) 4860; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 4861; SSE4-NEXT: je .LBB15_56 4862; SSE4-NEXT: .LBB15_55: # %cond.store53 4863; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi) 4864; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 4865; SSE4-NEXT: je .LBB15_58 4866; SSE4-NEXT: .LBB15_57: # %cond.store55 4867; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi) 4868; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 4869; SSE4-NEXT: je .LBB15_60 4870; SSE4-NEXT: .LBB15_59: # %cond.store57 4871; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi) 4872; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 4873; SSE4-NEXT: je .LBB15_62 4874; SSE4-NEXT: .LBB15_61: # %cond.store59 4875; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi) 4876; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 4877; SSE4-NEXT: je .LBB15_64 4878; SSE4-NEXT: .LBB15_63: # %cond.store61 4879; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi) 4880; SSE4-NEXT: retq 4881; 4882; AVX1-LABEL: truncstore_v32i16_v32i8: 4883; AVX1: # %bb.0: 4884; AVX1-NEXT: vmovaps {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 4885; AVX1-NEXT: vandps %ymm3, %ymm1, %ymm1 4886; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 4887; AVX1-NEXT: vpackuswb %xmm4, %xmm1, %xmm1 4888; AVX1-NEXT: vandps %ymm3, %ymm0, %ymm0 4889; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 4890; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 4891; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 4892; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 4893; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm3 4894; AVX1-NEXT: vpmovmskb %xmm3, %ecx 4895; AVX1-NEXT: xorl $65535, %ecx # imm = 0xFFFF 4896; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 4897; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 4898; AVX1-NEXT: vpmovmskb %xmm1, %eax 4899; AVX1-NEXT: notl %eax 4900; AVX1-NEXT: shll $16, %eax 4901; AVX1-NEXT: orl %ecx, %eax 4902; AVX1-NEXT: testb $1, %al 4903; AVX1-NEXT: jne .LBB15_1 4904; AVX1-NEXT: # %bb.2: # %else 4905; AVX1-NEXT: testb $2, %al 4906; AVX1-NEXT: jne .LBB15_3 4907; AVX1-NEXT: .LBB15_4: # %else2 4908; AVX1-NEXT: testb $4, %al 4909; AVX1-NEXT: jne .LBB15_5 4910; AVX1-NEXT: .LBB15_6: # %else4 4911; AVX1-NEXT: testb $8, %al 4912; AVX1-NEXT: jne .LBB15_7 4913; AVX1-NEXT: .LBB15_8: # %else6 4914; AVX1-NEXT: testb $16, %al 4915; AVX1-NEXT: jne .LBB15_9 4916; AVX1-NEXT: .LBB15_10: # %else8 4917; AVX1-NEXT: testb $32, %al 4918; AVX1-NEXT: jne .LBB15_11 4919; AVX1-NEXT: .LBB15_12: # %else10 4920; AVX1-NEXT: testb $64, %al 4921; AVX1-NEXT: jne .LBB15_13 4922; AVX1-NEXT: .LBB15_14: # %else12 4923; AVX1-NEXT: testb $-128, %al 4924; AVX1-NEXT: jne .LBB15_15 4925; AVX1-NEXT: .LBB15_16: # %else14 4926; AVX1-NEXT: testl $256, %eax # imm = 0x100 4927; AVX1-NEXT: jne .LBB15_17 4928; AVX1-NEXT: .LBB15_18: # %else16 4929; AVX1-NEXT: testl $512, %eax # imm = 0x200 4930; AVX1-NEXT: jne .LBB15_19 4931; AVX1-NEXT: .LBB15_20: # %else18 4932; AVX1-NEXT: testl $1024, %eax # imm = 0x400 4933; AVX1-NEXT: jne .LBB15_21 4934; AVX1-NEXT: .LBB15_22: # %else20 4935; AVX1-NEXT: testl $2048, %eax # imm = 0x800 4936; AVX1-NEXT: jne .LBB15_23 4937; AVX1-NEXT: .LBB15_24: # %else22 4938; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 4939; AVX1-NEXT: jne .LBB15_25 4940; AVX1-NEXT: .LBB15_26: # %else24 4941; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 4942; AVX1-NEXT: jne .LBB15_27 4943; AVX1-NEXT: .LBB15_28: # %else26 4944; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 4945; AVX1-NEXT: jne .LBB15_29 4946; AVX1-NEXT: .LBB15_30: # %else28 4947; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 4948; AVX1-NEXT: je .LBB15_32 4949; AVX1-NEXT: .LBB15_31: # %cond.store29 4950; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 4951; AVX1-NEXT: .LBB15_32: # %else30 4952; AVX1-NEXT: testl $65536, %eax # imm = 0x10000 4953; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 4954; AVX1-NEXT: jne .LBB15_33 4955; AVX1-NEXT: # %bb.34: # %else32 4956; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 4957; AVX1-NEXT: jne .LBB15_35 4958; AVX1-NEXT: .LBB15_36: # %else34 4959; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 4960; AVX1-NEXT: jne .LBB15_37 4961; AVX1-NEXT: .LBB15_38: # %else36 4962; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 4963; AVX1-NEXT: jne .LBB15_39 4964; AVX1-NEXT: .LBB15_40: # %else38 4965; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 4966; AVX1-NEXT: jne .LBB15_41 4967; AVX1-NEXT: .LBB15_42: # %else40 4968; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 4969; AVX1-NEXT: jne .LBB15_43 4970; AVX1-NEXT: .LBB15_44: # %else42 4971; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 4972; AVX1-NEXT: jne .LBB15_45 4973; AVX1-NEXT: .LBB15_46: # %else44 4974; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 4975; AVX1-NEXT: jne .LBB15_47 4976; AVX1-NEXT: .LBB15_48: # %else46 4977; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 4978; AVX1-NEXT: jne .LBB15_49 4979; AVX1-NEXT: .LBB15_50: # %else48 4980; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 4981; AVX1-NEXT: jne .LBB15_51 4982; AVX1-NEXT: .LBB15_52: # %else50 4983; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 4984; AVX1-NEXT: jne .LBB15_53 4985; AVX1-NEXT: .LBB15_54: # %else52 4986; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 4987; AVX1-NEXT: jne .LBB15_55 4988; AVX1-NEXT: .LBB15_56: # %else54 4989; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 4990; AVX1-NEXT: jne .LBB15_57 4991; AVX1-NEXT: .LBB15_58: # %else56 4992; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 4993; AVX1-NEXT: jne .LBB15_59 4994; AVX1-NEXT: .LBB15_60: # %else58 4995; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 4996; AVX1-NEXT: jne .LBB15_61 4997; AVX1-NEXT: .LBB15_62: # %else60 4998; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 4999; AVX1-NEXT: jne .LBB15_63 5000; AVX1-NEXT: .LBB15_64: # %else62 5001; AVX1-NEXT: vzeroupper 5002; AVX1-NEXT: retq 5003; AVX1-NEXT: .LBB15_1: # %cond.store 5004; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 5005; AVX1-NEXT: testb $2, %al 5006; AVX1-NEXT: je .LBB15_4 5007; AVX1-NEXT: .LBB15_3: # %cond.store1 5008; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5009; AVX1-NEXT: testb $4, %al 5010; AVX1-NEXT: je .LBB15_6 5011; AVX1-NEXT: .LBB15_5: # %cond.store3 5012; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5013; AVX1-NEXT: testb $8, %al 5014; AVX1-NEXT: je .LBB15_8 5015; AVX1-NEXT: .LBB15_7: # %cond.store5 5016; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5017; AVX1-NEXT: testb $16, %al 5018; AVX1-NEXT: je .LBB15_10 5019; AVX1-NEXT: .LBB15_9: # %cond.store7 5020; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 5021; AVX1-NEXT: testb $32, %al 5022; AVX1-NEXT: je .LBB15_12 5023; AVX1-NEXT: .LBB15_11: # %cond.store9 5024; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 5025; AVX1-NEXT: testb $64, %al 5026; AVX1-NEXT: je .LBB15_14 5027; AVX1-NEXT: .LBB15_13: # %cond.store11 5028; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 5029; AVX1-NEXT: testb $-128, %al 5030; AVX1-NEXT: je .LBB15_16 5031; AVX1-NEXT: .LBB15_15: # %cond.store13 5032; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 5033; AVX1-NEXT: testl $256, %eax # imm = 0x100 5034; AVX1-NEXT: je .LBB15_18 5035; AVX1-NEXT: .LBB15_17: # %cond.store15 5036; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 5037; AVX1-NEXT: testl $512, %eax # imm = 0x200 5038; AVX1-NEXT: je .LBB15_20 5039; AVX1-NEXT: .LBB15_19: # %cond.store17 5040; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 5041; AVX1-NEXT: testl $1024, %eax # imm = 0x400 5042; AVX1-NEXT: je .LBB15_22 5043; AVX1-NEXT: .LBB15_21: # %cond.store19 5044; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 5045; AVX1-NEXT: testl $2048, %eax # imm = 0x800 5046; AVX1-NEXT: je .LBB15_24 5047; AVX1-NEXT: .LBB15_23: # %cond.store21 5048; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 5049; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 5050; AVX1-NEXT: je .LBB15_26 5051; AVX1-NEXT: .LBB15_25: # %cond.store23 5052; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 5053; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 5054; AVX1-NEXT: je .LBB15_28 5055; AVX1-NEXT: .LBB15_27: # %cond.store25 5056; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 5057; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 5058; AVX1-NEXT: je .LBB15_30 5059; AVX1-NEXT: .LBB15_29: # %cond.store27 5060; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 5061; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 5062; AVX1-NEXT: jne .LBB15_31 5063; AVX1-NEXT: jmp .LBB15_32 5064; AVX1-NEXT: .LBB15_33: # %cond.store31 5065; AVX1-NEXT: vpextrb $0, %xmm0, 16(%rdi) 5066; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 5067; AVX1-NEXT: je .LBB15_36 5068; AVX1-NEXT: .LBB15_35: # %cond.store33 5069; AVX1-NEXT: vpextrb $1, %xmm0, 17(%rdi) 5070; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 5071; AVX1-NEXT: je .LBB15_38 5072; AVX1-NEXT: .LBB15_37: # %cond.store35 5073; AVX1-NEXT: vpextrb $2, %xmm0, 18(%rdi) 5074; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 5075; AVX1-NEXT: je .LBB15_40 5076; AVX1-NEXT: .LBB15_39: # %cond.store37 5077; AVX1-NEXT: vpextrb $3, %xmm0, 19(%rdi) 5078; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 5079; AVX1-NEXT: je .LBB15_42 5080; AVX1-NEXT: .LBB15_41: # %cond.store39 5081; AVX1-NEXT: vpextrb $4, %xmm0, 20(%rdi) 5082; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 5083; AVX1-NEXT: je .LBB15_44 5084; AVX1-NEXT: .LBB15_43: # %cond.store41 5085; AVX1-NEXT: vpextrb $5, %xmm0, 21(%rdi) 5086; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 5087; AVX1-NEXT: je .LBB15_46 5088; AVX1-NEXT: .LBB15_45: # %cond.store43 5089; AVX1-NEXT: vpextrb $6, %xmm0, 22(%rdi) 5090; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 5091; AVX1-NEXT: je .LBB15_48 5092; AVX1-NEXT: .LBB15_47: # %cond.store45 5093; AVX1-NEXT: vpextrb $7, %xmm0, 23(%rdi) 5094; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 5095; AVX1-NEXT: je .LBB15_50 5096; AVX1-NEXT: .LBB15_49: # %cond.store47 5097; AVX1-NEXT: vpextrb $8, %xmm0, 24(%rdi) 5098; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 5099; AVX1-NEXT: je .LBB15_52 5100; AVX1-NEXT: .LBB15_51: # %cond.store49 5101; AVX1-NEXT: vpextrb $9, %xmm0, 25(%rdi) 5102; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 5103; AVX1-NEXT: je .LBB15_54 5104; AVX1-NEXT: .LBB15_53: # %cond.store51 5105; AVX1-NEXT: vpextrb $10, %xmm0, 26(%rdi) 5106; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 5107; AVX1-NEXT: je .LBB15_56 5108; AVX1-NEXT: .LBB15_55: # %cond.store53 5109; AVX1-NEXT: vpextrb $11, %xmm0, 27(%rdi) 5110; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 5111; AVX1-NEXT: je .LBB15_58 5112; AVX1-NEXT: .LBB15_57: # %cond.store55 5113; AVX1-NEXT: vpextrb $12, %xmm0, 28(%rdi) 5114; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 5115; AVX1-NEXT: je .LBB15_60 5116; AVX1-NEXT: .LBB15_59: # %cond.store57 5117; AVX1-NEXT: vpextrb $13, %xmm0, 29(%rdi) 5118; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 5119; AVX1-NEXT: je .LBB15_62 5120; AVX1-NEXT: .LBB15_61: # %cond.store59 5121; AVX1-NEXT: vpextrb $14, %xmm0, 30(%rdi) 5122; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5123; AVX1-NEXT: je .LBB15_64 5124; AVX1-NEXT: .LBB15_63: # %cond.store61 5125; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) 5126; AVX1-NEXT: vzeroupper 5127; AVX1-NEXT: retq 5128; 5129; AVX2-LABEL: truncstore_v32i16_v32i8: 5130; AVX2: # %bb.0: 5131; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 5132; AVX2-NEXT: vpbroadcastw {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] 5133; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1 5134; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 5135; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 5136; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 5137; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm1 5138; AVX2-NEXT: vpmovmskb %ymm1, %eax 5139; AVX2-NEXT: notl %eax 5140; AVX2-NEXT: testb $1, %al 5141; AVX2-NEXT: jne .LBB15_1 5142; AVX2-NEXT: # %bb.2: # %else 5143; AVX2-NEXT: testb $2, %al 5144; AVX2-NEXT: jne .LBB15_3 5145; AVX2-NEXT: .LBB15_4: # %else2 5146; AVX2-NEXT: testb $4, %al 5147; AVX2-NEXT: jne .LBB15_5 5148; AVX2-NEXT: .LBB15_6: # %else4 5149; AVX2-NEXT: testb $8, %al 5150; AVX2-NEXT: jne .LBB15_7 5151; AVX2-NEXT: .LBB15_8: # %else6 5152; AVX2-NEXT: testb $16, %al 5153; AVX2-NEXT: jne .LBB15_9 5154; AVX2-NEXT: .LBB15_10: # %else8 5155; AVX2-NEXT: testb $32, %al 5156; AVX2-NEXT: jne .LBB15_11 5157; AVX2-NEXT: .LBB15_12: # %else10 5158; AVX2-NEXT: testb $64, %al 5159; AVX2-NEXT: jne .LBB15_13 5160; AVX2-NEXT: .LBB15_14: # %else12 5161; AVX2-NEXT: testb $-128, %al 5162; AVX2-NEXT: jne .LBB15_15 5163; AVX2-NEXT: .LBB15_16: # %else14 5164; AVX2-NEXT: testl $256, %eax # imm = 0x100 5165; AVX2-NEXT: jne .LBB15_17 5166; AVX2-NEXT: .LBB15_18: # %else16 5167; AVX2-NEXT: testl $512, %eax # imm = 0x200 5168; AVX2-NEXT: jne .LBB15_19 5169; AVX2-NEXT: .LBB15_20: # %else18 5170; AVX2-NEXT: testl $1024, %eax # imm = 0x400 5171; AVX2-NEXT: jne .LBB15_21 5172; AVX2-NEXT: .LBB15_22: # %else20 5173; AVX2-NEXT: testl $2048, %eax # imm = 0x800 5174; AVX2-NEXT: jne .LBB15_23 5175; AVX2-NEXT: .LBB15_24: # %else22 5176; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 5177; AVX2-NEXT: jne .LBB15_25 5178; AVX2-NEXT: .LBB15_26: # %else24 5179; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 5180; AVX2-NEXT: jne .LBB15_27 5181; AVX2-NEXT: .LBB15_28: # %else26 5182; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 5183; AVX2-NEXT: jne .LBB15_29 5184; AVX2-NEXT: .LBB15_30: # %else28 5185; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 5186; AVX2-NEXT: je .LBB15_32 5187; AVX2-NEXT: .LBB15_31: # %cond.store29 5188; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 5189; AVX2-NEXT: .LBB15_32: # %else30 5190; AVX2-NEXT: testl $65536, %eax # imm = 0x10000 5191; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 5192; AVX2-NEXT: jne .LBB15_33 5193; AVX2-NEXT: # %bb.34: # %else32 5194; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 5195; AVX2-NEXT: jne .LBB15_35 5196; AVX2-NEXT: .LBB15_36: # %else34 5197; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 5198; AVX2-NEXT: jne .LBB15_37 5199; AVX2-NEXT: .LBB15_38: # %else36 5200; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 5201; AVX2-NEXT: jne .LBB15_39 5202; AVX2-NEXT: .LBB15_40: # %else38 5203; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 5204; AVX2-NEXT: jne .LBB15_41 5205; AVX2-NEXT: .LBB15_42: # %else40 5206; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 5207; AVX2-NEXT: jne .LBB15_43 5208; AVX2-NEXT: .LBB15_44: # %else42 5209; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 5210; AVX2-NEXT: jne .LBB15_45 5211; AVX2-NEXT: .LBB15_46: # %else44 5212; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 5213; AVX2-NEXT: jne .LBB15_47 5214; AVX2-NEXT: .LBB15_48: # %else46 5215; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 5216; AVX2-NEXT: jne .LBB15_49 5217; AVX2-NEXT: .LBB15_50: # %else48 5218; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 5219; AVX2-NEXT: jne .LBB15_51 5220; AVX2-NEXT: .LBB15_52: # %else50 5221; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 5222; AVX2-NEXT: jne .LBB15_53 5223; AVX2-NEXT: .LBB15_54: # %else52 5224; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 5225; AVX2-NEXT: jne .LBB15_55 5226; AVX2-NEXT: .LBB15_56: # %else54 5227; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 5228; AVX2-NEXT: jne .LBB15_57 5229; AVX2-NEXT: .LBB15_58: # %else56 5230; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 5231; AVX2-NEXT: jne .LBB15_59 5232; AVX2-NEXT: .LBB15_60: # %else58 5233; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 5234; AVX2-NEXT: jne .LBB15_61 5235; AVX2-NEXT: .LBB15_62: # %else60 5236; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5237; AVX2-NEXT: jne .LBB15_63 5238; AVX2-NEXT: .LBB15_64: # %else62 5239; AVX2-NEXT: vzeroupper 5240; AVX2-NEXT: retq 5241; AVX2-NEXT: .LBB15_1: # %cond.store 5242; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 5243; AVX2-NEXT: testb $2, %al 5244; AVX2-NEXT: je .LBB15_4 5245; AVX2-NEXT: .LBB15_3: # %cond.store1 5246; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5247; AVX2-NEXT: testb $4, %al 5248; AVX2-NEXT: je .LBB15_6 5249; AVX2-NEXT: .LBB15_5: # %cond.store3 5250; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5251; AVX2-NEXT: testb $8, %al 5252; AVX2-NEXT: je .LBB15_8 5253; AVX2-NEXT: .LBB15_7: # %cond.store5 5254; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5255; AVX2-NEXT: testb $16, %al 5256; AVX2-NEXT: je .LBB15_10 5257; AVX2-NEXT: .LBB15_9: # %cond.store7 5258; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 5259; AVX2-NEXT: testb $32, %al 5260; AVX2-NEXT: je .LBB15_12 5261; AVX2-NEXT: .LBB15_11: # %cond.store9 5262; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 5263; AVX2-NEXT: testb $64, %al 5264; AVX2-NEXT: je .LBB15_14 5265; AVX2-NEXT: .LBB15_13: # %cond.store11 5266; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 5267; AVX2-NEXT: testb $-128, %al 5268; AVX2-NEXT: je .LBB15_16 5269; AVX2-NEXT: .LBB15_15: # %cond.store13 5270; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 5271; AVX2-NEXT: testl $256, %eax # imm = 0x100 5272; AVX2-NEXT: je .LBB15_18 5273; AVX2-NEXT: .LBB15_17: # %cond.store15 5274; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 5275; AVX2-NEXT: testl $512, %eax # imm = 0x200 5276; AVX2-NEXT: je .LBB15_20 5277; AVX2-NEXT: .LBB15_19: # %cond.store17 5278; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 5279; AVX2-NEXT: testl $1024, %eax # imm = 0x400 5280; AVX2-NEXT: je .LBB15_22 5281; AVX2-NEXT: .LBB15_21: # %cond.store19 5282; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 5283; AVX2-NEXT: testl $2048, %eax # imm = 0x800 5284; AVX2-NEXT: je .LBB15_24 5285; AVX2-NEXT: .LBB15_23: # %cond.store21 5286; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 5287; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 5288; AVX2-NEXT: je .LBB15_26 5289; AVX2-NEXT: .LBB15_25: # %cond.store23 5290; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 5291; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 5292; AVX2-NEXT: je .LBB15_28 5293; AVX2-NEXT: .LBB15_27: # %cond.store25 5294; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 5295; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 5296; AVX2-NEXT: je .LBB15_30 5297; AVX2-NEXT: .LBB15_29: # %cond.store27 5298; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 5299; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 5300; AVX2-NEXT: jne .LBB15_31 5301; AVX2-NEXT: jmp .LBB15_32 5302; AVX2-NEXT: .LBB15_33: # %cond.store31 5303; AVX2-NEXT: vpextrb $0, %xmm0, 16(%rdi) 5304; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 5305; AVX2-NEXT: je .LBB15_36 5306; AVX2-NEXT: .LBB15_35: # %cond.store33 5307; AVX2-NEXT: vpextrb $1, %xmm0, 17(%rdi) 5308; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 5309; AVX2-NEXT: je .LBB15_38 5310; AVX2-NEXT: .LBB15_37: # %cond.store35 5311; AVX2-NEXT: vpextrb $2, %xmm0, 18(%rdi) 5312; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 5313; AVX2-NEXT: je .LBB15_40 5314; AVX2-NEXT: .LBB15_39: # %cond.store37 5315; AVX2-NEXT: vpextrb $3, %xmm0, 19(%rdi) 5316; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 5317; AVX2-NEXT: je .LBB15_42 5318; AVX2-NEXT: .LBB15_41: # %cond.store39 5319; AVX2-NEXT: vpextrb $4, %xmm0, 20(%rdi) 5320; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 5321; AVX2-NEXT: je .LBB15_44 5322; AVX2-NEXT: .LBB15_43: # %cond.store41 5323; AVX2-NEXT: vpextrb $5, %xmm0, 21(%rdi) 5324; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 5325; AVX2-NEXT: je .LBB15_46 5326; AVX2-NEXT: .LBB15_45: # %cond.store43 5327; AVX2-NEXT: vpextrb $6, %xmm0, 22(%rdi) 5328; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 5329; AVX2-NEXT: je .LBB15_48 5330; AVX2-NEXT: .LBB15_47: # %cond.store45 5331; AVX2-NEXT: vpextrb $7, %xmm0, 23(%rdi) 5332; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 5333; AVX2-NEXT: je .LBB15_50 5334; AVX2-NEXT: .LBB15_49: # %cond.store47 5335; AVX2-NEXT: vpextrb $8, %xmm0, 24(%rdi) 5336; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 5337; AVX2-NEXT: je .LBB15_52 5338; AVX2-NEXT: .LBB15_51: # %cond.store49 5339; AVX2-NEXT: vpextrb $9, %xmm0, 25(%rdi) 5340; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 5341; AVX2-NEXT: je .LBB15_54 5342; AVX2-NEXT: .LBB15_53: # %cond.store51 5343; AVX2-NEXT: vpextrb $10, %xmm0, 26(%rdi) 5344; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 5345; AVX2-NEXT: je .LBB15_56 5346; AVX2-NEXT: .LBB15_55: # %cond.store53 5347; AVX2-NEXT: vpextrb $11, %xmm0, 27(%rdi) 5348; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 5349; AVX2-NEXT: je .LBB15_58 5350; AVX2-NEXT: .LBB15_57: # %cond.store55 5351; AVX2-NEXT: vpextrb $12, %xmm0, 28(%rdi) 5352; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 5353; AVX2-NEXT: je .LBB15_60 5354; AVX2-NEXT: .LBB15_59: # %cond.store57 5355; AVX2-NEXT: vpextrb $13, %xmm0, 29(%rdi) 5356; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 5357; AVX2-NEXT: je .LBB15_62 5358; AVX2-NEXT: .LBB15_61: # %cond.store59 5359; AVX2-NEXT: vpextrb $14, %xmm0, 30(%rdi) 5360; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5361; AVX2-NEXT: je .LBB15_64 5362; AVX2-NEXT: .LBB15_63: # %cond.store61 5363; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) 5364; AVX2-NEXT: vzeroupper 5365; AVX2-NEXT: retq 5366; 5367; AVX512F-LABEL: truncstore_v32i16_v32i8: 5368; AVX512F: # %bb.0: 5369; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 5370; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 5371; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm2 = 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 5372; AVX512F-NEXT: vpmovdb %zmm2, %xmm2 5373; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm0 5374; AVX512F-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 5375; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 5376; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm2, %ymm0 5377; AVX512F-NEXT: vpmovmskb %ymm1, %eax 5378; AVX512F-NEXT: notl %eax 5379; AVX512F-NEXT: testb $1, %al 5380; AVX512F-NEXT: jne .LBB15_1 5381; AVX512F-NEXT: # %bb.2: # %else 5382; AVX512F-NEXT: testb $2, %al 5383; AVX512F-NEXT: jne .LBB15_3 5384; AVX512F-NEXT: .LBB15_4: # %else2 5385; AVX512F-NEXT: testb $4, %al 5386; AVX512F-NEXT: jne .LBB15_5 5387; AVX512F-NEXT: .LBB15_6: # %else4 5388; AVX512F-NEXT: testb $8, %al 5389; AVX512F-NEXT: jne .LBB15_7 5390; AVX512F-NEXT: .LBB15_8: # %else6 5391; AVX512F-NEXT: testb $16, %al 5392; AVX512F-NEXT: jne .LBB15_9 5393; AVX512F-NEXT: .LBB15_10: # %else8 5394; AVX512F-NEXT: testb $32, %al 5395; AVX512F-NEXT: jne .LBB15_11 5396; AVX512F-NEXT: .LBB15_12: # %else10 5397; AVX512F-NEXT: testb $64, %al 5398; AVX512F-NEXT: jne .LBB15_13 5399; AVX512F-NEXT: .LBB15_14: # %else12 5400; AVX512F-NEXT: testb $-128, %al 5401; AVX512F-NEXT: jne .LBB15_15 5402; AVX512F-NEXT: .LBB15_16: # %else14 5403; AVX512F-NEXT: testl $256, %eax # imm = 0x100 5404; AVX512F-NEXT: jne .LBB15_17 5405; AVX512F-NEXT: .LBB15_18: # %else16 5406; AVX512F-NEXT: testl $512, %eax # imm = 0x200 5407; AVX512F-NEXT: jne .LBB15_19 5408; AVX512F-NEXT: .LBB15_20: # %else18 5409; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 5410; AVX512F-NEXT: jne .LBB15_21 5411; AVX512F-NEXT: .LBB15_22: # %else20 5412; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 5413; AVX512F-NEXT: jne .LBB15_23 5414; AVX512F-NEXT: .LBB15_24: # %else22 5415; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 5416; AVX512F-NEXT: jne .LBB15_25 5417; AVX512F-NEXT: .LBB15_26: # %else24 5418; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 5419; AVX512F-NEXT: jne .LBB15_27 5420; AVX512F-NEXT: .LBB15_28: # %else26 5421; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 5422; AVX512F-NEXT: jne .LBB15_29 5423; AVX512F-NEXT: .LBB15_30: # %else28 5424; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 5425; AVX512F-NEXT: je .LBB15_32 5426; AVX512F-NEXT: .LBB15_31: # %cond.store29 5427; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 5428; AVX512F-NEXT: .LBB15_32: # %else30 5429; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000 5430; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 5431; AVX512F-NEXT: jne .LBB15_33 5432; AVX512F-NEXT: # %bb.34: # %else32 5433; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 5434; AVX512F-NEXT: jne .LBB15_35 5435; AVX512F-NEXT: .LBB15_36: # %else34 5436; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 5437; AVX512F-NEXT: jne .LBB15_37 5438; AVX512F-NEXT: .LBB15_38: # %else36 5439; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 5440; AVX512F-NEXT: jne .LBB15_39 5441; AVX512F-NEXT: .LBB15_40: # %else38 5442; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 5443; AVX512F-NEXT: jne .LBB15_41 5444; AVX512F-NEXT: .LBB15_42: # %else40 5445; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 5446; AVX512F-NEXT: jne .LBB15_43 5447; AVX512F-NEXT: .LBB15_44: # %else42 5448; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 5449; AVX512F-NEXT: jne .LBB15_45 5450; AVX512F-NEXT: .LBB15_46: # %else44 5451; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 5452; AVX512F-NEXT: jne .LBB15_47 5453; AVX512F-NEXT: .LBB15_48: # %else46 5454; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 5455; AVX512F-NEXT: jne .LBB15_49 5456; AVX512F-NEXT: .LBB15_50: # %else48 5457; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 5458; AVX512F-NEXT: jne .LBB15_51 5459; AVX512F-NEXT: .LBB15_52: # %else50 5460; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 5461; AVX512F-NEXT: jne .LBB15_53 5462; AVX512F-NEXT: .LBB15_54: # %else52 5463; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 5464; AVX512F-NEXT: jne .LBB15_55 5465; AVX512F-NEXT: .LBB15_56: # %else54 5466; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 5467; AVX512F-NEXT: jne .LBB15_57 5468; AVX512F-NEXT: .LBB15_58: # %else56 5469; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 5470; AVX512F-NEXT: jne .LBB15_59 5471; AVX512F-NEXT: .LBB15_60: # %else58 5472; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 5473; AVX512F-NEXT: jne .LBB15_61 5474; AVX512F-NEXT: .LBB15_62: # %else60 5475; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5476; AVX512F-NEXT: jne .LBB15_63 5477; AVX512F-NEXT: .LBB15_64: # %else62 5478; AVX512F-NEXT: vzeroupper 5479; AVX512F-NEXT: retq 5480; AVX512F-NEXT: .LBB15_1: # %cond.store 5481; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 5482; AVX512F-NEXT: testb $2, %al 5483; AVX512F-NEXT: je .LBB15_4 5484; AVX512F-NEXT: .LBB15_3: # %cond.store1 5485; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5486; AVX512F-NEXT: testb $4, %al 5487; AVX512F-NEXT: je .LBB15_6 5488; AVX512F-NEXT: .LBB15_5: # %cond.store3 5489; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5490; AVX512F-NEXT: testb $8, %al 5491; AVX512F-NEXT: je .LBB15_8 5492; AVX512F-NEXT: .LBB15_7: # %cond.store5 5493; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5494; AVX512F-NEXT: testb $16, %al 5495; AVX512F-NEXT: je .LBB15_10 5496; AVX512F-NEXT: .LBB15_9: # %cond.store7 5497; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 5498; AVX512F-NEXT: testb $32, %al 5499; AVX512F-NEXT: je .LBB15_12 5500; AVX512F-NEXT: .LBB15_11: # %cond.store9 5501; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 5502; AVX512F-NEXT: testb $64, %al 5503; AVX512F-NEXT: je .LBB15_14 5504; AVX512F-NEXT: .LBB15_13: # %cond.store11 5505; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 5506; AVX512F-NEXT: testb $-128, %al 5507; AVX512F-NEXT: je .LBB15_16 5508; AVX512F-NEXT: .LBB15_15: # %cond.store13 5509; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 5510; AVX512F-NEXT: testl $256, %eax # imm = 0x100 5511; AVX512F-NEXT: je .LBB15_18 5512; AVX512F-NEXT: .LBB15_17: # %cond.store15 5513; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 5514; AVX512F-NEXT: testl $512, %eax # imm = 0x200 5515; AVX512F-NEXT: je .LBB15_20 5516; AVX512F-NEXT: .LBB15_19: # %cond.store17 5517; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 5518; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 5519; AVX512F-NEXT: je .LBB15_22 5520; AVX512F-NEXT: .LBB15_21: # %cond.store19 5521; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 5522; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 5523; AVX512F-NEXT: je .LBB15_24 5524; AVX512F-NEXT: .LBB15_23: # %cond.store21 5525; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 5526; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 5527; AVX512F-NEXT: je .LBB15_26 5528; AVX512F-NEXT: .LBB15_25: # %cond.store23 5529; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 5530; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 5531; AVX512F-NEXT: je .LBB15_28 5532; AVX512F-NEXT: .LBB15_27: # %cond.store25 5533; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 5534; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 5535; AVX512F-NEXT: je .LBB15_30 5536; AVX512F-NEXT: .LBB15_29: # %cond.store27 5537; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 5538; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 5539; AVX512F-NEXT: jne .LBB15_31 5540; AVX512F-NEXT: jmp .LBB15_32 5541; AVX512F-NEXT: .LBB15_33: # %cond.store31 5542; AVX512F-NEXT: vpextrb $0, %xmm0, 16(%rdi) 5543; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 5544; AVX512F-NEXT: je .LBB15_36 5545; AVX512F-NEXT: .LBB15_35: # %cond.store33 5546; AVX512F-NEXT: vpextrb $1, %xmm0, 17(%rdi) 5547; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 5548; AVX512F-NEXT: je .LBB15_38 5549; AVX512F-NEXT: .LBB15_37: # %cond.store35 5550; AVX512F-NEXT: vpextrb $2, %xmm0, 18(%rdi) 5551; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 5552; AVX512F-NEXT: je .LBB15_40 5553; AVX512F-NEXT: .LBB15_39: # %cond.store37 5554; AVX512F-NEXT: vpextrb $3, %xmm0, 19(%rdi) 5555; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 5556; AVX512F-NEXT: je .LBB15_42 5557; AVX512F-NEXT: .LBB15_41: # %cond.store39 5558; AVX512F-NEXT: vpextrb $4, %xmm0, 20(%rdi) 5559; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 5560; AVX512F-NEXT: je .LBB15_44 5561; AVX512F-NEXT: .LBB15_43: # %cond.store41 5562; AVX512F-NEXT: vpextrb $5, %xmm0, 21(%rdi) 5563; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 5564; AVX512F-NEXT: je .LBB15_46 5565; AVX512F-NEXT: .LBB15_45: # %cond.store43 5566; AVX512F-NEXT: vpextrb $6, %xmm0, 22(%rdi) 5567; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 5568; AVX512F-NEXT: je .LBB15_48 5569; AVX512F-NEXT: .LBB15_47: # %cond.store45 5570; AVX512F-NEXT: vpextrb $7, %xmm0, 23(%rdi) 5571; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 5572; AVX512F-NEXT: je .LBB15_50 5573; AVX512F-NEXT: .LBB15_49: # %cond.store47 5574; AVX512F-NEXT: vpextrb $8, %xmm0, 24(%rdi) 5575; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 5576; AVX512F-NEXT: je .LBB15_52 5577; AVX512F-NEXT: .LBB15_51: # %cond.store49 5578; AVX512F-NEXT: vpextrb $9, %xmm0, 25(%rdi) 5579; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 5580; AVX512F-NEXT: je .LBB15_54 5581; AVX512F-NEXT: .LBB15_53: # %cond.store51 5582; AVX512F-NEXT: vpextrb $10, %xmm0, 26(%rdi) 5583; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 5584; AVX512F-NEXT: je .LBB15_56 5585; AVX512F-NEXT: .LBB15_55: # %cond.store53 5586; AVX512F-NEXT: vpextrb $11, %xmm0, 27(%rdi) 5587; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 5588; AVX512F-NEXT: je .LBB15_58 5589; AVX512F-NEXT: .LBB15_57: # %cond.store55 5590; AVX512F-NEXT: vpextrb $12, %xmm0, 28(%rdi) 5591; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 5592; AVX512F-NEXT: je .LBB15_60 5593; AVX512F-NEXT: .LBB15_59: # %cond.store57 5594; AVX512F-NEXT: vpextrb $13, %xmm0, 29(%rdi) 5595; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 5596; AVX512F-NEXT: je .LBB15_62 5597; AVX512F-NEXT: .LBB15_61: # %cond.store59 5598; AVX512F-NEXT: vpextrb $14, %xmm0, 30(%rdi) 5599; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5600; AVX512F-NEXT: je .LBB15_64 5601; AVX512F-NEXT: .LBB15_63: # %cond.store61 5602; AVX512F-NEXT: vpextrb $15, %xmm0, 31(%rdi) 5603; AVX512F-NEXT: vzeroupper 5604; AVX512F-NEXT: retq 5605; 5606; AVX512BW-LABEL: truncstore_v32i16_v32i8: 5607; AVX512BW: # %bb.0: 5608; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 5609; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k1 5610; AVX512BW-NEXT: vpmovwb %zmm0, (%rdi) {%k1} 5611; AVX512BW-NEXT: vzeroupper 5612; AVX512BW-NEXT: retq 5613; 5614; AVX512BWVL-LABEL: truncstore_v32i16_v32i8: 5615; AVX512BWVL: # %bb.0: 5616; AVX512BWVL-NEXT: vptestmb %ymm1, %ymm1, %k1 5617; AVX512BWVL-NEXT: vpmovwb %zmm0, (%rdi) {%k1} 5618; AVX512BWVL-NEXT: vzeroupper 5619; AVX512BWVL-NEXT: retq 5620 %a = icmp ne <32 x i8> %mask, zeroinitializer 5621 %b = trunc <32 x i16> %x to <32 x i8> 5622 call void @llvm.masked.store.v32i8.p0v32i8(<32 x i8> %b, <32 x i8>* %p, i32 1, <32 x i1> %a) 5623 ret void 5624} 5625 5626define void @truncstore_v16i16_v16i8(<16 x i16> %x, <16 x i8>* %p, <16 x i8> %mask) { 5627; SSE2-LABEL: truncstore_v16i16_v16i8: 5628; SSE2: # %bb.0: 5629; SSE2-NEXT: pxor %xmm3, %xmm3 5630; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 5631; SSE2-NEXT: pand %xmm4, %xmm1 5632; SSE2-NEXT: pand %xmm4, %xmm0 5633; SSE2-NEXT: packuswb %xmm1, %xmm0 5634; SSE2-NEXT: pcmpeqb %xmm2, %xmm3 5635; SSE2-NEXT: pmovmskb %xmm3, %eax 5636; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 5637; SSE2-NEXT: testb $1, %al 5638; SSE2-NEXT: movd %xmm0, %ecx 5639; SSE2-NEXT: jne .LBB16_1 5640; SSE2-NEXT: # %bb.2: # %else 5641; SSE2-NEXT: testb $2, %al 5642; SSE2-NEXT: jne .LBB16_3 5643; SSE2-NEXT: .LBB16_4: # %else2 5644; SSE2-NEXT: testb $4, %al 5645; SSE2-NEXT: jne .LBB16_5 5646; SSE2-NEXT: .LBB16_6: # %else4 5647; SSE2-NEXT: testb $8, %al 5648; SSE2-NEXT: je .LBB16_8 5649; SSE2-NEXT: .LBB16_7: # %cond.store5 5650; SSE2-NEXT: shrl $24, %ecx 5651; SSE2-NEXT: movb %cl, 3(%rdi) 5652; SSE2-NEXT: .LBB16_8: # %else6 5653; SSE2-NEXT: testb $16, %al 5654; SSE2-NEXT: pextrw $2, %xmm0, %ecx 5655; SSE2-NEXT: je .LBB16_10 5656; SSE2-NEXT: # %bb.9: # %cond.store7 5657; SSE2-NEXT: movb %cl, 4(%rdi) 5658; SSE2-NEXT: .LBB16_10: # %else8 5659; SSE2-NEXT: testb $32, %al 5660; SSE2-NEXT: je .LBB16_12 5661; SSE2-NEXT: # %bb.11: # %cond.store9 5662; SSE2-NEXT: movb %ch, 5(%rdi) 5663; SSE2-NEXT: .LBB16_12: # %else10 5664; SSE2-NEXT: testb $64, %al 5665; SSE2-NEXT: pextrw $3, %xmm0, %ecx 5666; SSE2-NEXT: je .LBB16_14 5667; SSE2-NEXT: # %bb.13: # %cond.store11 5668; SSE2-NEXT: movb %cl, 6(%rdi) 5669; SSE2-NEXT: .LBB16_14: # %else12 5670; SSE2-NEXT: testb $-128, %al 5671; SSE2-NEXT: je .LBB16_16 5672; SSE2-NEXT: # %bb.15: # %cond.store13 5673; SSE2-NEXT: movb %ch, 7(%rdi) 5674; SSE2-NEXT: .LBB16_16: # %else14 5675; SSE2-NEXT: testl $256, %eax # imm = 0x100 5676; SSE2-NEXT: pextrw $4, %xmm0, %ecx 5677; SSE2-NEXT: je .LBB16_18 5678; SSE2-NEXT: # %bb.17: # %cond.store15 5679; SSE2-NEXT: movb %cl, 8(%rdi) 5680; SSE2-NEXT: .LBB16_18: # %else16 5681; SSE2-NEXT: testl $512, %eax # imm = 0x200 5682; SSE2-NEXT: je .LBB16_20 5683; SSE2-NEXT: # %bb.19: # %cond.store17 5684; SSE2-NEXT: movb %ch, 9(%rdi) 5685; SSE2-NEXT: .LBB16_20: # %else18 5686; SSE2-NEXT: testl $1024, %eax # imm = 0x400 5687; SSE2-NEXT: pextrw $5, %xmm0, %ecx 5688; SSE2-NEXT: je .LBB16_22 5689; SSE2-NEXT: # %bb.21: # %cond.store19 5690; SSE2-NEXT: movb %cl, 10(%rdi) 5691; SSE2-NEXT: .LBB16_22: # %else20 5692; SSE2-NEXT: testl $2048, %eax # imm = 0x800 5693; SSE2-NEXT: je .LBB16_24 5694; SSE2-NEXT: # %bb.23: # %cond.store21 5695; SSE2-NEXT: movb %ch, 11(%rdi) 5696; SSE2-NEXT: .LBB16_24: # %else22 5697; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 5698; SSE2-NEXT: pextrw $6, %xmm0, %ecx 5699; SSE2-NEXT: je .LBB16_26 5700; SSE2-NEXT: # %bb.25: # %cond.store23 5701; SSE2-NEXT: movb %cl, 12(%rdi) 5702; SSE2-NEXT: .LBB16_26: # %else24 5703; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 5704; SSE2-NEXT: je .LBB16_28 5705; SSE2-NEXT: # %bb.27: # %cond.store25 5706; SSE2-NEXT: movb %ch, 13(%rdi) 5707; SSE2-NEXT: .LBB16_28: # %else26 5708; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 5709; SSE2-NEXT: pextrw $7, %xmm0, %ecx 5710; SSE2-NEXT: jne .LBB16_29 5711; SSE2-NEXT: # %bb.30: # %else28 5712; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 5713; SSE2-NEXT: jne .LBB16_31 5714; SSE2-NEXT: .LBB16_32: # %else30 5715; SSE2-NEXT: retq 5716; SSE2-NEXT: .LBB16_1: # %cond.store 5717; SSE2-NEXT: movb %cl, (%rdi) 5718; SSE2-NEXT: testb $2, %al 5719; SSE2-NEXT: je .LBB16_4 5720; SSE2-NEXT: .LBB16_3: # %cond.store1 5721; SSE2-NEXT: movb %ch, 1(%rdi) 5722; SSE2-NEXT: testb $4, %al 5723; SSE2-NEXT: je .LBB16_6 5724; SSE2-NEXT: .LBB16_5: # %cond.store3 5725; SSE2-NEXT: movl %ecx, %edx 5726; SSE2-NEXT: shrl $16, %edx 5727; SSE2-NEXT: movb %dl, 2(%rdi) 5728; SSE2-NEXT: testb $8, %al 5729; SSE2-NEXT: jne .LBB16_7 5730; SSE2-NEXT: jmp .LBB16_8 5731; SSE2-NEXT: .LBB16_29: # %cond.store27 5732; SSE2-NEXT: movb %cl, 14(%rdi) 5733; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 5734; SSE2-NEXT: je .LBB16_32 5735; SSE2-NEXT: .LBB16_31: # %cond.store29 5736; SSE2-NEXT: movb %ch, 15(%rdi) 5737; SSE2-NEXT: retq 5738; 5739; SSE4-LABEL: truncstore_v16i16_v16i8: 5740; SSE4: # %bb.0: 5741; SSE4-NEXT: pxor %xmm3, %xmm3 5742; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,0,255,0,255,0,255,0,255,0,255,0,255,0] 5743; SSE4-NEXT: pand %xmm4, %xmm1 5744; SSE4-NEXT: pand %xmm4, %xmm0 5745; SSE4-NEXT: packuswb %xmm1, %xmm0 5746; SSE4-NEXT: pcmpeqb %xmm2, %xmm3 5747; SSE4-NEXT: pmovmskb %xmm3, %eax 5748; SSE4-NEXT: xorl $65535, %eax # imm = 0xFFFF 5749; SSE4-NEXT: testb $1, %al 5750; SSE4-NEXT: jne .LBB16_1 5751; SSE4-NEXT: # %bb.2: # %else 5752; SSE4-NEXT: testb $2, %al 5753; SSE4-NEXT: jne .LBB16_3 5754; SSE4-NEXT: .LBB16_4: # %else2 5755; SSE4-NEXT: testb $4, %al 5756; SSE4-NEXT: jne .LBB16_5 5757; SSE4-NEXT: .LBB16_6: # %else4 5758; SSE4-NEXT: testb $8, %al 5759; SSE4-NEXT: jne .LBB16_7 5760; SSE4-NEXT: .LBB16_8: # %else6 5761; SSE4-NEXT: testb $16, %al 5762; SSE4-NEXT: jne .LBB16_9 5763; SSE4-NEXT: .LBB16_10: # %else8 5764; SSE4-NEXT: testb $32, %al 5765; SSE4-NEXT: jne .LBB16_11 5766; SSE4-NEXT: .LBB16_12: # %else10 5767; SSE4-NEXT: testb $64, %al 5768; SSE4-NEXT: jne .LBB16_13 5769; SSE4-NEXT: .LBB16_14: # %else12 5770; SSE4-NEXT: testb $-128, %al 5771; SSE4-NEXT: jne .LBB16_15 5772; SSE4-NEXT: .LBB16_16: # %else14 5773; SSE4-NEXT: testl $256, %eax # imm = 0x100 5774; SSE4-NEXT: jne .LBB16_17 5775; SSE4-NEXT: .LBB16_18: # %else16 5776; SSE4-NEXT: testl $512, %eax # imm = 0x200 5777; SSE4-NEXT: jne .LBB16_19 5778; SSE4-NEXT: .LBB16_20: # %else18 5779; SSE4-NEXT: testl $1024, %eax # imm = 0x400 5780; SSE4-NEXT: jne .LBB16_21 5781; SSE4-NEXT: .LBB16_22: # %else20 5782; SSE4-NEXT: testl $2048, %eax # imm = 0x800 5783; SSE4-NEXT: jne .LBB16_23 5784; SSE4-NEXT: .LBB16_24: # %else22 5785; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 5786; SSE4-NEXT: jne .LBB16_25 5787; SSE4-NEXT: .LBB16_26: # %else24 5788; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 5789; SSE4-NEXT: jne .LBB16_27 5790; SSE4-NEXT: .LBB16_28: # %else26 5791; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 5792; SSE4-NEXT: jne .LBB16_29 5793; SSE4-NEXT: .LBB16_30: # %else28 5794; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 5795; SSE4-NEXT: jne .LBB16_31 5796; SSE4-NEXT: .LBB16_32: # %else30 5797; SSE4-NEXT: retq 5798; SSE4-NEXT: .LBB16_1: # %cond.store 5799; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 5800; SSE4-NEXT: testb $2, %al 5801; SSE4-NEXT: je .LBB16_4 5802; SSE4-NEXT: .LBB16_3: # %cond.store1 5803; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 5804; SSE4-NEXT: testb $4, %al 5805; SSE4-NEXT: je .LBB16_6 5806; SSE4-NEXT: .LBB16_5: # %cond.store3 5807; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 5808; SSE4-NEXT: testb $8, %al 5809; SSE4-NEXT: je .LBB16_8 5810; SSE4-NEXT: .LBB16_7: # %cond.store5 5811; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 5812; SSE4-NEXT: testb $16, %al 5813; SSE4-NEXT: je .LBB16_10 5814; SSE4-NEXT: .LBB16_9: # %cond.store7 5815; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 5816; SSE4-NEXT: testb $32, %al 5817; SSE4-NEXT: je .LBB16_12 5818; SSE4-NEXT: .LBB16_11: # %cond.store9 5819; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 5820; SSE4-NEXT: testb $64, %al 5821; SSE4-NEXT: je .LBB16_14 5822; SSE4-NEXT: .LBB16_13: # %cond.store11 5823; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 5824; SSE4-NEXT: testb $-128, %al 5825; SSE4-NEXT: je .LBB16_16 5826; SSE4-NEXT: .LBB16_15: # %cond.store13 5827; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 5828; SSE4-NEXT: testl $256, %eax # imm = 0x100 5829; SSE4-NEXT: je .LBB16_18 5830; SSE4-NEXT: .LBB16_17: # %cond.store15 5831; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 5832; SSE4-NEXT: testl $512, %eax # imm = 0x200 5833; SSE4-NEXT: je .LBB16_20 5834; SSE4-NEXT: .LBB16_19: # %cond.store17 5835; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 5836; SSE4-NEXT: testl $1024, %eax # imm = 0x400 5837; SSE4-NEXT: je .LBB16_22 5838; SSE4-NEXT: .LBB16_21: # %cond.store19 5839; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 5840; SSE4-NEXT: testl $2048, %eax # imm = 0x800 5841; SSE4-NEXT: je .LBB16_24 5842; SSE4-NEXT: .LBB16_23: # %cond.store21 5843; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 5844; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 5845; SSE4-NEXT: je .LBB16_26 5846; SSE4-NEXT: .LBB16_25: # %cond.store23 5847; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 5848; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 5849; SSE4-NEXT: je .LBB16_28 5850; SSE4-NEXT: .LBB16_27: # %cond.store25 5851; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 5852; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 5853; SSE4-NEXT: je .LBB16_30 5854; SSE4-NEXT: .LBB16_29: # %cond.store27 5855; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 5856; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 5857; SSE4-NEXT: je .LBB16_32 5858; SSE4-NEXT: .LBB16_31: # %cond.store29 5859; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 5860; SSE4-NEXT: retq 5861; 5862; AVX1-LABEL: truncstore_v16i16_v16i8: 5863; AVX1: # %bb.0: 5864; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 5865; AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 5866; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 5867; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 5868; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 5869; AVX1-NEXT: vpmovmskb %xmm1, %eax 5870; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF 5871; AVX1-NEXT: testb $1, %al 5872; AVX1-NEXT: jne .LBB16_1 5873; AVX1-NEXT: # %bb.2: # %else 5874; AVX1-NEXT: testb $2, %al 5875; AVX1-NEXT: jne .LBB16_3 5876; AVX1-NEXT: .LBB16_4: # %else2 5877; AVX1-NEXT: testb $4, %al 5878; AVX1-NEXT: jne .LBB16_5 5879; AVX1-NEXT: .LBB16_6: # %else4 5880; AVX1-NEXT: testb $8, %al 5881; AVX1-NEXT: jne .LBB16_7 5882; AVX1-NEXT: .LBB16_8: # %else6 5883; AVX1-NEXT: testb $16, %al 5884; AVX1-NEXT: jne .LBB16_9 5885; AVX1-NEXT: .LBB16_10: # %else8 5886; AVX1-NEXT: testb $32, %al 5887; AVX1-NEXT: jne .LBB16_11 5888; AVX1-NEXT: .LBB16_12: # %else10 5889; AVX1-NEXT: testb $64, %al 5890; AVX1-NEXT: jne .LBB16_13 5891; AVX1-NEXT: .LBB16_14: # %else12 5892; AVX1-NEXT: testb $-128, %al 5893; AVX1-NEXT: jne .LBB16_15 5894; AVX1-NEXT: .LBB16_16: # %else14 5895; AVX1-NEXT: testl $256, %eax # imm = 0x100 5896; AVX1-NEXT: jne .LBB16_17 5897; AVX1-NEXT: .LBB16_18: # %else16 5898; AVX1-NEXT: testl $512, %eax # imm = 0x200 5899; AVX1-NEXT: jne .LBB16_19 5900; AVX1-NEXT: .LBB16_20: # %else18 5901; AVX1-NEXT: testl $1024, %eax # imm = 0x400 5902; AVX1-NEXT: jne .LBB16_21 5903; AVX1-NEXT: .LBB16_22: # %else20 5904; AVX1-NEXT: testl $2048, %eax # imm = 0x800 5905; AVX1-NEXT: jne .LBB16_23 5906; AVX1-NEXT: .LBB16_24: # %else22 5907; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 5908; AVX1-NEXT: jne .LBB16_25 5909; AVX1-NEXT: .LBB16_26: # %else24 5910; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 5911; AVX1-NEXT: jne .LBB16_27 5912; AVX1-NEXT: .LBB16_28: # %else26 5913; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 5914; AVX1-NEXT: jne .LBB16_29 5915; AVX1-NEXT: .LBB16_30: # %else28 5916; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 5917; AVX1-NEXT: jne .LBB16_31 5918; AVX1-NEXT: .LBB16_32: # %else30 5919; AVX1-NEXT: vzeroupper 5920; AVX1-NEXT: retq 5921; AVX1-NEXT: .LBB16_1: # %cond.store 5922; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 5923; AVX1-NEXT: testb $2, %al 5924; AVX1-NEXT: je .LBB16_4 5925; AVX1-NEXT: .LBB16_3: # %cond.store1 5926; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5927; AVX1-NEXT: testb $4, %al 5928; AVX1-NEXT: je .LBB16_6 5929; AVX1-NEXT: .LBB16_5: # %cond.store3 5930; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5931; AVX1-NEXT: testb $8, %al 5932; AVX1-NEXT: je .LBB16_8 5933; AVX1-NEXT: .LBB16_7: # %cond.store5 5934; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5935; AVX1-NEXT: testb $16, %al 5936; AVX1-NEXT: je .LBB16_10 5937; AVX1-NEXT: .LBB16_9: # %cond.store7 5938; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 5939; AVX1-NEXT: testb $32, %al 5940; AVX1-NEXT: je .LBB16_12 5941; AVX1-NEXT: .LBB16_11: # %cond.store9 5942; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 5943; AVX1-NEXT: testb $64, %al 5944; AVX1-NEXT: je .LBB16_14 5945; AVX1-NEXT: .LBB16_13: # %cond.store11 5946; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 5947; AVX1-NEXT: testb $-128, %al 5948; AVX1-NEXT: je .LBB16_16 5949; AVX1-NEXT: .LBB16_15: # %cond.store13 5950; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 5951; AVX1-NEXT: testl $256, %eax # imm = 0x100 5952; AVX1-NEXT: je .LBB16_18 5953; AVX1-NEXT: .LBB16_17: # %cond.store15 5954; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 5955; AVX1-NEXT: testl $512, %eax # imm = 0x200 5956; AVX1-NEXT: je .LBB16_20 5957; AVX1-NEXT: .LBB16_19: # %cond.store17 5958; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 5959; AVX1-NEXT: testl $1024, %eax # imm = 0x400 5960; AVX1-NEXT: je .LBB16_22 5961; AVX1-NEXT: .LBB16_21: # %cond.store19 5962; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 5963; AVX1-NEXT: testl $2048, %eax # imm = 0x800 5964; AVX1-NEXT: je .LBB16_24 5965; AVX1-NEXT: .LBB16_23: # %cond.store21 5966; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 5967; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 5968; AVX1-NEXT: je .LBB16_26 5969; AVX1-NEXT: .LBB16_25: # %cond.store23 5970; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 5971; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 5972; AVX1-NEXT: je .LBB16_28 5973; AVX1-NEXT: .LBB16_27: # %cond.store25 5974; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 5975; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 5976; AVX1-NEXT: je .LBB16_30 5977; AVX1-NEXT: .LBB16_29: # %cond.store27 5978; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 5979; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 5980; AVX1-NEXT: je .LBB16_32 5981; AVX1-NEXT: .LBB16_31: # %cond.store29 5982; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 5983; AVX1-NEXT: vzeroupper 5984; AVX1-NEXT: retq 5985; 5986; AVX2-LABEL: truncstore_v16i16_v16i8: 5987; AVX2: # %bb.0: 5988; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 5989; AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 5990; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 5991; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 5992; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 5993; AVX2-NEXT: vpmovmskb %xmm1, %eax 5994; AVX2-NEXT: xorl $65535, %eax # imm = 0xFFFF 5995; AVX2-NEXT: testb $1, %al 5996; AVX2-NEXT: jne .LBB16_1 5997; AVX2-NEXT: # %bb.2: # %else 5998; AVX2-NEXT: testb $2, %al 5999; AVX2-NEXT: jne .LBB16_3 6000; AVX2-NEXT: .LBB16_4: # %else2 6001; AVX2-NEXT: testb $4, %al 6002; AVX2-NEXT: jne .LBB16_5 6003; AVX2-NEXT: .LBB16_6: # %else4 6004; AVX2-NEXT: testb $8, %al 6005; AVX2-NEXT: jne .LBB16_7 6006; AVX2-NEXT: .LBB16_8: # %else6 6007; AVX2-NEXT: testb $16, %al 6008; AVX2-NEXT: jne .LBB16_9 6009; AVX2-NEXT: .LBB16_10: # %else8 6010; AVX2-NEXT: testb $32, %al 6011; AVX2-NEXT: jne .LBB16_11 6012; AVX2-NEXT: .LBB16_12: # %else10 6013; AVX2-NEXT: testb $64, %al 6014; AVX2-NEXT: jne .LBB16_13 6015; AVX2-NEXT: .LBB16_14: # %else12 6016; AVX2-NEXT: testb $-128, %al 6017; AVX2-NEXT: jne .LBB16_15 6018; AVX2-NEXT: .LBB16_16: # %else14 6019; AVX2-NEXT: testl $256, %eax # imm = 0x100 6020; AVX2-NEXT: jne .LBB16_17 6021; AVX2-NEXT: .LBB16_18: # %else16 6022; AVX2-NEXT: testl $512, %eax # imm = 0x200 6023; AVX2-NEXT: jne .LBB16_19 6024; AVX2-NEXT: .LBB16_20: # %else18 6025; AVX2-NEXT: testl $1024, %eax # imm = 0x400 6026; AVX2-NEXT: jne .LBB16_21 6027; AVX2-NEXT: .LBB16_22: # %else20 6028; AVX2-NEXT: testl $2048, %eax # imm = 0x800 6029; AVX2-NEXT: jne .LBB16_23 6030; AVX2-NEXT: .LBB16_24: # %else22 6031; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 6032; AVX2-NEXT: jne .LBB16_25 6033; AVX2-NEXT: .LBB16_26: # %else24 6034; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 6035; AVX2-NEXT: jne .LBB16_27 6036; AVX2-NEXT: .LBB16_28: # %else26 6037; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 6038; AVX2-NEXT: jne .LBB16_29 6039; AVX2-NEXT: .LBB16_30: # %else28 6040; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 6041; AVX2-NEXT: jne .LBB16_31 6042; AVX2-NEXT: .LBB16_32: # %else30 6043; AVX2-NEXT: vzeroupper 6044; AVX2-NEXT: retq 6045; AVX2-NEXT: .LBB16_1: # %cond.store 6046; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 6047; AVX2-NEXT: testb $2, %al 6048; AVX2-NEXT: je .LBB16_4 6049; AVX2-NEXT: .LBB16_3: # %cond.store1 6050; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6051; AVX2-NEXT: testb $4, %al 6052; AVX2-NEXT: je .LBB16_6 6053; AVX2-NEXT: .LBB16_5: # %cond.store3 6054; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6055; AVX2-NEXT: testb $8, %al 6056; AVX2-NEXT: je .LBB16_8 6057; AVX2-NEXT: .LBB16_7: # %cond.store5 6058; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6059; AVX2-NEXT: testb $16, %al 6060; AVX2-NEXT: je .LBB16_10 6061; AVX2-NEXT: .LBB16_9: # %cond.store7 6062; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6063; AVX2-NEXT: testb $32, %al 6064; AVX2-NEXT: je .LBB16_12 6065; AVX2-NEXT: .LBB16_11: # %cond.store9 6066; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6067; AVX2-NEXT: testb $64, %al 6068; AVX2-NEXT: je .LBB16_14 6069; AVX2-NEXT: .LBB16_13: # %cond.store11 6070; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6071; AVX2-NEXT: testb $-128, %al 6072; AVX2-NEXT: je .LBB16_16 6073; AVX2-NEXT: .LBB16_15: # %cond.store13 6074; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6075; AVX2-NEXT: testl $256, %eax # imm = 0x100 6076; AVX2-NEXT: je .LBB16_18 6077; AVX2-NEXT: .LBB16_17: # %cond.store15 6078; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6079; AVX2-NEXT: testl $512, %eax # imm = 0x200 6080; AVX2-NEXT: je .LBB16_20 6081; AVX2-NEXT: .LBB16_19: # %cond.store17 6082; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6083; AVX2-NEXT: testl $1024, %eax # imm = 0x400 6084; AVX2-NEXT: je .LBB16_22 6085; AVX2-NEXT: .LBB16_21: # %cond.store19 6086; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6087; AVX2-NEXT: testl $2048, %eax # imm = 0x800 6088; AVX2-NEXT: je .LBB16_24 6089; AVX2-NEXT: .LBB16_23: # %cond.store21 6090; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6091; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 6092; AVX2-NEXT: je .LBB16_26 6093; AVX2-NEXT: .LBB16_25: # %cond.store23 6094; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6095; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 6096; AVX2-NEXT: je .LBB16_28 6097; AVX2-NEXT: .LBB16_27: # %cond.store25 6098; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6099; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 6100; AVX2-NEXT: je .LBB16_30 6101; AVX2-NEXT: .LBB16_29: # %cond.store27 6102; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6103; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 6104; AVX2-NEXT: je .LBB16_32 6105; AVX2-NEXT: .LBB16_31: # %cond.store29 6106; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 6107; AVX2-NEXT: vzeroupper 6108; AVX2-NEXT: retq 6109; 6110; AVX512F-LABEL: truncstore_v16i16_v16i8: 6111; AVX512F: # %bb.0: 6112; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 6113; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 6114; AVX512F-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 6115; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 6116; AVX512F-NEXT: vpmovmskb %xmm1, %eax 6117; AVX512F-NEXT: xorl $65535, %eax # imm = 0xFFFF 6118; AVX512F-NEXT: testb $1, %al 6119; AVX512F-NEXT: jne .LBB16_1 6120; AVX512F-NEXT: # %bb.2: # %else 6121; AVX512F-NEXT: testb $2, %al 6122; AVX512F-NEXT: jne .LBB16_3 6123; AVX512F-NEXT: .LBB16_4: # %else2 6124; AVX512F-NEXT: testb $4, %al 6125; AVX512F-NEXT: jne .LBB16_5 6126; AVX512F-NEXT: .LBB16_6: # %else4 6127; AVX512F-NEXT: testb $8, %al 6128; AVX512F-NEXT: jne .LBB16_7 6129; AVX512F-NEXT: .LBB16_8: # %else6 6130; AVX512F-NEXT: testb $16, %al 6131; AVX512F-NEXT: jne .LBB16_9 6132; AVX512F-NEXT: .LBB16_10: # %else8 6133; AVX512F-NEXT: testb $32, %al 6134; AVX512F-NEXT: jne .LBB16_11 6135; AVX512F-NEXT: .LBB16_12: # %else10 6136; AVX512F-NEXT: testb $64, %al 6137; AVX512F-NEXT: jne .LBB16_13 6138; AVX512F-NEXT: .LBB16_14: # %else12 6139; AVX512F-NEXT: testb $-128, %al 6140; AVX512F-NEXT: jne .LBB16_15 6141; AVX512F-NEXT: .LBB16_16: # %else14 6142; AVX512F-NEXT: testl $256, %eax # imm = 0x100 6143; AVX512F-NEXT: jne .LBB16_17 6144; AVX512F-NEXT: .LBB16_18: # %else16 6145; AVX512F-NEXT: testl $512, %eax # imm = 0x200 6146; AVX512F-NEXT: jne .LBB16_19 6147; AVX512F-NEXT: .LBB16_20: # %else18 6148; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 6149; AVX512F-NEXT: jne .LBB16_21 6150; AVX512F-NEXT: .LBB16_22: # %else20 6151; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 6152; AVX512F-NEXT: jne .LBB16_23 6153; AVX512F-NEXT: .LBB16_24: # %else22 6154; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 6155; AVX512F-NEXT: jne .LBB16_25 6156; AVX512F-NEXT: .LBB16_26: # %else24 6157; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 6158; AVX512F-NEXT: jne .LBB16_27 6159; AVX512F-NEXT: .LBB16_28: # %else26 6160; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 6161; AVX512F-NEXT: jne .LBB16_29 6162; AVX512F-NEXT: .LBB16_30: # %else28 6163; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 6164; AVX512F-NEXT: jne .LBB16_31 6165; AVX512F-NEXT: .LBB16_32: # %else30 6166; AVX512F-NEXT: vzeroupper 6167; AVX512F-NEXT: retq 6168; AVX512F-NEXT: .LBB16_1: # %cond.store 6169; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 6170; AVX512F-NEXT: testb $2, %al 6171; AVX512F-NEXT: je .LBB16_4 6172; AVX512F-NEXT: .LBB16_3: # %cond.store1 6173; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6174; AVX512F-NEXT: testb $4, %al 6175; AVX512F-NEXT: je .LBB16_6 6176; AVX512F-NEXT: .LBB16_5: # %cond.store3 6177; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6178; AVX512F-NEXT: testb $8, %al 6179; AVX512F-NEXT: je .LBB16_8 6180; AVX512F-NEXT: .LBB16_7: # %cond.store5 6181; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6182; AVX512F-NEXT: testb $16, %al 6183; AVX512F-NEXT: je .LBB16_10 6184; AVX512F-NEXT: .LBB16_9: # %cond.store7 6185; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6186; AVX512F-NEXT: testb $32, %al 6187; AVX512F-NEXT: je .LBB16_12 6188; AVX512F-NEXT: .LBB16_11: # %cond.store9 6189; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6190; AVX512F-NEXT: testb $64, %al 6191; AVX512F-NEXT: je .LBB16_14 6192; AVX512F-NEXT: .LBB16_13: # %cond.store11 6193; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6194; AVX512F-NEXT: testb $-128, %al 6195; AVX512F-NEXT: je .LBB16_16 6196; AVX512F-NEXT: .LBB16_15: # %cond.store13 6197; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6198; AVX512F-NEXT: testl $256, %eax # imm = 0x100 6199; AVX512F-NEXT: je .LBB16_18 6200; AVX512F-NEXT: .LBB16_17: # %cond.store15 6201; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6202; AVX512F-NEXT: testl $512, %eax # imm = 0x200 6203; AVX512F-NEXT: je .LBB16_20 6204; AVX512F-NEXT: .LBB16_19: # %cond.store17 6205; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6206; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 6207; AVX512F-NEXT: je .LBB16_22 6208; AVX512F-NEXT: .LBB16_21: # %cond.store19 6209; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6210; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 6211; AVX512F-NEXT: je .LBB16_24 6212; AVX512F-NEXT: .LBB16_23: # %cond.store21 6213; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6214; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 6215; AVX512F-NEXT: je .LBB16_26 6216; AVX512F-NEXT: .LBB16_25: # %cond.store23 6217; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6218; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 6219; AVX512F-NEXT: je .LBB16_28 6220; AVX512F-NEXT: .LBB16_27: # %cond.store25 6221; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6222; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 6223; AVX512F-NEXT: je .LBB16_30 6224; AVX512F-NEXT: .LBB16_29: # %cond.store27 6225; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6226; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 6227; AVX512F-NEXT: je .LBB16_32 6228; AVX512F-NEXT: .LBB16_31: # %cond.store29 6229; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 6230; AVX512F-NEXT: vzeroupper 6231; AVX512F-NEXT: retq 6232; 6233; AVX512BW-LABEL: truncstore_v16i16_v16i8: 6234; AVX512BW: # %bb.0: 6235; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 6236; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 6237; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k0 6238; AVX512BW-NEXT: kmovw %k0, %k1 6239; AVX512BW-NEXT: vpmovwb %zmm0, %ymm0 6240; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 6241; AVX512BW-NEXT: vzeroupper 6242; AVX512BW-NEXT: retq 6243; 6244; AVX512BWVL-LABEL: truncstore_v16i16_v16i8: 6245; AVX512BWVL: # %bb.0: 6246; AVX512BWVL-NEXT: vptestmb %xmm1, %xmm1, %k1 6247; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi) {%k1} 6248; AVX512BWVL-NEXT: vzeroupper 6249; AVX512BWVL-NEXT: retq 6250 %a = icmp ne <16 x i8> %mask, zeroinitializer 6251 %b = trunc <16 x i16> %x to <16 x i8> 6252 call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %b, <16 x i8>* %p, i32 1, <16 x i1> %a) 6253 ret void 6254} 6255 6256define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) { 6257; SSE2-LABEL: truncstore_v8i16_v8i8: 6258; SSE2: # %bb.0: 6259; SSE2-NEXT: pxor %xmm2, %xmm2 6260; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 6261; SSE2-NEXT: packuswb %xmm0, %xmm0 6262; SSE2-NEXT: pcmpeqw %xmm1, %xmm2 6263; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 6264; SSE2-NEXT: pxor %xmm2, %xmm1 6265; SSE2-NEXT: packsswb %xmm1, %xmm1 6266; SSE2-NEXT: pmovmskb %xmm1, %eax 6267; SSE2-NEXT: testb $1, %al 6268; SSE2-NEXT: movd %xmm0, %ecx 6269; SSE2-NEXT: jne .LBB17_1 6270; SSE2-NEXT: # %bb.2: # %else 6271; SSE2-NEXT: testb $2, %al 6272; SSE2-NEXT: jne .LBB17_3 6273; SSE2-NEXT: .LBB17_4: # %else2 6274; SSE2-NEXT: testb $4, %al 6275; SSE2-NEXT: jne .LBB17_5 6276; SSE2-NEXT: .LBB17_6: # %else4 6277; SSE2-NEXT: testb $8, %al 6278; SSE2-NEXT: je .LBB17_8 6279; SSE2-NEXT: .LBB17_7: # %cond.store5 6280; SSE2-NEXT: shrl $24, %ecx 6281; SSE2-NEXT: movb %cl, 3(%rdi) 6282; SSE2-NEXT: .LBB17_8: # %else6 6283; SSE2-NEXT: testb $16, %al 6284; SSE2-NEXT: pextrw $2, %xmm0, %ecx 6285; SSE2-NEXT: je .LBB17_10 6286; SSE2-NEXT: # %bb.9: # %cond.store7 6287; SSE2-NEXT: movb %cl, 4(%rdi) 6288; SSE2-NEXT: .LBB17_10: # %else8 6289; SSE2-NEXT: testb $32, %al 6290; SSE2-NEXT: je .LBB17_12 6291; SSE2-NEXT: # %bb.11: # %cond.store9 6292; SSE2-NEXT: movb %ch, 5(%rdi) 6293; SSE2-NEXT: .LBB17_12: # %else10 6294; SSE2-NEXT: testb $64, %al 6295; SSE2-NEXT: pextrw $3, %xmm0, %ecx 6296; SSE2-NEXT: jne .LBB17_13 6297; SSE2-NEXT: # %bb.14: # %else12 6298; SSE2-NEXT: testb $-128, %al 6299; SSE2-NEXT: jne .LBB17_15 6300; SSE2-NEXT: .LBB17_16: # %else14 6301; SSE2-NEXT: retq 6302; SSE2-NEXT: .LBB17_1: # %cond.store 6303; SSE2-NEXT: movb %cl, (%rdi) 6304; SSE2-NEXT: testb $2, %al 6305; SSE2-NEXT: je .LBB17_4 6306; SSE2-NEXT: .LBB17_3: # %cond.store1 6307; SSE2-NEXT: movb %ch, 1(%rdi) 6308; SSE2-NEXT: testb $4, %al 6309; SSE2-NEXT: je .LBB17_6 6310; SSE2-NEXT: .LBB17_5: # %cond.store3 6311; SSE2-NEXT: movl %ecx, %edx 6312; SSE2-NEXT: shrl $16, %edx 6313; SSE2-NEXT: movb %dl, 2(%rdi) 6314; SSE2-NEXT: testb $8, %al 6315; SSE2-NEXT: jne .LBB17_7 6316; SSE2-NEXT: jmp .LBB17_8 6317; SSE2-NEXT: .LBB17_13: # %cond.store11 6318; SSE2-NEXT: movb %cl, 6(%rdi) 6319; SSE2-NEXT: testb $-128, %al 6320; SSE2-NEXT: je .LBB17_16 6321; SSE2-NEXT: .LBB17_15: # %cond.store13 6322; SSE2-NEXT: movb %ch, 7(%rdi) 6323; SSE2-NEXT: retq 6324; 6325; SSE4-LABEL: truncstore_v8i16_v8i8: 6326; SSE4: # %bb.0: 6327; SSE4-NEXT: pxor %xmm2, %xmm2 6328; SSE4-NEXT: pshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 6329; SSE4-NEXT: pcmpeqw %xmm1, %xmm2 6330; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 6331; SSE4-NEXT: pxor %xmm2, %xmm1 6332; SSE4-NEXT: packsswb %xmm1, %xmm1 6333; SSE4-NEXT: pmovmskb %xmm1, %eax 6334; SSE4-NEXT: testb $1, %al 6335; SSE4-NEXT: jne .LBB17_1 6336; SSE4-NEXT: # %bb.2: # %else 6337; SSE4-NEXT: testb $2, %al 6338; SSE4-NEXT: jne .LBB17_3 6339; SSE4-NEXT: .LBB17_4: # %else2 6340; SSE4-NEXT: testb $4, %al 6341; SSE4-NEXT: jne .LBB17_5 6342; SSE4-NEXT: .LBB17_6: # %else4 6343; SSE4-NEXT: testb $8, %al 6344; SSE4-NEXT: jne .LBB17_7 6345; SSE4-NEXT: .LBB17_8: # %else6 6346; SSE4-NEXT: testb $16, %al 6347; SSE4-NEXT: jne .LBB17_9 6348; SSE4-NEXT: .LBB17_10: # %else8 6349; SSE4-NEXT: testb $32, %al 6350; SSE4-NEXT: jne .LBB17_11 6351; SSE4-NEXT: .LBB17_12: # %else10 6352; SSE4-NEXT: testb $64, %al 6353; SSE4-NEXT: jne .LBB17_13 6354; SSE4-NEXT: .LBB17_14: # %else12 6355; SSE4-NEXT: testb $-128, %al 6356; SSE4-NEXT: jne .LBB17_15 6357; SSE4-NEXT: .LBB17_16: # %else14 6358; SSE4-NEXT: retq 6359; SSE4-NEXT: .LBB17_1: # %cond.store 6360; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 6361; SSE4-NEXT: testb $2, %al 6362; SSE4-NEXT: je .LBB17_4 6363; SSE4-NEXT: .LBB17_3: # %cond.store1 6364; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 6365; SSE4-NEXT: testb $4, %al 6366; SSE4-NEXT: je .LBB17_6 6367; SSE4-NEXT: .LBB17_5: # %cond.store3 6368; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 6369; SSE4-NEXT: testb $8, %al 6370; SSE4-NEXT: je .LBB17_8 6371; SSE4-NEXT: .LBB17_7: # %cond.store5 6372; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 6373; SSE4-NEXT: testb $16, %al 6374; SSE4-NEXT: je .LBB17_10 6375; SSE4-NEXT: .LBB17_9: # %cond.store7 6376; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 6377; SSE4-NEXT: testb $32, %al 6378; SSE4-NEXT: je .LBB17_12 6379; SSE4-NEXT: .LBB17_11: # %cond.store9 6380; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 6381; SSE4-NEXT: testb $64, %al 6382; SSE4-NEXT: je .LBB17_14 6383; SSE4-NEXT: .LBB17_13: # %cond.store11 6384; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 6385; SSE4-NEXT: testb $-128, %al 6386; SSE4-NEXT: je .LBB17_16 6387; SSE4-NEXT: .LBB17_15: # %cond.store13 6388; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 6389; SSE4-NEXT: retq 6390; 6391; AVX-LABEL: truncstore_v8i16_v8i8: 6392; AVX: # %bb.0: 6393; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 6394; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 6395; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 6396; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 6397; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 6398; AVX-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 6399; AVX-NEXT: vpmovmskb %xmm1, %eax 6400; AVX-NEXT: testb $1, %al 6401; AVX-NEXT: jne .LBB17_1 6402; AVX-NEXT: # %bb.2: # %else 6403; AVX-NEXT: testb $2, %al 6404; AVX-NEXT: jne .LBB17_3 6405; AVX-NEXT: .LBB17_4: # %else2 6406; AVX-NEXT: testb $4, %al 6407; AVX-NEXT: jne .LBB17_5 6408; AVX-NEXT: .LBB17_6: # %else4 6409; AVX-NEXT: testb $8, %al 6410; AVX-NEXT: jne .LBB17_7 6411; AVX-NEXT: .LBB17_8: # %else6 6412; AVX-NEXT: testb $16, %al 6413; AVX-NEXT: jne .LBB17_9 6414; AVX-NEXT: .LBB17_10: # %else8 6415; AVX-NEXT: testb $32, %al 6416; AVX-NEXT: jne .LBB17_11 6417; AVX-NEXT: .LBB17_12: # %else10 6418; AVX-NEXT: testb $64, %al 6419; AVX-NEXT: jne .LBB17_13 6420; AVX-NEXT: .LBB17_14: # %else12 6421; AVX-NEXT: testb $-128, %al 6422; AVX-NEXT: jne .LBB17_15 6423; AVX-NEXT: .LBB17_16: # %else14 6424; AVX-NEXT: retq 6425; AVX-NEXT: .LBB17_1: # %cond.store 6426; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) 6427; AVX-NEXT: testb $2, %al 6428; AVX-NEXT: je .LBB17_4 6429; AVX-NEXT: .LBB17_3: # %cond.store1 6430; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6431; AVX-NEXT: testb $4, %al 6432; AVX-NEXT: je .LBB17_6 6433; AVX-NEXT: .LBB17_5: # %cond.store3 6434; AVX-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6435; AVX-NEXT: testb $8, %al 6436; AVX-NEXT: je .LBB17_8 6437; AVX-NEXT: .LBB17_7: # %cond.store5 6438; AVX-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6439; AVX-NEXT: testb $16, %al 6440; AVX-NEXT: je .LBB17_10 6441; AVX-NEXT: .LBB17_9: # %cond.store7 6442; AVX-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6443; AVX-NEXT: testb $32, %al 6444; AVX-NEXT: je .LBB17_12 6445; AVX-NEXT: .LBB17_11: # %cond.store9 6446; AVX-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6447; AVX-NEXT: testb $64, %al 6448; AVX-NEXT: je .LBB17_14 6449; AVX-NEXT: .LBB17_13: # %cond.store11 6450; AVX-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6451; AVX-NEXT: testb $-128, %al 6452; AVX-NEXT: je .LBB17_16 6453; AVX-NEXT: .LBB17_15: # %cond.store13 6454; AVX-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6455; AVX-NEXT: retq 6456; 6457; AVX512F-LABEL: truncstore_v8i16_v8i8: 6458; AVX512F: # %bb.0: 6459; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 6460; AVX512F-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 6461; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 6462; AVX512F-NEXT: vpmovsxwq %xmm1, %zmm1 6463; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 6464; AVX512F-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 6465; AVX512F-NEXT: kmovw %k0, %eax 6466; AVX512F-NEXT: testb $1, %al 6467; AVX512F-NEXT: jne .LBB17_1 6468; AVX512F-NEXT: # %bb.2: # %else 6469; AVX512F-NEXT: testb $2, %al 6470; AVX512F-NEXT: jne .LBB17_3 6471; AVX512F-NEXT: .LBB17_4: # %else2 6472; AVX512F-NEXT: testb $4, %al 6473; AVX512F-NEXT: jne .LBB17_5 6474; AVX512F-NEXT: .LBB17_6: # %else4 6475; AVX512F-NEXT: testb $8, %al 6476; AVX512F-NEXT: jne .LBB17_7 6477; AVX512F-NEXT: .LBB17_8: # %else6 6478; AVX512F-NEXT: testb $16, %al 6479; AVX512F-NEXT: jne .LBB17_9 6480; AVX512F-NEXT: .LBB17_10: # %else8 6481; AVX512F-NEXT: testb $32, %al 6482; AVX512F-NEXT: jne .LBB17_11 6483; AVX512F-NEXT: .LBB17_12: # %else10 6484; AVX512F-NEXT: testb $64, %al 6485; AVX512F-NEXT: jne .LBB17_13 6486; AVX512F-NEXT: .LBB17_14: # %else12 6487; AVX512F-NEXT: testb $-128, %al 6488; AVX512F-NEXT: jne .LBB17_15 6489; AVX512F-NEXT: .LBB17_16: # %else14 6490; AVX512F-NEXT: vzeroupper 6491; AVX512F-NEXT: retq 6492; AVX512F-NEXT: .LBB17_1: # %cond.store 6493; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 6494; AVX512F-NEXT: testb $2, %al 6495; AVX512F-NEXT: je .LBB17_4 6496; AVX512F-NEXT: .LBB17_3: # %cond.store1 6497; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6498; AVX512F-NEXT: testb $4, %al 6499; AVX512F-NEXT: je .LBB17_6 6500; AVX512F-NEXT: .LBB17_5: # %cond.store3 6501; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6502; AVX512F-NEXT: testb $8, %al 6503; AVX512F-NEXT: je .LBB17_8 6504; AVX512F-NEXT: .LBB17_7: # %cond.store5 6505; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6506; AVX512F-NEXT: testb $16, %al 6507; AVX512F-NEXT: je .LBB17_10 6508; AVX512F-NEXT: .LBB17_9: # %cond.store7 6509; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6510; AVX512F-NEXT: testb $32, %al 6511; AVX512F-NEXT: je .LBB17_12 6512; AVX512F-NEXT: .LBB17_11: # %cond.store9 6513; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6514; AVX512F-NEXT: testb $64, %al 6515; AVX512F-NEXT: je .LBB17_14 6516; AVX512F-NEXT: .LBB17_13: # %cond.store11 6517; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6518; AVX512F-NEXT: testb $-128, %al 6519; AVX512F-NEXT: je .LBB17_16 6520; AVX512F-NEXT: .LBB17_15: # %cond.store13 6521; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6522; AVX512F-NEXT: vzeroupper 6523; AVX512F-NEXT: retq 6524; 6525; AVX512BW-LABEL: truncstore_v8i16_v8i8: 6526; AVX512BW: # %bb.0: 6527; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 6528; AVX512BW-NEXT: vptestmw %zmm1, %zmm1, %k0 6529; AVX512BW-NEXT: kshiftlq $56, %k0, %k0 6530; AVX512BW-NEXT: kshiftrq $56, %k0, %k1 6531; AVX512BW-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u] 6532; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 6533; AVX512BW-NEXT: vzeroupper 6534; AVX512BW-NEXT: retq 6535; 6536; AVX512BWVL-LABEL: truncstore_v8i16_v8i8: 6537; AVX512BWVL: # %bb.0: 6538; AVX512BWVL-NEXT: vptestmw %xmm1, %xmm1, %k1 6539; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rdi) {%k1} 6540; AVX512BWVL-NEXT: retq 6541 %a = icmp ne <8 x i16> %mask, zeroinitializer 6542 %b = trunc <8 x i16> %x to <8 x i8> 6543 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %b, <8 x i8>* %p, i32 1, <8 x i1> %a) 6544 ret void 6545} 6546 6547declare void @llvm.masked.store.v8i32.p0v8i32(<8 x i32>, <8 x i32>*, i32, <8 x i1>) 6548declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>) 6549declare void @llvm.masked.store.v8i8.p0v8i8(<8 x i8>, <8 x i8>*, i32, <8 x i1>) 6550declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>) 6551declare void @llvm.masked.store.v4i16.p0v4i16(<4 x i16>, <4 x i16>*, i32, <4 x i1>) 6552declare void @llvm.masked.store.v4i8.p0v4i8(<4 x i8>, <4 x i8>*, i32, <4 x i1>) 6553declare void @llvm.masked.store.v2i32.p0v2i32(<2 x i32>, <2 x i32>*, i32, <2 x i1>) 6554declare void @llvm.masked.store.v2i16.p0v2i16(<2 x i16>, <2 x i16>*, i32, <2 x i1>) 6555declare void @llvm.masked.store.v2i8.p0v2i8(<2 x i8>, <2 x i8>*, i32, <2 x i1>) 6556declare void @llvm.masked.store.v16i16.p0v16i16(<16 x i16>, <16 x i16>*, i32, <16 x i1>) 6557declare void @llvm.masked.store.v16i8.p0v16i8(<16 x i8>, <16 x i8>*, i32, <16 x i1>) 6558declare void @llvm.masked.store.v32i8.p0v32i8(<32 x i8>, <32 x i8>*, i32, <32 x i1>) 6559