1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse2 | FileCheck %s --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.2 | FileCheck %s --check-prefix=SSE4 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefixes=AVX,AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefixes=AVX,AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl | FileCheck %s --check-prefix=AVX512VL 8; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=AVX512BW 9; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512vl,avx512bw | FileCheck %s --check-prefixes=AVX512VL,AVX512BWVL 10 11define void @truncstore_v8i64_v8i32(<8 x i64> %x, <8 x i32>* %p, <8 x i32> %mask) { 12; SSE2-LABEL: truncstore_v8i64_v8i32: 13; SSE2: # %bb.0: 14; SSE2-NEXT: pxor %xmm8, %xmm8 15; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483647,2147483647] 16; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 17; SSE2-NEXT: movdqa %xmm2, %xmm6 18; SSE2-NEXT: pxor %xmm11, %xmm6 19; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [4294967295,4294967295] 20; SSE2-NEXT: movdqa %xmm10, %xmm7 21; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 22; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] 23; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 24; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 25; SSE2-NEXT: pand %xmm12, %xmm6 26; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] 27; SSE2-NEXT: por %xmm6, %xmm13 28; SSE2-NEXT: pand %xmm13, %xmm2 29; SSE2-NEXT: pandn %xmm9, %xmm13 30; SSE2-NEXT: por %xmm2, %xmm13 31; SSE2-NEXT: movdqa %xmm3, %xmm2 32; SSE2-NEXT: pxor %xmm11, %xmm2 33; SSE2-NEXT: movdqa %xmm10, %xmm6 34; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 35; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 36; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 37; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 38; SSE2-NEXT: pand %xmm12, %xmm7 39; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 40; SSE2-NEXT: por %xmm7, %xmm2 41; SSE2-NEXT: pand %xmm2, %xmm3 42; SSE2-NEXT: pandn %xmm9, %xmm2 43; SSE2-NEXT: por %xmm3, %xmm2 44; SSE2-NEXT: movdqa %xmm0, %xmm3 45; SSE2-NEXT: pxor %xmm11, %xmm3 46; SSE2-NEXT: movdqa %xmm10, %xmm6 47; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 48; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 49; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 50; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 51; SSE2-NEXT: pand %xmm12, %xmm7 52; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 53; SSE2-NEXT: por %xmm7, %xmm3 54; SSE2-NEXT: pand %xmm3, %xmm0 55; SSE2-NEXT: pandn %xmm9, %xmm3 56; SSE2-NEXT: por %xmm0, %xmm3 57; SSE2-NEXT: movdqa %xmm1, %xmm0 58; SSE2-NEXT: pxor %xmm11, %xmm0 59; SSE2-NEXT: movdqa %xmm10, %xmm6 60; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 61; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 62; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 63; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 64; SSE2-NEXT: pand %xmm7, %xmm0 65; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 66; SSE2-NEXT: por %xmm0, %xmm6 67; SSE2-NEXT: pand %xmm6, %xmm1 68; SSE2-NEXT: pandn %xmm9, %xmm6 69; SSE2-NEXT: por %xmm1, %xmm6 70; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067968,18446744071562067968] 71; SSE2-NEXT: movdqa %xmm6, %xmm1 72; SSE2-NEXT: pxor %xmm11, %xmm1 73; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [18446744069414584320,18446744069414584320] 74; SSE2-NEXT: movdqa %xmm1, %xmm7 75; SSE2-NEXT: pcmpgtd %xmm12, %xmm7 76; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] 77; SSE2-NEXT: pcmpeqd %xmm12, %xmm1 78; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 79; SSE2-NEXT: pand %xmm0, %xmm1 80; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 81; SSE2-NEXT: por %xmm1, %xmm0 82; SSE2-NEXT: pand %xmm0, %xmm6 83; SSE2-NEXT: pandn %xmm9, %xmm0 84; SSE2-NEXT: por %xmm6, %xmm0 85; SSE2-NEXT: movdqa %xmm3, %xmm1 86; SSE2-NEXT: pxor %xmm11, %xmm1 87; SSE2-NEXT: movdqa %xmm1, %xmm6 88; SSE2-NEXT: pcmpgtd %xmm12, %xmm6 89; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] 90; SSE2-NEXT: pcmpeqd %xmm12, %xmm1 91; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] 92; SSE2-NEXT: pand %xmm10, %xmm7 93; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3] 94; SSE2-NEXT: por %xmm7, %xmm1 95; SSE2-NEXT: pand %xmm1, %xmm3 96; SSE2-NEXT: pandn %xmm9, %xmm1 97; SSE2-NEXT: por %xmm3, %xmm1 98; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2] 99; SSE2-NEXT: movdqa %xmm2, %xmm0 100; SSE2-NEXT: pxor %xmm11, %xmm0 101; SSE2-NEXT: movdqa %xmm0, %xmm6 102; SSE2-NEXT: pcmpgtd %xmm12, %xmm6 103; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 104; SSE2-NEXT: pcmpeqd %xmm12, %xmm0 105; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] 106; SSE2-NEXT: pand %xmm7, %xmm3 107; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3] 108; SSE2-NEXT: pxor %xmm13, %xmm11 109; SSE2-NEXT: movdqa %xmm11, %xmm6 110; SSE2-NEXT: pcmpgtd %xmm12, %xmm6 111; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 112; SSE2-NEXT: pcmpeqd %xmm12, %xmm11 113; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm11[1,1,3,3] 114; SSE2-NEXT: pand %xmm7, %xmm0 115; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 116; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 117; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 118; SSE2-NEXT: pxor %xmm7, %xmm5 119; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 120; SSE2-NEXT: pxor %xmm7, %xmm4 121; SSE2-NEXT: packssdw %xmm5, %xmm4 122; SSE2-NEXT: packsswb %xmm4, %xmm4 123; SSE2-NEXT: pmovmskb %xmm4, %eax 124; SSE2-NEXT: testb $1, %al 125; SSE2-NEXT: je .LBB0_2 126; SSE2-NEXT: # %bb.1: # %cond.store 127; SSE2-NEXT: movss %xmm1, (%rdi) 128; SSE2-NEXT: .LBB0_2: # %else 129; SSE2-NEXT: por %xmm10, %xmm3 130; SSE2-NEXT: por %xmm6, %xmm0 131; SSE2-NEXT: testb $2, %al 132; SSE2-NEXT: je .LBB0_4 133; SSE2-NEXT: # %bb.3: # %cond.store1 134; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[1,1,1,1] 135; SSE2-NEXT: movd %xmm4, 4(%rdi) 136; SSE2-NEXT: .LBB0_4: # %else2 137; SSE2-NEXT: pand %xmm3, %xmm2 138; SSE2-NEXT: pandn %xmm9, %xmm3 139; SSE2-NEXT: pand %xmm0, %xmm13 140; SSE2-NEXT: pandn %xmm9, %xmm0 141; SSE2-NEXT: testb $4, %al 142; SSE2-NEXT: je .LBB0_6 143; SSE2-NEXT: # %bb.5: # %cond.store3 144; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3] 145; SSE2-NEXT: movd %xmm4, 8(%rdi) 146; SSE2-NEXT: .LBB0_6: # %else4 147; SSE2-NEXT: por %xmm3, %xmm2 148; SSE2-NEXT: por %xmm0, %xmm13 149; SSE2-NEXT: testb $8, %al 150; SSE2-NEXT: je .LBB0_8 151; SSE2-NEXT: # %bb.7: # %cond.store5 152; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,3,3,3] 153; SSE2-NEXT: movd %xmm0, 12(%rdi) 154; SSE2-NEXT: .LBB0_8: # %else6 155; SSE2-NEXT: shufps {{.*#+}} xmm13 = xmm13[0,2],xmm2[0,2] 156; SSE2-NEXT: testb $16, %al 157; SSE2-NEXT: jne .LBB0_9 158; SSE2-NEXT: # %bb.10: # %else8 159; SSE2-NEXT: testb $32, %al 160; SSE2-NEXT: jne .LBB0_11 161; SSE2-NEXT: .LBB0_12: # %else10 162; SSE2-NEXT: testb $64, %al 163; SSE2-NEXT: jne .LBB0_13 164; SSE2-NEXT: .LBB0_14: # %else12 165; SSE2-NEXT: testb $-128, %al 166; SSE2-NEXT: jne .LBB0_15 167; SSE2-NEXT: .LBB0_16: # %else14 168; SSE2-NEXT: retq 169; SSE2-NEXT: .LBB0_9: # %cond.store7 170; SSE2-NEXT: movss %xmm13, 16(%rdi) 171; SSE2-NEXT: testb $32, %al 172; SSE2-NEXT: je .LBB0_12 173; SSE2-NEXT: .LBB0_11: # %cond.store9 174; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[1,1,1,1] 175; SSE2-NEXT: movd %xmm0, 20(%rdi) 176; SSE2-NEXT: testb $64, %al 177; SSE2-NEXT: je .LBB0_14 178; SSE2-NEXT: .LBB0_13: # %cond.store11 179; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[2,3,2,3] 180; SSE2-NEXT: movd %xmm0, 24(%rdi) 181; SSE2-NEXT: testb $-128, %al 182; SSE2-NEXT: je .LBB0_16 183; SSE2-NEXT: .LBB0_15: # %cond.store13 184; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[3,3,3,3] 185; SSE2-NEXT: movd %xmm0, 28(%rdi) 186; SSE2-NEXT: retq 187; 188; SSE4-LABEL: truncstore_v8i64_v8i32: 189; SSE4: # %bb.0: 190; SSE4-NEXT: movdqa %xmm0, %xmm9 191; SSE4-NEXT: pxor %xmm8, %xmm8 192; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647] 193; SSE4-NEXT: movdqa %xmm7, %xmm0 194; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 195; SSE4-NEXT: movdqa %xmm7, %xmm10 196; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 197; SSE4-NEXT: movdqa %xmm7, %xmm0 198; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 199; SSE4-NEXT: movdqa %xmm7, %xmm6 200; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 201; SSE4-NEXT: movdqa %xmm7, %xmm0 202; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 203; SSE4-NEXT: movdqa %xmm7, %xmm3 204; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 205; SSE4-NEXT: movdqa %xmm7, %xmm0 206; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 207; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 208; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968] 209; SSE4-NEXT: movapd %xmm7, %xmm0 210; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 211; SSE4-NEXT: movdqa %xmm1, %xmm2 212; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm2 213; SSE4-NEXT: movapd %xmm3, %xmm0 214; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 215; SSE4-NEXT: movdqa %xmm1, %xmm7 216; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 217; SSE4-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2],xmm2[0,2] 218; SSE4-NEXT: movapd %xmm6, %xmm0 219; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 220; SSE4-NEXT: movdqa %xmm1, %xmm3 221; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm3 222; SSE4-NEXT: movapd %xmm10, %xmm0 223; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 224; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm1 225; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 226; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 227; SSE4-NEXT: pxor %xmm0, %xmm5 228; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 229; SSE4-NEXT: pxor %xmm0, %xmm4 230; SSE4-NEXT: packssdw %xmm5, %xmm4 231; SSE4-NEXT: packsswb %xmm4, %xmm4 232; SSE4-NEXT: pmovmskb %xmm4, %eax 233; SSE4-NEXT: testb $1, %al 234; SSE4-NEXT: jne .LBB0_1 235; SSE4-NEXT: # %bb.2: # %else 236; SSE4-NEXT: testb $2, %al 237; SSE4-NEXT: jne .LBB0_3 238; SSE4-NEXT: .LBB0_4: # %else2 239; SSE4-NEXT: testb $4, %al 240; SSE4-NEXT: jne .LBB0_5 241; SSE4-NEXT: .LBB0_6: # %else4 242; SSE4-NEXT: testb $8, %al 243; SSE4-NEXT: je .LBB0_8 244; SSE4-NEXT: .LBB0_7: # %cond.store5 245; SSE4-NEXT: extractps $3, %xmm7, 12(%rdi) 246; SSE4-NEXT: .LBB0_8: # %else6 247; SSE4-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 248; SSE4-NEXT: testb $16, %al 249; SSE4-NEXT: jne .LBB0_9 250; SSE4-NEXT: # %bb.10: # %else8 251; SSE4-NEXT: testb $32, %al 252; SSE4-NEXT: jne .LBB0_11 253; SSE4-NEXT: .LBB0_12: # %else10 254; SSE4-NEXT: testb $64, %al 255; SSE4-NEXT: jne .LBB0_13 256; SSE4-NEXT: .LBB0_14: # %else12 257; SSE4-NEXT: testb $-128, %al 258; SSE4-NEXT: jne .LBB0_15 259; SSE4-NEXT: .LBB0_16: # %else14 260; SSE4-NEXT: retq 261; SSE4-NEXT: .LBB0_1: # %cond.store 262; SSE4-NEXT: movss %xmm7, (%rdi) 263; SSE4-NEXT: testb $2, %al 264; SSE4-NEXT: je .LBB0_4 265; SSE4-NEXT: .LBB0_3: # %cond.store1 266; SSE4-NEXT: extractps $1, %xmm7, 4(%rdi) 267; SSE4-NEXT: testb $4, %al 268; SSE4-NEXT: je .LBB0_6 269; SSE4-NEXT: .LBB0_5: # %cond.store3 270; SSE4-NEXT: extractps $2, %xmm7, 8(%rdi) 271; SSE4-NEXT: testb $8, %al 272; SSE4-NEXT: jne .LBB0_7 273; SSE4-NEXT: jmp .LBB0_8 274; SSE4-NEXT: .LBB0_9: # %cond.store7 275; SSE4-NEXT: movss %xmm1, 16(%rdi) 276; SSE4-NEXT: testb $32, %al 277; SSE4-NEXT: je .LBB0_12 278; SSE4-NEXT: .LBB0_11: # %cond.store9 279; SSE4-NEXT: extractps $1, %xmm1, 20(%rdi) 280; SSE4-NEXT: testb $64, %al 281; SSE4-NEXT: je .LBB0_14 282; SSE4-NEXT: .LBB0_13: # %cond.store11 283; SSE4-NEXT: extractps $2, %xmm1, 24(%rdi) 284; SSE4-NEXT: testb $-128, %al 285; SSE4-NEXT: je .LBB0_16 286; SSE4-NEXT: .LBB0_15: # %cond.store13 287; SSE4-NEXT: extractps $3, %xmm1, 28(%rdi) 288; SSE4-NEXT: retq 289; 290; AVX1-LABEL: truncstore_v8i64_v8i32: 291; AVX1: # %bb.0: 292; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 293; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 294; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 295; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 296; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 297; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 298; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 299; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm2, %ymm8 300; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 301; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [2147483647,2147483647] 302; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm9 303; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 304; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm7 305; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm2 306; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm5 307; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm4, %xmm0 308; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968] 309; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm10 310; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm4, %xmm1 311; AVX1-NEXT: vpcmpgtq %xmm5, %xmm1, %xmm2 312; AVX1-NEXT: vblendvpd %xmm7, %xmm6, %xmm4, %xmm6 313; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm7 314; AVX1-NEXT: vblendvpd %xmm9, %xmm3, %xmm4, %xmm3 315; AVX1-NEXT: vpcmpgtq %xmm5, %xmm3, %xmm4 316; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm5, %xmm3 317; AVX1-NEXT: vblendvpd %xmm7, %xmm6, %xmm5, %xmm4 318; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 319; AVX1-NEXT: vblendvpd %xmm2, %xmm1, %xmm5, %xmm1 320; AVX1-NEXT: vblendvpd %xmm10, %xmm0, %xmm5, %xmm0 321; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 322; AVX1-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6] 323; AVX1-NEXT: vmaskmovps %ymm0, %ymm8, (%rdi) 324; AVX1-NEXT: vzeroupper 325; AVX1-NEXT: retq 326; 327; AVX2-LABEL: truncstore_v8i64_v8i32: 328; AVX2: # %bb.0: 329; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 330; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm2 331; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 332; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 333; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [2147483647,2147483647,2147483647,2147483647] 334; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 335; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 336; AVX2-NEXT: vpcmpgtq %ymm1, %ymm3, %ymm4 337; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 338; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968] 339; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm4 340; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 341; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 342; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 343; AVX2-NEXT: vperm2f128 {{.*#+}} ymm3 = ymm0[2,3],ymm1[2,3] 344; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 345; AVX2-NEXT: vshufps {{.*#+}} ymm0 = ymm0[0,2],ymm3[0,2],ymm0[4,6],ymm3[4,6] 346; AVX2-NEXT: vpmaskmovd %ymm0, %ymm2, (%rdi) 347; AVX2-NEXT: vzeroupper 348; AVX2-NEXT: retq 349; 350; AVX512F-LABEL: truncstore_v8i64_v8i32: 351; AVX512F: # %bb.0: 352; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 353; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k1 354; AVX512F-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 355; AVX512F-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 356; AVX512F-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 357; AVX512F-NEXT: vzeroupper 358; AVX512F-NEXT: retq 359; 360; AVX512VL-LABEL: truncstore_v8i64_v8i32: 361; AVX512VL: # %bb.0: 362; AVX512VL-NEXT: vptestmd %ymm1, %ymm1, %k1 363; AVX512VL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 364; AVX512VL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 365; AVX512VL-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 366; AVX512VL-NEXT: vzeroupper 367; AVX512VL-NEXT: retq 368; 369; AVX512BW-LABEL: truncstore_v8i64_v8i32: 370; AVX512BW: # %bb.0: 371; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 372; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 373; AVX512BW-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 374; AVX512BW-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 375; AVX512BW-NEXT: vpmovqd %zmm0, (%rdi) {%k1} 376; AVX512BW-NEXT: vzeroupper 377; AVX512BW-NEXT: retq 378 %a = icmp ne <8 x i32> %mask, zeroinitializer 379 %b = icmp slt <8 x i64> %x, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 380 %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 381 %d = icmp sgt <8 x i64> %c, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 382 %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 383 %f = trunc <8 x i64> %e to <8 x i32> 384 call void @llvm.masked.store.v8i32.p0v8i32(<8 x i32> %f, <8 x i32>* %p, i32 1, <8 x i1> %a) 385 ret void 386} 387 388define void @truncstore_v8i64_v8i16(<8 x i64> %x, <8 x i16>* %p, <8 x i32> %mask) { 389; SSE2-LABEL: truncstore_v8i64_v8i16: 390; SSE2: # %bb.0: 391; SSE2-NEXT: pxor %xmm8, %xmm8 392; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [32767,32767] 393; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 394; SSE2-NEXT: movdqa %xmm2, %xmm6 395; SSE2-NEXT: pxor %xmm11, %xmm6 396; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147516415,2147516415] 397; SSE2-NEXT: movdqa %xmm10, %xmm7 398; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 399; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] 400; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 401; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 402; SSE2-NEXT: pand %xmm12, %xmm6 403; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] 404; SSE2-NEXT: por %xmm6, %xmm13 405; SSE2-NEXT: pand %xmm13, %xmm2 406; SSE2-NEXT: pandn %xmm9, %xmm13 407; SSE2-NEXT: por %xmm2, %xmm13 408; SSE2-NEXT: movdqa %xmm3, %xmm2 409; SSE2-NEXT: pxor %xmm11, %xmm2 410; SSE2-NEXT: movdqa %xmm10, %xmm6 411; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 412; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 413; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 414; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 415; SSE2-NEXT: pand %xmm12, %xmm7 416; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 417; SSE2-NEXT: por %xmm7, %xmm2 418; SSE2-NEXT: pand %xmm2, %xmm3 419; SSE2-NEXT: pandn %xmm9, %xmm2 420; SSE2-NEXT: por %xmm3, %xmm2 421; SSE2-NEXT: movdqa %xmm0, %xmm3 422; SSE2-NEXT: pxor %xmm11, %xmm3 423; SSE2-NEXT: movdqa %xmm10, %xmm6 424; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 425; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 426; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 427; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 428; SSE2-NEXT: pand %xmm12, %xmm7 429; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 430; SSE2-NEXT: por %xmm7, %xmm3 431; SSE2-NEXT: pand %xmm3, %xmm0 432; SSE2-NEXT: pandn %xmm9, %xmm3 433; SSE2-NEXT: por %xmm0, %xmm3 434; SSE2-NEXT: movdqa %xmm1, %xmm0 435; SSE2-NEXT: pxor %xmm11, %xmm0 436; SSE2-NEXT: movdqa %xmm10, %xmm6 437; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 438; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 439; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 440; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 441; SSE2-NEXT: pand %xmm7, %xmm0 442; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 443; SSE2-NEXT: por %xmm0, %xmm6 444; SSE2-NEXT: pand %xmm6, %xmm1 445; SSE2-NEXT: pandn %xmm9, %xmm6 446; SSE2-NEXT: por %xmm1, %xmm6 447; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744073709518848,18446744073709518848] 448; SSE2-NEXT: movdqa %xmm6, %xmm0 449; SSE2-NEXT: pxor %xmm11, %xmm0 450; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562035200,18446744071562035200] 451; SSE2-NEXT: movdqa %xmm0, %xmm7 452; SSE2-NEXT: pcmpgtd %xmm10, %xmm7 453; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] 454; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 455; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 456; SSE2-NEXT: pand %xmm1, %xmm0 457; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] 458; SSE2-NEXT: por %xmm0, %xmm1 459; SSE2-NEXT: pand %xmm1, %xmm6 460; SSE2-NEXT: pandn %xmm9, %xmm1 461; SSE2-NEXT: por %xmm6, %xmm1 462; SSE2-NEXT: movdqa %xmm3, %xmm0 463; SSE2-NEXT: pxor %xmm11, %xmm0 464; SSE2-NEXT: movdqa %xmm0, %xmm6 465; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 466; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 467; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 468; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 469; SSE2-NEXT: pand %xmm12, %xmm7 470; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 471; SSE2-NEXT: por %xmm7, %xmm0 472; SSE2-NEXT: pand %xmm0, %xmm3 473; SSE2-NEXT: pandn %xmm9, %xmm0 474; SSE2-NEXT: por %xmm3, %xmm0 475; SSE2-NEXT: packssdw %xmm1, %xmm0 476; SSE2-NEXT: movdqa %xmm2, %xmm1 477; SSE2-NEXT: pxor %xmm11, %xmm1 478; SSE2-NEXT: movdqa %xmm1, %xmm3 479; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 480; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 481; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 482; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 483; SSE2-NEXT: pand %xmm6, %xmm1 484; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 485; SSE2-NEXT: por %xmm1, %xmm3 486; SSE2-NEXT: pand %xmm3, %xmm2 487; SSE2-NEXT: pandn %xmm9, %xmm3 488; SSE2-NEXT: por %xmm2, %xmm3 489; SSE2-NEXT: pxor %xmm13, %xmm11 490; SSE2-NEXT: movdqa %xmm11, %xmm1 491; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 492; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 493; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 494; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3] 495; SSE2-NEXT: pand %xmm2, %xmm6 496; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 497; SSE2-NEXT: por %xmm6, %xmm1 498; SSE2-NEXT: pand %xmm1, %xmm13 499; SSE2-NEXT: pandn %xmm9, %xmm1 500; SSE2-NEXT: por %xmm13, %xmm1 501; SSE2-NEXT: packssdw %xmm3, %xmm1 502; SSE2-NEXT: packssdw %xmm1, %xmm0 503; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 504; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 505; SSE2-NEXT: pxor %xmm1, %xmm5 506; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 507; SSE2-NEXT: pxor %xmm1, %xmm4 508; SSE2-NEXT: packssdw %xmm5, %xmm4 509; SSE2-NEXT: packsswb %xmm4, %xmm4 510; SSE2-NEXT: pmovmskb %xmm4, %eax 511; SSE2-NEXT: testb $1, %al 512; SSE2-NEXT: jne .LBB1_1 513; SSE2-NEXT: # %bb.2: # %else 514; SSE2-NEXT: testb $2, %al 515; SSE2-NEXT: jne .LBB1_3 516; SSE2-NEXT: .LBB1_4: # %else2 517; SSE2-NEXT: testb $4, %al 518; SSE2-NEXT: jne .LBB1_5 519; SSE2-NEXT: .LBB1_6: # %else4 520; SSE2-NEXT: testb $8, %al 521; SSE2-NEXT: jne .LBB1_7 522; SSE2-NEXT: .LBB1_8: # %else6 523; SSE2-NEXT: testb $16, %al 524; SSE2-NEXT: jne .LBB1_9 525; SSE2-NEXT: .LBB1_10: # %else8 526; SSE2-NEXT: testb $32, %al 527; SSE2-NEXT: jne .LBB1_11 528; SSE2-NEXT: .LBB1_12: # %else10 529; SSE2-NEXT: testb $64, %al 530; SSE2-NEXT: jne .LBB1_13 531; SSE2-NEXT: .LBB1_14: # %else12 532; SSE2-NEXT: testb $-128, %al 533; SSE2-NEXT: jne .LBB1_15 534; SSE2-NEXT: .LBB1_16: # %else14 535; SSE2-NEXT: retq 536; SSE2-NEXT: .LBB1_1: # %cond.store 537; SSE2-NEXT: movd %xmm0, %ecx 538; SSE2-NEXT: movw %cx, (%rdi) 539; SSE2-NEXT: testb $2, %al 540; SSE2-NEXT: je .LBB1_4 541; SSE2-NEXT: .LBB1_3: # %cond.store1 542; SSE2-NEXT: pextrw $1, %xmm0, %ecx 543; SSE2-NEXT: movw %cx, 2(%rdi) 544; SSE2-NEXT: testb $4, %al 545; SSE2-NEXT: je .LBB1_6 546; SSE2-NEXT: .LBB1_5: # %cond.store3 547; SSE2-NEXT: pextrw $2, %xmm0, %ecx 548; SSE2-NEXT: movw %cx, 4(%rdi) 549; SSE2-NEXT: testb $8, %al 550; SSE2-NEXT: je .LBB1_8 551; SSE2-NEXT: .LBB1_7: # %cond.store5 552; SSE2-NEXT: pextrw $3, %xmm0, %ecx 553; SSE2-NEXT: movw %cx, 6(%rdi) 554; SSE2-NEXT: testb $16, %al 555; SSE2-NEXT: je .LBB1_10 556; SSE2-NEXT: .LBB1_9: # %cond.store7 557; SSE2-NEXT: pextrw $4, %xmm0, %ecx 558; SSE2-NEXT: movw %cx, 8(%rdi) 559; SSE2-NEXT: testb $32, %al 560; SSE2-NEXT: je .LBB1_12 561; SSE2-NEXT: .LBB1_11: # %cond.store9 562; SSE2-NEXT: pextrw $5, %xmm0, %ecx 563; SSE2-NEXT: movw %cx, 10(%rdi) 564; SSE2-NEXT: testb $64, %al 565; SSE2-NEXT: je .LBB1_14 566; SSE2-NEXT: .LBB1_13: # %cond.store11 567; SSE2-NEXT: pextrw $6, %xmm0, %ecx 568; SSE2-NEXT: movw %cx, 12(%rdi) 569; SSE2-NEXT: testb $-128, %al 570; SSE2-NEXT: je .LBB1_16 571; SSE2-NEXT: .LBB1_15: # %cond.store13 572; SSE2-NEXT: pextrw $7, %xmm0, %eax 573; SSE2-NEXT: movw %ax, 14(%rdi) 574; SSE2-NEXT: retq 575; 576; SSE4-LABEL: truncstore_v8i64_v8i16: 577; SSE4: # %bb.0: 578; SSE4-NEXT: movdqa %xmm0, %xmm9 579; SSE4-NEXT: pxor %xmm8, %xmm8 580; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [32767,32767] 581; SSE4-NEXT: movdqa %xmm7, %xmm0 582; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 583; SSE4-NEXT: movdqa %xmm7, %xmm10 584; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 585; SSE4-NEXT: movdqa %xmm7, %xmm0 586; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 587; SSE4-NEXT: movdqa %xmm7, %xmm2 588; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 589; SSE4-NEXT: movdqa %xmm7, %xmm0 590; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 591; SSE4-NEXT: movdqa %xmm7, %xmm3 592; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 593; SSE4-NEXT: movdqa %xmm7, %xmm0 594; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 595; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 596; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] 597; SSE4-NEXT: movapd %xmm7, %xmm0 598; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 599; SSE4-NEXT: movdqa %xmm1, %xmm6 600; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm6 601; SSE4-NEXT: movapd %xmm3, %xmm0 602; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 603; SSE4-NEXT: movdqa %xmm1, %xmm7 604; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 605; SSE4-NEXT: packssdw %xmm6, %xmm7 606; SSE4-NEXT: movapd %xmm2, %xmm0 607; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 608; SSE4-NEXT: movdqa %xmm1, %xmm3 609; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 610; SSE4-NEXT: movapd %xmm10, %xmm0 611; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 612; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm1 613; SSE4-NEXT: packssdw %xmm3, %xmm1 614; SSE4-NEXT: packssdw %xmm1, %xmm7 615; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 616; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 617; SSE4-NEXT: pxor %xmm0, %xmm5 618; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 619; SSE4-NEXT: pxor %xmm0, %xmm4 620; SSE4-NEXT: packssdw %xmm5, %xmm4 621; SSE4-NEXT: packsswb %xmm4, %xmm4 622; SSE4-NEXT: pmovmskb %xmm4, %eax 623; SSE4-NEXT: testb $1, %al 624; SSE4-NEXT: jne .LBB1_1 625; SSE4-NEXT: # %bb.2: # %else 626; SSE4-NEXT: testb $2, %al 627; SSE4-NEXT: jne .LBB1_3 628; SSE4-NEXT: .LBB1_4: # %else2 629; SSE4-NEXT: testb $4, %al 630; SSE4-NEXT: jne .LBB1_5 631; SSE4-NEXT: .LBB1_6: # %else4 632; SSE4-NEXT: testb $8, %al 633; SSE4-NEXT: jne .LBB1_7 634; SSE4-NEXT: .LBB1_8: # %else6 635; SSE4-NEXT: testb $16, %al 636; SSE4-NEXT: jne .LBB1_9 637; SSE4-NEXT: .LBB1_10: # %else8 638; SSE4-NEXT: testb $32, %al 639; SSE4-NEXT: jne .LBB1_11 640; SSE4-NEXT: .LBB1_12: # %else10 641; SSE4-NEXT: testb $64, %al 642; SSE4-NEXT: jne .LBB1_13 643; SSE4-NEXT: .LBB1_14: # %else12 644; SSE4-NEXT: testb $-128, %al 645; SSE4-NEXT: jne .LBB1_15 646; SSE4-NEXT: .LBB1_16: # %else14 647; SSE4-NEXT: retq 648; SSE4-NEXT: .LBB1_1: # %cond.store 649; SSE4-NEXT: pextrw $0, %xmm7, (%rdi) 650; SSE4-NEXT: testb $2, %al 651; SSE4-NEXT: je .LBB1_4 652; SSE4-NEXT: .LBB1_3: # %cond.store1 653; SSE4-NEXT: pextrw $1, %xmm7, 2(%rdi) 654; SSE4-NEXT: testb $4, %al 655; SSE4-NEXT: je .LBB1_6 656; SSE4-NEXT: .LBB1_5: # %cond.store3 657; SSE4-NEXT: pextrw $2, %xmm7, 4(%rdi) 658; SSE4-NEXT: testb $8, %al 659; SSE4-NEXT: je .LBB1_8 660; SSE4-NEXT: .LBB1_7: # %cond.store5 661; SSE4-NEXT: pextrw $3, %xmm7, 6(%rdi) 662; SSE4-NEXT: testb $16, %al 663; SSE4-NEXT: je .LBB1_10 664; SSE4-NEXT: .LBB1_9: # %cond.store7 665; SSE4-NEXT: pextrw $4, %xmm7, 8(%rdi) 666; SSE4-NEXT: testb $32, %al 667; SSE4-NEXT: je .LBB1_12 668; SSE4-NEXT: .LBB1_11: # %cond.store9 669; SSE4-NEXT: pextrw $5, %xmm7, 10(%rdi) 670; SSE4-NEXT: testb $64, %al 671; SSE4-NEXT: je .LBB1_14 672; SSE4-NEXT: .LBB1_13: # %cond.store11 673; SSE4-NEXT: pextrw $6, %xmm7, 12(%rdi) 674; SSE4-NEXT: testb $-128, %al 675; SSE4-NEXT: je .LBB1_16 676; SSE4-NEXT: .LBB1_15: # %cond.store13 677; SSE4-NEXT: pextrw $7, %xmm7, 14(%rdi) 678; SSE4-NEXT: retq 679; 680; AVX1-LABEL: truncstore_v8i64_v8i16: 681; AVX1: # %bb.0: 682; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 683; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [32767,32767] 684; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 685; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm9 686; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 687; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm5 688; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm6 689; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm4, %xmm0 690; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [18446744073709518848,18446744073709518848] 691; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm10 692; AVX1-NEXT: vblendvpd %xmm5, %xmm7, %xmm4, %xmm5 693; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm11 694; AVX1-NEXT: vblendvpd %xmm9, %xmm1, %xmm4, %xmm1 695; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm7 696; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 697; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm4 698; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3 699; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1 700; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 701; AVX1-NEXT: vblendvpd %xmm11, %xmm5, %xmm6, %xmm3 702; AVX1-NEXT: vblendvpd %xmm10, %xmm0, %xmm6, %xmm0 703; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 704; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 705; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1 706; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 707; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 708; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 709; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 710; AVX1-NEXT: vmovmskps %ymm1, %eax 711; AVX1-NEXT: notl %eax 712; AVX1-NEXT: testb $1, %al 713; AVX1-NEXT: jne .LBB1_1 714; AVX1-NEXT: # %bb.2: # %else 715; AVX1-NEXT: testb $2, %al 716; AVX1-NEXT: jne .LBB1_3 717; AVX1-NEXT: .LBB1_4: # %else2 718; AVX1-NEXT: testb $4, %al 719; AVX1-NEXT: jne .LBB1_5 720; AVX1-NEXT: .LBB1_6: # %else4 721; AVX1-NEXT: testb $8, %al 722; AVX1-NEXT: jne .LBB1_7 723; AVX1-NEXT: .LBB1_8: # %else6 724; AVX1-NEXT: testb $16, %al 725; AVX1-NEXT: jne .LBB1_9 726; AVX1-NEXT: .LBB1_10: # %else8 727; AVX1-NEXT: testb $32, %al 728; AVX1-NEXT: jne .LBB1_11 729; AVX1-NEXT: .LBB1_12: # %else10 730; AVX1-NEXT: testb $64, %al 731; AVX1-NEXT: jne .LBB1_13 732; AVX1-NEXT: .LBB1_14: # %else12 733; AVX1-NEXT: testb $-128, %al 734; AVX1-NEXT: jne .LBB1_15 735; AVX1-NEXT: .LBB1_16: # %else14 736; AVX1-NEXT: vzeroupper 737; AVX1-NEXT: retq 738; AVX1-NEXT: .LBB1_1: # %cond.store 739; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 740; AVX1-NEXT: testb $2, %al 741; AVX1-NEXT: je .LBB1_4 742; AVX1-NEXT: .LBB1_3: # %cond.store1 743; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 744; AVX1-NEXT: testb $4, %al 745; AVX1-NEXT: je .LBB1_6 746; AVX1-NEXT: .LBB1_5: # %cond.store3 747; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 748; AVX1-NEXT: testb $8, %al 749; AVX1-NEXT: je .LBB1_8 750; AVX1-NEXT: .LBB1_7: # %cond.store5 751; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 752; AVX1-NEXT: testb $16, %al 753; AVX1-NEXT: je .LBB1_10 754; AVX1-NEXT: .LBB1_9: # %cond.store7 755; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 756; AVX1-NEXT: testb $32, %al 757; AVX1-NEXT: je .LBB1_12 758; AVX1-NEXT: .LBB1_11: # %cond.store9 759; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 760; AVX1-NEXT: testb $64, %al 761; AVX1-NEXT: je .LBB1_14 762; AVX1-NEXT: .LBB1_13: # %cond.store11 763; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 764; AVX1-NEXT: testb $-128, %al 765; AVX1-NEXT: je .LBB1_16 766; AVX1-NEXT: .LBB1_15: # %cond.store13 767; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 768; AVX1-NEXT: vzeroupper 769; AVX1-NEXT: retq 770; 771; AVX2-LABEL: truncstore_v8i64_v8i16: 772; AVX2: # %bb.0: 773; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 774; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [32767,32767,32767,32767] 775; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5 776; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 777; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5 778; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 779; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] 780; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5 781; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 782; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5 783; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 784; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 785; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 786; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 787; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 788; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1 789; AVX2-NEXT: vmovmskps %ymm1, %eax 790; AVX2-NEXT: notl %eax 791; AVX2-NEXT: testb $1, %al 792; AVX2-NEXT: jne .LBB1_1 793; AVX2-NEXT: # %bb.2: # %else 794; AVX2-NEXT: testb $2, %al 795; AVX2-NEXT: jne .LBB1_3 796; AVX2-NEXT: .LBB1_4: # %else2 797; AVX2-NEXT: testb $4, %al 798; AVX2-NEXT: jne .LBB1_5 799; AVX2-NEXT: .LBB1_6: # %else4 800; AVX2-NEXT: testb $8, %al 801; AVX2-NEXT: jne .LBB1_7 802; AVX2-NEXT: .LBB1_8: # %else6 803; AVX2-NEXT: testb $16, %al 804; AVX2-NEXT: jne .LBB1_9 805; AVX2-NEXT: .LBB1_10: # %else8 806; AVX2-NEXT: testb $32, %al 807; AVX2-NEXT: jne .LBB1_11 808; AVX2-NEXT: .LBB1_12: # %else10 809; AVX2-NEXT: testb $64, %al 810; AVX2-NEXT: jne .LBB1_13 811; AVX2-NEXT: .LBB1_14: # %else12 812; AVX2-NEXT: testb $-128, %al 813; AVX2-NEXT: jne .LBB1_15 814; AVX2-NEXT: .LBB1_16: # %else14 815; AVX2-NEXT: vzeroupper 816; AVX2-NEXT: retq 817; AVX2-NEXT: .LBB1_1: # %cond.store 818; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 819; AVX2-NEXT: testb $2, %al 820; AVX2-NEXT: je .LBB1_4 821; AVX2-NEXT: .LBB1_3: # %cond.store1 822; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 823; AVX2-NEXT: testb $4, %al 824; AVX2-NEXT: je .LBB1_6 825; AVX2-NEXT: .LBB1_5: # %cond.store3 826; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 827; AVX2-NEXT: testb $8, %al 828; AVX2-NEXT: je .LBB1_8 829; AVX2-NEXT: .LBB1_7: # %cond.store5 830; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 831; AVX2-NEXT: testb $16, %al 832; AVX2-NEXT: je .LBB1_10 833; AVX2-NEXT: .LBB1_9: # %cond.store7 834; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 835; AVX2-NEXT: testb $32, %al 836; AVX2-NEXT: je .LBB1_12 837; AVX2-NEXT: .LBB1_11: # %cond.store9 838; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 839; AVX2-NEXT: testb $64, %al 840; AVX2-NEXT: je .LBB1_14 841; AVX2-NEXT: .LBB1_13: # %cond.store11 842; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 843; AVX2-NEXT: testb $-128, %al 844; AVX2-NEXT: je .LBB1_16 845; AVX2-NEXT: .LBB1_15: # %cond.store13 846; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 847; AVX2-NEXT: vzeroupper 848; AVX2-NEXT: retq 849; 850; AVX512F-LABEL: truncstore_v8i64_v8i16: 851; AVX512F: # %bb.0: 852; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 853; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 854; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0 855; AVX512F-NEXT: kmovw %k0, %eax 856; AVX512F-NEXT: testb $1, %al 857; AVX512F-NEXT: jne .LBB1_1 858; AVX512F-NEXT: # %bb.2: # %else 859; AVX512F-NEXT: testb $2, %al 860; AVX512F-NEXT: jne .LBB1_3 861; AVX512F-NEXT: .LBB1_4: # %else2 862; AVX512F-NEXT: testb $4, %al 863; AVX512F-NEXT: jne .LBB1_5 864; AVX512F-NEXT: .LBB1_6: # %else4 865; AVX512F-NEXT: testb $8, %al 866; AVX512F-NEXT: jne .LBB1_7 867; AVX512F-NEXT: .LBB1_8: # %else6 868; AVX512F-NEXT: testb $16, %al 869; AVX512F-NEXT: jne .LBB1_9 870; AVX512F-NEXT: .LBB1_10: # %else8 871; AVX512F-NEXT: testb $32, %al 872; AVX512F-NEXT: jne .LBB1_11 873; AVX512F-NEXT: .LBB1_12: # %else10 874; AVX512F-NEXT: testb $64, %al 875; AVX512F-NEXT: jne .LBB1_13 876; AVX512F-NEXT: .LBB1_14: # %else12 877; AVX512F-NEXT: testb $-128, %al 878; AVX512F-NEXT: jne .LBB1_15 879; AVX512F-NEXT: .LBB1_16: # %else14 880; AVX512F-NEXT: vzeroupper 881; AVX512F-NEXT: retq 882; AVX512F-NEXT: .LBB1_1: # %cond.store 883; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 884; AVX512F-NEXT: testb $2, %al 885; AVX512F-NEXT: je .LBB1_4 886; AVX512F-NEXT: .LBB1_3: # %cond.store1 887; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 888; AVX512F-NEXT: testb $4, %al 889; AVX512F-NEXT: je .LBB1_6 890; AVX512F-NEXT: .LBB1_5: # %cond.store3 891; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 892; AVX512F-NEXT: testb $8, %al 893; AVX512F-NEXT: je .LBB1_8 894; AVX512F-NEXT: .LBB1_7: # %cond.store5 895; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 896; AVX512F-NEXT: testb $16, %al 897; AVX512F-NEXT: je .LBB1_10 898; AVX512F-NEXT: .LBB1_9: # %cond.store7 899; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 900; AVX512F-NEXT: testb $32, %al 901; AVX512F-NEXT: je .LBB1_12 902; AVX512F-NEXT: .LBB1_11: # %cond.store9 903; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 904; AVX512F-NEXT: testb $64, %al 905; AVX512F-NEXT: je .LBB1_14 906; AVX512F-NEXT: .LBB1_13: # %cond.store11 907; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 908; AVX512F-NEXT: testb $-128, %al 909; AVX512F-NEXT: je .LBB1_16 910; AVX512F-NEXT: .LBB1_15: # %cond.store13 911; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 912; AVX512F-NEXT: vzeroupper 913; AVX512F-NEXT: retq 914; 915; AVX512BW-LABEL: truncstore_v8i64_v8i16: 916; AVX512BW: # %bb.0: 917; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 918; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 919; AVX512BW-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 920; AVX512BW-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 921; AVX512BW-NEXT: vpmovqw %zmm0, (%rdi) {%k1} 922; AVX512BW-NEXT: vzeroupper 923; AVX512BW-NEXT: retq 924; 925; AVX512BWVL-LABEL: truncstore_v8i64_v8i16: 926; AVX512BWVL: # %bb.0: 927; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 928; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 929; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 930; AVX512BWVL-NEXT: vpmovqw %zmm0, (%rdi) {%k1} 931; AVX512BWVL-NEXT: vzeroupper 932; AVX512BWVL-NEXT: retq 933 %a = icmp ne <8 x i32> %mask, zeroinitializer 934 %b = icmp slt <8 x i64> %x, <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767> 935 %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767, i64 32767> 936 %d = icmp sgt <8 x i64> %c, <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768> 937 %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768, i64 -32768> 938 %f = trunc <8 x i64> %e to <8 x i16> 939 call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %f, <8 x i16>* %p, i32 1, <8 x i1> %a) 940 ret void 941} 942 943define void @truncstore_v8i64_v8i8(<8 x i64> %x, <8 x i8>* %p, <8 x i32> %mask) { 944; SSE2-LABEL: truncstore_v8i64_v8i8: 945; SSE2: # %bb.0: 946; SSE2-NEXT: pxor %xmm8, %xmm8 947; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [127,127] 948; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] 949; SSE2-NEXT: movdqa %xmm2, %xmm6 950; SSE2-NEXT: pxor %xmm11, %xmm6 951; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775] 952; SSE2-NEXT: movdqa %xmm10, %xmm7 953; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 954; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] 955; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 956; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 957; SSE2-NEXT: pand %xmm12, %xmm6 958; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] 959; SSE2-NEXT: por %xmm6, %xmm13 960; SSE2-NEXT: pand %xmm13, %xmm2 961; SSE2-NEXT: pandn %xmm9, %xmm13 962; SSE2-NEXT: por %xmm2, %xmm13 963; SSE2-NEXT: movdqa %xmm3, %xmm2 964; SSE2-NEXT: pxor %xmm11, %xmm2 965; SSE2-NEXT: movdqa %xmm10, %xmm6 966; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 967; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 968; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 969; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] 970; SSE2-NEXT: pand %xmm12, %xmm7 971; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] 972; SSE2-NEXT: por %xmm7, %xmm2 973; SSE2-NEXT: pand %xmm2, %xmm3 974; SSE2-NEXT: pandn %xmm9, %xmm2 975; SSE2-NEXT: por %xmm3, %xmm2 976; SSE2-NEXT: movdqa %xmm0, %xmm3 977; SSE2-NEXT: pxor %xmm11, %xmm3 978; SSE2-NEXT: movdqa %xmm10, %xmm6 979; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 980; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 981; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 982; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] 983; SSE2-NEXT: pand %xmm12, %xmm7 984; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] 985; SSE2-NEXT: por %xmm7, %xmm3 986; SSE2-NEXT: pand %xmm3, %xmm0 987; SSE2-NEXT: pandn %xmm9, %xmm3 988; SSE2-NEXT: por %xmm0, %xmm3 989; SSE2-NEXT: movdqa %xmm1, %xmm0 990; SSE2-NEXT: pxor %xmm11, %xmm0 991; SSE2-NEXT: movdqa %xmm10, %xmm6 992; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 993; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 994; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 995; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 996; SSE2-NEXT: pand %xmm7, %xmm0 997; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] 998; SSE2-NEXT: por %xmm0, %xmm6 999; SSE2-NEXT: pand %xmm6, %xmm1 1000; SSE2-NEXT: pandn %xmm9, %xmm6 1001; SSE2-NEXT: por %xmm1, %xmm6 1002; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744073709551488,18446744073709551488] 1003; SSE2-NEXT: movdqa %xmm6, %xmm0 1004; SSE2-NEXT: pxor %xmm11, %xmm0 1005; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562067840,18446744071562067840] 1006; SSE2-NEXT: movdqa %xmm0, %xmm7 1007; SSE2-NEXT: pcmpgtd %xmm10, %xmm7 1008; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] 1009; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1010; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1011; SSE2-NEXT: pand %xmm1, %xmm0 1012; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] 1013; SSE2-NEXT: por %xmm0, %xmm1 1014; SSE2-NEXT: pand %xmm1, %xmm6 1015; SSE2-NEXT: pandn %xmm9, %xmm1 1016; SSE2-NEXT: por %xmm6, %xmm1 1017; SSE2-NEXT: movdqa %xmm3, %xmm0 1018; SSE2-NEXT: pxor %xmm11, %xmm0 1019; SSE2-NEXT: movdqa %xmm0, %xmm6 1020; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 1021; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] 1022; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1023; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] 1024; SSE2-NEXT: pand %xmm12, %xmm7 1025; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] 1026; SSE2-NEXT: por %xmm7, %xmm0 1027; SSE2-NEXT: pand %xmm0, %xmm3 1028; SSE2-NEXT: pandn %xmm9, %xmm0 1029; SSE2-NEXT: por %xmm3, %xmm0 1030; SSE2-NEXT: packssdw %xmm1, %xmm0 1031; SSE2-NEXT: movdqa %xmm2, %xmm1 1032; SSE2-NEXT: pxor %xmm11, %xmm1 1033; SSE2-NEXT: movdqa %xmm1, %xmm3 1034; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 1035; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 1036; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 1037; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1038; SSE2-NEXT: pand %xmm6, %xmm1 1039; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1040; SSE2-NEXT: por %xmm1, %xmm3 1041; SSE2-NEXT: pand %xmm3, %xmm2 1042; SSE2-NEXT: pandn %xmm9, %xmm3 1043; SSE2-NEXT: por %xmm2, %xmm3 1044; SSE2-NEXT: pxor %xmm13, %xmm11 1045; SSE2-NEXT: movdqa %xmm11, %xmm1 1046; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 1047; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] 1048; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 1049; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3] 1050; SSE2-NEXT: pand %xmm2, %xmm6 1051; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 1052; SSE2-NEXT: por %xmm6, %xmm1 1053; SSE2-NEXT: pand %xmm1, %xmm13 1054; SSE2-NEXT: pandn %xmm9, %xmm1 1055; SSE2-NEXT: por %xmm13, %xmm1 1056; SSE2-NEXT: packssdw %xmm3, %xmm1 1057; SSE2-NEXT: packssdw %xmm1, %xmm0 1058; SSE2-NEXT: packsswb %xmm0, %xmm0 1059; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 1060; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 1061; SSE2-NEXT: pxor %xmm1, %xmm5 1062; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 1063; SSE2-NEXT: pxor %xmm1, %xmm4 1064; SSE2-NEXT: packssdw %xmm5, %xmm4 1065; SSE2-NEXT: packsswb %xmm4, %xmm4 1066; SSE2-NEXT: pmovmskb %xmm4, %eax 1067; SSE2-NEXT: testb $1, %al 1068; SSE2-NEXT: movd %xmm0, %ecx 1069; SSE2-NEXT: jne .LBB2_1 1070; SSE2-NEXT: # %bb.2: # %else 1071; SSE2-NEXT: testb $2, %al 1072; SSE2-NEXT: jne .LBB2_3 1073; SSE2-NEXT: .LBB2_4: # %else2 1074; SSE2-NEXT: testb $4, %al 1075; SSE2-NEXT: jne .LBB2_5 1076; SSE2-NEXT: .LBB2_6: # %else4 1077; SSE2-NEXT: testb $8, %al 1078; SSE2-NEXT: je .LBB2_8 1079; SSE2-NEXT: .LBB2_7: # %cond.store5 1080; SSE2-NEXT: shrl $24, %ecx 1081; SSE2-NEXT: movb %cl, 3(%rdi) 1082; SSE2-NEXT: .LBB2_8: # %else6 1083; SSE2-NEXT: testb $16, %al 1084; SSE2-NEXT: pextrw $2, %xmm0, %ecx 1085; SSE2-NEXT: je .LBB2_10 1086; SSE2-NEXT: # %bb.9: # %cond.store7 1087; SSE2-NEXT: movb %cl, 4(%rdi) 1088; SSE2-NEXT: .LBB2_10: # %else8 1089; SSE2-NEXT: testb $32, %al 1090; SSE2-NEXT: je .LBB2_12 1091; SSE2-NEXT: # %bb.11: # %cond.store9 1092; SSE2-NEXT: movb %ch, 5(%rdi) 1093; SSE2-NEXT: .LBB2_12: # %else10 1094; SSE2-NEXT: testb $64, %al 1095; SSE2-NEXT: pextrw $3, %xmm0, %ecx 1096; SSE2-NEXT: jne .LBB2_13 1097; SSE2-NEXT: # %bb.14: # %else12 1098; SSE2-NEXT: testb $-128, %al 1099; SSE2-NEXT: jne .LBB2_15 1100; SSE2-NEXT: .LBB2_16: # %else14 1101; SSE2-NEXT: retq 1102; SSE2-NEXT: .LBB2_1: # %cond.store 1103; SSE2-NEXT: movb %cl, (%rdi) 1104; SSE2-NEXT: testb $2, %al 1105; SSE2-NEXT: je .LBB2_4 1106; SSE2-NEXT: .LBB2_3: # %cond.store1 1107; SSE2-NEXT: movb %ch, 1(%rdi) 1108; SSE2-NEXT: testb $4, %al 1109; SSE2-NEXT: je .LBB2_6 1110; SSE2-NEXT: .LBB2_5: # %cond.store3 1111; SSE2-NEXT: movl %ecx, %edx 1112; SSE2-NEXT: shrl $16, %edx 1113; SSE2-NEXT: movb %dl, 2(%rdi) 1114; SSE2-NEXT: testb $8, %al 1115; SSE2-NEXT: jne .LBB2_7 1116; SSE2-NEXT: jmp .LBB2_8 1117; SSE2-NEXT: .LBB2_13: # %cond.store11 1118; SSE2-NEXT: movb %cl, 6(%rdi) 1119; SSE2-NEXT: testb $-128, %al 1120; SSE2-NEXT: je .LBB2_16 1121; SSE2-NEXT: .LBB2_15: # %cond.store13 1122; SSE2-NEXT: movb %ch, 7(%rdi) 1123; SSE2-NEXT: retq 1124; 1125; SSE4-LABEL: truncstore_v8i64_v8i8: 1126; SSE4: # %bb.0: 1127; SSE4-NEXT: movdqa %xmm0, %xmm9 1128; SSE4-NEXT: pxor %xmm8, %xmm8 1129; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [127,127] 1130; SSE4-NEXT: movdqa %xmm7, %xmm0 1131; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 1132; SSE4-NEXT: movdqa %xmm7, %xmm10 1133; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 1134; SSE4-NEXT: movdqa %xmm7, %xmm0 1135; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 1136; SSE4-NEXT: movdqa %xmm7, %xmm2 1137; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 1138; SSE4-NEXT: movdqa %xmm7, %xmm0 1139; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 1140; SSE4-NEXT: movdqa %xmm7, %xmm3 1141; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 1142; SSE4-NEXT: movdqa %xmm7, %xmm0 1143; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1144; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 1145; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488] 1146; SSE4-NEXT: movapd %xmm7, %xmm0 1147; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1148; SSE4-NEXT: movdqa %xmm1, %xmm6 1149; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm6 1150; SSE4-NEXT: movapd %xmm3, %xmm0 1151; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1152; SSE4-NEXT: movdqa %xmm1, %xmm7 1153; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 1154; SSE4-NEXT: packssdw %xmm6, %xmm7 1155; SSE4-NEXT: movapd %xmm2, %xmm0 1156; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1157; SSE4-NEXT: movdqa %xmm1, %xmm3 1158; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 1159; SSE4-NEXT: movapd %xmm10, %xmm0 1160; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1161; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm1 1162; SSE4-NEXT: packssdw %xmm3, %xmm1 1163; SSE4-NEXT: packssdw %xmm1, %xmm7 1164; SSE4-NEXT: packsswb %xmm7, %xmm7 1165; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 1166; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 1167; SSE4-NEXT: pxor %xmm0, %xmm5 1168; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 1169; SSE4-NEXT: pxor %xmm0, %xmm4 1170; SSE4-NEXT: packssdw %xmm5, %xmm4 1171; SSE4-NEXT: packsswb %xmm4, %xmm4 1172; SSE4-NEXT: pmovmskb %xmm4, %eax 1173; SSE4-NEXT: testb $1, %al 1174; SSE4-NEXT: jne .LBB2_1 1175; SSE4-NEXT: # %bb.2: # %else 1176; SSE4-NEXT: testb $2, %al 1177; SSE4-NEXT: jne .LBB2_3 1178; SSE4-NEXT: .LBB2_4: # %else2 1179; SSE4-NEXT: testb $4, %al 1180; SSE4-NEXT: jne .LBB2_5 1181; SSE4-NEXT: .LBB2_6: # %else4 1182; SSE4-NEXT: testb $8, %al 1183; SSE4-NEXT: jne .LBB2_7 1184; SSE4-NEXT: .LBB2_8: # %else6 1185; SSE4-NEXT: testb $16, %al 1186; SSE4-NEXT: jne .LBB2_9 1187; SSE4-NEXT: .LBB2_10: # %else8 1188; SSE4-NEXT: testb $32, %al 1189; SSE4-NEXT: jne .LBB2_11 1190; SSE4-NEXT: .LBB2_12: # %else10 1191; SSE4-NEXT: testb $64, %al 1192; SSE4-NEXT: jne .LBB2_13 1193; SSE4-NEXT: .LBB2_14: # %else12 1194; SSE4-NEXT: testb $-128, %al 1195; SSE4-NEXT: jne .LBB2_15 1196; SSE4-NEXT: .LBB2_16: # %else14 1197; SSE4-NEXT: retq 1198; SSE4-NEXT: .LBB2_1: # %cond.store 1199; SSE4-NEXT: pextrb $0, %xmm7, (%rdi) 1200; SSE4-NEXT: testb $2, %al 1201; SSE4-NEXT: je .LBB2_4 1202; SSE4-NEXT: .LBB2_3: # %cond.store1 1203; SSE4-NEXT: pextrb $1, %xmm7, 1(%rdi) 1204; SSE4-NEXT: testb $4, %al 1205; SSE4-NEXT: je .LBB2_6 1206; SSE4-NEXT: .LBB2_5: # %cond.store3 1207; SSE4-NEXT: pextrb $2, %xmm7, 2(%rdi) 1208; SSE4-NEXT: testb $8, %al 1209; SSE4-NEXT: je .LBB2_8 1210; SSE4-NEXT: .LBB2_7: # %cond.store5 1211; SSE4-NEXT: pextrb $3, %xmm7, 3(%rdi) 1212; SSE4-NEXT: testb $16, %al 1213; SSE4-NEXT: je .LBB2_10 1214; SSE4-NEXT: .LBB2_9: # %cond.store7 1215; SSE4-NEXT: pextrb $4, %xmm7, 4(%rdi) 1216; SSE4-NEXT: testb $32, %al 1217; SSE4-NEXT: je .LBB2_12 1218; SSE4-NEXT: .LBB2_11: # %cond.store9 1219; SSE4-NEXT: pextrb $5, %xmm7, 5(%rdi) 1220; SSE4-NEXT: testb $64, %al 1221; SSE4-NEXT: je .LBB2_14 1222; SSE4-NEXT: .LBB2_13: # %cond.store11 1223; SSE4-NEXT: pextrb $6, %xmm7, 6(%rdi) 1224; SSE4-NEXT: testb $-128, %al 1225; SSE4-NEXT: je .LBB2_16 1226; SSE4-NEXT: .LBB2_15: # %cond.store13 1227; SSE4-NEXT: pextrb $7, %xmm7, 7(%rdi) 1228; SSE4-NEXT: retq 1229; 1230; AVX1-LABEL: truncstore_v8i64_v8i8: 1231; AVX1: # %bb.0: 1232; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 1233; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127] 1234; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm8 1235; AVX1-NEXT: vpcmpgtq %xmm1, %xmm4, %xmm9 1236; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 1237; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm5 1238; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm6 1239; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm4, %xmm0 1240; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488] 1241; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm10 1242; AVX1-NEXT: vblendvpd %xmm5, %xmm7, %xmm4, %xmm5 1243; AVX1-NEXT: vpcmpgtq %xmm6, %xmm5, %xmm11 1244; AVX1-NEXT: vblendvpd %xmm9, %xmm1, %xmm4, %xmm1 1245; AVX1-NEXT: vpcmpgtq %xmm6, %xmm1, %xmm7 1246; AVX1-NEXT: vblendvpd %xmm8, %xmm3, %xmm4, %xmm3 1247; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm4 1248; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3 1249; AVX1-NEXT: vblendvpd %xmm7, %xmm1, %xmm6, %xmm1 1250; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 1251; AVX1-NEXT: vblendvpd %xmm11, %xmm5, %xmm6, %xmm3 1252; AVX1-NEXT: vblendvpd %xmm10, %xmm0, %xmm6, %xmm0 1253; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 1254; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 1255; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 1256; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm1 1257; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 1258; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 1259; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 1260; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm2, %ymm1 1261; AVX1-NEXT: vmovmskps %ymm1, %eax 1262; AVX1-NEXT: notl %eax 1263; AVX1-NEXT: testb $1, %al 1264; AVX1-NEXT: jne .LBB2_1 1265; AVX1-NEXT: # %bb.2: # %else 1266; AVX1-NEXT: testb $2, %al 1267; AVX1-NEXT: jne .LBB2_3 1268; AVX1-NEXT: .LBB2_4: # %else2 1269; AVX1-NEXT: testb $4, %al 1270; AVX1-NEXT: jne .LBB2_5 1271; AVX1-NEXT: .LBB2_6: # %else4 1272; AVX1-NEXT: testb $8, %al 1273; AVX1-NEXT: jne .LBB2_7 1274; AVX1-NEXT: .LBB2_8: # %else6 1275; AVX1-NEXT: testb $16, %al 1276; AVX1-NEXT: jne .LBB2_9 1277; AVX1-NEXT: .LBB2_10: # %else8 1278; AVX1-NEXT: testb $32, %al 1279; AVX1-NEXT: jne .LBB2_11 1280; AVX1-NEXT: .LBB2_12: # %else10 1281; AVX1-NEXT: testb $64, %al 1282; AVX1-NEXT: jne .LBB2_13 1283; AVX1-NEXT: .LBB2_14: # %else12 1284; AVX1-NEXT: testb $-128, %al 1285; AVX1-NEXT: jne .LBB2_15 1286; AVX1-NEXT: .LBB2_16: # %else14 1287; AVX1-NEXT: vzeroupper 1288; AVX1-NEXT: retq 1289; AVX1-NEXT: .LBB2_1: # %cond.store 1290; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 1291; AVX1-NEXT: testb $2, %al 1292; AVX1-NEXT: je .LBB2_4 1293; AVX1-NEXT: .LBB2_3: # %cond.store1 1294; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1295; AVX1-NEXT: testb $4, %al 1296; AVX1-NEXT: je .LBB2_6 1297; AVX1-NEXT: .LBB2_5: # %cond.store3 1298; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1299; AVX1-NEXT: testb $8, %al 1300; AVX1-NEXT: je .LBB2_8 1301; AVX1-NEXT: .LBB2_7: # %cond.store5 1302; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1303; AVX1-NEXT: testb $16, %al 1304; AVX1-NEXT: je .LBB2_10 1305; AVX1-NEXT: .LBB2_9: # %cond.store7 1306; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 1307; AVX1-NEXT: testb $32, %al 1308; AVX1-NEXT: je .LBB2_12 1309; AVX1-NEXT: .LBB2_11: # %cond.store9 1310; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 1311; AVX1-NEXT: testb $64, %al 1312; AVX1-NEXT: je .LBB2_14 1313; AVX1-NEXT: .LBB2_13: # %cond.store11 1314; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 1315; AVX1-NEXT: testb $-128, %al 1316; AVX1-NEXT: je .LBB2_16 1317; AVX1-NEXT: .LBB2_15: # %cond.store13 1318; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 1319; AVX1-NEXT: vzeroupper 1320; AVX1-NEXT: retq 1321; 1322; AVX2-LABEL: truncstore_v8i64_v8i8: 1323; AVX2: # %bb.0: 1324; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 1325; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [127,127,127,127] 1326; AVX2-NEXT: vpcmpgtq %ymm0, %ymm4, %ymm5 1327; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 1328; AVX2-NEXT: vpcmpgtq %ymm1, %ymm4, %ymm5 1329; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 1330; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] 1331; AVX2-NEXT: vpcmpgtq %ymm4, %ymm1, %ymm5 1332; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm4, %ymm1 1333; AVX2-NEXT: vpcmpgtq %ymm4, %ymm0, %ymm5 1334; AVX2-NEXT: vblendvpd %ymm5, %ymm0, %ymm4, %ymm0 1335; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 1336; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 1337; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 1338; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 1339; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 1340; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm1 1341; AVX2-NEXT: vmovmskps %ymm1, %eax 1342; AVX2-NEXT: notl %eax 1343; AVX2-NEXT: testb $1, %al 1344; AVX2-NEXT: jne .LBB2_1 1345; AVX2-NEXT: # %bb.2: # %else 1346; AVX2-NEXT: testb $2, %al 1347; AVX2-NEXT: jne .LBB2_3 1348; AVX2-NEXT: .LBB2_4: # %else2 1349; AVX2-NEXT: testb $4, %al 1350; AVX2-NEXT: jne .LBB2_5 1351; AVX2-NEXT: .LBB2_6: # %else4 1352; AVX2-NEXT: testb $8, %al 1353; AVX2-NEXT: jne .LBB2_7 1354; AVX2-NEXT: .LBB2_8: # %else6 1355; AVX2-NEXT: testb $16, %al 1356; AVX2-NEXT: jne .LBB2_9 1357; AVX2-NEXT: .LBB2_10: # %else8 1358; AVX2-NEXT: testb $32, %al 1359; AVX2-NEXT: jne .LBB2_11 1360; AVX2-NEXT: .LBB2_12: # %else10 1361; AVX2-NEXT: testb $64, %al 1362; AVX2-NEXT: jne .LBB2_13 1363; AVX2-NEXT: .LBB2_14: # %else12 1364; AVX2-NEXT: testb $-128, %al 1365; AVX2-NEXT: jne .LBB2_15 1366; AVX2-NEXT: .LBB2_16: # %else14 1367; AVX2-NEXT: vzeroupper 1368; AVX2-NEXT: retq 1369; AVX2-NEXT: .LBB2_1: # %cond.store 1370; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 1371; AVX2-NEXT: testb $2, %al 1372; AVX2-NEXT: je .LBB2_4 1373; AVX2-NEXT: .LBB2_3: # %cond.store1 1374; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1375; AVX2-NEXT: testb $4, %al 1376; AVX2-NEXT: je .LBB2_6 1377; AVX2-NEXT: .LBB2_5: # %cond.store3 1378; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1379; AVX2-NEXT: testb $8, %al 1380; AVX2-NEXT: je .LBB2_8 1381; AVX2-NEXT: .LBB2_7: # %cond.store5 1382; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1383; AVX2-NEXT: testb $16, %al 1384; AVX2-NEXT: je .LBB2_10 1385; AVX2-NEXT: .LBB2_9: # %cond.store7 1386; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 1387; AVX2-NEXT: testb $32, %al 1388; AVX2-NEXT: je .LBB2_12 1389; AVX2-NEXT: .LBB2_11: # %cond.store9 1390; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 1391; AVX2-NEXT: testb $64, %al 1392; AVX2-NEXT: je .LBB2_14 1393; AVX2-NEXT: .LBB2_13: # %cond.store11 1394; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 1395; AVX2-NEXT: testb $-128, %al 1396; AVX2-NEXT: je .LBB2_16 1397; AVX2-NEXT: .LBB2_15: # %cond.store13 1398; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 1399; AVX2-NEXT: vzeroupper 1400; AVX2-NEXT: retq 1401; 1402; AVX512F-LABEL: truncstore_v8i64_v8i8: 1403; AVX512F: # %bb.0: 1404; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1405; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1406; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0 1407; AVX512F-NEXT: kmovw %k0, %eax 1408; AVX512F-NEXT: testb $1, %al 1409; AVX512F-NEXT: jne .LBB2_1 1410; AVX512F-NEXT: # %bb.2: # %else 1411; AVX512F-NEXT: testb $2, %al 1412; AVX512F-NEXT: jne .LBB2_3 1413; AVX512F-NEXT: .LBB2_4: # %else2 1414; AVX512F-NEXT: testb $4, %al 1415; AVX512F-NEXT: jne .LBB2_5 1416; AVX512F-NEXT: .LBB2_6: # %else4 1417; AVX512F-NEXT: testb $8, %al 1418; AVX512F-NEXT: jne .LBB2_7 1419; AVX512F-NEXT: .LBB2_8: # %else6 1420; AVX512F-NEXT: testb $16, %al 1421; AVX512F-NEXT: jne .LBB2_9 1422; AVX512F-NEXT: .LBB2_10: # %else8 1423; AVX512F-NEXT: testb $32, %al 1424; AVX512F-NEXT: jne .LBB2_11 1425; AVX512F-NEXT: .LBB2_12: # %else10 1426; AVX512F-NEXT: testb $64, %al 1427; AVX512F-NEXT: jne .LBB2_13 1428; AVX512F-NEXT: .LBB2_14: # %else12 1429; AVX512F-NEXT: testb $-128, %al 1430; AVX512F-NEXT: jne .LBB2_15 1431; AVX512F-NEXT: .LBB2_16: # %else14 1432; AVX512F-NEXT: vzeroupper 1433; AVX512F-NEXT: retq 1434; AVX512F-NEXT: .LBB2_1: # %cond.store 1435; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 1436; AVX512F-NEXT: testb $2, %al 1437; AVX512F-NEXT: je .LBB2_4 1438; AVX512F-NEXT: .LBB2_3: # %cond.store1 1439; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 1440; AVX512F-NEXT: testb $4, %al 1441; AVX512F-NEXT: je .LBB2_6 1442; AVX512F-NEXT: .LBB2_5: # %cond.store3 1443; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 1444; AVX512F-NEXT: testb $8, %al 1445; AVX512F-NEXT: je .LBB2_8 1446; AVX512F-NEXT: .LBB2_7: # %cond.store5 1447; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 1448; AVX512F-NEXT: testb $16, %al 1449; AVX512F-NEXT: je .LBB2_10 1450; AVX512F-NEXT: .LBB2_9: # %cond.store7 1451; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 1452; AVX512F-NEXT: testb $32, %al 1453; AVX512F-NEXT: je .LBB2_12 1454; AVX512F-NEXT: .LBB2_11: # %cond.store9 1455; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 1456; AVX512F-NEXT: testb $64, %al 1457; AVX512F-NEXT: je .LBB2_14 1458; AVX512F-NEXT: .LBB2_13: # %cond.store11 1459; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 1460; AVX512F-NEXT: testb $-128, %al 1461; AVX512F-NEXT: je .LBB2_16 1462; AVX512F-NEXT: .LBB2_15: # %cond.store13 1463; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 1464; AVX512F-NEXT: vzeroupper 1465; AVX512F-NEXT: retq 1466; 1467; AVX512BW-LABEL: truncstore_v8i64_v8i8: 1468; AVX512BW: # %bb.0: 1469; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 1470; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 1471; AVX512BW-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1472; AVX512BW-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1473; AVX512BW-NEXT: vpmovqb %zmm0, (%rdi) {%k1} 1474; AVX512BW-NEXT: vzeroupper 1475; AVX512BW-NEXT: retq 1476; 1477; AVX512BWVL-LABEL: truncstore_v8i64_v8i8: 1478; AVX512BWVL: # %bb.0: 1479; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 1480; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1481; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %zmm0, %zmm0 1482; AVX512BWVL-NEXT: vpmovqb %zmm0, (%rdi) {%k1} 1483; AVX512BWVL-NEXT: vzeroupper 1484; AVX512BWVL-NEXT: retq 1485 %a = icmp ne <8 x i32> %mask, zeroinitializer 1486 %b = icmp slt <8 x i64> %x, <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127> 1487 %c = select <8 x i1> %b, <8 x i64> %x, <8 x i64> <i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127, i64 127> 1488 %d = icmp sgt <8 x i64> %c, <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128> 1489 %e = select <8 x i1> %d, <8 x i64> %c, <8 x i64> <i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128, i64 -128> 1490 %f = trunc <8 x i64> %e to <8 x i8> 1491 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a) 1492 ret void 1493} 1494 1495define void @truncstore_v4i64_v4i32(<4 x i64> %x, <4 x i32>* %p, <4 x i32> %mask) { 1496; SSE2-LABEL: truncstore_v4i64_v4i32: 1497; SSE2: # %bb.0: 1498; SSE2-NEXT: pxor %xmm9, %xmm9 1499; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647] 1500; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] 1501; SSE2-NEXT: movdqa %xmm0, %xmm5 1502; SSE2-NEXT: pxor %xmm4, %xmm5 1503; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [4294967295,4294967295] 1504; SSE2-NEXT: movdqa %xmm10, %xmm7 1505; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 1506; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 1507; SSE2-NEXT: pcmpeqd %xmm10, %xmm5 1508; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3] 1509; SSE2-NEXT: pand %xmm3, %xmm6 1510; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1511; SSE2-NEXT: por %xmm6, %xmm5 1512; SSE2-NEXT: pand %xmm5, %xmm0 1513; SSE2-NEXT: pandn %xmm8, %xmm5 1514; SSE2-NEXT: por %xmm0, %xmm5 1515; SSE2-NEXT: movdqa %xmm1, %xmm0 1516; SSE2-NEXT: pxor %xmm4, %xmm0 1517; SSE2-NEXT: movdqa %xmm10, %xmm3 1518; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1519; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 1520; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1521; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1522; SSE2-NEXT: pand %xmm6, %xmm0 1523; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1524; SSE2-NEXT: por %xmm0, %xmm3 1525; SSE2-NEXT: pand %xmm3, %xmm1 1526; SSE2-NEXT: pandn %xmm8, %xmm3 1527; SSE2-NEXT: por %xmm1, %xmm3 1528; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968] 1529; SSE2-NEXT: movdqa %xmm3, %xmm0 1530; SSE2-NEXT: pxor %xmm4, %xmm0 1531; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320] 1532; SSE2-NEXT: movdqa %xmm0, %xmm7 1533; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 1534; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] 1535; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 1536; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1537; SSE2-NEXT: pand %xmm1, %xmm0 1538; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] 1539; SSE2-NEXT: por %xmm0, %xmm1 1540; SSE2-NEXT: pand %xmm1, %xmm3 1541; SSE2-NEXT: pandn %xmm8, %xmm1 1542; SSE2-NEXT: por %xmm3, %xmm1 1543; SSE2-NEXT: pxor %xmm5, %xmm4 1544; SSE2-NEXT: movdqa %xmm4, %xmm0 1545; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 1546; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] 1547; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 1548; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1549; SSE2-NEXT: pand %xmm3, %xmm4 1550; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1551; SSE2-NEXT: por %xmm4, %xmm0 1552; SSE2-NEXT: pand %xmm0, %xmm5 1553; SSE2-NEXT: pandn %xmm8, %xmm0 1554; SSE2-NEXT: por %xmm5, %xmm0 1555; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] 1556; SSE2-NEXT: pcmpeqd %xmm2, %xmm9 1557; SSE2-NEXT: movmskps %xmm9, %eax 1558; SSE2-NEXT: xorl $15, %eax 1559; SSE2-NEXT: testb $1, %al 1560; SSE2-NEXT: jne .LBB3_1 1561; SSE2-NEXT: # %bb.2: # %else 1562; SSE2-NEXT: testb $2, %al 1563; SSE2-NEXT: jne .LBB3_3 1564; SSE2-NEXT: .LBB3_4: # %else2 1565; SSE2-NEXT: testb $4, %al 1566; SSE2-NEXT: jne .LBB3_5 1567; SSE2-NEXT: .LBB3_6: # %else4 1568; SSE2-NEXT: testb $8, %al 1569; SSE2-NEXT: jne .LBB3_7 1570; SSE2-NEXT: .LBB3_8: # %else6 1571; SSE2-NEXT: retq 1572; SSE2-NEXT: .LBB3_1: # %cond.store 1573; SSE2-NEXT: movss %xmm0, (%rdi) 1574; SSE2-NEXT: testb $2, %al 1575; SSE2-NEXT: je .LBB3_4 1576; SSE2-NEXT: .LBB3_3: # %cond.store1 1577; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,1,1] 1578; SSE2-NEXT: movd %xmm1, 4(%rdi) 1579; SSE2-NEXT: testb $4, %al 1580; SSE2-NEXT: je .LBB3_6 1581; SSE2-NEXT: .LBB3_5: # %cond.store3 1582; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3] 1583; SSE2-NEXT: movd %xmm1, 8(%rdi) 1584; SSE2-NEXT: testb $8, %al 1585; SSE2-NEXT: je .LBB3_8 1586; SSE2-NEXT: .LBB3_7: # %cond.store5 1587; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,3,3,3] 1588; SSE2-NEXT: movd %xmm0, 12(%rdi) 1589; SSE2-NEXT: retq 1590; 1591; SSE4-LABEL: truncstore_v4i64_v4i32: 1592; SSE4: # %bb.0: 1593; SSE4-NEXT: movdqa %xmm0, %xmm3 1594; SSE4-NEXT: pxor %xmm4, %xmm4 1595; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] 1596; SSE4-NEXT: movdqa %xmm5, %xmm0 1597; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 1598; SSE4-NEXT: movdqa %xmm5, %xmm6 1599; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 1600; SSE4-NEXT: movdqa %xmm5, %xmm0 1601; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1602; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm5 1603; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968] 1604; SSE4-NEXT: movapd %xmm5, %xmm0 1605; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1606; SSE4-NEXT: movdqa %xmm1, %xmm3 1607; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm3 1608; SSE4-NEXT: movapd %xmm6, %xmm0 1609; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1610; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 1611; SSE4-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] 1612; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 1613; SSE4-NEXT: movmskps %xmm4, %eax 1614; SSE4-NEXT: xorl $15, %eax 1615; SSE4-NEXT: testb $1, %al 1616; SSE4-NEXT: jne .LBB3_1 1617; SSE4-NEXT: # %bb.2: # %else 1618; SSE4-NEXT: testb $2, %al 1619; SSE4-NEXT: jne .LBB3_3 1620; SSE4-NEXT: .LBB3_4: # %else2 1621; SSE4-NEXT: testb $4, %al 1622; SSE4-NEXT: jne .LBB3_5 1623; SSE4-NEXT: .LBB3_6: # %else4 1624; SSE4-NEXT: testb $8, %al 1625; SSE4-NEXT: jne .LBB3_7 1626; SSE4-NEXT: .LBB3_8: # %else6 1627; SSE4-NEXT: retq 1628; SSE4-NEXT: .LBB3_1: # %cond.store 1629; SSE4-NEXT: movss %xmm1, (%rdi) 1630; SSE4-NEXT: testb $2, %al 1631; SSE4-NEXT: je .LBB3_4 1632; SSE4-NEXT: .LBB3_3: # %cond.store1 1633; SSE4-NEXT: extractps $1, %xmm1, 4(%rdi) 1634; SSE4-NEXT: testb $4, %al 1635; SSE4-NEXT: je .LBB3_6 1636; SSE4-NEXT: .LBB3_5: # %cond.store3 1637; SSE4-NEXT: extractps $2, %xmm1, 8(%rdi) 1638; SSE4-NEXT: testb $8, %al 1639; SSE4-NEXT: je .LBB3_8 1640; SSE4-NEXT: .LBB3_7: # %cond.store5 1641; SSE4-NEXT: extractps $3, %xmm1, 12(%rdi) 1642; SSE4-NEXT: retq 1643; 1644; AVX1-LABEL: truncstore_v4i64_v4i32: 1645; AVX1: # %bb.0: 1646; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1647; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1648; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1649; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 1650; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 1651; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [2147483647,2147483647] 1652; AVX1-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm4 1653; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm5 1654; AVX1-NEXT: vblendvpd %xmm5, %xmm0, %xmm3, %xmm0 1655; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744071562067968,18446744071562067968] 1656; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm6 1657; AVX1-NEXT: vblendvpd %xmm4, %xmm2, %xmm3, %xmm2 1658; AVX1-NEXT: vpcmpgtq %xmm5, %xmm2, %xmm3 1659; AVX1-NEXT: vblendvpd %xmm3, %xmm2, %xmm5, %xmm2 1660; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm5, %xmm0 1661; AVX1-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1662; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi) 1663; AVX1-NEXT: vzeroupper 1664; AVX1-NEXT: retq 1665; 1666; AVX2-LABEL: truncstore_v4i64_v4i32: 1667; AVX2: # %bb.0: 1668; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1669; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1670; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 1671; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 1672; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [2147483647,2147483647,2147483647,2147483647] 1673; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 1674; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1675; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744071562067968,18446744071562067968,18446744071562067968,18446744071562067968] 1676; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3 1677; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 1678; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 1679; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] 1680; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi) 1681; AVX2-NEXT: vzeroupper 1682; AVX2-NEXT: retq 1683; 1684; AVX512F-LABEL: truncstore_v4i64_v4i32: 1685; AVX512F: # %bb.0: 1686; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1687; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1688; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1689; AVX512F-NEXT: kshiftlw $12, %k0, %k0 1690; AVX512F-NEXT: kshiftrw $12, %k0, %k1 1691; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0 1692; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1693; AVX512F-NEXT: vzeroupper 1694; AVX512F-NEXT: retq 1695; 1696; AVX512VL-LABEL: truncstore_v4i64_v4i32: 1697; AVX512VL: # %bb.0: 1698; AVX512VL-NEXT: vptestmd %xmm1, %xmm1, %k1 1699; AVX512VL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 1700; AVX512VL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 1701; AVX512VL-NEXT: vpmovqd %ymm0, (%rdi) {%k1} 1702; AVX512VL-NEXT: vzeroupper 1703; AVX512VL-NEXT: retq 1704; 1705; AVX512BW-LABEL: truncstore_v4i64_v4i32: 1706; AVX512BW: # %bb.0: 1707; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1708; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1709; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 1710; AVX512BW-NEXT: kshiftlw $12, %k0, %k0 1711; AVX512BW-NEXT: kshiftrw $12, %k0, %k1 1712; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0 1713; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 1714; AVX512BW-NEXT: vzeroupper 1715; AVX512BW-NEXT: retq 1716 %a = icmp ne <4 x i32> %mask, zeroinitializer 1717 %b = icmp slt <4 x i64> %x, <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 1718 %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 2147483647, i64 2147483647, i64 2147483647, i64 2147483647> 1719 %d = icmp sgt <4 x i64> %c, <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 1720 %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -2147483648, i64 -2147483648, i64 -2147483648, i64 -2147483648> 1721 %f = trunc <4 x i64> %e to <4 x i32> 1722 call void @llvm.masked.store.v4i32.p0v4i32(<4 x i32> %f, <4 x i32>* %p, i32 1, <4 x i1> %a) 1723 ret void 1724} 1725 1726define void @truncstore_v4i64_v4i16(<4 x i64> %x, <4 x i16>* %p, <4 x i32> %mask) { 1727; SSE2-LABEL: truncstore_v4i64_v4i16: 1728; SSE2: # %bb.0: 1729; SSE2-NEXT: pxor %xmm9, %xmm9 1730; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767] 1731; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] 1732; SSE2-NEXT: movdqa %xmm0, %xmm5 1733; SSE2-NEXT: pxor %xmm4, %xmm5 1734; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147516415,2147516415] 1735; SSE2-NEXT: movdqa %xmm10, %xmm7 1736; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 1737; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 1738; SSE2-NEXT: pcmpeqd %xmm10, %xmm5 1739; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3] 1740; SSE2-NEXT: pand %xmm3, %xmm6 1741; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 1742; SSE2-NEXT: por %xmm6, %xmm5 1743; SSE2-NEXT: pand %xmm5, %xmm0 1744; SSE2-NEXT: pandn %xmm8, %xmm5 1745; SSE2-NEXT: por %xmm0, %xmm5 1746; SSE2-NEXT: movdqa %xmm1, %xmm0 1747; SSE2-NEXT: pxor %xmm4, %xmm0 1748; SSE2-NEXT: movdqa %xmm10, %xmm3 1749; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 1750; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 1751; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 1752; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1753; SSE2-NEXT: pand %xmm6, %xmm0 1754; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 1755; SSE2-NEXT: por %xmm0, %xmm3 1756; SSE2-NEXT: pand %xmm3, %xmm1 1757; SSE2-NEXT: pandn %xmm8, %xmm3 1758; SSE2-NEXT: por %xmm1, %xmm3 1759; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848] 1760; SSE2-NEXT: movdqa %xmm3, %xmm0 1761; SSE2-NEXT: pxor %xmm4, %xmm0 1762; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200] 1763; SSE2-NEXT: movdqa %xmm0, %xmm7 1764; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 1765; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] 1766; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 1767; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1768; SSE2-NEXT: pand %xmm1, %xmm0 1769; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] 1770; SSE2-NEXT: por %xmm0, %xmm1 1771; SSE2-NEXT: pand %xmm1, %xmm3 1772; SSE2-NEXT: pandn %xmm8, %xmm1 1773; SSE2-NEXT: por %xmm3, %xmm1 1774; SSE2-NEXT: pxor %xmm5, %xmm4 1775; SSE2-NEXT: movdqa %xmm4, %xmm0 1776; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 1777; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] 1778; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 1779; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 1780; SSE2-NEXT: pand %xmm3, %xmm4 1781; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 1782; SSE2-NEXT: por %xmm4, %xmm0 1783; SSE2-NEXT: pand %xmm0, %xmm5 1784; SSE2-NEXT: pandn %xmm8, %xmm0 1785; SSE2-NEXT: por %xmm5, %xmm0 1786; SSE2-NEXT: packssdw %xmm1, %xmm0 1787; SSE2-NEXT: packssdw %xmm0, %xmm0 1788; SSE2-NEXT: pcmpeqd %xmm2, %xmm9 1789; SSE2-NEXT: movmskps %xmm9, %eax 1790; SSE2-NEXT: xorl $15, %eax 1791; SSE2-NEXT: testb $1, %al 1792; SSE2-NEXT: jne .LBB4_1 1793; SSE2-NEXT: # %bb.2: # %else 1794; SSE2-NEXT: testb $2, %al 1795; SSE2-NEXT: jne .LBB4_3 1796; SSE2-NEXT: .LBB4_4: # %else2 1797; SSE2-NEXT: testb $4, %al 1798; SSE2-NEXT: jne .LBB4_5 1799; SSE2-NEXT: .LBB4_6: # %else4 1800; SSE2-NEXT: testb $8, %al 1801; SSE2-NEXT: jne .LBB4_7 1802; SSE2-NEXT: .LBB4_8: # %else6 1803; SSE2-NEXT: retq 1804; SSE2-NEXT: .LBB4_1: # %cond.store 1805; SSE2-NEXT: movd %xmm0, %ecx 1806; SSE2-NEXT: movw %cx, (%rdi) 1807; SSE2-NEXT: testb $2, %al 1808; SSE2-NEXT: je .LBB4_4 1809; SSE2-NEXT: .LBB4_3: # %cond.store1 1810; SSE2-NEXT: pextrw $1, %xmm0, %ecx 1811; SSE2-NEXT: movw %cx, 2(%rdi) 1812; SSE2-NEXT: testb $4, %al 1813; SSE2-NEXT: je .LBB4_6 1814; SSE2-NEXT: .LBB4_5: # %cond.store3 1815; SSE2-NEXT: pextrw $2, %xmm0, %ecx 1816; SSE2-NEXT: movw %cx, 4(%rdi) 1817; SSE2-NEXT: testb $8, %al 1818; SSE2-NEXT: je .LBB4_8 1819; SSE2-NEXT: .LBB4_7: # %cond.store5 1820; SSE2-NEXT: pextrw $3, %xmm0, %eax 1821; SSE2-NEXT: movw %ax, 6(%rdi) 1822; SSE2-NEXT: retq 1823; 1824; SSE4-LABEL: truncstore_v4i64_v4i16: 1825; SSE4: # %bb.0: 1826; SSE4-NEXT: movdqa %xmm0, %xmm3 1827; SSE4-NEXT: pxor %xmm4, %xmm4 1828; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [32767,32767] 1829; SSE4-NEXT: movdqa %xmm5, %xmm0 1830; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 1831; SSE4-NEXT: movdqa %xmm5, %xmm6 1832; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 1833; SSE4-NEXT: movdqa %xmm5, %xmm0 1834; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1835; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm5 1836; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] 1837; SSE4-NEXT: movapd %xmm5, %xmm0 1838; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1839; SSE4-NEXT: movdqa %xmm1, %xmm3 1840; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm3 1841; SSE4-NEXT: movapd %xmm6, %xmm0 1842; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 1843; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 1844; SSE4-NEXT: packssdw %xmm3, %xmm1 1845; SSE4-NEXT: packssdw %xmm1, %xmm1 1846; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 1847; SSE4-NEXT: movmskps %xmm4, %eax 1848; SSE4-NEXT: xorl $15, %eax 1849; SSE4-NEXT: testb $1, %al 1850; SSE4-NEXT: jne .LBB4_1 1851; SSE4-NEXT: # %bb.2: # %else 1852; SSE4-NEXT: testb $2, %al 1853; SSE4-NEXT: jne .LBB4_3 1854; SSE4-NEXT: .LBB4_4: # %else2 1855; SSE4-NEXT: testb $4, %al 1856; SSE4-NEXT: jne .LBB4_5 1857; SSE4-NEXT: .LBB4_6: # %else4 1858; SSE4-NEXT: testb $8, %al 1859; SSE4-NEXT: jne .LBB4_7 1860; SSE4-NEXT: .LBB4_8: # %else6 1861; SSE4-NEXT: retq 1862; SSE4-NEXT: .LBB4_1: # %cond.store 1863; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) 1864; SSE4-NEXT: testb $2, %al 1865; SSE4-NEXT: je .LBB4_4 1866; SSE4-NEXT: .LBB4_3: # %cond.store1 1867; SSE4-NEXT: pextrw $1, %xmm1, 2(%rdi) 1868; SSE4-NEXT: testb $4, %al 1869; SSE4-NEXT: je .LBB4_6 1870; SSE4-NEXT: .LBB4_5: # %cond.store3 1871; SSE4-NEXT: pextrw $2, %xmm1, 4(%rdi) 1872; SSE4-NEXT: testb $8, %al 1873; SSE4-NEXT: je .LBB4_8 1874; SSE4-NEXT: .LBB4_7: # %cond.store5 1875; SSE4-NEXT: pextrw $3, %xmm1, 6(%rdi) 1876; SSE4-NEXT: retq 1877; 1878; AVX1-LABEL: truncstore_v4i64_v4i16: 1879; AVX1: # %bb.0: 1880; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 1881; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 1882; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [32767,32767] 1883; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5 1884; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm6 1885; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm4, %xmm0 1886; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [18446744073709518848,18446744073709518848] 1887; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm7 1888; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3 1889; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm4 1890; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3 1891; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm6, %xmm0 1892; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 1893; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 1894; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1895; AVX1-NEXT: vmovmskps %xmm1, %eax 1896; AVX1-NEXT: xorl $15, %eax 1897; AVX1-NEXT: testb $1, %al 1898; AVX1-NEXT: jne .LBB4_1 1899; AVX1-NEXT: # %bb.2: # %else 1900; AVX1-NEXT: testb $2, %al 1901; AVX1-NEXT: jne .LBB4_3 1902; AVX1-NEXT: .LBB4_4: # %else2 1903; AVX1-NEXT: testb $4, %al 1904; AVX1-NEXT: jne .LBB4_5 1905; AVX1-NEXT: .LBB4_6: # %else4 1906; AVX1-NEXT: testb $8, %al 1907; AVX1-NEXT: jne .LBB4_7 1908; AVX1-NEXT: .LBB4_8: # %else6 1909; AVX1-NEXT: vzeroupper 1910; AVX1-NEXT: retq 1911; AVX1-NEXT: .LBB4_1: # %cond.store 1912; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 1913; AVX1-NEXT: testb $2, %al 1914; AVX1-NEXT: je .LBB4_4 1915; AVX1-NEXT: .LBB4_3: # %cond.store1 1916; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1917; AVX1-NEXT: testb $4, %al 1918; AVX1-NEXT: je .LBB4_6 1919; AVX1-NEXT: .LBB4_5: # %cond.store3 1920; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 1921; AVX1-NEXT: testb $8, %al 1922; AVX1-NEXT: je .LBB4_8 1923; AVX1-NEXT: .LBB4_7: # %cond.store5 1924; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 1925; AVX1-NEXT: vzeroupper 1926; AVX1-NEXT: retq 1927; 1928; AVX2-LABEL: truncstore_v4i64_v4i16: 1929; AVX2: # %bb.0: 1930; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 1931; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [32767,32767,32767,32767] 1932; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 1933; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 1934; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] 1935; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 1936; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 1937; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 1938; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 1939; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 1940; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 1941; AVX2-NEXT: vmovmskps %xmm1, %eax 1942; AVX2-NEXT: xorl $15, %eax 1943; AVX2-NEXT: testb $1, %al 1944; AVX2-NEXT: jne .LBB4_1 1945; AVX2-NEXT: # %bb.2: # %else 1946; AVX2-NEXT: testb $2, %al 1947; AVX2-NEXT: jne .LBB4_3 1948; AVX2-NEXT: .LBB4_4: # %else2 1949; AVX2-NEXT: testb $4, %al 1950; AVX2-NEXT: jne .LBB4_5 1951; AVX2-NEXT: .LBB4_6: # %else4 1952; AVX2-NEXT: testb $8, %al 1953; AVX2-NEXT: jne .LBB4_7 1954; AVX2-NEXT: .LBB4_8: # %else6 1955; AVX2-NEXT: vzeroupper 1956; AVX2-NEXT: retq 1957; AVX2-NEXT: .LBB4_1: # %cond.store 1958; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 1959; AVX2-NEXT: testb $2, %al 1960; AVX2-NEXT: je .LBB4_4 1961; AVX2-NEXT: .LBB4_3: # %cond.store1 1962; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 1963; AVX2-NEXT: testb $4, %al 1964; AVX2-NEXT: je .LBB4_6 1965; AVX2-NEXT: .LBB4_5: # %cond.store3 1966; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 1967; AVX2-NEXT: testb $8, %al 1968; AVX2-NEXT: je .LBB4_8 1969; AVX2-NEXT: .LBB4_7: # %cond.store5 1970; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 1971; AVX2-NEXT: vzeroupper 1972; AVX2-NEXT: retq 1973; 1974; AVX512F-LABEL: truncstore_v4i64_v4i16: 1975; AVX512F: # %bb.0: 1976; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 1977; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 1978; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 1979; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0 1980; AVX512F-NEXT: kmovw %k0, %eax 1981; AVX512F-NEXT: testb $1, %al 1982; AVX512F-NEXT: jne .LBB4_1 1983; AVX512F-NEXT: # %bb.2: # %else 1984; AVX512F-NEXT: testb $2, %al 1985; AVX512F-NEXT: jne .LBB4_3 1986; AVX512F-NEXT: .LBB4_4: # %else2 1987; AVX512F-NEXT: testb $4, %al 1988; AVX512F-NEXT: jne .LBB4_5 1989; AVX512F-NEXT: .LBB4_6: # %else4 1990; AVX512F-NEXT: testb $8, %al 1991; AVX512F-NEXT: jne .LBB4_7 1992; AVX512F-NEXT: .LBB4_8: # %else6 1993; AVX512F-NEXT: vzeroupper 1994; AVX512F-NEXT: retq 1995; AVX512F-NEXT: .LBB4_1: # %cond.store 1996; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 1997; AVX512F-NEXT: testb $2, %al 1998; AVX512F-NEXT: je .LBB4_4 1999; AVX512F-NEXT: .LBB4_3: # %cond.store1 2000; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2001; AVX512F-NEXT: testb $4, %al 2002; AVX512F-NEXT: je .LBB4_6 2003; AVX512F-NEXT: .LBB4_5: # %cond.store3 2004; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 2005; AVX512F-NEXT: testb $8, %al 2006; AVX512F-NEXT: je .LBB4_8 2007; AVX512F-NEXT: .LBB4_7: # %cond.store5 2008; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 2009; AVX512F-NEXT: vzeroupper 2010; AVX512F-NEXT: retq 2011; 2012; AVX512BW-LABEL: truncstore_v4i64_v4i16: 2013; AVX512BW: # %bb.0: 2014; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2015; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2016; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 2017; AVX512BW-NEXT: kshiftld $28, %k0, %k0 2018; AVX512BW-NEXT: kshiftrd $28, %k0, %k1 2019; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0 2020; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 2021; AVX512BW-NEXT: vzeroupper 2022; AVX512BW-NEXT: retq 2023; 2024; AVX512BWVL-LABEL: truncstore_v4i64_v4i16: 2025; AVX512BWVL: # %bb.0: 2026; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 2027; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 2028; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 2029; AVX512BWVL-NEXT: vpmovqw %ymm0, (%rdi) {%k1} 2030; AVX512BWVL-NEXT: vzeroupper 2031; AVX512BWVL-NEXT: retq 2032 %a = icmp ne <4 x i32> %mask, zeroinitializer 2033 %b = icmp slt <4 x i64> %x, <i64 32767, i64 32767, i64 32767, i64 32767> 2034 %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 32767, i64 32767, i64 32767, i64 32767> 2035 %d = icmp sgt <4 x i64> %c, <i64 -32768, i64 -32768, i64 -32768, i64 -32768> 2036 %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -32768, i64 -32768, i64 -32768, i64 -32768> 2037 %f = trunc <4 x i64> %e to <4 x i16> 2038 call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %f, <4 x i16>* %p, i32 1, <4 x i1> %a) 2039 ret void 2040} 2041 2042define void @truncstore_v4i64_v4i8(<4 x i64> %x, <4 x i8>* %p, <4 x i32> %mask) { 2043; SSE2-LABEL: truncstore_v4i64_v4i8: 2044; SSE2: # %bb.0: 2045; SSE2-NEXT: pxor %xmm9, %xmm9 2046; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127] 2047; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] 2048; SSE2-NEXT: movdqa %xmm1, %xmm5 2049; SSE2-NEXT: pxor %xmm4, %xmm5 2050; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775] 2051; SSE2-NEXT: movdqa %xmm10, %xmm7 2052; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 2053; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] 2054; SSE2-NEXT: pcmpeqd %xmm10, %xmm5 2055; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[1,1,3,3] 2056; SSE2-NEXT: pand %xmm3, %xmm6 2057; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] 2058; SSE2-NEXT: por %xmm6, %xmm5 2059; SSE2-NEXT: pand %xmm5, %xmm1 2060; SSE2-NEXT: pandn %xmm8, %xmm5 2061; SSE2-NEXT: por %xmm1, %xmm5 2062; SSE2-NEXT: movdqa %xmm0, %xmm1 2063; SSE2-NEXT: pxor %xmm4, %xmm1 2064; SSE2-NEXT: movdqa %xmm10, %xmm3 2065; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 2066; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] 2067; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 2068; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2069; SSE2-NEXT: pand %xmm6, %xmm1 2070; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] 2071; SSE2-NEXT: por %xmm1, %xmm3 2072; SSE2-NEXT: pand %xmm3, %xmm0 2073; SSE2-NEXT: pandn %xmm8, %xmm3 2074; SSE2-NEXT: por %xmm0, %xmm3 2075; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488] 2076; SSE2-NEXT: movdqa %xmm3, %xmm0 2077; SSE2-NEXT: pxor %xmm4, %xmm0 2078; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562067840,18446744071562067840] 2079; SSE2-NEXT: movdqa %xmm0, %xmm7 2080; SSE2-NEXT: pcmpgtd %xmm10, %xmm7 2081; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] 2082; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 2083; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] 2084; SSE2-NEXT: pand %xmm1, %xmm6 2085; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] 2086; SSE2-NEXT: por %xmm6, %xmm0 2087; SSE2-NEXT: pand %xmm0, %xmm3 2088; SSE2-NEXT: pandn %xmm8, %xmm0 2089; SSE2-NEXT: por %xmm3, %xmm0 2090; SSE2-NEXT: pxor %xmm5, %xmm4 2091; SSE2-NEXT: movdqa %xmm4, %xmm1 2092; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 2093; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[0,0,2,2] 2094; SSE2-NEXT: pcmpeqd %xmm10, %xmm4 2095; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2096; SSE2-NEXT: pand %xmm3, %xmm4 2097; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 2098; SSE2-NEXT: por %xmm4, %xmm1 2099; SSE2-NEXT: pand %xmm1, %xmm5 2100; SSE2-NEXT: pandn %xmm8, %xmm1 2101; SSE2-NEXT: por %xmm5, %xmm1 2102; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,0,0,0,255,0,0,0] 2103; SSE2-NEXT: pand %xmm3, %xmm1 2104; SSE2-NEXT: pand %xmm3, %xmm0 2105; SSE2-NEXT: packuswb %xmm1, %xmm0 2106; SSE2-NEXT: packuswb %xmm0, %xmm0 2107; SSE2-NEXT: packuswb %xmm0, %xmm0 2108; SSE2-NEXT: pcmpeqd %xmm2, %xmm9 2109; SSE2-NEXT: movmskps %xmm9, %ecx 2110; SSE2-NEXT: xorl $15, %ecx 2111; SSE2-NEXT: testb $1, %cl 2112; SSE2-NEXT: movd %xmm0, %eax 2113; SSE2-NEXT: jne .LBB5_1 2114; SSE2-NEXT: # %bb.2: # %else 2115; SSE2-NEXT: testb $2, %cl 2116; SSE2-NEXT: jne .LBB5_3 2117; SSE2-NEXT: .LBB5_4: # %else2 2118; SSE2-NEXT: testb $4, %cl 2119; SSE2-NEXT: jne .LBB5_5 2120; SSE2-NEXT: .LBB5_6: # %else4 2121; SSE2-NEXT: testb $8, %cl 2122; SSE2-NEXT: jne .LBB5_7 2123; SSE2-NEXT: .LBB5_8: # %else6 2124; SSE2-NEXT: retq 2125; SSE2-NEXT: .LBB5_1: # %cond.store 2126; SSE2-NEXT: movb %al, (%rdi) 2127; SSE2-NEXT: testb $2, %cl 2128; SSE2-NEXT: je .LBB5_4 2129; SSE2-NEXT: .LBB5_3: # %cond.store1 2130; SSE2-NEXT: movb %ah, 1(%rdi) 2131; SSE2-NEXT: testb $4, %cl 2132; SSE2-NEXT: je .LBB5_6 2133; SSE2-NEXT: .LBB5_5: # %cond.store3 2134; SSE2-NEXT: movl %eax, %edx 2135; SSE2-NEXT: shrl $16, %edx 2136; SSE2-NEXT: movb %dl, 2(%rdi) 2137; SSE2-NEXT: testb $8, %cl 2138; SSE2-NEXT: je .LBB5_8 2139; SSE2-NEXT: .LBB5_7: # %cond.store5 2140; SSE2-NEXT: shrl $24, %eax 2141; SSE2-NEXT: movb %al, 3(%rdi) 2142; SSE2-NEXT: retq 2143; 2144; SSE4-LABEL: truncstore_v4i64_v4i8: 2145; SSE4: # %bb.0: 2146; SSE4-NEXT: movdqa %xmm0, %xmm3 2147; SSE4-NEXT: pxor %xmm4, %xmm4 2148; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [127,127] 2149; SSE4-NEXT: movdqa %xmm5, %xmm0 2150; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 2151; SSE4-NEXT: movdqa %xmm5, %xmm6 2152; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm6 2153; SSE4-NEXT: movdqa %xmm5, %xmm0 2154; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 2155; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 2156; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488] 2157; SSE4-NEXT: movapd %xmm5, %xmm0 2158; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 2159; SSE4-NEXT: movdqa %xmm3, %xmm1 2160; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm1 2161; SSE4-NEXT: movapd %xmm6, %xmm0 2162; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 2163; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm3 2164; SSE4-NEXT: movdqa {{.*#+}} xmm0 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 2165; SSE4-NEXT: pshufb %xmm0, %xmm3 2166; SSE4-NEXT: pshufb %xmm0, %xmm1 2167; SSE4-NEXT: punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm3[0],xmm1[1],xmm3[1],xmm1[2],xmm3[2],xmm1[3],xmm3[3] 2168; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 2169; SSE4-NEXT: movmskps %xmm4, %eax 2170; SSE4-NEXT: xorl $15, %eax 2171; SSE4-NEXT: testb $1, %al 2172; SSE4-NEXT: jne .LBB5_1 2173; SSE4-NEXT: # %bb.2: # %else 2174; SSE4-NEXT: testb $2, %al 2175; SSE4-NEXT: jne .LBB5_3 2176; SSE4-NEXT: .LBB5_4: # %else2 2177; SSE4-NEXT: testb $4, %al 2178; SSE4-NEXT: jne .LBB5_5 2179; SSE4-NEXT: .LBB5_6: # %else4 2180; SSE4-NEXT: testb $8, %al 2181; SSE4-NEXT: jne .LBB5_7 2182; SSE4-NEXT: .LBB5_8: # %else6 2183; SSE4-NEXT: retq 2184; SSE4-NEXT: .LBB5_1: # %cond.store 2185; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) 2186; SSE4-NEXT: testb $2, %al 2187; SSE4-NEXT: je .LBB5_4 2188; SSE4-NEXT: .LBB5_3: # %cond.store1 2189; SSE4-NEXT: pextrb $1, %xmm1, 1(%rdi) 2190; SSE4-NEXT: testb $4, %al 2191; SSE4-NEXT: je .LBB5_6 2192; SSE4-NEXT: .LBB5_5: # %cond.store3 2193; SSE4-NEXT: pextrb $2, %xmm1, 2(%rdi) 2194; SSE4-NEXT: testb $8, %al 2195; SSE4-NEXT: je .LBB5_8 2196; SSE4-NEXT: .LBB5_7: # %cond.store5 2197; SSE4-NEXT: pextrb $3, %xmm1, 3(%rdi) 2198; SSE4-NEXT: retq 2199; 2200; AVX1-LABEL: truncstore_v4i64_v4i8: 2201; AVX1: # %bb.0: 2202; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 2203; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 2204; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127] 2205; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm5 2206; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm6 2207; AVX1-NEXT: vblendvpd %xmm6, %xmm0, %xmm4, %xmm0 2208; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [18446744073709551488,18446744073709551488] 2209; AVX1-NEXT: vpcmpgtq %xmm6, %xmm0, %xmm7 2210; AVX1-NEXT: vblendvpd %xmm5, %xmm3, %xmm4, %xmm3 2211; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm4 2212; AVX1-NEXT: vblendvpd %xmm4, %xmm3, %xmm6, %xmm3 2213; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 2214; AVX1-NEXT: vpshufb %xmm4, %xmm3, %xmm3 2215; AVX1-NEXT: vblendvpd %xmm7, %xmm0, %xmm6, %xmm0 2216; AVX1-NEXT: vpshufb %xmm4, %xmm0, %xmm0 2217; AVX1-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 2218; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 2219; AVX1-NEXT: vmovmskps %xmm1, %eax 2220; AVX1-NEXT: xorl $15, %eax 2221; AVX1-NEXT: testb $1, %al 2222; AVX1-NEXT: jne .LBB5_1 2223; AVX1-NEXT: # %bb.2: # %else 2224; AVX1-NEXT: testb $2, %al 2225; AVX1-NEXT: jne .LBB5_3 2226; AVX1-NEXT: .LBB5_4: # %else2 2227; AVX1-NEXT: testb $4, %al 2228; AVX1-NEXT: jne .LBB5_5 2229; AVX1-NEXT: .LBB5_6: # %else4 2230; AVX1-NEXT: testb $8, %al 2231; AVX1-NEXT: jne .LBB5_7 2232; AVX1-NEXT: .LBB5_8: # %else6 2233; AVX1-NEXT: vzeroupper 2234; AVX1-NEXT: retq 2235; AVX1-NEXT: .LBB5_1: # %cond.store 2236; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 2237; AVX1-NEXT: testb $2, %al 2238; AVX1-NEXT: je .LBB5_4 2239; AVX1-NEXT: .LBB5_3: # %cond.store1 2240; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2241; AVX1-NEXT: testb $4, %al 2242; AVX1-NEXT: je .LBB5_6 2243; AVX1-NEXT: .LBB5_5: # %cond.store3 2244; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 2245; AVX1-NEXT: testb $8, %al 2246; AVX1-NEXT: je .LBB5_8 2247; AVX1-NEXT: .LBB5_7: # %cond.store5 2248; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 2249; AVX1-NEXT: vzeroupper 2250; AVX1-NEXT: retq 2251; 2252; AVX2-LABEL: truncstore_v4i64_v4i8: 2253; AVX2: # %bb.0: 2254; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 2255; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [127,127,127,127] 2256; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 2257; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 2258; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] 2259; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 2260; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 2261; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 2262; AVX2-NEXT: vmovdqa {{.*#+}} xmm4 = <0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u> 2263; AVX2-NEXT: vpshufb %xmm4, %xmm3, %xmm3 2264; AVX2-NEXT: vpshufb %xmm4, %xmm0, %xmm0 2265; AVX2-NEXT: vpunpcklwd {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1],xmm0[2],xmm3[2],xmm0[3],xmm3[3] 2266; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 2267; AVX2-NEXT: vmovmskps %xmm1, %eax 2268; AVX2-NEXT: xorl $15, %eax 2269; AVX2-NEXT: testb $1, %al 2270; AVX2-NEXT: jne .LBB5_1 2271; AVX2-NEXT: # %bb.2: # %else 2272; AVX2-NEXT: testb $2, %al 2273; AVX2-NEXT: jne .LBB5_3 2274; AVX2-NEXT: .LBB5_4: # %else2 2275; AVX2-NEXT: testb $4, %al 2276; AVX2-NEXT: jne .LBB5_5 2277; AVX2-NEXT: .LBB5_6: # %else4 2278; AVX2-NEXT: testb $8, %al 2279; AVX2-NEXT: jne .LBB5_7 2280; AVX2-NEXT: .LBB5_8: # %else6 2281; AVX2-NEXT: vzeroupper 2282; AVX2-NEXT: retq 2283; AVX2-NEXT: .LBB5_1: # %cond.store 2284; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 2285; AVX2-NEXT: testb $2, %al 2286; AVX2-NEXT: je .LBB5_4 2287; AVX2-NEXT: .LBB5_3: # %cond.store1 2288; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2289; AVX2-NEXT: testb $4, %al 2290; AVX2-NEXT: je .LBB5_6 2291; AVX2-NEXT: .LBB5_5: # %cond.store3 2292; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 2293; AVX2-NEXT: testb $8, %al 2294; AVX2-NEXT: je .LBB5_8 2295; AVX2-NEXT: .LBB5_7: # %cond.store5 2296; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 2297; AVX2-NEXT: vzeroupper 2298; AVX2-NEXT: retq 2299; 2300; AVX512F-LABEL: truncstore_v4i64_v4i8: 2301; AVX512F: # %bb.0: 2302; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2303; AVX512F-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2304; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 2305; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0 2306; AVX512F-NEXT: kmovw %k0, %eax 2307; AVX512F-NEXT: testb $1, %al 2308; AVX512F-NEXT: jne .LBB5_1 2309; AVX512F-NEXT: # %bb.2: # %else 2310; AVX512F-NEXT: testb $2, %al 2311; AVX512F-NEXT: jne .LBB5_3 2312; AVX512F-NEXT: .LBB5_4: # %else2 2313; AVX512F-NEXT: testb $4, %al 2314; AVX512F-NEXT: jne .LBB5_5 2315; AVX512F-NEXT: .LBB5_6: # %else4 2316; AVX512F-NEXT: testb $8, %al 2317; AVX512F-NEXT: jne .LBB5_7 2318; AVX512F-NEXT: .LBB5_8: # %else6 2319; AVX512F-NEXT: vzeroupper 2320; AVX512F-NEXT: retq 2321; AVX512F-NEXT: .LBB5_1: # %cond.store 2322; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 2323; AVX512F-NEXT: testb $2, %al 2324; AVX512F-NEXT: je .LBB5_4 2325; AVX512F-NEXT: .LBB5_3: # %cond.store1 2326; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2327; AVX512F-NEXT: testb $4, %al 2328; AVX512F-NEXT: je .LBB5_6 2329; AVX512F-NEXT: .LBB5_5: # %cond.store3 2330; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 2331; AVX512F-NEXT: testb $8, %al 2332; AVX512F-NEXT: je .LBB5_8 2333; AVX512F-NEXT: .LBB5_7: # %cond.store5 2334; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 2335; AVX512F-NEXT: vzeroupper 2336; AVX512F-NEXT: retq 2337; 2338; AVX512BW-LABEL: truncstore_v4i64_v4i8: 2339; AVX512BW: # %bb.0: 2340; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2341; AVX512BW-NEXT: # kill: def $ymm0 killed $ymm0 def $zmm0 2342; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 2343; AVX512BW-NEXT: kshiftlq $60, %k0, %k0 2344; AVX512BW-NEXT: kshiftrq $60, %k0, %k1 2345; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0 2346; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 2347; AVX512BW-NEXT: vzeroupper 2348; AVX512BW-NEXT: retq 2349; 2350; AVX512BWVL-LABEL: truncstore_v4i64_v4i8: 2351; AVX512BWVL: # %bb.0: 2352; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 2353; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 2354; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %ymm0, %ymm0 2355; AVX512BWVL-NEXT: vpmovqb %ymm0, (%rdi) {%k1} 2356; AVX512BWVL-NEXT: vzeroupper 2357; AVX512BWVL-NEXT: retq 2358 %a = icmp ne <4 x i32> %mask, zeroinitializer 2359 %b = icmp slt <4 x i64> %x, <i64 127, i64 127, i64 127, i64 127> 2360 %c = select <4 x i1> %b, <4 x i64> %x, <4 x i64> <i64 127, i64 127, i64 127, i64 127> 2361 %d = icmp sgt <4 x i64> %c, <i64 -128, i64 -128, i64 -128, i64 -128> 2362 %e = select <4 x i1> %d, <4 x i64> %c, <4 x i64> <i64 -128, i64 -128, i64 -128, i64 -128> 2363 %f = trunc <4 x i64> %e to <4 x i8> 2364 call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %f, <4 x i8>* %p, i32 1, <4 x i1> %a) 2365 ret void 2366} 2367 2368define void @truncstore_v2i64_v2i32(<2 x i64> %x, <2 x i32>* %p, <2 x i64> %mask) { 2369; SSE2-LABEL: truncstore_v2i64_v2i32: 2370; SSE2: # %bb.0: 2371; SSE2-NEXT: pxor %xmm2, %xmm2 2372; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2373; SSE2-NEXT: movdqa %xmm0, %xmm4 2374; SSE2-NEXT: pxor %xmm3, %xmm4 2375; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [4294967295,4294967295] 2376; SSE2-NEXT: movdqa %xmm5, %xmm6 2377; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2378; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2379; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 2380; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2381; SSE2-NEXT: pand %xmm7, %xmm4 2382; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 2383; SSE2-NEXT: por %xmm4, %xmm5 2384; SSE2-NEXT: pand %xmm5, %xmm0 2385; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 2386; SSE2-NEXT: por %xmm0, %xmm5 2387; SSE2-NEXT: pxor %xmm5, %xmm3 2388; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320] 2389; SSE2-NEXT: movdqa %xmm3, %xmm4 2390; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 2391; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2392; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 2393; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2394; SSE2-NEXT: pand %xmm6, %xmm0 2395; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2396; SSE2-NEXT: por %xmm0, %xmm3 2397; SSE2-NEXT: pand %xmm3, %xmm5 2398; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 2399; SSE2-NEXT: por %xmm5, %xmm3 2400; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 2401; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 2402; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] 2403; SSE2-NEXT: pand %xmm2, %xmm1 2404; SSE2-NEXT: movmskpd %xmm1, %eax 2405; SSE2-NEXT: xorl $3, %eax 2406; SSE2-NEXT: testb $1, %al 2407; SSE2-NEXT: jne .LBB6_1 2408; SSE2-NEXT: # %bb.2: # %else 2409; SSE2-NEXT: testb $2, %al 2410; SSE2-NEXT: jne .LBB6_3 2411; SSE2-NEXT: .LBB6_4: # %else2 2412; SSE2-NEXT: retq 2413; SSE2-NEXT: .LBB6_1: # %cond.store 2414; SSE2-NEXT: movd %xmm0, (%rdi) 2415; SSE2-NEXT: testb $2, %al 2416; SSE2-NEXT: je .LBB6_4 2417; SSE2-NEXT: .LBB6_3: # %cond.store1 2418; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,1,1] 2419; SSE2-NEXT: movd %xmm0, 4(%rdi) 2420; SSE2-NEXT: retq 2421; 2422; SSE4-LABEL: truncstore_v2i64_v2i32: 2423; SSE4: # %bb.0: 2424; SSE4-NEXT: movdqa %xmm0, %xmm2 2425; SSE4-NEXT: pxor %xmm3, %xmm3 2426; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647] 2427; SSE4-NEXT: movdqa %xmm4, %xmm0 2428; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2429; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm4 2430; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968] 2431; SSE4-NEXT: movapd %xmm4, %xmm0 2432; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2433; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm2 2434; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2435; SSE4-NEXT: pcmpeqq %xmm1, %xmm3 2436; SSE4-NEXT: movmskpd %xmm3, %eax 2437; SSE4-NEXT: xorl $3, %eax 2438; SSE4-NEXT: testb $1, %al 2439; SSE4-NEXT: jne .LBB6_1 2440; SSE4-NEXT: # %bb.2: # %else 2441; SSE4-NEXT: testb $2, %al 2442; SSE4-NEXT: jne .LBB6_3 2443; SSE4-NEXT: .LBB6_4: # %else2 2444; SSE4-NEXT: retq 2445; SSE4-NEXT: .LBB6_1: # %cond.store 2446; SSE4-NEXT: movd %xmm0, (%rdi) 2447; SSE4-NEXT: testb $2, %al 2448; SSE4-NEXT: je .LBB6_4 2449; SSE4-NEXT: .LBB6_3: # %cond.store1 2450; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) 2451; SSE4-NEXT: retq 2452; 2453; AVX1-LABEL: truncstore_v2i64_v2i32: 2454; AVX1: # %bb.0: 2455; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 2456; AVX1-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 2457; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 2458; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 2459; AVX1-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero 2460; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647] 2461; AVX1-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm3 2462; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 2463; AVX1-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968] 2464; AVX1-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 2465; AVX1-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 2466; AVX1-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 2467; AVX1-NEXT: vmaskmovps %xmm0, %xmm1, (%rdi) 2468; AVX1-NEXT: retq 2469; 2470; AVX2-LABEL: truncstore_v2i64_v2i32: 2471; AVX2: # %bb.0: 2472; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 2473; AVX2-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 2474; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 2475; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 2476; AVX2-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0,2],zero,zero 2477; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [2147483647,2147483647] 2478; AVX2-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm3 2479; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 2480; AVX2-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968] 2481; AVX2-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 2482; AVX2-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 2483; AVX2-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 2484; AVX2-NEXT: vpmaskmovd %xmm0, %xmm1, (%rdi) 2485; AVX2-NEXT: retq 2486; 2487; AVX512F-LABEL: truncstore_v2i64_v2i32: 2488; AVX512F: # %bb.0: 2489; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2490; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2491; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 2492; AVX512F-NEXT: kshiftlw $14, %k0, %k0 2493; AVX512F-NEXT: kshiftrw $14, %k0, %k1 2494; AVX512F-NEXT: vpmovsqd %zmm0, %ymm0 2495; AVX512F-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 2496; AVX512F-NEXT: vzeroupper 2497; AVX512F-NEXT: retq 2498; 2499; AVX512VL-LABEL: truncstore_v2i64_v2i32: 2500; AVX512VL: # %bb.0: 2501; AVX512VL-NEXT: vptestmq %xmm1, %xmm1, %k1 2502; AVX512VL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2503; AVX512VL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2504; AVX512VL-NEXT: vpmovqd %xmm0, (%rdi) {%k1} 2505; AVX512VL-NEXT: retq 2506; 2507; AVX512BW-LABEL: truncstore_v2i64_v2i32: 2508; AVX512BW: # %bb.0: 2509; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2510; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2511; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 2512; AVX512BW-NEXT: kshiftlw $14, %k0, %k0 2513; AVX512BW-NEXT: kshiftrw $14, %k0, %k1 2514; AVX512BW-NEXT: vpmovsqd %zmm0, %ymm0 2515; AVX512BW-NEXT: vmovdqu32 %zmm0, (%rdi) {%k1} 2516; AVX512BW-NEXT: vzeroupper 2517; AVX512BW-NEXT: retq 2518 %a = icmp ne <2 x i64> %mask, zeroinitializer 2519 %b = icmp slt <2 x i64> %x, <i64 2147483647, i64 2147483647> 2520 %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 2147483647, i64 2147483647> 2521 %d = icmp sgt <2 x i64> %c, <i64 -2147483648, i64 -2147483648> 2522 %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -2147483648, i64 -2147483648> 2523 %f = trunc <2 x i64> %e to <2 x i32> 2524 call void @llvm.masked.store.v2i32.p0v2i32(<2 x i32> %f, <2 x i32>* %p, i32 1, <2 x i1> %a) 2525 ret void 2526} 2527 2528define void @truncstore_v2i64_v2i16(<2 x i64> %x, <2 x i16>* %p, <2 x i64> %mask) { 2529; SSE2-LABEL: truncstore_v2i64_v2i16: 2530; SSE2: # %bb.0: 2531; SSE2-NEXT: pxor %xmm2, %xmm2 2532; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2533; SSE2-NEXT: movdqa %xmm0, %xmm4 2534; SSE2-NEXT: pxor %xmm3, %xmm4 2535; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147516415,2147516415] 2536; SSE2-NEXT: movdqa %xmm5, %xmm6 2537; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2538; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2539; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 2540; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2541; SSE2-NEXT: pand %xmm7, %xmm4 2542; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 2543; SSE2-NEXT: por %xmm4, %xmm5 2544; SSE2-NEXT: pand %xmm5, %xmm0 2545; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 2546; SSE2-NEXT: por %xmm0, %xmm5 2547; SSE2-NEXT: pxor %xmm5, %xmm3 2548; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200] 2549; SSE2-NEXT: movdqa %xmm3, %xmm4 2550; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 2551; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2552; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 2553; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2554; SSE2-NEXT: pand %xmm6, %xmm0 2555; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2556; SSE2-NEXT: por %xmm0, %xmm3 2557; SSE2-NEXT: pand %xmm3, %xmm5 2558; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 2559; SSE2-NEXT: por %xmm5, %xmm3 2560; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] 2561; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 2562; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 2563; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] 2564; SSE2-NEXT: pand %xmm2, %xmm1 2565; SSE2-NEXT: movmskpd %xmm1, %eax 2566; SSE2-NEXT: xorl $3, %eax 2567; SSE2-NEXT: testb $1, %al 2568; SSE2-NEXT: jne .LBB7_1 2569; SSE2-NEXT: # %bb.2: # %else 2570; SSE2-NEXT: testb $2, %al 2571; SSE2-NEXT: jne .LBB7_3 2572; SSE2-NEXT: .LBB7_4: # %else2 2573; SSE2-NEXT: retq 2574; SSE2-NEXT: .LBB7_1: # %cond.store 2575; SSE2-NEXT: movd %xmm0, %ecx 2576; SSE2-NEXT: movw %cx, (%rdi) 2577; SSE2-NEXT: testb $2, %al 2578; SSE2-NEXT: je .LBB7_4 2579; SSE2-NEXT: .LBB7_3: # %cond.store1 2580; SSE2-NEXT: pextrw $1, %xmm0, %eax 2581; SSE2-NEXT: movw %ax, 2(%rdi) 2582; SSE2-NEXT: retq 2583; 2584; SSE4-LABEL: truncstore_v2i64_v2i16: 2585; SSE4: # %bb.0: 2586; SSE4-NEXT: movdqa %xmm0, %xmm2 2587; SSE4-NEXT: pxor %xmm3, %xmm3 2588; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [32767,32767] 2589; SSE4-NEXT: movdqa %xmm4, %xmm0 2590; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2591; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm4 2592; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744073709518848,18446744073709518848] 2593; SSE4-NEXT: movapd %xmm4, %xmm0 2594; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2595; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm2 2596; SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] 2597; SSE4-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 2598; SSE4-NEXT: pcmpeqq %xmm1, %xmm3 2599; SSE4-NEXT: movmskpd %xmm3, %eax 2600; SSE4-NEXT: xorl $3, %eax 2601; SSE4-NEXT: testb $1, %al 2602; SSE4-NEXT: jne .LBB7_1 2603; SSE4-NEXT: # %bb.2: # %else 2604; SSE4-NEXT: testb $2, %al 2605; SSE4-NEXT: jne .LBB7_3 2606; SSE4-NEXT: .LBB7_4: # %else2 2607; SSE4-NEXT: retq 2608; SSE4-NEXT: .LBB7_1: # %cond.store 2609; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 2610; SSE4-NEXT: testb $2, %al 2611; SSE4-NEXT: je .LBB7_4 2612; SSE4-NEXT: .LBB7_3: # %cond.store1 2613; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 2614; SSE4-NEXT: retq 2615; 2616; AVX-LABEL: truncstore_v2i64_v2i16: 2617; AVX: # %bb.0: 2618; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 2619; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [32767,32767] 2620; AVX-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm4 2621; AVX-NEXT: vblendvpd %xmm4, %xmm0, %xmm3, %xmm0 2622; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [18446744073709518848,18446744073709518848] 2623; AVX-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm4 2624; AVX-NEXT: vblendvpd %xmm4, %xmm0, %xmm3, %xmm0 2625; AVX-NEXT: vpermilps {{.*#+}} xmm0 = xmm0[0,2,2,3] 2626; AVX-NEXT: vpshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7] 2627; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 2628; AVX-NEXT: vmovmskpd %xmm1, %eax 2629; AVX-NEXT: xorl $3, %eax 2630; AVX-NEXT: testb $1, %al 2631; AVX-NEXT: jne .LBB7_1 2632; AVX-NEXT: # %bb.2: # %else 2633; AVX-NEXT: testb $2, %al 2634; AVX-NEXT: jne .LBB7_3 2635; AVX-NEXT: .LBB7_4: # %else2 2636; AVX-NEXT: retq 2637; AVX-NEXT: .LBB7_1: # %cond.store 2638; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 2639; AVX-NEXT: testb $2, %al 2640; AVX-NEXT: je .LBB7_4 2641; AVX-NEXT: .LBB7_3: # %cond.store1 2642; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2643; AVX-NEXT: retq 2644; 2645; AVX512F-LABEL: truncstore_v2i64_v2i16: 2646; AVX512F: # %bb.0: 2647; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2648; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2649; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 2650; AVX512F-NEXT: vpmovsqw %zmm0, %xmm0 2651; AVX512F-NEXT: kmovw %k0, %eax 2652; AVX512F-NEXT: testb $1, %al 2653; AVX512F-NEXT: jne .LBB7_1 2654; AVX512F-NEXT: # %bb.2: # %else 2655; AVX512F-NEXT: testb $2, %al 2656; AVX512F-NEXT: jne .LBB7_3 2657; AVX512F-NEXT: .LBB7_4: # %else2 2658; AVX512F-NEXT: vzeroupper 2659; AVX512F-NEXT: retq 2660; AVX512F-NEXT: .LBB7_1: # %cond.store 2661; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 2662; AVX512F-NEXT: testb $2, %al 2663; AVX512F-NEXT: je .LBB7_4 2664; AVX512F-NEXT: .LBB7_3: # %cond.store1 2665; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 2666; AVX512F-NEXT: vzeroupper 2667; AVX512F-NEXT: retq 2668; 2669; AVX512BW-LABEL: truncstore_v2i64_v2i16: 2670; AVX512BW: # %bb.0: 2671; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2672; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2673; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 2674; AVX512BW-NEXT: kshiftld $30, %k0, %k0 2675; AVX512BW-NEXT: kshiftrd $30, %k0, %k1 2676; AVX512BW-NEXT: vpmovsqw %zmm0, %xmm0 2677; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 2678; AVX512BW-NEXT: vzeroupper 2679; AVX512BW-NEXT: retq 2680; 2681; AVX512BWVL-LABEL: truncstore_v2i64_v2i16: 2682; AVX512BWVL: # %bb.0: 2683; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1 2684; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2685; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2686; AVX512BWVL-NEXT: vpmovqw %xmm0, (%rdi) {%k1} 2687; AVX512BWVL-NEXT: retq 2688 %a = icmp ne <2 x i64> %mask, zeroinitializer 2689 %b = icmp slt <2 x i64> %x, <i64 32767, i64 32767> 2690 %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 32767, i64 32767> 2691 %d = icmp sgt <2 x i64> %c, <i64 -32768, i64 -32768> 2692 %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -32768, i64 -32768> 2693 %f = trunc <2 x i64> %e to <2 x i16> 2694 call void @llvm.masked.store.v2i16.p0v2i16(<2 x i16> %f, <2 x i16>* %p, i32 1, <2 x i1> %a) 2695 ret void 2696} 2697 2698define void @truncstore_v2i64_v2i8(<2 x i64> %x, <2 x i8>* %p, <2 x i64> %mask) { 2699; SSE2-LABEL: truncstore_v2i64_v2i8: 2700; SSE2: # %bb.0: 2701; SSE2-NEXT: pxor %xmm2, %xmm2 2702; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] 2703; SSE2-NEXT: movdqa %xmm0, %xmm4 2704; SSE2-NEXT: pxor %xmm3, %xmm4 2705; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [2147483775,2147483775] 2706; SSE2-NEXT: movdqa %xmm5, %xmm6 2707; SSE2-NEXT: pcmpgtd %xmm4, %xmm6 2708; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] 2709; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 2710; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] 2711; SSE2-NEXT: pand %xmm7, %xmm4 2712; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,1,3,3] 2713; SSE2-NEXT: por %xmm4, %xmm5 2714; SSE2-NEXT: pand %xmm5, %xmm0 2715; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm5 2716; SSE2-NEXT: por %xmm0, %xmm5 2717; SSE2-NEXT: pxor %xmm5, %xmm3 2718; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840] 2719; SSE2-NEXT: movdqa %xmm3, %xmm4 2720; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 2721; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[0,0,2,2] 2722; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 2723; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] 2724; SSE2-NEXT: pand %xmm6, %xmm0 2725; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] 2726; SSE2-NEXT: por %xmm0, %xmm3 2727; SSE2-NEXT: pand %xmm3, %xmm5 2728; SSE2-NEXT: pandn {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 2729; SSE2-NEXT: por %xmm5, %xmm3 2730; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 2731; SSE2-NEXT: packuswb %xmm3, %xmm3 2732; SSE2-NEXT: packuswb %xmm3, %xmm3 2733; SSE2-NEXT: packuswb %xmm3, %xmm3 2734; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 2735; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] 2736; SSE2-NEXT: pand %xmm2, %xmm0 2737; SSE2-NEXT: movmskpd %xmm0, %eax 2738; SSE2-NEXT: xorl $3, %eax 2739; SSE2-NEXT: testb $1, %al 2740; SSE2-NEXT: movd %xmm3, %ecx 2741; SSE2-NEXT: jne .LBB8_1 2742; SSE2-NEXT: # %bb.2: # %else 2743; SSE2-NEXT: testb $2, %al 2744; SSE2-NEXT: jne .LBB8_3 2745; SSE2-NEXT: .LBB8_4: # %else2 2746; SSE2-NEXT: retq 2747; SSE2-NEXT: .LBB8_1: # %cond.store 2748; SSE2-NEXT: movb %cl, (%rdi) 2749; SSE2-NEXT: testb $2, %al 2750; SSE2-NEXT: je .LBB8_4 2751; SSE2-NEXT: .LBB8_3: # %cond.store1 2752; SSE2-NEXT: movb %ch, 1(%rdi) 2753; SSE2-NEXT: retq 2754; 2755; SSE4-LABEL: truncstore_v2i64_v2i8: 2756; SSE4: # %bb.0: 2757; SSE4-NEXT: movdqa %xmm0, %xmm2 2758; SSE4-NEXT: pxor %xmm3, %xmm3 2759; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [127,127] 2760; SSE4-NEXT: movdqa %xmm4, %xmm0 2761; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2762; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm4 2763; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488] 2764; SSE4-NEXT: movapd %xmm4, %xmm0 2765; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 2766; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm2 2767; SSE4-NEXT: pshufb {{.*#+}} xmm2 = xmm2[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2768; SSE4-NEXT: pcmpeqq %xmm1, %xmm3 2769; SSE4-NEXT: movmskpd %xmm3, %eax 2770; SSE4-NEXT: xorl $3, %eax 2771; SSE4-NEXT: testb $1, %al 2772; SSE4-NEXT: jne .LBB8_1 2773; SSE4-NEXT: # %bb.2: # %else 2774; SSE4-NEXT: testb $2, %al 2775; SSE4-NEXT: jne .LBB8_3 2776; SSE4-NEXT: .LBB8_4: # %else2 2777; SSE4-NEXT: retq 2778; SSE4-NEXT: .LBB8_1: # %cond.store 2779; SSE4-NEXT: pextrb $0, %xmm2, (%rdi) 2780; SSE4-NEXT: testb $2, %al 2781; SSE4-NEXT: je .LBB8_4 2782; SSE4-NEXT: .LBB8_3: # %cond.store1 2783; SSE4-NEXT: pextrb $1, %xmm2, 1(%rdi) 2784; SSE4-NEXT: retq 2785; 2786; AVX-LABEL: truncstore_v2i64_v2i8: 2787; AVX: # %bb.0: 2788; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 2789; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [127,127] 2790; AVX-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm4 2791; AVX-NEXT: vblendvpd %xmm4, %xmm0, %xmm3, %xmm0 2792; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [18446744073709551488,18446744073709551488] 2793; AVX-NEXT: vpcmpgtq %xmm3, %xmm0, %xmm4 2794; AVX-NEXT: vblendvpd %xmm4, %xmm0, %xmm3, %xmm0 2795; AVX-NEXT: vpshufb {{.*#+}} xmm0 = xmm0[0,8,u,u,u,u,u,u,u,u,u,u,u,u,u,u] 2796; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 2797; AVX-NEXT: vmovmskpd %xmm1, %eax 2798; AVX-NEXT: xorl $3, %eax 2799; AVX-NEXT: testb $1, %al 2800; AVX-NEXT: jne .LBB8_1 2801; AVX-NEXT: # %bb.2: # %else 2802; AVX-NEXT: testb $2, %al 2803; AVX-NEXT: jne .LBB8_3 2804; AVX-NEXT: .LBB8_4: # %else2 2805; AVX-NEXT: retq 2806; AVX-NEXT: .LBB8_1: # %cond.store 2807; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) 2808; AVX-NEXT: testb $2, %al 2809; AVX-NEXT: je .LBB8_4 2810; AVX-NEXT: .LBB8_3: # %cond.store1 2811; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2812; AVX-NEXT: retq 2813; 2814; AVX512F-LABEL: truncstore_v2i64_v2i8: 2815; AVX512F: # %bb.0: 2816; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2817; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2818; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 2819; AVX512F-NEXT: vpmovsqb %zmm0, %xmm0 2820; AVX512F-NEXT: kmovw %k0, %eax 2821; AVX512F-NEXT: testb $1, %al 2822; AVX512F-NEXT: jne .LBB8_1 2823; AVX512F-NEXT: # %bb.2: # %else 2824; AVX512F-NEXT: testb $2, %al 2825; AVX512F-NEXT: jne .LBB8_3 2826; AVX512F-NEXT: .LBB8_4: # %else2 2827; AVX512F-NEXT: vzeroupper 2828; AVX512F-NEXT: retq 2829; AVX512F-NEXT: .LBB8_1: # %cond.store 2830; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 2831; AVX512F-NEXT: testb $2, %al 2832; AVX512F-NEXT: je .LBB8_4 2833; AVX512F-NEXT: .LBB8_3: # %cond.store1 2834; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 2835; AVX512F-NEXT: vzeroupper 2836; AVX512F-NEXT: retq 2837; 2838; AVX512BW-LABEL: truncstore_v2i64_v2i8: 2839; AVX512BW: # %bb.0: 2840; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 2841; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 2842; AVX512BW-NEXT: vptestmq %zmm1, %zmm1, %k0 2843; AVX512BW-NEXT: kshiftlq $62, %k0, %k0 2844; AVX512BW-NEXT: kshiftrq $62, %k0, %k1 2845; AVX512BW-NEXT: vpmovsqb %zmm0, %xmm0 2846; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 2847; AVX512BW-NEXT: vzeroupper 2848; AVX512BW-NEXT: retq 2849; 2850; AVX512BWVL-LABEL: truncstore_v2i64_v2i8: 2851; AVX512BWVL: # %bb.0: 2852; AVX512BWVL-NEXT: vptestmq %xmm1, %xmm1, %k1 2853; AVX512BWVL-NEXT: vpminsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2854; AVX512BWVL-NEXT: vpmaxsq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 2855; AVX512BWVL-NEXT: vpmovqb %xmm0, (%rdi) {%k1} 2856; AVX512BWVL-NEXT: retq 2857 %a = icmp ne <2 x i64> %mask, zeroinitializer 2858 %b = icmp slt <2 x i64> %x, <i64 127, i64 127> 2859 %c = select <2 x i1> %b, <2 x i64> %x, <2 x i64> <i64 127, i64 127> 2860 %d = icmp sgt <2 x i64> %c, <i64 -128, i64 -128> 2861 %e = select <2 x i1> %d, <2 x i64> %c, <2 x i64> <i64 -128, i64 -128> 2862 %f = trunc <2 x i64> %e to <2 x i8> 2863 call void @llvm.masked.store.v2i8.p0v2i8(<2 x i8> %f, <2 x i8>* %p, i32 1, <2 x i1> %a) 2864 ret void 2865} 2866 2867define void @truncstore_v16i32_v16i16(<16 x i32> %x, <16 x i16>* %p, <16 x i32> %mask) { 2868; SSE2-LABEL: truncstore_v16i32_v16i16: 2869; SSE2: # %bb.0: 2870; SSE2-NEXT: pxor %xmm8, %xmm8 2871; SSE2-NEXT: packssdw %xmm1, %xmm0 2872; SSE2-NEXT: pcmpeqd %xmm8, %xmm7 2873; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 2874; SSE2-NEXT: pxor %xmm1, %xmm7 2875; SSE2-NEXT: pcmpeqd %xmm8, %xmm6 2876; SSE2-NEXT: pxor %xmm1, %xmm6 2877; SSE2-NEXT: packssdw %xmm7, %xmm6 2878; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 2879; SSE2-NEXT: pxor %xmm1, %xmm5 2880; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 2881; SSE2-NEXT: pxor %xmm1, %xmm4 2882; SSE2-NEXT: packssdw %xmm5, %xmm4 2883; SSE2-NEXT: packsswb %xmm6, %xmm4 2884; SSE2-NEXT: pmovmskb %xmm4, %eax 2885; SSE2-NEXT: testb $1, %al 2886; SSE2-NEXT: jne .LBB9_1 2887; SSE2-NEXT: # %bb.2: # %else 2888; SSE2-NEXT: testb $2, %al 2889; SSE2-NEXT: jne .LBB9_3 2890; SSE2-NEXT: .LBB9_4: # %else2 2891; SSE2-NEXT: testb $4, %al 2892; SSE2-NEXT: jne .LBB9_5 2893; SSE2-NEXT: .LBB9_6: # %else4 2894; SSE2-NEXT: testb $8, %al 2895; SSE2-NEXT: jne .LBB9_7 2896; SSE2-NEXT: .LBB9_8: # %else6 2897; SSE2-NEXT: testb $16, %al 2898; SSE2-NEXT: jne .LBB9_9 2899; SSE2-NEXT: .LBB9_10: # %else8 2900; SSE2-NEXT: testb $32, %al 2901; SSE2-NEXT: jne .LBB9_11 2902; SSE2-NEXT: .LBB9_12: # %else10 2903; SSE2-NEXT: testb $64, %al 2904; SSE2-NEXT: jne .LBB9_13 2905; SSE2-NEXT: .LBB9_14: # %else12 2906; SSE2-NEXT: testb $-128, %al 2907; SSE2-NEXT: je .LBB9_16 2908; SSE2-NEXT: .LBB9_15: # %cond.store13 2909; SSE2-NEXT: pextrw $7, %xmm0, %ecx 2910; SSE2-NEXT: movw %cx, 14(%rdi) 2911; SSE2-NEXT: .LBB9_16: # %else14 2912; SSE2-NEXT: packssdw %xmm3, %xmm2 2913; SSE2-NEXT: testl $256, %eax # imm = 0x100 2914; SSE2-NEXT: jne .LBB9_17 2915; SSE2-NEXT: # %bb.18: # %else16 2916; SSE2-NEXT: testl $512, %eax # imm = 0x200 2917; SSE2-NEXT: jne .LBB9_19 2918; SSE2-NEXT: .LBB9_20: # %else18 2919; SSE2-NEXT: testl $1024, %eax # imm = 0x400 2920; SSE2-NEXT: jne .LBB9_21 2921; SSE2-NEXT: .LBB9_22: # %else20 2922; SSE2-NEXT: testl $2048, %eax # imm = 0x800 2923; SSE2-NEXT: jne .LBB9_23 2924; SSE2-NEXT: .LBB9_24: # %else22 2925; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 2926; SSE2-NEXT: jne .LBB9_25 2927; SSE2-NEXT: .LBB9_26: # %else24 2928; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 2929; SSE2-NEXT: jne .LBB9_27 2930; SSE2-NEXT: .LBB9_28: # %else26 2931; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 2932; SSE2-NEXT: jne .LBB9_29 2933; SSE2-NEXT: .LBB9_30: # %else28 2934; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 2935; SSE2-NEXT: jne .LBB9_31 2936; SSE2-NEXT: .LBB9_32: # %else30 2937; SSE2-NEXT: retq 2938; SSE2-NEXT: .LBB9_1: # %cond.store 2939; SSE2-NEXT: movd %xmm0, %ecx 2940; SSE2-NEXT: movw %cx, (%rdi) 2941; SSE2-NEXT: testb $2, %al 2942; SSE2-NEXT: je .LBB9_4 2943; SSE2-NEXT: .LBB9_3: # %cond.store1 2944; SSE2-NEXT: pextrw $1, %xmm0, %ecx 2945; SSE2-NEXT: movw %cx, 2(%rdi) 2946; SSE2-NEXT: testb $4, %al 2947; SSE2-NEXT: je .LBB9_6 2948; SSE2-NEXT: .LBB9_5: # %cond.store3 2949; SSE2-NEXT: pextrw $2, %xmm0, %ecx 2950; SSE2-NEXT: movw %cx, 4(%rdi) 2951; SSE2-NEXT: testb $8, %al 2952; SSE2-NEXT: je .LBB9_8 2953; SSE2-NEXT: .LBB9_7: # %cond.store5 2954; SSE2-NEXT: pextrw $3, %xmm0, %ecx 2955; SSE2-NEXT: movw %cx, 6(%rdi) 2956; SSE2-NEXT: testb $16, %al 2957; SSE2-NEXT: je .LBB9_10 2958; SSE2-NEXT: .LBB9_9: # %cond.store7 2959; SSE2-NEXT: pextrw $4, %xmm0, %ecx 2960; SSE2-NEXT: movw %cx, 8(%rdi) 2961; SSE2-NEXT: testb $32, %al 2962; SSE2-NEXT: je .LBB9_12 2963; SSE2-NEXT: .LBB9_11: # %cond.store9 2964; SSE2-NEXT: pextrw $5, %xmm0, %ecx 2965; SSE2-NEXT: movw %cx, 10(%rdi) 2966; SSE2-NEXT: testb $64, %al 2967; SSE2-NEXT: je .LBB9_14 2968; SSE2-NEXT: .LBB9_13: # %cond.store11 2969; SSE2-NEXT: pextrw $6, %xmm0, %ecx 2970; SSE2-NEXT: movw %cx, 12(%rdi) 2971; SSE2-NEXT: testb $-128, %al 2972; SSE2-NEXT: jne .LBB9_15 2973; SSE2-NEXT: jmp .LBB9_16 2974; SSE2-NEXT: .LBB9_17: # %cond.store15 2975; SSE2-NEXT: movd %xmm2, %ecx 2976; SSE2-NEXT: movw %cx, 16(%rdi) 2977; SSE2-NEXT: testl $512, %eax # imm = 0x200 2978; SSE2-NEXT: je .LBB9_20 2979; SSE2-NEXT: .LBB9_19: # %cond.store17 2980; SSE2-NEXT: pextrw $1, %xmm2, %ecx 2981; SSE2-NEXT: movw %cx, 18(%rdi) 2982; SSE2-NEXT: testl $1024, %eax # imm = 0x400 2983; SSE2-NEXT: je .LBB9_22 2984; SSE2-NEXT: .LBB9_21: # %cond.store19 2985; SSE2-NEXT: pextrw $2, %xmm2, %ecx 2986; SSE2-NEXT: movw %cx, 20(%rdi) 2987; SSE2-NEXT: testl $2048, %eax # imm = 0x800 2988; SSE2-NEXT: je .LBB9_24 2989; SSE2-NEXT: .LBB9_23: # %cond.store21 2990; SSE2-NEXT: pextrw $3, %xmm2, %ecx 2991; SSE2-NEXT: movw %cx, 22(%rdi) 2992; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 2993; SSE2-NEXT: je .LBB9_26 2994; SSE2-NEXT: .LBB9_25: # %cond.store23 2995; SSE2-NEXT: pextrw $4, %xmm2, %ecx 2996; SSE2-NEXT: movw %cx, 24(%rdi) 2997; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 2998; SSE2-NEXT: je .LBB9_28 2999; SSE2-NEXT: .LBB9_27: # %cond.store25 3000; SSE2-NEXT: pextrw $5, %xmm2, %ecx 3001; SSE2-NEXT: movw %cx, 26(%rdi) 3002; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 3003; SSE2-NEXT: je .LBB9_30 3004; SSE2-NEXT: .LBB9_29: # %cond.store27 3005; SSE2-NEXT: pextrw $6, %xmm2, %ecx 3006; SSE2-NEXT: movw %cx, 28(%rdi) 3007; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 3008; SSE2-NEXT: je .LBB9_32 3009; SSE2-NEXT: .LBB9_31: # %cond.store29 3010; SSE2-NEXT: pextrw $7, %xmm2, %eax 3011; SSE2-NEXT: movw %ax, 30(%rdi) 3012; SSE2-NEXT: retq 3013; 3014; SSE4-LABEL: truncstore_v16i32_v16i16: 3015; SSE4: # %bb.0: 3016; SSE4-NEXT: pxor %xmm8, %xmm8 3017; SSE4-NEXT: packssdw %xmm1, %xmm0 3018; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 3019; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 3020; SSE4-NEXT: pxor %xmm1, %xmm7 3021; SSE4-NEXT: pcmpeqd %xmm8, %xmm6 3022; SSE4-NEXT: pxor %xmm1, %xmm6 3023; SSE4-NEXT: packssdw %xmm7, %xmm6 3024; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 3025; SSE4-NEXT: pxor %xmm1, %xmm5 3026; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 3027; SSE4-NEXT: pxor %xmm1, %xmm4 3028; SSE4-NEXT: packssdw %xmm5, %xmm4 3029; SSE4-NEXT: packsswb %xmm6, %xmm4 3030; SSE4-NEXT: pmovmskb %xmm4, %eax 3031; SSE4-NEXT: testb $1, %al 3032; SSE4-NEXT: jne .LBB9_1 3033; SSE4-NEXT: # %bb.2: # %else 3034; SSE4-NEXT: testb $2, %al 3035; SSE4-NEXT: jne .LBB9_3 3036; SSE4-NEXT: .LBB9_4: # %else2 3037; SSE4-NEXT: testb $4, %al 3038; SSE4-NEXT: jne .LBB9_5 3039; SSE4-NEXT: .LBB9_6: # %else4 3040; SSE4-NEXT: testb $8, %al 3041; SSE4-NEXT: jne .LBB9_7 3042; SSE4-NEXT: .LBB9_8: # %else6 3043; SSE4-NEXT: testb $16, %al 3044; SSE4-NEXT: jne .LBB9_9 3045; SSE4-NEXT: .LBB9_10: # %else8 3046; SSE4-NEXT: testb $32, %al 3047; SSE4-NEXT: jne .LBB9_11 3048; SSE4-NEXT: .LBB9_12: # %else10 3049; SSE4-NEXT: testb $64, %al 3050; SSE4-NEXT: jne .LBB9_13 3051; SSE4-NEXT: .LBB9_14: # %else12 3052; SSE4-NEXT: testb $-128, %al 3053; SSE4-NEXT: je .LBB9_16 3054; SSE4-NEXT: .LBB9_15: # %cond.store13 3055; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) 3056; SSE4-NEXT: .LBB9_16: # %else14 3057; SSE4-NEXT: packssdw %xmm3, %xmm2 3058; SSE4-NEXT: testl $256, %eax # imm = 0x100 3059; SSE4-NEXT: jne .LBB9_17 3060; SSE4-NEXT: # %bb.18: # %else16 3061; SSE4-NEXT: testl $512, %eax # imm = 0x200 3062; SSE4-NEXT: jne .LBB9_19 3063; SSE4-NEXT: .LBB9_20: # %else18 3064; SSE4-NEXT: testl $1024, %eax # imm = 0x400 3065; SSE4-NEXT: jne .LBB9_21 3066; SSE4-NEXT: .LBB9_22: # %else20 3067; SSE4-NEXT: testl $2048, %eax # imm = 0x800 3068; SSE4-NEXT: jne .LBB9_23 3069; SSE4-NEXT: .LBB9_24: # %else22 3070; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 3071; SSE4-NEXT: jne .LBB9_25 3072; SSE4-NEXT: .LBB9_26: # %else24 3073; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 3074; SSE4-NEXT: jne .LBB9_27 3075; SSE4-NEXT: .LBB9_28: # %else26 3076; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 3077; SSE4-NEXT: jne .LBB9_29 3078; SSE4-NEXT: .LBB9_30: # %else28 3079; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 3080; SSE4-NEXT: jne .LBB9_31 3081; SSE4-NEXT: .LBB9_32: # %else30 3082; SSE4-NEXT: retq 3083; SSE4-NEXT: .LBB9_1: # %cond.store 3084; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 3085; SSE4-NEXT: testb $2, %al 3086; SSE4-NEXT: je .LBB9_4 3087; SSE4-NEXT: .LBB9_3: # %cond.store1 3088; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 3089; SSE4-NEXT: testb $4, %al 3090; SSE4-NEXT: je .LBB9_6 3091; SSE4-NEXT: .LBB9_5: # %cond.store3 3092; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 3093; SSE4-NEXT: testb $8, %al 3094; SSE4-NEXT: je .LBB9_8 3095; SSE4-NEXT: .LBB9_7: # %cond.store5 3096; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 3097; SSE4-NEXT: testb $16, %al 3098; SSE4-NEXT: je .LBB9_10 3099; SSE4-NEXT: .LBB9_9: # %cond.store7 3100; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) 3101; SSE4-NEXT: testb $32, %al 3102; SSE4-NEXT: je .LBB9_12 3103; SSE4-NEXT: .LBB9_11: # %cond.store9 3104; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) 3105; SSE4-NEXT: testb $64, %al 3106; SSE4-NEXT: je .LBB9_14 3107; SSE4-NEXT: .LBB9_13: # %cond.store11 3108; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) 3109; SSE4-NEXT: testb $-128, %al 3110; SSE4-NEXT: jne .LBB9_15 3111; SSE4-NEXT: jmp .LBB9_16 3112; SSE4-NEXT: .LBB9_17: # %cond.store15 3113; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi) 3114; SSE4-NEXT: testl $512, %eax # imm = 0x200 3115; SSE4-NEXT: je .LBB9_20 3116; SSE4-NEXT: .LBB9_19: # %cond.store17 3117; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi) 3118; SSE4-NEXT: testl $1024, %eax # imm = 0x400 3119; SSE4-NEXT: je .LBB9_22 3120; SSE4-NEXT: .LBB9_21: # %cond.store19 3121; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi) 3122; SSE4-NEXT: testl $2048, %eax # imm = 0x800 3123; SSE4-NEXT: je .LBB9_24 3124; SSE4-NEXT: .LBB9_23: # %cond.store21 3125; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi) 3126; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 3127; SSE4-NEXT: je .LBB9_26 3128; SSE4-NEXT: .LBB9_25: # %cond.store23 3129; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi) 3130; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 3131; SSE4-NEXT: je .LBB9_28 3132; SSE4-NEXT: .LBB9_27: # %cond.store25 3133; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi) 3134; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 3135; SSE4-NEXT: je .LBB9_30 3136; SSE4-NEXT: .LBB9_29: # %cond.store27 3137; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi) 3138; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 3139; SSE4-NEXT: je .LBB9_32 3140; SSE4-NEXT: .LBB9_31: # %cond.store29 3141; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi) 3142; SSE4-NEXT: retq 3143; 3144; AVX1-LABEL: truncstore_v16i32_v16i16: 3145; AVX1: # %bb.0: 3146; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 3147; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 3148; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 3149; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0 3150; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 3151; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 3152; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 3153; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1 3154; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 3155; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 3156; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 3157; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 3158; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1 3159; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 3160; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 3161; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 3162; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 3163; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 3164; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 3165; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1 3166; AVX1-NEXT: vpmovmskb %xmm1, %eax 3167; AVX1-NEXT: testb $1, %al 3168; AVX1-NEXT: jne .LBB9_1 3169; AVX1-NEXT: # %bb.2: # %else 3170; AVX1-NEXT: testb $2, %al 3171; AVX1-NEXT: jne .LBB9_3 3172; AVX1-NEXT: .LBB9_4: # %else2 3173; AVX1-NEXT: testb $4, %al 3174; AVX1-NEXT: jne .LBB9_5 3175; AVX1-NEXT: .LBB9_6: # %else4 3176; AVX1-NEXT: testb $8, %al 3177; AVX1-NEXT: jne .LBB9_7 3178; AVX1-NEXT: .LBB9_8: # %else6 3179; AVX1-NEXT: testb $16, %al 3180; AVX1-NEXT: jne .LBB9_9 3181; AVX1-NEXT: .LBB9_10: # %else8 3182; AVX1-NEXT: testb $32, %al 3183; AVX1-NEXT: jne .LBB9_11 3184; AVX1-NEXT: .LBB9_12: # %else10 3185; AVX1-NEXT: testb $64, %al 3186; AVX1-NEXT: jne .LBB9_13 3187; AVX1-NEXT: .LBB9_14: # %else12 3188; AVX1-NEXT: testb $-128, %al 3189; AVX1-NEXT: je .LBB9_16 3190; AVX1-NEXT: .LBB9_15: # %cond.store13 3191; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3192; AVX1-NEXT: .LBB9_16: # %else14 3193; AVX1-NEXT: testl $256, %eax # imm = 0x100 3194; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 3195; AVX1-NEXT: jne .LBB9_17 3196; AVX1-NEXT: # %bb.18: # %else16 3197; AVX1-NEXT: testl $512, %eax # imm = 0x200 3198; AVX1-NEXT: jne .LBB9_19 3199; AVX1-NEXT: .LBB9_20: # %else18 3200; AVX1-NEXT: testl $1024, %eax # imm = 0x400 3201; AVX1-NEXT: jne .LBB9_21 3202; AVX1-NEXT: .LBB9_22: # %else20 3203; AVX1-NEXT: testl $2048, %eax # imm = 0x800 3204; AVX1-NEXT: jne .LBB9_23 3205; AVX1-NEXT: .LBB9_24: # %else22 3206; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 3207; AVX1-NEXT: jne .LBB9_25 3208; AVX1-NEXT: .LBB9_26: # %else24 3209; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 3210; AVX1-NEXT: jne .LBB9_27 3211; AVX1-NEXT: .LBB9_28: # %else26 3212; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 3213; AVX1-NEXT: jne .LBB9_29 3214; AVX1-NEXT: .LBB9_30: # %else28 3215; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 3216; AVX1-NEXT: jne .LBB9_31 3217; AVX1-NEXT: .LBB9_32: # %else30 3218; AVX1-NEXT: vzeroupper 3219; AVX1-NEXT: retq 3220; AVX1-NEXT: .LBB9_1: # %cond.store 3221; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 3222; AVX1-NEXT: testb $2, %al 3223; AVX1-NEXT: je .LBB9_4 3224; AVX1-NEXT: .LBB9_3: # %cond.store1 3225; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3226; AVX1-NEXT: testb $4, %al 3227; AVX1-NEXT: je .LBB9_6 3228; AVX1-NEXT: .LBB9_5: # %cond.store3 3229; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3230; AVX1-NEXT: testb $8, %al 3231; AVX1-NEXT: je .LBB9_8 3232; AVX1-NEXT: .LBB9_7: # %cond.store5 3233; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3234; AVX1-NEXT: testb $16, %al 3235; AVX1-NEXT: je .LBB9_10 3236; AVX1-NEXT: .LBB9_9: # %cond.store7 3237; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3238; AVX1-NEXT: testb $32, %al 3239; AVX1-NEXT: je .LBB9_12 3240; AVX1-NEXT: .LBB9_11: # %cond.store9 3241; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3242; AVX1-NEXT: testb $64, %al 3243; AVX1-NEXT: je .LBB9_14 3244; AVX1-NEXT: .LBB9_13: # %cond.store11 3245; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3246; AVX1-NEXT: testb $-128, %al 3247; AVX1-NEXT: jne .LBB9_15 3248; AVX1-NEXT: jmp .LBB9_16 3249; AVX1-NEXT: .LBB9_17: # %cond.store15 3250; AVX1-NEXT: vpextrw $0, %xmm0, 16(%rdi) 3251; AVX1-NEXT: testl $512, %eax # imm = 0x200 3252; AVX1-NEXT: je .LBB9_20 3253; AVX1-NEXT: .LBB9_19: # %cond.store17 3254; AVX1-NEXT: vpextrw $1, %xmm0, 18(%rdi) 3255; AVX1-NEXT: testl $1024, %eax # imm = 0x400 3256; AVX1-NEXT: je .LBB9_22 3257; AVX1-NEXT: .LBB9_21: # %cond.store19 3258; AVX1-NEXT: vpextrw $2, %xmm0, 20(%rdi) 3259; AVX1-NEXT: testl $2048, %eax # imm = 0x800 3260; AVX1-NEXT: je .LBB9_24 3261; AVX1-NEXT: .LBB9_23: # %cond.store21 3262; AVX1-NEXT: vpextrw $3, %xmm0, 22(%rdi) 3263; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 3264; AVX1-NEXT: je .LBB9_26 3265; AVX1-NEXT: .LBB9_25: # %cond.store23 3266; AVX1-NEXT: vpextrw $4, %xmm0, 24(%rdi) 3267; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 3268; AVX1-NEXT: je .LBB9_28 3269; AVX1-NEXT: .LBB9_27: # %cond.store25 3270; AVX1-NEXT: vpextrw $5, %xmm0, 26(%rdi) 3271; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 3272; AVX1-NEXT: je .LBB9_30 3273; AVX1-NEXT: .LBB9_29: # %cond.store27 3274; AVX1-NEXT: vpextrw $6, %xmm0, 28(%rdi) 3275; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 3276; AVX1-NEXT: je .LBB9_32 3277; AVX1-NEXT: .LBB9_31: # %cond.store29 3278; AVX1-NEXT: vpextrw $7, %xmm0, 30(%rdi) 3279; AVX1-NEXT: vzeroupper 3280; AVX1-NEXT: retq 3281; 3282; AVX2-LABEL: truncstore_v16i32_v16i16: 3283; AVX2: # %bb.0: 3284; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 3285; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 3286; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 3287; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1 3288; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 3289; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 3290; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 3291; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 3292; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1 3293; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 3294; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1 3295; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 3296; AVX2-NEXT: vpmovmskb %xmm1, %eax 3297; AVX2-NEXT: testb $1, %al 3298; AVX2-NEXT: jne .LBB9_1 3299; AVX2-NEXT: # %bb.2: # %else 3300; AVX2-NEXT: testb $2, %al 3301; AVX2-NEXT: jne .LBB9_3 3302; AVX2-NEXT: .LBB9_4: # %else2 3303; AVX2-NEXT: testb $4, %al 3304; AVX2-NEXT: jne .LBB9_5 3305; AVX2-NEXT: .LBB9_6: # %else4 3306; AVX2-NEXT: testb $8, %al 3307; AVX2-NEXT: jne .LBB9_7 3308; AVX2-NEXT: .LBB9_8: # %else6 3309; AVX2-NEXT: testb $16, %al 3310; AVX2-NEXT: jne .LBB9_9 3311; AVX2-NEXT: .LBB9_10: # %else8 3312; AVX2-NEXT: testb $32, %al 3313; AVX2-NEXT: jne .LBB9_11 3314; AVX2-NEXT: .LBB9_12: # %else10 3315; AVX2-NEXT: testb $64, %al 3316; AVX2-NEXT: jne .LBB9_13 3317; AVX2-NEXT: .LBB9_14: # %else12 3318; AVX2-NEXT: testb $-128, %al 3319; AVX2-NEXT: je .LBB9_16 3320; AVX2-NEXT: .LBB9_15: # %cond.store13 3321; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3322; AVX2-NEXT: .LBB9_16: # %else14 3323; AVX2-NEXT: testl $256, %eax # imm = 0x100 3324; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 3325; AVX2-NEXT: jne .LBB9_17 3326; AVX2-NEXT: # %bb.18: # %else16 3327; AVX2-NEXT: testl $512, %eax # imm = 0x200 3328; AVX2-NEXT: jne .LBB9_19 3329; AVX2-NEXT: .LBB9_20: # %else18 3330; AVX2-NEXT: testl $1024, %eax # imm = 0x400 3331; AVX2-NEXT: jne .LBB9_21 3332; AVX2-NEXT: .LBB9_22: # %else20 3333; AVX2-NEXT: testl $2048, %eax # imm = 0x800 3334; AVX2-NEXT: jne .LBB9_23 3335; AVX2-NEXT: .LBB9_24: # %else22 3336; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 3337; AVX2-NEXT: jne .LBB9_25 3338; AVX2-NEXT: .LBB9_26: # %else24 3339; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 3340; AVX2-NEXT: jne .LBB9_27 3341; AVX2-NEXT: .LBB9_28: # %else26 3342; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 3343; AVX2-NEXT: jne .LBB9_29 3344; AVX2-NEXT: .LBB9_30: # %else28 3345; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 3346; AVX2-NEXT: jne .LBB9_31 3347; AVX2-NEXT: .LBB9_32: # %else30 3348; AVX2-NEXT: vzeroupper 3349; AVX2-NEXT: retq 3350; AVX2-NEXT: .LBB9_1: # %cond.store 3351; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 3352; AVX2-NEXT: testb $2, %al 3353; AVX2-NEXT: je .LBB9_4 3354; AVX2-NEXT: .LBB9_3: # %cond.store1 3355; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3356; AVX2-NEXT: testb $4, %al 3357; AVX2-NEXT: je .LBB9_6 3358; AVX2-NEXT: .LBB9_5: # %cond.store3 3359; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3360; AVX2-NEXT: testb $8, %al 3361; AVX2-NEXT: je .LBB9_8 3362; AVX2-NEXT: .LBB9_7: # %cond.store5 3363; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3364; AVX2-NEXT: testb $16, %al 3365; AVX2-NEXT: je .LBB9_10 3366; AVX2-NEXT: .LBB9_9: # %cond.store7 3367; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3368; AVX2-NEXT: testb $32, %al 3369; AVX2-NEXT: je .LBB9_12 3370; AVX2-NEXT: .LBB9_11: # %cond.store9 3371; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3372; AVX2-NEXT: testb $64, %al 3373; AVX2-NEXT: je .LBB9_14 3374; AVX2-NEXT: .LBB9_13: # %cond.store11 3375; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3376; AVX2-NEXT: testb $-128, %al 3377; AVX2-NEXT: jne .LBB9_15 3378; AVX2-NEXT: jmp .LBB9_16 3379; AVX2-NEXT: .LBB9_17: # %cond.store15 3380; AVX2-NEXT: vpextrw $0, %xmm0, 16(%rdi) 3381; AVX2-NEXT: testl $512, %eax # imm = 0x200 3382; AVX2-NEXT: je .LBB9_20 3383; AVX2-NEXT: .LBB9_19: # %cond.store17 3384; AVX2-NEXT: vpextrw $1, %xmm0, 18(%rdi) 3385; AVX2-NEXT: testl $1024, %eax # imm = 0x400 3386; AVX2-NEXT: je .LBB9_22 3387; AVX2-NEXT: .LBB9_21: # %cond.store19 3388; AVX2-NEXT: vpextrw $2, %xmm0, 20(%rdi) 3389; AVX2-NEXT: testl $2048, %eax # imm = 0x800 3390; AVX2-NEXT: je .LBB9_24 3391; AVX2-NEXT: .LBB9_23: # %cond.store21 3392; AVX2-NEXT: vpextrw $3, %xmm0, 22(%rdi) 3393; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 3394; AVX2-NEXT: je .LBB9_26 3395; AVX2-NEXT: .LBB9_25: # %cond.store23 3396; AVX2-NEXT: vpextrw $4, %xmm0, 24(%rdi) 3397; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 3398; AVX2-NEXT: je .LBB9_28 3399; AVX2-NEXT: .LBB9_27: # %cond.store25 3400; AVX2-NEXT: vpextrw $5, %xmm0, 26(%rdi) 3401; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 3402; AVX2-NEXT: je .LBB9_30 3403; AVX2-NEXT: .LBB9_29: # %cond.store27 3404; AVX2-NEXT: vpextrw $6, %xmm0, 28(%rdi) 3405; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 3406; AVX2-NEXT: je .LBB9_32 3407; AVX2-NEXT: .LBB9_31: # %cond.store29 3408; AVX2-NEXT: vpextrw $7, %xmm0, 30(%rdi) 3409; AVX2-NEXT: vzeroupper 3410; AVX2-NEXT: retq 3411; 3412; AVX512F-LABEL: truncstore_v16i32_v16i16: 3413; AVX512F: # %bb.0: 3414; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 3415; AVX512F-NEXT: vpmovsdw %zmm0, %ymm0 3416; AVX512F-NEXT: kmovw %k0, %eax 3417; AVX512F-NEXT: testb $1, %al 3418; AVX512F-NEXT: jne .LBB9_1 3419; AVX512F-NEXT: # %bb.2: # %else 3420; AVX512F-NEXT: testb $2, %al 3421; AVX512F-NEXT: jne .LBB9_3 3422; AVX512F-NEXT: .LBB9_4: # %else2 3423; AVX512F-NEXT: testb $4, %al 3424; AVX512F-NEXT: jne .LBB9_5 3425; AVX512F-NEXT: .LBB9_6: # %else4 3426; AVX512F-NEXT: testb $8, %al 3427; AVX512F-NEXT: jne .LBB9_7 3428; AVX512F-NEXT: .LBB9_8: # %else6 3429; AVX512F-NEXT: testb $16, %al 3430; AVX512F-NEXT: jne .LBB9_9 3431; AVX512F-NEXT: .LBB9_10: # %else8 3432; AVX512F-NEXT: testb $32, %al 3433; AVX512F-NEXT: jne .LBB9_11 3434; AVX512F-NEXT: .LBB9_12: # %else10 3435; AVX512F-NEXT: testb $64, %al 3436; AVX512F-NEXT: jne .LBB9_13 3437; AVX512F-NEXT: .LBB9_14: # %else12 3438; AVX512F-NEXT: testb $-128, %al 3439; AVX512F-NEXT: je .LBB9_16 3440; AVX512F-NEXT: .LBB9_15: # %cond.store13 3441; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 3442; AVX512F-NEXT: .LBB9_16: # %else14 3443; AVX512F-NEXT: testl $256, %eax # imm = 0x100 3444; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 3445; AVX512F-NEXT: jne .LBB9_17 3446; AVX512F-NEXT: # %bb.18: # %else16 3447; AVX512F-NEXT: testl $512, %eax # imm = 0x200 3448; AVX512F-NEXT: jne .LBB9_19 3449; AVX512F-NEXT: .LBB9_20: # %else18 3450; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 3451; AVX512F-NEXT: jne .LBB9_21 3452; AVX512F-NEXT: .LBB9_22: # %else20 3453; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 3454; AVX512F-NEXT: jne .LBB9_23 3455; AVX512F-NEXT: .LBB9_24: # %else22 3456; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 3457; AVX512F-NEXT: jne .LBB9_25 3458; AVX512F-NEXT: .LBB9_26: # %else24 3459; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 3460; AVX512F-NEXT: jne .LBB9_27 3461; AVX512F-NEXT: .LBB9_28: # %else26 3462; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 3463; AVX512F-NEXT: jne .LBB9_29 3464; AVX512F-NEXT: .LBB9_30: # %else28 3465; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 3466; AVX512F-NEXT: jne .LBB9_31 3467; AVX512F-NEXT: .LBB9_32: # %else30 3468; AVX512F-NEXT: vzeroupper 3469; AVX512F-NEXT: retq 3470; AVX512F-NEXT: .LBB9_1: # %cond.store 3471; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 3472; AVX512F-NEXT: testb $2, %al 3473; AVX512F-NEXT: je .LBB9_4 3474; AVX512F-NEXT: .LBB9_3: # %cond.store1 3475; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 3476; AVX512F-NEXT: testb $4, %al 3477; AVX512F-NEXT: je .LBB9_6 3478; AVX512F-NEXT: .LBB9_5: # %cond.store3 3479; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 3480; AVX512F-NEXT: testb $8, %al 3481; AVX512F-NEXT: je .LBB9_8 3482; AVX512F-NEXT: .LBB9_7: # %cond.store5 3483; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 3484; AVX512F-NEXT: testb $16, %al 3485; AVX512F-NEXT: je .LBB9_10 3486; AVX512F-NEXT: .LBB9_9: # %cond.store7 3487; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 3488; AVX512F-NEXT: testb $32, %al 3489; AVX512F-NEXT: je .LBB9_12 3490; AVX512F-NEXT: .LBB9_11: # %cond.store9 3491; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 3492; AVX512F-NEXT: testb $64, %al 3493; AVX512F-NEXT: je .LBB9_14 3494; AVX512F-NEXT: .LBB9_13: # %cond.store11 3495; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 3496; AVX512F-NEXT: testb $-128, %al 3497; AVX512F-NEXT: jne .LBB9_15 3498; AVX512F-NEXT: jmp .LBB9_16 3499; AVX512F-NEXT: .LBB9_17: # %cond.store15 3500; AVX512F-NEXT: vpextrw $0, %xmm0, 16(%rdi) 3501; AVX512F-NEXT: testl $512, %eax # imm = 0x200 3502; AVX512F-NEXT: je .LBB9_20 3503; AVX512F-NEXT: .LBB9_19: # %cond.store17 3504; AVX512F-NEXT: vpextrw $1, %xmm0, 18(%rdi) 3505; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 3506; AVX512F-NEXT: je .LBB9_22 3507; AVX512F-NEXT: .LBB9_21: # %cond.store19 3508; AVX512F-NEXT: vpextrw $2, %xmm0, 20(%rdi) 3509; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 3510; AVX512F-NEXT: je .LBB9_24 3511; AVX512F-NEXT: .LBB9_23: # %cond.store21 3512; AVX512F-NEXT: vpextrw $3, %xmm0, 22(%rdi) 3513; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 3514; AVX512F-NEXT: je .LBB9_26 3515; AVX512F-NEXT: .LBB9_25: # %cond.store23 3516; AVX512F-NEXT: vpextrw $4, %xmm0, 24(%rdi) 3517; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 3518; AVX512F-NEXT: je .LBB9_28 3519; AVX512F-NEXT: .LBB9_27: # %cond.store25 3520; AVX512F-NEXT: vpextrw $5, %xmm0, 26(%rdi) 3521; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 3522; AVX512F-NEXT: je .LBB9_30 3523; AVX512F-NEXT: .LBB9_29: # %cond.store27 3524; AVX512F-NEXT: vpextrw $6, %xmm0, 28(%rdi) 3525; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 3526; AVX512F-NEXT: je .LBB9_32 3527; AVX512F-NEXT: .LBB9_31: # %cond.store29 3528; AVX512F-NEXT: vpextrw $7, %xmm0, 30(%rdi) 3529; AVX512F-NEXT: vzeroupper 3530; AVX512F-NEXT: retq 3531; 3532; AVX512BW-LABEL: truncstore_v16i32_v16i16: 3533; AVX512BW: # %bb.0: 3534; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 3535; AVX512BW-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 3536; AVX512BW-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 3537; AVX512BW-NEXT: vpmovdw %zmm0, (%rdi) {%k1} 3538; AVX512BW-NEXT: vzeroupper 3539; AVX512BW-NEXT: retq 3540; 3541; AVX512BWVL-LABEL: truncstore_v16i32_v16i16: 3542; AVX512BWVL: # %bb.0: 3543; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1 3544; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 3545; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 3546; AVX512BWVL-NEXT: vpmovdw %zmm0, (%rdi) {%k1} 3547; AVX512BWVL-NEXT: vzeroupper 3548; AVX512BWVL-NEXT: retq 3549 %a = icmp ne <16 x i32> %mask, zeroinitializer 3550 %b = icmp slt <16 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767> 3551 %c = select <16 x i1> %b, <16 x i32> %x, <16 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767> 3552 %d = icmp sgt <16 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768> 3553 %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768> 3554 %f = trunc <16 x i32> %e to <16 x i16> 3555 call void @llvm.masked.store.v16i16.p0v16i16(<16 x i16> %f, <16 x i16>* %p, i32 1, <16 x i1> %a) 3556 ret void 3557} 3558 3559define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) { 3560; SSE2-LABEL: truncstore_v16i32_v16i8: 3561; SSE2: # %bb.0: 3562; SSE2-NEXT: pxor %xmm8, %xmm8 3563; SSE2-NEXT: packssdw %xmm3, %xmm2 3564; SSE2-NEXT: packssdw %xmm1, %xmm0 3565; SSE2-NEXT: packsswb %xmm2, %xmm0 3566; SSE2-NEXT: pcmpeqd %xmm8, %xmm7 3567; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 3568; SSE2-NEXT: pxor %xmm1, %xmm7 3569; SSE2-NEXT: pcmpeqd %xmm8, %xmm6 3570; SSE2-NEXT: pxor %xmm1, %xmm6 3571; SSE2-NEXT: packssdw %xmm7, %xmm6 3572; SSE2-NEXT: pcmpeqd %xmm8, %xmm5 3573; SSE2-NEXT: pxor %xmm1, %xmm5 3574; SSE2-NEXT: pcmpeqd %xmm8, %xmm4 3575; SSE2-NEXT: pxor %xmm1, %xmm4 3576; SSE2-NEXT: packssdw %xmm5, %xmm4 3577; SSE2-NEXT: packsswb %xmm6, %xmm4 3578; SSE2-NEXT: pmovmskb %xmm4, %eax 3579; SSE2-NEXT: testb $1, %al 3580; SSE2-NEXT: movd %xmm0, %ecx 3581; SSE2-NEXT: jne .LBB10_1 3582; SSE2-NEXT: # %bb.2: # %else 3583; SSE2-NEXT: testb $2, %al 3584; SSE2-NEXT: jne .LBB10_3 3585; SSE2-NEXT: .LBB10_4: # %else2 3586; SSE2-NEXT: testb $4, %al 3587; SSE2-NEXT: jne .LBB10_5 3588; SSE2-NEXT: .LBB10_6: # %else4 3589; SSE2-NEXT: testb $8, %al 3590; SSE2-NEXT: je .LBB10_8 3591; SSE2-NEXT: .LBB10_7: # %cond.store5 3592; SSE2-NEXT: shrl $24, %ecx 3593; SSE2-NEXT: movb %cl, 3(%rdi) 3594; SSE2-NEXT: .LBB10_8: # %else6 3595; SSE2-NEXT: testb $16, %al 3596; SSE2-NEXT: pextrw $2, %xmm0, %ecx 3597; SSE2-NEXT: je .LBB10_10 3598; SSE2-NEXT: # %bb.9: # %cond.store7 3599; SSE2-NEXT: movb %cl, 4(%rdi) 3600; SSE2-NEXT: .LBB10_10: # %else8 3601; SSE2-NEXT: testb $32, %al 3602; SSE2-NEXT: je .LBB10_12 3603; SSE2-NEXT: # %bb.11: # %cond.store9 3604; SSE2-NEXT: movb %ch, 5(%rdi) 3605; SSE2-NEXT: .LBB10_12: # %else10 3606; SSE2-NEXT: testb $64, %al 3607; SSE2-NEXT: pextrw $3, %xmm0, %ecx 3608; SSE2-NEXT: je .LBB10_14 3609; SSE2-NEXT: # %bb.13: # %cond.store11 3610; SSE2-NEXT: movb %cl, 6(%rdi) 3611; SSE2-NEXT: .LBB10_14: # %else12 3612; SSE2-NEXT: testb $-128, %al 3613; SSE2-NEXT: je .LBB10_16 3614; SSE2-NEXT: # %bb.15: # %cond.store13 3615; SSE2-NEXT: movb %ch, 7(%rdi) 3616; SSE2-NEXT: .LBB10_16: # %else14 3617; SSE2-NEXT: testl $256, %eax # imm = 0x100 3618; SSE2-NEXT: pextrw $4, %xmm0, %ecx 3619; SSE2-NEXT: je .LBB10_18 3620; SSE2-NEXT: # %bb.17: # %cond.store15 3621; SSE2-NEXT: movb %cl, 8(%rdi) 3622; SSE2-NEXT: .LBB10_18: # %else16 3623; SSE2-NEXT: testl $512, %eax # imm = 0x200 3624; SSE2-NEXT: je .LBB10_20 3625; SSE2-NEXT: # %bb.19: # %cond.store17 3626; SSE2-NEXT: movb %ch, 9(%rdi) 3627; SSE2-NEXT: .LBB10_20: # %else18 3628; SSE2-NEXT: testl $1024, %eax # imm = 0x400 3629; SSE2-NEXT: pextrw $5, %xmm0, %ecx 3630; SSE2-NEXT: je .LBB10_22 3631; SSE2-NEXT: # %bb.21: # %cond.store19 3632; SSE2-NEXT: movb %cl, 10(%rdi) 3633; SSE2-NEXT: .LBB10_22: # %else20 3634; SSE2-NEXT: testl $2048, %eax # imm = 0x800 3635; SSE2-NEXT: je .LBB10_24 3636; SSE2-NEXT: # %bb.23: # %cond.store21 3637; SSE2-NEXT: movb %ch, 11(%rdi) 3638; SSE2-NEXT: .LBB10_24: # %else22 3639; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 3640; SSE2-NEXT: pextrw $6, %xmm0, %ecx 3641; SSE2-NEXT: je .LBB10_26 3642; SSE2-NEXT: # %bb.25: # %cond.store23 3643; SSE2-NEXT: movb %cl, 12(%rdi) 3644; SSE2-NEXT: .LBB10_26: # %else24 3645; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 3646; SSE2-NEXT: je .LBB10_28 3647; SSE2-NEXT: # %bb.27: # %cond.store25 3648; SSE2-NEXT: movb %ch, 13(%rdi) 3649; SSE2-NEXT: .LBB10_28: # %else26 3650; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 3651; SSE2-NEXT: pextrw $7, %xmm0, %ecx 3652; SSE2-NEXT: jne .LBB10_29 3653; SSE2-NEXT: # %bb.30: # %else28 3654; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 3655; SSE2-NEXT: jne .LBB10_31 3656; SSE2-NEXT: .LBB10_32: # %else30 3657; SSE2-NEXT: retq 3658; SSE2-NEXT: .LBB10_1: # %cond.store 3659; SSE2-NEXT: movb %cl, (%rdi) 3660; SSE2-NEXT: testb $2, %al 3661; SSE2-NEXT: je .LBB10_4 3662; SSE2-NEXT: .LBB10_3: # %cond.store1 3663; SSE2-NEXT: movb %ch, 1(%rdi) 3664; SSE2-NEXT: testb $4, %al 3665; SSE2-NEXT: je .LBB10_6 3666; SSE2-NEXT: .LBB10_5: # %cond.store3 3667; SSE2-NEXT: movl %ecx, %edx 3668; SSE2-NEXT: shrl $16, %edx 3669; SSE2-NEXT: movb %dl, 2(%rdi) 3670; SSE2-NEXT: testb $8, %al 3671; SSE2-NEXT: jne .LBB10_7 3672; SSE2-NEXT: jmp .LBB10_8 3673; SSE2-NEXT: .LBB10_29: # %cond.store27 3674; SSE2-NEXT: movb %cl, 14(%rdi) 3675; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 3676; SSE2-NEXT: je .LBB10_32 3677; SSE2-NEXT: .LBB10_31: # %cond.store29 3678; SSE2-NEXT: movb %ch, 15(%rdi) 3679; SSE2-NEXT: retq 3680; 3681; SSE4-LABEL: truncstore_v16i32_v16i8: 3682; SSE4: # %bb.0: 3683; SSE4-NEXT: pxor %xmm8, %xmm8 3684; SSE4-NEXT: packssdw %xmm3, %xmm2 3685; SSE4-NEXT: packssdw %xmm1, %xmm0 3686; SSE4-NEXT: packsswb %xmm2, %xmm0 3687; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 3688; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 3689; SSE4-NEXT: pxor %xmm1, %xmm7 3690; SSE4-NEXT: pcmpeqd %xmm8, %xmm6 3691; SSE4-NEXT: pxor %xmm1, %xmm6 3692; SSE4-NEXT: packssdw %xmm7, %xmm6 3693; SSE4-NEXT: pcmpeqd %xmm8, %xmm5 3694; SSE4-NEXT: pxor %xmm1, %xmm5 3695; SSE4-NEXT: pcmpeqd %xmm8, %xmm4 3696; SSE4-NEXT: pxor %xmm1, %xmm4 3697; SSE4-NEXT: packssdw %xmm5, %xmm4 3698; SSE4-NEXT: packsswb %xmm6, %xmm4 3699; SSE4-NEXT: pmovmskb %xmm4, %eax 3700; SSE4-NEXT: testb $1, %al 3701; SSE4-NEXT: jne .LBB10_1 3702; SSE4-NEXT: # %bb.2: # %else 3703; SSE4-NEXT: testb $2, %al 3704; SSE4-NEXT: jne .LBB10_3 3705; SSE4-NEXT: .LBB10_4: # %else2 3706; SSE4-NEXT: testb $4, %al 3707; SSE4-NEXT: jne .LBB10_5 3708; SSE4-NEXT: .LBB10_6: # %else4 3709; SSE4-NEXT: testb $8, %al 3710; SSE4-NEXT: jne .LBB10_7 3711; SSE4-NEXT: .LBB10_8: # %else6 3712; SSE4-NEXT: testb $16, %al 3713; SSE4-NEXT: jne .LBB10_9 3714; SSE4-NEXT: .LBB10_10: # %else8 3715; SSE4-NEXT: testb $32, %al 3716; SSE4-NEXT: jne .LBB10_11 3717; SSE4-NEXT: .LBB10_12: # %else10 3718; SSE4-NEXT: testb $64, %al 3719; SSE4-NEXT: jne .LBB10_13 3720; SSE4-NEXT: .LBB10_14: # %else12 3721; SSE4-NEXT: testb $-128, %al 3722; SSE4-NEXT: jne .LBB10_15 3723; SSE4-NEXT: .LBB10_16: # %else14 3724; SSE4-NEXT: testl $256, %eax # imm = 0x100 3725; SSE4-NEXT: jne .LBB10_17 3726; SSE4-NEXT: .LBB10_18: # %else16 3727; SSE4-NEXT: testl $512, %eax # imm = 0x200 3728; SSE4-NEXT: jne .LBB10_19 3729; SSE4-NEXT: .LBB10_20: # %else18 3730; SSE4-NEXT: testl $1024, %eax # imm = 0x400 3731; SSE4-NEXT: jne .LBB10_21 3732; SSE4-NEXT: .LBB10_22: # %else20 3733; SSE4-NEXT: testl $2048, %eax # imm = 0x800 3734; SSE4-NEXT: jne .LBB10_23 3735; SSE4-NEXT: .LBB10_24: # %else22 3736; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 3737; SSE4-NEXT: jne .LBB10_25 3738; SSE4-NEXT: .LBB10_26: # %else24 3739; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 3740; SSE4-NEXT: jne .LBB10_27 3741; SSE4-NEXT: .LBB10_28: # %else26 3742; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 3743; SSE4-NEXT: jne .LBB10_29 3744; SSE4-NEXT: .LBB10_30: # %else28 3745; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 3746; SSE4-NEXT: jne .LBB10_31 3747; SSE4-NEXT: .LBB10_32: # %else30 3748; SSE4-NEXT: retq 3749; SSE4-NEXT: .LBB10_1: # %cond.store 3750; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 3751; SSE4-NEXT: testb $2, %al 3752; SSE4-NEXT: je .LBB10_4 3753; SSE4-NEXT: .LBB10_3: # %cond.store1 3754; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 3755; SSE4-NEXT: testb $4, %al 3756; SSE4-NEXT: je .LBB10_6 3757; SSE4-NEXT: .LBB10_5: # %cond.store3 3758; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 3759; SSE4-NEXT: testb $8, %al 3760; SSE4-NEXT: je .LBB10_8 3761; SSE4-NEXT: .LBB10_7: # %cond.store5 3762; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 3763; SSE4-NEXT: testb $16, %al 3764; SSE4-NEXT: je .LBB10_10 3765; SSE4-NEXT: .LBB10_9: # %cond.store7 3766; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 3767; SSE4-NEXT: testb $32, %al 3768; SSE4-NEXT: je .LBB10_12 3769; SSE4-NEXT: .LBB10_11: # %cond.store9 3770; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 3771; SSE4-NEXT: testb $64, %al 3772; SSE4-NEXT: je .LBB10_14 3773; SSE4-NEXT: .LBB10_13: # %cond.store11 3774; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 3775; SSE4-NEXT: testb $-128, %al 3776; SSE4-NEXT: je .LBB10_16 3777; SSE4-NEXT: .LBB10_15: # %cond.store13 3778; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 3779; SSE4-NEXT: testl $256, %eax # imm = 0x100 3780; SSE4-NEXT: je .LBB10_18 3781; SSE4-NEXT: .LBB10_17: # %cond.store15 3782; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 3783; SSE4-NEXT: testl $512, %eax # imm = 0x200 3784; SSE4-NEXT: je .LBB10_20 3785; SSE4-NEXT: .LBB10_19: # %cond.store17 3786; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 3787; SSE4-NEXT: testl $1024, %eax # imm = 0x400 3788; SSE4-NEXT: je .LBB10_22 3789; SSE4-NEXT: .LBB10_21: # %cond.store19 3790; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 3791; SSE4-NEXT: testl $2048, %eax # imm = 0x800 3792; SSE4-NEXT: je .LBB10_24 3793; SSE4-NEXT: .LBB10_23: # %cond.store21 3794; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 3795; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 3796; SSE4-NEXT: je .LBB10_26 3797; SSE4-NEXT: .LBB10_25: # %cond.store23 3798; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 3799; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 3800; SSE4-NEXT: je .LBB10_28 3801; SSE4-NEXT: .LBB10_27: # %cond.store25 3802; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 3803; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 3804; SSE4-NEXT: je .LBB10_30 3805; SSE4-NEXT: .LBB10_29: # %cond.store27 3806; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 3807; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 3808; SSE4-NEXT: je .LBB10_32 3809; SSE4-NEXT: .LBB10_31: # %cond.store29 3810; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 3811; SSE4-NEXT: retq 3812; 3813; AVX1-LABEL: truncstore_v16i32_v16i8: 3814; AVX1: # %bb.0: 3815; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 3816; AVX1-NEXT: vpackssdw %xmm4, %xmm1, %xmm1 3817; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 3818; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0 3819; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 3820; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 3821; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 3822; AVX1-NEXT: vpcmpeqd %xmm4, %xmm1, %xmm1 3823; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 3824; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 3825; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 3826; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 3827; AVX1-NEXT: vpackssdw %xmm1, %xmm3, %xmm1 3828; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3 3829; AVX1-NEXT: vpcmpeqd %xmm4, %xmm3, %xmm3 3830; AVX1-NEXT: vpxor %xmm5, %xmm3, %xmm3 3831; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm2 3832; AVX1-NEXT: vpxor %xmm5, %xmm2, %xmm2 3833; AVX1-NEXT: vpackssdw %xmm3, %xmm2, %xmm2 3834; AVX1-NEXT: vpacksswb %xmm1, %xmm2, %xmm1 3835; AVX1-NEXT: vpmovmskb %xmm1, %eax 3836; AVX1-NEXT: testb $1, %al 3837; AVX1-NEXT: jne .LBB10_1 3838; AVX1-NEXT: # %bb.2: # %else 3839; AVX1-NEXT: testb $2, %al 3840; AVX1-NEXT: jne .LBB10_3 3841; AVX1-NEXT: .LBB10_4: # %else2 3842; AVX1-NEXT: testb $4, %al 3843; AVX1-NEXT: jne .LBB10_5 3844; AVX1-NEXT: .LBB10_6: # %else4 3845; AVX1-NEXT: testb $8, %al 3846; AVX1-NEXT: jne .LBB10_7 3847; AVX1-NEXT: .LBB10_8: # %else6 3848; AVX1-NEXT: testb $16, %al 3849; AVX1-NEXT: jne .LBB10_9 3850; AVX1-NEXT: .LBB10_10: # %else8 3851; AVX1-NEXT: testb $32, %al 3852; AVX1-NEXT: jne .LBB10_11 3853; AVX1-NEXT: .LBB10_12: # %else10 3854; AVX1-NEXT: testb $64, %al 3855; AVX1-NEXT: jne .LBB10_13 3856; AVX1-NEXT: .LBB10_14: # %else12 3857; AVX1-NEXT: testb $-128, %al 3858; AVX1-NEXT: jne .LBB10_15 3859; AVX1-NEXT: .LBB10_16: # %else14 3860; AVX1-NEXT: testl $256, %eax # imm = 0x100 3861; AVX1-NEXT: jne .LBB10_17 3862; AVX1-NEXT: .LBB10_18: # %else16 3863; AVX1-NEXT: testl $512, %eax # imm = 0x200 3864; AVX1-NEXT: jne .LBB10_19 3865; AVX1-NEXT: .LBB10_20: # %else18 3866; AVX1-NEXT: testl $1024, %eax # imm = 0x400 3867; AVX1-NEXT: jne .LBB10_21 3868; AVX1-NEXT: .LBB10_22: # %else20 3869; AVX1-NEXT: testl $2048, %eax # imm = 0x800 3870; AVX1-NEXT: jne .LBB10_23 3871; AVX1-NEXT: .LBB10_24: # %else22 3872; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 3873; AVX1-NEXT: jne .LBB10_25 3874; AVX1-NEXT: .LBB10_26: # %else24 3875; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 3876; AVX1-NEXT: jne .LBB10_27 3877; AVX1-NEXT: .LBB10_28: # %else26 3878; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 3879; AVX1-NEXT: jne .LBB10_29 3880; AVX1-NEXT: .LBB10_30: # %else28 3881; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 3882; AVX1-NEXT: jne .LBB10_31 3883; AVX1-NEXT: .LBB10_32: # %else30 3884; AVX1-NEXT: vzeroupper 3885; AVX1-NEXT: retq 3886; AVX1-NEXT: .LBB10_1: # %cond.store 3887; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 3888; AVX1-NEXT: testb $2, %al 3889; AVX1-NEXT: je .LBB10_4 3890; AVX1-NEXT: .LBB10_3: # %cond.store1 3891; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 3892; AVX1-NEXT: testb $4, %al 3893; AVX1-NEXT: je .LBB10_6 3894; AVX1-NEXT: .LBB10_5: # %cond.store3 3895; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 3896; AVX1-NEXT: testb $8, %al 3897; AVX1-NEXT: je .LBB10_8 3898; AVX1-NEXT: .LBB10_7: # %cond.store5 3899; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 3900; AVX1-NEXT: testb $16, %al 3901; AVX1-NEXT: je .LBB10_10 3902; AVX1-NEXT: .LBB10_9: # %cond.store7 3903; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 3904; AVX1-NEXT: testb $32, %al 3905; AVX1-NEXT: je .LBB10_12 3906; AVX1-NEXT: .LBB10_11: # %cond.store9 3907; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 3908; AVX1-NEXT: testb $64, %al 3909; AVX1-NEXT: je .LBB10_14 3910; AVX1-NEXT: .LBB10_13: # %cond.store11 3911; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 3912; AVX1-NEXT: testb $-128, %al 3913; AVX1-NEXT: je .LBB10_16 3914; AVX1-NEXT: .LBB10_15: # %cond.store13 3915; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 3916; AVX1-NEXT: testl $256, %eax # imm = 0x100 3917; AVX1-NEXT: je .LBB10_18 3918; AVX1-NEXT: .LBB10_17: # %cond.store15 3919; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 3920; AVX1-NEXT: testl $512, %eax # imm = 0x200 3921; AVX1-NEXT: je .LBB10_20 3922; AVX1-NEXT: .LBB10_19: # %cond.store17 3923; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 3924; AVX1-NEXT: testl $1024, %eax # imm = 0x400 3925; AVX1-NEXT: je .LBB10_22 3926; AVX1-NEXT: .LBB10_21: # %cond.store19 3927; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 3928; AVX1-NEXT: testl $2048, %eax # imm = 0x800 3929; AVX1-NEXT: je .LBB10_24 3930; AVX1-NEXT: .LBB10_23: # %cond.store21 3931; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 3932; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 3933; AVX1-NEXT: je .LBB10_26 3934; AVX1-NEXT: .LBB10_25: # %cond.store23 3935; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 3936; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 3937; AVX1-NEXT: je .LBB10_28 3938; AVX1-NEXT: .LBB10_27: # %cond.store25 3939; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 3940; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 3941; AVX1-NEXT: je .LBB10_30 3942; AVX1-NEXT: .LBB10_29: # %cond.store27 3943; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 3944; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 3945; AVX1-NEXT: je .LBB10_32 3946; AVX1-NEXT: .LBB10_31: # %cond.store29 3947; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 3948; AVX1-NEXT: vzeroupper 3949; AVX1-NEXT: retq 3950; 3951; AVX2-LABEL: truncstore_v16i32_v16i8: 3952; AVX2: # %bb.0: 3953; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 3954; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 3955; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 3956; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 3957; AVX2-NEXT: vpshufd {{.*#+}} xmm0 = xmm0[0,2,1,3] 3958; AVX2-NEXT: vpcmpeqd %ymm4, %ymm3, %ymm1 3959; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 3960; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 3961; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm2 3962; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 3963; AVX2-NEXT: vpackssdw %ymm1, %ymm2, %ymm1 3964; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 3965; AVX2-NEXT: vpacksswb %xmm2, %xmm1, %xmm1 3966; AVX2-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,2,1,3] 3967; AVX2-NEXT: vpmovmskb %xmm1, %eax 3968; AVX2-NEXT: testb $1, %al 3969; AVX2-NEXT: jne .LBB10_1 3970; AVX2-NEXT: # %bb.2: # %else 3971; AVX2-NEXT: testb $2, %al 3972; AVX2-NEXT: jne .LBB10_3 3973; AVX2-NEXT: .LBB10_4: # %else2 3974; AVX2-NEXT: testb $4, %al 3975; AVX2-NEXT: jne .LBB10_5 3976; AVX2-NEXT: .LBB10_6: # %else4 3977; AVX2-NEXT: testb $8, %al 3978; AVX2-NEXT: jne .LBB10_7 3979; AVX2-NEXT: .LBB10_8: # %else6 3980; AVX2-NEXT: testb $16, %al 3981; AVX2-NEXT: jne .LBB10_9 3982; AVX2-NEXT: .LBB10_10: # %else8 3983; AVX2-NEXT: testb $32, %al 3984; AVX2-NEXT: jne .LBB10_11 3985; AVX2-NEXT: .LBB10_12: # %else10 3986; AVX2-NEXT: testb $64, %al 3987; AVX2-NEXT: jne .LBB10_13 3988; AVX2-NEXT: .LBB10_14: # %else12 3989; AVX2-NEXT: testb $-128, %al 3990; AVX2-NEXT: jne .LBB10_15 3991; AVX2-NEXT: .LBB10_16: # %else14 3992; AVX2-NEXT: testl $256, %eax # imm = 0x100 3993; AVX2-NEXT: jne .LBB10_17 3994; AVX2-NEXT: .LBB10_18: # %else16 3995; AVX2-NEXT: testl $512, %eax # imm = 0x200 3996; AVX2-NEXT: jne .LBB10_19 3997; AVX2-NEXT: .LBB10_20: # %else18 3998; AVX2-NEXT: testl $1024, %eax # imm = 0x400 3999; AVX2-NEXT: jne .LBB10_21 4000; AVX2-NEXT: .LBB10_22: # %else20 4001; AVX2-NEXT: testl $2048, %eax # imm = 0x800 4002; AVX2-NEXT: jne .LBB10_23 4003; AVX2-NEXT: .LBB10_24: # %else22 4004; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 4005; AVX2-NEXT: jne .LBB10_25 4006; AVX2-NEXT: .LBB10_26: # %else24 4007; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 4008; AVX2-NEXT: jne .LBB10_27 4009; AVX2-NEXT: .LBB10_28: # %else26 4010; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 4011; AVX2-NEXT: jne .LBB10_29 4012; AVX2-NEXT: .LBB10_30: # %else28 4013; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 4014; AVX2-NEXT: jne .LBB10_31 4015; AVX2-NEXT: .LBB10_32: # %else30 4016; AVX2-NEXT: vzeroupper 4017; AVX2-NEXT: retq 4018; AVX2-NEXT: .LBB10_1: # %cond.store 4019; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 4020; AVX2-NEXT: testb $2, %al 4021; AVX2-NEXT: je .LBB10_4 4022; AVX2-NEXT: .LBB10_3: # %cond.store1 4023; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4024; AVX2-NEXT: testb $4, %al 4025; AVX2-NEXT: je .LBB10_6 4026; AVX2-NEXT: .LBB10_5: # %cond.store3 4027; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4028; AVX2-NEXT: testb $8, %al 4029; AVX2-NEXT: je .LBB10_8 4030; AVX2-NEXT: .LBB10_7: # %cond.store5 4031; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4032; AVX2-NEXT: testb $16, %al 4033; AVX2-NEXT: je .LBB10_10 4034; AVX2-NEXT: .LBB10_9: # %cond.store7 4035; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4036; AVX2-NEXT: testb $32, %al 4037; AVX2-NEXT: je .LBB10_12 4038; AVX2-NEXT: .LBB10_11: # %cond.store9 4039; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4040; AVX2-NEXT: testb $64, %al 4041; AVX2-NEXT: je .LBB10_14 4042; AVX2-NEXT: .LBB10_13: # %cond.store11 4043; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4044; AVX2-NEXT: testb $-128, %al 4045; AVX2-NEXT: je .LBB10_16 4046; AVX2-NEXT: .LBB10_15: # %cond.store13 4047; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4048; AVX2-NEXT: testl $256, %eax # imm = 0x100 4049; AVX2-NEXT: je .LBB10_18 4050; AVX2-NEXT: .LBB10_17: # %cond.store15 4051; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 4052; AVX2-NEXT: testl $512, %eax # imm = 0x200 4053; AVX2-NEXT: je .LBB10_20 4054; AVX2-NEXT: .LBB10_19: # %cond.store17 4055; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 4056; AVX2-NEXT: testl $1024, %eax # imm = 0x400 4057; AVX2-NEXT: je .LBB10_22 4058; AVX2-NEXT: .LBB10_21: # %cond.store19 4059; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 4060; AVX2-NEXT: testl $2048, %eax # imm = 0x800 4061; AVX2-NEXT: je .LBB10_24 4062; AVX2-NEXT: .LBB10_23: # %cond.store21 4063; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 4064; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 4065; AVX2-NEXT: je .LBB10_26 4066; AVX2-NEXT: .LBB10_25: # %cond.store23 4067; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 4068; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 4069; AVX2-NEXT: je .LBB10_28 4070; AVX2-NEXT: .LBB10_27: # %cond.store25 4071; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 4072; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 4073; AVX2-NEXT: je .LBB10_30 4074; AVX2-NEXT: .LBB10_29: # %cond.store27 4075; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 4076; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 4077; AVX2-NEXT: je .LBB10_32 4078; AVX2-NEXT: .LBB10_31: # %cond.store29 4079; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 4080; AVX2-NEXT: vzeroupper 4081; AVX2-NEXT: retq 4082; 4083; AVX512F-LABEL: truncstore_v16i32_v16i8: 4084; AVX512F: # %bb.0: 4085; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 4086; AVX512F-NEXT: vpmovsdb %zmm0, %xmm0 4087; AVX512F-NEXT: kmovw %k0, %eax 4088; AVX512F-NEXT: testb $1, %al 4089; AVX512F-NEXT: jne .LBB10_1 4090; AVX512F-NEXT: # %bb.2: # %else 4091; AVX512F-NEXT: testb $2, %al 4092; AVX512F-NEXT: jne .LBB10_3 4093; AVX512F-NEXT: .LBB10_4: # %else2 4094; AVX512F-NEXT: testb $4, %al 4095; AVX512F-NEXT: jne .LBB10_5 4096; AVX512F-NEXT: .LBB10_6: # %else4 4097; AVX512F-NEXT: testb $8, %al 4098; AVX512F-NEXT: jne .LBB10_7 4099; AVX512F-NEXT: .LBB10_8: # %else6 4100; AVX512F-NEXT: testb $16, %al 4101; AVX512F-NEXT: jne .LBB10_9 4102; AVX512F-NEXT: .LBB10_10: # %else8 4103; AVX512F-NEXT: testb $32, %al 4104; AVX512F-NEXT: jne .LBB10_11 4105; AVX512F-NEXT: .LBB10_12: # %else10 4106; AVX512F-NEXT: testb $64, %al 4107; AVX512F-NEXT: jne .LBB10_13 4108; AVX512F-NEXT: .LBB10_14: # %else12 4109; AVX512F-NEXT: testb $-128, %al 4110; AVX512F-NEXT: jne .LBB10_15 4111; AVX512F-NEXT: .LBB10_16: # %else14 4112; AVX512F-NEXT: testl $256, %eax # imm = 0x100 4113; AVX512F-NEXT: jne .LBB10_17 4114; AVX512F-NEXT: .LBB10_18: # %else16 4115; AVX512F-NEXT: testl $512, %eax # imm = 0x200 4116; AVX512F-NEXT: jne .LBB10_19 4117; AVX512F-NEXT: .LBB10_20: # %else18 4118; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 4119; AVX512F-NEXT: jne .LBB10_21 4120; AVX512F-NEXT: .LBB10_22: # %else20 4121; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 4122; AVX512F-NEXT: jne .LBB10_23 4123; AVX512F-NEXT: .LBB10_24: # %else22 4124; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 4125; AVX512F-NEXT: jne .LBB10_25 4126; AVX512F-NEXT: .LBB10_26: # %else24 4127; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 4128; AVX512F-NEXT: jne .LBB10_27 4129; AVX512F-NEXT: .LBB10_28: # %else26 4130; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 4131; AVX512F-NEXT: jne .LBB10_29 4132; AVX512F-NEXT: .LBB10_30: # %else28 4133; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 4134; AVX512F-NEXT: jne .LBB10_31 4135; AVX512F-NEXT: .LBB10_32: # %else30 4136; AVX512F-NEXT: vzeroupper 4137; AVX512F-NEXT: retq 4138; AVX512F-NEXT: .LBB10_1: # %cond.store 4139; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 4140; AVX512F-NEXT: testb $2, %al 4141; AVX512F-NEXT: je .LBB10_4 4142; AVX512F-NEXT: .LBB10_3: # %cond.store1 4143; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4144; AVX512F-NEXT: testb $4, %al 4145; AVX512F-NEXT: je .LBB10_6 4146; AVX512F-NEXT: .LBB10_5: # %cond.store3 4147; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4148; AVX512F-NEXT: testb $8, %al 4149; AVX512F-NEXT: je .LBB10_8 4150; AVX512F-NEXT: .LBB10_7: # %cond.store5 4151; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4152; AVX512F-NEXT: testb $16, %al 4153; AVX512F-NEXT: je .LBB10_10 4154; AVX512F-NEXT: .LBB10_9: # %cond.store7 4155; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4156; AVX512F-NEXT: testb $32, %al 4157; AVX512F-NEXT: je .LBB10_12 4158; AVX512F-NEXT: .LBB10_11: # %cond.store9 4159; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4160; AVX512F-NEXT: testb $64, %al 4161; AVX512F-NEXT: je .LBB10_14 4162; AVX512F-NEXT: .LBB10_13: # %cond.store11 4163; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4164; AVX512F-NEXT: testb $-128, %al 4165; AVX512F-NEXT: je .LBB10_16 4166; AVX512F-NEXT: .LBB10_15: # %cond.store13 4167; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4168; AVX512F-NEXT: testl $256, %eax # imm = 0x100 4169; AVX512F-NEXT: je .LBB10_18 4170; AVX512F-NEXT: .LBB10_17: # %cond.store15 4171; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 4172; AVX512F-NEXT: testl $512, %eax # imm = 0x200 4173; AVX512F-NEXT: je .LBB10_20 4174; AVX512F-NEXT: .LBB10_19: # %cond.store17 4175; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 4176; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 4177; AVX512F-NEXT: je .LBB10_22 4178; AVX512F-NEXT: .LBB10_21: # %cond.store19 4179; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 4180; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 4181; AVX512F-NEXT: je .LBB10_24 4182; AVX512F-NEXT: .LBB10_23: # %cond.store21 4183; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 4184; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 4185; AVX512F-NEXT: je .LBB10_26 4186; AVX512F-NEXT: .LBB10_25: # %cond.store23 4187; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 4188; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 4189; AVX512F-NEXT: je .LBB10_28 4190; AVX512F-NEXT: .LBB10_27: # %cond.store25 4191; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 4192; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 4193; AVX512F-NEXT: je .LBB10_30 4194; AVX512F-NEXT: .LBB10_29: # %cond.store27 4195; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 4196; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 4197; AVX512F-NEXT: je .LBB10_32 4198; AVX512F-NEXT: .LBB10_31: # %cond.store29 4199; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 4200; AVX512F-NEXT: vzeroupper 4201; AVX512F-NEXT: retq 4202; 4203; AVX512BW-LABEL: truncstore_v16i32_v16i8: 4204; AVX512BW: # %bb.0: 4205; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k1 4206; AVX512BW-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 4207; AVX512BW-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 4208; AVX512BW-NEXT: vpmovdb %zmm0, (%rdi) {%k1} 4209; AVX512BW-NEXT: vzeroupper 4210; AVX512BW-NEXT: retq 4211; 4212; AVX512BWVL-LABEL: truncstore_v16i32_v16i8: 4213; AVX512BWVL: # %bb.0: 4214; AVX512BWVL-NEXT: vptestmd %zmm1, %zmm1, %k1 4215; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 4216; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to16}, %zmm0, %zmm0 4217; AVX512BWVL-NEXT: vpmovdb %zmm0, (%rdi) {%k1} 4218; AVX512BWVL-NEXT: vzeroupper 4219; AVX512BWVL-NEXT: retq 4220 %a = icmp ne <16 x i32> %mask, zeroinitializer 4221 %b = icmp slt <16 x i32> %x, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 4222 %c = select <16 x i1> %b, <16 x i32> %x, <16 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 4223 %d = icmp sgt <16 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128> 4224 %e = select <16 x i1> %d, <16 x i32> %c, <16 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128> 4225 %f = trunc <16 x i32> %e to <16 x i8> 4226 call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %f, <16 x i8>* %p, i32 1, <16 x i1> %a) 4227 ret void 4228} 4229 4230define void @truncstore_v8i32_v8i16(<8 x i32> %x, <8 x i16>* %p, <8 x i32> %mask) { 4231; SSE2-LABEL: truncstore_v8i32_v8i16: 4232; SSE2: # %bb.0: 4233; SSE2-NEXT: pxor %xmm4, %xmm4 4234; SSE2-NEXT: packssdw %xmm1, %xmm0 4235; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 4236; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 4237; SSE2-NEXT: pxor %xmm1, %xmm3 4238; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 4239; SSE2-NEXT: pxor %xmm1, %xmm2 4240; SSE2-NEXT: packssdw %xmm3, %xmm2 4241; SSE2-NEXT: packsswb %xmm2, %xmm2 4242; SSE2-NEXT: pmovmskb %xmm2, %eax 4243; SSE2-NEXT: testb $1, %al 4244; SSE2-NEXT: jne .LBB11_1 4245; SSE2-NEXT: # %bb.2: # %else 4246; SSE2-NEXT: testb $2, %al 4247; SSE2-NEXT: jne .LBB11_3 4248; SSE2-NEXT: .LBB11_4: # %else2 4249; SSE2-NEXT: testb $4, %al 4250; SSE2-NEXT: jne .LBB11_5 4251; SSE2-NEXT: .LBB11_6: # %else4 4252; SSE2-NEXT: testb $8, %al 4253; SSE2-NEXT: jne .LBB11_7 4254; SSE2-NEXT: .LBB11_8: # %else6 4255; SSE2-NEXT: testb $16, %al 4256; SSE2-NEXT: jne .LBB11_9 4257; SSE2-NEXT: .LBB11_10: # %else8 4258; SSE2-NEXT: testb $32, %al 4259; SSE2-NEXT: jne .LBB11_11 4260; SSE2-NEXT: .LBB11_12: # %else10 4261; SSE2-NEXT: testb $64, %al 4262; SSE2-NEXT: jne .LBB11_13 4263; SSE2-NEXT: .LBB11_14: # %else12 4264; SSE2-NEXT: testb $-128, %al 4265; SSE2-NEXT: jne .LBB11_15 4266; SSE2-NEXT: .LBB11_16: # %else14 4267; SSE2-NEXT: retq 4268; SSE2-NEXT: .LBB11_1: # %cond.store 4269; SSE2-NEXT: movd %xmm0, %ecx 4270; SSE2-NEXT: movw %cx, (%rdi) 4271; SSE2-NEXT: testb $2, %al 4272; SSE2-NEXT: je .LBB11_4 4273; SSE2-NEXT: .LBB11_3: # %cond.store1 4274; SSE2-NEXT: pextrw $1, %xmm0, %ecx 4275; SSE2-NEXT: movw %cx, 2(%rdi) 4276; SSE2-NEXT: testb $4, %al 4277; SSE2-NEXT: je .LBB11_6 4278; SSE2-NEXT: .LBB11_5: # %cond.store3 4279; SSE2-NEXT: pextrw $2, %xmm0, %ecx 4280; SSE2-NEXT: movw %cx, 4(%rdi) 4281; SSE2-NEXT: testb $8, %al 4282; SSE2-NEXT: je .LBB11_8 4283; SSE2-NEXT: .LBB11_7: # %cond.store5 4284; SSE2-NEXT: pextrw $3, %xmm0, %ecx 4285; SSE2-NEXT: movw %cx, 6(%rdi) 4286; SSE2-NEXT: testb $16, %al 4287; SSE2-NEXT: je .LBB11_10 4288; SSE2-NEXT: .LBB11_9: # %cond.store7 4289; SSE2-NEXT: pextrw $4, %xmm0, %ecx 4290; SSE2-NEXT: movw %cx, 8(%rdi) 4291; SSE2-NEXT: testb $32, %al 4292; SSE2-NEXT: je .LBB11_12 4293; SSE2-NEXT: .LBB11_11: # %cond.store9 4294; SSE2-NEXT: pextrw $5, %xmm0, %ecx 4295; SSE2-NEXT: movw %cx, 10(%rdi) 4296; SSE2-NEXT: testb $64, %al 4297; SSE2-NEXT: je .LBB11_14 4298; SSE2-NEXT: .LBB11_13: # %cond.store11 4299; SSE2-NEXT: pextrw $6, %xmm0, %ecx 4300; SSE2-NEXT: movw %cx, 12(%rdi) 4301; SSE2-NEXT: testb $-128, %al 4302; SSE2-NEXT: je .LBB11_16 4303; SSE2-NEXT: .LBB11_15: # %cond.store13 4304; SSE2-NEXT: pextrw $7, %xmm0, %eax 4305; SSE2-NEXT: movw %ax, 14(%rdi) 4306; SSE2-NEXT: retq 4307; 4308; SSE4-LABEL: truncstore_v8i32_v8i16: 4309; SSE4: # %bb.0: 4310; SSE4-NEXT: pxor %xmm4, %xmm4 4311; SSE4-NEXT: packssdw %xmm1, %xmm0 4312; SSE4-NEXT: pcmpeqd %xmm4, %xmm3 4313; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 4314; SSE4-NEXT: pxor %xmm1, %xmm3 4315; SSE4-NEXT: pcmpeqd %xmm4, %xmm2 4316; SSE4-NEXT: pxor %xmm1, %xmm2 4317; SSE4-NEXT: packssdw %xmm3, %xmm2 4318; SSE4-NEXT: packsswb %xmm2, %xmm2 4319; SSE4-NEXT: pmovmskb %xmm2, %eax 4320; SSE4-NEXT: testb $1, %al 4321; SSE4-NEXT: jne .LBB11_1 4322; SSE4-NEXT: # %bb.2: # %else 4323; SSE4-NEXT: testb $2, %al 4324; SSE4-NEXT: jne .LBB11_3 4325; SSE4-NEXT: .LBB11_4: # %else2 4326; SSE4-NEXT: testb $4, %al 4327; SSE4-NEXT: jne .LBB11_5 4328; SSE4-NEXT: .LBB11_6: # %else4 4329; SSE4-NEXT: testb $8, %al 4330; SSE4-NEXT: jne .LBB11_7 4331; SSE4-NEXT: .LBB11_8: # %else6 4332; SSE4-NEXT: testb $16, %al 4333; SSE4-NEXT: jne .LBB11_9 4334; SSE4-NEXT: .LBB11_10: # %else8 4335; SSE4-NEXT: testb $32, %al 4336; SSE4-NEXT: jne .LBB11_11 4337; SSE4-NEXT: .LBB11_12: # %else10 4338; SSE4-NEXT: testb $64, %al 4339; SSE4-NEXT: jne .LBB11_13 4340; SSE4-NEXT: .LBB11_14: # %else12 4341; SSE4-NEXT: testb $-128, %al 4342; SSE4-NEXT: jne .LBB11_15 4343; SSE4-NEXT: .LBB11_16: # %else14 4344; SSE4-NEXT: retq 4345; SSE4-NEXT: .LBB11_1: # %cond.store 4346; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 4347; SSE4-NEXT: testb $2, %al 4348; SSE4-NEXT: je .LBB11_4 4349; SSE4-NEXT: .LBB11_3: # %cond.store1 4350; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 4351; SSE4-NEXT: testb $4, %al 4352; SSE4-NEXT: je .LBB11_6 4353; SSE4-NEXT: .LBB11_5: # %cond.store3 4354; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 4355; SSE4-NEXT: testb $8, %al 4356; SSE4-NEXT: je .LBB11_8 4357; SSE4-NEXT: .LBB11_7: # %cond.store5 4358; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 4359; SSE4-NEXT: testb $16, %al 4360; SSE4-NEXT: je .LBB11_10 4361; SSE4-NEXT: .LBB11_9: # %cond.store7 4362; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) 4363; SSE4-NEXT: testb $32, %al 4364; SSE4-NEXT: je .LBB11_12 4365; SSE4-NEXT: .LBB11_11: # %cond.store9 4366; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) 4367; SSE4-NEXT: testb $64, %al 4368; SSE4-NEXT: je .LBB11_14 4369; SSE4-NEXT: .LBB11_13: # %cond.store11 4370; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) 4371; SSE4-NEXT: testb $-128, %al 4372; SSE4-NEXT: je .LBB11_16 4373; SSE4-NEXT: .LBB11_15: # %cond.store13 4374; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) 4375; SSE4-NEXT: retq 4376; 4377; AVX1-LABEL: truncstore_v8i32_v8i16: 4378; AVX1: # %bb.0: 4379; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4380; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 4381; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 4382; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 4383; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 4384; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 4385; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 4386; AVX1-NEXT: vmovmskps %ymm1, %eax 4387; AVX1-NEXT: notl %eax 4388; AVX1-NEXT: testb $1, %al 4389; AVX1-NEXT: jne .LBB11_1 4390; AVX1-NEXT: # %bb.2: # %else 4391; AVX1-NEXT: testb $2, %al 4392; AVX1-NEXT: jne .LBB11_3 4393; AVX1-NEXT: .LBB11_4: # %else2 4394; AVX1-NEXT: testb $4, %al 4395; AVX1-NEXT: jne .LBB11_5 4396; AVX1-NEXT: .LBB11_6: # %else4 4397; AVX1-NEXT: testb $8, %al 4398; AVX1-NEXT: jne .LBB11_7 4399; AVX1-NEXT: .LBB11_8: # %else6 4400; AVX1-NEXT: testb $16, %al 4401; AVX1-NEXT: jne .LBB11_9 4402; AVX1-NEXT: .LBB11_10: # %else8 4403; AVX1-NEXT: testb $32, %al 4404; AVX1-NEXT: jne .LBB11_11 4405; AVX1-NEXT: .LBB11_12: # %else10 4406; AVX1-NEXT: testb $64, %al 4407; AVX1-NEXT: jne .LBB11_13 4408; AVX1-NEXT: .LBB11_14: # %else12 4409; AVX1-NEXT: testb $-128, %al 4410; AVX1-NEXT: jne .LBB11_15 4411; AVX1-NEXT: .LBB11_16: # %else14 4412; AVX1-NEXT: vzeroupper 4413; AVX1-NEXT: retq 4414; AVX1-NEXT: .LBB11_1: # %cond.store 4415; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) 4416; AVX1-NEXT: testb $2, %al 4417; AVX1-NEXT: je .LBB11_4 4418; AVX1-NEXT: .LBB11_3: # %cond.store1 4419; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) 4420; AVX1-NEXT: testb $4, %al 4421; AVX1-NEXT: je .LBB11_6 4422; AVX1-NEXT: .LBB11_5: # %cond.store3 4423; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) 4424; AVX1-NEXT: testb $8, %al 4425; AVX1-NEXT: je .LBB11_8 4426; AVX1-NEXT: .LBB11_7: # %cond.store5 4427; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) 4428; AVX1-NEXT: testb $16, %al 4429; AVX1-NEXT: je .LBB11_10 4430; AVX1-NEXT: .LBB11_9: # %cond.store7 4431; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) 4432; AVX1-NEXT: testb $32, %al 4433; AVX1-NEXT: je .LBB11_12 4434; AVX1-NEXT: .LBB11_11: # %cond.store9 4435; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) 4436; AVX1-NEXT: testb $64, %al 4437; AVX1-NEXT: je .LBB11_14 4438; AVX1-NEXT: .LBB11_13: # %cond.store11 4439; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) 4440; AVX1-NEXT: testb $-128, %al 4441; AVX1-NEXT: je .LBB11_16 4442; AVX1-NEXT: .LBB11_15: # %cond.store13 4443; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) 4444; AVX1-NEXT: vzeroupper 4445; AVX1-NEXT: retq 4446; 4447; AVX2-LABEL: truncstore_v8i32_v8i16: 4448; AVX2: # %bb.0: 4449; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 4450; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 4451; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 4452; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 4453; AVX2-NEXT: vmovmskps %ymm1, %eax 4454; AVX2-NEXT: notl %eax 4455; AVX2-NEXT: testb $1, %al 4456; AVX2-NEXT: jne .LBB11_1 4457; AVX2-NEXT: # %bb.2: # %else 4458; AVX2-NEXT: testb $2, %al 4459; AVX2-NEXT: jne .LBB11_3 4460; AVX2-NEXT: .LBB11_4: # %else2 4461; AVX2-NEXT: testb $4, %al 4462; AVX2-NEXT: jne .LBB11_5 4463; AVX2-NEXT: .LBB11_6: # %else4 4464; AVX2-NEXT: testb $8, %al 4465; AVX2-NEXT: jne .LBB11_7 4466; AVX2-NEXT: .LBB11_8: # %else6 4467; AVX2-NEXT: testb $16, %al 4468; AVX2-NEXT: jne .LBB11_9 4469; AVX2-NEXT: .LBB11_10: # %else8 4470; AVX2-NEXT: testb $32, %al 4471; AVX2-NEXT: jne .LBB11_11 4472; AVX2-NEXT: .LBB11_12: # %else10 4473; AVX2-NEXT: testb $64, %al 4474; AVX2-NEXT: jne .LBB11_13 4475; AVX2-NEXT: .LBB11_14: # %else12 4476; AVX2-NEXT: testb $-128, %al 4477; AVX2-NEXT: jne .LBB11_15 4478; AVX2-NEXT: .LBB11_16: # %else14 4479; AVX2-NEXT: vzeroupper 4480; AVX2-NEXT: retq 4481; AVX2-NEXT: .LBB11_1: # %cond.store 4482; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) 4483; AVX2-NEXT: testb $2, %al 4484; AVX2-NEXT: je .LBB11_4 4485; AVX2-NEXT: .LBB11_3: # %cond.store1 4486; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) 4487; AVX2-NEXT: testb $4, %al 4488; AVX2-NEXT: je .LBB11_6 4489; AVX2-NEXT: .LBB11_5: # %cond.store3 4490; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) 4491; AVX2-NEXT: testb $8, %al 4492; AVX2-NEXT: je .LBB11_8 4493; AVX2-NEXT: .LBB11_7: # %cond.store5 4494; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) 4495; AVX2-NEXT: testb $16, %al 4496; AVX2-NEXT: je .LBB11_10 4497; AVX2-NEXT: .LBB11_9: # %cond.store7 4498; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) 4499; AVX2-NEXT: testb $32, %al 4500; AVX2-NEXT: je .LBB11_12 4501; AVX2-NEXT: .LBB11_11: # %cond.store9 4502; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) 4503; AVX2-NEXT: testb $64, %al 4504; AVX2-NEXT: je .LBB11_14 4505; AVX2-NEXT: .LBB11_13: # %cond.store11 4506; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) 4507; AVX2-NEXT: testb $-128, %al 4508; AVX2-NEXT: je .LBB11_16 4509; AVX2-NEXT: .LBB11_15: # %cond.store13 4510; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) 4511; AVX2-NEXT: vzeroupper 4512; AVX2-NEXT: retq 4513; 4514; AVX512F-LABEL: truncstore_v8i32_v8i16: 4515; AVX512F: # %bb.0: 4516; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 4517; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 4518; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 4519; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 4520; AVX512F-NEXT: kmovw %k0, %eax 4521; AVX512F-NEXT: testb $1, %al 4522; AVX512F-NEXT: jne .LBB11_1 4523; AVX512F-NEXT: # %bb.2: # %else 4524; AVX512F-NEXT: testb $2, %al 4525; AVX512F-NEXT: jne .LBB11_3 4526; AVX512F-NEXT: .LBB11_4: # %else2 4527; AVX512F-NEXT: testb $4, %al 4528; AVX512F-NEXT: jne .LBB11_5 4529; AVX512F-NEXT: .LBB11_6: # %else4 4530; AVX512F-NEXT: testb $8, %al 4531; AVX512F-NEXT: jne .LBB11_7 4532; AVX512F-NEXT: .LBB11_8: # %else6 4533; AVX512F-NEXT: testb $16, %al 4534; AVX512F-NEXT: jne .LBB11_9 4535; AVX512F-NEXT: .LBB11_10: # %else8 4536; AVX512F-NEXT: testb $32, %al 4537; AVX512F-NEXT: jne .LBB11_11 4538; AVX512F-NEXT: .LBB11_12: # %else10 4539; AVX512F-NEXT: testb $64, %al 4540; AVX512F-NEXT: jne .LBB11_13 4541; AVX512F-NEXT: .LBB11_14: # %else12 4542; AVX512F-NEXT: testb $-128, %al 4543; AVX512F-NEXT: jne .LBB11_15 4544; AVX512F-NEXT: .LBB11_16: # %else14 4545; AVX512F-NEXT: vzeroupper 4546; AVX512F-NEXT: retq 4547; AVX512F-NEXT: .LBB11_1: # %cond.store 4548; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 4549; AVX512F-NEXT: testb $2, %al 4550; AVX512F-NEXT: je .LBB11_4 4551; AVX512F-NEXT: .LBB11_3: # %cond.store1 4552; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 4553; AVX512F-NEXT: testb $4, %al 4554; AVX512F-NEXT: je .LBB11_6 4555; AVX512F-NEXT: .LBB11_5: # %cond.store3 4556; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 4557; AVX512F-NEXT: testb $8, %al 4558; AVX512F-NEXT: je .LBB11_8 4559; AVX512F-NEXT: .LBB11_7: # %cond.store5 4560; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 4561; AVX512F-NEXT: testb $16, %al 4562; AVX512F-NEXT: je .LBB11_10 4563; AVX512F-NEXT: .LBB11_9: # %cond.store7 4564; AVX512F-NEXT: vpextrw $4, %xmm0, 8(%rdi) 4565; AVX512F-NEXT: testb $32, %al 4566; AVX512F-NEXT: je .LBB11_12 4567; AVX512F-NEXT: .LBB11_11: # %cond.store9 4568; AVX512F-NEXT: vpextrw $5, %xmm0, 10(%rdi) 4569; AVX512F-NEXT: testb $64, %al 4570; AVX512F-NEXT: je .LBB11_14 4571; AVX512F-NEXT: .LBB11_13: # %cond.store11 4572; AVX512F-NEXT: vpextrw $6, %xmm0, 12(%rdi) 4573; AVX512F-NEXT: testb $-128, %al 4574; AVX512F-NEXT: je .LBB11_16 4575; AVX512F-NEXT: .LBB11_15: # %cond.store13 4576; AVX512F-NEXT: vpextrw $7, %xmm0, 14(%rdi) 4577; AVX512F-NEXT: vzeroupper 4578; AVX512F-NEXT: retq 4579; 4580; AVX512BW-LABEL: truncstore_v8i32_v8i16: 4581; AVX512BW: # %bb.0: 4582; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 4583; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 4584; AVX512BW-NEXT: kshiftld $24, %k0, %k0 4585; AVX512BW-NEXT: kshiftrd $24, %k0, %k1 4586; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 4587; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 4588; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 4589; AVX512BW-NEXT: vzeroupper 4590; AVX512BW-NEXT: retq 4591; 4592; AVX512BWVL-LABEL: truncstore_v8i32_v8i16: 4593; AVX512BWVL: # %bb.0: 4594; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 4595; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 4596; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 4597; AVX512BWVL-NEXT: vpmovdw %ymm0, (%rdi) {%k1} 4598; AVX512BWVL-NEXT: vzeroupper 4599; AVX512BWVL-NEXT: retq 4600 %a = icmp ne <8 x i32> %mask, zeroinitializer 4601 %b = icmp slt <8 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767> 4602 %c = select <8 x i1> %b, <8 x i32> %x, <8 x i32> <i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767, i32 32767> 4603 %d = icmp sgt <8 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768> 4604 %e = select <8 x i1> %d, <8 x i32> %c, <8 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768, i32 -32768> 4605 %f = trunc <8 x i32> %e to <8 x i16> 4606 call void @llvm.masked.store.v8i16.p0v8i16(<8 x i16> %f, <8 x i16>* %p, i32 1, <8 x i1> %a) 4607 ret void 4608} 4609 4610define void @truncstore_v8i32_v8i8(<8 x i32> %x, <8 x i8>* %p, <8 x i32> %mask) { 4611; SSE2-LABEL: truncstore_v8i32_v8i8: 4612; SSE2: # %bb.0: 4613; SSE2-NEXT: pxor %xmm4, %xmm4 4614; SSE2-NEXT: packssdw %xmm1, %xmm0 4615; SSE2-NEXT: packsswb %xmm0, %xmm0 4616; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 4617; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 4618; SSE2-NEXT: pxor %xmm1, %xmm3 4619; SSE2-NEXT: pcmpeqd %xmm4, %xmm2 4620; SSE2-NEXT: pxor %xmm1, %xmm2 4621; SSE2-NEXT: packssdw %xmm3, %xmm2 4622; SSE2-NEXT: packsswb %xmm2, %xmm2 4623; SSE2-NEXT: pmovmskb %xmm2, %eax 4624; SSE2-NEXT: testb $1, %al 4625; SSE2-NEXT: movd %xmm0, %ecx 4626; SSE2-NEXT: jne .LBB12_1 4627; SSE2-NEXT: # %bb.2: # %else 4628; SSE2-NEXT: testb $2, %al 4629; SSE2-NEXT: jne .LBB12_3 4630; SSE2-NEXT: .LBB12_4: # %else2 4631; SSE2-NEXT: testb $4, %al 4632; SSE2-NEXT: jne .LBB12_5 4633; SSE2-NEXT: .LBB12_6: # %else4 4634; SSE2-NEXT: testb $8, %al 4635; SSE2-NEXT: je .LBB12_8 4636; SSE2-NEXT: .LBB12_7: # %cond.store5 4637; SSE2-NEXT: shrl $24, %ecx 4638; SSE2-NEXT: movb %cl, 3(%rdi) 4639; SSE2-NEXT: .LBB12_8: # %else6 4640; SSE2-NEXT: testb $16, %al 4641; SSE2-NEXT: pextrw $2, %xmm0, %ecx 4642; SSE2-NEXT: je .LBB12_10 4643; SSE2-NEXT: # %bb.9: # %cond.store7 4644; SSE2-NEXT: movb %cl, 4(%rdi) 4645; SSE2-NEXT: .LBB12_10: # %else8 4646; SSE2-NEXT: testb $32, %al 4647; SSE2-NEXT: je .LBB12_12 4648; SSE2-NEXT: # %bb.11: # %cond.store9 4649; SSE2-NEXT: movb %ch, 5(%rdi) 4650; SSE2-NEXT: .LBB12_12: # %else10 4651; SSE2-NEXT: testb $64, %al 4652; SSE2-NEXT: pextrw $3, %xmm0, %ecx 4653; SSE2-NEXT: jne .LBB12_13 4654; SSE2-NEXT: # %bb.14: # %else12 4655; SSE2-NEXT: testb $-128, %al 4656; SSE2-NEXT: jne .LBB12_15 4657; SSE2-NEXT: .LBB12_16: # %else14 4658; SSE2-NEXT: retq 4659; SSE2-NEXT: .LBB12_1: # %cond.store 4660; SSE2-NEXT: movb %cl, (%rdi) 4661; SSE2-NEXT: testb $2, %al 4662; SSE2-NEXT: je .LBB12_4 4663; SSE2-NEXT: .LBB12_3: # %cond.store1 4664; SSE2-NEXT: movb %ch, 1(%rdi) 4665; SSE2-NEXT: testb $4, %al 4666; SSE2-NEXT: je .LBB12_6 4667; SSE2-NEXT: .LBB12_5: # %cond.store3 4668; SSE2-NEXT: movl %ecx, %edx 4669; SSE2-NEXT: shrl $16, %edx 4670; SSE2-NEXT: movb %dl, 2(%rdi) 4671; SSE2-NEXT: testb $8, %al 4672; SSE2-NEXT: jne .LBB12_7 4673; SSE2-NEXT: jmp .LBB12_8 4674; SSE2-NEXT: .LBB12_13: # %cond.store11 4675; SSE2-NEXT: movb %cl, 6(%rdi) 4676; SSE2-NEXT: testb $-128, %al 4677; SSE2-NEXT: je .LBB12_16 4678; SSE2-NEXT: .LBB12_15: # %cond.store13 4679; SSE2-NEXT: movb %ch, 7(%rdi) 4680; SSE2-NEXT: retq 4681; 4682; SSE4-LABEL: truncstore_v8i32_v8i8: 4683; SSE4: # %bb.0: 4684; SSE4-NEXT: pxor %xmm4, %xmm4 4685; SSE4-NEXT: packssdw %xmm1, %xmm0 4686; SSE4-NEXT: packsswb %xmm0, %xmm0 4687; SSE4-NEXT: pcmpeqd %xmm4, %xmm3 4688; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 4689; SSE4-NEXT: pxor %xmm1, %xmm3 4690; SSE4-NEXT: pcmpeqd %xmm4, %xmm2 4691; SSE4-NEXT: pxor %xmm1, %xmm2 4692; SSE4-NEXT: packssdw %xmm3, %xmm2 4693; SSE4-NEXT: packsswb %xmm2, %xmm2 4694; SSE4-NEXT: pmovmskb %xmm2, %eax 4695; SSE4-NEXT: testb $1, %al 4696; SSE4-NEXT: jne .LBB12_1 4697; SSE4-NEXT: # %bb.2: # %else 4698; SSE4-NEXT: testb $2, %al 4699; SSE4-NEXT: jne .LBB12_3 4700; SSE4-NEXT: .LBB12_4: # %else2 4701; SSE4-NEXT: testb $4, %al 4702; SSE4-NEXT: jne .LBB12_5 4703; SSE4-NEXT: .LBB12_6: # %else4 4704; SSE4-NEXT: testb $8, %al 4705; SSE4-NEXT: jne .LBB12_7 4706; SSE4-NEXT: .LBB12_8: # %else6 4707; SSE4-NEXT: testb $16, %al 4708; SSE4-NEXT: jne .LBB12_9 4709; SSE4-NEXT: .LBB12_10: # %else8 4710; SSE4-NEXT: testb $32, %al 4711; SSE4-NEXT: jne .LBB12_11 4712; SSE4-NEXT: .LBB12_12: # %else10 4713; SSE4-NEXT: testb $64, %al 4714; SSE4-NEXT: jne .LBB12_13 4715; SSE4-NEXT: .LBB12_14: # %else12 4716; SSE4-NEXT: testb $-128, %al 4717; SSE4-NEXT: jne .LBB12_15 4718; SSE4-NEXT: .LBB12_16: # %else14 4719; SSE4-NEXT: retq 4720; SSE4-NEXT: .LBB12_1: # %cond.store 4721; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 4722; SSE4-NEXT: testb $2, %al 4723; SSE4-NEXT: je .LBB12_4 4724; SSE4-NEXT: .LBB12_3: # %cond.store1 4725; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 4726; SSE4-NEXT: testb $4, %al 4727; SSE4-NEXT: je .LBB12_6 4728; SSE4-NEXT: .LBB12_5: # %cond.store3 4729; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 4730; SSE4-NEXT: testb $8, %al 4731; SSE4-NEXT: je .LBB12_8 4732; SSE4-NEXT: .LBB12_7: # %cond.store5 4733; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 4734; SSE4-NEXT: testb $16, %al 4735; SSE4-NEXT: je .LBB12_10 4736; SSE4-NEXT: .LBB12_9: # %cond.store7 4737; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 4738; SSE4-NEXT: testb $32, %al 4739; SSE4-NEXT: je .LBB12_12 4740; SSE4-NEXT: .LBB12_11: # %cond.store9 4741; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 4742; SSE4-NEXT: testb $64, %al 4743; SSE4-NEXT: je .LBB12_14 4744; SSE4-NEXT: .LBB12_13: # %cond.store11 4745; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 4746; SSE4-NEXT: testb $-128, %al 4747; SSE4-NEXT: je .LBB12_16 4748; SSE4-NEXT: .LBB12_15: # %cond.store13 4749; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 4750; SSE4-NEXT: retq 4751; 4752; AVX1-LABEL: truncstore_v8i32_v8i8: 4753; AVX1: # %bb.0: 4754; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 4755; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 4756; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 4757; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 4758; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 4759; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm2 4760; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 4761; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 4762; AVX1-NEXT: vmovmskps %ymm1, %eax 4763; AVX1-NEXT: notl %eax 4764; AVX1-NEXT: testb $1, %al 4765; AVX1-NEXT: jne .LBB12_1 4766; AVX1-NEXT: # %bb.2: # %else 4767; AVX1-NEXT: testb $2, %al 4768; AVX1-NEXT: jne .LBB12_3 4769; AVX1-NEXT: .LBB12_4: # %else2 4770; AVX1-NEXT: testb $4, %al 4771; AVX1-NEXT: jne .LBB12_5 4772; AVX1-NEXT: .LBB12_6: # %else4 4773; AVX1-NEXT: testb $8, %al 4774; AVX1-NEXT: jne .LBB12_7 4775; AVX1-NEXT: .LBB12_8: # %else6 4776; AVX1-NEXT: testb $16, %al 4777; AVX1-NEXT: jne .LBB12_9 4778; AVX1-NEXT: .LBB12_10: # %else8 4779; AVX1-NEXT: testb $32, %al 4780; AVX1-NEXT: jne .LBB12_11 4781; AVX1-NEXT: .LBB12_12: # %else10 4782; AVX1-NEXT: testb $64, %al 4783; AVX1-NEXT: jne .LBB12_13 4784; AVX1-NEXT: .LBB12_14: # %else12 4785; AVX1-NEXT: testb $-128, %al 4786; AVX1-NEXT: jne .LBB12_15 4787; AVX1-NEXT: .LBB12_16: # %else14 4788; AVX1-NEXT: vzeroupper 4789; AVX1-NEXT: retq 4790; AVX1-NEXT: .LBB12_1: # %cond.store 4791; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 4792; AVX1-NEXT: testb $2, %al 4793; AVX1-NEXT: je .LBB12_4 4794; AVX1-NEXT: .LBB12_3: # %cond.store1 4795; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4796; AVX1-NEXT: testb $4, %al 4797; AVX1-NEXT: je .LBB12_6 4798; AVX1-NEXT: .LBB12_5: # %cond.store3 4799; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4800; AVX1-NEXT: testb $8, %al 4801; AVX1-NEXT: je .LBB12_8 4802; AVX1-NEXT: .LBB12_7: # %cond.store5 4803; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4804; AVX1-NEXT: testb $16, %al 4805; AVX1-NEXT: je .LBB12_10 4806; AVX1-NEXT: .LBB12_9: # %cond.store7 4807; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4808; AVX1-NEXT: testb $32, %al 4809; AVX1-NEXT: je .LBB12_12 4810; AVX1-NEXT: .LBB12_11: # %cond.store9 4811; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4812; AVX1-NEXT: testb $64, %al 4813; AVX1-NEXT: je .LBB12_14 4814; AVX1-NEXT: .LBB12_13: # %cond.store11 4815; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4816; AVX1-NEXT: testb $-128, %al 4817; AVX1-NEXT: je .LBB12_16 4818; AVX1-NEXT: .LBB12_15: # %cond.store13 4819; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4820; AVX1-NEXT: vzeroupper 4821; AVX1-NEXT: retq 4822; 4823; AVX2-LABEL: truncstore_v8i32_v8i8: 4824; AVX2: # %bb.0: 4825; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 4826; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 4827; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 4828; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 4829; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 4830; AVX2-NEXT: vmovmskps %ymm1, %eax 4831; AVX2-NEXT: notl %eax 4832; AVX2-NEXT: testb $1, %al 4833; AVX2-NEXT: jne .LBB12_1 4834; AVX2-NEXT: # %bb.2: # %else 4835; AVX2-NEXT: testb $2, %al 4836; AVX2-NEXT: jne .LBB12_3 4837; AVX2-NEXT: .LBB12_4: # %else2 4838; AVX2-NEXT: testb $4, %al 4839; AVX2-NEXT: jne .LBB12_5 4840; AVX2-NEXT: .LBB12_6: # %else4 4841; AVX2-NEXT: testb $8, %al 4842; AVX2-NEXT: jne .LBB12_7 4843; AVX2-NEXT: .LBB12_8: # %else6 4844; AVX2-NEXT: testb $16, %al 4845; AVX2-NEXT: jne .LBB12_9 4846; AVX2-NEXT: .LBB12_10: # %else8 4847; AVX2-NEXT: testb $32, %al 4848; AVX2-NEXT: jne .LBB12_11 4849; AVX2-NEXT: .LBB12_12: # %else10 4850; AVX2-NEXT: testb $64, %al 4851; AVX2-NEXT: jne .LBB12_13 4852; AVX2-NEXT: .LBB12_14: # %else12 4853; AVX2-NEXT: testb $-128, %al 4854; AVX2-NEXT: jne .LBB12_15 4855; AVX2-NEXT: .LBB12_16: # %else14 4856; AVX2-NEXT: vzeroupper 4857; AVX2-NEXT: retq 4858; AVX2-NEXT: .LBB12_1: # %cond.store 4859; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 4860; AVX2-NEXT: testb $2, %al 4861; AVX2-NEXT: je .LBB12_4 4862; AVX2-NEXT: .LBB12_3: # %cond.store1 4863; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4864; AVX2-NEXT: testb $4, %al 4865; AVX2-NEXT: je .LBB12_6 4866; AVX2-NEXT: .LBB12_5: # %cond.store3 4867; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4868; AVX2-NEXT: testb $8, %al 4869; AVX2-NEXT: je .LBB12_8 4870; AVX2-NEXT: .LBB12_7: # %cond.store5 4871; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4872; AVX2-NEXT: testb $16, %al 4873; AVX2-NEXT: je .LBB12_10 4874; AVX2-NEXT: .LBB12_9: # %cond.store7 4875; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4876; AVX2-NEXT: testb $32, %al 4877; AVX2-NEXT: je .LBB12_12 4878; AVX2-NEXT: .LBB12_11: # %cond.store9 4879; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4880; AVX2-NEXT: testb $64, %al 4881; AVX2-NEXT: je .LBB12_14 4882; AVX2-NEXT: .LBB12_13: # %cond.store11 4883; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4884; AVX2-NEXT: testb $-128, %al 4885; AVX2-NEXT: je .LBB12_16 4886; AVX2-NEXT: .LBB12_15: # %cond.store13 4887; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4888; AVX2-NEXT: vzeroupper 4889; AVX2-NEXT: retq 4890; 4891; AVX512F-LABEL: truncstore_v8i32_v8i8: 4892; AVX512F: # %bb.0: 4893; AVX512F-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 4894; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 4895; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 4896; AVX512F-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 4897; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 4898; AVX512F-NEXT: kmovw %k0, %eax 4899; AVX512F-NEXT: testb $1, %al 4900; AVX512F-NEXT: jne .LBB12_1 4901; AVX512F-NEXT: # %bb.2: # %else 4902; AVX512F-NEXT: testb $2, %al 4903; AVX512F-NEXT: jne .LBB12_3 4904; AVX512F-NEXT: .LBB12_4: # %else2 4905; AVX512F-NEXT: testb $4, %al 4906; AVX512F-NEXT: jne .LBB12_5 4907; AVX512F-NEXT: .LBB12_6: # %else4 4908; AVX512F-NEXT: testb $8, %al 4909; AVX512F-NEXT: jne .LBB12_7 4910; AVX512F-NEXT: .LBB12_8: # %else6 4911; AVX512F-NEXT: testb $16, %al 4912; AVX512F-NEXT: jne .LBB12_9 4913; AVX512F-NEXT: .LBB12_10: # %else8 4914; AVX512F-NEXT: testb $32, %al 4915; AVX512F-NEXT: jne .LBB12_11 4916; AVX512F-NEXT: .LBB12_12: # %else10 4917; AVX512F-NEXT: testb $64, %al 4918; AVX512F-NEXT: jne .LBB12_13 4919; AVX512F-NEXT: .LBB12_14: # %else12 4920; AVX512F-NEXT: testb $-128, %al 4921; AVX512F-NEXT: jne .LBB12_15 4922; AVX512F-NEXT: .LBB12_16: # %else14 4923; AVX512F-NEXT: vzeroupper 4924; AVX512F-NEXT: retq 4925; AVX512F-NEXT: .LBB12_1: # %cond.store 4926; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 4927; AVX512F-NEXT: testb $2, %al 4928; AVX512F-NEXT: je .LBB12_4 4929; AVX512F-NEXT: .LBB12_3: # %cond.store1 4930; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 4931; AVX512F-NEXT: testb $4, %al 4932; AVX512F-NEXT: je .LBB12_6 4933; AVX512F-NEXT: .LBB12_5: # %cond.store3 4934; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 4935; AVX512F-NEXT: testb $8, %al 4936; AVX512F-NEXT: je .LBB12_8 4937; AVX512F-NEXT: .LBB12_7: # %cond.store5 4938; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 4939; AVX512F-NEXT: testb $16, %al 4940; AVX512F-NEXT: je .LBB12_10 4941; AVX512F-NEXT: .LBB12_9: # %cond.store7 4942; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 4943; AVX512F-NEXT: testb $32, %al 4944; AVX512F-NEXT: je .LBB12_12 4945; AVX512F-NEXT: .LBB12_11: # %cond.store9 4946; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 4947; AVX512F-NEXT: testb $64, %al 4948; AVX512F-NEXT: je .LBB12_14 4949; AVX512F-NEXT: .LBB12_13: # %cond.store11 4950; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 4951; AVX512F-NEXT: testb $-128, %al 4952; AVX512F-NEXT: je .LBB12_16 4953; AVX512F-NEXT: .LBB12_15: # %cond.store13 4954; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 4955; AVX512F-NEXT: vzeroupper 4956; AVX512F-NEXT: retq 4957; 4958; AVX512BW-LABEL: truncstore_v8i32_v8i8: 4959; AVX512BW: # %bb.0: 4960; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 4961; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 4962; AVX512BW-NEXT: kshiftlq $56, %k0, %k0 4963; AVX512BW-NEXT: kshiftrq $56, %k0, %k1 4964; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 4965; AVX512BW-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 4966; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 4967; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 4968; AVX512BW-NEXT: vzeroupper 4969; AVX512BW-NEXT: retq 4970; 4971; AVX512BWVL-LABEL: truncstore_v8i32_v8i8: 4972; AVX512BWVL: # %bb.0: 4973; AVX512BWVL-NEXT: vptestmd %ymm1, %ymm1, %k1 4974; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 4975; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0 4976; AVX512BWVL-NEXT: vpmovdb %ymm0, (%rdi) {%k1} 4977; AVX512BWVL-NEXT: vzeroupper 4978; AVX512BWVL-NEXT: retq 4979 %a = icmp ne <8 x i32> %mask, zeroinitializer 4980 %b = icmp slt <8 x i32> %x, <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 4981 %c = select <8 x i1> %b, <8 x i32> %x, <8 x i32> <i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127, i32 127> 4982 %d = icmp sgt <8 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128> 4983 %e = select <8 x i1> %d, <8 x i32> %c, <8 x i32> <i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128, i32 -128> 4984 %f = trunc <8 x i32> %e to <8 x i8> 4985 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a) 4986 ret void 4987} 4988 4989define void @truncstore_v4i32_v4i16(<4 x i32> %x, <4 x i16>* %p, <4 x i32> %mask) { 4990; SSE2-LABEL: truncstore_v4i32_v4i16: 4991; SSE2: # %bb.0: 4992; SSE2-NEXT: pxor %xmm2, %xmm2 4993; SSE2-NEXT: packssdw %xmm0, %xmm0 4994; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 4995; SSE2-NEXT: movmskps %xmm2, %eax 4996; SSE2-NEXT: xorl $15, %eax 4997; SSE2-NEXT: testb $1, %al 4998; SSE2-NEXT: jne .LBB13_1 4999; SSE2-NEXT: # %bb.2: # %else 5000; SSE2-NEXT: testb $2, %al 5001; SSE2-NEXT: jne .LBB13_3 5002; SSE2-NEXT: .LBB13_4: # %else2 5003; SSE2-NEXT: testb $4, %al 5004; SSE2-NEXT: jne .LBB13_5 5005; SSE2-NEXT: .LBB13_6: # %else4 5006; SSE2-NEXT: testb $8, %al 5007; SSE2-NEXT: jne .LBB13_7 5008; SSE2-NEXT: .LBB13_8: # %else6 5009; SSE2-NEXT: retq 5010; SSE2-NEXT: .LBB13_1: # %cond.store 5011; SSE2-NEXT: movd %xmm0, %ecx 5012; SSE2-NEXT: movw %cx, (%rdi) 5013; SSE2-NEXT: testb $2, %al 5014; SSE2-NEXT: je .LBB13_4 5015; SSE2-NEXT: .LBB13_3: # %cond.store1 5016; SSE2-NEXT: pextrw $1, %xmm0, %ecx 5017; SSE2-NEXT: movw %cx, 2(%rdi) 5018; SSE2-NEXT: testb $4, %al 5019; SSE2-NEXT: je .LBB13_6 5020; SSE2-NEXT: .LBB13_5: # %cond.store3 5021; SSE2-NEXT: pextrw $2, %xmm0, %ecx 5022; SSE2-NEXT: movw %cx, 4(%rdi) 5023; SSE2-NEXT: testb $8, %al 5024; SSE2-NEXT: je .LBB13_8 5025; SSE2-NEXT: .LBB13_7: # %cond.store5 5026; SSE2-NEXT: pextrw $3, %xmm0, %eax 5027; SSE2-NEXT: movw %ax, 6(%rdi) 5028; SSE2-NEXT: retq 5029; 5030; SSE4-LABEL: truncstore_v4i32_v4i16: 5031; SSE4: # %bb.0: 5032; SSE4-NEXT: pxor %xmm2, %xmm2 5033; SSE4-NEXT: packssdw %xmm0, %xmm0 5034; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 5035; SSE4-NEXT: movmskps %xmm2, %eax 5036; SSE4-NEXT: xorl $15, %eax 5037; SSE4-NEXT: testb $1, %al 5038; SSE4-NEXT: jne .LBB13_1 5039; SSE4-NEXT: # %bb.2: # %else 5040; SSE4-NEXT: testb $2, %al 5041; SSE4-NEXT: jne .LBB13_3 5042; SSE4-NEXT: .LBB13_4: # %else2 5043; SSE4-NEXT: testb $4, %al 5044; SSE4-NEXT: jne .LBB13_5 5045; SSE4-NEXT: .LBB13_6: # %else4 5046; SSE4-NEXT: testb $8, %al 5047; SSE4-NEXT: jne .LBB13_7 5048; SSE4-NEXT: .LBB13_8: # %else6 5049; SSE4-NEXT: retq 5050; SSE4-NEXT: .LBB13_1: # %cond.store 5051; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) 5052; SSE4-NEXT: testb $2, %al 5053; SSE4-NEXT: je .LBB13_4 5054; SSE4-NEXT: .LBB13_3: # %cond.store1 5055; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) 5056; SSE4-NEXT: testb $4, %al 5057; SSE4-NEXT: je .LBB13_6 5058; SSE4-NEXT: .LBB13_5: # %cond.store3 5059; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) 5060; SSE4-NEXT: testb $8, %al 5061; SSE4-NEXT: je .LBB13_8 5062; SSE4-NEXT: .LBB13_7: # %cond.store5 5063; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) 5064; SSE4-NEXT: retq 5065; 5066; AVX-LABEL: truncstore_v4i32_v4i16: 5067; AVX: # %bb.0: 5068; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 5069; AVX-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 5070; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 5071; AVX-NEXT: vmovmskps %xmm1, %eax 5072; AVX-NEXT: xorl $15, %eax 5073; AVX-NEXT: testb $1, %al 5074; AVX-NEXT: jne .LBB13_1 5075; AVX-NEXT: # %bb.2: # %else 5076; AVX-NEXT: testb $2, %al 5077; AVX-NEXT: jne .LBB13_3 5078; AVX-NEXT: .LBB13_4: # %else2 5079; AVX-NEXT: testb $4, %al 5080; AVX-NEXT: jne .LBB13_5 5081; AVX-NEXT: .LBB13_6: # %else4 5082; AVX-NEXT: testb $8, %al 5083; AVX-NEXT: jne .LBB13_7 5084; AVX-NEXT: .LBB13_8: # %else6 5085; AVX-NEXT: retq 5086; AVX-NEXT: .LBB13_1: # %cond.store 5087; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) 5088; AVX-NEXT: testb $2, %al 5089; AVX-NEXT: je .LBB13_4 5090; AVX-NEXT: .LBB13_3: # %cond.store1 5091; AVX-NEXT: vpextrw $1, %xmm0, 2(%rdi) 5092; AVX-NEXT: testb $4, %al 5093; AVX-NEXT: je .LBB13_6 5094; AVX-NEXT: .LBB13_5: # %cond.store3 5095; AVX-NEXT: vpextrw $2, %xmm0, 4(%rdi) 5096; AVX-NEXT: testb $8, %al 5097; AVX-NEXT: je .LBB13_8 5098; AVX-NEXT: .LBB13_7: # %cond.store5 5099; AVX-NEXT: vpextrw $3, %xmm0, 6(%rdi) 5100; AVX-NEXT: retq 5101; 5102; AVX512F-LABEL: truncstore_v4i32_v4i16: 5103; AVX512F: # %bb.0: 5104; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 5105; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 5106; AVX512F-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 5107; AVX512F-NEXT: kmovw %k0, %eax 5108; AVX512F-NEXT: testb $1, %al 5109; AVX512F-NEXT: jne .LBB13_1 5110; AVX512F-NEXT: # %bb.2: # %else 5111; AVX512F-NEXT: testb $2, %al 5112; AVX512F-NEXT: jne .LBB13_3 5113; AVX512F-NEXT: .LBB13_4: # %else2 5114; AVX512F-NEXT: testb $4, %al 5115; AVX512F-NEXT: jne .LBB13_5 5116; AVX512F-NEXT: .LBB13_6: # %else4 5117; AVX512F-NEXT: testb $8, %al 5118; AVX512F-NEXT: jne .LBB13_7 5119; AVX512F-NEXT: .LBB13_8: # %else6 5120; AVX512F-NEXT: vzeroupper 5121; AVX512F-NEXT: retq 5122; AVX512F-NEXT: .LBB13_1: # %cond.store 5123; AVX512F-NEXT: vpextrw $0, %xmm0, (%rdi) 5124; AVX512F-NEXT: testb $2, %al 5125; AVX512F-NEXT: je .LBB13_4 5126; AVX512F-NEXT: .LBB13_3: # %cond.store1 5127; AVX512F-NEXT: vpextrw $1, %xmm0, 2(%rdi) 5128; AVX512F-NEXT: testb $4, %al 5129; AVX512F-NEXT: je .LBB13_6 5130; AVX512F-NEXT: .LBB13_5: # %cond.store3 5131; AVX512F-NEXT: vpextrw $2, %xmm0, 4(%rdi) 5132; AVX512F-NEXT: testb $8, %al 5133; AVX512F-NEXT: je .LBB13_8 5134; AVX512F-NEXT: .LBB13_7: # %cond.store5 5135; AVX512F-NEXT: vpextrw $3, %xmm0, 6(%rdi) 5136; AVX512F-NEXT: vzeroupper 5137; AVX512F-NEXT: retq 5138; 5139; AVX512BW-LABEL: truncstore_v4i32_v4i16: 5140; AVX512BW: # %bb.0: 5141; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 5142; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 5143; AVX512BW-NEXT: kshiftld $28, %k0, %k0 5144; AVX512BW-NEXT: kshiftrd $28, %k0, %k1 5145; AVX512BW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 5146; AVX512BW-NEXT: vmovdqu16 %zmm0, (%rdi) {%k1} 5147; AVX512BW-NEXT: vzeroupper 5148; AVX512BW-NEXT: retq 5149; 5150; AVX512BWVL-LABEL: truncstore_v4i32_v4i16: 5151; AVX512BWVL: # %bb.0: 5152; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 5153; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 5154; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 5155; AVX512BWVL-NEXT: vpmovdw %xmm0, (%rdi) {%k1} 5156; AVX512BWVL-NEXT: retq 5157 %a = icmp ne <4 x i32> %mask, zeroinitializer 5158 %b = icmp slt <4 x i32> %x, <i32 32767, i32 32767, i32 32767, i32 32767> 5159 %c = select <4 x i1> %b, <4 x i32> %x, <4 x i32> <i32 32767, i32 32767, i32 32767, i32 32767> 5160 %d = icmp sgt <4 x i32> %c, <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 5161 %e = select <4 x i1> %d, <4 x i32> %c, <4 x i32> <i32 -32768, i32 -32768, i32 -32768, i32 -32768> 5162 %f = trunc <4 x i32> %e to <4 x i16> 5163 call void @llvm.masked.store.v4i16.p0v4i16(<4 x i16> %f, <4 x i16>* %p, i32 1, <4 x i1> %a) 5164 ret void 5165} 5166 5167define void @truncstore_v4i32_v4i8(<4 x i32> %x, <4 x i8>* %p, <4 x i32> %mask) { 5168; SSE2-LABEL: truncstore_v4i32_v4i8: 5169; SSE2: # %bb.0: 5170; SSE2-NEXT: pxor %xmm2, %xmm2 5171; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127] 5172; SSE2-NEXT: movdqa %xmm3, %xmm4 5173; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 5174; SSE2-NEXT: pand %xmm4, %xmm0 5175; SSE2-NEXT: pandn %xmm3, %xmm4 5176; SSE2-NEXT: por %xmm0, %xmm4 5177; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [4294967168,4294967168,4294967168,4294967168] 5178; SSE2-NEXT: movdqa %xmm4, %xmm3 5179; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 5180; SSE2-NEXT: pand %xmm3, %xmm4 5181; SSE2-NEXT: pandn %xmm0, %xmm3 5182; SSE2-NEXT: por %xmm4, %xmm3 5183; SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm3 5184; SSE2-NEXT: packuswb %xmm3, %xmm3 5185; SSE2-NEXT: packuswb %xmm3, %xmm3 5186; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 5187; SSE2-NEXT: movmskps %xmm2, %ecx 5188; SSE2-NEXT: xorl $15, %ecx 5189; SSE2-NEXT: testb $1, %cl 5190; SSE2-NEXT: movd %xmm3, %eax 5191; SSE2-NEXT: jne .LBB14_1 5192; SSE2-NEXT: # %bb.2: # %else 5193; SSE2-NEXT: testb $2, %cl 5194; SSE2-NEXT: jne .LBB14_3 5195; SSE2-NEXT: .LBB14_4: # %else2 5196; SSE2-NEXT: testb $4, %cl 5197; SSE2-NEXT: jne .LBB14_5 5198; SSE2-NEXT: .LBB14_6: # %else4 5199; SSE2-NEXT: testb $8, %cl 5200; SSE2-NEXT: jne .LBB14_7 5201; SSE2-NEXT: .LBB14_8: # %else6 5202; SSE2-NEXT: retq 5203; SSE2-NEXT: .LBB14_1: # %cond.store 5204; SSE2-NEXT: movb %al, (%rdi) 5205; SSE2-NEXT: testb $2, %cl 5206; SSE2-NEXT: je .LBB14_4 5207; SSE2-NEXT: .LBB14_3: # %cond.store1 5208; SSE2-NEXT: movb %ah, 1(%rdi) 5209; SSE2-NEXT: testb $4, %cl 5210; SSE2-NEXT: je .LBB14_6 5211; SSE2-NEXT: .LBB14_5: # %cond.store3 5212; SSE2-NEXT: movl %eax, %edx 5213; SSE2-NEXT: shrl $16, %edx 5214; SSE2-NEXT: movb %dl, 2(%rdi) 5215; SSE2-NEXT: testb $8, %cl 5216; SSE2-NEXT: je .LBB14_8 5217; SSE2-NEXT: .LBB14_7: # %cond.store5 5218; SSE2-NEXT: shrl $24, %eax 5219; SSE2-NEXT: movb %al, 3(%rdi) 5220; SSE2-NEXT: retq 5221; 5222; SSE4-LABEL: truncstore_v4i32_v4i8: 5223; SSE4: # %bb.0: 5224; SSE4-NEXT: pxor %xmm2, %xmm2 5225; SSE4-NEXT: pminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 5226; SSE4-NEXT: pmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 5227; SSE4-NEXT: packssdw %xmm0, %xmm0 5228; SSE4-NEXT: packsswb %xmm0, %xmm0 5229; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 5230; SSE4-NEXT: movmskps %xmm2, %eax 5231; SSE4-NEXT: xorl $15, %eax 5232; SSE4-NEXT: testb $1, %al 5233; SSE4-NEXT: jne .LBB14_1 5234; SSE4-NEXT: # %bb.2: # %else 5235; SSE4-NEXT: testb $2, %al 5236; SSE4-NEXT: jne .LBB14_3 5237; SSE4-NEXT: .LBB14_4: # %else2 5238; SSE4-NEXT: testb $4, %al 5239; SSE4-NEXT: jne .LBB14_5 5240; SSE4-NEXT: .LBB14_6: # %else4 5241; SSE4-NEXT: testb $8, %al 5242; SSE4-NEXT: jne .LBB14_7 5243; SSE4-NEXT: .LBB14_8: # %else6 5244; SSE4-NEXT: retq 5245; SSE4-NEXT: .LBB14_1: # %cond.store 5246; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 5247; SSE4-NEXT: testb $2, %al 5248; SSE4-NEXT: je .LBB14_4 5249; SSE4-NEXT: .LBB14_3: # %cond.store1 5250; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 5251; SSE4-NEXT: testb $4, %al 5252; SSE4-NEXT: je .LBB14_6 5253; SSE4-NEXT: .LBB14_5: # %cond.store3 5254; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 5255; SSE4-NEXT: testb $8, %al 5256; SSE4-NEXT: je .LBB14_8 5257; SSE4-NEXT: .LBB14_7: # %cond.store5 5258; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 5259; SSE4-NEXT: retq 5260; 5261; AVX1-LABEL: truncstore_v4i32_v4i8: 5262; AVX1: # %bb.0: 5263; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 5264; AVX1-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 5265; AVX1-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 5266; AVX1-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 5267; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 5268; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 5269; AVX1-NEXT: vmovmskps %xmm1, %eax 5270; AVX1-NEXT: xorl $15, %eax 5271; AVX1-NEXT: testb $1, %al 5272; AVX1-NEXT: jne .LBB14_1 5273; AVX1-NEXT: # %bb.2: # %else 5274; AVX1-NEXT: testb $2, %al 5275; AVX1-NEXT: jne .LBB14_3 5276; AVX1-NEXT: .LBB14_4: # %else2 5277; AVX1-NEXT: testb $4, %al 5278; AVX1-NEXT: jne .LBB14_5 5279; AVX1-NEXT: .LBB14_6: # %else4 5280; AVX1-NEXT: testb $8, %al 5281; AVX1-NEXT: jne .LBB14_7 5282; AVX1-NEXT: .LBB14_8: # %else6 5283; AVX1-NEXT: retq 5284; AVX1-NEXT: .LBB14_1: # %cond.store 5285; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 5286; AVX1-NEXT: testb $2, %al 5287; AVX1-NEXT: je .LBB14_4 5288; AVX1-NEXT: .LBB14_3: # %cond.store1 5289; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5290; AVX1-NEXT: testb $4, %al 5291; AVX1-NEXT: je .LBB14_6 5292; AVX1-NEXT: .LBB14_5: # %cond.store3 5293; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5294; AVX1-NEXT: testb $8, %al 5295; AVX1-NEXT: je .LBB14_8 5296; AVX1-NEXT: .LBB14_7: # %cond.store5 5297; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5298; AVX1-NEXT: retq 5299; 5300; AVX2-LABEL: truncstore_v4i32_v4i8: 5301; AVX2: # %bb.0: 5302; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 5303; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [127,127,127,127] 5304; AVX2-NEXT: vpminsd %xmm3, %xmm0, %xmm0 5305; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294967168,4294967168,4294967168,4294967168] 5306; AVX2-NEXT: vpmaxsd %xmm3, %xmm0, %xmm0 5307; AVX2-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 5308; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 5309; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 5310; AVX2-NEXT: vmovmskps %xmm1, %eax 5311; AVX2-NEXT: xorl $15, %eax 5312; AVX2-NEXT: testb $1, %al 5313; AVX2-NEXT: jne .LBB14_1 5314; AVX2-NEXT: # %bb.2: # %else 5315; AVX2-NEXT: testb $2, %al 5316; AVX2-NEXT: jne .LBB14_3 5317; AVX2-NEXT: .LBB14_4: # %else2 5318; AVX2-NEXT: testb $4, %al 5319; AVX2-NEXT: jne .LBB14_5 5320; AVX2-NEXT: .LBB14_6: # %else4 5321; AVX2-NEXT: testb $8, %al 5322; AVX2-NEXT: jne .LBB14_7 5323; AVX2-NEXT: .LBB14_8: # %else6 5324; AVX2-NEXT: retq 5325; AVX2-NEXT: .LBB14_1: # %cond.store 5326; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 5327; AVX2-NEXT: testb $2, %al 5328; AVX2-NEXT: je .LBB14_4 5329; AVX2-NEXT: .LBB14_3: # %cond.store1 5330; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5331; AVX2-NEXT: testb $4, %al 5332; AVX2-NEXT: je .LBB14_6 5333; AVX2-NEXT: .LBB14_5: # %cond.store3 5334; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5335; AVX2-NEXT: testb $8, %al 5336; AVX2-NEXT: je .LBB14_8 5337; AVX2-NEXT: .LBB14_7: # %cond.store5 5338; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5339; AVX2-NEXT: retq 5340; 5341; AVX512F-LABEL: truncstore_v4i32_v4i8: 5342; AVX512F: # %bb.0: 5343; AVX512F-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 5344; AVX512F-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 5345; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 5346; AVX512F-NEXT: vpmovsdb %zmm0, %xmm0 5347; AVX512F-NEXT: kmovw %k0, %eax 5348; AVX512F-NEXT: testb $1, %al 5349; AVX512F-NEXT: jne .LBB14_1 5350; AVX512F-NEXT: # %bb.2: # %else 5351; AVX512F-NEXT: testb $2, %al 5352; AVX512F-NEXT: jne .LBB14_3 5353; AVX512F-NEXT: .LBB14_4: # %else2 5354; AVX512F-NEXT: testb $4, %al 5355; AVX512F-NEXT: jne .LBB14_5 5356; AVX512F-NEXT: .LBB14_6: # %else4 5357; AVX512F-NEXT: testb $8, %al 5358; AVX512F-NEXT: jne .LBB14_7 5359; AVX512F-NEXT: .LBB14_8: # %else6 5360; AVX512F-NEXT: vzeroupper 5361; AVX512F-NEXT: retq 5362; AVX512F-NEXT: .LBB14_1: # %cond.store 5363; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 5364; AVX512F-NEXT: testb $2, %al 5365; AVX512F-NEXT: je .LBB14_4 5366; AVX512F-NEXT: .LBB14_3: # %cond.store1 5367; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5368; AVX512F-NEXT: testb $4, %al 5369; AVX512F-NEXT: je .LBB14_6 5370; AVX512F-NEXT: .LBB14_5: # %cond.store3 5371; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5372; AVX512F-NEXT: testb $8, %al 5373; AVX512F-NEXT: je .LBB14_8 5374; AVX512F-NEXT: .LBB14_7: # %cond.store5 5375; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5376; AVX512F-NEXT: vzeroupper 5377; AVX512F-NEXT: retq 5378; 5379; AVX512BW-LABEL: truncstore_v4i32_v4i8: 5380; AVX512BW: # %bb.0: 5381; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 5382; AVX512BW-NEXT: # kill: def $xmm0 killed $xmm0 def $zmm0 5383; AVX512BW-NEXT: vptestmd %zmm1, %zmm1, %k0 5384; AVX512BW-NEXT: kshiftlq $60, %k0, %k0 5385; AVX512BW-NEXT: kshiftrq $60, %k0, %k1 5386; AVX512BW-NEXT: vpmovsdb %zmm0, %xmm0 5387; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 5388; AVX512BW-NEXT: vzeroupper 5389; AVX512BW-NEXT: retq 5390; 5391; AVX512BWVL-LABEL: truncstore_v4i32_v4i8: 5392; AVX512BWVL: # %bb.0: 5393; AVX512BWVL-NEXT: vptestmd %xmm1, %xmm1, %k1 5394; AVX512BWVL-NEXT: vpminsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 5395; AVX512BWVL-NEXT: vpmaxsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0 5396; AVX512BWVL-NEXT: vpmovdb %xmm0, (%rdi) {%k1} 5397; AVX512BWVL-NEXT: retq 5398 %a = icmp ne <4 x i32> %mask, zeroinitializer 5399 %b = icmp slt <4 x i32> %x, <i32 127, i32 127, i32 127, i32 127> 5400 %c = select <4 x i1> %b, <4 x i32> %x, <4 x i32> <i32 127, i32 127, i32 127, i32 127> 5401 %d = icmp sgt <4 x i32> %c, <i32 -128, i32 -128, i32 -128, i32 -128> 5402 %e = select <4 x i1> %d, <4 x i32> %c, <4 x i32> <i32 -128, i32 -128, i32 -128, i32 -128> 5403 %f = trunc <4 x i32> %e to <4 x i8> 5404 call void @llvm.masked.store.v4i8.p0v4i8(<4 x i8> %f, <4 x i8>* %p, i32 1, <4 x i1> %a) 5405 ret void 5406} 5407 5408define void @truncstore_v32i16_v32i8(<32 x i16> %x, <32 x i8>* %p, <32 x i8> %mask) { 5409; SSE2-LABEL: truncstore_v32i16_v32i8: 5410; SSE2: # %bb.0: 5411; SSE2-NEXT: pxor %xmm6, %xmm6 5412; SSE2-NEXT: packsswb %xmm1, %xmm0 5413; SSE2-NEXT: pcmpeqb %xmm6, %xmm4 5414; SSE2-NEXT: pmovmskb %xmm4, %ecx 5415; SSE2-NEXT: xorl $65535, %ecx # imm = 0xFFFF 5416; SSE2-NEXT: pcmpeqb %xmm6, %xmm5 5417; SSE2-NEXT: pmovmskb %xmm5, %eax 5418; SSE2-NEXT: notl %eax 5419; SSE2-NEXT: shll $16, %eax 5420; SSE2-NEXT: orl %ecx, %eax 5421; SSE2-NEXT: testb $1, %al 5422; SSE2-NEXT: movd %xmm0, %ecx 5423; SSE2-NEXT: jne .LBB15_1 5424; SSE2-NEXT: # %bb.2: # %else 5425; SSE2-NEXT: testb $2, %al 5426; SSE2-NEXT: jne .LBB15_3 5427; SSE2-NEXT: .LBB15_4: # %else2 5428; SSE2-NEXT: testb $4, %al 5429; SSE2-NEXT: jne .LBB15_5 5430; SSE2-NEXT: .LBB15_6: # %else4 5431; SSE2-NEXT: testb $8, %al 5432; SSE2-NEXT: je .LBB15_8 5433; SSE2-NEXT: .LBB15_7: # %cond.store5 5434; SSE2-NEXT: shrl $24, %ecx 5435; SSE2-NEXT: movb %cl, 3(%rdi) 5436; SSE2-NEXT: .LBB15_8: # %else6 5437; SSE2-NEXT: testb $16, %al 5438; SSE2-NEXT: pextrw $2, %xmm0, %ecx 5439; SSE2-NEXT: je .LBB15_10 5440; SSE2-NEXT: # %bb.9: # %cond.store7 5441; SSE2-NEXT: movb %cl, 4(%rdi) 5442; SSE2-NEXT: .LBB15_10: # %else8 5443; SSE2-NEXT: testb $32, %al 5444; SSE2-NEXT: je .LBB15_12 5445; SSE2-NEXT: # %bb.11: # %cond.store9 5446; SSE2-NEXT: movb %ch, 5(%rdi) 5447; SSE2-NEXT: .LBB15_12: # %else10 5448; SSE2-NEXT: testb $64, %al 5449; SSE2-NEXT: pextrw $3, %xmm0, %ecx 5450; SSE2-NEXT: je .LBB15_14 5451; SSE2-NEXT: # %bb.13: # %cond.store11 5452; SSE2-NEXT: movb %cl, 6(%rdi) 5453; SSE2-NEXT: .LBB15_14: # %else12 5454; SSE2-NEXT: testb $-128, %al 5455; SSE2-NEXT: je .LBB15_16 5456; SSE2-NEXT: # %bb.15: # %cond.store13 5457; SSE2-NEXT: movb %ch, 7(%rdi) 5458; SSE2-NEXT: .LBB15_16: # %else14 5459; SSE2-NEXT: testl $256, %eax # imm = 0x100 5460; SSE2-NEXT: pextrw $4, %xmm0, %ecx 5461; SSE2-NEXT: je .LBB15_18 5462; SSE2-NEXT: # %bb.17: # %cond.store15 5463; SSE2-NEXT: movb %cl, 8(%rdi) 5464; SSE2-NEXT: .LBB15_18: # %else16 5465; SSE2-NEXT: testl $512, %eax # imm = 0x200 5466; SSE2-NEXT: je .LBB15_20 5467; SSE2-NEXT: # %bb.19: # %cond.store17 5468; SSE2-NEXT: movb %ch, 9(%rdi) 5469; SSE2-NEXT: .LBB15_20: # %else18 5470; SSE2-NEXT: testl $1024, %eax # imm = 0x400 5471; SSE2-NEXT: pextrw $5, %xmm0, %ecx 5472; SSE2-NEXT: je .LBB15_22 5473; SSE2-NEXT: # %bb.21: # %cond.store19 5474; SSE2-NEXT: movb %cl, 10(%rdi) 5475; SSE2-NEXT: .LBB15_22: # %else20 5476; SSE2-NEXT: testl $2048, %eax # imm = 0x800 5477; SSE2-NEXT: je .LBB15_24 5478; SSE2-NEXT: # %bb.23: # %cond.store21 5479; SSE2-NEXT: movb %ch, 11(%rdi) 5480; SSE2-NEXT: .LBB15_24: # %else22 5481; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 5482; SSE2-NEXT: pextrw $6, %xmm0, %ecx 5483; SSE2-NEXT: je .LBB15_26 5484; SSE2-NEXT: # %bb.25: # %cond.store23 5485; SSE2-NEXT: movb %cl, 12(%rdi) 5486; SSE2-NEXT: .LBB15_26: # %else24 5487; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 5488; SSE2-NEXT: je .LBB15_28 5489; SSE2-NEXT: # %bb.27: # %cond.store25 5490; SSE2-NEXT: movb %ch, 13(%rdi) 5491; SSE2-NEXT: .LBB15_28: # %else26 5492; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 5493; SSE2-NEXT: pextrw $7, %xmm0, %ecx 5494; SSE2-NEXT: je .LBB15_30 5495; SSE2-NEXT: # %bb.29: # %cond.store27 5496; SSE2-NEXT: movb %cl, 14(%rdi) 5497; SSE2-NEXT: .LBB15_30: # %else28 5498; SSE2-NEXT: packsswb %xmm3, %xmm2 5499; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 5500; SSE2-NEXT: je .LBB15_32 5501; SSE2-NEXT: # %bb.31: # %cond.store29 5502; SSE2-NEXT: movb %ch, 15(%rdi) 5503; SSE2-NEXT: .LBB15_32: # %else30 5504; SSE2-NEXT: testl $65536, %eax # imm = 0x10000 5505; SSE2-NEXT: movd %xmm2, %ecx 5506; SSE2-NEXT: jne .LBB15_33 5507; SSE2-NEXT: # %bb.34: # %else32 5508; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 5509; SSE2-NEXT: jne .LBB15_35 5510; SSE2-NEXT: .LBB15_36: # %else34 5511; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 5512; SSE2-NEXT: jne .LBB15_37 5513; SSE2-NEXT: .LBB15_38: # %else36 5514; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 5515; SSE2-NEXT: je .LBB15_40 5516; SSE2-NEXT: .LBB15_39: # %cond.store37 5517; SSE2-NEXT: shrl $24, %ecx 5518; SSE2-NEXT: movb %cl, 19(%rdi) 5519; SSE2-NEXT: .LBB15_40: # %else38 5520; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000 5521; SSE2-NEXT: pextrw $2, %xmm2, %ecx 5522; SSE2-NEXT: je .LBB15_42 5523; SSE2-NEXT: # %bb.41: # %cond.store39 5524; SSE2-NEXT: movb %cl, 20(%rdi) 5525; SSE2-NEXT: .LBB15_42: # %else40 5526; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000 5527; SSE2-NEXT: je .LBB15_44 5528; SSE2-NEXT: # %bb.43: # %cond.store41 5529; SSE2-NEXT: movb %ch, 21(%rdi) 5530; SSE2-NEXT: .LBB15_44: # %else42 5531; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000 5532; SSE2-NEXT: pextrw $3, %xmm2, %ecx 5533; SSE2-NEXT: je .LBB15_46 5534; SSE2-NEXT: # %bb.45: # %cond.store43 5535; SSE2-NEXT: movb %cl, 22(%rdi) 5536; SSE2-NEXT: .LBB15_46: # %else44 5537; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000 5538; SSE2-NEXT: je .LBB15_48 5539; SSE2-NEXT: # %bb.47: # %cond.store45 5540; SSE2-NEXT: movb %ch, 23(%rdi) 5541; SSE2-NEXT: .LBB15_48: # %else46 5542; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000 5543; SSE2-NEXT: pextrw $4, %xmm2, %ecx 5544; SSE2-NEXT: je .LBB15_50 5545; SSE2-NEXT: # %bb.49: # %cond.store47 5546; SSE2-NEXT: movb %cl, 24(%rdi) 5547; SSE2-NEXT: .LBB15_50: # %else48 5548; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000 5549; SSE2-NEXT: je .LBB15_52 5550; SSE2-NEXT: # %bb.51: # %cond.store49 5551; SSE2-NEXT: movb %ch, 25(%rdi) 5552; SSE2-NEXT: .LBB15_52: # %else50 5553; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000 5554; SSE2-NEXT: pextrw $5, %xmm2, %ecx 5555; SSE2-NEXT: je .LBB15_54 5556; SSE2-NEXT: # %bb.53: # %cond.store51 5557; SSE2-NEXT: movb %cl, 26(%rdi) 5558; SSE2-NEXT: .LBB15_54: # %else52 5559; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000 5560; SSE2-NEXT: je .LBB15_56 5561; SSE2-NEXT: # %bb.55: # %cond.store53 5562; SSE2-NEXT: movb %ch, 27(%rdi) 5563; SSE2-NEXT: .LBB15_56: # %else54 5564; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000 5565; SSE2-NEXT: pextrw $6, %xmm2, %ecx 5566; SSE2-NEXT: je .LBB15_58 5567; SSE2-NEXT: # %bb.57: # %cond.store55 5568; SSE2-NEXT: movb %cl, 28(%rdi) 5569; SSE2-NEXT: .LBB15_58: # %else56 5570; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000 5571; SSE2-NEXT: je .LBB15_60 5572; SSE2-NEXT: # %bb.59: # %cond.store57 5573; SSE2-NEXT: movb %ch, 29(%rdi) 5574; SSE2-NEXT: .LBB15_60: # %else58 5575; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000 5576; SSE2-NEXT: pextrw $7, %xmm2, %ecx 5577; SSE2-NEXT: jne .LBB15_61 5578; SSE2-NEXT: # %bb.62: # %else60 5579; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5580; SSE2-NEXT: jne .LBB15_63 5581; SSE2-NEXT: .LBB15_64: # %else62 5582; SSE2-NEXT: retq 5583; SSE2-NEXT: .LBB15_1: # %cond.store 5584; SSE2-NEXT: movb %cl, (%rdi) 5585; SSE2-NEXT: testb $2, %al 5586; SSE2-NEXT: je .LBB15_4 5587; SSE2-NEXT: .LBB15_3: # %cond.store1 5588; SSE2-NEXT: movb %ch, 1(%rdi) 5589; SSE2-NEXT: testb $4, %al 5590; SSE2-NEXT: je .LBB15_6 5591; SSE2-NEXT: .LBB15_5: # %cond.store3 5592; SSE2-NEXT: movl %ecx, %edx 5593; SSE2-NEXT: shrl $16, %edx 5594; SSE2-NEXT: movb %dl, 2(%rdi) 5595; SSE2-NEXT: testb $8, %al 5596; SSE2-NEXT: jne .LBB15_7 5597; SSE2-NEXT: jmp .LBB15_8 5598; SSE2-NEXT: .LBB15_33: # %cond.store31 5599; SSE2-NEXT: movb %cl, 16(%rdi) 5600; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 5601; SSE2-NEXT: je .LBB15_36 5602; SSE2-NEXT: .LBB15_35: # %cond.store33 5603; SSE2-NEXT: movb %ch, 17(%rdi) 5604; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 5605; SSE2-NEXT: je .LBB15_38 5606; SSE2-NEXT: .LBB15_37: # %cond.store35 5607; SSE2-NEXT: movl %ecx, %edx 5608; SSE2-NEXT: shrl $16, %edx 5609; SSE2-NEXT: movb %dl, 18(%rdi) 5610; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 5611; SSE2-NEXT: jne .LBB15_39 5612; SSE2-NEXT: jmp .LBB15_40 5613; SSE2-NEXT: .LBB15_61: # %cond.store59 5614; SSE2-NEXT: movb %cl, 30(%rdi) 5615; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5616; SSE2-NEXT: je .LBB15_64 5617; SSE2-NEXT: .LBB15_63: # %cond.store61 5618; SSE2-NEXT: movb %ch, 31(%rdi) 5619; SSE2-NEXT: retq 5620; 5621; SSE4-LABEL: truncstore_v32i16_v32i8: 5622; SSE4: # %bb.0: 5623; SSE4-NEXT: pxor %xmm6, %xmm6 5624; SSE4-NEXT: packsswb %xmm1, %xmm0 5625; SSE4-NEXT: pcmpeqb %xmm6, %xmm4 5626; SSE4-NEXT: pmovmskb %xmm4, %ecx 5627; SSE4-NEXT: xorl $65535, %ecx # imm = 0xFFFF 5628; SSE4-NEXT: pcmpeqb %xmm6, %xmm5 5629; SSE4-NEXT: pmovmskb %xmm5, %eax 5630; SSE4-NEXT: notl %eax 5631; SSE4-NEXT: shll $16, %eax 5632; SSE4-NEXT: orl %ecx, %eax 5633; SSE4-NEXT: testb $1, %al 5634; SSE4-NEXT: jne .LBB15_1 5635; SSE4-NEXT: # %bb.2: # %else 5636; SSE4-NEXT: testb $2, %al 5637; SSE4-NEXT: jne .LBB15_3 5638; SSE4-NEXT: .LBB15_4: # %else2 5639; SSE4-NEXT: testb $4, %al 5640; SSE4-NEXT: jne .LBB15_5 5641; SSE4-NEXT: .LBB15_6: # %else4 5642; SSE4-NEXT: testb $8, %al 5643; SSE4-NEXT: jne .LBB15_7 5644; SSE4-NEXT: .LBB15_8: # %else6 5645; SSE4-NEXT: testb $16, %al 5646; SSE4-NEXT: jne .LBB15_9 5647; SSE4-NEXT: .LBB15_10: # %else8 5648; SSE4-NEXT: testb $32, %al 5649; SSE4-NEXT: jne .LBB15_11 5650; SSE4-NEXT: .LBB15_12: # %else10 5651; SSE4-NEXT: testb $64, %al 5652; SSE4-NEXT: jne .LBB15_13 5653; SSE4-NEXT: .LBB15_14: # %else12 5654; SSE4-NEXT: testb $-128, %al 5655; SSE4-NEXT: jne .LBB15_15 5656; SSE4-NEXT: .LBB15_16: # %else14 5657; SSE4-NEXT: testl $256, %eax # imm = 0x100 5658; SSE4-NEXT: jne .LBB15_17 5659; SSE4-NEXT: .LBB15_18: # %else16 5660; SSE4-NEXT: testl $512, %eax # imm = 0x200 5661; SSE4-NEXT: jne .LBB15_19 5662; SSE4-NEXT: .LBB15_20: # %else18 5663; SSE4-NEXT: testl $1024, %eax # imm = 0x400 5664; SSE4-NEXT: jne .LBB15_21 5665; SSE4-NEXT: .LBB15_22: # %else20 5666; SSE4-NEXT: testl $2048, %eax # imm = 0x800 5667; SSE4-NEXT: jne .LBB15_23 5668; SSE4-NEXT: .LBB15_24: # %else22 5669; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 5670; SSE4-NEXT: jne .LBB15_25 5671; SSE4-NEXT: .LBB15_26: # %else24 5672; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 5673; SSE4-NEXT: jne .LBB15_27 5674; SSE4-NEXT: .LBB15_28: # %else26 5675; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 5676; SSE4-NEXT: jne .LBB15_29 5677; SSE4-NEXT: .LBB15_30: # %else28 5678; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 5679; SSE4-NEXT: je .LBB15_32 5680; SSE4-NEXT: .LBB15_31: # %cond.store29 5681; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 5682; SSE4-NEXT: .LBB15_32: # %else30 5683; SSE4-NEXT: packsswb %xmm3, %xmm2 5684; SSE4-NEXT: testl $65536, %eax # imm = 0x10000 5685; SSE4-NEXT: jne .LBB15_33 5686; SSE4-NEXT: # %bb.34: # %else32 5687; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 5688; SSE4-NEXT: jne .LBB15_35 5689; SSE4-NEXT: .LBB15_36: # %else34 5690; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 5691; SSE4-NEXT: jne .LBB15_37 5692; SSE4-NEXT: .LBB15_38: # %else36 5693; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 5694; SSE4-NEXT: jne .LBB15_39 5695; SSE4-NEXT: .LBB15_40: # %else38 5696; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 5697; SSE4-NEXT: jne .LBB15_41 5698; SSE4-NEXT: .LBB15_42: # %else40 5699; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 5700; SSE4-NEXT: jne .LBB15_43 5701; SSE4-NEXT: .LBB15_44: # %else42 5702; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 5703; SSE4-NEXT: jne .LBB15_45 5704; SSE4-NEXT: .LBB15_46: # %else44 5705; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 5706; SSE4-NEXT: jne .LBB15_47 5707; SSE4-NEXT: .LBB15_48: # %else46 5708; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 5709; SSE4-NEXT: jne .LBB15_49 5710; SSE4-NEXT: .LBB15_50: # %else48 5711; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 5712; SSE4-NEXT: jne .LBB15_51 5713; SSE4-NEXT: .LBB15_52: # %else50 5714; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 5715; SSE4-NEXT: jne .LBB15_53 5716; SSE4-NEXT: .LBB15_54: # %else52 5717; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 5718; SSE4-NEXT: jne .LBB15_55 5719; SSE4-NEXT: .LBB15_56: # %else54 5720; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 5721; SSE4-NEXT: jne .LBB15_57 5722; SSE4-NEXT: .LBB15_58: # %else56 5723; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 5724; SSE4-NEXT: jne .LBB15_59 5725; SSE4-NEXT: .LBB15_60: # %else58 5726; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 5727; SSE4-NEXT: jne .LBB15_61 5728; SSE4-NEXT: .LBB15_62: # %else60 5729; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5730; SSE4-NEXT: jne .LBB15_63 5731; SSE4-NEXT: .LBB15_64: # %else62 5732; SSE4-NEXT: retq 5733; SSE4-NEXT: .LBB15_1: # %cond.store 5734; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 5735; SSE4-NEXT: testb $2, %al 5736; SSE4-NEXT: je .LBB15_4 5737; SSE4-NEXT: .LBB15_3: # %cond.store1 5738; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 5739; SSE4-NEXT: testb $4, %al 5740; SSE4-NEXT: je .LBB15_6 5741; SSE4-NEXT: .LBB15_5: # %cond.store3 5742; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 5743; SSE4-NEXT: testb $8, %al 5744; SSE4-NEXT: je .LBB15_8 5745; SSE4-NEXT: .LBB15_7: # %cond.store5 5746; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 5747; SSE4-NEXT: testb $16, %al 5748; SSE4-NEXT: je .LBB15_10 5749; SSE4-NEXT: .LBB15_9: # %cond.store7 5750; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 5751; SSE4-NEXT: testb $32, %al 5752; SSE4-NEXT: je .LBB15_12 5753; SSE4-NEXT: .LBB15_11: # %cond.store9 5754; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 5755; SSE4-NEXT: testb $64, %al 5756; SSE4-NEXT: je .LBB15_14 5757; SSE4-NEXT: .LBB15_13: # %cond.store11 5758; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 5759; SSE4-NEXT: testb $-128, %al 5760; SSE4-NEXT: je .LBB15_16 5761; SSE4-NEXT: .LBB15_15: # %cond.store13 5762; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 5763; SSE4-NEXT: testl $256, %eax # imm = 0x100 5764; SSE4-NEXT: je .LBB15_18 5765; SSE4-NEXT: .LBB15_17: # %cond.store15 5766; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 5767; SSE4-NEXT: testl $512, %eax # imm = 0x200 5768; SSE4-NEXT: je .LBB15_20 5769; SSE4-NEXT: .LBB15_19: # %cond.store17 5770; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 5771; SSE4-NEXT: testl $1024, %eax # imm = 0x400 5772; SSE4-NEXT: je .LBB15_22 5773; SSE4-NEXT: .LBB15_21: # %cond.store19 5774; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 5775; SSE4-NEXT: testl $2048, %eax # imm = 0x800 5776; SSE4-NEXT: je .LBB15_24 5777; SSE4-NEXT: .LBB15_23: # %cond.store21 5778; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 5779; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 5780; SSE4-NEXT: je .LBB15_26 5781; SSE4-NEXT: .LBB15_25: # %cond.store23 5782; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 5783; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 5784; SSE4-NEXT: je .LBB15_28 5785; SSE4-NEXT: .LBB15_27: # %cond.store25 5786; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 5787; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 5788; SSE4-NEXT: je .LBB15_30 5789; SSE4-NEXT: .LBB15_29: # %cond.store27 5790; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 5791; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 5792; SSE4-NEXT: jne .LBB15_31 5793; SSE4-NEXT: jmp .LBB15_32 5794; SSE4-NEXT: .LBB15_33: # %cond.store31 5795; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi) 5796; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 5797; SSE4-NEXT: je .LBB15_36 5798; SSE4-NEXT: .LBB15_35: # %cond.store33 5799; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi) 5800; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 5801; SSE4-NEXT: je .LBB15_38 5802; SSE4-NEXT: .LBB15_37: # %cond.store35 5803; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi) 5804; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 5805; SSE4-NEXT: je .LBB15_40 5806; SSE4-NEXT: .LBB15_39: # %cond.store37 5807; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi) 5808; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 5809; SSE4-NEXT: je .LBB15_42 5810; SSE4-NEXT: .LBB15_41: # %cond.store39 5811; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi) 5812; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 5813; SSE4-NEXT: je .LBB15_44 5814; SSE4-NEXT: .LBB15_43: # %cond.store41 5815; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi) 5816; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 5817; SSE4-NEXT: je .LBB15_46 5818; SSE4-NEXT: .LBB15_45: # %cond.store43 5819; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi) 5820; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 5821; SSE4-NEXT: je .LBB15_48 5822; SSE4-NEXT: .LBB15_47: # %cond.store45 5823; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi) 5824; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 5825; SSE4-NEXT: je .LBB15_50 5826; SSE4-NEXT: .LBB15_49: # %cond.store47 5827; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi) 5828; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 5829; SSE4-NEXT: je .LBB15_52 5830; SSE4-NEXT: .LBB15_51: # %cond.store49 5831; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi) 5832; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 5833; SSE4-NEXT: je .LBB15_54 5834; SSE4-NEXT: .LBB15_53: # %cond.store51 5835; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi) 5836; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 5837; SSE4-NEXT: je .LBB15_56 5838; SSE4-NEXT: .LBB15_55: # %cond.store53 5839; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi) 5840; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 5841; SSE4-NEXT: je .LBB15_58 5842; SSE4-NEXT: .LBB15_57: # %cond.store55 5843; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi) 5844; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 5845; SSE4-NEXT: je .LBB15_60 5846; SSE4-NEXT: .LBB15_59: # %cond.store57 5847; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi) 5848; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 5849; SSE4-NEXT: je .LBB15_62 5850; SSE4-NEXT: .LBB15_61: # %cond.store59 5851; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi) 5852; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5853; SSE4-NEXT: je .LBB15_64 5854; SSE4-NEXT: .LBB15_63: # %cond.store61 5855; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi) 5856; SSE4-NEXT: retq 5857; 5858; AVX1-LABEL: truncstore_v32i16_v32i8: 5859; AVX1: # %bb.0: 5860; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 5861; AVX1-NEXT: vpacksswb %xmm3, %xmm1, %xmm1 5862; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 5863; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 5864; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 5865; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 5866; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm3 5867; AVX1-NEXT: vpmovmskb %xmm3, %ecx 5868; AVX1-NEXT: xorl $65535, %ecx # imm = 0xFFFF 5869; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm2 5870; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 5871; AVX1-NEXT: vpmovmskb %xmm1, %eax 5872; AVX1-NEXT: notl %eax 5873; AVX1-NEXT: shll $16, %eax 5874; AVX1-NEXT: orl %ecx, %eax 5875; AVX1-NEXT: testb $1, %al 5876; AVX1-NEXT: jne .LBB15_1 5877; AVX1-NEXT: # %bb.2: # %else 5878; AVX1-NEXT: testb $2, %al 5879; AVX1-NEXT: jne .LBB15_3 5880; AVX1-NEXT: .LBB15_4: # %else2 5881; AVX1-NEXT: testb $4, %al 5882; AVX1-NEXT: jne .LBB15_5 5883; AVX1-NEXT: .LBB15_6: # %else4 5884; AVX1-NEXT: testb $8, %al 5885; AVX1-NEXT: jne .LBB15_7 5886; AVX1-NEXT: .LBB15_8: # %else6 5887; AVX1-NEXT: testb $16, %al 5888; AVX1-NEXT: jne .LBB15_9 5889; AVX1-NEXT: .LBB15_10: # %else8 5890; AVX1-NEXT: testb $32, %al 5891; AVX1-NEXT: jne .LBB15_11 5892; AVX1-NEXT: .LBB15_12: # %else10 5893; AVX1-NEXT: testb $64, %al 5894; AVX1-NEXT: jne .LBB15_13 5895; AVX1-NEXT: .LBB15_14: # %else12 5896; AVX1-NEXT: testb $-128, %al 5897; AVX1-NEXT: jne .LBB15_15 5898; AVX1-NEXT: .LBB15_16: # %else14 5899; AVX1-NEXT: testl $256, %eax # imm = 0x100 5900; AVX1-NEXT: jne .LBB15_17 5901; AVX1-NEXT: .LBB15_18: # %else16 5902; AVX1-NEXT: testl $512, %eax # imm = 0x200 5903; AVX1-NEXT: jne .LBB15_19 5904; AVX1-NEXT: .LBB15_20: # %else18 5905; AVX1-NEXT: testl $1024, %eax # imm = 0x400 5906; AVX1-NEXT: jne .LBB15_21 5907; AVX1-NEXT: .LBB15_22: # %else20 5908; AVX1-NEXT: testl $2048, %eax # imm = 0x800 5909; AVX1-NEXT: jne .LBB15_23 5910; AVX1-NEXT: .LBB15_24: # %else22 5911; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 5912; AVX1-NEXT: jne .LBB15_25 5913; AVX1-NEXT: .LBB15_26: # %else24 5914; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 5915; AVX1-NEXT: jne .LBB15_27 5916; AVX1-NEXT: .LBB15_28: # %else26 5917; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 5918; AVX1-NEXT: jne .LBB15_29 5919; AVX1-NEXT: .LBB15_30: # %else28 5920; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 5921; AVX1-NEXT: je .LBB15_32 5922; AVX1-NEXT: .LBB15_31: # %cond.store29 5923; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 5924; AVX1-NEXT: .LBB15_32: # %else30 5925; AVX1-NEXT: testl $65536, %eax # imm = 0x10000 5926; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 5927; AVX1-NEXT: jne .LBB15_33 5928; AVX1-NEXT: # %bb.34: # %else32 5929; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 5930; AVX1-NEXT: jne .LBB15_35 5931; AVX1-NEXT: .LBB15_36: # %else34 5932; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 5933; AVX1-NEXT: jne .LBB15_37 5934; AVX1-NEXT: .LBB15_38: # %else36 5935; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 5936; AVX1-NEXT: jne .LBB15_39 5937; AVX1-NEXT: .LBB15_40: # %else38 5938; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 5939; AVX1-NEXT: jne .LBB15_41 5940; AVX1-NEXT: .LBB15_42: # %else40 5941; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 5942; AVX1-NEXT: jne .LBB15_43 5943; AVX1-NEXT: .LBB15_44: # %else42 5944; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 5945; AVX1-NEXT: jne .LBB15_45 5946; AVX1-NEXT: .LBB15_46: # %else44 5947; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 5948; AVX1-NEXT: jne .LBB15_47 5949; AVX1-NEXT: .LBB15_48: # %else46 5950; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 5951; AVX1-NEXT: jne .LBB15_49 5952; AVX1-NEXT: .LBB15_50: # %else48 5953; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 5954; AVX1-NEXT: jne .LBB15_51 5955; AVX1-NEXT: .LBB15_52: # %else50 5956; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 5957; AVX1-NEXT: jne .LBB15_53 5958; AVX1-NEXT: .LBB15_54: # %else52 5959; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 5960; AVX1-NEXT: jne .LBB15_55 5961; AVX1-NEXT: .LBB15_56: # %else54 5962; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 5963; AVX1-NEXT: jne .LBB15_57 5964; AVX1-NEXT: .LBB15_58: # %else56 5965; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 5966; AVX1-NEXT: jne .LBB15_59 5967; AVX1-NEXT: .LBB15_60: # %else58 5968; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 5969; AVX1-NEXT: jne .LBB15_61 5970; AVX1-NEXT: .LBB15_62: # %else60 5971; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 5972; AVX1-NEXT: jne .LBB15_63 5973; AVX1-NEXT: .LBB15_64: # %else62 5974; AVX1-NEXT: vzeroupper 5975; AVX1-NEXT: retq 5976; AVX1-NEXT: .LBB15_1: # %cond.store 5977; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 5978; AVX1-NEXT: testb $2, %al 5979; AVX1-NEXT: je .LBB15_4 5980; AVX1-NEXT: .LBB15_3: # %cond.store1 5981; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 5982; AVX1-NEXT: testb $4, %al 5983; AVX1-NEXT: je .LBB15_6 5984; AVX1-NEXT: .LBB15_5: # %cond.store3 5985; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 5986; AVX1-NEXT: testb $8, %al 5987; AVX1-NEXT: je .LBB15_8 5988; AVX1-NEXT: .LBB15_7: # %cond.store5 5989; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 5990; AVX1-NEXT: testb $16, %al 5991; AVX1-NEXT: je .LBB15_10 5992; AVX1-NEXT: .LBB15_9: # %cond.store7 5993; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 5994; AVX1-NEXT: testb $32, %al 5995; AVX1-NEXT: je .LBB15_12 5996; AVX1-NEXT: .LBB15_11: # %cond.store9 5997; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 5998; AVX1-NEXT: testb $64, %al 5999; AVX1-NEXT: je .LBB15_14 6000; AVX1-NEXT: .LBB15_13: # %cond.store11 6001; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6002; AVX1-NEXT: testb $-128, %al 6003; AVX1-NEXT: je .LBB15_16 6004; AVX1-NEXT: .LBB15_15: # %cond.store13 6005; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6006; AVX1-NEXT: testl $256, %eax # imm = 0x100 6007; AVX1-NEXT: je .LBB15_18 6008; AVX1-NEXT: .LBB15_17: # %cond.store15 6009; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6010; AVX1-NEXT: testl $512, %eax # imm = 0x200 6011; AVX1-NEXT: je .LBB15_20 6012; AVX1-NEXT: .LBB15_19: # %cond.store17 6013; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6014; AVX1-NEXT: testl $1024, %eax # imm = 0x400 6015; AVX1-NEXT: je .LBB15_22 6016; AVX1-NEXT: .LBB15_21: # %cond.store19 6017; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6018; AVX1-NEXT: testl $2048, %eax # imm = 0x800 6019; AVX1-NEXT: je .LBB15_24 6020; AVX1-NEXT: .LBB15_23: # %cond.store21 6021; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6022; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 6023; AVX1-NEXT: je .LBB15_26 6024; AVX1-NEXT: .LBB15_25: # %cond.store23 6025; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6026; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 6027; AVX1-NEXT: je .LBB15_28 6028; AVX1-NEXT: .LBB15_27: # %cond.store25 6029; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6030; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 6031; AVX1-NEXT: je .LBB15_30 6032; AVX1-NEXT: .LBB15_29: # %cond.store27 6033; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6034; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 6035; AVX1-NEXT: jne .LBB15_31 6036; AVX1-NEXT: jmp .LBB15_32 6037; AVX1-NEXT: .LBB15_33: # %cond.store31 6038; AVX1-NEXT: vpextrb $0, %xmm0, 16(%rdi) 6039; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 6040; AVX1-NEXT: je .LBB15_36 6041; AVX1-NEXT: .LBB15_35: # %cond.store33 6042; AVX1-NEXT: vpextrb $1, %xmm0, 17(%rdi) 6043; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 6044; AVX1-NEXT: je .LBB15_38 6045; AVX1-NEXT: .LBB15_37: # %cond.store35 6046; AVX1-NEXT: vpextrb $2, %xmm0, 18(%rdi) 6047; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 6048; AVX1-NEXT: je .LBB15_40 6049; AVX1-NEXT: .LBB15_39: # %cond.store37 6050; AVX1-NEXT: vpextrb $3, %xmm0, 19(%rdi) 6051; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 6052; AVX1-NEXT: je .LBB15_42 6053; AVX1-NEXT: .LBB15_41: # %cond.store39 6054; AVX1-NEXT: vpextrb $4, %xmm0, 20(%rdi) 6055; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 6056; AVX1-NEXT: je .LBB15_44 6057; AVX1-NEXT: .LBB15_43: # %cond.store41 6058; AVX1-NEXT: vpextrb $5, %xmm0, 21(%rdi) 6059; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 6060; AVX1-NEXT: je .LBB15_46 6061; AVX1-NEXT: .LBB15_45: # %cond.store43 6062; AVX1-NEXT: vpextrb $6, %xmm0, 22(%rdi) 6063; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 6064; AVX1-NEXT: je .LBB15_48 6065; AVX1-NEXT: .LBB15_47: # %cond.store45 6066; AVX1-NEXT: vpextrb $7, %xmm0, 23(%rdi) 6067; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 6068; AVX1-NEXT: je .LBB15_50 6069; AVX1-NEXT: .LBB15_49: # %cond.store47 6070; AVX1-NEXT: vpextrb $8, %xmm0, 24(%rdi) 6071; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 6072; AVX1-NEXT: je .LBB15_52 6073; AVX1-NEXT: .LBB15_51: # %cond.store49 6074; AVX1-NEXT: vpextrb $9, %xmm0, 25(%rdi) 6075; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 6076; AVX1-NEXT: je .LBB15_54 6077; AVX1-NEXT: .LBB15_53: # %cond.store51 6078; AVX1-NEXT: vpextrb $10, %xmm0, 26(%rdi) 6079; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 6080; AVX1-NEXT: je .LBB15_56 6081; AVX1-NEXT: .LBB15_55: # %cond.store53 6082; AVX1-NEXT: vpextrb $11, %xmm0, 27(%rdi) 6083; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 6084; AVX1-NEXT: je .LBB15_58 6085; AVX1-NEXT: .LBB15_57: # %cond.store55 6086; AVX1-NEXT: vpextrb $12, %xmm0, 28(%rdi) 6087; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 6088; AVX1-NEXT: je .LBB15_60 6089; AVX1-NEXT: .LBB15_59: # %cond.store57 6090; AVX1-NEXT: vpextrb $13, %xmm0, 29(%rdi) 6091; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 6092; AVX1-NEXT: je .LBB15_62 6093; AVX1-NEXT: .LBB15_61: # %cond.store59 6094; AVX1-NEXT: vpextrb $14, %xmm0, 30(%rdi) 6095; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 6096; AVX1-NEXT: je .LBB15_64 6097; AVX1-NEXT: .LBB15_63: # %cond.store61 6098; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) 6099; AVX1-NEXT: vzeroupper 6100; AVX1-NEXT: retq 6101; 6102; AVX2-LABEL: truncstore_v32i16_v32i8: 6103; AVX2: # %bb.0: 6104; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 6105; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 6106; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 6107; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm1 6108; AVX2-NEXT: vpmovmskb %ymm1, %eax 6109; AVX2-NEXT: notl %eax 6110; AVX2-NEXT: testb $1, %al 6111; AVX2-NEXT: jne .LBB15_1 6112; AVX2-NEXT: # %bb.2: # %else 6113; AVX2-NEXT: testb $2, %al 6114; AVX2-NEXT: jne .LBB15_3 6115; AVX2-NEXT: .LBB15_4: # %else2 6116; AVX2-NEXT: testb $4, %al 6117; AVX2-NEXT: jne .LBB15_5 6118; AVX2-NEXT: .LBB15_6: # %else4 6119; AVX2-NEXT: testb $8, %al 6120; AVX2-NEXT: jne .LBB15_7 6121; AVX2-NEXT: .LBB15_8: # %else6 6122; AVX2-NEXT: testb $16, %al 6123; AVX2-NEXT: jne .LBB15_9 6124; AVX2-NEXT: .LBB15_10: # %else8 6125; AVX2-NEXT: testb $32, %al 6126; AVX2-NEXT: jne .LBB15_11 6127; AVX2-NEXT: .LBB15_12: # %else10 6128; AVX2-NEXT: testb $64, %al 6129; AVX2-NEXT: jne .LBB15_13 6130; AVX2-NEXT: .LBB15_14: # %else12 6131; AVX2-NEXT: testb $-128, %al 6132; AVX2-NEXT: jne .LBB15_15 6133; AVX2-NEXT: .LBB15_16: # %else14 6134; AVX2-NEXT: testl $256, %eax # imm = 0x100 6135; AVX2-NEXT: jne .LBB15_17 6136; AVX2-NEXT: .LBB15_18: # %else16 6137; AVX2-NEXT: testl $512, %eax # imm = 0x200 6138; AVX2-NEXT: jne .LBB15_19 6139; AVX2-NEXT: .LBB15_20: # %else18 6140; AVX2-NEXT: testl $1024, %eax # imm = 0x400 6141; AVX2-NEXT: jne .LBB15_21 6142; AVX2-NEXT: .LBB15_22: # %else20 6143; AVX2-NEXT: testl $2048, %eax # imm = 0x800 6144; AVX2-NEXT: jne .LBB15_23 6145; AVX2-NEXT: .LBB15_24: # %else22 6146; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 6147; AVX2-NEXT: jne .LBB15_25 6148; AVX2-NEXT: .LBB15_26: # %else24 6149; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 6150; AVX2-NEXT: jne .LBB15_27 6151; AVX2-NEXT: .LBB15_28: # %else26 6152; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 6153; AVX2-NEXT: jne .LBB15_29 6154; AVX2-NEXT: .LBB15_30: # %else28 6155; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 6156; AVX2-NEXT: je .LBB15_32 6157; AVX2-NEXT: .LBB15_31: # %cond.store29 6158; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 6159; AVX2-NEXT: .LBB15_32: # %else30 6160; AVX2-NEXT: testl $65536, %eax # imm = 0x10000 6161; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 6162; AVX2-NEXT: jne .LBB15_33 6163; AVX2-NEXT: # %bb.34: # %else32 6164; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 6165; AVX2-NEXT: jne .LBB15_35 6166; AVX2-NEXT: .LBB15_36: # %else34 6167; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 6168; AVX2-NEXT: jne .LBB15_37 6169; AVX2-NEXT: .LBB15_38: # %else36 6170; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 6171; AVX2-NEXT: jne .LBB15_39 6172; AVX2-NEXT: .LBB15_40: # %else38 6173; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 6174; AVX2-NEXT: jne .LBB15_41 6175; AVX2-NEXT: .LBB15_42: # %else40 6176; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 6177; AVX2-NEXT: jne .LBB15_43 6178; AVX2-NEXT: .LBB15_44: # %else42 6179; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 6180; AVX2-NEXT: jne .LBB15_45 6181; AVX2-NEXT: .LBB15_46: # %else44 6182; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 6183; AVX2-NEXT: jne .LBB15_47 6184; AVX2-NEXT: .LBB15_48: # %else46 6185; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 6186; AVX2-NEXT: jne .LBB15_49 6187; AVX2-NEXT: .LBB15_50: # %else48 6188; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 6189; AVX2-NEXT: jne .LBB15_51 6190; AVX2-NEXT: .LBB15_52: # %else50 6191; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 6192; AVX2-NEXT: jne .LBB15_53 6193; AVX2-NEXT: .LBB15_54: # %else52 6194; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 6195; AVX2-NEXT: jne .LBB15_55 6196; AVX2-NEXT: .LBB15_56: # %else54 6197; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 6198; AVX2-NEXT: jne .LBB15_57 6199; AVX2-NEXT: .LBB15_58: # %else56 6200; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 6201; AVX2-NEXT: jne .LBB15_59 6202; AVX2-NEXT: .LBB15_60: # %else58 6203; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 6204; AVX2-NEXT: jne .LBB15_61 6205; AVX2-NEXT: .LBB15_62: # %else60 6206; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 6207; AVX2-NEXT: jne .LBB15_63 6208; AVX2-NEXT: .LBB15_64: # %else62 6209; AVX2-NEXT: vzeroupper 6210; AVX2-NEXT: retq 6211; AVX2-NEXT: .LBB15_1: # %cond.store 6212; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 6213; AVX2-NEXT: testb $2, %al 6214; AVX2-NEXT: je .LBB15_4 6215; AVX2-NEXT: .LBB15_3: # %cond.store1 6216; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6217; AVX2-NEXT: testb $4, %al 6218; AVX2-NEXT: je .LBB15_6 6219; AVX2-NEXT: .LBB15_5: # %cond.store3 6220; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6221; AVX2-NEXT: testb $8, %al 6222; AVX2-NEXT: je .LBB15_8 6223; AVX2-NEXT: .LBB15_7: # %cond.store5 6224; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6225; AVX2-NEXT: testb $16, %al 6226; AVX2-NEXT: je .LBB15_10 6227; AVX2-NEXT: .LBB15_9: # %cond.store7 6228; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6229; AVX2-NEXT: testb $32, %al 6230; AVX2-NEXT: je .LBB15_12 6231; AVX2-NEXT: .LBB15_11: # %cond.store9 6232; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6233; AVX2-NEXT: testb $64, %al 6234; AVX2-NEXT: je .LBB15_14 6235; AVX2-NEXT: .LBB15_13: # %cond.store11 6236; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6237; AVX2-NEXT: testb $-128, %al 6238; AVX2-NEXT: je .LBB15_16 6239; AVX2-NEXT: .LBB15_15: # %cond.store13 6240; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6241; AVX2-NEXT: testl $256, %eax # imm = 0x100 6242; AVX2-NEXT: je .LBB15_18 6243; AVX2-NEXT: .LBB15_17: # %cond.store15 6244; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6245; AVX2-NEXT: testl $512, %eax # imm = 0x200 6246; AVX2-NEXT: je .LBB15_20 6247; AVX2-NEXT: .LBB15_19: # %cond.store17 6248; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6249; AVX2-NEXT: testl $1024, %eax # imm = 0x400 6250; AVX2-NEXT: je .LBB15_22 6251; AVX2-NEXT: .LBB15_21: # %cond.store19 6252; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6253; AVX2-NEXT: testl $2048, %eax # imm = 0x800 6254; AVX2-NEXT: je .LBB15_24 6255; AVX2-NEXT: .LBB15_23: # %cond.store21 6256; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6257; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 6258; AVX2-NEXT: je .LBB15_26 6259; AVX2-NEXT: .LBB15_25: # %cond.store23 6260; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6261; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 6262; AVX2-NEXT: je .LBB15_28 6263; AVX2-NEXT: .LBB15_27: # %cond.store25 6264; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6265; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 6266; AVX2-NEXT: je .LBB15_30 6267; AVX2-NEXT: .LBB15_29: # %cond.store27 6268; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6269; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 6270; AVX2-NEXT: jne .LBB15_31 6271; AVX2-NEXT: jmp .LBB15_32 6272; AVX2-NEXT: .LBB15_33: # %cond.store31 6273; AVX2-NEXT: vpextrb $0, %xmm0, 16(%rdi) 6274; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 6275; AVX2-NEXT: je .LBB15_36 6276; AVX2-NEXT: .LBB15_35: # %cond.store33 6277; AVX2-NEXT: vpextrb $1, %xmm0, 17(%rdi) 6278; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 6279; AVX2-NEXT: je .LBB15_38 6280; AVX2-NEXT: .LBB15_37: # %cond.store35 6281; AVX2-NEXT: vpextrb $2, %xmm0, 18(%rdi) 6282; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 6283; AVX2-NEXT: je .LBB15_40 6284; AVX2-NEXT: .LBB15_39: # %cond.store37 6285; AVX2-NEXT: vpextrb $3, %xmm0, 19(%rdi) 6286; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 6287; AVX2-NEXT: je .LBB15_42 6288; AVX2-NEXT: .LBB15_41: # %cond.store39 6289; AVX2-NEXT: vpextrb $4, %xmm0, 20(%rdi) 6290; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 6291; AVX2-NEXT: je .LBB15_44 6292; AVX2-NEXT: .LBB15_43: # %cond.store41 6293; AVX2-NEXT: vpextrb $5, %xmm0, 21(%rdi) 6294; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 6295; AVX2-NEXT: je .LBB15_46 6296; AVX2-NEXT: .LBB15_45: # %cond.store43 6297; AVX2-NEXT: vpextrb $6, %xmm0, 22(%rdi) 6298; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 6299; AVX2-NEXT: je .LBB15_48 6300; AVX2-NEXT: .LBB15_47: # %cond.store45 6301; AVX2-NEXT: vpextrb $7, %xmm0, 23(%rdi) 6302; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 6303; AVX2-NEXT: je .LBB15_50 6304; AVX2-NEXT: .LBB15_49: # %cond.store47 6305; AVX2-NEXT: vpextrb $8, %xmm0, 24(%rdi) 6306; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 6307; AVX2-NEXT: je .LBB15_52 6308; AVX2-NEXT: .LBB15_51: # %cond.store49 6309; AVX2-NEXT: vpextrb $9, %xmm0, 25(%rdi) 6310; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 6311; AVX2-NEXT: je .LBB15_54 6312; AVX2-NEXT: .LBB15_53: # %cond.store51 6313; AVX2-NEXT: vpextrb $10, %xmm0, 26(%rdi) 6314; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 6315; AVX2-NEXT: je .LBB15_56 6316; AVX2-NEXT: .LBB15_55: # %cond.store53 6317; AVX2-NEXT: vpextrb $11, %xmm0, 27(%rdi) 6318; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 6319; AVX2-NEXT: je .LBB15_58 6320; AVX2-NEXT: .LBB15_57: # %cond.store55 6321; AVX2-NEXT: vpextrb $12, %xmm0, 28(%rdi) 6322; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 6323; AVX2-NEXT: je .LBB15_60 6324; AVX2-NEXT: .LBB15_59: # %cond.store57 6325; AVX2-NEXT: vpextrb $13, %xmm0, 29(%rdi) 6326; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 6327; AVX2-NEXT: je .LBB15_62 6328; AVX2-NEXT: .LBB15_61: # %cond.store59 6329; AVX2-NEXT: vpextrb $14, %xmm0, 30(%rdi) 6330; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 6331; AVX2-NEXT: je .LBB15_64 6332; AVX2-NEXT: .LBB15_63: # %cond.store61 6333; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) 6334; AVX2-NEXT: vzeroupper 6335; AVX2-NEXT: retq 6336; 6337; AVX512F-LABEL: truncstore_v32i16_v32i8: 6338; AVX512F: # %bb.0: 6339; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 6340; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm1, %ymm1 6341; AVX512F-NEXT: vextracti64x4 $1, %zmm0, %ymm2 6342; AVX512F-NEXT: vpacksswb %ymm2, %ymm0, %ymm0 6343; AVX512F-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] 6344; AVX512F-NEXT: vpmovmskb %ymm1, %eax 6345; AVX512F-NEXT: notl %eax 6346; AVX512F-NEXT: testb $1, %al 6347; AVX512F-NEXT: jne .LBB15_1 6348; AVX512F-NEXT: # %bb.2: # %else 6349; AVX512F-NEXT: testb $2, %al 6350; AVX512F-NEXT: jne .LBB15_3 6351; AVX512F-NEXT: .LBB15_4: # %else2 6352; AVX512F-NEXT: testb $4, %al 6353; AVX512F-NEXT: jne .LBB15_5 6354; AVX512F-NEXT: .LBB15_6: # %else4 6355; AVX512F-NEXT: testb $8, %al 6356; AVX512F-NEXT: jne .LBB15_7 6357; AVX512F-NEXT: .LBB15_8: # %else6 6358; AVX512F-NEXT: testb $16, %al 6359; AVX512F-NEXT: jne .LBB15_9 6360; AVX512F-NEXT: .LBB15_10: # %else8 6361; AVX512F-NEXT: testb $32, %al 6362; AVX512F-NEXT: jne .LBB15_11 6363; AVX512F-NEXT: .LBB15_12: # %else10 6364; AVX512F-NEXT: testb $64, %al 6365; AVX512F-NEXT: jne .LBB15_13 6366; AVX512F-NEXT: .LBB15_14: # %else12 6367; AVX512F-NEXT: testb $-128, %al 6368; AVX512F-NEXT: jne .LBB15_15 6369; AVX512F-NEXT: .LBB15_16: # %else14 6370; AVX512F-NEXT: testl $256, %eax # imm = 0x100 6371; AVX512F-NEXT: jne .LBB15_17 6372; AVX512F-NEXT: .LBB15_18: # %else16 6373; AVX512F-NEXT: testl $512, %eax # imm = 0x200 6374; AVX512F-NEXT: jne .LBB15_19 6375; AVX512F-NEXT: .LBB15_20: # %else18 6376; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 6377; AVX512F-NEXT: jne .LBB15_21 6378; AVX512F-NEXT: .LBB15_22: # %else20 6379; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 6380; AVX512F-NEXT: jne .LBB15_23 6381; AVX512F-NEXT: .LBB15_24: # %else22 6382; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 6383; AVX512F-NEXT: jne .LBB15_25 6384; AVX512F-NEXT: .LBB15_26: # %else24 6385; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 6386; AVX512F-NEXT: jne .LBB15_27 6387; AVX512F-NEXT: .LBB15_28: # %else26 6388; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 6389; AVX512F-NEXT: jne .LBB15_29 6390; AVX512F-NEXT: .LBB15_30: # %else28 6391; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 6392; AVX512F-NEXT: je .LBB15_32 6393; AVX512F-NEXT: .LBB15_31: # %cond.store29 6394; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 6395; AVX512F-NEXT: .LBB15_32: # %else30 6396; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000 6397; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 6398; AVX512F-NEXT: jne .LBB15_33 6399; AVX512F-NEXT: # %bb.34: # %else32 6400; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 6401; AVX512F-NEXT: jne .LBB15_35 6402; AVX512F-NEXT: .LBB15_36: # %else34 6403; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 6404; AVX512F-NEXT: jne .LBB15_37 6405; AVX512F-NEXT: .LBB15_38: # %else36 6406; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 6407; AVX512F-NEXT: jne .LBB15_39 6408; AVX512F-NEXT: .LBB15_40: # %else38 6409; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 6410; AVX512F-NEXT: jne .LBB15_41 6411; AVX512F-NEXT: .LBB15_42: # %else40 6412; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 6413; AVX512F-NEXT: jne .LBB15_43 6414; AVX512F-NEXT: .LBB15_44: # %else42 6415; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 6416; AVX512F-NEXT: jne .LBB15_45 6417; AVX512F-NEXT: .LBB15_46: # %else44 6418; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 6419; AVX512F-NEXT: jne .LBB15_47 6420; AVX512F-NEXT: .LBB15_48: # %else46 6421; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 6422; AVX512F-NEXT: jne .LBB15_49 6423; AVX512F-NEXT: .LBB15_50: # %else48 6424; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 6425; AVX512F-NEXT: jne .LBB15_51 6426; AVX512F-NEXT: .LBB15_52: # %else50 6427; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 6428; AVX512F-NEXT: jne .LBB15_53 6429; AVX512F-NEXT: .LBB15_54: # %else52 6430; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 6431; AVX512F-NEXT: jne .LBB15_55 6432; AVX512F-NEXT: .LBB15_56: # %else54 6433; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 6434; AVX512F-NEXT: jne .LBB15_57 6435; AVX512F-NEXT: .LBB15_58: # %else56 6436; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 6437; AVX512F-NEXT: jne .LBB15_59 6438; AVX512F-NEXT: .LBB15_60: # %else58 6439; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 6440; AVX512F-NEXT: jne .LBB15_61 6441; AVX512F-NEXT: .LBB15_62: # %else60 6442; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 6443; AVX512F-NEXT: jne .LBB15_63 6444; AVX512F-NEXT: .LBB15_64: # %else62 6445; AVX512F-NEXT: vzeroupper 6446; AVX512F-NEXT: retq 6447; AVX512F-NEXT: .LBB15_1: # %cond.store 6448; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 6449; AVX512F-NEXT: testb $2, %al 6450; AVX512F-NEXT: je .LBB15_4 6451; AVX512F-NEXT: .LBB15_3: # %cond.store1 6452; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6453; AVX512F-NEXT: testb $4, %al 6454; AVX512F-NEXT: je .LBB15_6 6455; AVX512F-NEXT: .LBB15_5: # %cond.store3 6456; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6457; AVX512F-NEXT: testb $8, %al 6458; AVX512F-NEXT: je .LBB15_8 6459; AVX512F-NEXT: .LBB15_7: # %cond.store5 6460; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6461; AVX512F-NEXT: testb $16, %al 6462; AVX512F-NEXT: je .LBB15_10 6463; AVX512F-NEXT: .LBB15_9: # %cond.store7 6464; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6465; AVX512F-NEXT: testb $32, %al 6466; AVX512F-NEXT: je .LBB15_12 6467; AVX512F-NEXT: .LBB15_11: # %cond.store9 6468; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6469; AVX512F-NEXT: testb $64, %al 6470; AVX512F-NEXT: je .LBB15_14 6471; AVX512F-NEXT: .LBB15_13: # %cond.store11 6472; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6473; AVX512F-NEXT: testb $-128, %al 6474; AVX512F-NEXT: je .LBB15_16 6475; AVX512F-NEXT: .LBB15_15: # %cond.store13 6476; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6477; AVX512F-NEXT: testl $256, %eax # imm = 0x100 6478; AVX512F-NEXT: je .LBB15_18 6479; AVX512F-NEXT: .LBB15_17: # %cond.store15 6480; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6481; AVX512F-NEXT: testl $512, %eax # imm = 0x200 6482; AVX512F-NEXT: je .LBB15_20 6483; AVX512F-NEXT: .LBB15_19: # %cond.store17 6484; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6485; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 6486; AVX512F-NEXT: je .LBB15_22 6487; AVX512F-NEXT: .LBB15_21: # %cond.store19 6488; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6489; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 6490; AVX512F-NEXT: je .LBB15_24 6491; AVX512F-NEXT: .LBB15_23: # %cond.store21 6492; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6493; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 6494; AVX512F-NEXT: je .LBB15_26 6495; AVX512F-NEXT: .LBB15_25: # %cond.store23 6496; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6497; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 6498; AVX512F-NEXT: je .LBB15_28 6499; AVX512F-NEXT: .LBB15_27: # %cond.store25 6500; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6501; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 6502; AVX512F-NEXT: je .LBB15_30 6503; AVX512F-NEXT: .LBB15_29: # %cond.store27 6504; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6505; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 6506; AVX512F-NEXT: jne .LBB15_31 6507; AVX512F-NEXT: jmp .LBB15_32 6508; AVX512F-NEXT: .LBB15_33: # %cond.store31 6509; AVX512F-NEXT: vpextrb $0, %xmm0, 16(%rdi) 6510; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 6511; AVX512F-NEXT: je .LBB15_36 6512; AVX512F-NEXT: .LBB15_35: # %cond.store33 6513; AVX512F-NEXT: vpextrb $1, %xmm0, 17(%rdi) 6514; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 6515; AVX512F-NEXT: je .LBB15_38 6516; AVX512F-NEXT: .LBB15_37: # %cond.store35 6517; AVX512F-NEXT: vpextrb $2, %xmm0, 18(%rdi) 6518; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 6519; AVX512F-NEXT: je .LBB15_40 6520; AVX512F-NEXT: .LBB15_39: # %cond.store37 6521; AVX512F-NEXT: vpextrb $3, %xmm0, 19(%rdi) 6522; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 6523; AVX512F-NEXT: je .LBB15_42 6524; AVX512F-NEXT: .LBB15_41: # %cond.store39 6525; AVX512F-NEXT: vpextrb $4, %xmm0, 20(%rdi) 6526; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 6527; AVX512F-NEXT: je .LBB15_44 6528; AVX512F-NEXT: .LBB15_43: # %cond.store41 6529; AVX512F-NEXT: vpextrb $5, %xmm0, 21(%rdi) 6530; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 6531; AVX512F-NEXT: je .LBB15_46 6532; AVX512F-NEXT: .LBB15_45: # %cond.store43 6533; AVX512F-NEXT: vpextrb $6, %xmm0, 22(%rdi) 6534; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 6535; AVX512F-NEXT: je .LBB15_48 6536; AVX512F-NEXT: .LBB15_47: # %cond.store45 6537; AVX512F-NEXT: vpextrb $7, %xmm0, 23(%rdi) 6538; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 6539; AVX512F-NEXT: je .LBB15_50 6540; AVX512F-NEXT: .LBB15_49: # %cond.store47 6541; AVX512F-NEXT: vpextrb $8, %xmm0, 24(%rdi) 6542; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 6543; AVX512F-NEXT: je .LBB15_52 6544; AVX512F-NEXT: .LBB15_51: # %cond.store49 6545; AVX512F-NEXT: vpextrb $9, %xmm0, 25(%rdi) 6546; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 6547; AVX512F-NEXT: je .LBB15_54 6548; AVX512F-NEXT: .LBB15_53: # %cond.store51 6549; AVX512F-NEXT: vpextrb $10, %xmm0, 26(%rdi) 6550; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 6551; AVX512F-NEXT: je .LBB15_56 6552; AVX512F-NEXT: .LBB15_55: # %cond.store53 6553; AVX512F-NEXT: vpextrb $11, %xmm0, 27(%rdi) 6554; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 6555; AVX512F-NEXT: je .LBB15_58 6556; AVX512F-NEXT: .LBB15_57: # %cond.store55 6557; AVX512F-NEXT: vpextrb $12, %xmm0, 28(%rdi) 6558; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 6559; AVX512F-NEXT: je .LBB15_60 6560; AVX512F-NEXT: .LBB15_59: # %cond.store57 6561; AVX512F-NEXT: vpextrb $13, %xmm0, 29(%rdi) 6562; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 6563; AVX512F-NEXT: je .LBB15_62 6564; AVX512F-NEXT: .LBB15_61: # %cond.store59 6565; AVX512F-NEXT: vpextrb $14, %xmm0, 30(%rdi) 6566; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 6567; AVX512F-NEXT: je .LBB15_64 6568; AVX512F-NEXT: .LBB15_63: # %cond.store61 6569; AVX512F-NEXT: vpextrb $15, %xmm0, 31(%rdi) 6570; AVX512F-NEXT: vzeroupper 6571; AVX512F-NEXT: retq 6572; 6573; AVX512BW-LABEL: truncstore_v32i16_v32i8: 6574; AVX512BW: # %bb.0: 6575; AVX512BW-NEXT: # kill: def $ymm1 killed $ymm1 def $zmm1 6576; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k1 6577; AVX512BW-NEXT: vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 6578; AVX512BW-NEXT: vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 6579; AVX512BW-NEXT: vpmovwb %zmm0, (%rdi) {%k1} 6580; AVX512BW-NEXT: vzeroupper 6581; AVX512BW-NEXT: retq 6582; 6583; AVX512BWVL-LABEL: truncstore_v32i16_v32i8: 6584; AVX512BWVL: # %bb.0: 6585; AVX512BWVL-NEXT: vptestmb %ymm1, %ymm1, %k1 6586; AVX512BWVL-NEXT: vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 6587; AVX512BWVL-NEXT: vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %zmm0, %zmm0 6588; AVX512BWVL-NEXT: vpmovwb %zmm0, (%rdi) {%k1} 6589; AVX512BWVL-NEXT: vzeroupper 6590; AVX512BWVL-NEXT: retq 6591 %a = icmp ne <32 x i8> %mask, zeroinitializer 6592 %b = icmp slt <32 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 6593 %c = select <32 x i1> %b, <32 x i16> %x, <32 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 6594 %d = icmp sgt <32 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 6595 %e = select <32 x i1> %d, <32 x i16> %c, <32 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 6596 %f = trunc <32 x i16> %e to <32 x i8> 6597 call void @llvm.masked.store.v32i8.p0v32i8(<32 x i8> %f, <32 x i8>* %p, i32 1, <32 x i1> %a) 6598 ret void 6599} 6600 6601define void @truncstore_v16i16_v16i8(<16 x i16> %x, <16 x i8>* %p, <16 x i8> %mask) { 6602; SSE2-LABEL: truncstore_v16i16_v16i8: 6603; SSE2: # %bb.0: 6604; SSE2-NEXT: pxor %xmm3, %xmm3 6605; SSE2-NEXT: packsswb %xmm1, %xmm0 6606; SSE2-NEXT: pcmpeqb %xmm2, %xmm3 6607; SSE2-NEXT: pmovmskb %xmm3, %eax 6608; SSE2-NEXT: xorl $65535, %eax # imm = 0xFFFF 6609; SSE2-NEXT: testb $1, %al 6610; SSE2-NEXT: movd %xmm0, %ecx 6611; SSE2-NEXT: jne .LBB16_1 6612; SSE2-NEXT: # %bb.2: # %else 6613; SSE2-NEXT: testb $2, %al 6614; SSE2-NEXT: jne .LBB16_3 6615; SSE2-NEXT: .LBB16_4: # %else2 6616; SSE2-NEXT: testb $4, %al 6617; SSE2-NEXT: jne .LBB16_5 6618; SSE2-NEXT: .LBB16_6: # %else4 6619; SSE2-NEXT: testb $8, %al 6620; SSE2-NEXT: je .LBB16_8 6621; SSE2-NEXT: .LBB16_7: # %cond.store5 6622; SSE2-NEXT: shrl $24, %ecx 6623; SSE2-NEXT: movb %cl, 3(%rdi) 6624; SSE2-NEXT: .LBB16_8: # %else6 6625; SSE2-NEXT: testb $16, %al 6626; SSE2-NEXT: pextrw $2, %xmm0, %ecx 6627; SSE2-NEXT: je .LBB16_10 6628; SSE2-NEXT: # %bb.9: # %cond.store7 6629; SSE2-NEXT: movb %cl, 4(%rdi) 6630; SSE2-NEXT: .LBB16_10: # %else8 6631; SSE2-NEXT: testb $32, %al 6632; SSE2-NEXT: je .LBB16_12 6633; SSE2-NEXT: # %bb.11: # %cond.store9 6634; SSE2-NEXT: movb %ch, 5(%rdi) 6635; SSE2-NEXT: .LBB16_12: # %else10 6636; SSE2-NEXT: testb $64, %al 6637; SSE2-NEXT: pextrw $3, %xmm0, %ecx 6638; SSE2-NEXT: je .LBB16_14 6639; SSE2-NEXT: # %bb.13: # %cond.store11 6640; SSE2-NEXT: movb %cl, 6(%rdi) 6641; SSE2-NEXT: .LBB16_14: # %else12 6642; SSE2-NEXT: testb $-128, %al 6643; SSE2-NEXT: je .LBB16_16 6644; SSE2-NEXT: # %bb.15: # %cond.store13 6645; SSE2-NEXT: movb %ch, 7(%rdi) 6646; SSE2-NEXT: .LBB16_16: # %else14 6647; SSE2-NEXT: testl $256, %eax # imm = 0x100 6648; SSE2-NEXT: pextrw $4, %xmm0, %ecx 6649; SSE2-NEXT: je .LBB16_18 6650; SSE2-NEXT: # %bb.17: # %cond.store15 6651; SSE2-NEXT: movb %cl, 8(%rdi) 6652; SSE2-NEXT: .LBB16_18: # %else16 6653; SSE2-NEXT: testl $512, %eax # imm = 0x200 6654; SSE2-NEXT: je .LBB16_20 6655; SSE2-NEXT: # %bb.19: # %cond.store17 6656; SSE2-NEXT: movb %ch, 9(%rdi) 6657; SSE2-NEXT: .LBB16_20: # %else18 6658; SSE2-NEXT: testl $1024, %eax # imm = 0x400 6659; SSE2-NEXT: pextrw $5, %xmm0, %ecx 6660; SSE2-NEXT: je .LBB16_22 6661; SSE2-NEXT: # %bb.21: # %cond.store19 6662; SSE2-NEXT: movb %cl, 10(%rdi) 6663; SSE2-NEXT: .LBB16_22: # %else20 6664; SSE2-NEXT: testl $2048, %eax # imm = 0x800 6665; SSE2-NEXT: je .LBB16_24 6666; SSE2-NEXT: # %bb.23: # %cond.store21 6667; SSE2-NEXT: movb %ch, 11(%rdi) 6668; SSE2-NEXT: .LBB16_24: # %else22 6669; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 6670; SSE2-NEXT: pextrw $6, %xmm0, %ecx 6671; SSE2-NEXT: je .LBB16_26 6672; SSE2-NEXT: # %bb.25: # %cond.store23 6673; SSE2-NEXT: movb %cl, 12(%rdi) 6674; SSE2-NEXT: .LBB16_26: # %else24 6675; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 6676; SSE2-NEXT: je .LBB16_28 6677; SSE2-NEXT: # %bb.27: # %cond.store25 6678; SSE2-NEXT: movb %ch, 13(%rdi) 6679; SSE2-NEXT: .LBB16_28: # %else26 6680; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 6681; SSE2-NEXT: pextrw $7, %xmm0, %ecx 6682; SSE2-NEXT: jne .LBB16_29 6683; SSE2-NEXT: # %bb.30: # %else28 6684; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 6685; SSE2-NEXT: jne .LBB16_31 6686; SSE2-NEXT: .LBB16_32: # %else30 6687; SSE2-NEXT: retq 6688; SSE2-NEXT: .LBB16_1: # %cond.store 6689; SSE2-NEXT: movb %cl, (%rdi) 6690; SSE2-NEXT: testb $2, %al 6691; SSE2-NEXT: je .LBB16_4 6692; SSE2-NEXT: .LBB16_3: # %cond.store1 6693; SSE2-NEXT: movb %ch, 1(%rdi) 6694; SSE2-NEXT: testb $4, %al 6695; SSE2-NEXT: je .LBB16_6 6696; SSE2-NEXT: .LBB16_5: # %cond.store3 6697; SSE2-NEXT: movl %ecx, %edx 6698; SSE2-NEXT: shrl $16, %edx 6699; SSE2-NEXT: movb %dl, 2(%rdi) 6700; SSE2-NEXT: testb $8, %al 6701; SSE2-NEXT: jne .LBB16_7 6702; SSE2-NEXT: jmp .LBB16_8 6703; SSE2-NEXT: .LBB16_29: # %cond.store27 6704; SSE2-NEXT: movb %cl, 14(%rdi) 6705; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 6706; SSE2-NEXT: je .LBB16_32 6707; SSE2-NEXT: .LBB16_31: # %cond.store29 6708; SSE2-NEXT: movb %ch, 15(%rdi) 6709; SSE2-NEXT: retq 6710; 6711; SSE4-LABEL: truncstore_v16i16_v16i8: 6712; SSE4: # %bb.0: 6713; SSE4-NEXT: pxor %xmm3, %xmm3 6714; SSE4-NEXT: packsswb %xmm1, %xmm0 6715; SSE4-NEXT: pcmpeqb %xmm2, %xmm3 6716; SSE4-NEXT: pmovmskb %xmm3, %eax 6717; SSE4-NEXT: xorl $65535, %eax # imm = 0xFFFF 6718; SSE4-NEXT: testb $1, %al 6719; SSE4-NEXT: jne .LBB16_1 6720; SSE4-NEXT: # %bb.2: # %else 6721; SSE4-NEXT: testb $2, %al 6722; SSE4-NEXT: jne .LBB16_3 6723; SSE4-NEXT: .LBB16_4: # %else2 6724; SSE4-NEXT: testb $4, %al 6725; SSE4-NEXT: jne .LBB16_5 6726; SSE4-NEXT: .LBB16_6: # %else4 6727; SSE4-NEXT: testb $8, %al 6728; SSE4-NEXT: jne .LBB16_7 6729; SSE4-NEXT: .LBB16_8: # %else6 6730; SSE4-NEXT: testb $16, %al 6731; SSE4-NEXT: jne .LBB16_9 6732; SSE4-NEXT: .LBB16_10: # %else8 6733; SSE4-NEXT: testb $32, %al 6734; SSE4-NEXT: jne .LBB16_11 6735; SSE4-NEXT: .LBB16_12: # %else10 6736; SSE4-NEXT: testb $64, %al 6737; SSE4-NEXT: jne .LBB16_13 6738; SSE4-NEXT: .LBB16_14: # %else12 6739; SSE4-NEXT: testb $-128, %al 6740; SSE4-NEXT: jne .LBB16_15 6741; SSE4-NEXT: .LBB16_16: # %else14 6742; SSE4-NEXT: testl $256, %eax # imm = 0x100 6743; SSE4-NEXT: jne .LBB16_17 6744; SSE4-NEXT: .LBB16_18: # %else16 6745; SSE4-NEXT: testl $512, %eax # imm = 0x200 6746; SSE4-NEXT: jne .LBB16_19 6747; SSE4-NEXT: .LBB16_20: # %else18 6748; SSE4-NEXT: testl $1024, %eax # imm = 0x400 6749; SSE4-NEXT: jne .LBB16_21 6750; SSE4-NEXT: .LBB16_22: # %else20 6751; SSE4-NEXT: testl $2048, %eax # imm = 0x800 6752; SSE4-NEXT: jne .LBB16_23 6753; SSE4-NEXT: .LBB16_24: # %else22 6754; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 6755; SSE4-NEXT: jne .LBB16_25 6756; SSE4-NEXT: .LBB16_26: # %else24 6757; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 6758; SSE4-NEXT: jne .LBB16_27 6759; SSE4-NEXT: .LBB16_28: # %else26 6760; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 6761; SSE4-NEXT: jne .LBB16_29 6762; SSE4-NEXT: .LBB16_30: # %else28 6763; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 6764; SSE4-NEXT: jne .LBB16_31 6765; SSE4-NEXT: .LBB16_32: # %else30 6766; SSE4-NEXT: retq 6767; SSE4-NEXT: .LBB16_1: # %cond.store 6768; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 6769; SSE4-NEXT: testb $2, %al 6770; SSE4-NEXT: je .LBB16_4 6771; SSE4-NEXT: .LBB16_3: # %cond.store1 6772; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 6773; SSE4-NEXT: testb $4, %al 6774; SSE4-NEXT: je .LBB16_6 6775; SSE4-NEXT: .LBB16_5: # %cond.store3 6776; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 6777; SSE4-NEXT: testb $8, %al 6778; SSE4-NEXT: je .LBB16_8 6779; SSE4-NEXT: .LBB16_7: # %cond.store5 6780; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 6781; SSE4-NEXT: testb $16, %al 6782; SSE4-NEXT: je .LBB16_10 6783; SSE4-NEXT: .LBB16_9: # %cond.store7 6784; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 6785; SSE4-NEXT: testb $32, %al 6786; SSE4-NEXT: je .LBB16_12 6787; SSE4-NEXT: .LBB16_11: # %cond.store9 6788; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 6789; SSE4-NEXT: testb $64, %al 6790; SSE4-NEXT: je .LBB16_14 6791; SSE4-NEXT: .LBB16_13: # %cond.store11 6792; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 6793; SSE4-NEXT: testb $-128, %al 6794; SSE4-NEXT: je .LBB16_16 6795; SSE4-NEXT: .LBB16_15: # %cond.store13 6796; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 6797; SSE4-NEXT: testl $256, %eax # imm = 0x100 6798; SSE4-NEXT: je .LBB16_18 6799; SSE4-NEXT: .LBB16_17: # %cond.store15 6800; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) 6801; SSE4-NEXT: testl $512, %eax # imm = 0x200 6802; SSE4-NEXT: je .LBB16_20 6803; SSE4-NEXT: .LBB16_19: # %cond.store17 6804; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) 6805; SSE4-NEXT: testl $1024, %eax # imm = 0x400 6806; SSE4-NEXT: je .LBB16_22 6807; SSE4-NEXT: .LBB16_21: # %cond.store19 6808; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) 6809; SSE4-NEXT: testl $2048, %eax # imm = 0x800 6810; SSE4-NEXT: je .LBB16_24 6811; SSE4-NEXT: .LBB16_23: # %cond.store21 6812; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) 6813; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 6814; SSE4-NEXT: je .LBB16_26 6815; SSE4-NEXT: .LBB16_25: # %cond.store23 6816; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) 6817; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 6818; SSE4-NEXT: je .LBB16_28 6819; SSE4-NEXT: .LBB16_27: # %cond.store25 6820; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) 6821; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 6822; SSE4-NEXT: je .LBB16_30 6823; SSE4-NEXT: .LBB16_29: # %cond.store27 6824; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) 6825; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 6826; SSE4-NEXT: je .LBB16_32 6827; SSE4-NEXT: .LBB16_31: # %cond.store29 6828; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) 6829; SSE4-NEXT: retq 6830; 6831; AVX1-LABEL: truncstore_v16i16_v16i8: 6832; AVX1: # %bb.0: 6833; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 6834; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 6835; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 6836; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 6837; AVX1-NEXT: vpmovmskb %xmm1, %eax 6838; AVX1-NEXT: xorl $65535, %eax # imm = 0xFFFF 6839; AVX1-NEXT: testb $1, %al 6840; AVX1-NEXT: jne .LBB16_1 6841; AVX1-NEXT: # %bb.2: # %else 6842; AVX1-NEXT: testb $2, %al 6843; AVX1-NEXT: jne .LBB16_3 6844; AVX1-NEXT: .LBB16_4: # %else2 6845; AVX1-NEXT: testb $4, %al 6846; AVX1-NEXT: jne .LBB16_5 6847; AVX1-NEXT: .LBB16_6: # %else4 6848; AVX1-NEXT: testb $8, %al 6849; AVX1-NEXT: jne .LBB16_7 6850; AVX1-NEXT: .LBB16_8: # %else6 6851; AVX1-NEXT: testb $16, %al 6852; AVX1-NEXT: jne .LBB16_9 6853; AVX1-NEXT: .LBB16_10: # %else8 6854; AVX1-NEXT: testb $32, %al 6855; AVX1-NEXT: jne .LBB16_11 6856; AVX1-NEXT: .LBB16_12: # %else10 6857; AVX1-NEXT: testb $64, %al 6858; AVX1-NEXT: jne .LBB16_13 6859; AVX1-NEXT: .LBB16_14: # %else12 6860; AVX1-NEXT: testb $-128, %al 6861; AVX1-NEXT: jne .LBB16_15 6862; AVX1-NEXT: .LBB16_16: # %else14 6863; AVX1-NEXT: testl $256, %eax # imm = 0x100 6864; AVX1-NEXT: jne .LBB16_17 6865; AVX1-NEXT: .LBB16_18: # %else16 6866; AVX1-NEXT: testl $512, %eax # imm = 0x200 6867; AVX1-NEXT: jne .LBB16_19 6868; AVX1-NEXT: .LBB16_20: # %else18 6869; AVX1-NEXT: testl $1024, %eax # imm = 0x400 6870; AVX1-NEXT: jne .LBB16_21 6871; AVX1-NEXT: .LBB16_22: # %else20 6872; AVX1-NEXT: testl $2048, %eax # imm = 0x800 6873; AVX1-NEXT: jne .LBB16_23 6874; AVX1-NEXT: .LBB16_24: # %else22 6875; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 6876; AVX1-NEXT: jne .LBB16_25 6877; AVX1-NEXT: .LBB16_26: # %else24 6878; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 6879; AVX1-NEXT: jne .LBB16_27 6880; AVX1-NEXT: .LBB16_28: # %else26 6881; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 6882; AVX1-NEXT: jne .LBB16_29 6883; AVX1-NEXT: .LBB16_30: # %else28 6884; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 6885; AVX1-NEXT: jne .LBB16_31 6886; AVX1-NEXT: .LBB16_32: # %else30 6887; AVX1-NEXT: vzeroupper 6888; AVX1-NEXT: retq 6889; AVX1-NEXT: .LBB16_1: # %cond.store 6890; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) 6891; AVX1-NEXT: testb $2, %al 6892; AVX1-NEXT: je .LBB16_4 6893; AVX1-NEXT: .LBB16_3: # %cond.store1 6894; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) 6895; AVX1-NEXT: testb $4, %al 6896; AVX1-NEXT: je .LBB16_6 6897; AVX1-NEXT: .LBB16_5: # %cond.store3 6898; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) 6899; AVX1-NEXT: testb $8, %al 6900; AVX1-NEXT: je .LBB16_8 6901; AVX1-NEXT: .LBB16_7: # %cond.store5 6902; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) 6903; AVX1-NEXT: testb $16, %al 6904; AVX1-NEXT: je .LBB16_10 6905; AVX1-NEXT: .LBB16_9: # %cond.store7 6906; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) 6907; AVX1-NEXT: testb $32, %al 6908; AVX1-NEXT: je .LBB16_12 6909; AVX1-NEXT: .LBB16_11: # %cond.store9 6910; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) 6911; AVX1-NEXT: testb $64, %al 6912; AVX1-NEXT: je .LBB16_14 6913; AVX1-NEXT: .LBB16_13: # %cond.store11 6914; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) 6915; AVX1-NEXT: testb $-128, %al 6916; AVX1-NEXT: je .LBB16_16 6917; AVX1-NEXT: .LBB16_15: # %cond.store13 6918; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) 6919; AVX1-NEXT: testl $256, %eax # imm = 0x100 6920; AVX1-NEXT: je .LBB16_18 6921; AVX1-NEXT: .LBB16_17: # %cond.store15 6922; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) 6923; AVX1-NEXT: testl $512, %eax # imm = 0x200 6924; AVX1-NEXT: je .LBB16_20 6925; AVX1-NEXT: .LBB16_19: # %cond.store17 6926; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) 6927; AVX1-NEXT: testl $1024, %eax # imm = 0x400 6928; AVX1-NEXT: je .LBB16_22 6929; AVX1-NEXT: .LBB16_21: # %cond.store19 6930; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) 6931; AVX1-NEXT: testl $2048, %eax # imm = 0x800 6932; AVX1-NEXT: je .LBB16_24 6933; AVX1-NEXT: .LBB16_23: # %cond.store21 6934; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) 6935; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 6936; AVX1-NEXT: je .LBB16_26 6937; AVX1-NEXT: .LBB16_25: # %cond.store23 6938; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) 6939; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 6940; AVX1-NEXT: je .LBB16_28 6941; AVX1-NEXT: .LBB16_27: # %cond.store25 6942; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) 6943; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 6944; AVX1-NEXT: je .LBB16_30 6945; AVX1-NEXT: .LBB16_29: # %cond.store27 6946; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) 6947; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 6948; AVX1-NEXT: je .LBB16_32 6949; AVX1-NEXT: .LBB16_31: # %cond.store29 6950; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) 6951; AVX1-NEXT: vzeroupper 6952; AVX1-NEXT: retq 6953; 6954; AVX2-LABEL: truncstore_v16i16_v16i8: 6955; AVX2: # %bb.0: 6956; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 6957; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 6958; AVX2-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 6959; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 6960; AVX2-NEXT: vpmovmskb %xmm1, %eax 6961; AVX2-NEXT: xorl $65535, %eax # imm = 0xFFFF 6962; AVX2-NEXT: testb $1, %al 6963; AVX2-NEXT: jne .LBB16_1 6964; AVX2-NEXT: # %bb.2: # %else 6965; AVX2-NEXT: testb $2, %al 6966; AVX2-NEXT: jne .LBB16_3 6967; AVX2-NEXT: .LBB16_4: # %else2 6968; AVX2-NEXT: testb $4, %al 6969; AVX2-NEXT: jne .LBB16_5 6970; AVX2-NEXT: .LBB16_6: # %else4 6971; AVX2-NEXT: testb $8, %al 6972; AVX2-NEXT: jne .LBB16_7 6973; AVX2-NEXT: .LBB16_8: # %else6 6974; AVX2-NEXT: testb $16, %al 6975; AVX2-NEXT: jne .LBB16_9 6976; AVX2-NEXT: .LBB16_10: # %else8 6977; AVX2-NEXT: testb $32, %al 6978; AVX2-NEXT: jne .LBB16_11 6979; AVX2-NEXT: .LBB16_12: # %else10 6980; AVX2-NEXT: testb $64, %al 6981; AVX2-NEXT: jne .LBB16_13 6982; AVX2-NEXT: .LBB16_14: # %else12 6983; AVX2-NEXT: testb $-128, %al 6984; AVX2-NEXT: jne .LBB16_15 6985; AVX2-NEXT: .LBB16_16: # %else14 6986; AVX2-NEXT: testl $256, %eax # imm = 0x100 6987; AVX2-NEXT: jne .LBB16_17 6988; AVX2-NEXT: .LBB16_18: # %else16 6989; AVX2-NEXT: testl $512, %eax # imm = 0x200 6990; AVX2-NEXT: jne .LBB16_19 6991; AVX2-NEXT: .LBB16_20: # %else18 6992; AVX2-NEXT: testl $1024, %eax # imm = 0x400 6993; AVX2-NEXT: jne .LBB16_21 6994; AVX2-NEXT: .LBB16_22: # %else20 6995; AVX2-NEXT: testl $2048, %eax # imm = 0x800 6996; AVX2-NEXT: jne .LBB16_23 6997; AVX2-NEXT: .LBB16_24: # %else22 6998; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 6999; AVX2-NEXT: jne .LBB16_25 7000; AVX2-NEXT: .LBB16_26: # %else24 7001; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 7002; AVX2-NEXT: jne .LBB16_27 7003; AVX2-NEXT: .LBB16_28: # %else26 7004; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 7005; AVX2-NEXT: jne .LBB16_29 7006; AVX2-NEXT: .LBB16_30: # %else28 7007; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 7008; AVX2-NEXT: jne .LBB16_31 7009; AVX2-NEXT: .LBB16_32: # %else30 7010; AVX2-NEXT: vzeroupper 7011; AVX2-NEXT: retq 7012; AVX2-NEXT: .LBB16_1: # %cond.store 7013; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) 7014; AVX2-NEXT: testb $2, %al 7015; AVX2-NEXT: je .LBB16_4 7016; AVX2-NEXT: .LBB16_3: # %cond.store1 7017; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) 7018; AVX2-NEXT: testb $4, %al 7019; AVX2-NEXT: je .LBB16_6 7020; AVX2-NEXT: .LBB16_5: # %cond.store3 7021; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) 7022; AVX2-NEXT: testb $8, %al 7023; AVX2-NEXT: je .LBB16_8 7024; AVX2-NEXT: .LBB16_7: # %cond.store5 7025; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) 7026; AVX2-NEXT: testb $16, %al 7027; AVX2-NEXT: je .LBB16_10 7028; AVX2-NEXT: .LBB16_9: # %cond.store7 7029; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) 7030; AVX2-NEXT: testb $32, %al 7031; AVX2-NEXT: je .LBB16_12 7032; AVX2-NEXT: .LBB16_11: # %cond.store9 7033; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) 7034; AVX2-NEXT: testb $64, %al 7035; AVX2-NEXT: je .LBB16_14 7036; AVX2-NEXT: .LBB16_13: # %cond.store11 7037; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) 7038; AVX2-NEXT: testb $-128, %al 7039; AVX2-NEXT: je .LBB16_16 7040; AVX2-NEXT: .LBB16_15: # %cond.store13 7041; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) 7042; AVX2-NEXT: testl $256, %eax # imm = 0x100 7043; AVX2-NEXT: je .LBB16_18 7044; AVX2-NEXT: .LBB16_17: # %cond.store15 7045; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) 7046; AVX2-NEXT: testl $512, %eax # imm = 0x200 7047; AVX2-NEXT: je .LBB16_20 7048; AVX2-NEXT: .LBB16_19: # %cond.store17 7049; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) 7050; AVX2-NEXT: testl $1024, %eax # imm = 0x400 7051; AVX2-NEXT: je .LBB16_22 7052; AVX2-NEXT: .LBB16_21: # %cond.store19 7053; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) 7054; AVX2-NEXT: testl $2048, %eax # imm = 0x800 7055; AVX2-NEXT: je .LBB16_24 7056; AVX2-NEXT: .LBB16_23: # %cond.store21 7057; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) 7058; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 7059; AVX2-NEXT: je .LBB16_26 7060; AVX2-NEXT: .LBB16_25: # %cond.store23 7061; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) 7062; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 7063; AVX2-NEXT: je .LBB16_28 7064; AVX2-NEXT: .LBB16_27: # %cond.store25 7065; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) 7066; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 7067; AVX2-NEXT: je .LBB16_30 7068; AVX2-NEXT: .LBB16_29: # %cond.store27 7069; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) 7070; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 7071; AVX2-NEXT: je .LBB16_32 7072; AVX2-NEXT: .LBB16_31: # %cond.store29 7073; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) 7074; AVX2-NEXT: vzeroupper 7075; AVX2-NEXT: retq 7076; 7077; AVX512F-LABEL: truncstore_v16i16_v16i8: 7078; AVX512F: # %bb.0: 7079; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 7080; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 7081; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2 7082; AVX512F-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 7083; AVX512F-NEXT: vpmovmskb %xmm1, %eax 7084; AVX512F-NEXT: xorl $65535, %eax # imm = 0xFFFF 7085; AVX512F-NEXT: testb $1, %al 7086; AVX512F-NEXT: jne .LBB16_1 7087; AVX512F-NEXT: # %bb.2: # %else 7088; AVX512F-NEXT: testb $2, %al 7089; AVX512F-NEXT: jne .LBB16_3 7090; AVX512F-NEXT: .LBB16_4: # %else2 7091; AVX512F-NEXT: testb $4, %al 7092; AVX512F-NEXT: jne .LBB16_5 7093; AVX512F-NEXT: .LBB16_6: # %else4 7094; AVX512F-NEXT: testb $8, %al 7095; AVX512F-NEXT: jne .LBB16_7 7096; AVX512F-NEXT: .LBB16_8: # %else6 7097; AVX512F-NEXT: testb $16, %al 7098; AVX512F-NEXT: jne .LBB16_9 7099; AVX512F-NEXT: .LBB16_10: # %else8 7100; AVX512F-NEXT: testb $32, %al 7101; AVX512F-NEXT: jne .LBB16_11 7102; AVX512F-NEXT: .LBB16_12: # %else10 7103; AVX512F-NEXT: testb $64, %al 7104; AVX512F-NEXT: jne .LBB16_13 7105; AVX512F-NEXT: .LBB16_14: # %else12 7106; AVX512F-NEXT: testb $-128, %al 7107; AVX512F-NEXT: jne .LBB16_15 7108; AVX512F-NEXT: .LBB16_16: # %else14 7109; AVX512F-NEXT: testl $256, %eax # imm = 0x100 7110; AVX512F-NEXT: jne .LBB16_17 7111; AVX512F-NEXT: .LBB16_18: # %else16 7112; AVX512F-NEXT: testl $512, %eax # imm = 0x200 7113; AVX512F-NEXT: jne .LBB16_19 7114; AVX512F-NEXT: .LBB16_20: # %else18 7115; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 7116; AVX512F-NEXT: jne .LBB16_21 7117; AVX512F-NEXT: .LBB16_22: # %else20 7118; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 7119; AVX512F-NEXT: jne .LBB16_23 7120; AVX512F-NEXT: .LBB16_24: # %else22 7121; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 7122; AVX512F-NEXT: jne .LBB16_25 7123; AVX512F-NEXT: .LBB16_26: # %else24 7124; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 7125; AVX512F-NEXT: jne .LBB16_27 7126; AVX512F-NEXT: .LBB16_28: # %else26 7127; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 7128; AVX512F-NEXT: jne .LBB16_29 7129; AVX512F-NEXT: .LBB16_30: # %else28 7130; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 7131; AVX512F-NEXT: jne .LBB16_31 7132; AVX512F-NEXT: .LBB16_32: # %else30 7133; AVX512F-NEXT: vzeroupper 7134; AVX512F-NEXT: retq 7135; AVX512F-NEXT: .LBB16_1: # %cond.store 7136; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 7137; AVX512F-NEXT: testb $2, %al 7138; AVX512F-NEXT: je .LBB16_4 7139; AVX512F-NEXT: .LBB16_3: # %cond.store1 7140; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 7141; AVX512F-NEXT: testb $4, %al 7142; AVX512F-NEXT: je .LBB16_6 7143; AVX512F-NEXT: .LBB16_5: # %cond.store3 7144; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 7145; AVX512F-NEXT: testb $8, %al 7146; AVX512F-NEXT: je .LBB16_8 7147; AVX512F-NEXT: .LBB16_7: # %cond.store5 7148; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 7149; AVX512F-NEXT: testb $16, %al 7150; AVX512F-NEXT: je .LBB16_10 7151; AVX512F-NEXT: .LBB16_9: # %cond.store7 7152; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 7153; AVX512F-NEXT: testb $32, %al 7154; AVX512F-NEXT: je .LBB16_12 7155; AVX512F-NEXT: .LBB16_11: # %cond.store9 7156; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 7157; AVX512F-NEXT: testb $64, %al 7158; AVX512F-NEXT: je .LBB16_14 7159; AVX512F-NEXT: .LBB16_13: # %cond.store11 7160; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 7161; AVX512F-NEXT: testb $-128, %al 7162; AVX512F-NEXT: je .LBB16_16 7163; AVX512F-NEXT: .LBB16_15: # %cond.store13 7164; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 7165; AVX512F-NEXT: testl $256, %eax # imm = 0x100 7166; AVX512F-NEXT: je .LBB16_18 7167; AVX512F-NEXT: .LBB16_17: # %cond.store15 7168; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) 7169; AVX512F-NEXT: testl $512, %eax # imm = 0x200 7170; AVX512F-NEXT: je .LBB16_20 7171; AVX512F-NEXT: .LBB16_19: # %cond.store17 7172; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) 7173; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 7174; AVX512F-NEXT: je .LBB16_22 7175; AVX512F-NEXT: .LBB16_21: # %cond.store19 7176; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) 7177; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 7178; AVX512F-NEXT: je .LBB16_24 7179; AVX512F-NEXT: .LBB16_23: # %cond.store21 7180; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) 7181; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 7182; AVX512F-NEXT: je .LBB16_26 7183; AVX512F-NEXT: .LBB16_25: # %cond.store23 7184; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) 7185; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 7186; AVX512F-NEXT: je .LBB16_28 7187; AVX512F-NEXT: .LBB16_27: # %cond.store25 7188; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) 7189; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 7190; AVX512F-NEXT: je .LBB16_30 7191; AVX512F-NEXT: .LBB16_29: # %cond.store27 7192; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) 7193; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 7194; AVX512F-NEXT: je .LBB16_32 7195; AVX512F-NEXT: .LBB16_31: # %cond.store29 7196; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) 7197; AVX512F-NEXT: vzeroupper 7198; AVX512F-NEXT: retq 7199; 7200; AVX512BW-LABEL: truncstore_v16i16_v16i8: 7201; AVX512BW: # %bb.0: 7202; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 7203; AVX512BW-NEXT: vptestmb %zmm1, %zmm1, %k0 7204; AVX512BW-NEXT: kmovw %k0, %k1 7205; AVX512BW-NEXT: vextracti128 $1, %ymm0, %xmm1 7206; AVX512BW-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 7207; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 7208; AVX512BW-NEXT: vzeroupper 7209; AVX512BW-NEXT: retq 7210; 7211; AVX512BWVL-LABEL: truncstore_v16i16_v16i8: 7212; AVX512BWVL: # %bb.0: 7213; AVX512BWVL-NEXT: vptestmb %xmm1, %xmm1, %k1 7214; AVX512BWVL-NEXT: vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 7215; AVX512BWVL-NEXT: vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0 7216; AVX512BWVL-NEXT: vpmovwb %ymm0, (%rdi) {%k1} 7217; AVX512BWVL-NEXT: vzeroupper 7218; AVX512BWVL-NEXT: retq 7219 %a = icmp ne <16 x i8> %mask, zeroinitializer 7220 %b = icmp slt <16 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 7221 %c = select <16 x i1> %b, <16 x i16> %x, <16 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 7222 %d = icmp sgt <16 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 7223 %e = select <16 x i1> %d, <16 x i16> %c, <16 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 7224 %f = trunc <16 x i16> %e to <16 x i8> 7225 call void @llvm.masked.store.v16i8.p0v16i8(<16 x i8> %f, <16 x i8>* %p, i32 1, <16 x i1> %a) 7226 ret void 7227} 7228 7229define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) { 7230; SSE2-LABEL: truncstore_v8i16_v8i8: 7231; SSE2: # %bb.0: 7232; SSE2-NEXT: pxor %xmm2, %xmm2 7233; SSE2-NEXT: packsswb %xmm0, %xmm0 7234; SSE2-NEXT: pcmpeqw %xmm1, %xmm2 7235; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 7236; SSE2-NEXT: pxor %xmm2, %xmm1 7237; SSE2-NEXT: packsswb %xmm1, %xmm1 7238; SSE2-NEXT: pmovmskb %xmm1, %eax 7239; SSE2-NEXT: testb $1, %al 7240; SSE2-NEXT: movd %xmm0, %ecx 7241; SSE2-NEXT: jne .LBB17_1 7242; SSE2-NEXT: # %bb.2: # %else 7243; SSE2-NEXT: testb $2, %al 7244; SSE2-NEXT: jne .LBB17_3 7245; SSE2-NEXT: .LBB17_4: # %else2 7246; SSE2-NEXT: testb $4, %al 7247; SSE2-NEXT: jne .LBB17_5 7248; SSE2-NEXT: .LBB17_6: # %else4 7249; SSE2-NEXT: testb $8, %al 7250; SSE2-NEXT: je .LBB17_8 7251; SSE2-NEXT: .LBB17_7: # %cond.store5 7252; SSE2-NEXT: shrl $24, %ecx 7253; SSE2-NEXT: movb %cl, 3(%rdi) 7254; SSE2-NEXT: .LBB17_8: # %else6 7255; SSE2-NEXT: testb $16, %al 7256; SSE2-NEXT: pextrw $2, %xmm0, %ecx 7257; SSE2-NEXT: je .LBB17_10 7258; SSE2-NEXT: # %bb.9: # %cond.store7 7259; SSE2-NEXT: movb %cl, 4(%rdi) 7260; SSE2-NEXT: .LBB17_10: # %else8 7261; SSE2-NEXT: testb $32, %al 7262; SSE2-NEXT: je .LBB17_12 7263; SSE2-NEXT: # %bb.11: # %cond.store9 7264; SSE2-NEXT: movb %ch, 5(%rdi) 7265; SSE2-NEXT: .LBB17_12: # %else10 7266; SSE2-NEXT: testb $64, %al 7267; SSE2-NEXT: pextrw $3, %xmm0, %ecx 7268; SSE2-NEXT: jne .LBB17_13 7269; SSE2-NEXT: # %bb.14: # %else12 7270; SSE2-NEXT: testb $-128, %al 7271; SSE2-NEXT: jne .LBB17_15 7272; SSE2-NEXT: .LBB17_16: # %else14 7273; SSE2-NEXT: retq 7274; SSE2-NEXT: .LBB17_1: # %cond.store 7275; SSE2-NEXT: movb %cl, (%rdi) 7276; SSE2-NEXT: testb $2, %al 7277; SSE2-NEXT: je .LBB17_4 7278; SSE2-NEXT: .LBB17_3: # %cond.store1 7279; SSE2-NEXT: movb %ch, 1(%rdi) 7280; SSE2-NEXT: testb $4, %al 7281; SSE2-NEXT: je .LBB17_6 7282; SSE2-NEXT: .LBB17_5: # %cond.store3 7283; SSE2-NEXT: movl %ecx, %edx 7284; SSE2-NEXT: shrl $16, %edx 7285; SSE2-NEXT: movb %dl, 2(%rdi) 7286; SSE2-NEXT: testb $8, %al 7287; SSE2-NEXT: jne .LBB17_7 7288; SSE2-NEXT: jmp .LBB17_8 7289; SSE2-NEXT: .LBB17_13: # %cond.store11 7290; SSE2-NEXT: movb %cl, 6(%rdi) 7291; SSE2-NEXT: testb $-128, %al 7292; SSE2-NEXT: je .LBB17_16 7293; SSE2-NEXT: .LBB17_15: # %cond.store13 7294; SSE2-NEXT: movb %ch, 7(%rdi) 7295; SSE2-NEXT: retq 7296; 7297; SSE4-LABEL: truncstore_v8i16_v8i8: 7298; SSE4: # %bb.0: 7299; SSE4-NEXT: pxor %xmm2, %xmm2 7300; SSE4-NEXT: packsswb %xmm0, %xmm0 7301; SSE4-NEXT: pcmpeqw %xmm1, %xmm2 7302; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 7303; SSE4-NEXT: pxor %xmm2, %xmm1 7304; SSE4-NEXT: packsswb %xmm1, %xmm1 7305; SSE4-NEXT: pmovmskb %xmm1, %eax 7306; SSE4-NEXT: testb $1, %al 7307; SSE4-NEXT: jne .LBB17_1 7308; SSE4-NEXT: # %bb.2: # %else 7309; SSE4-NEXT: testb $2, %al 7310; SSE4-NEXT: jne .LBB17_3 7311; SSE4-NEXT: .LBB17_4: # %else2 7312; SSE4-NEXT: testb $4, %al 7313; SSE4-NEXT: jne .LBB17_5 7314; SSE4-NEXT: .LBB17_6: # %else4 7315; SSE4-NEXT: testb $8, %al 7316; SSE4-NEXT: jne .LBB17_7 7317; SSE4-NEXT: .LBB17_8: # %else6 7318; SSE4-NEXT: testb $16, %al 7319; SSE4-NEXT: jne .LBB17_9 7320; SSE4-NEXT: .LBB17_10: # %else8 7321; SSE4-NEXT: testb $32, %al 7322; SSE4-NEXT: jne .LBB17_11 7323; SSE4-NEXT: .LBB17_12: # %else10 7324; SSE4-NEXT: testb $64, %al 7325; SSE4-NEXT: jne .LBB17_13 7326; SSE4-NEXT: .LBB17_14: # %else12 7327; SSE4-NEXT: testb $-128, %al 7328; SSE4-NEXT: jne .LBB17_15 7329; SSE4-NEXT: .LBB17_16: # %else14 7330; SSE4-NEXT: retq 7331; SSE4-NEXT: .LBB17_1: # %cond.store 7332; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) 7333; SSE4-NEXT: testb $2, %al 7334; SSE4-NEXT: je .LBB17_4 7335; SSE4-NEXT: .LBB17_3: # %cond.store1 7336; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) 7337; SSE4-NEXT: testb $4, %al 7338; SSE4-NEXT: je .LBB17_6 7339; SSE4-NEXT: .LBB17_5: # %cond.store3 7340; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) 7341; SSE4-NEXT: testb $8, %al 7342; SSE4-NEXT: je .LBB17_8 7343; SSE4-NEXT: .LBB17_7: # %cond.store5 7344; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) 7345; SSE4-NEXT: testb $16, %al 7346; SSE4-NEXT: je .LBB17_10 7347; SSE4-NEXT: .LBB17_9: # %cond.store7 7348; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) 7349; SSE4-NEXT: testb $32, %al 7350; SSE4-NEXT: je .LBB17_12 7351; SSE4-NEXT: .LBB17_11: # %cond.store9 7352; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) 7353; SSE4-NEXT: testb $64, %al 7354; SSE4-NEXT: je .LBB17_14 7355; SSE4-NEXT: .LBB17_13: # %cond.store11 7356; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) 7357; SSE4-NEXT: testb $-128, %al 7358; SSE4-NEXT: je .LBB17_16 7359; SSE4-NEXT: .LBB17_15: # %cond.store13 7360; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) 7361; SSE4-NEXT: retq 7362; 7363; AVX-LABEL: truncstore_v8i16_v8i8: 7364; AVX: # %bb.0: 7365; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 7366; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 7367; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 7368; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 7369; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 7370; AVX-NEXT: vpacksswb %xmm1, %xmm1, %xmm1 7371; AVX-NEXT: vpmovmskb %xmm1, %eax 7372; AVX-NEXT: testb $1, %al 7373; AVX-NEXT: jne .LBB17_1 7374; AVX-NEXT: # %bb.2: # %else 7375; AVX-NEXT: testb $2, %al 7376; AVX-NEXT: jne .LBB17_3 7377; AVX-NEXT: .LBB17_4: # %else2 7378; AVX-NEXT: testb $4, %al 7379; AVX-NEXT: jne .LBB17_5 7380; AVX-NEXT: .LBB17_6: # %else4 7381; AVX-NEXT: testb $8, %al 7382; AVX-NEXT: jne .LBB17_7 7383; AVX-NEXT: .LBB17_8: # %else6 7384; AVX-NEXT: testb $16, %al 7385; AVX-NEXT: jne .LBB17_9 7386; AVX-NEXT: .LBB17_10: # %else8 7387; AVX-NEXT: testb $32, %al 7388; AVX-NEXT: jne .LBB17_11 7389; AVX-NEXT: .LBB17_12: # %else10 7390; AVX-NEXT: testb $64, %al 7391; AVX-NEXT: jne .LBB17_13 7392; AVX-NEXT: .LBB17_14: # %else12 7393; AVX-NEXT: testb $-128, %al 7394; AVX-NEXT: jne .LBB17_15 7395; AVX-NEXT: .LBB17_16: # %else14 7396; AVX-NEXT: retq 7397; AVX-NEXT: .LBB17_1: # %cond.store 7398; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) 7399; AVX-NEXT: testb $2, %al 7400; AVX-NEXT: je .LBB17_4 7401; AVX-NEXT: .LBB17_3: # %cond.store1 7402; AVX-NEXT: vpextrb $1, %xmm0, 1(%rdi) 7403; AVX-NEXT: testb $4, %al 7404; AVX-NEXT: je .LBB17_6 7405; AVX-NEXT: .LBB17_5: # %cond.store3 7406; AVX-NEXT: vpextrb $2, %xmm0, 2(%rdi) 7407; AVX-NEXT: testb $8, %al 7408; AVX-NEXT: je .LBB17_8 7409; AVX-NEXT: .LBB17_7: # %cond.store5 7410; AVX-NEXT: vpextrb $3, %xmm0, 3(%rdi) 7411; AVX-NEXT: testb $16, %al 7412; AVX-NEXT: je .LBB17_10 7413; AVX-NEXT: .LBB17_9: # %cond.store7 7414; AVX-NEXT: vpextrb $4, %xmm0, 4(%rdi) 7415; AVX-NEXT: testb $32, %al 7416; AVX-NEXT: je .LBB17_12 7417; AVX-NEXT: .LBB17_11: # %cond.store9 7418; AVX-NEXT: vpextrb $5, %xmm0, 5(%rdi) 7419; AVX-NEXT: testb $64, %al 7420; AVX-NEXT: je .LBB17_14 7421; AVX-NEXT: .LBB17_13: # %cond.store11 7422; AVX-NEXT: vpextrb $6, %xmm0, 6(%rdi) 7423; AVX-NEXT: testb $-128, %al 7424; AVX-NEXT: je .LBB17_16 7425; AVX-NEXT: .LBB17_15: # %cond.store13 7426; AVX-NEXT: vpextrb $7, %xmm0, 7(%rdi) 7427; AVX-NEXT: retq 7428; 7429; AVX512F-LABEL: truncstore_v8i16_v8i8: 7430; AVX512F: # %bb.0: 7431; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 7432; AVX512F-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 7433; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 7434; AVX512F-NEXT: vpmovsxwq %xmm1, %zmm1 7435; AVX512F-NEXT: vptestmq %zmm1, %zmm1, %k0 7436; AVX512F-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 7437; AVX512F-NEXT: kmovw %k0, %eax 7438; AVX512F-NEXT: testb $1, %al 7439; AVX512F-NEXT: jne .LBB17_1 7440; AVX512F-NEXT: # %bb.2: # %else 7441; AVX512F-NEXT: testb $2, %al 7442; AVX512F-NEXT: jne .LBB17_3 7443; AVX512F-NEXT: .LBB17_4: # %else2 7444; AVX512F-NEXT: testb $4, %al 7445; AVX512F-NEXT: jne .LBB17_5 7446; AVX512F-NEXT: .LBB17_6: # %else4 7447; AVX512F-NEXT: testb $8, %al 7448; AVX512F-NEXT: jne .LBB17_7 7449; AVX512F-NEXT: .LBB17_8: # %else6 7450; AVX512F-NEXT: testb $16, %al 7451; AVX512F-NEXT: jne .LBB17_9 7452; AVX512F-NEXT: .LBB17_10: # %else8 7453; AVX512F-NEXT: testb $32, %al 7454; AVX512F-NEXT: jne .LBB17_11 7455; AVX512F-NEXT: .LBB17_12: # %else10 7456; AVX512F-NEXT: testb $64, %al 7457; AVX512F-NEXT: jne .LBB17_13 7458; AVX512F-NEXT: .LBB17_14: # %else12 7459; AVX512F-NEXT: testb $-128, %al 7460; AVX512F-NEXT: jne .LBB17_15 7461; AVX512F-NEXT: .LBB17_16: # %else14 7462; AVX512F-NEXT: vzeroupper 7463; AVX512F-NEXT: retq 7464; AVX512F-NEXT: .LBB17_1: # %cond.store 7465; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) 7466; AVX512F-NEXT: testb $2, %al 7467; AVX512F-NEXT: je .LBB17_4 7468; AVX512F-NEXT: .LBB17_3: # %cond.store1 7469; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) 7470; AVX512F-NEXT: testb $4, %al 7471; AVX512F-NEXT: je .LBB17_6 7472; AVX512F-NEXT: .LBB17_5: # %cond.store3 7473; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) 7474; AVX512F-NEXT: testb $8, %al 7475; AVX512F-NEXT: je .LBB17_8 7476; AVX512F-NEXT: .LBB17_7: # %cond.store5 7477; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) 7478; AVX512F-NEXT: testb $16, %al 7479; AVX512F-NEXT: je .LBB17_10 7480; AVX512F-NEXT: .LBB17_9: # %cond.store7 7481; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) 7482; AVX512F-NEXT: testb $32, %al 7483; AVX512F-NEXT: je .LBB17_12 7484; AVX512F-NEXT: .LBB17_11: # %cond.store9 7485; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) 7486; AVX512F-NEXT: testb $64, %al 7487; AVX512F-NEXT: je .LBB17_14 7488; AVX512F-NEXT: .LBB17_13: # %cond.store11 7489; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) 7490; AVX512F-NEXT: testb $-128, %al 7491; AVX512F-NEXT: je .LBB17_16 7492; AVX512F-NEXT: .LBB17_15: # %cond.store13 7493; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) 7494; AVX512F-NEXT: vzeroupper 7495; AVX512F-NEXT: retq 7496; 7497; AVX512BW-LABEL: truncstore_v8i16_v8i8: 7498; AVX512BW: # %bb.0: 7499; AVX512BW-NEXT: # kill: def $xmm1 killed $xmm1 def $zmm1 7500; AVX512BW-NEXT: vptestmw %zmm1, %zmm1, %k0 7501; AVX512BW-NEXT: kshiftlq $56, %k0, %k0 7502; AVX512BW-NEXT: kshiftrq $56, %k0, %k1 7503; AVX512BW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 7504; AVX512BW-NEXT: vmovdqu8 %zmm0, (%rdi) {%k1} 7505; AVX512BW-NEXT: vzeroupper 7506; AVX512BW-NEXT: retq 7507; 7508; AVX512BWVL-LABEL: truncstore_v8i16_v8i8: 7509; AVX512BWVL: # %bb.0: 7510; AVX512BWVL-NEXT: vptestmw %xmm1, %xmm1, %k1 7511; AVX512BWVL-NEXT: vpminsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 7512; AVX512BWVL-NEXT: vpmaxsw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0 7513; AVX512BWVL-NEXT: vpmovwb %xmm0, (%rdi) {%k1} 7514; AVX512BWVL-NEXT: retq 7515 %a = icmp ne <8 x i16> %mask, zeroinitializer 7516 %b = icmp slt <8 x i16> %x, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 7517 %c = select <8 x i1> %b, <8 x i16> %x, <8 x i16> <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127> 7518 %d = icmp sgt <8 x i16> %c, <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 7519 %e = select <8 x i1> %d, <8 x i16> %c, <8 x i16> <i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128, i16 -128> 7520 %f = trunc <8 x i16> %e to <8 x i8> 7521 call void @llvm.masked.store.v8i8.p0v8i8(<8 x i8> %f, <8 x i8>* %p, i32 1, <8 x i1> %a) 7522 ret void 7523} 7524 7525declare void @llvm.masked.store.v8i32.p0v8i32(<8 x i32>, <8 x i32>*, i32, <8 x i1>) 7526declare void @llvm.masked.store.v8i16.p0v8i16(<8 x i16>, <8 x i16>*, i32, <8 x i1>) 7527declare void @llvm.masked.store.v8i8.p0v8i8(<8 x i8>, <8 x i8>*, i32, <8 x i1>) 7528declare void @llvm.masked.store.v4i32.p0v4i32(<4 x i32>, <4 x i32>*, i32, <4 x i1>) 7529declare void @llvm.masked.store.v4i16.p0v4i16(<4 x i16>, <4 x i16>*, i32, <4 x i1>) 7530declare void @llvm.masked.store.v4i8.p0v4i8(<4 x i8>, <4 x i8>*, i32, <4 x i1>) 7531declare void @llvm.masked.store.v2i32.p0v2i32(<2 x i32>, <2 x i32>*, i32, <2 x i1>) 7532declare void @llvm.masked.store.v2i16.p0v2i16(<2 x i16>, <2 x i16>*, i32, <2 x i1>) 7533declare void @llvm.masked.store.v2i8.p0v2i8(<2 x i8>, <2 x i8>*, i32, <2 x i1>) 7534declare void @llvm.masked.store.v16i16.p0v16i16(<16 x i16>, <16 x i16>*, i32, <16 x i1>) 7535declare void @llvm.masked.store.v16i8.p0v16i8(<16 x i8>, <16 x i8>*, i32, <16 x i1>) 7536declare void @llvm.masked.store.v32i8.p0v32i8(<32 x i8>, <32 x i8>*, i32, <32 x i1>) 7537