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