Index: lib/Target/X86/X86ISelLowering.cpp =================================================================== --- lib/Target/X86/X86ISelLowering.cpp +++ lib/Target/X86/X86ISelLowering.cpp @@ -34821,6 +34821,19 @@ if (SDValue V = scalarizeExtEltFP(N, DAG)) return V; + // Attempt to extract a i1 element by using MOVMSK to extract the signbits + // and then select the relevant element. + if (CIdx && VT == MVT::i1 && SrcVT.getScalarType() == MVT::i1) { + unsigned NumSrcElts = SrcVT.getVectorNumElements(); + EVT BCVT = EVT::getIntegerVT(*DAG.getContext(), NumSrcElts); + if (SDValue BC = combineBitcastvxi1(DAG, BCVT, InputVector, dl, Subtarget)) { + APInt MaskBit = APInt::getOneBitSet(NumSrcElts, CIdx->getZExtValue()); + SDValue Mask = DAG.getConstant(MaskBit, dl, BCVT); + SDValue Res = DAG.getNode(ISD::AND, dl, BCVT, BC, Mask); + return DAG.getSetCC(dl, MVT::i1, Res, Mask, ISD::SETEQ); + } + } + return SDValue(); } Index: test/CodeGen/X86/avx2-masked-gather.ll =================================================================== --- test/CodeGen/X86/avx2-masked-gather.ll +++ test/CodeGen/X86/avx2-masked-gather.ll @@ -30,23 +30,27 @@ ; ; NOGATHER-LABEL: masked_gather_v2i32: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB0_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: movl (%rax), %eax -; NOGATHER-NEXT: vpinsrq $0, %rax, %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB0_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB0_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB0_3 +; NOGATHER-NEXT: .LBB0_4: # %else2 +; NOGATHER-NEXT: vmovdqa %xmm1, %xmm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB0_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: movl (%rcx), %ecx +; NOGATHER-NEXT: vpinsrq $0, %rcx, %xmm1, %xmm1 +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB0_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB0_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: movl (%rax), %eax ; NOGATHER-NEXT: vpinsrq $1, %rax, %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB0_4: # %else2 ; NOGATHER-NEXT: vmovdqa %xmm1, %xmm0 ; NOGATHER-NEXT: retq entry: @@ -79,23 +83,27 @@ ; ; NOGATHER-LABEL: masked_gather_v2i32_concat: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB1_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: movl (%rax), %eax -; NOGATHER-NEXT: vpinsrq $0, %rax, %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB1_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB1_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB1_3 +; NOGATHER-NEXT: .LBB1_4: # %else2 +; NOGATHER-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB1_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: movl (%rcx), %ecx +; NOGATHER-NEXT: vpinsrq $0, %rcx, %xmm1, %xmm1 +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB1_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB1_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: movl (%rax), %eax ; NOGATHER-NEXT: vpinsrq $1, %rax, %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB1_4: # %else2 ; NOGATHER-NEXT: vpshufd {{.*#+}} xmm0 = xmm1[0,2,2,3] ; NOGATHER-NEXT: retq entry: @@ -129,22 +137,26 @@ ; ; NOGATHER-LABEL: masked_gather_v2float: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB2_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; NOGATHER-NEXT: vblendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] -; NOGATHER-NEXT: .LBB2_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB2_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB2_3 +; NOGATHER-NEXT: .LBB2_4: # %else2 +; NOGATHER-NEXT: vmovaps %xmm1, %xmm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB2_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; NOGATHER-NEXT: vblendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB2_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB2_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3] -; NOGATHER-NEXT: .LBB2_4: # %else2 ; NOGATHER-NEXT: vmovaps %xmm1, %xmm0 ; NOGATHER-NEXT: retq entry: @@ -175,22 +187,26 @@ ; ; NOGATHER-LABEL: masked_gather_v2float_concat: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB3_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; NOGATHER-NEXT: vblendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] -; NOGATHER-NEXT: .LBB3_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB3_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB3_3 +; NOGATHER-NEXT: .LBB3_4: # %else2 +; NOGATHER-NEXT: vmovaps %xmm1, %xmm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB3_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vmovss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; NOGATHER-NEXT: vblendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB3_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB3_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3] -; NOGATHER-NEXT: .LBB3_4: # %else2 ; NOGATHER-NEXT: vmovaps %xmm1, %xmm0 ; NOGATHER-NEXT: retq entry: @@ -221,36 +237,43 @@ ; ; NOGATHER-LABEL: masked_gather_v4i32: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vpextrb $0, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB4_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm0, %rax -; NOGATHER-NEXT: vpinsrd $0, (%rax), %xmm2, %xmm2 -; NOGATHER-NEXT: .LBB4_2: # %else -; NOGATHER-NEXT: vpextrb $4, %xmm1, %eax +; NOGATHER-NEXT: vpslld $31, %xmm1, %xmm1 +; NOGATHER-NEXT: vmovmskps %xmm1, %eax ; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB4_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax -; NOGATHER-NEXT: vpinsrd $1, (%rax), %xmm2, %xmm2 +; NOGATHER-NEXT: jne .LBB4_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB4_3 ; NOGATHER-NEXT: .LBB4_4: # %else2 -; NOGATHER-NEXT: vpextrb $8, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB4_6 -; NOGATHER-NEXT: # %bb.5: # %cond.load4 -; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm3 -; NOGATHER-NEXT: vmovq %xmm3, %rax -; NOGATHER-NEXT: vpinsrd $2, (%rax), %xmm2, %xmm2 +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: jne .LBB4_5 ; NOGATHER-NEXT: .LBB4_6: # %else5 -; NOGATHER-NEXT: vpextrb $12, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $8, %al +; NOGATHER-NEXT: jne .LBB4_7 +; NOGATHER-NEXT: .LBB4_8: # %else8 +; NOGATHER-NEXT: vmovdqa %xmm2, %xmm0 +; NOGATHER-NEXT: vzeroupper +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB4_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vpinsrd $0, (%rcx), %xmm2, %xmm2 +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: je .LBB4_4 +; NOGATHER-NEXT: .LBB4_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rcx +; NOGATHER-NEXT: vpinsrd $1, (%rcx), %xmm2, %xmm2 +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: je .LBB4_6 +; NOGATHER-NEXT: .LBB4_5: # %cond.load4 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm1 +; NOGATHER-NEXT: vmovq %xmm1, %rcx +; NOGATHER-NEXT: vpinsrd $2, (%rcx), %xmm2, %xmm2 +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB4_8 -; NOGATHER-NEXT: # %bb.7: # %cond.load7 +; NOGATHER-NEXT: .LBB4_7: # %cond.load7 ; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vpinsrd $3, (%rax), %xmm2, %xmm2 -; NOGATHER-NEXT: .LBB4_8: # %else8 ; NOGATHER-NEXT: vmovdqa %xmm2, %xmm0 ; NOGATHER-NEXT: vzeroupper ; NOGATHER-NEXT: retq @@ -279,37 +302,44 @@ ; ; NOGATHER-LABEL: masked_gather_v4float: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vpextrb $0, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB5_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm0, %rax -; NOGATHER-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; NOGATHER-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] -; NOGATHER-NEXT: .LBB5_2: # %else -; NOGATHER-NEXT: vpextrb $4, %xmm1, %eax +; NOGATHER-NEXT: vpslld $31, %xmm1, %xmm1 +; NOGATHER-NEXT: vmovmskps %xmm1, %eax ; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB5_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB5_3 +; NOGATHER-NEXT: .LBB5_4: # %else2 +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: jne .LBB5_5 +; NOGATHER-NEXT: .LBB5_6: # %else5 +; NOGATHER-NEXT: testb $8, %al +; NOGATHER-NEXT: jne .LBB5_7 +; NOGATHER-NEXT: .LBB5_8: # %else8 +; NOGATHER-NEXT: vmovaps %xmm2, %xmm0 +; NOGATHER-NEXT: vzeroupper +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB5_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; NOGATHER-NEXT: vblendps {{.*#+}} xmm2 = xmm1[0],xmm2[1,2,3] +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB5_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax +; NOGATHER-NEXT: .LBB5_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rcx ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] -; NOGATHER-NEXT: .LBB5_4: # %else2 -; NOGATHER-NEXT: vpextrb $8, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $4, %al ; NOGATHER-NEXT: je .LBB5_6 -; NOGATHER-NEXT: # %bb.5: # %cond.load4 -; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm3 -; NOGATHER-NEXT: vmovq %xmm3, %rax +; NOGATHER-NEXT: .LBB5_5: # %cond.load4 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm1 +; NOGATHER-NEXT: vmovq %xmm1, %rcx ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; NOGATHER-NEXT: .LBB5_6: # %else5 -; NOGATHER-NEXT: vpextrb $12, %xmm1, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB5_8 -; NOGATHER-NEXT: # %bb.7: # %cond.load7 +; NOGATHER-NEXT: .LBB5_7: # %cond.load7 ; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; NOGATHER-NEXT: .LBB5_8: # %else8 ; NOGATHER-NEXT: vmovaps %xmm2, %xmm0 ; NOGATHER-NEXT: vzeroupper ; NOGATHER-NEXT: retq @@ -347,9 +377,11 @@ ; ; NOGATHER-LABEL: masked_gather_v8i32: ; NOGATHER: # %bb.0: # %entry +; NOGATHER-NEXT: vpsllw $15, %xmm0, %xmm2 +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; NOGATHER-NEXT: vpmovmskb %xmm0, %eax ; NOGATHER-NEXT: vmovdqa (%rdi), %ymm3 -; NOGATHER-NEXT: vmovdqa 32(%rdi), %ymm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax +; NOGATHER-NEXT: vmovdqa 32(%rdi), %ymm0 ; NOGATHER-NEXT: testb $1, %al ; NOGATHER-NEXT: je .LBB6_2 ; NOGATHER-NEXT: # %bb.1: # %cond.load @@ -357,16 +389,18 @@ ; NOGATHER-NEXT: vpinsrd $0, (%rax), %xmm1, %xmm4 ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB6_2: # %else -; NOGATHER-NEXT: vpextrb $2, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB6_4 ; NOGATHER-NEXT: # %bb.3: # %cond.load1 ; NOGATHER-NEXT: vpextrq $1, %xmm3, %rax ; NOGATHER-NEXT: vpinsrd $1, (%rax), %xmm1, %xmm4 ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB6_4: # %else2 -; NOGATHER-NEXT: vpextrb $4, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $4, %al ; NOGATHER-NEXT: je .LBB6_6 ; NOGATHER-NEXT: # %bb.5: # %cond.load4 ; NOGATHER-NEXT: vextractf128 $1, %ymm3, %xmm4 @@ -374,8 +408,9 @@ ; NOGATHER-NEXT: vpinsrd $2, (%rax), %xmm1, %xmm4 ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB6_6: # %else5 -; NOGATHER-NEXT: vpextrb $6, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB6_8 ; NOGATHER-NEXT: # %bb.7: # %cond.load7 ; NOGATHER-NEXT: vextractf128 $1, %ymm3, %xmm3 @@ -383,39 +418,43 @@ ; NOGATHER-NEXT: vpinsrd $3, (%rax), %xmm1, %xmm3 ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB6_8: # %else8 -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $16, %al ; NOGATHER-NEXT: je .LBB6_10 ; NOGATHER-NEXT: # %bb.9: # %cond.load10 -; NOGATHER-NEXT: vmovq %xmm2, %rax +; NOGATHER-NEXT: vmovq %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 ; NOGATHER-NEXT: vpinsrd $0, (%rax), %xmm3, %xmm3 ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB6_10: # %else11 -; NOGATHER-NEXT: vpextrb $10, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $32, %al ; NOGATHER-NEXT: je .LBB6_12 ; NOGATHER-NEXT: # %bb.11: # %cond.load13 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 ; NOGATHER-NEXT: vpinsrd $1, (%rax), %xmm3, %xmm3 ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB6_12: # %else14 -; NOGATHER-NEXT: vpextrb $12, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $64, %al ; NOGATHER-NEXT: je .LBB6_14 ; NOGATHER-NEXT: # %bb.13: # %cond.load16 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm3 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm3 ; NOGATHER-NEXT: vmovq %xmm3, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 ; NOGATHER-NEXT: vpinsrd $2, (%rax), %xmm3, %xmm3 ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB6_14: # %else17 -; NOGATHER-NEXT: vpextrb $14, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; NOGATHER-NEXT: vpmovmskb %xmm2, %eax +; NOGATHER-NEXT: testb $-128, %al ; NOGATHER-NEXT: je .LBB6_16 ; NOGATHER-NEXT: # %bb.15: # %cond.load19 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm0 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm0 ; NOGATHER-NEXT: vpinsrd $3, (%rax), %xmm0, %xmm0 @@ -458,9 +497,11 @@ ; ; NOGATHER-LABEL: masked_gather_v8float: ; NOGATHER: # %bb.0: # %entry +; NOGATHER-NEXT: vpsllw $15, %xmm0, %xmm2 +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; NOGATHER-NEXT: vpmovmskb %xmm0, %eax ; NOGATHER-NEXT: vmovdqa (%rdi), %ymm3 -; NOGATHER-NEXT: vmovdqa 32(%rdi), %ymm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax +; NOGATHER-NEXT: vmovdqa 32(%rdi), %ymm0 ; NOGATHER-NEXT: testb $1, %al ; NOGATHER-NEXT: je .LBB7_2 ; NOGATHER-NEXT: # %bb.1: # %cond.load @@ -468,16 +509,18 @@ ; NOGATHER-NEXT: vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3,4,5,6,7] ; NOGATHER-NEXT: .LBB7_2: # %else -; NOGATHER-NEXT: vpextrb $2, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB7_4 ; NOGATHER-NEXT: # %bb.3: # %cond.load1 ; NOGATHER-NEXT: vpextrq $1, %xmm3, %rax ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm4 = xmm1[0],mem[0],xmm1[2,3] ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB7_4: # %else2 -; NOGATHER-NEXT: vpextrb $4, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $4, %al ; NOGATHER-NEXT: je .LBB7_6 ; NOGATHER-NEXT: # %bb.5: # %cond.load4 ; NOGATHER-NEXT: vextractf128 $1, %ymm3, %xmm4 @@ -485,8 +528,9 @@ ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm4 = xmm1[0,1],mem[0],xmm1[3] ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB7_6: # %else5 -; NOGATHER-NEXT: vpextrb $6, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm4 +; NOGATHER-NEXT: vpmovmskb %xmm4, %eax +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB7_8 ; NOGATHER-NEXT: # %bb.7: # %cond.load7 ; NOGATHER-NEXT: vextractf128 $1, %ymm3, %xmm3 @@ -494,40 +538,44 @@ ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm3 = xmm1[0,1,2],mem[0] ; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; NOGATHER-NEXT: .LBB7_8: # %else8 -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $16, %al ; NOGATHER-NEXT: je .LBB7_10 ; NOGATHER-NEXT: # %bb.9: # %cond.load10 -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; NOGATHER-NEXT: vmovq %xmm0, %rax +; NOGATHER-NEXT: vmovd {{.*#+}} xmm3 = mem[0],zero,zero,zero ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm4 -; NOGATHER-NEXT: vblendps {{.*#+}} xmm3 = xmm3[0],xmm4[1,2,3] +; NOGATHER-NEXT: vpblendw {{.*#+}} xmm3 = xmm3[0,1],xmm4[2,3,4,5,6,7] ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB7_10: # %else11 -; NOGATHER-NEXT: vpextrb $10, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $32, %al ; NOGATHER-NEXT: je .LBB7_12 ; NOGATHER-NEXT: # %bb.11: # %cond.load13 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3] ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB7_12: # %else14 -; NOGATHER-NEXT: vpextrb $12, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; NOGATHER-NEXT: vpmovmskb %xmm3, %eax +; NOGATHER-NEXT: testb $64, %al ; NOGATHER-NEXT: je .LBB7_14 ; NOGATHER-NEXT: # %bb.13: # %cond.load16 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm3 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm3 ; NOGATHER-NEXT: vmovq %xmm3, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] ; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; NOGATHER-NEXT: .LBB7_14: # %else17 -; NOGATHER-NEXT: vpextrb $14, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; NOGATHER-NEXT: vpmovmskb %xmm2, %eax +; NOGATHER-NEXT: testb $-128, %al ; NOGATHER-NEXT: je .LBB7_16 ; NOGATHER-NEXT: # %bb.15: # %cond.load19 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm0 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm0 ; NOGATHER-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0] @@ -565,43 +613,49 @@ ; ; NOGATHER-LABEL: masked_gather_v4i64: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %ymm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB8_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vpinsrq $0, (%rax), %xmm1, %xmm3 -; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] -; NOGATHER-NEXT: .LBB8_2: # %else -; NOGATHER-NEXT: vpextrb $4, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB8_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax -; NOGATHER-NEXT: vpinsrq $1, (%rax), %xmm1, %xmm3 -; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; NOGATHER-NEXT: vpslld $31, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskps %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %ymm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB8_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB8_3 ; NOGATHER-NEXT: .LBB8_4: # %else2 -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB8_6 -; NOGATHER-NEXT: # %bb.5: # %cond.load4 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm3 -; NOGATHER-NEXT: vmovq %xmm3, %rax -; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 -; NOGATHER-NEXT: vpinsrq $0, (%rax), %xmm3, %xmm3 -; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: jne .LBB8_5 ; NOGATHER-NEXT: .LBB8_6: # %else5 -; NOGATHER-NEXT: vpextrb $12, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $8, %al +; NOGATHER-NEXT: jne .LBB8_7 +; NOGATHER-NEXT: .LBB8_8: # %else8 +; NOGATHER-NEXT: vmovaps %ymm1, %ymm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB8_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vpinsrq $0, (%rcx), %xmm1, %xmm2 +; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: je .LBB8_4 +; NOGATHER-NEXT: .LBB8_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rcx +; NOGATHER-NEXT: vpinsrq $1, (%rcx), %xmm1, %xmm2 +; NOGATHER-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: je .LBB8_6 +; NOGATHER-NEXT: .LBB8_5: # %cond.load4 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm2 +; NOGATHER-NEXT: vmovq %xmm2, %rcx +; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm2 +; NOGATHER-NEXT: vpinsrq $0, (%rcx), %xmm2, %xmm2 +; NOGATHER-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB8_8 -; NOGATHER-NEXT: # %bb.7: # %cond.load7 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm0 +; NOGATHER-NEXT: .LBB8_7: # %cond.load7 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm0 ; NOGATHER-NEXT: vpinsrq $1, (%rax), %xmm0, %xmm0 ; NOGATHER-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 -; NOGATHER-NEXT: .LBB8_8: # %else8 ; NOGATHER-NEXT: vmovaps %ymm1, %ymm0 ; NOGATHER-NEXT: retq entry: @@ -634,44 +688,50 @@ ; ; NOGATHER-LABEL: masked_gather_v4double: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %ymm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB9_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vmovsd {{.*#+}} xmm3 = mem[0],zero -; NOGATHER-NEXT: vblendpd {{.*#+}} ymm1 = ymm3[0],ymm1[1,2,3] -; NOGATHER-NEXT: .LBB9_2: # %else -; NOGATHER-NEXT: vpextrb $4, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB9_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax -; NOGATHER-NEXT: vmovhpd {{.*#+}} xmm3 = xmm1[0],mem[0] -; NOGATHER-NEXT: vblendpd {{.*#+}} ymm1 = ymm3[0,1],ymm1[2,3] +; NOGATHER-NEXT: vpslld $31, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskps %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %ymm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB9_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB9_3 ; NOGATHER-NEXT: .LBB9_4: # %else2 -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB9_6 -; NOGATHER-NEXT: # %bb.5: # %cond.load4 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm3 -; NOGATHER-NEXT: vmovq %xmm3, %rax -; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm3 -; NOGATHER-NEXT: vmovlpd {{.*#+}} xmm3 = mem[0],xmm3[1] -; NOGATHER-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: jne .LBB9_5 ; NOGATHER-NEXT: .LBB9_6: # %else5 -; NOGATHER-NEXT: vpextrb $12, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $8, %al +; NOGATHER-NEXT: jne .LBB9_7 +; NOGATHER-NEXT: .LBB9_8: # %else8 +; NOGATHER-NEXT: vmovapd %ymm1, %ymm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB9_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vmovsd {{.*#+}} xmm2 = mem[0],zero +; NOGATHER-NEXT: vblendpd {{.*#+}} ymm1 = ymm2[0],ymm1[1,2,3] +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: je .LBB9_4 +; NOGATHER-NEXT: .LBB9_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rcx +; NOGATHER-NEXT: vmovhpd {{.*#+}} xmm2 = xmm1[0],mem[0] +; NOGATHER-NEXT: vblendpd {{.*#+}} ymm1 = ymm2[0,1],ymm1[2,3] +; NOGATHER-NEXT: testb $4, %al +; NOGATHER-NEXT: je .LBB9_6 +; NOGATHER-NEXT: .LBB9_5: # %cond.load4 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm2 +; NOGATHER-NEXT: vmovq %xmm2, %rcx +; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm2 +; NOGATHER-NEXT: vmovlpd {{.*#+}} xmm2 = mem[0],xmm2[1] +; NOGATHER-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; NOGATHER-NEXT: testb $8, %al ; NOGATHER-NEXT: je .LBB9_8 -; NOGATHER-NEXT: # %bb.7: # %cond.load7 -; NOGATHER-NEXT: vextractf128 $1, %ymm2, %xmm0 +; NOGATHER-NEXT: .LBB9_7: # %cond.load7 +; NOGATHER-NEXT: vextractf128 $1, %ymm0, %xmm0 ; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vextractf128 $1, %ymm1, %xmm0 ; NOGATHER-NEXT: vmovhpd {{.*#+}} xmm0 = xmm0[0],mem[0] ; NOGATHER-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 -; NOGATHER-NEXT: .LBB9_8: # %else8 -; NOGATHER-NEXT: vmovapd %ymm1, %ymm0 +; NOGATHER-NEXT: vmovaps %ymm1, %ymm0 ; NOGATHER-NEXT: retq entry: %ld = load <4 x double*>, <4 x double*>* %ptr @@ -701,21 +761,25 @@ ; ; NOGATHER-LABEL: masked_gather_v2i64: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB10_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax -; NOGATHER-NEXT: vpinsrq $0, (%rax), %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB10_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB10_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB10_3 +; NOGATHER-NEXT: .LBB10_4: # %else2 +; NOGATHER-NEXT: vmovdqa %xmm1, %xmm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB10_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx +; NOGATHER-NEXT: vpinsrq $0, (%rcx), %xmm1, %xmm1 +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB10_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB10_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vpinsrq $1, (%rax), %xmm1, %xmm1 -; NOGATHER-NEXT: .LBB10_4: # %else2 ; NOGATHER-NEXT: vmovdqa %xmm1, %xmm0 ; NOGATHER-NEXT: retq entry: @@ -746,21 +810,25 @@ ; ; NOGATHER-LABEL: masked_gather_v2double: ; NOGATHER: # %bb.0: # %entry -; NOGATHER-NEXT: vmovdqa (%rdi), %xmm2 -; NOGATHER-NEXT: vpextrb $0, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al -; NOGATHER-NEXT: je .LBB11_2 -; NOGATHER-NEXT: # %bb.1: # %cond.load -; NOGATHER-NEXT: vmovq %xmm2, %rax +; NOGATHER-NEXT: vpsllq $63, %xmm0, %xmm0 +; NOGATHER-NEXT: vmovmskpd %xmm0, %eax +; NOGATHER-NEXT: vmovdqa (%rdi), %xmm0 +; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: jne .LBB11_1 +; NOGATHER-NEXT: # %bb.2: # %else +; NOGATHER-NEXT: testb $2, %al +; NOGATHER-NEXT: jne .LBB11_3 +; NOGATHER-NEXT: .LBB11_4: # %else2 +; NOGATHER-NEXT: vmovapd %xmm1, %xmm0 +; NOGATHER-NEXT: retq +; NOGATHER-NEXT: .LBB11_1: # %cond.load +; NOGATHER-NEXT: vmovq %xmm0, %rcx ; NOGATHER-NEXT: vmovlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; NOGATHER-NEXT: .LBB11_2: # %else -; NOGATHER-NEXT: vpextrb $8, %xmm0, %eax -; NOGATHER-NEXT: testb $1, %al +; NOGATHER-NEXT: testb $2, %al ; NOGATHER-NEXT: je .LBB11_4 -; NOGATHER-NEXT: # %bb.3: # %cond.load1 -; NOGATHER-NEXT: vpextrq $1, %xmm2, %rax +; NOGATHER-NEXT: .LBB11_3: # %cond.load1 +; NOGATHER-NEXT: vpextrq $1, %xmm0, %rax ; NOGATHER-NEXT: vmovhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; NOGATHER-NEXT: .LBB11_4: # %else2 ; NOGATHER-NEXT: vmovapd %xmm1, %xmm0 ; NOGATHER-NEXT: retq entry: Index: test/CodeGen/X86/avx512-insert-extract.ll =================================================================== --- test/CodeGen/X86/avx512-insert-extract.ll +++ test/CodeGen/X86/avx512-insert-extract.ll @@ -992,11 +992,9 @@ ; KNL-NEXT: vpminub %ymm1, %ymm0, %ymm1 ; KNL-NEXT: vpcmpeqb %ymm1, %ymm0, %ymm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 -; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 -; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 -; KNL-NEXT: kshiftrw $2, %k0, %k0 -; KNL-NEXT: kmovw %k0, %eax -; KNL-NEXT: andl $1, %eax +; KNL-NEXT: vpmovmskb %ymm0, %eax +; KNL-NEXT: andl $4, %eax +; KNL-NEXT: shrl $2, %eax ; KNL-NEXT: vzeroupper ; KNL-NEXT: retq ; @@ -1019,13 +1017,12 @@ ; KNL: ## %bb.0: ; KNL-NEXT: vpminub %ymm3, %ymm1, %ymm0 ; KNL-NEXT: vpcmpeqb %ymm0, %ymm1, %ymm0 -; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 -; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 -; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 -; KNL-NEXT: kshiftrw $15, %k0, %k0 -; KNL-NEXT: kmovw %k0, %eax -; KNL-NEXT: andb $1, %al +; KNL-NEXT: vpmovmskb %ymm0, %eax +; KNL-NEXT: shlq $32, %rax +; KNL-NEXT: shrq $63, %rax +; KNL-NEXT: cmpq $1, %rax +; KNL-NEXT: sete %al ; KNL-NEXT: movb $4, %cl ; KNL-NEXT: subb %al, %cl ; KNL-NEXT: movzbl %cl, %eax @@ -1054,13 +1051,12 @@ ; KNL: ## %bb.0: ; KNL-NEXT: vpminub %ymm3, %ymm1, %ymm0 ; KNL-NEXT: vpcmpeqb %ymm0, %ymm1, %ymm0 -; KNL-NEXT: vextracti128 $1, %ymm0, %xmm0 ; KNL-NEXT: vpternlogq $15, %zmm0, %zmm0, %zmm0 -; KNL-NEXT: vpmovsxbd %xmm0, %zmm0 -; KNL-NEXT: vptestmd %zmm0, %zmm0, %k0 -; KNL-NEXT: kshiftrw $15, %k0, %k0 -; KNL-NEXT: kmovw %k0, %eax -; KNL-NEXT: andb $1, %al +; KNL-NEXT: vpmovmskb %ymm0, %eax +; KNL-NEXT: shlq $32, %rax +; KNL-NEXT: shrq $63, %rax +; KNL-NEXT: cmpq $1, %rax +; KNL-NEXT: sete %al ; KNL-NEXT: movb $4, %cl ; KNL-NEXT: subb %al, %cl ; KNL-NEXT: movzbl %cl, %eax Index: test/CodeGen/X86/bitcast-vector-bool.ll =================================================================== --- test/CodeGen/X86/bitcast-vector-bool.ll +++ test/CodeGen/X86/bitcast-vector-bool.ll @@ -12,29 +12,18 @@ define i1 @bitcast_v2i64_to_v2i1(<2 x i64> %a0) nounwind { ; SSE2-SSSE3-LABEL: bitcast_v2i64_to_v2i1: ; SSE2-SSSE3: # %bb.0: -; SSE2-SSSE3-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] -; SSE2-SSSE3-NEXT: pxor %xmm1, %xmm0 -; SSE2-SSSE3-NEXT: movdqa %xmm1, %xmm2 -; SSE2-SSSE3-NEXT: pcmpgtd %xmm0, %xmm2 -; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] -; SSE2-SSSE3-NEXT: pcmpeqd %xmm1, %xmm0 -; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-SSSE3-NEXT: pand %xmm3, %xmm0 -; SSE2-SSSE3-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] -; SSE2-SSSE3-NEXT: por %xmm0, %xmm1 -; SSE2-SSSE3-NEXT: movdqa %xmm1, -{{[0-9]+}}(%rsp) -; SSE2-SSSE3-NEXT: movb -{{[0-9]+}}(%rsp), %al -; SSE2-SSSE3-NEXT: addb -{{[0-9]+}}(%rsp), %al +; SSE2-SSSE3-NEXT: movmskpd %xmm0, %ecx +; SSE2-SSSE3-NEXT: movl %ecx, %eax +; SSE2-SSSE3-NEXT: shrb %al +; SSE2-SSSE3-NEXT: addb %cl, %al ; SSE2-SSSE3-NEXT: retq ; ; AVX12-LABEL: bitcast_v2i64_to_v2i1: ; AVX12: # %bb.0: -; AVX12-NEXT: vpxor %xmm1, %xmm1, %xmm1 -; AVX12-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 -; AVX12-NEXT: vpextrb $0, %xmm0, %ecx -; AVX12-NEXT: vpextrb $8, %xmm0, %eax +; AVX12-NEXT: vmovmskpd %xmm0, %ecx +; AVX12-NEXT: movl %ecx, %eax +; AVX12-NEXT: shrb %al ; AVX12-NEXT: addb %cl, %al -; AVX12-NEXT: # kill: def $al killed $al killed $eax ; AVX12-NEXT: retq ; ; AVX512-LABEL: bitcast_v2i64_to_v2i1: Index: test/CodeGen/X86/bool-vector.ll =================================================================== --- test/CodeGen/X86/bool-vector.ll +++ test/CodeGen/X86/bool-vector.ll @@ -94,45 +94,14 @@ ; ; X32-SSE2-LABEL: PR15215_good: ; X32-SSE2: # %bb.0: # %entry -; X32-SSE2-NEXT: pushl %esi -; X32-SSE2-NEXT: .cfi_def_cfa_offset 8 -; X32-SSE2-NEXT: .cfi_offset %esi, -8 -; X32-SSE2-NEXT: movd %xmm0, %eax -; X32-SSE2-NEXT: andl $1, %eax -; X32-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] -; X32-SSE2-NEXT: movd %xmm1, %ecx -; X32-SSE2-NEXT: andl $1, %ecx -; X32-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] -; X32-SSE2-NEXT: movd %xmm1, %edx -; X32-SSE2-NEXT: andl $1, %edx -; X32-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] -; X32-SSE2-NEXT: movd %xmm0, %esi -; X32-SSE2-NEXT: andl $1, %esi -; X32-SSE2-NEXT: leal (%eax,%ecx,2), %eax -; X32-SSE2-NEXT: leal (%eax,%edx,4), %eax -; X32-SSE2-NEXT: leal (%eax,%esi,8), %eax -; X32-SSE2-NEXT: popl %esi -; X32-SSE2-NEXT: .cfi_def_cfa_offset 4 +; X32-SSE2-NEXT: pslld $31, %xmm0 +; X32-SSE2-NEXT: movmskps %xmm0, %eax ; X32-SSE2-NEXT: retl ; ; X32-AVX2-LABEL: PR15215_good: ; X32-AVX2: # %bb.0: # %entry -; X32-AVX2-NEXT: pushl %esi -; X32-AVX2-NEXT: .cfi_def_cfa_offset 8 -; X32-AVX2-NEXT: .cfi_offset %esi, -8 -; X32-AVX2-NEXT: vmovd %xmm0, %eax -; X32-AVX2-NEXT: andl $1, %eax -; X32-AVX2-NEXT: vpextrd $1, %xmm0, %ecx -; X32-AVX2-NEXT: andl $1, %ecx -; X32-AVX2-NEXT: vpextrd $2, %xmm0, %edx -; X32-AVX2-NEXT: andl $1, %edx -; X32-AVX2-NEXT: vpextrd $3, %xmm0, %esi -; X32-AVX2-NEXT: andl $1, %esi -; X32-AVX2-NEXT: leal (%eax,%ecx,2), %eax -; X32-AVX2-NEXT: leal (%eax,%edx,4), %eax -; X32-AVX2-NEXT: leal (%eax,%esi,8), %eax -; X32-AVX2-NEXT: popl %esi -; X32-AVX2-NEXT: .cfi_def_cfa_offset 4 +; X32-AVX2-NEXT: vpslld $31, %xmm0, %xmm0 +; X32-AVX2-NEXT: vmovmskps %xmm0, %eax ; X32-AVX2-NEXT: retl ; ; X64-LABEL: PR15215_good: @@ -152,35 +121,14 @@ ; ; X64-SSE2-LABEL: PR15215_good: ; X64-SSE2: # %bb.0: # %entry -; X64-SSE2-NEXT: movd %xmm0, %eax -; X64-SSE2-NEXT: andl $1, %eax -; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] -; X64-SSE2-NEXT: movd %xmm1, %ecx -; X64-SSE2-NEXT: andl $1, %ecx -; X64-SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] -; X64-SSE2-NEXT: movd %xmm1, %edx -; X64-SSE2-NEXT: andl $1, %edx -; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] -; X64-SSE2-NEXT: movd %xmm0, %esi -; X64-SSE2-NEXT: andl $1, %esi -; X64-SSE2-NEXT: leal (%rax,%rcx,2), %eax -; X64-SSE2-NEXT: leal (%rax,%rdx,4), %eax -; X64-SSE2-NEXT: leal (%rax,%rsi,8), %eax +; X64-SSE2-NEXT: pslld $31, %xmm0 +; X64-SSE2-NEXT: movmskps %xmm0, %eax ; X64-SSE2-NEXT: retq ; ; X64-AVX2-LABEL: PR15215_good: ; X64-AVX2: # %bb.0: # %entry -; X64-AVX2-NEXT: vmovd %xmm0, %eax -; X64-AVX2-NEXT: andl $1, %eax -; X64-AVX2-NEXT: vpextrd $1, %xmm0, %ecx -; X64-AVX2-NEXT: andl $1, %ecx -; X64-AVX2-NEXT: vpextrd $2, %xmm0, %edx -; X64-AVX2-NEXT: andl $1, %edx -; X64-AVX2-NEXT: vpextrd $3, %xmm0, %esi -; X64-AVX2-NEXT: andl $1, %esi -; X64-AVX2-NEXT: leal (%rax,%rcx,2), %eax -; X64-AVX2-NEXT: leal (%rax,%rdx,4), %eax -; X64-AVX2-NEXT: leal (%rax,%rsi,8), %eax +; X64-AVX2-NEXT: vpslld $31, %xmm0, %xmm0 +; X64-AVX2-NEXT: vmovmskps %xmm0, %eax ; X64-AVX2-NEXT: retq entry: %0 = trunc <4 x i32> %input to <4 x i1> Index: test/CodeGen/X86/masked_compressstore.ll =================================================================== --- test/CodeGen/X86/masked_compressstore.ll +++ test/CodeGen/X86/masked_compressstore.ll @@ -38,64 +38,73 @@ define void @compressstore_v8f32_v8i1(float* %base, <8 x float> %V, <8 x i1> %mask) { ; HSW-LABEL: compressstore_v8f32_v8i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vpsllw $15, %xmm1, %xmm1 +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB1_2 ; HSW-NEXT: # %bb.1: # %cond.store -; HSW-NEXT: vmovss %xmm0, (%rdi) +; HSW-NEXT: vmovd %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_2: # %else -; HSW-NEXT: vpextrb $2, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB1_4 ; HSW-NEXT: # %bb.3: # %cond.store1 -; HSW-NEXT: vextractps $1, %xmm0, (%rdi) +; HSW-NEXT: vpextrd $1, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_4: # %else2 -; HSW-NEXT: vpextrb $4, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB1_6 ; HSW-NEXT: # %bb.5: # %cond.store4 -; HSW-NEXT: vextractps $2, %xmm0, (%rdi) +; HSW-NEXT: vpextrd $2, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_6: # %else5 -; HSW-NEXT: vpextrb $6, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB1_8 ; HSW-NEXT: # %bb.7: # %cond.store7 -; HSW-NEXT: vextractps $3, %xmm0, (%rdi) +; HSW-NEXT: vpextrd $3, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_8: # %else8 -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB1_10 ; HSW-NEXT: # %bb.9: # %cond.store10 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm2 -; HSW-NEXT: vmovss %xmm2, (%rdi) +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm2 +; HSW-NEXT: vmovd %xmm2, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_10: # %else11 -; HSW-NEXT: vpextrb $10, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB1_12 ; HSW-NEXT: # %bb.11: # %cond.store13 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm2 -; HSW-NEXT: vextractps $1, %xmm2, (%rdi) +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm2 +; HSW-NEXT: vpextrd $1, %xmm2, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_12: # %else14 -; HSW-NEXT: vpextrb $12, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB1_14 ; HSW-NEXT: # %bb.13: # %cond.store16 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm2 -; HSW-NEXT: vextractps $2, %xmm2, (%rdi) +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm2 +; HSW-NEXT: vpextrd $2, %xmm2, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB1_14: # %else17 -; HSW-NEXT: vpextrb $14, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 +; HSW-NEXT: vpmovmskb %xmm1, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB1_16 ; HSW-NEXT: # %bb.15: # %cond.store19 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm0 -; HSW-NEXT: vextractps $3, %xmm0, (%rdi) +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 +; HSW-NEXT: vpextrd $3, %xmm0, (%rdi) ; HSW-NEXT: .LBB1_16: # %else20 ; HSW-NEXT: vzeroupper ; HSW-NEXT: retq @@ -123,60 +132,69 @@ define void @compressstore_v8f64_v8i1(double* %base, <8 x double> %V, <8 x i1> %mask) { ; HSW-LABEL: compressstore_v8f64_v8i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm2, %eax +; HSW-NEXT: vpsllw $15, %xmm2, %xmm2 +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB2_2 ; HSW-NEXT: # %bb.1: # %cond.store -; HSW-NEXT: vmovlpd %xmm0, (%rdi) +; HSW-NEXT: vmovq %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_2: # %else -; HSW-NEXT: vpextrb $2, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB2_4 ; HSW-NEXT: # %bb.3: # %cond.store1 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_4: # %else2 -; HSW-NEXT: vpextrb $4, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB2_6 ; HSW-NEXT: # %bb.5: # %cond.store4 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm3 -; HSW-NEXT: vmovlpd %xmm3, (%rdi) +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm3 +; HSW-NEXT: vmovq %xmm3, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_6: # %else5 -; HSW-NEXT: vpextrb $6, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB2_8 ; HSW-NEXT: # %bb.7: # %cond.store7 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm0 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_8: # %else8 -; HSW-NEXT: vpextrb $8, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB2_10 ; HSW-NEXT: # %bb.9: # %cond.store10 ; HSW-NEXT: vmovlpd %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_10: # %else11 -; HSW-NEXT: vpextrb $10, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB2_12 ; HSW-NEXT: # %bb.11: # %cond.store13 ; HSW-NEXT: vmovhpd %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_12: # %else14 -; HSW-NEXT: vpextrb $12, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB2_14 ; HSW-NEXT: # %bb.13: # %cond.store16 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm0 ; HSW-NEXT: vmovlpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_14: # %else17 -; HSW-NEXT: vpextrb $14, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB2_16 ; HSW-NEXT: # %bb.15: # %cond.store19 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm0 @@ -207,60 +225,69 @@ define void @compressstore_v8i64_v8i1(i64* %base, <8 x i64> %V, <8 x i1> %mask) { ; HSW-LABEL: compressstore_v8i64_v8i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm2, %eax +; HSW-NEXT: vpsllw $15, %xmm2, %xmm2 +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB3_2 ; HSW-NEXT: # %bb.1: # %cond.store ; HSW-NEXT: vmovq %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_2: # %else -; HSW-NEXT: vpextrb $2, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB3_4 ; HSW-NEXT: # %bb.3: # %cond.store1 ; HSW-NEXT: vpextrq $1, %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_4: # %else2 -; HSW-NEXT: vpextrb $4, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB3_6 ; HSW-NEXT: # %bb.5: # %cond.store4 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm3 ; HSW-NEXT: vmovq %xmm3, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_6: # %else5 -; HSW-NEXT: vpextrb $6, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB3_8 ; HSW-NEXT: # %bb.7: # %cond.store7 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 ; HSW-NEXT: vpextrq $1, %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_8: # %else8 -; HSW-NEXT: vpextrb $8, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB3_10 ; HSW-NEXT: # %bb.9: # %cond.store10 ; HSW-NEXT: vmovq %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_10: # %else11 -; HSW-NEXT: vpextrb $10, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB3_12 ; HSW-NEXT: # %bb.11: # %cond.store13 ; HSW-NEXT: vpextrq $1, %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_12: # %else14 -; HSW-NEXT: vpextrb $12, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB3_14 ; HSW-NEXT: # %bb.13: # %cond.store16 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm0 ; HSW-NEXT: vmovq %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB3_14: # %else17 -; HSW-NEXT: vpextrb $14, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm0 +; HSW-NEXT: vpmovmskb %xmm0, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB3_16 ; HSW-NEXT: # %bb.15: # %cond.store19 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm0 @@ -291,35 +318,41 @@ define void @compressstore_v4i64_v4i1(i64* %base, <4 x i64> %V, <4 x i1> %mask) { ; HSW-LABEL: compressstore_v4i64_v4i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vpslld $31, %xmm1, %xmm1 +; HSW-NEXT: vmovmskps %xmm1, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB4_2 -; HSW-NEXT: # %bb.1: # %cond.store +; HSW-NEXT: jne .LBB4_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB4_3 +; HSW-NEXT: .LBB4_4: # %else2 +; HSW-NEXT: testb $4, %al +; HSW-NEXT: jne .LBB4_5 +; HSW-NEXT: .LBB4_6: # %else5 +; HSW-NEXT: testb $8, %al +; HSW-NEXT: jne .LBB4_7 +; HSW-NEXT: .LBB4_8: # %else8 +; HSW-NEXT: vzeroupper +; HSW-NEXT: retq +; HSW-NEXT: .LBB4_1: # %cond.store ; HSW-NEXT: vmovq %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB4_2: # %else -; HSW-NEXT: vpextrb $4, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB4_4 -; HSW-NEXT: # %bb.3: # %cond.store1 +; HSW-NEXT: .LBB4_3: # %cond.store1 ; HSW-NEXT: vpextrq $1, %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB4_4: # %else2 -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB4_6 -; HSW-NEXT: # %bb.5: # %cond.store4 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm2 -; HSW-NEXT: vmovq %xmm2, (%rdi) +; HSW-NEXT: .LBB4_5: # %cond.store4 +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm1 +; HSW-NEXT: vmovq %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB4_6: # %else5 -; HSW-NEXT: vpextrb $12, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB4_8 -; HSW-NEXT: # %bb.7: # %cond.store7 +; HSW-NEXT: .LBB4_7: # %cond.store7 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 ; HSW-NEXT: vpextrq $1, %xmm0, (%rdi) -; HSW-NEXT: .LBB4_8: # %else8 ; HSW-NEXT: vzeroupper ; HSW-NEXT: retq ; @@ -347,19 +380,22 @@ define void @compressstore_v2i64_v2i1(i64* %base, <2 x i64> %V, <2 x i1> %mask) { ; HSW-LABEL: compressstore_v2i64_v2i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vpsllq $63, %xmm1, %xmm1 +; HSW-NEXT: vmovmskpd %xmm1, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB5_2 -; HSW-NEXT: # %bb.1: # %cond.store +; HSW-NEXT: jne .LBB5_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB5_3 +; HSW-NEXT: .LBB5_4: # %else2 +; HSW-NEXT: retq +; HSW-NEXT: .LBB5_1: # %cond.store ; HSW-NEXT: vmovq %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB5_2: # %else -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB5_4 -; HSW-NEXT: # %bb.3: # %cond.store1 +; HSW-NEXT: .LBB5_3: # %cond.store1 ; HSW-NEXT: vpextrq $1, %xmm0, (%rdi) -; HSW-NEXT: .LBB5_4: # %else2 ; HSW-NEXT: retq ; ; SKX-LABEL: compressstore_v2i64_v2i1: @@ -385,33 +421,38 @@ define void @compressstore_v4f32_v4i1(float* %base, <4 x float> %V, <4 x i1> %mask) { ; HSW-LABEL: compressstore_v4f32_v4i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vpslld $31, %xmm1, %xmm1 +; HSW-NEXT: vmovmskps %xmm1, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB6_2 -; HSW-NEXT: # %bb.1: # %cond.store +; HSW-NEXT: jne .LBB6_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB6_3 +; HSW-NEXT: .LBB6_4: # %else2 +; HSW-NEXT: testb $4, %al +; HSW-NEXT: jne .LBB6_5 +; HSW-NEXT: .LBB6_6: # %else5 +; HSW-NEXT: testb $8, %al +; HSW-NEXT: jne .LBB6_7 +; HSW-NEXT: .LBB6_8: # %else8 +; HSW-NEXT: retq +; HSW-NEXT: .LBB6_1: # %cond.store ; HSW-NEXT: vmovss %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi -; HSW-NEXT: .LBB6_2: # %else -; HSW-NEXT: vpextrb $4, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB6_4 -; HSW-NEXT: # %bb.3: # %cond.store1 +; HSW-NEXT: .LBB6_3: # %cond.store1 ; HSW-NEXT: vextractps $1, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi -; HSW-NEXT: .LBB6_4: # %else2 -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB6_6 -; HSW-NEXT: # %bb.5: # %cond.store4 +; HSW-NEXT: .LBB6_5: # %cond.store4 ; HSW-NEXT: vextractps $2, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi -; HSW-NEXT: .LBB6_6: # %else5 -; HSW-NEXT: vpextrb $12, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB6_8 -; HSW-NEXT: # %bb.7: # %cond.store7 +; HSW-NEXT: .LBB6_7: # %cond.store7 ; HSW-NEXT: vextractps $3, %xmm0, (%rdi) -; HSW-NEXT: .LBB6_8: # %else8 ; HSW-NEXT: retq ; ; SKX-LABEL: compressstore_v4f32_v4i1: @@ -440,19 +481,21 @@ ; HSW-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; HSW-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] ; HSW-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vmovmskpd %xmm1, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB7_2 -; HSW-NEXT: # %bb.1: # %cond.store +; HSW-NEXT: jne .LBB7_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB7_3 +; HSW-NEXT: .LBB7_4: # %else2 +; HSW-NEXT: retq +; HSW-NEXT: .LBB7_1: # %cond.store ; HSW-NEXT: vmovss %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi -; HSW-NEXT: .LBB7_2: # %else -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB7_4 -; HSW-NEXT: # %bb.3: # %cond.store1 +; HSW-NEXT: .LBB7_3: # %cond.store1 ; HSW-NEXT: vextractps $1, %xmm0, (%rdi) -; HSW-NEXT: .LBB7_4: # %else2 ; HSW-NEXT: retq ; ; SKX-LABEL: compressstore_v2f32_v2i32: @@ -483,19 +526,19 @@ ; HSW: # %bb.0: ; HSW-NEXT: vpxor %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $0, %xmm9, %eax +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB8_2 ; HSW-NEXT: # %bb.1: # %cond.store ; HSW-NEXT: vmovd %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_2: # %else -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $1, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB8_4 ; HSW-NEXT: # %bb.3: # %cond.store1 ; HSW-NEXT: vpextrd $1, %xmm0, (%rdi) @@ -503,19 +546,19 @@ ; HSW-NEXT: .LBB8_4: # %else2 ; HSW-NEXT: vpxor %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $2, %xmm9, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB8_6 ; HSW-NEXT: # %bb.5: # %cond.store4 ; HSW-NEXT: vpextrd $2, %xmm0, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_6: # %else5 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $3, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB8_8 ; HSW-NEXT: # %bb.7: # %cond.store7 ; HSW-NEXT: vpextrd $3, %xmm0, (%rdi) @@ -523,21 +566,24 @@ ; HSW-NEXT: .LBB8_8: # %else8 ; HSW-NEXT: vpxor %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vextracti128 $1, %ymm8, %xmm8 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $4, %xmm9, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vextracti128 $1, %ymm9, %xmm9 +; HSW-NEXT: vpbroadcastw %xmm9, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB8_10 ; HSW-NEXT: # %bb.9: # %cond.store10 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm9 ; HSW-NEXT: vmovd %xmm9, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_10: # %else11 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $5, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vextracti128 $1, %ymm8, %xmm8 +; HSW-NEXT: vpbroadcastd %xmm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB8_12 ; HSW-NEXT: # %bb.11: # %cond.store13 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm8 @@ -545,22 +591,23 @@ ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_12: # %else14 ; HSW-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm8 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $6, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm9 +; HSW-NEXT: vpackssdw %ymm0, %ymm9, %ymm8 +; HSW-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB8_14 ; HSW-NEXT: # %bb.13: # %cond.store16 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm4 ; HSW-NEXT: vpextrd $2, %xmm4, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_14: # %else17 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $7, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm9, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB8_16 ; HSW-NEXT: # %bb.15: # %cond.store19 ; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -569,19 +616,25 @@ ; HSW-NEXT: .LBB8_16: # %else20 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $8, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm4 +; HSW-NEXT: vpmovzxwd {{.*#+}} ymm4 = xmm4[0],zero,xmm4[1],zero,xmm4[2],zero,xmm4[3],zero,xmm4[4],zero,xmm4[5],zero,xmm4[6],zero,xmm4[7],zero +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 +; HSW-NEXT: vpbroadcastb %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $256, %eax # imm = 0x100 ; HSW-NEXT: je .LBB8_18 ; HSW-NEXT: # %bb.17: # %cond.store22 ; HSW-NEXT: vmovd %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_18: # %else23 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $9, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 +; HSW-NEXT: vpbroadcastw %xmm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $512, %eax # imm = 0x200 ; HSW-NEXT: je .LBB8_20 ; HSW-NEXT: # %bb.19: # %cond.store25 ; HSW-NEXT: vpextrd $1, %xmm1, (%rdi) @@ -589,19 +642,25 @@ ; HSW-NEXT: .LBB8_20: # %else26 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $10, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 +; HSW-NEXT: vpbroadcastd %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $1024, %eax # imm = 0x400 ; HSW-NEXT: je .LBB8_22 ; HSW-NEXT: # %bb.21: # %cond.store28 ; HSW-NEXT: vpextrd $2, %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_22: # %else29 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $11, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 +; HSW-NEXT: vpbroadcastd %xmm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $2048, %eax # imm = 0x800 ; HSW-NEXT: je .LBB8_24 ; HSW-NEXT: # %bb.23: # %cond.store31 ; HSW-NEXT: vpextrd $3, %xmm1, (%rdi) @@ -609,21 +668,24 @@ ; HSW-NEXT: .LBB8_24: # %else32 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $12, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $4096, %eax # imm = 0x1000 ; HSW-NEXT: je .LBB8_26 ; HSW-NEXT: # %bb.25: # %cond.store34 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm4 ; HSW-NEXT: vmovd %xmm4, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_26: # %else35 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $13, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $8192, %eax # imm = 0x2000 ; HSW-NEXT: je .LBB8_28 ; HSW-NEXT: # %bb.27: # %cond.store37 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm0 @@ -632,21 +694,24 @@ ; HSW-NEXT: .LBB8_28: # %else38 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm5, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $14, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $16384, %eax # imm = 0x4000 ; HSW-NEXT: je .LBB8_30 ; HSW-NEXT: # %bb.29: # %cond.store40 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm4 ; HSW-NEXT: vpextrd $2, %xmm4, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_30: # %else41 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $15, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $32768, %eax # imm = 0x8000 ; HSW-NEXT: je .LBB8_32 ; HSW-NEXT: # %bb.31: # %cond.store43 ; HSW-NEXT: vextracti128 $1, %ymm1, %xmm0 @@ -655,19 +720,23 @@ ; HSW-NEXT: .LBB8_32: # %else44 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $0, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpmovzxbw {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero,xmm1[8],zero,xmm1[9],zero,xmm1[10],zero,xmm1[11],zero,xmm1[12],zero,xmm1[13],zero,xmm1[14],zero,xmm1[15],zero +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $65536, %eax # imm = 0x10000 ; HSW-NEXT: je .LBB8_34 ; HSW-NEXT: # %bb.33: # %cond.store46 ; HSW-NEXT: vmovd %xmm2, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_34: # %else47 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $1, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $131072, %eax # imm = 0x20000 ; HSW-NEXT: je .LBB8_36 ; HSW-NEXT: # %bb.35: # %cond.store49 ; HSW-NEXT: vpextrd $1, %xmm2, (%rdi) @@ -675,19 +744,23 @@ ; HSW-NEXT: .LBB8_36: # %else50 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $2, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $262144, %eax # imm = 0x40000 ; HSW-NEXT: je .LBB8_38 ; HSW-NEXT: # %bb.37: # %cond.store52 ; HSW-NEXT: vpextrd $2, %xmm2, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_38: # %else53 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $3, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $524288, %eax # imm = 0x80000 ; HSW-NEXT: je .LBB8_40 ; HSW-NEXT: # %bb.39: # %cond.store55 ; HSW-NEXT: vpextrd $3, %xmm2, (%rdi) @@ -695,21 +768,26 @@ ; HSW-NEXT: .LBB8_40: # %else56 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $4, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vextracti128 $1, %ymm1, %xmm1 +; HSW-NEXT: vpbroadcastw %xmm1, %ymm1 +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $1048576, %eax # imm = 0x100000 ; HSW-NEXT: je .LBB8_42 ; HSW-NEXT: # %bb.41: # %cond.store58 ; HSW-NEXT: vextracti128 $1, %ymm2, %xmm1 ; HSW-NEXT: vmovd %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_42: # %else59 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $5, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 +; HSW-NEXT: vpbroadcastd %xmm0, %ymm0 +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $2097152, %eax # imm = 0x200000 ; HSW-NEXT: je .LBB8_44 ; HSW-NEXT: # %bb.43: # %cond.store61 ; HSW-NEXT: vextracti128 $1, %ymm2, %xmm0 @@ -718,21 +796,24 @@ ; HSW-NEXT: .LBB8_44: # %else62 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm6, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $6, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $4194304, %eax # imm = 0x400000 ; HSW-NEXT: je .LBB8_46 ; HSW-NEXT: # %bb.45: # %cond.store64 ; HSW-NEXT: vextracti128 $1, %ymm2, %xmm1 ; HSW-NEXT: vpextrd $2, %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_46: # %else65 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $7, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $8388608, %eax # imm = 0x800000 ; HSW-NEXT: je .LBB8_48 ; HSW-NEXT: # %bb.47: # %cond.store67 ; HSW-NEXT: vextracti128 $1, %ymm2, %xmm0 @@ -741,19 +822,21 @@ ; HSW-NEXT: .LBB8_48: # %else68 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpmovzxwd {{.*#+}} ymm1 = xmm1[0],zero,xmm1[1],zero,xmm1[2],zero,xmm1[3],zero,xmm1[4],zero,xmm1[5],zero,xmm1[6],zero,xmm1[7],zero +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $16777216, %eax # imm = 0x1000000 ; HSW-NEXT: je .LBB8_50 ; HSW-NEXT: # %bb.49: # %cond.store70 ; HSW-NEXT: vmovd %xmm3, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_50: # %else71 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $9, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $33554432, %eax # imm = 0x2000000 ; HSW-NEXT: je .LBB8_52 ; HSW-NEXT: # %bb.51: # %cond.store73 ; HSW-NEXT: vpextrd $1, %xmm3, (%rdi) @@ -761,19 +844,21 @@ ; HSW-NEXT: .LBB8_52: # %else74 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; HSW-NEXT: vpextrb $10, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $67108864, %eax # imm = 0x4000000 ; HSW-NEXT: je .LBB8_54 ; HSW-NEXT: # %bb.53: # %cond.store76 ; HSW-NEXT: vpextrd $2, %xmm3, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_54: # %else77 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $11, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $134217728, %eax # imm = 0x8000000 ; HSW-NEXT: je .LBB8_56 ; HSW-NEXT: # %bb.55: # %cond.store79 ; HSW-NEXT: vpextrd $3, %xmm3, (%rdi) @@ -781,21 +866,20 @@ ; HSW-NEXT: .LBB8_56: # %else80 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; HSW-NEXT: vpextrb $12, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $268435456, %eax # imm = 0x10000000 ; HSW-NEXT: je .LBB8_58 ; HSW-NEXT: # %bb.57: # %cond.store82 ; HSW-NEXT: vextracti128 $1, %ymm3, %xmm1 ; HSW-NEXT: vmovd %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_58: # %else83 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $13, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $536870912, %eax # imm = 0x20000000 ; HSW-NEXT: je .LBB8_60 ; HSW-NEXT: # %bb.59: # %cond.store85 ; HSW-NEXT: vextracti128 $1, %ymm3, %xmm0 @@ -804,21 +888,20 @@ ; HSW-NEXT: .LBB8_60: # %else86 ; HSW-NEXT: vpxor %xmm0, %xmm0, %xmm0 ; HSW-NEXT: vpcmpeqd %ymm0, %ymm7, %ymm0 -; HSW-NEXT: vextracti128 $1, %ymm0, %xmm0 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm1 -; HSW-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; HSW-NEXT: vpextrb $14, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm1 +; HSW-NEXT: vpacksswb %ymm1, %ymm0, %ymm1 +; HSW-NEXT: vpmovmskb %ymm1, %eax +; HSW-NEXT: testl $1073741824, %eax # imm = 0x40000000 ; HSW-NEXT: je .LBB8_62 ; HSW-NEXT: # %bb.61: # %cond.store88 ; HSW-NEXT: vextracti128 $1, %ymm3, %xmm1 ; HSW-NEXT: vpextrd $2, %xmm1, (%rdi) ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB8_62: # %else89 -; HSW-NEXT: vpackssdw %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 -; HSW-NEXT: vpextrb $15, %xmm0, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpacksswb %ymm0, %ymm0, %ymm0 +; HSW-NEXT: vpmovmskb %ymm0, %eax +; HSW-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; HSW-NEXT: je .LBB8_64 ; HSW-NEXT: # %bb.63: # %cond.store91 ; HSW-NEXT: vextracti128 $1, %ymm3, %xmm0 @@ -855,125 +938,143 @@ define void @compressstore_v16f64_v16i1(double* %base, <16 x double> %V, <16 x i1> %mask) { ; HSW-LABEL: compressstore_v16f64_v16i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm4, %eax +; HSW-NEXT: vpsllw $7, %xmm4, %xmm4 +; HSW-NEXT: vpmovmskb %xmm4, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB9_2 -; HSW-NEXT: # %bb.1: # %cond.store +; HSW-NEXT: jne .LBB9_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB9_3 +; HSW-NEXT: .LBB9_4: # %else2 +; HSW-NEXT: testb $4, %al +; HSW-NEXT: jne .LBB9_5 +; HSW-NEXT: .LBB9_6: # %else5 +; HSW-NEXT: testb $8, %al +; HSW-NEXT: jne .LBB9_7 +; HSW-NEXT: .LBB9_8: # %else8 +; HSW-NEXT: testb $16, %al +; HSW-NEXT: jne .LBB9_9 +; HSW-NEXT: .LBB9_10: # %else11 +; HSW-NEXT: testb $32, %al +; HSW-NEXT: jne .LBB9_11 +; HSW-NEXT: .LBB9_12: # %else14 +; HSW-NEXT: testb $64, %al +; HSW-NEXT: jne .LBB9_13 +; HSW-NEXT: .LBB9_14: # %else17 +; HSW-NEXT: testb $-128, %al +; HSW-NEXT: jne .LBB9_15 +; HSW-NEXT: .LBB9_16: # %else20 +; HSW-NEXT: testl $256, %eax # imm = 0x100 +; HSW-NEXT: jne .LBB9_17 +; HSW-NEXT: .LBB9_18: # %else23 +; HSW-NEXT: testl $512, %eax # imm = 0x200 +; HSW-NEXT: jne .LBB9_19 +; HSW-NEXT: .LBB9_20: # %else26 +; HSW-NEXT: testl $1024, %eax # imm = 0x400 +; HSW-NEXT: jne .LBB9_21 +; HSW-NEXT: .LBB9_22: # %else29 +; HSW-NEXT: testl $2048, %eax # imm = 0x800 +; HSW-NEXT: jne .LBB9_23 +; HSW-NEXT: .LBB9_24: # %else32 +; HSW-NEXT: testl $4096, %eax # imm = 0x1000 +; HSW-NEXT: jne .LBB9_25 +; HSW-NEXT: .LBB9_26: # %else35 +; HSW-NEXT: testl $8192, %eax # imm = 0x2000 +; HSW-NEXT: jne .LBB9_27 +; HSW-NEXT: .LBB9_28: # %else38 +; HSW-NEXT: testl $16384, %eax # imm = 0x4000 +; HSW-NEXT: jne .LBB9_29 +; HSW-NEXT: .LBB9_30: # %else41 +; HSW-NEXT: testl $32768, %eax # imm = 0x8000 +; HSW-NEXT: jne .LBB9_31 +; HSW-NEXT: .LBB9_32: # %else44 +; HSW-NEXT: vzeroupper +; HSW-NEXT: retq +; HSW-NEXT: .LBB9_1: # %cond.store ; HSW-NEXT: vmovlpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_2: # %else -; HSW-NEXT: vpextrb $1, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB9_4 -; HSW-NEXT: # %bb.3: # %cond.store1 +; HSW-NEXT: .LBB9_3: # %cond.store1 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_4: # %else2 -; HSW-NEXT: vpextrb $2, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB9_6 -; HSW-NEXT: # %bb.5: # %cond.store4 -; HSW-NEXT: vextractf128 $1, %ymm0, %xmm5 -; HSW-NEXT: vmovlpd %xmm5, (%rdi) +; HSW-NEXT: .LBB9_5: # %cond.store4 +; HSW-NEXT: vextractf128 $1, %ymm0, %xmm4 +; HSW-NEXT: vmovlpd %xmm4, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_6: # %else5 -; HSW-NEXT: vpextrb $3, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB9_8 -; HSW-NEXT: # %bb.7: # %cond.store7 +; HSW-NEXT: .LBB9_7: # %cond.store7 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm0 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_8: # %else8 -; HSW-NEXT: vpextrb $4, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB9_10 -; HSW-NEXT: # %bb.9: # %cond.store10 +; HSW-NEXT: .LBB9_9: # %cond.store10 ; HSW-NEXT: vmovlpd %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_10: # %else11 -; HSW-NEXT: vpextrb $5, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB9_12 -; HSW-NEXT: # %bb.11: # %cond.store13 +; HSW-NEXT: .LBB9_11: # %cond.store13 ; HSW-NEXT: vmovhpd %xmm1, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_12: # %else14 -; HSW-NEXT: vpextrb $6, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB9_14 -; HSW-NEXT: # %bb.13: # %cond.store16 +; HSW-NEXT: .LBB9_13: # %cond.store16 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm0 ; HSW-NEXT: vmovlpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_14: # %else17 -; HSW-NEXT: vpextrb $7, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB9_16 -; HSW-NEXT: # %bb.15: # %cond.store19 +; HSW-NEXT: .LBB9_15: # %cond.store19 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm0 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_16: # %else20 -; HSW-NEXT: vpextrb $8, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $256, %eax # imm = 0x100 ; HSW-NEXT: je .LBB9_18 -; HSW-NEXT: # %bb.17: # %cond.store22 +; HSW-NEXT: .LBB9_17: # %cond.store22 ; HSW-NEXT: vmovlpd %xmm2, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_18: # %else23 -; HSW-NEXT: vpextrb $9, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $512, %eax # imm = 0x200 ; HSW-NEXT: je .LBB9_20 -; HSW-NEXT: # %bb.19: # %cond.store25 +; HSW-NEXT: .LBB9_19: # %cond.store25 ; HSW-NEXT: vmovhpd %xmm2, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_20: # %else26 -; HSW-NEXT: vpextrb $10, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $1024, %eax # imm = 0x400 ; HSW-NEXT: je .LBB9_22 -; HSW-NEXT: # %bb.21: # %cond.store28 +; HSW-NEXT: .LBB9_21: # %cond.store28 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm0 ; HSW-NEXT: vmovlpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_22: # %else29 -; HSW-NEXT: vpextrb $11, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $2048, %eax # imm = 0x800 ; HSW-NEXT: je .LBB9_24 -; HSW-NEXT: # %bb.23: # %cond.store31 +; HSW-NEXT: .LBB9_23: # %cond.store31 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm0 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_24: # %else32 -; HSW-NEXT: vpextrb $12, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $4096, %eax # imm = 0x1000 ; HSW-NEXT: je .LBB9_26 -; HSW-NEXT: # %bb.25: # %cond.store34 +; HSW-NEXT: .LBB9_25: # %cond.store34 ; HSW-NEXT: vmovlpd %xmm3, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_26: # %else35 -; HSW-NEXT: vpextrb $13, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $8192, %eax # imm = 0x2000 ; HSW-NEXT: je .LBB9_28 -; HSW-NEXT: # %bb.27: # %cond.store37 +; HSW-NEXT: .LBB9_27: # %cond.store37 ; HSW-NEXT: vmovhpd %xmm3, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_28: # %else38 -; HSW-NEXT: vpextrb $14, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $16384, %eax # imm = 0x4000 ; HSW-NEXT: je .LBB9_30 -; HSW-NEXT: # %bb.29: # %cond.store40 +; HSW-NEXT: .LBB9_29: # %cond.store40 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm0 ; HSW-NEXT: vmovlpd %xmm0, (%rdi) ; HSW-NEXT: addq $8, %rdi -; HSW-NEXT: .LBB9_30: # %else41 -; HSW-NEXT: vpextrb $15, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testl $32768, %eax # imm = 0x8000 ; HSW-NEXT: je .LBB9_32 -; HSW-NEXT: # %bb.31: # %cond.store43 +; HSW-NEXT: .LBB9_31: # %cond.store43 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm0 ; HSW-NEXT: vmovhpd %xmm0, (%rdi) -; HSW-NEXT: .LBB9_32: # %else44 ; HSW-NEXT: vzeroupper ; HSW-NEXT: retq ; Index: test/CodeGen/X86/masked_expandload.ll =================================================================== --- test/CodeGen/X86/masked_expandload.ll +++ test/CodeGen/X86/masked_expandload.ll @@ -75,24 +75,28 @@ define <8 x double> @expandload_v8f64_v8i1(double* %base, <8 x double> %src0, <8 x i1> %mask) { ; HSW-LABEL: expandload_v8f64_v8i1: ; HSW: # %bb.0: -; HSW-NEXT: vpextrb $0, %xmm2, %eax +; HSW-NEXT: vpsllw $15, %xmm2, %xmm2 +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB2_2 ; HSW-NEXT: # %bb.1: # %cond.load -; HSW-NEXT: vmovsd {{.*#+}} xmm3 = mem[0],zero -; HSW-NEXT: vblendpd {{.*#+}} ymm0 = ymm3[0],ymm0[1,2,3] +; HSW-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero +; HSW-NEXT: vpblendd {{.*#+}} ymm0 = ymm3[0,1],ymm0[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_2: # %else -; HSW-NEXT: vpextrb $2, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB2_4 ; HSW-NEXT: # %bb.3: # %cond.load1 ; HSW-NEXT: vmovhpd {{.*#+}} xmm3 = xmm0[0],mem[0] ; HSW-NEXT: vblendpd {{.*#+}} ymm0 = ymm3[0,1],ymm0[2,3] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_4: # %else2 -; HSW-NEXT: vpextrb $4, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB2_6 ; HSW-NEXT: # %bb.5: # %cond.load5 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm3 @@ -100,8 +104,9 @@ ; HSW-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_6: # %else6 -; HSW-NEXT: vpextrb $6, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB2_8 ; HSW-NEXT: # %bb.7: # %cond.load9 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm3 @@ -109,24 +114,27 @@ ; HSW-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_8: # %else10 -; HSW-NEXT: vpextrb $8, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB2_10 ; HSW-NEXT: # %bb.9: # %cond.load13 -; HSW-NEXT: vmovsd {{.*#+}} xmm3 = mem[0],zero -; HSW-NEXT: vblendpd {{.*#+}} ymm1 = ymm3[0],ymm1[1,2,3] +; HSW-NEXT: vmovq {{.*#+}} xmm3 = mem[0],zero +; HSW-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1],ymm1[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_10: # %else14 -; HSW-NEXT: vpextrb $10, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB2_12 ; HSW-NEXT: # %bb.11: # %cond.load17 ; HSW-NEXT: vmovhpd {{.*#+}} xmm3 = xmm1[0],mem[0] ; HSW-NEXT: vblendpd {{.*#+}} ymm1 = ymm3[0,1],ymm1[2,3] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_12: # %else18 -; HSW-NEXT: vpextrb $12, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; HSW-NEXT: vpmovmskb %xmm3, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB2_14 ; HSW-NEXT: # %bb.13: # %cond.load21 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm3 @@ -134,8 +142,9 @@ ; HSW-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB2_14: # %else22 -; HSW-NEXT: vpextrb $14, %xmm2, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; HSW-NEXT: vpmovmskb %xmm2, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB2_16 ; HSW-NEXT: # %bb.15: # %cond.load25 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -221,20 +230,22 @@ ; HSW-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; HSW-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] ; HSW-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 -; HSW-NEXT: vpextrb $0, %xmm1, %eax +; HSW-NEXT: vmovmskpd %xmm1, %eax ; HSW-NEXT: testb $1, %al -; HSW-NEXT: je .LBB5_2 -; HSW-NEXT: # %bb.1: # %cond.load -; HSW-NEXT: vmovd {{.*#+}} xmm2 = mem[0],zero,zero,zero -; HSW-NEXT: vpblendd {{.*#+}} xmm0 = xmm2[0],xmm0[1,2,3] +; HSW-NEXT: jne .LBB5_1 +; HSW-NEXT: # %bb.2: # %else +; HSW-NEXT: testb $2, %al +; HSW-NEXT: jne .LBB5_3 +; HSW-NEXT: .LBB5_4: # %else2 +; HSW-NEXT: retq +; HSW-NEXT: .LBB5_1: # %cond.load +; HSW-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero +; HSW-NEXT: vblendps {{.*#+}} xmm0 = xmm1[0],xmm0[1,2,3] ; HSW-NEXT: addq $4, %rdi -; HSW-NEXT: .LBB5_2: # %else -; HSW-NEXT: vpextrb $8, %xmm1, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB5_4 -; HSW-NEXT: # %bb.3: # %cond.load1 +; HSW-NEXT: .LBB5_3: # %cond.load1 ; HSW-NEXT: vinsertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3] -; HSW-NEXT: .LBB5_4: # %else2 ; HSW-NEXT: retq ; ; SKX-LABEL: expandload_v2f32_v2i1: @@ -266,9 +277,9 @@ ; HSW: # %bb.0: ; HSW-NEXT: vpxor %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $0, %xmm9, %eax +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB6_2 ; HSW-NEXT: # %bb.1: # %cond.load @@ -276,10 +287,10 @@ ; HSW-NEXT: vpblendd {{.*#+}} ymm0 = ymm9[0],ymm0[1,2,3,4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_2: # %else -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $1, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB6_4 ; HSW-NEXT: # %bb.3: # %cond.load1 ; HSW-NEXT: vinsertps {{.*#+}} xmm8 = xmm0[0],mem[0],xmm0[2,3] @@ -288,20 +299,20 @@ ; HSW-NEXT: .LBB6_4: # %else2 ; HSW-NEXT: vxorps %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $2, %xmm9, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB6_6 ; HSW-NEXT: # %bb.5: # %cond.load5 ; HSW-NEXT: vinsertps {{.*#+}} xmm9 = xmm0[0,1],mem[0],xmm0[3] ; HSW-NEXT: vblendps {{.*#+}} ymm0 = ymm9[0,1,2,3],ymm0[4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_6: # %else6 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $3, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB6_8 ; HSW-NEXT: # %bb.7: # %cond.load9 ; HSW-NEXT: vinsertps {{.*#+}} xmm8 = xmm0[0,1,2],mem[0] @@ -310,11 +321,12 @@ ; HSW-NEXT: .LBB6_8: # %else10 ; HSW-NEXT: vxorps %xmm8, %xmm8, %xmm8 ; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm8 -; HSW-NEXT: vextracti128 $1, %ymm8, %xmm8 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm9 -; HSW-NEXT: vpacksswb %xmm0, %xmm9, %xmm9 -; HSW-NEXT: vpextrb $4, %xmm9, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm9 +; HSW-NEXT: vextracti128 $1, %ymm9, %xmm9 +; HSW-NEXT: vpbroadcastw %xmm9, %ymm9 +; HSW-NEXT: vpacksswb %ymm0, %ymm9, %ymm9 +; HSW-NEXT: vpmovmskb %ymm9, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB6_10 ; HSW-NEXT: # %bb.9: # %cond.load13 ; HSW-NEXT: vmovss {{.*#+}} xmm9 = mem[0],zero,zero,zero @@ -323,10 +335,12 @@ ; HSW-NEXT: vinsertf128 $1, %xmm9, %ymm0, %ymm0 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_10: # %else14 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm8 -; HSW-NEXT: vpacksswb %xmm0, %xmm8, %xmm8 -; HSW-NEXT: vpextrb $5, %xmm8, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vextracti128 $1, %ymm8, %xmm8 +; HSW-NEXT: vpbroadcastd %xmm8, %ymm8 +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB6_12 ; HSW-NEXT: # %bb.11: # %cond.load17 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm8 @@ -335,12 +349,12 @@ ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_12: # %else18 ; HSW-NEXT: vxorps %xmm8, %xmm8, %xmm8 -; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm8 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $6, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpcmpeqd %ymm8, %ymm4, %ymm9 +; HSW-NEXT: vpackssdw %ymm0, %ymm9, %ymm8 +; HSW-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB6_14 ; HSW-NEXT: # %bb.13: # %cond.load21 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -348,10 +362,11 @@ ; HSW-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_14: # %else22 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $7, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm9, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB6_16 ; HSW-NEXT: # %bb.15: # %cond.load25 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -360,21 +375,27 @@ ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_16: # %else26 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 -; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $8, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm9 +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm8 +; HSW-NEXT: vpmovzxwd {{.*#+}} ymm8 = xmm8[0],zero,xmm8[1],zero,xmm8[2],zero,xmm8[3],zero,xmm8[4],zero,xmm8[5],zero,xmm8[6],zero,xmm8[7],zero +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vextracti128 $1, %ymm8, %xmm4 +; HSW-NEXT: vpbroadcastb %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $256, %eax # imm = 0x100 ; HSW-NEXT: je .LBB6_18 ; HSW-NEXT: # %bb.17: # %cond.load29 ; HSW-NEXT: vmovd {{.*#+}} xmm4 = mem[0],zero,zero,zero ; HSW-NEXT: vpblendd {{.*#+}} ymm1 = ymm4[0],ymm1[1,2,3,4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_18: # %else30 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $9, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 +; HSW-NEXT: vpbroadcastw %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $512, %eax # imm = 0x200 ; HSW-NEXT: je .LBB6_20 ; HSW-NEXT: # %bb.19: # %cond.load33 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm1[0],mem[0],xmm1[2,3] @@ -382,21 +403,27 @@ ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_20: # %else34 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 -; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm8 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $10, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm9 +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm8 +; HSW-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vextracti128 $1, %ymm8, %xmm4 +; HSW-NEXT: vpbroadcastd %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $1024, %eax # imm = 0x400 ; HSW-NEXT: je .LBB6_22 ; HSW-NEXT: # %bb.21: # %cond.load37 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm1[0,1],mem[0],xmm1[3] ; HSW-NEXT: vblendps {{.*#+}} ymm1 = ymm4[0,1,2,3],ymm1[4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_22: # %else38 -; HSW-NEXT: vpackssdw %xmm0, %xmm8, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $11, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 +; HSW-NEXT: vpbroadcastd %xmm4, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $2048, %eax # imm = 0x800 ; HSW-NEXT: je .LBB6_24 ; HSW-NEXT: # %bb.23: # %cond.load41 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm1[0,1,2],mem[0] @@ -404,24 +431,27 @@ ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_24: # %else42 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 -; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm8 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $12, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm9 +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm8 +; HSW-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm8, %ymm8 +; HSW-NEXT: vpermq {{.*#+}} ymm8 = ymm8[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm8, %eax +; HSW-NEXT: testl $4096, %eax # imm = 0x1000 ; HSW-NEXT: je .LBB6_26 ; HSW-NEXT: # %bb.25: # %cond.load45 -; HSW-NEXT: vmovss {{.*#+}} xmm9 = mem[0],zero,zero,zero +; HSW-NEXT: vmovss {{.*#+}} xmm8 = mem[0],zero,zero,zero ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm4 -; HSW-NEXT: vblendps {{.*#+}} xmm4 = xmm9[0],xmm4[1,2,3] +; HSW-NEXT: vblendps {{.*#+}} xmm4 = xmm8[0],xmm4[1,2,3] ; HSW-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm1 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_26: # %else46 -; HSW-NEXT: vpackssdw %xmm8, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $13, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm9, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $8192, %eax # imm = 0x2000 ; HSW-NEXT: je .LBB6_28 ; HSW-NEXT: # %bb.27: # %cond.load49 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm4 @@ -431,11 +461,12 @@ ; HSW-NEXT: .LBB6_28: # %else50 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 -; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $14, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm5, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $16384, %eax # imm = 0x4000 ; HSW-NEXT: je .LBB6_30 ; HSW-NEXT: # %bb.29: # %cond.load53 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm5 @@ -443,10 +474,12 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm1, %ymm1 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_30: # %else54 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $15, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $32768, %eax # imm = 0x8000 ; HSW-NEXT: je .LBB6_32 ; HSW-NEXT: # %bb.31: # %cond.load57 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm4 @@ -456,20 +489,24 @@ ; HSW-NEXT: .LBB6_32: # %else58 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm6, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm5 -; HSW-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; HSW-NEXT: vpextrb $0, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpmovzxbw {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero,xmm5[8],zero,xmm5[9],zero,xmm5[10],zero,xmm5[11],zero,xmm5[12],zero,xmm5[13],zero,xmm5[14],zero,xmm5[15],zero +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $65536, %eax # imm = 0x10000 ; HSW-NEXT: je .LBB6_34 ; HSW-NEXT: # %bb.33: # %cond.load61 ; HSW-NEXT: vmovd {{.*#+}} xmm5 = mem[0],zero,zero,zero ; HSW-NEXT: vpblendd {{.*#+}} ymm2 = ymm5[0],ymm2[1,2,3,4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_34: # %else62 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $1, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $131072, %eax # imm = 0x20000 ; HSW-NEXT: je .LBB6_36 ; HSW-NEXT: # %bb.35: # %cond.load65 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm2[0],mem[0],xmm2[2,3] @@ -478,20 +515,24 @@ ; HSW-NEXT: .LBB6_36: # %else66 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm6, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm5 -; HSW-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; HSW-NEXT: vpextrb $2, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $262144, %eax # imm = 0x40000 ; HSW-NEXT: je .LBB6_38 ; HSW-NEXT: # %bb.37: # %cond.load69 ; HSW-NEXT: vinsertps {{.*#+}} xmm5 = xmm2[0,1],mem[0],xmm2[3] ; HSW-NEXT: vblendps {{.*#+}} ymm2 = ymm5[0,1,2,3],ymm2[4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_38: # %else70 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $3, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,1,3] +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $524288, %eax # imm = 0x80000 ; HSW-NEXT: je .LBB6_40 ; HSW-NEXT: # %bb.39: # %cond.load73 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm2[0,1,2],mem[0] @@ -500,11 +541,13 @@ ; HSW-NEXT: .LBB6_40: # %else74 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm6, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 -; HSW-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; HSW-NEXT: vpextrb $4, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; HSW-NEXT: vextracti128 $1, %ymm5, %xmm5 +; HSW-NEXT: vpbroadcastw %xmm5, %ymm5 +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $1048576, %eax # imm = 0x100000 ; HSW-NEXT: je .LBB6_42 ; HSW-NEXT: # %bb.41: # %cond.load77 ; HSW-NEXT: vmovss {{.*#+}} xmm8 = mem[0],zero,zero,zero @@ -513,10 +556,13 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_42: # %else78 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $5, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 +; HSW-NEXT: vpbroadcastd %xmm4, %ymm4 +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $2097152, %eax # imm = 0x200000 ; HSW-NEXT: je .LBB6_44 ; HSW-NEXT: # %bb.43: # %cond.load81 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm4 @@ -526,11 +572,12 @@ ; HSW-NEXT: .LBB6_44: # %else82 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm6, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 -; HSW-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; HSW-NEXT: vpextrb $6, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $4194304, %eax # imm = 0x400000 ; HSW-NEXT: je .LBB6_46 ; HSW-NEXT: # %bb.45: # %cond.load85 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm5 @@ -538,10 +585,12 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm2, %ymm2 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_46: # %else86 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $7, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $8388608, %eax # imm = 0x800000 ; HSW-NEXT: je .LBB6_48 ; HSW-NEXT: # %bb.47: # %cond.load89 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm4 @@ -551,20 +600,22 @@ ; HSW-NEXT: .LBB6_48: # %else90 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm7, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm5 -; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $8, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vpmovzxwd {{.*#+}} ymm5 = xmm5[0],zero,xmm5[1],zero,xmm5[2],zero,xmm5[3],zero,xmm5[4],zero,xmm5[5],zero,xmm5[6],zero,xmm5[7],zero +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $16777216, %eax # imm = 0x1000000 ; HSW-NEXT: je .LBB6_50 ; HSW-NEXT: # %bb.49: # %cond.load93 ; HSW-NEXT: vmovd {{.*#+}} xmm5 = mem[0],zero,zero,zero ; HSW-NEXT: vpblendd {{.*#+}} ymm3 = ymm5[0],ymm3[1,2,3,4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_50: # %else94 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $9, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $33554432, %eax # imm = 0x2000000 ; HSW-NEXT: je .LBB6_52 ; HSW-NEXT: # %bb.51: # %cond.load97 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm3[0],mem[0],xmm3[2,3] @@ -573,20 +624,22 @@ ; HSW-NEXT: .LBB6_52: # %else98 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm7, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm5 -; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $10, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $67108864, %eax # imm = 0x4000000 ; HSW-NEXT: je .LBB6_54 ; HSW-NEXT: # %bb.53: # %cond.load101 ; HSW-NEXT: vinsertps {{.*#+}} xmm5 = xmm3[0,1],mem[0],xmm3[3] ; HSW-NEXT: vblendps {{.*#+}} ymm3 = ymm5[0,1,2,3],ymm3[4,5,6,7] ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_54: # %else102 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $11, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $134217728, %eax # imm = 0x8000000 ; HSW-NEXT: je .LBB6_56 ; HSW-NEXT: # %bb.55: # %cond.load105 ; HSW-NEXT: vinsertps {{.*#+}} xmm4 = xmm3[0,1,2],mem[0] @@ -595,11 +648,10 @@ ; HSW-NEXT: .LBB6_56: # %else106 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm7, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 -; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $12, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $268435456, %eax # imm = 0x10000000 ; HSW-NEXT: je .LBB6_58 ; HSW-NEXT: # %bb.57: # %cond.load109 ; HSW-NEXT: vmovss {{.*#+}} xmm5 = mem[0],zero,zero,zero @@ -608,10 +660,10 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_58: # %else110 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $13, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $536870912, %eax # imm = 0x20000000 ; HSW-NEXT: je .LBB6_60 ; HSW-NEXT: # %bb.59: # %cond.load113 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm4 @@ -621,11 +673,10 @@ ; HSW-NEXT: .LBB6_60: # %else114 ; HSW-NEXT: vxorps %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm7, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 -; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $14, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vpacksswb %ymm5, %ymm0, %ymm5 +; HSW-NEXT: vpmovmskb %ymm5, %eax +; HSW-NEXT: testl $1073741824, %eax # imm = 0x40000000 ; HSW-NEXT: je .LBB6_62 ; HSW-NEXT: # %bb.61: # %cond.load117 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm5 @@ -633,10 +684,10 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3 ; HSW-NEXT: addq $4, %rdi ; HSW-NEXT: .LBB6_62: # %else118 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $15, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpacksswb %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpmovmskb %ymm4, %eax +; HSW-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; HSW-NEXT: je .LBB6_64 ; HSW-NEXT: # %bb.63: # %cond.load121 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm4 @@ -674,9 +725,10 @@ ; HSW: # %bb.0: ; HSW-NEXT: vpxor %xmm6, %xmm6, %xmm6 ; HSW-NEXT: vpcmpeqd %ymm6, %ymm4, %ymm6 -; HSW-NEXT: vpackssdw %xmm0, %xmm6, %xmm7 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm7 +; HSW-NEXT: vpermq {{.*#+}} ymm7 = ymm7[0,2,2,3] ; HSW-NEXT: vpacksswb %xmm0, %xmm7, %xmm7 -; HSW-NEXT: vpextrb $0, %xmm7, %eax +; HSW-NEXT: vpmovmskb %xmm7, %eax ; HSW-NEXT: testb $1, %al ; HSW-NEXT: je .LBB7_2 ; HSW-NEXT: # %bb.1: # %cond.load @@ -684,10 +736,10 @@ ; HSW-NEXT: vpblendd {{.*#+}} ymm0 = ymm7[0,1],ymm0[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_2: # %else -; HSW-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm6 ; HSW-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; HSW-NEXT: vpextrb $1, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testb $2, %al ; HSW-NEXT: je .LBB7_4 ; HSW-NEXT: # %bb.3: # %cond.load1 ; HSW-NEXT: vmovhpd {{.*#+}} xmm6 = xmm0[0],mem[0] @@ -696,10 +748,10 @@ ; HSW-NEXT: .LBB7_4: # %else2 ; HSW-NEXT: vxorpd %xmm6, %xmm6, %xmm6 ; HSW-NEXT: vpcmpeqd %ymm6, %ymm4, %ymm6 -; HSW-NEXT: vpackssdw %xmm0, %xmm6, %xmm7 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm7 ; HSW-NEXT: vpacksswb %xmm0, %xmm7, %xmm7 -; HSW-NEXT: vpextrb $2, %xmm7, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm7, %eax +; HSW-NEXT: testb $4, %al ; HSW-NEXT: je .LBB7_6 ; HSW-NEXT: # %bb.5: # %cond.load5 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm7 @@ -707,10 +759,10 @@ ; HSW-NEXT: vinsertf128 $1, %xmm7, %ymm0, %ymm0 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_6: # %else6 -; HSW-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm6 ; HSW-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; HSW-NEXT: vpextrb $3, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testb $8, %al ; HSW-NEXT: je .LBB7_8 ; HSW-NEXT: # %bb.7: # %cond.load9 ; HSW-NEXT: vextractf128 $1, %ymm0, %xmm6 @@ -720,21 +772,24 @@ ; HSW-NEXT: .LBB7_8: # %else10 ; HSW-NEXT: vxorpd %xmm6, %xmm6, %xmm6 ; HSW-NEXT: vpcmpeqd %ymm6, %ymm4, %ymm6 -; HSW-NEXT: vextracti128 $1, %ymm6, %xmm6 -; HSW-NEXT: vpackssdw %xmm6, %xmm0, %xmm7 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm7 +; HSW-NEXT: vextracti128 $1, %ymm7, %xmm7 +; HSW-NEXT: vpbroadcastw %xmm7, %ymm7 ; HSW-NEXT: vpacksswb %xmm0, %xmm7, %xmm7 -; HSW-NEXT: vpextrb $4, %xmm7, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm7, %eax +; HSW-NEXT: testb $16, %al ; HSW-NEXT: je .LBB7_10 ; HSW-NEXT: # %bb.9: # %cond.load13 ; HSW-NEXT: vmovq {{.*#+}} xmm7 = mem[0],zero ; HSW-NEXT: vpblendd {{.*#+}} ymm1 = ymm7[0,1],ymm1[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_10: # %else14 -; HSW-NEXT: vpackssdw %xmm6, %xmm0, %xmm6 +; HSW-NEXT: vpackssdw %ymm0, %ymm6, %ymm6 +; HSW-NEXT: vextracti128 $1, %ymm6, %xmm6 +; HSW-NEXT: vpbroadcastd %xmm6, %ymm6 ; HSW-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; HSW-NEXT: vpextrb $5, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testb $32, %al ; HSW-NEXT: je .LBB7_12 ; HSW-NEXT: # %bb.11: # %cond.load17 ; HSW-NEXT: vmovhpd {{.*#+}} xmm6 = xmm1[0],mem[0] @@ -743,11 +798,11 @@ ; HSW-NEXT: .LBB7_12: # %else18 ; HSW-NEXT: vxorpd %xmm6, %xmm6, %xmm6 ; HSW-NEXT: vpcmpeqd %ymm6, %ymm4, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm6 +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm6 +; HSW-NEXT: vpermq {{.*#+}} ymm6 = ymm6[0,2,2,3] ; HSW-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; HSW-NEXT: vpextrb $6, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testb $64, %al ; HSW-NEXT: je .LBB7_14 ; HSW-NEXT: # %bb.13: # %cond.load21 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm6 @@ -755,10 +810,11 @@ ; HSW-NEXT: vinsertf128 $1, %xmm6, %ymm1, %ymm1 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_14: # %else22 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 +; HSW-NEXT: vpackssdw %ymm0, %ymm4, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,2,2,3] ; HSW-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; HSW-NEXT: vpextrb $7, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm4, %eax +; HSW-NEXT: testb $-128, %al ; HSW-NEXT: je .LBB7_16 ; HSW-NEXT: # %bb.15: # %cond.load25 ; HSW-NEXT: vextractf128 $1, %ymm1, %xmm4 @@ -768,20 +824,24 @@ ; HSW-NEXT: .LBB7_16: # %else26 ; HSW-NEXT: vxorpd %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm6 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm6 +; HSW-NEXT: vpmovzxwd {{.*#+}} ymm6 = xmm6[0],zero,xmm6[1],zero,xmm6[2],zero,xmm6[3],zero,xmm6[4],zero,xmm6[5],zero,xmm6[6],zero,xmm6[7],zero +; HSW-NEXT: vextracti128 $1, %ymm6, %xmm6 ; HSW-NEXT: vpacksswb %xmm6, %xmm0, %xmm6 -; HSW-NEXT: vpextrb $8, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testl $256, %eax # imm = 0x100 ; HSW-NEXT: je .LBB7_18 ; HSW-NEXT: # %bb.17: # %cond.load29 ; HSW-NEXT: vmovq {{.*#+}} xmm6 = mem[0],zero ; HSW-NEXT: vpblendd {{.*#+}} ymm2 = ymm6[0,1],ymm2[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_18: # %else30 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 ; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $9, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm4, %eax +; HSW-NEXT: testl $512, %eax # imm = 0x200 ; HSW-NEXT: je .LBB7_20 ; HSW-NEXT: # %bb.19: # %cond.load33 ; HSW-NEXT: vmovhpd {{.*#+}} xmm4 = xmm2[0],mem[0] @@ -790,10 +850,12 @@ ; HSW-NEXT: .LBB7_20: # %else34 ; HSW-NEXT: vxorpd %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm6 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm6 +; HSW-NEXT: vpermq {{.*#+}} ymm6 = ymm6[0,1,1,3] +; HSW-NEXT: vextracti128 $1, %ymm6, %xmm6 ; HSW-NEXT: vpacksswb %xmm6, %xmm0, %xmm6 -; HSW-NEXT: vpextrb $10, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testl $1024, %eax # imm = 0x400 ; HSW-NEXT: je .LBB7_22 ; HSW-NEXT: # %bb.21: # %cond.load37 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm6 @@ -801,10 +863,12 @@ ; HSW-NEXT: vinsertf128 $1, %xmm6, %ymm2, %ymm2 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_22: # %else38 -; HSW-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vpermq {{.*#+}} ymm4 = ymm4[0,1,1,3] +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 ; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $11, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm4, %eax +; HSW-NEXT: testl $2048, %eax # imm = 0x800 ; HSW-NEXT: je .LBB7_24 ; HSW-NEXT: # %bb.23: # %cond.load41 ; HSW-NEXT: vextractf128 $1, %ymm2, %xmm4 @@ -814,21 +878,22 @@ ; HSW-NEXT: .LBB7_24: # %else42 ; HSW-NEXT: vxorpd %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm6 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm6 +; HSW-NEXT: vextracti128 $1, %ymm6, %xmm6 ; HSW-NEXT: vpacksswb %xmm6, %xmm0, %xmm6 -; HSW-NEXT: vpextrb $12, %xmm6, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm6, %eax +; HSW-NEXT: testl $4096, %eax # imm = 0x1000 ; HSW-NEXT: je .LBB7_26 ; HSW-NEXT: # %bb.25: # %cond.load45 ; HSW-NEXT: vmovq {{.*#+}} xmm6 = mem[0],zero ; HSW-NEXT: vpblendd {{.*#+}} ymm3 = ymm6[0,1],ymm3[2,3,4,5,6,7] ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_26: # %else46 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 ; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $13, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm4, %eax +; HSW-NEXT: testl $8192, %eax # imm = 0x2000 ; HSW-NEXT: je .LBB7_28 ; HSW-NEXT: # %bb.27: # %cond.load49 ; HSW-NEXT: vmovhpd {{.*#+}} xmm4 = xmm3[0],mem[0] @@ -837,11 +902,11 @@ ; HSW-NEXT: .LBB7_28: # %else50 ; HSW-NEXT: vxorpd %xmm4, %xmm4, %xmm4 ; HSW-NEXT: vpcmpeqd %ymm4, %ymm5, %ymm4 -; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm5 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm5 +; HSW-NEXT: vextracti128 $1, %ymm5, %xmm5 ; HSW-NEXT: vpacksswb %xmm5, %xmm0, %xmm5 -; HSW-NEXT: vpextrb $14, %xmm5, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm5, %eax +; HSW-NEXT: testl $16384, %eax # imm = 0x4000 ; HSW-NEXT: je .LBB7_30 ; HSW-NEXT: # %bb.29: # %cond.load53 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm5 @@ -849,10 +914,11 @@ ; HSW-NEXT: vinsertf128 $1, %xmm5, %ymm3, %ymm3 ; HSW-NEXT: addq $8, %rdi ; HSW-NEXT: .LBB7_30: # %else54 -; HSW-NEXT: vpackssdw %xmm4, %xmm0, %xmm4 +; HSW-NEXT: vpackssdw %ymm4, %ymm0, %ymm4 +; HSW-NEXT: vextracti128 $1, %ymm4, %xmm4 ; HSW-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; HSW-NEXT: vpextrb $15, %xmm4, %eax -; HSW-NEXT: testb $1, %al +; HSW-NEXT: vpmovmskb %xmm4, %eax +; HSW-NEXT: testl $32768, %eax # imm = 0x8000 ; HSW-NEXT: je .LBB7_32 ; HSW-NEXT: # %bb.31: # %cond.load57 ; HSW-NEXT: vextractf128 $1, %ymm3, %xmm4 Index: test/CodeGen/X86/masked_gather.ll =================================================================== --- test/CodeGen/X86/masked_gather.ll +++ test/CodeGen/X86/masked_gather.ll @@ -13,16 +13,15 @@ ; SSE: # %bb.0: ; SSE-NEXT: pxor %xmm4, %xmm4 ; SSE-NEXT: pcmpeqd %xmm2, %xmm4 -; SSE-NEXT: pextrb $0, %xmm4, %eax +; SSE-NEXT: movmskps %xmm4, %eax ; SSE-NEXT: testb $1, %al ; SSE-NEXT: je .LBB0_2 ; SSE-NEXT: # %bb.1: # %cond.load -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: movss {{.*#+}} xmm5 = mem[0],zero,zero,zero -; SSE-NEXT: blendps {{.*#+}} xmm3 = xmm5[0],xmm3[1,2,3] +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: movss {{.*#+}} xmm4 = mem[0],zero,zero,zero +; SSE-NEXT: blendps {{.*#+}} xmm3 = xmm4[0],xmm3[1,2,3] ; SSE-NEXT: .LBB0_2: # %else -; SSE-NEXT: pextrb $4, %xmm4, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $2, %al ; SSE-NEXT: je .LBB0_4 ; SSE-NEXT: # %bb.3: # %cond.load1 ; SSE-NEXT: pextrq $1, %xmm0, %rax @@ -30,20 +29,23 @@ ; SSE-NEXT: .LBB0_4: # %else2 ; SSE-NEXT: pxor %xmm0, %xmm0 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE-NEXT: pextrb $8, %xmm2, %eax -; SSE-NEXT: testb $1, %al -; SSE-NEXT: je .LBB0_6 -; SSE-NEXT: # %bb.5: # %cond.load4 -; SSE-NEXT: movq %xmm1, %rax +; SSE-NEXT: movmskps %xmm2, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: jne .LBB0_5 +; SSE-NEXT: # %bb.6: # %else5 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: jne .LBB0_7 +; SSE-NEXT: .LBB0_8: # %else8 +; SSE-NEXT: movaps %xmm3, %xmm0 +; SSE-NEXT: retq +; SSE-NEXT: .LBB0_5: # %cond.load4 +; SSE-NEXT: movq %xmm1, %rcx ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] -; SSE-NEXT: .LBB0_6: # %else5 -; SSE-NEXT: pextrb $12, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $8, %al ; SSE-NEXT: je .LBB0_8 -; SSE-NEXT: # %bb.7: # %cond.load7 +; SSE-NEXT: .LBB0_7: # %cond.load7 ; SSE-NEXT: pextrq $1, %xmm1, %rax ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0] -; SSE-NEXT: .LBB0_8: # %else8 ; SSE-NEXT: movaps %xmm3, %xmm0 ; SSE-NEXT: retq ; @@ -51,39 +53,42 @@ ; AVX1: # %bb.0: ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vmovmskps %xmm3, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB0_2 ; AVX1-NEXT: # %bb.1: # %cond.load -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3] +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB0_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB0_4 ; AVX1-NEXT: # %bb.3: # %cond.load1 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX1-NEXT: .LBB0_4: # %else2 -; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB0_6 -; AVX1-NEXT: # %bb.5: # %cond.load4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vmovq %xmm3, %rax +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB0_5 +; AVX1-NEXT: # %bb.6: # %else5 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB0_7 +; AVX1-NEXT: .LBB0_8: # %else8 +; AVX1-NEXT: vmovaps %xmm2, %xmm0 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB0_5: # %cond.load4 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vmovq %xmm1, %rcx ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX1-NEXT: .LBB0_6: # %else5 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB0_8 -; AVX1-NEXT: # %bb.7: # %cond.load7 +; AVX1-NEXT: .LBB0_7: # %cond.load7 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX1-NEXT: .LBB0_8: # %else8 ; AVX1-NEXT: vmovaps %xmm2, %xmm0 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq @@ -92,39 +97,42 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, %eax +; AVX2-NEXT: vmovmskps %xmm3, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB0_2 ; AVX2-NEXT: # %bb.1: # %cond.load -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3] +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB0_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm3, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB0_4 ; AVX2-NEXT: # %bb.3: # %cond.load1 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX2-NEXT: .LBB0_4: # %else2 -; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB0_6 -; AVX2-NEXT: # %bb.5: # %cond.load4 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vmovq %xmm3, %rax +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB0_5 +; AVX2-NEXT: # %bb.6: # %else5 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB0_7 +; AVX2-NEXT: .LBB0_8: # %else8 +; AVX2-NEXT: vmovaps %xmm2, %xmm0 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB0_5: # %cond.load4 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vmovq %xmm1, %rcx ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX2-NEXT: .LBB0_6: # %else5 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB0_8 -; AVX2-NEXT: # %bb.7: # %cond.load7 +; AVX2-NEXT: .LBB0_7: # %cond.load7 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX2-NEXT: .LBB0_8: # %else8 ; AVX2-NEXT: vmovaps %xmm2, %xmm0 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq @@ -158,17 +166,16 @@ ; SSE-NEXT: pmovsxdq %xmm0, %xmm0 ; SSE-NEXT: pxor %xmm5, %xmm5 ; SSE-NEXT: pcmpeqd %xmm1, %xmm5 -; SSE-NEXT: pextrb $0, %xmm5, %eax +; SSE-NEXT: movmskps %xmm5, %eax ; SSE-NEXT: testb $1, %al ; SSE-NEXT: je .LBB1_2 ; SSE-NEXT: # %bb.1: # %cond.load -; SSE-NEXT: movq %xmm4, %rax -; SSE-NEXT: movss {{.*#+}} xmm6 = mem[0],zero,zero,zero -; SSE-NEXT: blendps {{.*#+}} xmm2 = xmm6[0],xmm2[1,2,3] +; SSE-NEXT: movq %xmm4, %rcx +; SSE-NEXT: movss {{.*#+}} xmm5 = mem[0],zero,zero,zero +; SSE-NEXT: blendps {{.*#+}} xmm2 = xmm5[0],xmm2[1,2,3] ; SSE-NEXT: .LBB1_2: # %else ; SSE-NEXT: psllq $2, %xmm0 -; SSE-NEXT: pextrb $4, %xmm5, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $2, %al ; SSE-NEXT: je .LBB1_4 ; SSE-NEXT: # %bb.3: # %cond.load1 ; SSE-NEXT: pextrq $1, %xmm4, %rax @@ -177,20 +184,23 @@ ; SSE-NEXT: paddq %xmm0, %xmm3 ; SSE-NEXT: pxor %xmm0, %xmm0 ; SSE-NEXT: pcmpeqd %xmm0, %xmm1 -; SSE-NEXT: pextrb $8, %xmm1, %eax -; SSE-NEXT: testb $1, %al -; SSE-NEXT: je .LBB1_6 -; SSE-NEXT: # %bb.5: # %cond.load4 -; SSE-NEXT: movq %xmm3, %rax +; SSE-NEXT: movmskps %xmm1, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: jne .LBB1_5 +; SSE-NEXT: # %bb.6: # %else5 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: jne .LBB1_7 +; SSE-NEXT: .LBB1_8: # %else8 +; SSE-NEXT: movaps %xmm2, %xmm0 +; SSE-NEXT: retq +; SSE-NEXT: .LBB1_5: # %cond.load4 +; SSE-NEXT: movq %xmm3, %rcx ; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; SSE-NEXT: .LBB1_6: # %else5 -; SSE-NEXT: pextrb $12, %xmm1, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $8, %al ; SSE-NEXT: je .LBB1_8 -; SSE-NEXT: # %bb.7: # %cond.load7 +; SSE-NEXT: .LBB1_7: # %cond.load7 ; SSE-NEXT: pextrq $1, %xmm3, %rax ; SSE-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; SSE-NEXT: .LBB1_8: # %else8 ; SSE-NEXT: movaps %xmm2, %xmm0 ; SSE-NEXT: retq ; @@ -208,39 +218,42 @@ ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm0, %ymm0 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vmovmskps %xmm3, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB1_2 ; AVX1-NEXT: # %bb.1: # %cond.load -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vmovd {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3,4,5,6,7] +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB1_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB1_4 ; AVX1-NEXT: # %bb.3: # %cond.load1 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX1-NEXT: .LBB1_4: # %else2 -; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB1_6 -; AVX1-NEXT: # %bb.5: # %cond.load4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vmovq %xmm3, %rax +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB1_5 +; AVX1-NEXT: # %bb.6: # %else5 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB1_7 +; AVX1-NEXT: .LBB1_8: # %else8 +; AVX1-NEXT: vmovaps %xmm2, %xmm0 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB1_5: # %cond.load4 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vmovq %xmm1, %rcx ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX1-NEXT: .LBB1_6: # %else5 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB1_8 -; AVX1-NEXT: # %bb.7: # %cond.load7 +; AVX1-NEXT: .LBB1_7: # %cond.load7 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX1-NEXT: .LBB1_8: # %else8 ; AVX1-NEXT: vmovaps %xmm2, %xmm0 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq @@ -254,39 +267,42 @@ ; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, %eax +; AVX2-NEXT: vmovmskps %xmm3, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB1_2 ; AVX2-NEXT: # %bb.1: # %cond.load -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3] +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB1_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm3, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB1_4 ; AVX2-NEXT: # %bb.3: # %cond.load1 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX2-NEXT: .LBB1_4: # %else2 -; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB1_6 -; AVX2-NEXT: # %bb.5: # %cond.load4 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vmovq %xmm3, %rax +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB1_5 +; AVX2-NEXT: # %bb.6: # %else5 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB1_7 +; AVX2-NEXT: .LBB1_8: # %else8 +; AVX2-NEXT: vmovaps %xmm2, %xmm0 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB1_5: # %cond.load4 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vmovq %xmm1, %rcx ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX2-NEXT: .LBB1_6: # %else5 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB1_8 -; AVX2-NEXT: # %bb.7: # %cond.load7 +; AVX2-NEXT: .LBB1_7: # %cond.load7 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX2-NEXT: .LBB1_8: # %else8 ; AVX2-NEXT: vmovaps %xmm2, %xmm0 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq @@ -321,17 +337,16 @@ ; SSE-NEXT: paddq %xmm4, %xmm0 ; SSE-NEXT: pxor %xmm5, %xmm5 ; SSE-NEXT: pcmpeqd %xmm2, %xmm5 -; SSE-NEXT: pextrb $0, %xmm5, %eax +; SSE-NEXT: movmskps %xmm5, %eax ; SSE-NEXT: testb $1, %al ; SSE-NEXT: je .LBB2_2 ; SSE-NEXT: # %bb.1: # %cond.load -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: movss {{.*#+}} xmm6 = mem[0],zero,zero,zero -; SSE-NEXT: blendps {{.*#+}} xmm3 = xmm6[0],xmm3[1,2,3] +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: movss {{.*#+}} xmm5 = mem[0],zero,zero,zero +; SSE-NEXT: blendps {{.*#+}} xmm3 = xmm5[0],xmm3[1,2,3] ; SSE-NEXT: .LBB2_2: # %else ; SSE-NEXT: psllq $2, %xmm1 -; SSE-NEXT: pextrb $4, %xmm5, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $2, %al ; SSE-NEXT: je .LBB2_4 ; SSE-NEXT: # %bb.3: # %cond.load1 ; SSE-NEXT: pextrq $1, %xmm0, %rax @@ -340,20 +355,23 @@ ; SSE-NEXT: paddq %xmm1, %xmm4 ; SSE-NEXT: pxor %xmm0, %xmm0 ; SSE-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE-NEXT: pextrb $8, %xmm2, %eax -; SSE-NEXT: testb $1, %al -; SSE-NEXT: je .LBB2_6 -; SSE-NEXT: # %bb.5: # %cond.load4 -; SSE-NEXT: movq %xmm4, %rax +; SSE-NEXT: movmskps %xmm2, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: jne .LBB2_5 +; SSE-NEXT: # %bb.6: # %else5 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: jne .LBB2_7 +; SSE-NEXT: .LBB2_8: # %else8 +; SSE-NEXT: movaps %xmm3, %xmm0 +; SSE-NEXT: retq +; SSE-NEXT: .LBB2_5: # %cond.load4 +; SSE-NEXT: movq %xmm4, %rcx ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] -; SSE-NEXT: .LBB2_6: # %else5 -; SSE-NEXT: pextrb $12, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $8, %al ; SSE-NEXT: je .LBB2_8 -; SSE-NEXT: # %bb.7: # %cond.load7 +; SSE-NEXT: .LBB2_7: # %cond.load7 ; SSE-NEXT: pextrq $1, %xmm4, %rax ; SSE-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0] -; SSE-NEXT: .LBB2_8: # %else8 ; SSE-NEXT: movaps %xmm3, %xmm0 ; SSE-NEXT: retq ; @@ -369,39 +387,42 @@ ; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm0, %ymm0 ; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vmovmskps %xmm3, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB2_2 ; AVX1-NEXT: # %bb.1: # %cond.load -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vmovd {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX1-NEXT: vpblendw {{.*#+}} xmm2 = xmm4[0,1],xmm2[2,3,4,5,6,7] +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX1-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX1-NEXT: .LBB2_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB2_4 ; AVX1-NEXT: # %bb.3: # %cond.load1 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX1-NEXT: .LBB2_4: # %else2 -; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB2_6 -; AVX1-NEXT: # %bb.5: # %cond.load4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vmovq %xmm3, %rax +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB2_5 +; AVX1-NEXT: # %bb.6: # %else5 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB2_7 +; AVX1-NEXT: .LBB2_8: # %else8 +; AVX1-NEXT: vmovaps %xmm2, %xmm0 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB2_5: # %cond.load4 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vmovq %xmm1, %rcx ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX1-NEXT: .LBB2_6: # %else5 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB2_8 -; AVX1-NEXT: # %bb.7: # %cond.load7 +; AVX1-NEXT: .LBB2_7: # %cond.load7 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX1-NEXT: .LBB2_8: # %else8 ; AVX1-NEXT: vmovaps %xmm2, %xmm0 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq @@ -414,39 +435,42 @@ ; AVX2-NEXT: vpaddq %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, %eax +; AVX2-NEXT: vmovmskps %xmm3, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB2_2 ; AVX2-NEXT: # %bb.1: # %cond.load -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vmovss {{.*#+}} xmm4 = mem[0],zero,zero,zero -; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm4[0],xmm2[1,2,3] +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vmovss {{.*#+}} xmm3 = mem[0],zero,zero,zero +; AVX2-NEXT: vblendps {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; AVX2-NEXT: .LBB2_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm3, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB2_4 ; AVX2-NEXT: # %bb.3: # %cond.load1 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; AVX2-NEXT: .LBB2_4: # %else2 -; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vxorps %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB2_6 -; AVX2-NEXT: # %bb.5: # %cond.load4 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vmovq %xmm3, %rax +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB2_5 +; AVX2-NEXT: # %bb.6: # %else5 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB2_7 +; AVX2-NEXT: .LBB2_8: # %else8 +; AVX2-NEXT: vmovaps %xmm2, %xmm0 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB2_5: # %cond.load4 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vmovq %xmm1, %rcx ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] -; AVX2-NEXT: .LBB2_6: # %else5 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB2_8 -; AVX2-NEXT: # %bb.7: # %cond.load7 +; AVX2-NEXT: .LBB2_7: # %cond.load7 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vinsertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] -; AVX2-NEXT: .LBB2_8: # %else8 ; AVX2-NEXT: vmovaps %xmm2, %xmm0 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq @@ -486,34 +510,32 @@ ; SSE-NEXT: paddq %xmm8, %xmm0 ; SSE-NEXT: pxor %xmm6, %xmm6 ; SSE-NEXT: pcmpeqb %xmm4, %xmm6 -; SSE-NEXT: pextrb $0, %xmm6, %eax +; SSE-NEXT: pmovmskb %xmm6, %eax ; SSE-NEXT: testb $1, %al ; SSE-NEXT: je .LBB3_2 ; SSE-NEXT: # %bb.1: # %cond.load -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: pinsrb $0, (%rax), %xmm5 +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: pinsrb $0, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_2: # %else ; SSE-NEXT: pmovsxdq %xmm7, %xmm7 -; SSE-NEXT: pextrb $1, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $2, %al ; SSE-NEXT: je .LBB3_4 ; SSE-NEXT: # %bb.3: # %cond.load1 ; SSE-NEXT: pextrq $1, %xmm0, %rax ; SSE-NEXT: pinsrb $1, (%rax), %xmm5 ; SSE-NEXT: .LBB3_4: # %else2 ; SSE-NEXT: paddq %xmm8, %xmm7 -; SSE-NEXT: pxor %xmm6, %xmm6 -; SSE-NEXT: pcmpeqb %xmm4, %xmm6 -; SSE-NEXT: pextrb $2, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pxor %xmm0, %xmm0 +; SSE-NEXT: pcmpeqb %xmm4, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testb $4, %al ; SSE-NEXT: je .LBB3_6 ; SSE-NEXT: # %bb.5: # %cond.load4 -; SSE-NEXT: movq %xmm7, %rax -; SSE-NEXT: pinsrb $2, (%rax), %xmm5 +; SSE-NEXT: movq %xmm7, %rcx +; SSE-NEXT: pinsrb $2, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_6: # %else5 ; SSE-NEXT: pmovsxdq %xmm1, %xmm0 -; SSE-NEXT: pextrb $3, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $8, %al ; SSE-NEXT: je .LBB3_8 ; SSE-NEXT: # %bb.7: # %cond.load7 ; SSE-NEXT: pextrq $1, %xmm7, %rax @@ -523,34 +545,32 @@ ; SSE-NEXT: paddq %xmm8, %xmm0 ; SSE-NEXT: pxor %xmm6, %xmm6 ; SSE-NEXT: pcmpeqb %xmm4, %xmm6 -; SSE-NEXT: pextrb $4, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pmovmskb %xmm6, %eax +; SSE-NEXT: testb $16, %al ; SSE-NEXT: je .LBB3_10 ; SSE-NEXT: # %bb.9: # %cond.load10 -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: pinsrb $4, (%rax), %xmm5 +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: pinsrb $4, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_10: # %else11 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1 -; SSE-NEXT: pextrb $5, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $32, %al ; SSE-NEXT: je .LBB3_12 ; SSE-NEXT: # %bb.11: # %cond.load13 ; SSE-NEXT: pextrq $1, %xmm0, %rax ; SSE-NEXT: pinsrb $5, (%rax), %xmm5 ; SSE-NEXT: .LBB3_12: # %else14 ; SSE-NEXT: paddq %xmm8, %xmm1 -; SSE-NEXT: pxor %xmm6, %xmm6 -; SSE-NEXT: pcmpeqb %xmm4, %xmm6 -; SSE-NEXT: pextrb $6, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pxor %xmm0, %xmm0 +; SSE-NEXT: pcmpeqb %xmm4, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testb $64, %al ; SSE-NEXT: je .LBB3_14 ; SSE-NEXT: # %bb.13: # %cond.load16 -; SSE-NEXT: movq %xmm1, %rax -; SSE-NEXT: pinsrb $6, (%rax), %xmm5 +; SSE-NEXT: movq %xmm1, %rcx +; SSE-NEXT: pinsrb $6, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_14: # %else17 ; SSE-NEXT: pmovsxdq %xmm2, %xmm0 -; SSE-NEXT: pextrb $7, %xmm6, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testb $-128, %al ; SSE-NEXT: je .LBB3_16 ; SSE-NEXT: # %bb.15: # %cond.load19 ; SSE-NEXT: pextrq $1, %xmm1, %rax @@ -560,34 +580,32 @@ ; SSE-NEXT: paddq %xmm8, %xmm0 ; SSE-NEXT: pxor %xmm2, %xmm2 ; SSE-NEXT: pcmpeqb %xmm4, %xmm2 -; SSE-NEXT: pextrb $8, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testl $256, %eax # imm = 0x100 ; SSE-NEXT: je .LBB3_18 ; SSE-NEXT: # %bb.17: # %cond.load22 -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: pinsrb $8, (%rax), %xmm5 +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: pinsrb $8, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_18: # %else23 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1 -; SSE-NEXT: pextrb $9, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testl $512, %eax # imm = 0x200 ; SSE-NEXT: je .LBB3_20 ; SSE-NEXT: # %bb.19: # %cond.load25 ; SSE-NEXT: pextrq $1, %xmm0, %rax ; SSE-NEXT: pinsrb $9, (%rax), %xmm5 ; SSE-NEXT: .LBB3_20: # %else26 ; SSE-NEXT: paddq %xmm8, %xmm1 -; SSE-NEXT: pxor %xmm2, %xmm2 -; SSE-NEXT: pcmpeqb %xmm4, %xmm2 -; SSE-NEXT: pextrb $10, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pxor %xmm0, %xmm0 +; SSE-NEXT: pcmpeqb %xmm4, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $1024, %eax # imm = 0x400 ; SSE-NEXT: je .LBB3_22 ; SSE-NEXT: # %bb.21: # %cond.load28 -; SSE-NEXT: movq %xmm1, %rax -; SSE-NEXT: pinsrb $10, (%rax), %xmm5 +; SSE-NEXT: movq %xmm1, %rcx +; SSE-NEXT: pinsrb $10, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_22: # %else29 ; SSE-NEXT: pmovsxdq %xmm3, %xmm0 -; SSE-NEXT: pextrb $11, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testl $2048, %eax # imm = 0x800 ; SSE-NEXT: je .LBB3_24 ; SSE-NEXT: # %bb.23: # %cond.load31 ; SSE-NEXT: pextrq $1, %xmm1, %rax @@ -597,16 +615,15 @@ ; SSE-NEXT: paddq %xmm8, %xmm0 ; SSE-NEXT: pxor %xmm2, %xmm2 ; SSE-NEXT: pcmpeqb %xmm4, %xmm2 -; SSE-NEXT: pextrb $12, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE-NEXT: je .LBB3_26 ; SSE-NEXT: # %bb.25: # %cond.load34 -; SSE-NEXT: movq %xmm0, %rax -; SSE-NEXT: pinsrb $12, (%rax), %xmm5 +; SSE-NEXT: movq %xmm0, %rcx +; SSE-NEXT: pinsrb $12, (%rcx), %xmm5 ; SSE-NEXT: .LBB3_26: # %else35 ; SSE-NEXT: pmovsxdq %xmm1, %xmm1 -; SSE-NEXT: pextrb $13, %xmm2, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE-NEXT: je .LBB3_28 ; SSE-NEXT: # %bb.27: # %cond.load37 ; SSE-NEXT: pextrq $1, %xmm0, %rax @@ -615,20 +632,23 @@ ; SSE-NEXT: paddq %xmm1, %xmm8 ; SSE-NEXT: pxor %xmm0, %xmm0 ; SSE-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE-NEXT: pextrb $14, %xmm4, %eax -; SSE-NEXT: testb $1, %al -; SSE-NEXT: je .LBB3_30 -; SSE-NEXT: # %bb.29: # %cond.load40 -; SSE-NEXT: movq %xmm8, %rax -; SSE-NEXT: pinsrb $14, (%rax), %xmm5 -; SSE-NEXT: .LBB3_30: # %else41 -; SSE-NEXT: pextrb $15, %xmm4, %eax -; SSE-NEXT: testb $1, %al +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE-NEXT: jne .LBB3_29 +; SSE-NEXT: # %bb.30: # %else41 +; SSE-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE-NEXT: jne .LBB3_31 +; SSE-NEXT: .LBB3_32: # %else44 +; SSE-NEXT: movdqa %xmm5, %xmm0 +; SSE-NEXT: retq +; SSE-NEXT: .LBB3_29: # %cond.load40 +; SSE-NEXT: movq %xmm8, %rcx +; SSE-NEXT: pinsrb $14, (%rcx), %xmm5 +; SSE-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE-NEXT: je .LBB3_32 -; SSE-NEXT: # %bb.31: # %cond.load43 +; SSE-NEXT: .LBB3_31: # %cond.load43 ; SSE-NEXT: pextrq $1, %xmm8, %rax ; SSE-NEXT: pinsrb $15, (%rax), %xmm5 -; SSE-NEXT: .LBB3_32: # %else44 ; SSE-NEXT: movdqa %xmm5, %xmm0 ; SSE-NEXT: retq ; @@ -645,77 +665,73 @@ ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm0, %ymm0 ; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6 ; AVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm6 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax +; AVX1-NEXT: vpmovmskb %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB3_2 ; AVX1-NEXT: # %bb.1: # %cond.load -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vpinsrb $0, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_2: # %else -; AVX1-NEXT: vpshufd {{.*#+}} xmm7 = xmm5[2,3,0,1] +; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm5[2,3,0,1] ; AVX1-NEXT: vpmovsxdq %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $1, %xmm6, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB3_4 ; AVX1-NEXT: # %bb.3: # %cond.load1 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vpinsrb $1, (%rax), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_4: # %else2 -; AVX1-NEXT: vpmovsxdq %xmm7, %xmm6 -; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm8 +; AVX1-NEXT: vpmovsxdq %xmm6, %xmm6 +; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm5 ; AVX1-NEXT: vpxor %xmm7, %xmm7, %xmm7 ; AVX1-NEXT: vpcmpeqb %xmm7, %xmm2, %xmm7 -; AVX1-NEXT: vpextrb $2, %xmm7, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm7, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB3_6 ; AVX1-NEXT: # %bb.5: # %cond.load4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovq %xmm5, %rax -; AVX1-NEXT: vpinsrb $2, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 +; AVX1-NEXT: vmovq %xmm7, %rcx +; AVX1-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_6: # %else5 ; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vpextrb $3, %xmm7, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB3_8 ; AVX1-NEXT: # %bb.7: # %cond.load7 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vpinsrb $3, (%rax), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_8: # %else8 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm0 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm5, %ymm0 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX1-NEXT: vpextrb $4, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB3_10 ; AVX1-NEXT: # %bb.9: # %cond.load10 -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vpinsrb $4, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_10: # %else11 -; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1] +; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] ; AVX1-NEXT: vpmovsxdq %xmm1, %xmm7 -; AVX1-NEXT: vpextrb $5, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB3_12 ; AVX1-NEXT: # %bb.11: # %cond.load13 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vpinsrb $5, (%rax), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_12: # %else14 -; AVX1-NEXT: vpmovsxdq %xmm6, %xmm6 -; AVX1-NEXT: vpaddq %xmm7, %xmm4, %xmm8 +; AVX1-NEXT: vpmovsxdq %xmm5, %xmm6 +; AVX1-NEXT: vpaddq %xmm7, %xmm4, %xmm5 ; AVX1-NEXT: vpxor %xmm7, %xmm7, %xmm7 ; AVX1-NEXT: vpcmpeqb %xmm7, %xmm2, %xmm7 -; AVX1-NEXT: vpextrb $6, %xmm7, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm7, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB3_14 ; AVX1-NEXT: # %bb.13: # %cond.load16 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovq %xmm5, %rax -; AVX1-NEXT: vpinsrb $6, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 +; AVX1-NEXT: vmovq %xmm7, %rcx +; AVX1-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_14: # %else17 ; AVX1-NEXT: vpaddq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vpextrb $7, %xmm7, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB3_16 ; AVX1-NEXT: # %bb.15: # %cond.load19 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 @@ -723,40 +739,38 @@ ; AVX1-NEXT: vpinsrb $7, (%rax), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_16: # %else20 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm1 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm0 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm5, %ymm0 ; AVX1-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX1-NEXT: vpextrb $8, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB3_18 ; AVX1-NEXT: # %bb.17: # %cond.load22 -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vpinsrb $8, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_18: # %else23 -; AVX1-NEXT: vpshufd {{.*#+}} xmm6 = xmm1[2,3,0,1] +; AVX1-NEXT: vpshufd {{.*#+}} xmm5 = xmm1[2,3,0,1] ; AVX1-NEXT: vpmovsxdq %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB3_20 ; AVX1-NEXT: # %bb.19: # %cond.load25 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vpinsrb $9, (%rax), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_20: # %else26 -; AVX1-NEXT: vpmovsxdq %xmm6, %xmm5 +; AVX1-NEXT: vpmovsxdq %xmm5, %xmm5 ; AVX1-NEXT: vpaddq %xmm1, %xmm4, %xmm1 ; AVX1-NEXT: vpxor %xmm6, %xmm6, %xmm6 ; AVX1-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm6 -; AVX1-NEXT: vpextrb $10, %xmm6, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB3_22 ; AVX1-NEXT: # %bb.21: # %cond.load28 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vmovq %xmm7, %rax -; AVX1-NEXT: vpinsrb $10, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vmovq %xmm6, %rcx +; AVX1-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_22: # %else29 ; AVX1-NEXT: vpaddq %xmm5, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $11, %xmm6, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB3_24 ; AVX1-NEXT: # %bb.23: # %cond.load31 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 @@ -766,15 +780,14 @@ ; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm1, %ymm0 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB3_26 ; AVX1-NEXT: # %bb.25: # %cond.load34 -; AVX1-NEXT: vmovq %xmm0, %rax -; AVX1-NEXT: vpinsrb $12, (%rax), %xmm3, %xmm3 +; AVX1-NEXT: vmovq %xmm0, %rcx +; AVX1-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3 ; AVX1-NEXT: .LBB3_26: # %else35 -; AVX1-NEXT: vpextrb $13, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB3_28 ; AVX1-NEXT: # %bb.27: # %cond.load37 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax @@ -782,22 +795,26 @@ ; AVX1-NEXT: .LBB3_28: # %else38 ; AVX1-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB3_30 -; AVX1-NEXT: # %bb.29: # %cond.load40 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX1-NEXT: vmovq %xmm2, %rax -; AVX1-NEXT: vpinsrb $14, (%rax), %xmm3, %xmm3 -; AVX1-NEXT: .LBB3_30: # %else41 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX1-NEXT: jne .LBB3_29 +; AVX1-NEXT: # %bb.30: # %else41 +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX1-NEXT: jne .LBB3_31 +; AVX1-NEXT: .LBB3_32: # %else44 +; AVX1-NEXT: vmovdqa %xmm3, %xmm0 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB3_29: # %cond.load40 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vmovq %xmm1, %rcx +; AVX1-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3 +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB3_32 -; AVX1-NEXT: # %bb.31: # %cond.load43 +; AVX1-NEXT: .LBB3_31: # %cond.load43 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrq $1, %xmm0, %rax ; AVX1-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3 -; AVX1-NEXT: .LBB3_32: # %else44 ; AVX1-NEXT: vmovdqa %xmm3, %xmm0 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq @@ -810,15 +827,14 @@ ; AVX2-NEXT: vpaddq %ymm5, %ymm4, %ymm5 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm6 -; AVX2-NEXT: vpextrb $0, %xmm6, %eax +; AVX2-NEXT: vpmovmskb %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB3_2 ; AVX2-NEXT: # %bb.1: # %cond.load -; AVX2-NEXT: vmovq %xmm5, %rax -; AVX2-NEXT: vpinsrb $0, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vmovq %xmm5, %rcx +; AVX2-NEXT: vpinsrb $0, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm6, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB3_4 ; AVX2-NEXT: # %bb.3: # %cond.load1 ; AVX2-NEXT: vpextrq $1, %xmm5, %rax @@ -827,17 +843,16 @@ ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpxor %xmm6, %xmm6, %xmm6 ; AVX2-NEXT: vpcmpeqb %xmm6, %xmm2, %xmm6 -; AVX2-NEXT: vpextrb $2, %xmm6, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm6, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB3_6 ; AVX2-NEXT: # %bb.5: # %cond.load4 -; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm7 -; AVX2-NEXT: vmovq %xmm7, %rax -; AVX2-NEXT: vpinsrb $2, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm6 +; AVX2-NEXT: vmovq %xmm6, %rcx +; AVX2-NEXT: vpinsrb $2, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_6: # %else5 ; AVX2-NEXT: vpmovsxdq %xmm0, %ymm0 -; AVX2-NEXT: vpextrb $3, %xmm6, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB3_8 ; AVX2-NEXT: # %bb.7: # %cond.load7 ; AVX2-NEXT: vextracti128 $1, %ymm5, %xmm5 @@ -847,15 +862,14 @@ ; AVX2-NEXT: vpaddq %ymm0, %ymm4, %ymm0 ; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX2-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX2-NEXT: vpextrb $4, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB3_10 ; AVX2-NEXT: # %bb.9: # %cond.load10 -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vpinsrb $4, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vpinsrb $4, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_10: # %else11 -; AVX2-NEXT: vpextrb $5, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB3_12 ; AVX2-NEXT: # %bb.11: # %cond.load13 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax @@ -863,35 +877,33 @@ ; AVX2-NEXT: .LBB3_12: # %else14 ; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX2-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX2-NEXT: vpextrb $6, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB3_14 ; AVX2-NEXT: # %bb.13: # %cond.load16 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm6 -; AVX2-NEXT: vmovq %xmm6, %rax -; AVX2-NEXT: vpinsrb $6, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 +; AVX2-NEXT: vmovq %xmm5, %rcx +; AVX2-NEXT: vpinsrb $6, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_14: # %else17 -; AVX2-NEXT: vpmovsxdq %xmm1, %ymm6 -; AVX2-NEXT: vpextrb $7, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovsxdq %xmm1, %ymm5 +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB3_16 ; AVX2-NEXT: # %bb.15: # %cond.load19 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vpinsrb $7, (%rax), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_16: # %else20 -; AVX2-NEXT: vpaddq %ymm6, %ymm4, %ymm0 +; AVX2-NEXT: vpaddq %ymm5, %ymm4, %ymm0 ; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX2-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX2-NEXT: vpextrb $8, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB3_18 ; AVX2-NEXT: # %bb.17: # %cond.load22 -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vpinsrb $8, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vpinsrb $8, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_18: # %else23 -; AVX2-NEXT: vpextrb $9, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB3_20 ; AVX2-NEXT: # %bb.19: # %cond.load25 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax @@ -900,17 +912,16 @@ ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX2-NEXT: vpcmpeqb %xmm5, %xmm2, %xmm5 -; AVX2-NEXT: vpextrb $10, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB3_22 ; AVX2-NEXT: # %bb.21: # %cond.load28 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm6 -; AVX2-NEXT: vmovq %xmm6, %rax -; AVX2-NEXT: vpinsrb $10, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 +; AVX2-NEXT: vmovq %xmm5, %rcx +; AVX2-NEXT: vpinsrb $10, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_22: # %else29 ; AVX2-NEXT: vpmovsxdq %xmm1, %ymm1 -; AVX2-NEXT: vpextrb $11, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB3_24 ; AVX2-NEXT: # %bb.23: # %cond.load31 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -920,15 +931,14 @@ ; AVX2-NEXT: vpaddq %ymm1, %ymm4, %ymm0 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB3_26 ; AVX2-NEXT: # %bb.25: # %cond.load34 -; AVX2-NEXT: vmovq %xmm0, %rax -; AVX2-NEXT: vpinsrb $12, (%rax), %xmm3, %xmm3 +; AVX2-NEXT: vmovq %xmm0, %rcx +; AVX2-NEXT: vpinsrb $12, (%rcx), %xmm3, %xmm3 ; AVX2-NEXT: .LBB3_26: # %else35 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB3_28 ; AVX2-NEXT: # %bb.27: # %cond.load37 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax @@ -936,22 +946,26 @@ ; AVX2-NEXT: .LBB3_28: # %else38 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB3_30 -; AVX2-NEXT: # %bb.29: # %cond.load40 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 -; AVX2-NEXT: vmovq %xmm2, %rax -; AVX2-NEXT: vpinsrb $14, (%rax), %xmm3, %xmm3 -; AVX2-NEXT: .LBB3_30: # %else41 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX2-NEXT: jne .LBB3_29 +; AVX2-NEXT: # %bb.30: # %else41 +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX2-NEXT: jne .LBB3_31 +; AVX2-NEXT: .LBB3_32: # %else44 +; AVX2-NEXT: vmovdqa %xmm3, %xmm0 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB3_29: # %cond.load40 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vmovq %xmm1, %rcx +; AVX2-NEXT: vpinsrb $14, (%rcx), %xmm3, %xmm3 +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB3_32 -; AVX2-NEXT: # %bb.31: # %cond.load43 +; AVX2-NEXT: .LBB3_31: # %cond.load43 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrq $1, %xmm0, %rax ; AVX2-NEXT: vpinsrb $15, (%rax), %xmm3, %xmm3 -; AVX2-NEXT: .LBB3_32: # %else44 ; AVX2-NEXT: vmovdqa %xmm3, %xmm0 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq @@ -963,18 +977,14 @@ ; AVX512-NEXT: vpaddq %zmm4, %zmm3, %zmm4 ; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm5 -; AVX512-NEXT: vpmovsxbd %xmm5, %zmm5 -; AVX512-NEXT: vptestmd %zmm5, %zmm5, %k0 -; AVX512-NEXT: kmovw %k0, %eax +; AVX512-NEXT: vpmovmskb %xmm5, %eax ; AVX512-NEXT: testb $1, %al ; AVX512-NEXT: je .LBB3_2 ; AVX512-NEXT: # %bb.1: # %cond.load -; AVX512-NEXT: vmovq %xmm4, %rax -; AVX512-NEXT: vpinsrb $0, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm4, %rcx +; AVX512-NEXT: vpinsrb $0, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_2: # %else -; AVX512-NEXT: kshiftrw $1, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testb $2, %al ; AVX512-NEXT: je .LBB3_4 ; AVX512-NEXT: # %bb.3: # %cond.load1 ; AVX512-NEXT: vpextrq $1, %xmm4, %rax @@ -982,20 +992,15 @@ ; AVX512-NEXT: .LBB3_4: # %else2 ; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm5 -; AVX512-NEXT: vpmovsxbd %xmm5, %zmm5 -; AVX512-NEXT: vptestmd %zmm5, %zmm5, %k0 -; AVX512-NEXT: kshiftrw $2, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm5, %eax +; AVX512-NEXT: testb $4, %al ; AVX512-NEXT: je .LBB3_6 ; AVX512-NEXT: # %bb.5: # %cond.load4 ; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm5 -; AVX512-NEXT: vmovq %xmm5, %rax -; AVX512-NEXT: vpinsrb $2, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm5, %rcx +; AVX512-NEXT: vpinsrb $2, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_6: # %else5 -; AVX512-NEXT: kshiftrw $3, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testb $8, %al ; AVX512-NEXT: je .LBB3_8 ; AVX512-NEXT: # %bb.7: # %cond.load7 ; AVX512-NEXT: vextracti128 $1, %ymm4, %xmm5 @@ -1004,20 +1009,15 @@ ; AVX512-NEXT: .LBB3_8: # %else8 ; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm5 -; AVX512-NEXT: vpmovsxbd %xmm5, %zmm5 -; AVX512-NEXT: vptestmd %zmm5, %zmm5, %k0 -; AVX512-NEXT: kshiftrw $4, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm5, %eax +; AVX512-NEXT: testb $16, %al ; AVX512-NEXT: je .LBB3_10 ; AVX512-NEXT: # %bb.9: # %cond.load10 ; AVX512-NEXT: vextracti32x4 $2, %zmm4, %xmm5 -; AVX512-NEXT: vmovq %xmm5, %rax -; AVX512-NEXT: vpinsrb $4, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm5, %rcx +; AVX512-NEXT: vpinsrb $4, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_10: # %else11 -; AVX512-NEXT: kshiftrw $5, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testb $32, %al ; AVX512-NEXT: je .LBB3_12 ; AVX512-NEXT: # %bb.11: # %cond.load13 ; AVX512-NEXT: vextracti32x4 $2, %zmm4, %xmm5 @@ -1027,21 +1027,16 @@ ; AVX512-NEXT: vextracti64x4 $1, %zmm0, %ymm0 ; AVX512-NEXT: vpxor %xmm5, %xmm5, %xmm5 ; AVX512-NEXT: vpcmpeqb %xmm5, %xmm1, %xmm5 -; AVX512-NEXT: vpmovsxbd %xmm5, %zmm5 -; AVX512-NEXT: vptestmd %zmm5, %zmm5, %k0 -; AVX512-NEXT: kshiftrw $6, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm5, %eax +; AVX512-NEXT: testb $64, %al ; AVX512-NEXT: je .LBB3_14 ; AVX512-NEXT: # %bb.13: # %cond.load16 ; AVX512-NEXT: vextracti32x4 $3, %zmm4, %xmm5 -; AVX512-NEXT: vmovq %xmm5, %rax -; AVX512-NEXT: vpinsrb $6, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm5, %rcx +; AVX512-NEXT: vpinsrb $6, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_14: # %else17 ; AVX512-NEXT: vpmovsxdq %ymm0, %zmm0 -; AVX512-NEXT: kshiftrw $7, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testb $-128, %al ; AVX512-NEXT: je .LBB3_16 ; AVX512-NEXT: # %bb.15: # %cond.load19 ; AVX512-NEXT: vextracti32x4 $3, %zmm4, %xmm4 @@ -1051,19 +1046,14 @@ ; AVX512-NEXT: vpaddq %zmm0, %zmm3, %zmm0 ; AVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX512-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm3 -; AVX512-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512-NEXT: kshiftrw $8, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm3, %eax +; AVX512-NEXT: testl $256, %eax # imm = 0x100 ; AVX512-NEXT: je .LBB3_18 ; AVX512-NEXT: # %bb.17: # %cond.load22 -; AVX512-NEXT: vmovq %xmm0, %rax -; AVX512-NEXT: vpinsrb $8, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm0, %rcx +; AVX512-NEXT: vpinsrb $8, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_18: # %else23 -; AVX512-NEXT: kshiftrw $9, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testl $512, %eax # imm = 0x200 ; AVX512-NEXT: je .LBB3_20 ; AVX512-NEXT: # %bb.19: # %cond.load25 ; AVX512-NEXT: vpextrq $1, %xmm0, %rax @@ -1071,20 +1061,15 @@ ; AVX512-NEXT: .LBB3_20: # %else26 ; AVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX512-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm3 -; AVX512-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512-NEXT: kshiftrw $10, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm3, %eax +; AVX512-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512-NEXT: je .LBB3_22 ; AVX512-NEXT: # %bb.21: # %cond.load28 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX512-NEXT: vmovq %xmm3, %rax -; AVX512-NEXT: vpinsrb $10, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm3, %rcx +; AVX512-NEXT: vpinsrb $10, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_22: # %else29 -; AVX512-NEXT: kshiftrw $11, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512-NEXT: je .LBB3_24 ; AVX512-NEXT: # %bb.23: # %cond.load31 ; AVX512-NEXT: vextracti128 $1, %ymm0, %xmm3 @@ -1093,20 +1078,15 @@ ; AVX512-NEXT: .LBB3_24: # %else32 ; AVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX512-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm3 -; AVX512-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512-NEXT: kshiftrw $12, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vpmovmskb %xmm3, %eax +; AVX512-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512-NEXT: je .LBB3_26 ; AVX512-NEXT: # %bb.25: # %cond.load34 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3 -; AVX512-NEXT: vmovq %xmm3, %rax -; AVX512-NEXT: vpinsrb $12, (%rax), %xmm2, %xmm2 +; AVX512-NEXT: vmovq %xmm3, %rcx +; AVX512-NEXT: vpinsrb $12, (%rcx), %xmm2, %xmm2 ; AVX512-NEXT: .LBB3_26: # %else35 -; AVX512-NEXT: kshiftrw $13, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512-NEXT: je .LBB3_28 ; AVX512-NEXT: # %bb.27: # %cond.load37 ; AVX512-NEXT: vextracti32x4 $2, %zmm0, %xmm3 @@ -1115,26 +1095,26 @@ ; AVX512-NEXT: .LBB3_28: # %else38 ; AVX512-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX512-NEXT: vpcmpeqb %xmm3, %xmm1, %xmm1 -; AVX512-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512-NEXT: kshiftrw $14, %k0, %k1 -; AVX512-NEXT: kmovw %k1, %eax -; AVX512-NEXT: testb $1, %al -; AVX512-NEXT: je .LBB3_30 -; AVX512-NEXT: # %bb.29: # %cond.load40 +; AVX512-NEXT: vpmovmskb %xmm1, %eax +; AVX512-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX512-NEXT: jne .LBB3_29 +; AVX512-NEXT: # %bb.30: # %else41 +; AVX512-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX512-NEXT: jne .LBB3_31 +; AVX512-NEXT: .LBB3_32: # %else44 +; AVX512-NEXT: vmovdqa %xmm2, %xmm0 +; AVX512-NEXT: vzeroupper +; AVX512-NEXT: retq +; AVX512-NEXT: .LBB3_29: # %cond.load40 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm1 -; AVX512-NEXT: vmovq %xmm1, %rax -; AVX512-NEXT: vpinsrb $14, (%rax), %xmm2, %xmm2 -; AVX512-NEXT: .LBB3_30: # %else41 -; AVX512-NEXT: kshiftrw $15, %k0, %k0 -; AVX512-NEXT: kmovw %k0, %eax -; AVX512-NEXT: testb $1, %al +; AVX512-NEXT: vmovq %xmm1, %rcx +; AVX512-NEXT: vpinsrb $14, (%rcx), %xmm2, %xmm2 +; AVX512-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512-NEXT: je .LBB3_32 -; AVX512-NEXT: # %bb.31: # %cond.load43 +; AVX512-NEXT: .LBB3_31: # %cond.load43 ; AVX512-NEXT: vextracti32x4 $3, %zmm0, %xmm0 ; AVX512-NEXT: vpextrq $1, %xmm0, %rax ; AVX512-NEXT: vpinsrb $15, (%rax), %xmm2, %xmm2 -; AVX512-NEXT: .LBB3_32: # %else44 ; AVX512-NEXT: vmovdqa %xmm2, %xmm0 ; AVX512-NEXT: vzeroupper ; AVX512-NEXT: retq Index: test/CodeGen/X86/masked_gather_scatter_widen.ll =================================================================== --- test/CodeGen/X86/masked_gather_scatter_widen.ll +++ test/CodeGen/X86/masked_gather_scatter_widen.ll @@ -117,50 +117,56 @@ ; ; WIDEN_AVX2-LABEL: test_scatter_v2i32_index: ; WIDEN_AVX2: # %bb.0: +; WIDEN_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; WIDEN_AVX2-NEXT: vmovmskpd %xmm2, %eax ; WIDEN_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1 ; WIDEN_AVX2-NEXT: vpsllq $3, %xmm1, %xmm1 -; WIDEN_AVX2-NEXT: vmovq %rdi, %xmm3 -; WIDEN_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3 -; WIDEN_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1 -; WIDEN_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; WIDEN_AVX2-NEXT: testb $1, %al -; WIDEN_AVX2-NEXT: je .LBB1_2 -; WIDEN_AVX2-NEXT: # %bb.1: # %cond.store -; WIDEN_AVX2-NEXT: vmovq %xmm1, %rax -; WIDEN_AVX2-NEXT: vmovlpd %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB1_2: # %else -; WIDEN_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; WIDEN_AVX2-NEXT: vmovq %rdi, %xmm2 +; WIDEN_AVX2-NEXT: vpbroadcastq %xmm2, %xmm2 +; WIDEN_AVX2-NEXT: vpaddq %xmm1, %xmm2, %xmm1 ; WIDEN_AVX2-NEXT: testb $1, %al +; WIDEN_AVX2-NEXT: jne .LBB1_1 +; WIDEN_AVX2-NEXT: # %bb.2: # %else +; WIDEN_AVX2-NEXT: testb $2, %al +; WIDEN_AVX2-NEXT: jne .LBB1_3 +; WIDEN_AVX2-NEXT: .LBB1_4: # %else2 +; WIDEN_AVX2-NEXT: retq +; WIDEN_AVX2-NEXT: .LBB1_1: # %cond.store +; WIDEN_AVX2-NEXT: vmovq %xmm1, %rcx +; WIDEN_AVX2-NEXT: vmovlpd %xmm0, (%rcx) +; WIDEN_AVX2-NEXT: testb $2, %al ; WIDEN_AVX2-NEXT: je .LBB1_4 -; WIDEN_AVX2-NEXT: # %bb.3: # %cond.store1 +; WIDEN_AVX2-NEXT: .LBB1_3: # %cond.store1 ; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; WIDEN_AVX2-NEXT: vmovhpd %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB1_4: # %else2 ; WIDEN_AVX2-NEXT: retq ; ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_index: ; PROMOTE_AVX2: # %bb.0: -; PROMOTE_AVX2-NEXT: vpsllq $32, %xmm1, %xmm3 -; PROMOTE_AVX2-NEXT: vpsrad $31, %xmm3, %xmm3 -; PROMOTE_AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3] +; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax +; PROMOTE_AVX2-NEXT: vpsllq $32, %xmm1, %xmm2 +; PROMOTE_AVX2-NEXT: vpsrad $31, %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] ; PROMOTE_AVX2-NEXT: vpsllq $3, %xmm1, %xmm1 -; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm3 -; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3 -; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1 -; PROMOTE_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; PROMOTE_AVX2-NEXT: testb $1, %al -; PROMOTE_AVX2-NEXT: je .LBB1_2 -; PROMOTE_AVX2-NEXT: # %bb.1: # %cond.store -; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rax -; PROMOTE_AVX2-NEXT: vmovlpd %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB1_2: # %else -; PROMOTE_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm2 +; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm2, %xmm1 ; PROMOTE_AVX2-NEXT: testb $1, %al +; PROMOTE_AVX2-NEXT: jne .LBB1_1 +; PROMOTE_AVX2-NEXT: # %bb.2: # %else +; PROMOTE_AVX2-NEXT: testb $2, %al +; PROMOTE_AVX2-NEXT: jne .LBB1_3 +; PROMOTE_AVX2-NEXT: .LBB1_4: # %else2 +; PROMOTE_AVX2-NEXT: retq +; PROMOTE_AVX2-NEXT: .LBB1_1: # %cond.store +; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx +; PROMOTE_AVX2-NEXT: vmovlpd %xmm0, (%rcx) +; PROMOTE_AVX2-NEXT: testb $2, %al ; PROMOTE_AVX2-NEXT: je .LBB1_4 -; PROMOTE_AVX2-NEXT: # %bb.3: # %cond.store1 +; PROMOTE_AVX2-NEXT: .LBB1_3: # %cond.store1 ; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; PROMOTE_AVX2-NEXT: vmovhpd %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB1_4: # %else2 ; PROMOTE_AVX2-NEXT: retq %gep = getelementptr double, double *%base, <2 x i32> %ind call void @llvm.masked.scatter.v2f64.v2p0f64(<2 x double> %a1, <2 x double*> %gep, i32 4, <2 x i1> %mask) @@ -273,38 +279,44 @@ ; ; WIDEN_AVX2-LABEL: test_scatter_v2i32_data: ; WIDEN_AVX2: # %bb.0: -; WIDEN_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; WIDEN_AVX2-NEXT: testb $1, %al -; WIDEN_AVX2-NEXT: je .LBB3_2 -; WIDEN_AVX2-NEXT: # %bb.1: # %cond.store -; WIDEN_AVX2-NEXT: vmovq %xmm1, %rax -; WIDEN_AVX2-NEXT: vmovss %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB3_2: # %else -; WIDEN_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; WIDEN_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; WIDEN_AVX2-NEXT: vmovmskpd %xmm2, %eax ; WIDEN_AVX2-NEXT: testb $1, %al +; WIDEN_AVX2-NEXT: jne .LBB3_1 +; WIDEN_AVX2-NEXT: # %bb.2: # %else +; WIDEN_AVX2-NEXT: testb $2, %al +; WIDEN_AVX2-NEXT: jne .LBB3_3 +; WIDEN_AVX2-NEXT: .LBB3_4: # %else2 +; WIDEN_AVX2-NEXT: retq +; WIDEN_AVX2-NEXT: .LBB3_1: # %cond.store +; WIDEN_AVX2-NEXT: vmovq %xmm1, %rcx +; WIDEN_AVX2-NEXT: vmovss %xmm0, (%rcx) +; WIDEN_AVX2-NEXT: testb $2, %al ; WIDEN_AVX2-NEXT: je .LBB3_4 -; WIDEN_AVX2-NEXT: # %bb.3: # %cond.store1 +; WIDEN_AVX2-NEXT: .LBB3_3: # %cond.store1 ; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; WIDEN_AVX2-NEXT: vextractps $1, %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB3_4: # %else2 ; WIDEN_AVX2-NEXT: retq ; ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data: ; PROMOTE_AVX2: # %bb.0: -; PROMOTE_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; PROMOTE_AVX2-NEXT: testb $1, %al -; PROMOTE_AVX2-NEXT: je .LBB3_2 -; PROMOTE_AVX2-NEXT: # %bb.1: # %cond.store -; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rax -; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB3_2: # %else -; PROMOTE_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax ; PROMOTE_AVX2-NEXT: testb $1, %al +; PROMOTE_AVX2-NEXT: jne .LBB3_1 +; PROMOTE_AVX2-NEXT: # %bb.2: # %else +; PROMOTE_AVX2-NEXT: testb $2, %al +; PROMOTE_AVX2-NEXT: jne .LBB3_3 +; PROMOTE_AVX2-NEXT: .LBB3_4: # %else2 +; PROMOTE_AVX2-NEXT: retq +; PROMOTE_AVX2-NEXT: .LBB3_1: # %cond.store +; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx +; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rcx) +; PROMOTE_AVX2-NEXT: testb $2, %al ; PROMOTE_AVX2-NEXT: je .LBB3_4 -; PROMOTE_AVX2-NEXT: # %bb.3: # %cond.store1 +; PROMOTE_AVX2-NEXT: .LBB3_3: # %cond.store1 ; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; PROMOTE_AVX2-NEXT: vextractps $2, %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB3_4: # %else2 ; PROMOTE_AVX2-NEXT: retq call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %ptr, i32 4, <2 x i1> %mask) ret void @@ -420,50 +432,56 @@ ; ; WIDEN_AVX2-LABEL: test_scatter_v2i32_data_index: ; WIDEN_AVX2: # %bb.0: +; WIDEN_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; WIDEN_AVX2-NEXT: vmovmskpd %xmm2, %eax ; WIDEN_AVX2-NEXT: vpmovsxdq %xmm1, %xmm1 ; WIDEN_AVX2-NEXT: vpsllq $2, %xmm1, %xmm1 -; WIDEN_AVX2-NEXT: vmovq %rdi, %xmm3 -; WIDEN_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3 -; WIDEN_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1 -; WIDEN_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; WIDEN_AVX2-NEXT: testb $1, %al -; WIDEN_AVX2-NEXT: je .LBB5_2 -; WIDEN_AVX2-NEXT: # %bb.1: # %cond.store -; WIDEN_AVX2-NEXT: vmovq %xmm1, %rax -; WIDEN_AVX2-NEXT: vmovss %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB5_2: # %else -; WIDEN_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; WIDEN_AVX2-NEXT: vmovq %rdi, %xmm2 +; WIDEN_AVX2-NEXT: vpbroadcastq %xmm2, %xmm2 +; WIDEN_AVX2-NEXT: vpaddq %xmm1, %xmm2, %xmm1 ; WIDEN_AVX2-NEXT: testb $1, %al +; WIDEN_AVX2-NEXT: jne .LBB5_1 +; WIDEN_AVX2-NEXT: # %bb.2: # %else +; WIDEN_AVX2-NEXT: testb $2, %al +; WIDEN_AVX2-NEXT: jne .LBB5_3 +; WIDEN_AVX2-NEXT: .LBB5_4: # %else2 +; WIDEN_AVX2-NEXT: retq +; WIDEN_AVX2-NEXT: .LBB5_1: # %cond.store +; WIDEN_AVX2-NEXT: vmovq %xmm1, %rcx +; WIDEN_AVX2-NEXT: vmovss %xmm0, (%rcx) +; WIDEN_AVX2-NEXT: testb $2, %al ; WIDEN_AVX2-NEXT: je .LBB5_4 -; WIDEN_AVX2-NEXT: # %bb.3: # %cond.store1 +; WIDEN_AVX2-NEXT: .LBB5_3: # %cond.store1 ; WIDEN_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; WIDEN_AVX2-NEXT: vextractps $1, %xmm0, (%rax) -; WIDEN_AVX2-NEXT: .LBB5_4: # %else2 ; WIDEN_AVX2-NEXT: retq ; ; PROMOTE_AVX2-LABEL: test_scatter_v2i32_data_index: ; PROMOTE_AVX2: # %bb.0: -; PROMOTE_AVX2-NEXT: vpsllq $32, %xmm1, %xmm3 -; PROMOTE_AVX2-NEXT: vpsrad $31, %xmm3, %xmm3 -; PROMOTE_AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm3[1],xmm1[2],xmm3[3] +; PROMOTE_AVX2-NEXT: vpsllq $63, %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vmovmskpd %xmm2, %eax +; PROMOTE_AVX2-NEXT: vpsllq $32, %xmm1, %xmm2 +; PROMOTE_AVX2-NEXT: vpsrad $31, %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vpblendd {{.*#+}} xmm1 = xmm1[0],xmm2[1],xmm1[2],xmm2[3] ; PROMOTE_AVX2-NEXT: vpsllq $2, %xmm1, %xmm1 -; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm3 -; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm3, %xmm3 -; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm3, %xmm1 -; PROMOTE_AVX2-NEXT: vpextrb $0, %xmm2, %eax -; PROMOTE_AVX2-NEXT: testb $1, %al -; PROMOTE_AVX2-NEXT: je .LBB5_2 -; PROMOTE_AVX2-NEXT: # %bb.1: # %cond.store -; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rax -; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB5_2: # %else -; PROMOTE_AVX2-NEXT: vpextrb $8, %xmm2, %eax +; PROMOTE_AVX2-NEXT: vmovq %rdi, %xmm2 +; PROMOTE_AVX2-NEXT: vpbroadcastq %xmm2, %xmm2 +; PROMOTE_AVX2-NEXT: vpaddq %xmm1, %xmm2, %xmm1 ; PROMOTE_AVX2-NEXT: testb $1, %al +; PROMOTE_AVX2-NEXT: jne .LBB5_1 +; PROMOTE_AVX2-NEXT: # %bb.2: # %else +; PROMOTE_AVX2-NEXT: testb $2, %al +; PROMOTE_AVX2-NEXT: jne .LBB5_3 +; PROMOTE_AVX2-NEXT: .LBB5_4: # %else2 +; PROMOTE_AVX2-NEXT: retq +; PROMOTE_AVX2-NEXT: .LBB5_1: # %cond.store +; PROMOTE_AVX2-NEXT: vmovq %xmm1, %rcx +; PROMOTE_AVX2-NEXT: vmovss %xmm0, (%rcx) +; PROMOTE_AVX2-NEXT: testb $2, %al ; PROMOTE_AVX2-NEXT: je .LBB5_4 -; PROMOTE_AVX2-NEXT: # %bb.3: # %cond.store1 +; PROMOTE_AVX2-NEXT: .LBB5_3: # %cond.store1 ; PROMOTE_AVX2-NEXT: vpextrq $1, %xmm1, %rax ; PROMOTE_AVX2-NEXT: vextractps $2, %xmm0, (%rax) -; PROMOTE_AVX2-NEXT: .LBB5_4: # %else2 ; PROMOTE_AVX2-NEXT: retq %gep = getelementptr i32, i32 *%base, <2 x i32> %ind call void @llvm.masked.scatter.v2i32.v2p0i32(<2 x i32> %a1, <2 x i32*> %gep, i32 4, <2 x i1> %mask) Index: test/CodeGen/X86/masked_load.ll =================================================================== --- test/CodeGen/X86/masked_load.ll +++ test/CodeGen/X86/masked_load.ll @@ -40,18 +40,21 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB1_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load +; SSE2-NEXT: jne LBB1_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB1_3 +; SSE2-NEXT: LBB1_4: ## %else2 +; SSE2-NEXT: movapd %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB1_1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE2-NEXT: LBB1_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB1_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 +; SSE2-NEXT: LBB1_3: ## %cond.load1 ; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE2-NEXT: LBB1_4: ## %else2 ; SSE2-NEXT: movapd %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -59,18 +62,21 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax +; SSE42-NEXT: movmskpd %xmm2, %eax ; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB1_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load +; SSE42-NEXT: jne LBB1_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB1_3 +; SSE42-NEXT: LBB1_4: ## %else2 +; SSE42-NEXT: movapd %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB1_1: ## %cond.load ; SSE42-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE42-NEXT: LBB1_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB1_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB1_3: ## %cond.load1 ; SSE42-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE42-NEXT: LBB1_4: ## %else2 ; SSE42-NEXT: movapd %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -105,73 +111,37 @@ } define <4 x double> @load_v4f64_v4i32(<4 x i32> %trigger, <4 x double>* %addr, <4 x double> %dst) { -; SSE2-LABEL: load_v4f64_v4i32: -; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE2-NEXT: LBB2_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE2-NEXT: LBB2_4: ## %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] -; SSE2-NEXT: LBB2_6: ## %else5 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] -; SSE2-NEXT: LBB2_8: ## %else8 -; SSE2-NEXT: movapd %xmm1, %xmm0 -; SSE2-NEXT: movapd %xmm2, %xmm1 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v4f64_v4i32: -; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm3, %xmm3 -; SSE42-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE42-NEXT: pextrb $0, %xmm3, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB2_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE42-NEXT: LBB2_2: ## %else -; SSE42-NEXT: pextrb $4, %xmm3, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB2_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE42-NEXT: LBB2_4: ## %else2 -; SSE42-NEXT: pxor %xmm3, %xmm3 -; SSE42-NEXT: pcmpeqd %xmm3, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB2_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] -; SSE42-NEXT: LBB2_6: ## %else5 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB2_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] -; SSE42-NEXT: LBB2_8: ## %else8 -; SSE42-NEXT: movapd %xmm1, %xmm0 -; SSE42-NEXT: movapd %xmm2, %xmm1 -; SSE42-NEXT: retq +; SSE-LABEL: load_v4f64_v4i32: +; SSE: ## %bb.0: +; SSE-NEXT: pxor %xmm3, %xmm3 +; SSE-NEXT: pcmpeqd %xmm0, %xmm3 +; SSE-NEXT: movmskps %xmm3, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: je LBB2_2 +; SSE-NEXT: ## %bb.1: ## %cond.load +; SSE-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] +; SSE-NEXT: LBB2_2: ## %else +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB2_4 +; SSE-NEXT: ## %bb.3: ## %cond.load1 +; SSE-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] +; SSE-NEXT: LBB2_4: ## %else2 +; SSE-NEXT: pxor %xmm3, %xmm3 +; SSE-NEXT: pcmpeqd %xmm3, %xmm0 +; SSE-NEXT: movmskps %xmm0, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB2_6 +; SSE-NEXT: ## %bb.5: ## %cond.load4 +; SSE-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] +; SSE-NEXT: LBB2_6: ## %else5 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB2_8 +; SSE-NEXT: ## %bb.7: ## %cond.load7 +; SSE-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] +; SSE-NEXT: LBB2_8: ## %else8 +; SSE-NEXT: movapd %xmm1, %xmm0 +; SSE-NEXT: movapd %xmm2, %xmm1 +; SSE-NEXT: retq ; ; AVX1-LABEL: load_v4f64_v4i32: ; AVX1: ## %bb.0: @@ -216,77 +186,42 @@ } define <4 x double> @load_v4f64_v4i32_zero(<4 x i32> %trigger, <4 x double>* %addr) { -; SSE2-LABEL: load_v4f64_v4i32_zero: -; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa %xmm0, %xmm2 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: xorpd %xmm1, %xmm1 -; SSE2-NEXT: je LBB3_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero -; SSE2-NEXT: xorpd %xmm1, %xmm1 -; SSE2-NEXT: LBB3_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB3_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] -; SSE2-NEXT: LBB3_4: ## %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB3_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE2-NEXT: LBB3_6: ## %else5 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB3_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE2-NEXT: LBB3_8: ## %else8 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v4f64_v4i32_zero: -; SSE42: ## %bb.0: -; SSE42-NEXT: movdqa %xmm0, %xmm2 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: movdqa %xmm2, %xmm3 -; SSE42-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE42-NEXT: pextrb $0, %xmm3, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: xorpd %xmm1, %xmm1 -; SSE42-NEXT: je LBB3_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movq {{.*#+}} xmm0 = mem[0],zero -; SSE42-NEXT: xorpd %xmm1, %xmm1 -; SSE42-NEXT: LBB3_2: ## %else -; SSE42-NEXT: pextrb $4, %xmm3, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB3_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] -; SSE42-NEXT: LBB3_4: ## %else2 -; SSE42-NEXT: pxor %xmm3, %xmm3 -; SSE42-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB3_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE42-NEXT: LBB3_6: ## %else5 -; SSE42-NEXT: pextrb $12, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB3_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE42-NEXT: LBB3_8: ## %else8 -; SSE42-NEXT: retq +; SSE-LABEL: load_v4f64_v4i32_zero: +; SSE: ## %bb.0: +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: pxor %xmm0, %xmm0 +; SSE-NEXT: movdqa %xmm2, %xmm1 +; SSE-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE-NEXT: movmskps %xmm1, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: xorps %xmm1, %xmm1 +; SSE-NEXT: je LBB3_2 +; SSE-NEXT: ## %bb.1: ## %cond.load +; SSE-NEXT: movq {{.*#+}} xmm0 = mem[0],zero +; SSE-NEXT: xorps %xmm1, %xmm1 +; SSE-NEXT: LBB3_2: ## %else +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB3_4 +; SSE-NEXT: ## %bb.3: ## %cond.load1 +; SSE-NEXT: movhpd {{.*#+}} xmm0 = xmm0[0],mem[0] +; SSE-NEXT: LBB3_4: ## %else2 +; SSE-NEXT: pxor %xmm3, %xmm3 +; SSE-NEXT: pcmpeqd %xmm3, %xmm2 +; SSE-NEXT: movmskps %xmm2, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: jne LBB3_5 +; SSE-NEXT: ## %bb.6: ## %else5 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: jne LBB3_7 +; SSE-NEXT: LBB3_8: ## %else8 +; SSE-NEXT: retq +; SSE-NEXT: LBB3_5: ## %cond.load4 +; SSE-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB3_8 +; SSE-NEXT: LBB3_7: ## %cond.load7 +; SSE-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] +; SSE-NEXT: retq ; ; AVX1-LABEL: load_v4f64_v4i32_zero: ; AVX1: ## %bb.0: @@ -334,14 +269,17 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,0,3,2] ; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB4_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] ; SSE2-NEXT: LBB4_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB4_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] @@ -350,14 +288,16 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] ; SSE2-NEXT: pand %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB4_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] ; SSE2-NEXT: LBB4_6: ## %else5 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB4_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movhpd {{.*#+}} xmm3 = xmm3[0],mem[0] @@ -370,28 +310,33 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm4, %xmm4 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm4 -; SSE42-NEXT: pextrb $0, %xmm4, %eax +; SSE42-NEXT: movdqa %xmm4, %xmm0 +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB4_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] ; SSE42-NEXT: LBB4_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm4 +; SSE42-NEXT: movmskps %xmm4, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB4_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] ; SSE42-NEXT: LBB4_4: ## %else2 ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE42-NEXT: pextrb $0, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB4_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] ; SSE42-NEXT: LBB4_6: ## %else5 -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB4_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: movhpd {{.*#+}} xmm3 = xmm3[0],mem[0] @@ -441,133 +386,81 @@ } define <8 x double> @load_v8f64_v8i16(<8 x i16> %trigger, <8 x double>* %addr, <8 x double> %dst) { -; SSE2-LABEL: load_v8f64_v8i16: -; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE2-NEXT: LBB5_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE2-NEXT: LBB5_4: ## %else2 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: pextrw $2, %xmm5, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] -; SSE2-NEXT: LBB5_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm5, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] -; SSE2-NEXT: LBB5_8: ## %else8 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: pextrw $4, %xmm5, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_10 -; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] -; SSE2-NEXT: LBB5_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm5, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_12 -; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: movhpd {{.*#+}} xmm3 = xmm3[0],mem[0] -; SSE2-NEXT: LBB5_12: ## %else14 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpeqw %xmm5, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_14 -; SSE2-NEXT: ## %bb.13: ## %cond.load16 -; SSE2-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] -; SSE2-NEXT: LBB5_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB5_16 -; SSE2-NEXT: ## %bb.15: ## %cond.load19 -; SSE2-NEXT: movhpd {{.*#+}} xmm4 = xmm4[0],mem[0] -; SSE2-NEXT: LBB5_16: ## %else20 -; SSE2-NEXT: movapd %xmm1, %xmm0 -; SSE2-NEXT: movapd %xmm2, %xmm1 -; SSE2-NEXT: movapd %xmm3, %xmm2 -; SSE2-NEXT: movapd %xmm4, %xmm3 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v8f64_v8i16: -; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm5, %xmm5 -; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $0, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE42-NEXT: LBB5_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] -; SSE42-NEXT: LBB5_4: ## %else2 -; SSE42-NEXT: pxor %xmm5, %xmm5 -; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $4, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] -; SSE42-NEXT: LBB5_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] -; SSE42-NEXT: LBB5_8: ## %else8 -; SSE42-NEXT: pxor %xmm5, %xmm5 -; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $8, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_10 -; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] -; SSE42-NEXT: LBB5_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm5, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_12 -; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: movhpd {{.*#+}} xmm3 = xmm3[0],mem[0] -; SSE42-NEXT: LBB5_12: ## %else14 -; SSE42-NEXT: pxor %xmm5, %xmm5 -; SSE42-NEXT: pcmpeqw %xmm5, %xmm0 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_14 -; SSE42-NEXT: ## %bb.13: ## %cond.load16 -; SSE42-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] -; SSE42-NEXT: LBB5_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB5_16 -; SSE42-NEXT: ## %bb.15: ## %cond.load19 -; SSE42-NEXT: movhpd {{.*#+}} xmm4 = xmm4[0],mem[0] -; SSE42-NEXT: LBB5_16: ## %else20 -; SSE42-NEXT: movapd %xmm1, %xmm0 -; SSE42-NEXT: movapd %xmm2, %xmm1 -; SSE42-NEXT: movapd %xmm3, %xmm2 -; SSE42-NEXT: movapd %xmm4, %xmm3 -; SSE42-NEXT: retq +; SSE-LABEL: load_v8f64_v8i16: +; SSE: ## %bb.0: +; SSE-NEXT: pxor %xmm5, %xmm5 +; SSE-NEXT: pcmpeqw %xmm0, %xmm5 +; SSE-NEXT: movdqa %xmm5, %xmm6 +; SSE-NEXT: packsswb %xmm0, %xmm6 +; SSE-NEXT: pmovmskb %xmm6, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: je LBB5_2 +; SSE-NEXT: ## %bb.1: ## %cond.load +; SSE-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] +; SSE-NEXT: LBB5_2: ## %else +; SSE-NEXT: packsswb %xmm0, %xmm5 +; SSE-NEXT: pmovmskb %xmm5, %eax +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB5_4 +; SSE-NEXT: ## %bb.3: ## %cond.load1 +; SSE-NEXT: movhpd {{.*#+}} xmm1 = xmm1[0],mem[0] +; SSE-NEXT: LBB5_4: ## %else2 +; SSE-NEXT: pxor %xmm5, %xmm5 +; SSE-NEXT: pcmpeqw %xmm0, %xmm5 +; SSE-NEXT: movdqa %xmm5, %xmm6 +; SSE-NEXT: packsswb %xmm0, %xmm6 +; SSE-NEXT: pmovmskb %xmm6, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB5_6 +; SSE-NEXT: ## %bb.5: ## %cond.load4 +; SSE-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] +; SSE-NEXT: LBB5_6: ## %else5 +; SSE-NEXT: packsswb %xmm0, %xmm5 +; SSE-NEXT: pmovmskb %xmm5, %eax +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB5_8 +; SSE-NEXT: ## %bb.7: ## %cond.load7 +; SSE-NEXT: movhpd {{.*#+}} xmm2 = xmm2[0],mem[0] +; SSE-NEXT: LBB5_8: ## %else8 +; SSE-NEXT: pxor %xmm5, %xmm5 +; SSE-NEXT: pcmpeqw %xmm0, %xmm5 +; SSE-NEXT: movdqa %xmm5, %xmm6 +; SSE-NEXT: packsswb %xmm0, %xmm6 +; SSE-NEXT: pmovmskb %xmm6, %eax +; SSE-NEXT: testb $16, %al +; SSE-NEXT: je LBB5_10 +; SSE-NEXT: ## %bb.9: ## %cond.load10 +; SSE-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] +; SSE-NEXT: LBB5_10: ## %else11 +; SSE-NEXT: packsswb %xmm0, %xmm5 +; SSE-NEXT: pmovmskb %xmm5, %eax +; SSE-NEXT: testb $32, %al +; SSE-NEXT: je LBB5_12 +; SSE-NEXT: ## %bb.11: ## %cond.load13 +; SSE-NEXT: movhpd {{.*#+}} xmm3 = xmm3[0],mem[0] +; SSE-NEXT: LBB5_12: ## %else14 +; SSE-NEXT: pxor %xmm5, %xmm5 +; SSE-NEXT: pcmpeqw %xmm5, %xmm0 +; SSE-NEXT: movdqa %xmm0, %xmm5 +; SSE-NEXT: packsswb %xmm0, %xmm5 +; SSE-NEXT: pmovmskb %xmm5, %eax +; SSE-NEXT: testb $64, %al +; SSE-NEXT: je LBB5_14 +; SSE-NEXT: ## %bb.13: ## %cond.load16 +; SSE-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] +; SSE-NEXT: LBB5_14: ## %else17 +; SSE-NEXT: packsswb %xmm0, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testb $-128, %al +; SSE-NEXT: je LBB5_16 +; SSE-NEXT: ## %bb.15: ## %cond.load19 +; SSE-NEXT: movhpd {{.*#+}} xmm4 = xmm4[0],mem[0] +; SSE-NEXT: LBB5_16: ## %else20 +; SSE-NEXT: movapd %xmm1, %xmm0 +; SSE-NEXT: movapd %xmm2, %xmm1 +; SSE-NEXT: movapd %xmm3, %xmm2 +; SSE-NEXT: movapd %xmm4, %xmm3 +; SSE-NEXT: retq ; ; AVX1-LABEL: load_v8f64_v8i16: ; AVX1: ## %bb.0: @@ -627,141 +520,209 @@ define <8 x double> @load_v8f64_v8i64(<8 x i64> %trigger, <8 x double>* %addr, <8 x double> %dst) { ; SSE2-LABEL: load_v8f64_v8i64: ; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa %xmm7, %xmm8 -; SSE2-NEXT: pxor %xmm7, %xmm7 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2] -; SSE2-NEXT: pand %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movapd %xmm7, %xmm8 +; SSE2-NEXT: movdqa %xmm6, %xmm9 +; SSE2-NEXT: movapd %xmm5, %xmm10 +; SSE2-NEXT: pxor %xmm6, %xmm6 +; SSE2-NEXT: movdqa %xmm0, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,0,3,2] +; SSE2-NEXT: pand %xmm5, %xmm7 +; SSE2-NEXT: movdqa %xmm7, %xmm5 +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB6_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] ; SSE2-NEXT: LBB6_2: ## %else -; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,0,3,2] +; SSE2-NEXT: pand %xmm6, %xmm5 +; SSE2-NEXT: packssdw %xmm5, %xmm7 +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB6_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movhpd {{.*#+}} xmm4 = xmm4[0],mem[0] ; SSE2-NEXT: LBB6_4: ## %else2 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: pxor %xmm5, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,0,3,2] +; SSE2-NEXT: pand %xmm0, %xmm7 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] ; SSE2-NEXT: pand %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: movdqa %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB6_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movlpd {{.*#+}} xmm5 = mem[0],xmm5[1] +; SSE2-NEXT: movlpd {{.*#+}} xmm10 = mem[0],xmm10[1] ; SSE2-NEXT: LBB6_6: ## %else5 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB6_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movhpd {{.*#+}} xmm5 = xmm5[0],mem[0] +; SSE2-NEXT: movhpd {{.*#+}} xmm10 = xmm10[0],mem[0] ; SSE2-NEXT: LBB6_8: ## %else8 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] -; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: movdqa %xmm2, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,0,3,2] +; SSE2-NEXT: pand %xmm5, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,0,3,2] +; SSE2-NEXT: pand %xmm1, %xmm5 +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB6_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: movlpd {{.*#+}} xmm6 = mem[0],xmm6[1] +; SSE2-NEXT: movlpd {{.*#+}} xmm9 = mem[0],xmm9[1] ; SSE2-NEXT: LBB6_10: ## %else11 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB6_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: movhpd {{.*#+}} xmm6 = xmm6[0],mem[0] +; SSE2-NEXT: movhpd {{.*#+}} xmm9 = xmm9[0],mem[0] ; SSE2-NEXT: LBB6_12: ## %else14 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,0,3,2] -; SSE2-NEXT: pand %xmm3, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] +; SSE2-NEXT: pand %xmm2, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,0,3,2] +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB6_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movlpd {{.*#+}} xmm8 = mem[0],xmm8[1] ; SSE2-NEXT: LBB6_14: ## %else17 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB6_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movhpd {{.*#+}} xmm8 = xmm8[0],mem[0] ; SSE2-NEXT: LBB6_16: ## %else20 ; SSE2-NEXT: movapd %xmm4, %xmm0 -; SSE2-NEXT: movapd %xmm5, %xmm1 -; SSE2-NEXT: movapd %xmm6, %xmm2 +; SSE2-NEXT: movapd %xmm10, %xmm1 +; SSE2-NEXT: movapd %xmm9, %xmm2 ; SSE2-NEXT: movapd %xmm8, %xmm3 ; SSE2-NEXT: retq ; ; SSE42-LABEL: load_v8f64_v8i64: ; SSE42: ## %bb.0: -; SSE42-NEXT: movdqa %xmm7, %xmm8 -; SSE42-NEXT: pxor %xmm7, %xmm7 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm7 -; SSE42-NEXT: pextrb $0, %xmm7, %eax +; SSE42-NEXT: movapd %xmm7, %xmm8 +; SSE42-NEXT: movdqa %xmm6, %xmm9 +; SSE42-NEXT: movapd %xmm5, %xmm10 +; SSE42-NEXT: pxor %xmm6, %xmm6 +; SSE42-NEXT: movdqa %xmm0, %xmm5 +; SSE42-NEXT: pcmpeqq %xmm6, %xmm5 +; SSE42-NEXT: movdqa %xmm5, %xmm7 +; SSE42-NEXT: packssdw %xmm0, %xmm7 +; SSE42-NEXT: packssdw %xmm0, %xmm7 +; SSE42-NEXT: packsswb %xmm0, %xmm7 +; SSE42-NEXT: pmovmskb %xmm7, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB6_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] ; SSE42-NEXT: LBB6_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm7, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pcmpeqq %xmm1, %xmm6 +; SSE42-NEXT: packssdw %xmm6, %xmm5 +; SSE42-NEXT: packssdw %xmm0, %xmm5 +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB6_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: movhpd {{.*#+}} xmm4 = xmm4[0],mem[0] ; SSE42-NEXT: LBB6_4: ## %else2 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE42-NEXT: pextrb $0, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pxor %xmm5, %xmm5 +; SSE42-NEXT: pcmpeqq %xmm5, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm5, %xmm1 +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movdqa %xmm0, %xmm1 +; SSE42-NEXT: packssdw %xmm0, %xmm1 +; SSE42-NEXT: packsswb %xmm0, %xmm1 +; SSE42-NEXT: pmovmskb %xmm1, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB6_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: movlpd {{.*#+}} xmm5 = mem[0],xmm5[1] +; SSE42-NEXT: movlpd {{.*#+}} xmm10 = mem[0],xmm10[1] ; SSE42-NEXT: LBB6_6: ## %else5 -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB6_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: movhpd {{.*#+}} xmm5 = xmm5[0],mem[0] +; SSE42-NEXT: movhpd {{.*#+}} xmm10 = xmm10[0],mem[0] ; SSE42-NEXT: LBB6_8: ## %else8 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pxor %xmm1, %xmm1 +; SSE42-NEXT: movdqa %xmm2, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm1, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm3, %xmm1 +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: packssdw %xmm0, %xmm1 +; SSE42-NEXT: packsswb %xmm0, %xmm1 +; SSE42-NEXT: pmovmskb %xmm1, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB6_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: movlpd {{.*#+}} xmm6 = mem[0],xmm6[1] +; SSE42-NEXT: movlpd {{.*#+}} xmm9 = mem[0],xmm9[1] ; SSE42-NEXT: LBB6_10: ## %else11 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB6_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: movhpd {{.*#+}} xmm6 = xmm6[0],mem[0] +; SSE42-NEXT: movhpd {{.*#+}} xmm9 = xmm9[0],mem[0] ; SSE42-NEXT: LBB6_12: ## %else14 ; SSE42-NEXT: pxor %xmm0, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm3 -; SSE42-NEXT: pextrb $0, %xmm3, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm3, %xmm2 +; SSE42-NEXT: packssdw %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB6_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: movlpd {{.*#+}} xmm8 = mem[0],xmm8[1] ; SSE42-NEXT: LBB6_14: ## %else17 -; SSE42-NEXT: pextrb $8, %xmm3, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB6_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: movhpd {{.*#+}} xmm8 = xmm8[0],mem[0] ; SSE42-NEXT: LBB6_16: ## %else20 ; SSE42-NEXT: movapd %xmm4, %xmm0 -; SSE42-NEXT: movapd %xmm5, %xmm1 -; SSE42-NEXT: movapd %xmm6, %xmm2 +; SSE42-NEXT: movapd %xmm10, %xmm1 +; SSE42-NEXT: movapd %xmm9, %xmm2 ; SSE42-NEXT: movapd %xmm8, %xmm3 ; SSE42-NEXT: retq ; @@ -815,22 +776,25 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB7_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero -; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] -; SSE2-NEXT: LBB7_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne LBB7_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB7_3 +; SSE2-NEXT: LBB7_4: ## %else2 +; SSE2-NEXT: movaps %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB7_1: ## %cond.load +; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB7_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 +; SSE2-NEXT: LBB7_3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[0,0] ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[2,0],xmm1[2,3] ; SSE2-NEXT: movaps %xmm0, %xmm1 -; SSE2-NEXT: LBB7_4: ## %else2 ; SSE2-NEXT: movaps %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -839,19 +803,22 @@ ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] ; SSE42-NEXT: pcmpeqq %xmm2, %xmm0 -; SSE42-NEXT: pextrb $0, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB7_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero -; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm2[0,1],xmm1[2,3,4,5,6,7] -; SSE42-NEXT: LBB7_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: movmskpd %xmm0, %eax ; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: jne LBB7_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB7_3 +; SSE42-NEXT: LBB7_4: ## %else2 +; SSE42-NEXT: movaps %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB7_1: ## %cond.load +; SSE42-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; SSE42-NEXT: blendps {{.*#+}} xmm1 = xmm0[0],xmm1[1,2,3] +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB7_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB7_3: ## %cond.load1 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3] -; SSE42-NEXT: LBB7_4: ## %else2 ; SSE42-NEXT: movaps %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -904,47 +871,50 @@ ; SSE2-LABEL: load_v2f32_v2i32_undef: ; SSE2: ## %bb.0: ; SSE2-NEXT: pand {{.*}}(%rip), %xmm0 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] +; SSE2-NEXT: pand %xmm1, %xmm0 +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: ## implicit-def: $xmm0 -; SSE2-NEXT: je LBB8_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load +; SSE2-NEXT: jne LBB8_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB8_3 +; SSE2-NEXT: LBB8_4: ## %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB8_1: ## %cond.load ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; SSE2-NEXT: LBB8_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB8_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 +; SSE2-NEXT: LBB8_3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,0],xmm0[0,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[2,0],xmm0[2,3] ; SSE2-NEXT: movaps %xmm1, %xmm0 -; SSE2-NEXT: LBB8_4: ## %else2 ; SSE2-NEXT: retq ; ; SSE42-LABEL: load_v2f32_v2i32_undef: ; SSE42: ## %bb.0: -; SSE42-NEXT: movdqa %xmm0, %xmm1 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,3],xmm1[4,5],xmm0[6,7] -; SSE42-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE42-NEXT: pextrb $0, %xmm1, %eax +; SSE42-NEXT: pxor %xmm1, %xmm1 +; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm1[2,3],xmm0[4,5],xmm1[6,7] +; SSE42-NEXT: pcmpeqq %xmm1, %xmm0 +; SSE42-NEXT: movmskpd %xmm0, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: ## implicit-def: $xmm0 -; SSE42-NEXT: je LBB8_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load +; SSE42-NEXT: jne LBB8_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB8_3 +; SSE42-NEXT: LBB8_4: ## %else2 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB8_1: ## %cond.load ; SSE42-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; SSE42-NEXT: LBB8_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB8_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB8_3: ## %cond.load1 ; SSE42-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3] -; SSE42-NEXT: LBB8_4: ## %else2 ; SSE42-NEXT: retq ; ; AVX1-LABEL: load_v2f32_v2i32_undef: @@ -994,15 +964,14 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movmskps %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB9_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] +; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] ; SSE2-NEXT: LBB9_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB9_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero @@ -1012,22 +981,25 @@ ; SSE2-NEXT: LBB9_4: ## %else2 ; SSE2-NEXT: xorps %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB9_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero -; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0] -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2] -; SSE2-NEXT: LBB9_6: ## %else5 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB9_5 +; SSE2-NEXT: ## %bb.6: ## %else5 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB9_7 +; SSE2-NEXT: LBB9_8: ## %else8 +; SSE2-NEXT: movaps %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB9_5: ## %cond.load4 +; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0] +; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2] +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB9_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 +; SSE2-NEXT: LBB9_7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0] -; SSE2-NEXT: LBB9_8: ## %else8 ; SSE2-NEXT: movaps %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -1035,33 +1007,35 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax +; SSE42-NEXT: movmskps %xmm2, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB9_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; SSE42-NEXT: blendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] +; SSE42-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; SSE42-NEXT: blendps {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] ; SSE42-NEXT: LBB9_2: ## %else -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB9_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3] ; SSE42-NEXT: LBB9_4: ## %else2 -; SSE42-NEXT: pxor %xmm2, %xmm2 +; SSE42-NEXT: xorps %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB9_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $4, %al +; SSE42-NEXT: jne LBB9_5 +; SSE42-NEXT: ## %bb.6: ## %else5 +; SSE42-NEXT: testb $8, %al +; SSE42-NEXT: jne LBB9_7 +; SSE42-NEXT: LBB9_8: ## %else8 +; SSE42-NEXT: movaps %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB9_5: ## %cond.load4 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3] -; SSE42-NEXT: LBB9_6: ## %else5 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB9_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 +; SSE42-NEXT: LBB9_7: ## %cond.load7 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0] -; SSE42-NEXT: LBB9_8: ## %else8 ; SSE42-NEXT: movaps %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -1099,7 +1073,10 @@ ; SSE2-LABEL: load_v8f32_v8i1_zero: ; SSE2: ## %bb.0: ; SSE2-NEXT: movdqa %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: psllw $15, %xmm2 +; SSE2-NEXT: movdqa %xmm2, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: xorps %xmm1, %xmm1 @@ -1108,8 +1085,10 @@ ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: xorps %xmm1, %xmm1 ; SSE2-NEXT: LBB10_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB10_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -1117,31 +1096,39 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm0[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm0 ; SSE2-NEXT: LBB10_4: ## %else2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB10_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0,2] ; SSE2-NEXT: LBB10_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB10_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[2,0] ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,0] ; SSE2-NEXT: LBB10_8: ## %else8 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB10_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] ; SSE2-NEXT: LBB10_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB10_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -1149,16 +1136,19 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm1 ; SSE2-NEXT: LBB10_12: ## %else14 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB10_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2] ; SSE2-NEXT: LBB10_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB10_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero @@ -1170,54 +1160,70 @@ ; SSE42-LABEL: load_v8f32_v8i1_zero: ; SSE42: ## %bb.0: ; SSE42-NEXT: movdqa %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm0, %eax +; SSE42-NEXT: psllw $15, %xmm2 +; SSE42-NEXT: movdqa %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: xorps %xmm1, %xmm1 +; SSE42-NEXT: pxor %xmm1, %xmm1 ; SSE42-NEXT: je LBB10_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero -; SSE42-NEXT: xorps %xmm1, %xmm1 +; SSE42-NEXT: pxor %xmm1, %xmm1 ; SSE42-NEXT: LBB10_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB10_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: insertps {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[2,3] ; SSE42-NEXT: LBB10_4: ## %else2 -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB10_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1],mem[0],xmm0[3] ; SSE42-NEXT: LBB10_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB10_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: insertps {{.*#+}} xmm0 = xmm0[0,1,2],mem[0] ; SSE42-NEXT: LBB10_8: ## %else8 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB10_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; SSE42-NEXT: blendps {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] +; SSE42-NEXT: movd {{.*#+}} xmm3 = mem[0],zero,zero,zero +; SSE42-NEXT: pblendw {{.*#+}} xmm1 = xmm3[0,1],xmm1[2,3,4,5,6,7] ; SSE42-NEXT: LBB10_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB10_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[2,3] ; SSE42-NEXT: LBB10_12: ## %else14 -; SSE42-NEXT: pextrb $12, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB10_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1],mem[0],xmm1[3] ; SSE42-NEXT: LBB10_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm2 +; SSE42-NEXT: pmovmskb %xmm2, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB10_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: insertps {{.*#+}} xmm1 = xmm1[0,1,2],mem[0] @@ -1270,17 +1276,18 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB11_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movss {{.*#+}} xmm5 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm5[0],xmm2[1,2,3] ; SSE2-NEXT: LBB11_2: ## %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB11_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm4 = mem[0],zero,zero,zero @@ -1290,16 +1297,21 @@ ; SSE2-NEXT: LBB11_4: ## %else2 ; SSE2-NEXT: xorps %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB11_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movss {{.*#+}} xmm4 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[0,0],xmm2[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm4[0,2] ; SSE2-NEXT: LBB11_6: ## %else5 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB11_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero @@ -1308,15 +1320,19 @@ ; SSE2-NEXT: LBB11_8: ## %else8 ; SSE2-NEXT: xorps %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB11_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 ; SSE2-NEXT: movss {{.*#+}} xmm4 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm3 = xmm4[0],xmm3[1,2,3] ; SSE2-NEXT: LBB11_10: ## %else11 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB11_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero @@ -1326,16 +1342,20 @@ ; SSE2-NEXT: LBB11_12: ## %else14 ; SSE2-NEXT: xorps %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB11_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm3[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,1],xmm0[0,2] ; SSE2-NEXT: LBB11_14: ## %else17 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB11_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero @@ -1350,58 +1370,76 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm4, %xmm4 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm4 -; SSE42-NEXT: pextrb $0, %xmm4, %eax +; SSE42-NEXT: movdqa %xmm4, %xmm5 +; SSE42-NEXT: packssdw %xmm0, %xmm5 +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB11_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movss {{.*#+}} xmm5 = mem[0],zero,zero,zero -; SSE42-NEXT: blendps {{.*#+}} xmm2 = xmm5[0],xmm2[1,2,3] +; SSE42-NEXT: movd {{.*#+}} xmm5 = mem[0],zero,zero,zero +; SSE42-NEXT: pblendw {{.*#+}} xmm2 = xmm5[0,1],xmm2[2,3,4,5,6,7] ; SSE42-NEXT: LBB11_2: ## %else -; SSE42-NEXT: pextrb $4, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm4 +; SSE42-NEXT: packsswb %xmm0, %xmm4 +; SSE42-NEXT: pmovmskb %xmm4, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB11_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: insertps {{.*#+}} xmm2 = xmm2[0],mem[0],xmm2[2,3] ; SSE42-NEXT: LBB11_4: ## %else2 ; SSE42-NEXT: pxor %xmm4, %xmm4 ; SSE42-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm4 +; SSE42-NEXT: packssdw %xmm0, %xmm4 +; SSE42-NEXT: packsswb %xmm0, %xmm4 +; SSE42-NEXT: pmovmskb %xmm4, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB11_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1],mem[0],xmm2[3] ; SSE42-NEXT: LBB11_6: ## %else5 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB11_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: insertps {{.*#+}} xmm2 = xmm2[0,1,2],mem[0] ; SSE42-NEXT: LBB11_8: ## %else8 ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: pcmpeqd %xmm1, %xmm0 -; SSE42-NEXT: pextrb $0, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm4 +; SSE42-NEXT: packsswb %xmm0, %xmm4 +; SSE42-NEXT: pmovmskb %xmm4, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB11_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 ; SSE42-NEXT: movd {{.*#+}} xmm4 = mem[0],zero,zero,zero ; SSE42-NEXT: pblendw {{.*#+}} xmm3 = xmm4[0,1],xmm3[2,3,4,5,6,7] ; SSE42-NEXT: LBB11_10: ## %else11 -; SSE42-NEXT: pextrb $4, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB11_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 ; SSE42-NEXT: insertps {{.*#+}} xmm3 = xmm3[0],mem[0],xmm3[2,3] ; SSE42-NEXT: LBB11_12: ## %else14 ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm1 -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB11_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1],mem[0],xmm3[3] ; SSE42-NEXT: LBB11_14: ## %else17 -; SSE42-NEXT: pextrb $12, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB11_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: insertps {{.*#+}} xmm3 = xmm3[0,1,2],mem[0] @@ -1489,19 +1527,22 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB13_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load +; SSE2-NEXT: jne LBB13_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB13_3 +; SSE2-NEXT: LBB13_4: ## %else2 +; SSE2-NEXT: movapd %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB13_1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] -; SSE2-NEXT: LBB13_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB13_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 +; SSE2-NEXT: LBB13_3: ## %cond.load1 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero ; SSE2-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] -; SSE2-NEXT: LBB13_4: ## %else2 ; SSE2-NEXT: movapd %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -1509,18 +1550,21 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax +; SSE42-NEXT: movmskpd %xmm2, %eax ; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB13_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load +; SSE42-NEXT: jne LBB13_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB13_3 +; SSE42-NEXT: LBB13_4: ## %else2 +; SSE42-NEXT: movdqa %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB13_1: ## %cond.load ; SSE42-NEXT: pinsrq $0, (%rdi), %xmm1 -; SSE42-NEXT: LBB13_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB13_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB13_3: ## %cond.load1 ; SSE42-NEXT: pinsrq $1, 8(%rdi), %xmm1 -; SSE42-NEXT: LBB13_4: ## %else2 ; SSE42-NEXT: movdqa %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -1569,14 +1613,17 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[1,0,3,2] ; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB14_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] ; SSE2-NEXT: LBB14_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB14_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero @@ -1586,14 +1633,16 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] ; SSE2-NEXT: pand %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB14_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] ; SSE2-NEXT: LBB14_6: ## %else5 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB14_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero @@ -1607,28 +1656,33 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm4, %xmm4 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm4 -; SSE42-NEXT: pextrb $0, %xmm4, %eax +; SSE42-NEXT: movdqa %xmm4, %xmm0 +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB14_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: pinsrq $0, (%rdi), %xmm2 ; SSE42-NEXT: LBB14_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm4 +; SSE42-NEXT: movmskps %xmm4, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB14_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrq $1, 8(%rdi), %xmm2 ; SSE42-NEXT: LBB14_4: ## %else2 ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE42-NEXT: pextrb $0, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB14_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: pinsrq $0, 16(%rdi), %xmm3 ; SSE42-NEXT: LBB14_6: ## %else5 -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB14_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: pinsrq $1, 24(%rdi), %xmm3 @@ -1682,14 +1736,17 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm5, %xmm5 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: movdqa %xmm5, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB15_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm1 = mem[0],xmm1[1] ; SSE2-NEXT: LBB15_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB15_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = mem[0],zero @@ -1697,14 +1754,17 @@ ; SSE2-NEXT: LBB15_4: ## %else2 ; SSE2-NEXT: xorpd %xmm5, %xmm5 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: pextrw $2, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm5, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB15_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movlpd {{.*#+}} xmm2 = mem[0],xmm2[1] ; SSE2-NEXT: LBB15_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB15_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = mem[0],zero @@ -1712,14 +1772,17 @@ ; SSE2-NEXT: LBB15_8: ## %else8 ; SSE2-NEXT: xorpd %xmm5, %xmm5 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE2-NEXT: pextrw $4, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm5, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB15_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 ; SSE2-NEXT: movlpd {{.*#+}} xmm3 = mem[0],xmm3[1] ; SSE2-NEXT: LBB15_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB15_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movsd {{.*#+}} xmm5 = mem[0],zero @@ -1727,14 +1790,17 @@ ; SSE2-NEXT: LBB15_12: ## %else14 ; SSE2-NEXT: xorpd %xmm5, %xmm5 ; SSE2-NEXT: pcmpeqw %xmm5, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB15_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] ; SSE2-NEXT: LBB15_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB15_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero @@ -1750,56 +1816,68 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm5, %xmm5 ; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $0, %xmm5, %eax +; SSE42-NEXT: movdqa %xmm5, %xmm6 +; SSE42-NEXT: packsswb %xmm0, %xmm6 +; SSE42-NEXT: pmovmskb %xmm6, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB15_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: pinsrq $0, (%rdi), %xmm1 ; SSE42-NEXT: LBB15_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm5, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB15_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrq $1, 8(%rdi), %xmm1 ; SSE42-NEXT: LBB15_4: ## %else2 ; SSE42-NEXT: pxor %xmm5, %xmm5 ; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $4, %xmm5, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm5, %xmm6 +; SSE42-NEXT: packsswb %xmm0, %xmm6 +; SSE42-NEXT: pmovmskb %xmm6, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB15_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: pinsrq $0, 16(%rdi), %xmm2 ; SSE42-NEXT: LBB15_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm5, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB15_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: pinsrq $1, 24(%rdi), %xmm2 ; SSE42-NEXT: LBB15_8: ## %else8 ; SSE42-NEXT: pxor %xmm5, %xmm5 ; SSE42-NEXT: pcmpeqw %xmm0, %xmm5 -; SSE42-NEXT: pextrb $8, %xmm5, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm5, %xmm6 +; SSE42-NEXT: packsswb %xmm0, %xmm6 +; SSE42-NEXT: pmovmskb %xmm6, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB15_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 ; SSE42-NEXT: pinsrq $0, 32(%rdi), %xmm3 ; SSE42-NEXT: LBB15_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm5, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB15_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 ; SSE42-NEXT: pinsrq $1, 40(%rdi), %xmm3 ; SSE42-NEXT: LBB15_12: ## %else14 ; SSE42-NEXT: pxor %xmm5, %xmm5 ; SSE42-NEXT: pcmpeqw %xmm5, %xmm0 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm5 +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB15_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: pinsrq $0, 48(%rdi), %xmm4 ; SSE42-NEXT: LBB15_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB15_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: pinsrq $1, 56(%rdi), %xmm4 @@ -1868,145 +1946,213 @@ define <8 x i64> @load_v8i64_v8i64(<8 x i64> %trigger, <8 x i64>* %addr, <8 x i64> %dst) { ; SSE2-LABEL: load_v8i64_v8i64: ; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa %xmm7, %xmm8 -; SSE2-NEXT: pxor %xmm7, %xmm7 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,0,3,2] -; SSE2-NEXT: pand %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movapd %xmm7, %xmm8 +; SSE2-NEXT: movdqa %xmm6, %xmm9 +; SSE2-NEXT: movapd %xmm5, %xmm10 +; SSE2-NEXT: pxor %xmm6, %xmm6 +; SSE2-NEXT: movdqa %xmm0, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm5[1,0,3,2] +; SSE2-NEXT: pand %xmm5, %xmm7 +; SSE2-NEXT: movdqa %xmm7, %xmm5 +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB16_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movlpd {{.*#+}} xmm4 = mem[0],xmm4[1] ; SSE2-NEXT: LBB16_2: ## %else -; SSE2-NEXT: psrldq {{.*#+}} xmm0 = xmm0[6,7,8,9,10,11,12,13,14,15],zero,zero,zero,zero,zero,zero -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm6[1,0,3,2] +; SSE2-NEXT: pand %xmm6, %xmm5 +; SSE2-NEXT: packssdw %xmm5, %xmm7 +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB16_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; SSE2-NEXT: unpcklpd {{.*#+}} xmm4 = xmm4[0],xmm0[0] +; SSE2-NEXT: movsd {{.*#+}} xmm5 = mem[0],zero +; SSE2-NEXT: unpcklpd {{.*#+}} xmm4 = xmm4[0],xmm5[0] ; SSE2-NEXT: LBB16_4: ## %else2 -; SSE2-NEXT: xorpd %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: xorpd %xmm5, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,0,3,2] +; SSE2-NEXT: pand %xmm0, %xmm7 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,0,3,2] ; SSE2-NEXT: pand %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: movdqa %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB16_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movlpd {{.*#+}} xmm5 = mem[0],xmm5[1] +; SSE2-NEXT: movlpd {{.*#+}} xmm10 = mem[0],xmm10[1] ; SSE2-NEXT: LBB16_6: ## %else5 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB16_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; SSE2-NEXT: unpcklpd {{.*#+}} xmm5 = xmm5[0],xmm0[0] +; SSE2-NEXT: unpcklpd {{.*#+}} xmm10 = xmm10[0],xmm0[0] ; SSE2-NEXT: LBB16_8: ## %else8 -; SSE2-NEXT: xorpd %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] -; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: movdqa %xmm2, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,0,3,2] +; SSE2-NEXT: pand %xmm5, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[1,0,3,2] +; SSE2-NEXT: pand %xmm1, %xmm5 +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB16_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: movlpd {{.*#+}} xmm6 = mem[0],xmm6[1] +; SSE2-NEXT: movlpd {{.*#+}} xmm9 = mem[0],xmm9[1] ; SSE2-NEXT: LBB16_10: ## %else11 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB16_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero -; SSE2-NEXT: unpcklpd {{.*#+}} xmm6 = xmm6[0],xmm0[0] +; SSE2-NEXT: unpcklpd {{.*#+}} xmm9 = xmm9[0],xmm0[0] ; SSE2-NEXT: LBB16_12: ## %else14 -; SSE2-NEXT: xorpd %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,0,3,2] -; SSE2-NEXT: pand %xmm3, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] +; SSE2-NEXT: pand %xmm2, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,0,3,2] +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB16_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movlpd {{.*#+}} xmm8 = mem[0],xmm8[1] ; SSE2-NEXT: LBB16_14: ## %else17 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB16_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero ; SSE2-NEXT: unpcklpd {{.*#+}} xmm8 = xmm8[0],xmm0[0] ; SSE2-NEXT: LBB16_16: ## %else20 ; SSE2-NEXT: movapd %xmm4, %xmm0 -; SSE2-NEXT: movapd %xmm5, %xmm1 -; SSE2-NEXT: movapd %xmm6, %xmm2 +; SSE2-NEXT: movapd %xmm10, %xmm1 +; SSE2-NEXT: movapd %xmm9, %xmm2 ; SSE2-NEXT: movapd %xmm8, %xmm3 ; SSE2-NEXT: retq ; ; SSE42-LABEL: load_v8i64_v8i64: ; SSE42: ## %bb.0: ; SSE42-NEXT: movdqa %xmm7, %xmm8 -; SSE42-NEXT: pxor %xmm7, %xmm7 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm7 -; SSE42-NEXT: pextrb $0, %xmm7, %eax +; SSE42-NEXT: movdqa %xmm6, %xmm9 +; SSE42-NEXT: movdqa %xmm5, %xmm10 +; SSE42-NEXT: pxor %xmm6, %xmm6 +; SSE42-NEXT: movdqa %xmm0, %xmm5 +; SSE42-NEXT: pcmpeqq %xmm6, %xmm5 +; SSE42-NEXT: movdqa %xmm5, %xmm7 +; SSE42-NEXT: packssdw %xmm0, %xmm7 +; SSE42-NEXT: packssdw %xmm0, %xmm7 +; SSE42-NEXT: packsswb %xmm0, %xmm7 +; SSE42-NEXT: pmovmskb %xmm7, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB16_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: pinsrq $0, (%rdi), %xmm4 ; SSE42-NEXT: LBB16_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm7, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pcmpeqq %xmm1, %xmm6 +; SSE42-NEXT: packssdw %xmm6, %xmm5 +; SSE42-NEXT: packssdw %xmm0, %xmm5 +; SSE42-NEXT: packsswb %xmm0, %xmm5 +; SSE42-NEXT: pmovmskb %xmm5, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB16_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrq $1, 8(%rdi), %xmm4 ; SSE42-NEXT: LBB16_4: ## %else2 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm1 -; SSE42-NEXT: pextrb $0, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pxor %xmm5, %xmm5 +; SSE42-NEXT: pcmpeqq %xmm5, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm5, %xmm1 +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: movdqa %xmm0, %xmm1 +; SSE42-NEXT: packssdw %xmm0, %xmm1 +; SSE42-NEXT: packsswb %xmm0, %xmm1 +; SSE42-NEXT: pmovmskb %xmm1, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB16_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: pinsrq $0, 16(%rdi), %xmm5 +; SSE42-NEXT: pinsrq $0, 16(%rdi), %xmm10 ; SSE42-NEXT: LBB16_6: ## %else5 -; SSE42-NEXT: pextrb $8, %xmm1, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB16_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: pinsrq $1, 24(%rdi), %xmm5 +; SSE42-NEXT: pinsrq $1, 24(%rdi), %xmm10 ; SSE42-NEXT: LBB16_8: ## %else8 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: pxor %xmm1, %xmm1 +; SSE42-NEXT: movdqa %xmm2, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm1, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm3, %xmm1 +; SSE42-NEXT: packssdw %xmm1, %xmm0 +; SSE42-NEXT: packssdw %xmm0, %xmm1 +; SSE42-NEXT: packsswb %xmm0, %xmm1 +; SSE42-NEXT: pmovmskb %xmm1, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB16_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: pinsrq $0, 32(%rdi), %xmm6 +; SSE42-NEXT: pinsrq $0, 32(%rdi), %xmm9 ; SSE42-NEXT: LBB16_10: ## %else11 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm0, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB16_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: pinsrq $1, 40(%rdi), %xmm6 +; SSE42-NEXT: pinsrq $1, 40(%rdi), %xmm9 ; SSE42-NEXT: LBB16_12: ## %else14 ; SSE42-NEXT: pxor %xmm0, %xmm0 +; SSE42-NEXT: pcmpeqq %xmm0, %xmm2 ; SSE42-NEXT: pcmpeqq %xmm0, %xmm3 -; SSE42-NEXT: pextrb $0, %xmm3, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm3, %xmm2 +; SSE42-NEXT: packssdw %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB16_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: pinsrq $0, 48(%rdi), %xmm8 ; SSE42-NEXT: LBB16_14: ## %else17 -; SSE42-NEXT: pextrb $8, %xmm3, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packssdw %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB16_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: pinsrq $1, 56(%rdi), %xmm8 ; SSE42-NEXT: LBB16_16: ## %else20 ; SSE42-NEXT: movdqa %xmm4, %xmm0 -; SSE42-NEXT: movdqa %xmm5, %xmm1 -; SSE42-NEXT: movdqa %xmm6, %xmm2 +; SSE42-NEXT: movdqa %xmm10, %xmm1 +; SSE42-NEXT: movdqa %xmm9, %xmm2 ; SSE42-NEXT: movdqa %xmm8, %xmm3 ; SSE42-NEXT: retq ; @@ -2060,22 +2206,25 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB17_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movl (%rdi), %eax -; SSE2-NEXT: movq %rax, %xmm2 -; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm2[0],xmm1[1] -; SSE2-NEXT: LBB17_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne LBB17_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB17_3 +; SSE2-NEXT: LBB17_4: ## %else2 +; SSE2-NEXT: movapd %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB17_1: ## %cond.load +; SSE2-NEXT: movl (%rdi), %ecx +; SSE2-NEXT: movq %rcx, %xmm0 +; SSE2-NEXT: movsd {{.*#+}} xmm1 = xmm0[0],xmm1[1] +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB17_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 +; SSE2-NEXT: LBB17_3: ## %cond.load1 ; SSE2-NEXT: movl 4(%rdi), %eax ; SSE2-NEXT: movq %rax, %xmm0 ; SSE2-NEXT: unpcklpd {{.*#+}} xmm1 = xmm1[0],xmm0[0] -; SSE2-NEXT: LBB17_4: ## %else2 ; SSE2-NEXT: movapd %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -2084,20 +2233,23 @@ ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] ; SSE42-NEXT: pcmpeqq %xmm2, %xmm0 -; SSE42-NEXT: pextrb $0, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB17_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: movl (%rdi), %eax -; SSE42-NEXT: pinsrq $0, %rax, %xmm1 -; SSE42-NEXT: LBB17_2: ## %else -; SSE42-NEXT: pextrb $8, %xmm0, %eax +; SSE42-NEXT: movmskpd %xmm0, %eax ; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: jne LBB17_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB17_3 +; SSE42-NEXT: LBB17_4: ## %else2 +; SSE42-NEXT: movdqa %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB17_1: ## %cond.load +; SSE42-NEXT: movl (%rdi), %ecx +; SSE42-NEXT: pinsrq $0, %rcx, %xmm1 +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB17_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB17_3: ## %cond.load1 ; SSE42-NEXT: movl 4(%rdi), %eax ; SSE42-NEXT: pinsrq $1, %rax, %xmm1 -; SSE42-NEXT: LBB17_4: ## %else2 ; SSE42-NEXT: movdqa %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -2157,15 +2309,14 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movmskps %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB18_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero -; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] +; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero +; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm2[0],xmm1[1,2,3] ; SSE2-NEXT: LBB18_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB18_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero @@ -2175,22 +2326,25 @@ ; SSE2-NEXT: LBB18_4: ## %else2 ; SSE2-NEXT: xorps %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB18_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero -; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,0],xmm1[3,0] -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[0,2] -; SSE2-NEXT: LBB18_6: ## %else5 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB18_5 +; SSE2-NEXT: ## %bb.6: ## %else5 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB18_7 +; SSE2-NEXT: LBB18_8: ## %else8 +; SSE2-NEXT: movaps %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB18_5: ## %cond.load4 +; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[3,0] +; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[0,2] +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB18_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 +; SSE2-NEXT: LBB18_7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,0],xmm1[2,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm0[2,0] -; SSE2-NEXT: LBB18_8: ## %else8 ; SSE2-NEXT: movaps %xmm1, %xmm0 ; SSE2-NEXT: retq ; @@ -2198,32 +2352,34 @@ ; SSE42: ## %bb.0: ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax +; SSE42-NEXT: movmskps %xmm2, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB18_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: pinsrd $0, (%rdi), %xmm1 ; SSE42-NEXT: LBB18_2: ## %else -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB18_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrd $1, 4(%rdi), %xmm1 ; SSE42-NEXT: LBB18_4: ## %else2 ; SSE42-NEXT: pxor %xmm2, %xmm2 ; SSE42-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB18_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 +; SSE42-NEXT: movmskps %xmm0, %eax +; SSE42-NEXT: testb $4, %al +; SSE42-NEXT: jne LBB18_5 +; SSE42-NEXT: ## %bb.6: ## %else5 +; SSE42-NEXT: testb $8, %al +; SSE42-NEXT: jne LBB18_7 +; SSE42-NEXT: LBB18_8: ## %else8 +; SSE42-NEXT: movdqa %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB18_5: ## %cond.load4 ; SSE42-NEXT: pinsrd $2, 8(%rdi), %xmm1 -; SSE42-NEXT: LBB18_6: ## %else5 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB18_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 +; SSE42-NEXT: LBB18_7: ## %cond.load7 ; SSE42-NEXT: pinsrd $3, 12(%rdi), %xmm1 -; SSE42-NEXT: LBB18_8: ## %else8 ; SSE42-NEXT: movdqa %xmm1, %xmm0 ; SSE42-NEXT: retq ; @@ -2268,15 +2424,20 @@ define <8 x i32> @load_v8i32_v8i1(<8 x i1> %mask, <8 x i32>* %addr, <8 x i32> %dst) { ; SSE2-LABEL: load_v8i32_v8i1: ; SSE2: ## %bb.0: -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: psllw $15, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB19_2 ; SSE2-NEXT: ## %bb.1: ## %cond.load ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] ; SSE2-NEXT: LBB19_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB19_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -2284,31 +2445,39 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm1 ; SSE2-NEXT: LBB19_4: ## %else2 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB19_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2] ; SSE2-NEXT: LBB19_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB19_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[2,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[2,0] ; SSE2-NEXT: LBB19_8: ## %else8 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB19_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm2 = xmm3[0],xmm2[1,2,3] ; SSE2-NEXT: LBB19_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB19_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -2316,16 +2485,19 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm2[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm2 ; SSE2-NEXT: LBB19_12: ## %else14 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB19_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm2[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,1],xmm3[0,2] ; SSE2-NEXT: LBB19_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB19_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero @@ -2338,50 +2510,66 @@ ; ; SSE42-LABEL: load_v8i32_v8i1: ; SSE42: ## %bb.0: -; SSE42-NEXT: pextrb $0, %xmm0, %eax +; SSE42-NEXT: psllw $15, %xmm0 +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: je LBB19_2 ; SSE42-NEXT: ## %bb.1: ## %cond.load ; SSE42-NEXT: pinsrd $0, (%rdi), %xmm1 ; SSE42-NEXT: LBB19_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB19_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrd $1, 4(%rdi), %xmm1 ; SSE42-NEXT: LBB19_4: ## %else2 -; SSE42-NEXT: pextrb $4, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB19_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: pinsrd $2, 8(%rdi), %xmm1 ; SSE42-NEXT: LBB19_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB19_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: pinsrd $3, 12(%rdi), %xmm1 ; SSE42-NEXT: LBB19_8: ## %else8 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB19_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 ; SSE42-NEXT: pinsrd $0, 16(%rdi), %xmm2 ; SSE42-NEXT: LBB19_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB19_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 ; SSE42-NEXT: pinsrd $1, 20(%rdi), %xmm2 ; SSE42-NEXT: LBB19_12: ## %else14 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm0, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB19_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: pinsrd $2, 24(%rdi), %xmm2 ; SSE42-NEXT: LBB19_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB19_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: pinsrd $3, 28(%rdi), %xmm2 @@ -2436,7 +2624,10 @@ ; SSE2-LABEL: load_v8i32_v8i1_zero: ; SSE2: ## %bb.0: ; SSE2-NEXT: movdqa %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: psllw $15, %xmm2 +; SSE2-NEXT: movdqa %xmm2, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: xorps %xmm1, %xmm1 @@ -2445,8 +2636,10 @@ ; SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE2-NEXT: xorps %xmm1, %xmm1 ; SSE2-NEXT: LBB20_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB20_4 ; SSE2-NEXT: ## %bb.3: ## %cond.load1 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -2454,31 +2647,39 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm0[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm0 ; SSE2-NEXT: LBB20_4: ## %else2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB20_6 ; SSE2-NEXT: ## %bb.5: ## %cond.load4 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[0,2] ; SSE2-NEXT: LBB20_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB20_8 ; SSE2-NEXT: ## %bb.7: ## %cond.load7 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm0[2,0] ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,1],xmm3[2,0] ; SSE2-NEXT: LBB20_8: ## %else8 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB20_10 ; SSE2-NEXT: ## %bb.9: ## %cond.load10 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: movss {{.*#+}} xmm1 = xmm3[0],xmm1[1,2,3] ; SSE2-NEXT: LBB20_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB20_12 ; SSE2-NEXT: ## %bb.11: ## %cond.load13 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero @@ -2486,16 +2687,19 @@ ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[2,0],xmm1[2,3] ; SSE2-NEXT: movaps %xmm3, %xmm1 ; SSE2-NEXT: LBB20_12: ## %else14 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB20_14 ; SSE2-NEXT: ## %bb.13: ## %cond.load16 ; SSE2-NEXT: movss {{.*#+}} xmm3 = mem[0],zero,zero,zero ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[0,0],xmm1[3,0] ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm3[0,2] ; SSE2-NEXT: LBB20_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB20_16 ; SSE2-NEXT: ## %bb.15: ## %cond.load19 ; SSE2-NEXT: movss {{.*#+}} xmm2 = mem[0],zero,zero,zero @@ -2507,7 +2711,10 @@ ; SSE42-LABEL: load_v8i32_v8i1_zero: ; SSE42: ## %bb.0: ; SSE42-NEXT: movdqa %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm0, %eax +; SSE42-NEXT: psllw $15, %xmm2 +; SSE42-NEXT: movdqa %xmm2, %xmm0 +; SSE42-NEXT: packsswb %xmm0, %xmm0 +; SSE42-NEXT: pmovmskb %xmm0, %eax ; SSE42-NEXT: pxor %xmm0, %xmm0 ; SSE42-NEXT: testb $1, %al ; SSE42-NEXT: pxor %xmm1, %xmm1 @@ -2516,44 +2723,57 @@ ; SSE42-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero ; SSE42-NEXT: pxor %xmm1, %xmm1 ; SSE42-NEXT: LBB20_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB20_4 ; SSE42-NEXT: ## %bb.3: ## %cond.load1 ; SSE42-NEXT: pinsrd $1, 4(%rdi), %xmm0 ; SSE42-NEXT: LBB20_4: ## %else2 -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB20_6 ; SSE42-NEXT: ## %bb.5: ## %cond.load4 ; SSE42-NEXT: pinsrd $2, 8(%rdi), %xmm0 ; SSE42-NEXT: LBB20_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB20_8 ; SSE42-NEXT: ## %bb.7: ## %cond.load7 ; SSE42-NEXT: pinsrd $3, 12(%rdi), %xmm0 ; SSE42-NEXT: LBB20_8: ## %else8 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB20_10 ; SSE42-NEXT: ## %bb.9: ## %cond.load10 ; SSE42-NEXT: pinsrd $0, 16(%rdi), %xmm1 ; SSE42-NEXT: LBB20_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB20_12 ; SSE42-NEXT: ## %bb.11: ## %cond.load13 ; SSE42-NEXT: pinsrd $1, 20(%rdi), %xmm1 ; SSE42-NEXT: LBB20_12: ## %else14 -; SSE42-NEXT: pextrb $12, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: movdqa %xmm2, %xmm3 +; SSE42-NEXT: packsswb %xmm0, %xmm3 +; SSE42-NEXT: pmovmskb %xmm3, %eax +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB20_14 ; SSE42-NEXT: ## %bb.13: ## %cond.load16 ; SSE42-NEXT: pinsrd $2, 24(%rdi), %xmm1 ; SSE42-NEXT: LBB20_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: packsswb %xmm0, %xmm2 +; SSE42-NEXT: pmovmskb %xmm2, %eax +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB20_16 ; SSE42-NEXT: ## %bb.15: ## %cond.load19 ; SSE42-NEXT: pinsrd $3, 28(%rdi), %xmm1 @@ -2604,182 +2824,128 @@ ; define <8 x i16> @load_v8i16_v8i16(<8 x i16> %trigger, <8 x i16>* %addr, <8 x i16> %dst) { -; SSE2-LABEL: load_v8i16_v8i16: -; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: pinsrw $0, (%rdi), %xmm1 -; SSE2-NEXT: LBB21_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: pinsrw $1, 2(%rdi), %xmm1 -; SSE2-NEXT: LBB21_4: ## %else2 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: pinsrw $2, 4(%rdi), %xmm1 -; SSE2-NEXT: LBB21_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: pinsrw $3, 6(%rdi), %xmm1 -; SSE2-NEXT: LBB21_8: ## %else8 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_10 -; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: pinsrw $4, 8(%rdi), %xmm1 -; SSE2-NEXT: LBB21_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_12 -; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: pinsrw $5, 10(%rdi), %xmm1 -; SSE2-NEXT: LBB21_12: ## %else14 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_14 -; SSE2-NEXT: ## %bb.13: ## %cond.load16 -; SSE2-NEXT: pinsrw $6, 12(%rdi), %xmm1 -; SSE2-NEXT: LBB21_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB21_16 -; SSE2-NEXT: ## %bb.15: ## %cond.load19 -; SSE2-NEXT: pinsrw $7, 14(%rdi), %xmm1 -; SSE2-NEXT: LBB21_16: ## %else20 -; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v8i16_v8i16: -; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: pinsrw $0, (%rdi), %xmm1 -; SSE42-NEXT: LBB21_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: pinsrw $1, 2(%rdi), %xmm1 -; SSE42-NEXT: LBB21_4: ## %else2 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: pinsrw $2, 4(%rdi), %xmm1 -; SSE42-NEXT: LBB21_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: pinsrw $3, 6(%rdi), %xmm1 -; SSE42-NEXT: LBB21_8: ## %else8 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_10 -; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: pinsrw $4, 8(%rdi), %xmm1 -; SSE42-NEXT: LBB21_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_12 -; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: pinsrw $5, 10(%rdi), %xmm1 -; SSE42-NEXT: LBB21_12: ## %else14 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm2 -; SSE42-NEXT: pextrb $12, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_14 -; SSE42-NEXT: ## %bb.13: ## %cond.load16 -; SSE42-NEXT: pinsrw $6, 12(%rdi), %xmm1 -; SSE42-NEXT: LBB21_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB21_16 -; SSE42-NEXT: ## %bb.15: ## %cond.load19 -; SSE42-NEXT: pinsrw $7, 14(%rdi), %xmm1 -; SSE42-NEXT: LBB21_16: ## %else20 -; SSE42-NEXT: movdqa %xmm1, %xmm0 -; SSE42-NEXT: retq +; SSE-LABEL: load_v8i16_v8i16: +; SSE: ## %bb.0: +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: je LBB21_2 +; SSE-NEXT: ## %bb.1: ## %cond.load +; SSE-NEXT: pinsrw $0, (%rdi), %xmm1 +; SSE-NEXT: LBB21_2: ## %else +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB21_4 +; SSE-NEXT: ## %bb.3: ## %cond.load1 +; SSE-NEXT: pinsrw $1, 2(%rdi), %xmm1 +; SSE-NEXT: LBB21_4: ## %else2 +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB21_6 +; SSE-NEXT: ## %bb.5: ## %cond.load4 +; SSE-NEXT: pinsrw $2, 4(%rdi), %xmm1 +; SSE-NEXT: LBB21_6: ## %else5 +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB21_8 +; SSE-NEXT: ## %bb.7: ## %cond.load7 +; SSE-NEXT: pinsrw $3, 6(%rdi), %xmm1 +; SSE-NEXT: LBB21_8: ## %else8 +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $16, %al +; SSE-NEXT: je LBB21_10 +; SSE-NEXT: ## %bb.9: ## %cond.load10 +; SSE-NEXT: pinsrw $4, 8(%rdi), %xmm1 +; SSE-NEXT: LBB21_10: ## %else11 +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $32, %al +; SSE-NEXT: je LBB21_12 +; SSE-NEXT: ## %bb.11: ## %cond.load13 +; SSE-NEXT: pinsrw $5, 10(%rdi), %xmm1 +; SSE-NEXT: LBB21_12: ## %else14 +; SSE-NEXT: movdqa %xmm0, %xmm2 +; SSE-NEXT: packsswb %xmm0, %xmm2 +; SSE-NEXT: pmovmskb %xmm2, %eax +; SSE-NEXT: testb $64, %al +; SSE-NEXT: je LBB21_14 +; SSE-NEXT: ## %bb.13: ## %cond.load16 +; SSE-NEXT: pinsrw $6, 12(%rdi), %xmm1 +; SSE-NEXT: LBB21_14: ## %else17 +; SSE-NEXT: packsswb %xmm0, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testb $-128, %al +; SSE-NEXT: je LBB21_16 +; SSE-NEXT: ## %bb.15: ## %cond.load19 +; SSE-NEXT: pinsrw $7, 14(%rdi), %xmm1 +; SSE-NEXT: LBB21_16: ## %else20 +; SSE-NEXT: movdqa %xmm1, %xmm0 +; SSE-NEXT: retq ; ; AVX1OR2-LABEL: load_v8i16_v8i16: ; AVX1OR2: ## %bb.0: -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $0, %xmm2, %eax +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax ; AVX1OR2-NEXT: testb $1, %al ; AVX1OR2-NEXT: je LBB21_2 ; AVX1OR2-NEXT: ## %bb.1: ## %cond.load ; AVX1OR2-NEXT: vpinsrw $0, (%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_2: ## %else -; AVX1OR2-NEXT: vpextrb $2, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $2, %al ; AVX1OR2-NEXT: je LBB21_4 ; AVX1OR2-NEXT: ## %bb.3: ## %cond.load1 ; AVX1OR2-NEXT: vpinsrw $1, 2(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_4: ## %else2 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $4, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $4, %al ; AVX1OR2-NEXT: je LBB21_6 ; AVX1OR2-NEXT: ## %bb.5: ## %cond.load4 ; AVX1OR2-NEXT: vpinsrw $2, 4(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_6: ## %else5 -; AVX1OR2-NEXT: vpextrb $6, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $8, %al ; AVX1OR2-NEXT: je LBB21_8 ; AVX1OR2-NEXT: ## %bb.7: ## %cond.load7 ; AVX1OR2-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_8: ## %else8 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $8, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $16, %al ; AVX1OR2-NEXT: je LBB21_10 ; AVX1OR2-NEXT: ## %bb.9: ## %cond.load10 ; AVX1OR2-NEXT: vpinsrw $4, 8(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_10: ## %else11 -; AVX1OR2-NEXT: vpextrb $10, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $32, %al ; AVX1OR2-NEXT: je LBB21_12 ; AVX1OR2-NEXT: ## %bb.11: ## %cond.load13 ; AVX1OR2-NEXT: vpinsrw $5, 10(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_12: ## %else14 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0 -; AVX1OR2-NEXT: vpextrb $12, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $64, %al ; AVX1OR2-NEXT: je LBB21_14 ; AVX1OR2-NEXT: ## %bb.13: ## %cond.load16 ; AVX1OR2-NEXT: vpinsrw $6, 12(%rdi), %xmm1, %xmm1 ; AVX1OR2-NEXT: LBB21_14: ## %else17 -; AVX1OR2-NEXT: vpextrb $14, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax +; AVX1OR2-NEXT: testb $-128, %al ; AVX1OR2-NEXT: je LBB21_16 ; AVX1OR2-NEXT: ## %bb.15: ## %cond.load19 ; AVX1OR2-NEXT: vpinsrw $7, 14(%rdi), %xmm1, %xmm1 @@ -2875,379 +3041,264 @@ } define <16 x i16> @load_v16i16_v16i16(<16 x i16> %trigger, <16 x i16>* %addr, <16 x i16> %dst) { -; SSE2-LABEL: load_v16i16_v16i16: -; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: pinsrw $0, (%rdi), %xmm2 -; SSE2-NEXT: LBB22_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: pinsrw $1, 2(%rdi), %xmm2 -; SSE2-NEXT: LBB22_4: ## %else2 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE2-NEXT: pextrw $2, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: pinsrw $2, 4(%rdi), %xmm2 -; SSE2-NEXT: LBB22_6: ## %else5 -; SSE2-NEXT: pextrw $3, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: pinsrw $3, 6(%rdi), %xmm2 -; SSE2-NEXT: LBB22_8: ## %else8 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE2-NEXT: pextrw $4, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_10 -; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: pinsrw $4, 8(%rdi), %xmm2 -; SSE2-NEXT: LBB22_10: ## %else11 -; SSE2-NEXT: pextrw $5, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_12 -; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: pinsrw $5, 10(%rdi), %xmm2 -; SSE2-NEXT: LBB22_12: ## %else14 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_14 -; SSE2-NEXT: ## %bb.13: ## %cond.load16 -; SSE2-NEXT: pinsrw $6, 12(%rdi), %xmm2 -; SSE2-NEXT: LBB22_14: ## %else17 -; SSE2-NEXT: pextrw $7, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_16 -; SSE2-NEXT: ## %bb.15: ## %cond.load19 -; SSE2-NEXT: pinsrw $7, 14(%rdi), %xmm2 -; SSE2-NEXT: LBB22_16: ## %else20 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_18 -; SSE2-NEXT: ## %bb.17: ## %cond.load22 -; SSE2-NEXT: pinsrw $0, 16(%rdi), %xmm3 -; SSE2-NEXT: LBB22_18: ## %else23 -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_20 -; SSE2-NEXT: ## %bb.19: ## %cond.load25 -; SSE2-NEXT: pinsrw $1, 18(%rdi), %xmm3 -; SSE2-NEXT: LBB22_20: ## %else26 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_22 -; SSE2-NEXT: ## %bb.21: ## %cond.load28 -; SSE2-NEXT: pinsrw $2, 20(%rdi), %xmm3 -; SSE2-NEXT: LBB22_22: ## %else29 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_24 -; SSE2-NEXT: ## %bb.23: ## %cond.load31 -; SSE2-NEXT: pinsrw $3, 22(%rdi), %xmm3 -; SSE2-NEXT: LBB22_24: ## %else32 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_26 -; SSE2-NEXT: ## %bb.25: ## %cond.load34 -; SSE2-NEXT: pinsrw $4, 24(%rdi), %xmm3 -; SSE2-NEXT: LBB22_26: ## %else35 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_28 -; SSE2-NEXT: ## %bb.27: ## %cond.load37 -; SSE2-NEXT: pinsrw $5, 26(%rdi), %xmm3 -; SSE2-NEXT: LBB22_28: ## %else38 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_30 -; SSE2-NEXT: ## %bb.29: ## %cond.load40 -; SSE2-NEXT: pinsrw $6, 28(%rdi), %xmm3 -; SSE2-NEXT: LBB22_30: ## %else41 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB22_32 -; SSE2-NEXT: ## %bb.31: ## %cond.load43 -; SSE2-NEXT: pinsrw $7, 30(%rdi), %xmm3 -; SSE2-NEXT: LBB22_32: ## %else44 -; SSE2-NEXT: movdqa %xmm2, %xmm0 -; SSE2-NEXT: movdqa %xmm3, %xmm1 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v16i16_v16i16: -; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE42-NEXT: pextrb $0, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: pinsrw $0, (%rdi), %xmm2 -; SSE42-NEXT: LBB22_2: ## %else -; SSE42-NEXT: pextrb $2, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: pinsrw $1, 2(%rdi), %xmm2 -; SSE42-NEXT: LBB22_4: ## %else2 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE42-NEXT: pextrb $4, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: pinsrw $2, 4(%rdi), %xmm2 -; SSE42-NEXT: LBB22_6: ## %else5 -; SSE42-NEXT: pextrb $6, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: pinsrw $3, 6(%rdi), %xmm2 -; SSE42-NEXT: LBB22_8: ## %else8 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE42-NEXT: pextrb $8, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_10 -; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: pinsrw $4, 8(%rdi), %xmm2 -; SSE42-NEXT: LBB22_10: ## %else11 -; SSE42-NEXT: pextrb $10, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_12 -; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: pinsrw $5, 10(%rdi), %xmm2 -; SSE42-NEXT: LBB22_12: ## %else14 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtw %xmm0, %xmm4 -; SSE42-NEXT: pextrb $12, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_14 -; SSE42-NEXT: ## %bb.13: ## %cond.load16 -; SSE42-NEXT: pinsrw $6, 12(%rdi), %xmm2 -; SSE42-NEXT: LBB22_14: ## %else17 -; SSE42-NEXT: pextrb $14, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_16 -; SSE42-NEXT: ## %bb.15: ## %cond.load19 -; SSE42-NEXT: pinsrw $7, 14(%rdi), %xmm2 -; SSE42-NEXT: LBB22_16: ## %else20 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE42-NEXT: pextrb $0, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_18 -; SSE42-NEXT: ## %bb.17: ## %cond.load22 -; SSE42-NEXT: pinsrw $0, 16(%rdi), %xmm3 -; SSE42-NEXT: LBB22_18: ## %else23 -; SSE42-NEXT: pextrb $2, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_20 -; SSE42-NEXT: ## %bb.19: ## %cond.load25 -; SSE42-NEXT: pinsrw $1, 18(%rdi), %xmm3 -; SSE42-NEXT: LBB22_20: ## %else26 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE42-NEXT: pextrb $4, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_22 -; SSE42-NEXT: ## %bb.21: ## %cond.load28 -; SSE42-NEXT: pinsrw $2, 20(%rdi), %xmm3 -; SSE42-NEXT: LBB22_22: ## %else29 -; SSE42-NEXT: pextrb $6, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_24 -; SSE42-NEXT: ## %bb.23: ## %cond.load31 -; SSE42-NEXT: pinsrw $3, 22(%rdi), %xmm3 -; SSE42-NEXT: LBB22_24: ## %else32 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_26 -; SSE42-NEXT: ## %bb.25: ## %cond.load34 -; SSE42-NEXT: pinsrw $4, 24(%rdi), %xmm3 -; SSE42-NEXT: LBB22_26: ## %else35 -; SSE42-NEXT: pextrb $10, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_28 -; SSE42-NEXT: ## %bb.27: ## %cond.load37 -; SSE42-NEXT: pinsrw $5, 26(%rdi), %xmm3 -; SSE42-NEXT: LBB22_28: ## %else38 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_30 -; SSE42-NEXT: ## %bb.29: ## %cond.load40 -; SSE42-NEXT: pinsrw $6, 28(%rdi), %xmm3 -; SSE42-NEXT: LBB22_30: ## %else41 -; SSE42-NEXT: pextrb $14, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB22_32 -; SSE42-NEXT: ## %bb.31: ## %cond.load43 -; SSE42-NEXT: pinsrw $7, 30(%rdi), %xmm3 -; SSE42-NEXT: LBB22_32: ## %else44 -; SSE42-NEXT: movdqa %xmm2, %xmm0 -; SSE42-NEXT: movdqa %xmm3, %xmm1 -; SSE42-NEXT: retq +; SSE-LABEL: load_v16i16_v16i16: +; SSE: ## %bb.0: +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: je LBB22_2 +; SSE-NEXT: ## %bb.1: ## %cond.load +; SSE-NEXT: pinsrw $0, (%rdi), %xmm2 +; SSE-NEXT: LBB22_2: ## %else +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB22_4 +; SSE-NEXT: ## %bb.3: ## %cond.load1 +; SSE-NEXT: pinsrw $1, 2(%rdi), %xmm2 +; SSE-NEXT: LBB22_4: ## %else2 +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB22_6 +; SSE-NEXT: ## %bb.5: ## %cond.load4 +; SSE-NEXT: pinsrw $2, 4(%rdi), %xmm2 +; SSE-NEXT: LBB22_6: ## %else5 +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB22_8 +; SSE-NEXT: ## %bb.7: ## %cond.load7 +; SSE-NEXT: pinsrw $3, 6(%rdi), %xmm2 +; SSE-NEXT: LBB22_8: ## %else8 +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $16, %al +; SSE-NEXT: je LBB22_10 +; SSE-NEXT: ## %bb.9: ## %cond.load10 +; SSE-NEXT: pinsrw $4, 8(%rdi), %xmm2 +; SSE-NEXT: LBB22_10: ## %else11 +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $32, %al +; SSE-NEXT: je LBB22_12 +; SSE-NEXT: ## %bb.11: ## %cond.load13 +; SSE-NEXT: pinsrw $5, 10(%rdi), %xmm2 +; SSE-NEXT: LBB22_12: ## %else14 +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packsswb %xmm0, %xmm4 +; SSE-NEXT: pmovmskb %xmm4, %eax +; SSE-NEXT: testb $64, %al +; SSE-NEXT: je LBB22_14 +; SSE-NEXT: ## %bb.13: ## %cond.load16 +; SSE-NEXT: pinsrw $6, 12(%rdi), %xmm2 +; SSE-NEXT: LBB22_14: ## %else17 +; SSE-NEXT: packsswb %xmm0, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testb $-128, %al +; SSE-NEXT: je LBB22_16 +; SSE-NEXT: ## %bb.15: ## %cond.load19 +; SSE-NEXT: pinsrw $7, 14(%rdi), %xmm2 +; SSE-NEXT: LBB22_16: ## %else20 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $256, %eax ## imm = 0x100 +; SSE-NEXT: je LBB22_18 +; SSE-NEXT: ## %bb.17: ## %cond.load22 +; SSE-NEXT: pinsrw $0, 16(%rdi), %xmm3 +; SSE-NEXT: LBB22_18: ## %else23 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $512, %eax ## imm = 0x200 +; SSE-NEXT: je LBB22_20 +; SSE-NEXT: ## %bb.19: ## %cond.load25 +; SSE-NEXT: pinsrw $1, 18(%rdi), %xmm3 +; SSE-NEXT: LBB22_20: ## %else26 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE-NEXT: je LBB22_22 +; SSE-NEXT: ## %bb.21: ## %cond.load28 +; SSE-NEXT: pinsrw $2, 20(%rdi), %xmm3 +; SSE-NEXT: LBB22_22: ## %else29 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE-NEXT: je LBB22_24 +; SSE-NEXT: ## %bb.23: ## %cond.load31 +; SSE-NEXT: pinsrw $3, 22(%rdi), %xmm3 +; SSE-NEXT: LBB22_24: ## %else32 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE-NEXT: je LBB22_26 +; SSE-NEXT: ## %bb.25: ## %cond.load34 +; SSE-NEXT: pinsrw $4, 24(%rdi), %xmm3 +; SSE-NEXT: LBB22_26: ## %else35 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE-NEXT: je LBB22_28 +; SSE-NEXT: ## %bb.27: ## %cond.load37 +; SSE-NEXT: pinsrw $5, 26(%rdi), %xmm3 +; SSE-NEXT: LBB22_28: ## %else38 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE-NEXT: je LBB22_30 +; SSE-NEXT: ## %bb.29: ## %cond.load40 +; SSE-NEXT: pinsrw $6, 28(%rdi), %xmm3 +; SSE-NEXT: LBB22_30: ## %else41 +; SSE-NEXT: packsswb %xmm1, %xmm0 +; SSE-NEXT: pmovmskb %xmm0, %eax +; SSE-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE-NEXT: je LBB22_32 +; SSE-NEXT: ## %bb.31: ## %cond.load43 +; SSE-NEXT: pinsrw $7, 30(%rdi), %xmm3 +; SSE-NEXT: LBB22_32: ## %else44 +; SSE-NEXT: movdqa %xmm2, %xmm0 +; SSE-NEXT: movdqa %xmm3, %xmm1 +; SSE-NEXT: retq ; ; AVX1-LABEL: load_v16i16_v16i16: ; AVX1: ## %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je LBB22_2 ; AVX1-NEXT: ## %bb.1: ## %cond.load -; AVX1-NEXT: vpinsrw $0, (%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrw $0, (%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_2: ## %else -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB22_4 ; AVX1-NEXT: ## %bb.3: ## %cond.load1 ; AVX1-NEXT: vpinsrw $1, 2(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_4: ## %else2 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je LBB22_6 ; AVX1-NEXT: ## %bb.5: ## %cond.load4 -; AVX1-NEXT: vpinsrw $2, 4(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrw $2, 4(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_6: ## %else5 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je LBB22_8 ; AVX1-NEXT: ## %bb.7: ## %cond.load7 ; AVX1-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_8: ## %else8 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je LBB22_10 ; AVX1-NEXT: ## %bb.9: ## %cond.load10 -; AVX1-NEXT: vpinsrw $4, 8(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrw $4, 8(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_10: ## %else11 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je LBB22_12 ; AVX1-NEXT: ## %bb.11: ## %cond.load13 ; AVX1-NEXT: vpinsrw $5, 10(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_12: ## %else14 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je LBB22_14 ; AVX1-NEXT: ## %bb.13: ## %cond.load16 -; AVX1-NEXT: vpinsrw $6, 12(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrw $6, 12(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_14: ## %else17 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je LBB22_16 ; AVX1-NEXT: ## %bb.15: ## %cond.load19 ; AVX1-NEXT: vpinsrw $7, 14(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB22_16: ## %else20 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1-NEXT: je LBB22_18 ; AVX1-NEXT: ## %bb.17: ## %cond.load22 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrw $0, 16(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpinsrw $0, 16(%rdi), %xmm2, %xmm2 +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_18: ## %else23 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB22_20 ; AVX1-NEXT: ## %bb.19: ## %cond.load25 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 ; AVX1-NEXT: vpinsrw $1, 18(%rdi), %xmm2, %xmm2 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_20: ## %else26 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1-NEXT: je LBB22_22 ; AVX1-NEXT: ## %bb.21: ## %cond.load28 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrw $2, 20(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpinsrw $2, 20(%rdi), %xmm2, %xmm2 +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_22: ## %else29 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1-NEXT: je LBB22_24 ; AVX1-NEXT: ## %bb.23: ## %cond.load31 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 ; AVX1-NEXT: vpinsrw $3, 22(%rdi), %xmm2, %xmm2 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_24: ## %else32 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1-NEXT: je LBB22_26 ; AVX1-NEXT: ## %bb.25: ## %cond.load34 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrw $4, 24(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpinsrw $4, 24(%rdi), %xmm2, %xmm2 +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_26: ## %else35 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1-NEXT: je LBB22_28 ; AVX1-NEXT: ## %bb.27: ## %cond.load37 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 ; AVX1-NEXT: vpinsrw $5, 26(%rdi), %xmm2, %xmm2 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_28: ## %else38 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtw %xmm0, %xmm2, %xmm0 -; AVX1-NEXT: vpextrb $12, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX1-NEXT: je LBB22_30 ; AVX1-NEXT: ## %bb.29: ## %cond.load40 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 ; AVX1-NEXT: vpinsrw $6, 28(%rdi), %xmm2, %xmm2 ; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 ; AVX1-NEXT: LBB22_30: ## %else41 -; AVX1-NEXT: vpextrb $14, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1-NEXT: je LBB22_32 ; AVX1-NEXT: ## %bb.31: ## %cond.load43 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 @@ -3261,15 +3312,17 @@ ; AVX2: ## %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je LBB22_2 ; AVX2-NEXT: ## %bb.1: ## %cond.load ; AVX2-NEXT: vpinsrw $0, (%rdi), %xmm1, %xmm3 ; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; AVX2-NEXT: LBB22_2: ## %else -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je LBB22_4 ; AVX2-NEXT: ## %bb.3: ## %cond.load1 ; AVX2-NEXT: vpinsrw $1, 2(%rdi), %xmm1, %xmm2 @@ -3277,15 +3330,17 @@ ; AVX2-NEXT: LBB22_4: ## %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je LBB22_6 ; AVX2-NEXT: ## %bb.5: ## %cond.load4 ; AVX2-NEXT: vpinsrw $2, 4(%rdi), %xmm1, %xmm3 ; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; AVX2-NEXT: LBB22_6: ## %else5 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je LBB22_8 ; AVX2-NEXT: ## %bb.7: ## %cond.load7 ; AVX2-NEXT: vpinsrw $3, 6(%rdi), %xmm1, %xmm2 @@ -3293,15 +3348,17 @@ ; AVX2-NEXT: LBB22_8: ## %else8 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je LBB22_10 ; AVX2-NEXT: ## %bb.9: ## %cond.load10 ; AVX2-NEXT: vpinsrw $4, 8(%rdi), %xmm1, %xmm3 ; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; AVX2-NEXT: LBB22_10: ## %else11 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je LBB22_12 ; AVX2-NEXT: ## %bb.11: ## %cond.load13 ; AVX2-NEXT: vpinsrw $5, 10(%rdi), %xmm1, %xmm2 @@ -3309,15 +3366,17 @@ ; AVX2-NEXT: LBB22_12: ## %else14 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je LBB22_14 ; AVX2-NEXT: ## %bb.13: ## %cond.load16 ; AVX2-NEXT: vpinsrw $6, 12(%rdi), %xmm1, %xmm3 ; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] ; AVX2-NEXT: LBB22_14: ## %else17 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je LBB22_16 ; AVX2-NEXT: ## %bb.15: ## %cond.load19 ; AVX2-NEXT: vpinsrw $7, 14(%rdi), %xmm1, %xmm2 @@ -3326,16 +3385,18 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $256, %eax ## imm = 0x100 ; AVX2-NEXT: je LBB22_18 ; AVX2-NEXT: ## %bb.17: ## %cond.load22 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpinsrw $0, 16(%rdi), %xmm3, %xmm3 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 ; AVX2-NEXT: LBB22_18: ## %else23 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $512, %eax ## imm = 0x200 ; AVX2-NEXT: je LBB22_20 ; AVX2-NEXT: ## %bb.19: ## %cond.load25 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3345,16 +3406,18 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX2-NEXT: je LBB22_22 ; AVX2-NEXT: ## %bb.21: ## %cond.load28 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpinsrw $2, 20(%rdi), %xmm3, %xmm3 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 ; AVX2-NEXT: LBB22_22: ## %else29 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX2-NEXT: je LBB22_24 ; AVX2-NEXT: ## %bb.23: ## %cond.load31 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3364,16 +3427,18 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX2-NEXT: je LBB22_26 ; AVX2-NEXT: ## %bb.25: ## %cond.load34 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpinsrw $4, 24(%rdi), %xmm3, %xmm3 ; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 ; AVX2-NEXT: LBB22_26: ## %else35 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX2-NEXT: je LBB22_28 ; AVX2-NEXT: ## %bb.27: ## %cond.load37 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3383,16 +3448,18 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpgtw %ymm0, %ymm2, %ymm0 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX2-NEXT: vpextrb $12, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX2-NEXT: je LBB22_30 ; AVX2-NEXT: ## %bb.29: ## %cond.load40 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX2-NEXT: vpinsrw $6, 28(%rdi), %xmm2, %xmm2 ; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 ; AVX2-NEXT: LBB22_30: ## %else41 -; AVX2-NEXT: vpextrb $14, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX2-NEXT: vpmovmskb %xmm0, %eax +; AVX2-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX2-NEXT: je LBB22_32 ; AVX2-NEXT: ## %bb.31: ## %cond.load43 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 @@ -3591,597 +3658,567 @@ define <16 x i8> @load_v16i8_v16i8(<16 x i8> %trigger, <16 x i8>* %addr, <16 x i8> %dst) { ; SSE2-LABEL: load_v16i8_v16i8: ; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl (%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 -; SSE2-NEXT: LBB23_2: ## %else -; SSE2-NEXT: shrl $8, %eax +; SSE2-NEXT: pmovmskb %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 1(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: psllw $8, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: jne LBB23_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB23_3 ; SSE2-NEXT: LBB23_4: ## %else2 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je LBB23_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 2(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pslld $16, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB23_5 ; SSE2-NEXT: LBB23_6: ## %else5 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 3(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: pslld $24, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB23_7 ; SSE2-NEXT: LBB23_8: ## %else8 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_10 -; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 4(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,0,1,1] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $16, %al +; SSE2-NEXT: jne LBB23_9 ; SSE2-NEXT: LBB23_10: ## %else11 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_12 -; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 5(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: psllq $40, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $32, %al +; SSE2-NEXT: jne LBB23_11 ; SSE2-NEXT: LBB23_12: ## %else14 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_14 -; SSE2-NEXT: ## %bb.13: ## %cond.load16 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 6(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: psllq $48, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $64, %al +; SSE2-NEXT: jne LBB23_13 ; SSE2-NEXT: LBB23_14: ## %else17 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_16 -; SSE2-NEXT: ## %bb.15: ## %cond.load19 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 7(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: psllq $56, %xmm3 -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testb $-128, %al +; SSE2-NEXT: jne LBB23_15 ; SSE2-NEXT: LBB23_16: ## %else20 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_18 -; SSE2-NEXT: ## %bb.17: ## %cond.load22 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 8(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,0,1] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 +; SSE2-NEXT: jne LBB23_17 ; SSE2-NEXT: LBB23_18: ## %else23 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_20 -; SSE2-NEXT: ## %bb.19: ## %cond.load25 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 9(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0,1,2,3,4,5,6] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 +; SSE2-NEXT: jne LBB23_19 ; SSE2-NEXT: LBB23_20: ## %else26 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_22 -; SSE2-NEXT: ## %bb.21: ## %cond.load28 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 10(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0,1,2,3,4,5] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE2-NEXT: jne LBB23_21 ; SSE2-NEXT: LBB23_22: ## %else29 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_24 -; SSE2-NEXT: ## %bb.23: ## %cond.load31 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 11(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0,1,2,3,4] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE2-NEXT: jne LBB23_23 ; SSE2-NEXT: LBB23_24: ## %else32 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_26 -; SSE2-NEXT: ## %bb.25: ## %cond.load34 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 12(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[0,1,2,0] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE2-NEXT: jne LBB23_25 ; SSE2-NEXT: LBB23_26: ## %else35 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_28 -; SSE2-NEXT: ## %bb.27: ## %cond.load37 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255] -; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movzbl 13(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm3 -; SSE2-NEXT: pslldq {{.*#+}} xmm3 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm3[0,1,2] -; SSE2-NEXT: pandn %xmm3, %xmm2 -; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE2-NEXT: jne LBB23_27 ; SSE2-NEXT: LBB23_28: ## %else38 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_30 -; SSE2-NEXT: ## %bb.29: ## %cond.load40 -; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255] +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE2-NEXT: jne LBB23_29 +; SSE2-NEXT: LBB23_30: ## %else41 +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE2-NEXT: jne LBB23_31 +; SSE2-NEXT: LBB23_32: ## %else44 +; SSE2-NEXT: movdqa %xmm1, %xmm0 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB23_1: ## %cond.load +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] ; SSE2-NEXT: pand %xmm0, %xmm1 -; SSE2-NEXT: movzbl 14(%rdi), %ecx +; SSE2-NEXT: movzbl (%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm2 -; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1] ; SSE2-NEXT: pandn %xmm2, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: LBB23_30: ## %else41 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_32 -; SSE2-NEXT: ## %bb.31: ## %cond.load43 -; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 -; SSE2-NEXT: movzbl 15(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm0 -; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0] +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: je LBB23_4 +; SSE2-NEXT: LBB23_3: ## %cond.load1 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 1(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: psllw $8, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: LBB23_32: ## %else44 -; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: retq -; -; SSE42-LABEL: load_v16i8_v16i8: -; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $0, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load -; SSE42-NEXT: pinsrb $0, (%rdi), %xmm1 -; SSE42-NEXT: LBB23_2: ## %else -; SSE42-NEXT: pextrb $1, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 -; SSE42-NEXT: pinsrb $1, 1(%rdi), %xmm1 -; SSE42-NEXT: LBB23_4: ## %else2 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $2, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 -; SSE42-NEXT: pinsrb $2, 2(%rdi), %xmm1 -; SSE42-NEXT: LBB23_6: ## %else5 -; SSE42-NEXT: pextrb $3, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 -; SSE42-NEXT: pinsrb $3, 3(%rdi), %xmm1 -; SSE42-NEXT: LBB23_8: ## %else8 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $4, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_10 -; SSE42-NEXT: ## %bb.9: ## %cond.load10 -; SSE42-NEXT: pinsrb $4, 4(%rdi), %xmm1 -; SSE42-NEXT: LBB23_10: ## %else11 -; SSE42-NEXT: pextrb $5, %xmm2, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB23_12 -; SSE42-NEXT: ## %bb.11: ## %cond.load13 -; SSE42-NEXT: pinsrb $5, 5(%rdi), %xmm1 -; SSE42-NEXT: LBB23_12: ## %else14 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $6, %xmm2, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: je LBB23_6 +; SSE2-NEXT: LBB23_5: ## %cond.load4 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 2(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslld $16, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: je LBB23_8 +; SSE2-NEXT: LBB23_7: ## %cond.load7 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 3(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslld $24, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testb $16, %al +; SSE2-NEXT: je LBB23_10 +; SSE2-NEXT: LBB23_9: ## %cond.load10 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 4(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,1,1] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testb $32, %al +; SSE2-NEXT: je LBB23_12 +; SSE2-NEXT: LBB23_11: ## %cond.load13 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 5(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: psllq $40, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testb $64, %al +; SSE2-NEXT: je LBB23_14 +; SSE2-NEXT: LBB23_13: ## %cond.load16 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 6(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: psllq $48, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testb $-128, %al +; SSE2-NEXT: je LBB23_16 +; SSE2-NEXT: LBB23_15: ## %cond.load19 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 7(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: psllq $56, %xmm2 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 +; SSE2-NEXT: je LBB23_18 +; SSE2-NEXT: LBB23_17: ## %cond.load22 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 8(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,0,1] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 +; SSE2-NEXT: je LBB23_20 +; SSE2-NEXT: LBB23_19: ## %cond.load25 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 9(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2,3,4,5,6] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE2-NEXT: je LBB23_22 +; SSE2-NEXT: LBB23_21: ## %cond.load28 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 10(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2,3,4,5] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE2-NEXT: je LBB23_24 +; SSE2-NEXT: LBB23_23: ## %cond.load31 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 11(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2,3,4] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE2-NEXT: je LBB23_26 +; SSE2-NEXT: LBB23_25: ## %cond.load34 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 12(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,1,2,0] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE2-NEXT: je LBB23_28 +; SSE2-NEXT: LBB23_27: ## %cond.load37 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 13(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1,2] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE2-NEXT: je LBB23_30 +; SSE2-NEXT: LBB23_29: ## %cond.load40 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255] +; SSE2-NEXT: pand %xmm0, %xmm1 +; SSE2-NEXT: movzbl 14(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm2 +; SSE2-NEXT: pslldq {{.*#+}} xmm2 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm2[0,1] +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE2-NEXT: je LBB23_32 +; SSE2-NEXT: LBB23_31: ## %cond.load43 +; SSE2-NEXT: pand {{.*}}(%rip), %xmm1 +; SSE2-NEXT: movzbl 15(%rdi), %eax +; SSE2-NEXT: movd %eax, %xmm0 +; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0] +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm0 +; SSE2-NEXT: retq +; +; SSE42-LABEL: load_v16i8_v16i8: +; SSE42: ## %bb.0: +; SSE42-NEXT: pmovmskb %xmm0, %eax ; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: jne LBB23_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB23_3 +; SSE42-NEXT: LBB23_4: ## %else2 +; SSE42-NEXT: testb $4, %al +; SSE42-NEXT: jne LBB23_5 +; SSE42-NEXT: LBB23_6: ## %else5 +; SSE42-NEXT: testb $8, %al +; SSE42-NEXT: jne LBB23_7 +; SSE42-NEXT: LBB23_8: ## %else8 +; SSE42-NEXT: testb $16, %al +; SSE42-NEXT: jne LBB23_9 +; SSE42-NEXT: LBB23_10: ## %else11 +; SSE42-NEXT: testb $32, %al +; SSE42-NEXT: jne LBB23_11 +; SSE42-NEXT: LBB23_12: ## %else14 +; SSE42-NEXT: testb $64, %al +; SSE42-NEXT: jne LBB23_13 +; SSE42-NEXT: LBB23_14: ## %else17 +; SSE42-NEXT: testb $-128, %al +; SSE42-NEXT: jne LBB23_15 +; SSE42-NEXT: LBB23_16: ## %else20 +; SSE42-NEXT: testl $256, %eax ## imm = 0x100 +; SSE42-NEXT: jne LBB23_17 +; SSE42-NEXT: LBB23_18: ## %else23 +; SSE42-NEXT: testl $512, %eax ## imm = 0x200 +; SSE42-NEXT: jne LBB23_19 +; SSE42-NEXT: LBB23_20: ## %else26 +; SSE42-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE42-NEXT: jne LBB23_21 +; SSE42-NEXT: LBB23_22: ## %else29 +; SSE42-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE42-NEXT: jne LBB23_23 +; SSE42-NEXT: LBB23_24: ## %else32 +; SSE42-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE42-NEXT: jne LBB23_25 +; SSE42-NEXT: LBB23_26: ## %else35 +; SSE42-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE42-NEXT: jne LBB23_27 +; SSE42-NEXT: LBB23_28: ## %else38 +; SSE42-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE42-NEXT: jne LBB23_29 +; SSE42-NEXT: LBB23_30: ## %else41 +; SSE42-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE42-NEXT: jne LBB23_31 +; SSE42-NEXT: LBB23_32: ## %else44 +; SSE42-NEXT: movdqa %xmm1, %xmm0 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB23_1: ## %cond.load +; SSE42-NEXT: pinsrb $0, (%rdi), %xmm1 +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: je LBB23_4 +; SSE42-NEXT: LBB23_3: ## %cond.load1 +; SSE42-NEXT: pinsrb $1, 1(%rdi), %xmm1 +; SSE42-NEXT: testb $4, %al +; SSE42-NEXT: je LBB23_6 +; SSE42-NEXT: LBB23_5: ## %cond.load4 +; SSE42-NEXT: pinsrb $2, 2(%rdi), %xmm1 +; SSE42-NEXT: testb $8, %al +; SSE42-NEXT: je LBB23_8 +; SSE42-NEXT: LBB23_7: ## %cond.load7 +; SSE42-NEXT: pinsrb $3, 3(%rdi), %xmm1 +; SSE42-NEXT: testb $16, %al +; SSE42-NEXT: je LBB23_10 +; SSE42-NEXT: LBB23_9: ## %cond.load10 +; SSE42-NEXT: pinsrb $4, 4(%rdi), %xmm1 +; SSE42-NEXT: testb $32, %al +; SSE42-NEXT: je LBB23_12 +; SSE42-NEXT: LBB23_11: ## %cond.load13 +; SSE42-NEXT: pinsrb $5, 5(%rdi), %xmm1 +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB23_14 -; SSE42-NEXT: ## %bb.13: ## %cond.load16 +; SSE42-NEXT: LBB23_13: ## %cond.load16 ; SSE42-NEXT: pinsrb $6, 6(%rdi), %xmm1 -; SSE42-NEXT: LBB23_14: ## %else17 -; SSE42-NEXT: pextrb $7, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB23_16 -; SSE42-NEXT: ## %bb.15: ## %cond.load19 +; SSE42-NEXT: LBB23_15: ## %cond.load19 ; SSE42-NEXT: pinsrb $7, 7(%rdi), %xmm1 -; SSE42-NEXT: LBB23_16: ## %else20 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $8, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $256, %eax ## imm = 0x100 ; SSE42-NEXT: je LBB23_18 -; SSE42-NEXT: ## %bb.17: ## %cond.load22 +; SSE42-NEXT: LBB23_17: ## %cond.load22 ; SSE42-NEXT: pinsrb $8, 8(%rdi), %xmm1 -; SSE42-NEXT: LBB23_18: ## %else23 -; SSE42-NEXT: pextrb $9, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $512, %eax ## imm = 0x200 ; SSE42-NEXT: je LBB23_20 -; SSE42-NEXT: ## %bb.19: ## %cond.load25 +; SSE42-NEXT: LBB23_19: ## %cond.load25 ; SSE42-NEXT: pinsrb $9, 9(%rdi), %xmm1 -; SSE42-NEXT: LBB23_20: ## %else26 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $10, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE42-NEXT: je LBB23_22 -; SSE42-NEXT: ## %bb.21: ## %cond.load28 +; SSE42-NEXT: LBB23_21: ## %cond.load28 ; SSE42-NEXT: pinsrb $10, 10(%rdi), %xmm1 -; SSE42-NEXT: LBB23_22: ## %else29 -; SSE42-NEXT: pextrb $11, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE42-NEXT: je LBB23_24 -; SSE42-NEXT: ## %bb.23: ## %cond.load31 +; SSE42-NEXT: LBB23_23: ## %cond.load31 ; SSE42-NEXT: pinsrb $11, 11(%rdi), %xmm1 -; SSE42-NEXT: LBB23_24: ## %else32 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $12, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE42-NEXT: je LBB23_26 -; SSE42-NEXT: ## %bb.25: ## %cond.load34 +; SSE42-NEXT: LBB23_25: ## %cond.load34 ; SSE42-NEXT: pinsrb $12, 12(%rdi), %xmm1 -; SSE42-NEXT: LBB23_26: ## %else35 -; SSE42-NEXT: pextrb $13, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE42-NEXT: je LBB23_28 -; SSE42-NEXT: ## %bb.27: ## %cond.load37 +; SSE42-NEXT: LBB23_27: ## %cond.load37 ; SSE42-NEXT: pinsrb $13, 13(%rdi), %xmm1 -; SSE42-NEXT: LBB23_28: ## %else38 -; SSE42-NEXT: pxor %xmm2, %xmm2 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm2 -; SSE42-NEXT: pextrb $14, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE42-NEXT: je LBB23_30 -; SSE42-NEXT: ## %bb.29: ## %cond.load40 +; SSE42-NEXT: LBB23_29: ## %cond.load40 ; SSE42-NEXT: pinsrb $14, 14(%rdi), %xmm1 -; SSE42-NEXT: LBB23_30: ## %else41 -; SSE42-NEXT: pextrb $15, %xmm2, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE42-NEXT: je LBB23_32 -; SSE42-NEXT: ## %bb.31: ## %cond.load43 +; SSE42-NEXT: LBB23_31: ## %cond.load43 ; SSE42-NEXT: pinsrb $15, 15(%rdi), %xmm1 -; SSE42-NEXT: LBB23_32: ## %else44 ; SSE42-NEXT: movdqa %xmm1, %xmm0 ; SSE42-NEXT: retq ; ; AVX1OR2-LABEL: load_v16i8_v16i8: ; AVX1OR2: ## %bb.0: -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $0, %xmm2, %eax +; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax ; AVX1OR2-NEXT: testb $1, %al -; AVX1OR2-NEXT: je LBB23_2 -; AVX1OR2-NEXT: ## %bb.1: ## %cond.load +; AVX1OR2-NEXT: jne LBB23_1 +; AVX1OR2-NEXT: ## %bb.2: ## %else +; AVX1OR2-NEXT: testb $2, %al +; AVX1OR2-NEXT: jne LBB23_3 +; AVX1OR2-NEXT: LBB23_4: ## %else2 +; AVX1OR2-NEXT: testb $4, %al +; AVX1OR2-NEXT: jne LBB23_5 +; AVX1OR2-NEXT: LBB23_6: ## %else5 +; AVX1OR2-NEXT: testb $8, %al +; AVX1OR2-NEXT: jne LBB23_7 +; AVX1OR2-NEXT: LBB23_8: ## %else8 +; AVX1OR2-NEXT: testb $16, %al +; AVX1OR2-NEXT: jne LBB23_9 +; AVX1OR2-NEXT: LBB23_10: ## %else11 +; AVX1OR2-NEXT: testb $32, %al +; AVX1OR2-NEXT: jne LBB23_11 +; AVX1OR2-NEXT: LBB23_12: ## %else14 +; AVX1OR2-NEXT: testb $64, %al +; AVX1OR2-NEXT: jne LBB23_13 +; AVX1OR2-NEXT: LBB23_14: ## %else17 +; AVX1OR2-NEXT: testb $-128, %al +; AVX1OR2-NEXT: jne LBB23_15 +; AVX1OR2-NEXT: LBB23_16: ## %else20 +; AVX1OR2-NEXT: testl $256, %eax ## imm = 0x100 +; AVX1OR2-NEXT: jne LBB23_17 +; AVX1OR2-NEXT: LBB23_18: ## %else23 +; AVX1OR2-NEXT: testl $512, %eax ## imm = 0x200 +; AVX1OR2-NEXT: jne LBB23_19 +; AVX1OR2-NEXT: LBB23_20: ## %else26 +; AVX1OR2-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX1OR2-NEXT: jne LBB23_21 +; AVX1OR2-NEXT: LBB23_22: ## %else29 +; AVX1OR2-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX1OR2-NEXT: jne LBB23_23 +; AVX1OR2-NEXT: LBB23_24: ## %else32 +; AVX1OR2-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX1OR2-NEXT: jne LBB23_25 +; AVX1OR2-NEXT: LBB23_26: ## %else35 +; AVX1OR2-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX1OR2-NEXT: jne LBB23_27 +; AVX1OR2-NEXT: LBB23_28: ## %else38 +; AVX1OR2-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX1OR2-NEXT: jne LBB23_29 +; AVX1OR2-NEXT: LBB23_30: ## %else41 +; AVX1OR2-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX1OR2-NEXT: jne LBB23_31 +; AVX1OR2-NEXT: LBB23_32: ## %else44 +; AVX1OR2-NEXT: vmovdqa %xmm1, %xmm0 +; AVX1OR2-NEXT: retq +; AVX1OR2-NEXT: LBB23_1: ## %cond.load ; AVX1OR2-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_2: ## %else -; AVX1OR2-NEXT: vpextrb $1, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $2, %al ; AVX1OR2-NEXT: je LBB23_4 -; AVX1OR2-NEXT: ## %bb.3: ## %cond.load1 +; AVX1OR2-NEXT: LBB23_3: ## %cond.load1 ; AVX1OR2-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_4: ## %else2 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $2, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $4, %al ; AVX1OR2-NEXT: je LBB23_6 -; AVX1OR2-NEXT: ## %bb.5: ## %cond.load4 +; AVX1OR2-NEXT: LBB23_5: ## %cond.load4 ; AVX1OR2-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_6: ## %else5 -; AVX1OR2-NEXT: vpextrb $3, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $8, %al ; AVX1OR2-NEXT: je LBB23_8 -; AVX1OR2-NEXT: ## %bb.7: ## %cond.load7 +; AVX1OR2-NEXT: LBB23_7: ## %cond.load7 ; AVX1OR2-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_8: ## %else8 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $4, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $16, %al ; AVX1OR2-NEXT: je LBB23_10 -; AVX1OR2-NEXT: ## %bb.9: ## %cond.load10 +; AVX1OR2-NEXT: LBB23_9: ## %cond.load10 ; AVX1OR2-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_10: ## %else11 -; AVX1OR2-NEXT: vpextrb $5, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $32, %al ; AVX1OR2-NEXT: je LBB23_12 -; AVX1OR2-NEXT: ## %bb.11: ## %cond.load13 +; AVX1OR2-NEXT: LBB23_11: ## %cond.load13 ; AVX1OR2-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_12: ## %else14 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $6, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $64, %al ; AVX1OR2-NEXT: je LBB23_14 -; AVX1OR2-NEXT: ## %bb.13: ## %cond.load16 +; AVX1OR2-NEXT: LBB23_13: ## %cond.load16 ; AVX1OR2-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_14: ## %else17 -; AVX1OR2-NEXT: vpextrb $7, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $-128, %al ; AVX1OR2-NEXT: je LBB23_16 -; AVX1OR2-NEXT: ## %bb.15: ## %cond.load19 +; AVX1OR2-NEXT: LBB23_15: ## %cond.load19 ; AVX1OR2-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_16: ## %else20 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $8, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1OR2-NEXT: je LBB23_18 -; AVX1OR2-NEXT: ## %bb.17: ## %cond.load22 +; AVX1OR2-NEXT: LBB23_17: ## %cond.load22 ; AVX1OR2-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_18: ## %else23 -; AVX1OR2-NEXT: vpextrb $9, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1OR2-NEXT: je LBB23_20 -; AVX1OR2-NEXT: ## %bb.19: ## %cond.load25 +; AVX1OR2-NEXT: LBB23_19: ## %cond.load25 ; AVX1OR2-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_20: ## %else26 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $10, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1OR2-NEXT: je LBB23_22 -; AVX1OR2-NEXT: ## %bb.21: ## %cond.load28 +; AVX1OR2-NEXT: LBB23_21: ## %cond.load28 ; AVX1OR2-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_22: ## %else29 -; AVX1OR2-NEXT: vpextrb $11, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1OR2-NEXT: je LBB23_24 -; AVX1OR2-NEXT: ## %bb.23: ## %cond.load31 +; AVX1OR2-NEXT: LBB23_23: ## %cond.load31 ; AVX1OR2-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_24: ## %else32 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpextrb $12, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1OR2-NEXT: je LBB23_26 -; AVX1OR2-NEXT: ## %bb.25: ## %cond.load34 +; AVX1OR2-NEXT: LBB23_25: ## %cond.load34 ; AVX1OR2-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_26: ## %else35 -; AVX1OR2-NEXT: vpextrb $13, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1OR2-NEXT: je LBB23_28 -; AVX1OR2-NEXT: ## %bb.27: ## %cond.load37 +; AVX1OR2-NEXT: LBB23_27: ## %cond.load37 ; AVX1OR2-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_28: ## %else38 -; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1OR2-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm0 -; AVX1OR2-NEXT: vpextrb $14, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX1OR2-NEXT: je LBB23_30 -; AVX1OR2-NEXT: ## %bb.29: ## %cond.load40 +; AVX1OR2-NEXT: LBB23_29: ## %cond.load40 ; AVX1OR2-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_30: ## %else41 -; AVX1OR2-NEXT: vpextrb $15, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1OR2-NEXT: je LBB23_32 -; AVX1OR2-NEXT: ## %bb.31: ## %cond.load43 +; AVX1OR2-NEXT: LBB23_31: ## %cond.load43 ; AVX1OR2-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm1 -; AVX1OR2-NEXT: LBB23_32: ## %else44 ; AVX1OR2-NEXT: vmovdqa %xmm1, %xmm0 ; AVX1OR2-NEXT: retq ; ; AVX512F-LABEL: load_v16i8_v16i8: ; AVX512F: ## %bb.0: -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kmovw %k0, %eax +; AVX512F-NEXT: vpmovmskb %xmm0, %eax ; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB23_2 -; AVX512F-NEXT: ## %bb.1: ## %cond.load +; AVX512F-NEXT: jne LBB23_1 +; AVX512F-NEXT: ## %bb.2: ## %else +; AVX512F-NEXT: testb $2, %al +; AVX512F-NEXT: jne LBB23_3 +; AVX512F-NEXT: LBB23_4: ## %else2 +; AVX512F-NEXT: testb $4, %al +; AVX512F-NEXT: jne LBB23_5 +; AVX512F-NEXT: LBB23_6: ## %else5 +; AVX512F-NEXT: testb $8, %al +; AVX512F-NEXT: jne LBB23_7 +; AVX512F-NEXT: LBB23_8: ## %else8 +; AVX512F-NEXT: testb $16, %al +; AVX512F-NEXT: jne LBB23_9 +; AVX512F-NEXT: LBB23_10: ## %else11 +; AVX512F-NEXT: testb $32, %al +; AVX512F-NEXT: jne LBB23_11 +; AVX512F-NEXT: LBB23_12: ## %else14 +; AVX512F-NEXT: testb $64, %al +; AVX512F-NEXT: jne LBB23_13 +; AVX512F-NEXT: LBB23_14: ## %else17 +; AVX512F-NEXT: testb $-128, %al +; AVX512F-NEXT: jne LBB23_15 +; AVX512F-NEXT: LBB23_16: ## %else20 +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 +; AVX512F-NEXT: jne LBB23_17 +; AVX512F-NEXT: LBB23_18: ## %else23 +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 +; AVX512F-NEXT: jne LBB23_19 +; AVX512F-NEXT: LBB23_20: ## %else26 +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX512F-NEXT: jne LBB23_21 +; AVX512F-NEXT: LBB23_22: ## %else29 +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX512F-NEXT: jne LBB23_23 +; AVX512F-NEXT: LBB23_24: ## %else32 +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX512F-NEXT: jne LBB23_25 +; AVX512F-NEXT: LBB23_26: ## %else35 +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX512F-NEXT: jne LBB23_27 +; AVX512F-NEXT: LBB23_28: ## %else38 +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX512F-NEXT: jne LBB23_29 +; AVX512F-NEXT: LBB23_30: ## %else41 +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX512F-NEXT: jne LBB23_31 +; AVX512F-NEXT: LBB23_32: ## %else44 +; AVX512F-NEXT: vmovdqa %xmm1, %xmm0 +; AVX512F-NEXT: retq +; AVX512F-NEXT: LBB23_1: ## %cond.load ; AVX512F-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_2: ## %else -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je LBB23_4 -; AVX512F-NEXT: ## %bb.3: ## %cond.load1 +; AVX512F-NEXT: LBB23_3: ## %cond.load1 ; AVX512F-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_4: ## %else2 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je LBB23_6 -; AVX512F-NEXT: ## %bb.5: ## %cond.load4 +; AVX512F-NEXT: LBB23_5: ## %cond.load4 ; AVX512F-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_6: ## %else5 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je LBB23_8 -; AVX512F-NEXT: ## %bb.7: ## %cond.load7 +; AVX512F-NEXT: LBB23_7: ## %cond.load7 ; AVX512F-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_8: ## %else8 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je LBB23_10 -; AVX512F-NEXT: ## %bb.9: ## %cond.load10 +; AVX512F-NEXT: LBB23_9: ## %cond.load10 ; AVX512F-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_10: ## %else11 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je LBB23_12 -; AVX512F-NEXT: ## %bb.11: ## %cond.load13 +; AVX512F-NEXT: LBB23_11: ## %cond.load13 ; AVX512F-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_12: ## %else14 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je LBB23_14 -; AVX512F-NEXT: ## %bb.13: ## %cond.load16 +; AVX512F-NEXT: LBB23_13: ## %cond.load16 ; AVX512F-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_14: ## %else17 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je LBB23_16 -; AVX512F-NEXT: ## %bb.15: ## %cond.load19 +; AVX512F-NEXT: LBB23_15: ## %cond.load19 ; AVX512F-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_16: ## %else20 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 ; AVX512F-NEXT: je LBB23_18 -; AVX512F-NEXT: ## %bb.17: ## %cond.load22 +; AVX512F-NEXT: LBB23_17: ## %cond.load22 ; AVX512F-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_18: ## %else23 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 ; AVX512F-NEXT: je LBB23_20 -; AVX512F-NEXT: ## %bb.19: ## %cond.load25 +; AVX512F-NEXT: LBB23_19: ## %cond.load25 ; AVX512F-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_20: ## %else26 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX512F-NEXT: je LBB23_22 -; AVX512F-NEXT: ## %bb.21: ## %cond.load28 +; AVX512F-NEXT: LBB23_21: ## %cond.load28 ; AVX512F-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_22: ## %else29 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX512F-NEXT: je LBB23_24 -; AVX512F-NEXT: ## %bb.23: ## %cond.load31 +; AVX512F-NEXT: LBB23_23: ## %cond.load31 ; AVX512F-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_24: ## %else32 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX512F-NEXT: je LBB23_26 -; AVX512F-NEXT: ## %bb.25: ## %cond.load34 +; AVX512F-NEXT: LBB23_25: ## %cond.load34 ; AVX512F-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_26: ## %else35 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX512F-NEXT: je LBB23_28 -; AVX512F-NEXT: ## %bb.27: ## %cond.load37 +; AVX512F-NEXT: LBB23_27: ## %cond.load37 ; AVX512F-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_28: ## %else38 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm0 -; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 -; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX512F-NEXT: je LBB23_30 -; AVX512F-NEXT: ## %bb.29: ## %cond.load40 +; AVX512F-NEXT: LBB23_29: ## %cond.load40 ; AVX512F-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_30: ## %else41 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX512F-NEXT: je LBB23_32 -; AVX512F-NEXT: ## %bb.31: ## %cond.load43 +; AVX512F-NEXT: LBB23_31: ## %cond.load43 ; AVX512F-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm1 -; AVX512F-NEXT: LBB23_32: ## %else44 ; AVX512F-NEXT: vmovdqa %xmm1, %xmm0 -; AVX512F-NEXT: vzeroupper ; AVX512F-NEXT: retq ; ; AVX512VLBW-LABEL: load_v16i8_v16i8: @@ -4197,402 +4234,410 @@ define <32 x i8> @load_v32i8_v32i8(<32 x i8> %trigger, <32 x i8>* %addr, <32 x i8> %dst) { ; SSE2-LABEL: load_v32i8_v32i8: ; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax +; SSE2-NEXT: pmovmskb %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_2 -; SSE2-NEXT: ## %bb.1: ## %cond.load -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl (%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 -; SSE2-NEXT: LBB24_2: ## %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_4 -; SSE2-NEXT: ## %bb.3: ## %cond.load1 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 1(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: psllw $8, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: jne LBB24_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB24_3 ; SSE2-NEXT: LBB24_4: ## %else2 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je LBB24_6 -; SSE2-NEXT: ## %bb.5: ## %cond.load4 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 2(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pslld $16, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB24_5 ; SSE2-NEXT: LBB24_6: ## %else5 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_8 -; SSE2-NEXT: ## %bb.7: ## %cond.load7 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 3(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: pslld $24, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB24_7 ; SSE2-NEXT: LBB24_8: ## %else8 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $2, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_10 -; SSE2-NEXT: ## %bb.9: ## %cond.load10 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 4(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,0,1,1] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $16, %al +; SSE2-NEXT: jne LBB24_9 ; SSE2-NEXT: LBB24_10: ## %else11 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_12 -; SSE2-NEXT: ## %bb.11: ## %cond.load13 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 5(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: psllq $40, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $32, %al +; SSE2-NEXT: jne LBB24_11 ; SSE2-NEXT: LBB24_12: ## %else14 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $3, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_14 -; SSE2-NEXT: ## %bb.13: ## %cond.load16 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 6(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: psllq $48, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $64, %al +; SSE2-NEXT: jne LBB24_13 ; SSE2-NEXT: LBB24_14: ## %else17 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_16 -; SSE2-NEXT: ## %bb.15: ## %cond.load19 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 7(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: psllq $56, %xmm5 -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testb $-128, %al +; SSE2-NEXT: jne LBB24_15 ; SSE2-NEXT: LBB24_16: ## %else20 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $4, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_18 -; SSE2-NEXT: ## %bb.17: ## %cond.load22 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 8(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,1,0,1] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 +; SSE2-NEXT: jne LBB24_17 ; SSE2-NEXT: LBB24_18: ## %else23 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_20 -; SSE2-NEXT: ## %bb.19: ## %cond.load25 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 9(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: pslldq {{.*#+}} xmm5 = zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm5[0,1,2,3,4,5,6] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 +; SSE2-NEXT: jne LBB24_19 ; SSE2-NEXT: LBB24_20: ## %else26 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $5, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_22 -; SSE2-NEXT: ## %bb.21: ## %cond.load28 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 10(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pslldq {{.*#+}} xmm5 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm5[0,1,2,3,4,5] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE2-NEXT: jne LBB24_21 ; SSE2-NEXT: LBB24_22: ## %else29 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_24 -; SSE2-NEXT: ## %bb.23: ## %cond.load31 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 11(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: pslldq {{.*#+}} xmm5 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm5[0,1,2,3,4] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE2-NEXT: jne LBB24_23 ; SSE2-NEXT: LBB24_24: ## %else32 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_26 -; SSE2-NEXT: ## %bb.25: ## %cond.load34 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 12(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[0,1,2,0] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE2-NEXT: jne LBB24_25 ; SSE2-NEXT: LBB24_26: ## %else35 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_28 -; SSE2-NEXT: ## %bb.27: ## %cond.load37 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255] -; SSE2-NEXT: pand %xmm4, %xmm2 -; SSE2-NEXT: movzbl 13(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm5 -; SSE2-NEXT: pslldq {{.*#+}} xmm5 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm5[0,1,2] -; SSE2-NEXT: pandn %xmm5, %xmm4 -; SSE2-NEXT: por %xmm4, %xmm2 +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE2-NEXT: jne LBB24_27 ; SSE2-NEXT: LBB24_28: ## %else38 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $7, %xmm4, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_30 -; SSE2-NEXT: ## %bb.29: ## %cond.load40 -; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255] -; SSE2-NEXT: pand %xmm0, %xmm2 -; SSE2-NEXT: movzbl 14(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm4 -; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1] -; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE2-NEXT: jne LBB24_29 ; SSE2-NEXT: LBB24_30: ## %else41 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE2-NEXT: je LBB24_32 -; SSE2-NEXT: ## %bb.31: ## %cond.load43 +; SSE2-NEXT: LBB24_31: ## %cond.load43 ; SSE2-NEXT: pand {{.*}}(%rip), %xmm2 ; SSE2-NEXT: movzbl 15(%rdi), %eax ; SSE2-NEXT: movd %eax, %xmm0 ; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0] ; SSE2-NEXT: por %xmm0, %xmm2 ; SSE2-NEXT: LBB24_32: ## %else44 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_34 -; SSE2-NEXT: ## %bb.33: ## %cond.load46 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $65536, %eax ## imm = 0x10000 +; SSE2-NEXT: jne LBB24_33 +; SSE2-NEXT: ## %bb.34: ## %else47 +; SSE2-NEXT: testl $131072, %eax ## imm = 0x20000 +; SSE2-NEXT: jne LBB24_35 +; SSE2-NEXT: LBB24_36: ## %else50 +; SSE2-NEXT: testl $262144, %eax ## imm = 0x40000 +; SSE2-NEXT: jne LBB24_37 +; SSE2-NEXT: LBB24_38: ## %else53 +; SSE2-NEXT: testl $524288, %eax ## imm = 0x80000 +; SSE2-NEXT: jne LBB24_39 +; SSE2-NEXT: LBB24_40: ## %else56 +; SSE2-NEXT: testl $1048576, %eax ## imm = 0x100000 +; SSE2-NEXT: jne LBB24_41 +; SSE2-NEXT: LBB24_42: ## %else59 +; SSE2-NEXT: testl $2097152, %eax ## imm = 0x200000 +; SSE2-NEXT: jne LBB24_43 +; SSE2-NEXT: LBB24_44: ## %else62 +; SSE2-NEXT: testl $4194304, %eax ## imm = 0x400000 +; SSE2-NEXT: jne LBB24_45 +; SSE2-NEXT: LBB24_46: ## %else65 +; SSE2-NEXT: testl $8388608, %eax ## imm = 0x800000 +; SSE2-NEXT: jne LBB24_47 +; SSE2-NEXT: LBB24_48: ## %else68 +; SSE2-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; SSE2-NEXT: jne LBB24_49 +; SSE2-NEXT: LBB24_50: ## %else71 +; SSE2-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; SSE2-NEXT: jne LBB24_51 +; SSE2-NEXT: LBB24_52: ## %else74 +; SSE2-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; SSE2-NEXT: jne LBB24_53 +; SSE2-NEXT: LBB24_54: ## %else77 +; SSE2-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; SSE2-NEXT: jne LBB24_55 +; SSE2-NEXT: LBB24_56: ## %else80 +; SSE2-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; SSE2-NEXT: jne LBB24_57 +; SSE2-NEXT: LBB24_58: ## %else83 +; SSE2-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; SSE2-NEXT: jne LBB24_59 +; SSE2-NEXT: LBB24_60: ## %else86 +; SSE2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; SSE2-NEXT: jne LBB24_61 +; SSE2-NEXT: LBB24_62: ## %else89 +; SSE2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE2-NEXT: je LBB24_64 +; SSE2-NEXT: LBB24_63: ## %cond.load91 +; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 +; SSE2-NEXT: movzbl 31(%rdi), %eax +; SSE2-NEXT: movd %eax, %xmm0 +; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0] +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: LBB24_64: ## %else92 +; SSE2-NEXT: movdqa %xmm2, %xmm0 +; SSE2-NEXT: movdqa %xmm3, %xmm1 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB24_1: ## %cond.load ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 16(%rdi), %ecx +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl (%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_34: ## %else47 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_36 -; SSE2-NEXT: ## %bb.35: ## %cond.load49 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: je LBB24_4 +; SSE2-NEXT: LBB24_3: ## %cond.load1 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 17(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 1(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: psllw $8, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_36: ## %else50 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je LBB24_38 -; SSE2-NEXT: ## %bb.37: ## %cond.load52 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: je LBB24_6 +; SSE2-NEXT: LBB24_5: ## %cond.load4 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 18(%rdi), %ecx +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 2(%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pslld $16, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_38: ## %else53 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_40 -; SSE2-NEXT: ## %bb.39: ## %cond.load55 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: je LBB24_8 +; SSE2-NEXT: LBB24_7: ## %cond.load7 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 19(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 3(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pslld $24, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_40: ## %else56 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_42 -; SSE2-NEXT: ## %bb.41: ## %cond.load58 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $16, %al +; SSE2-NEXT: je LBB24_10 +; SSE2-NEXT: LBB24_9: ## %cond.load10 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 20(%rdi), %ecx +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 4(%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,1,1] ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_42: ## %else59 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_44 -; SSE2-NEXT: ## %bb.43: ## %cond.load61 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $32, %al +; SSE2-NEXT: je LBB24_12 +; SSE2-NEXT: LBB24_11: ## %cond.load13 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 21(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 5(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: psllq $40, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_44: ## %else62 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_46 -; SSE2-NEXT: ## %bb.45: ## %cond.load64 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $64, %al +; SSE2-NEXT: je LBB24_14 +; SSE2-NEXT: LBB24_13: ## %cond.load16 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 22(%rdi), %ecx +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 6(%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: psllq $48, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_46: ## %else65 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_48 -; SSE2-NEXT: ## %bb.47: ## %cond.load67 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testb $-128, %al +; SSE2-NEXT: je LBB24_16 +; SSE2-NEXT: LBB24_15: ## %cond.load19 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 23(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 7(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: psllq $56, %xmm4 ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_48: ## %else68 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_50 -; SSE2-NEXT: ## %bb.49: ## %cond.load70 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 +; SSE2-NEXT: je LBB24_18 +; SSE2-NEXT: LBB24_17: ## %cond.load22 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 24(%rdi), %ecx +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 8(%rdi), %ecx ; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,0,1] ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_50: ## %else71 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_52 -; SSE2-NEXT: ## %bb.51: ## %cond.load73 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 +; SSE2-NEXT: je LBB24_20 +; SSE2-NEXT: LBB24_19: ## %cond.load25 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 25(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 9(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2,3,4,5,6] ; SSE2-NEXT: pandn %xmm4, %xmm0 -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_52: ## %else74 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_54 -; SSE2-NEXT: ## %bb.53: ## %cond.load76 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE2-NEXT: je LBB24_22 +; SSE2-NEXT: LBB24_21: ## %cond.load28 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255] -; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 26(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm4 +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 10(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 ; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2,3,4,5] ; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE2-NEXT: je LBB24_24 +; SSE2-NEXT: LBB24_23: ## %cond.load31 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 11(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 +; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2,3,4] +; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE2-NEXT: je LBB24_26 +; SSE2-NEXT: LBB24_25: ## %cond.load34 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 12(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,2,0] +; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE2-NEXT: je LBB24_28 +; SSE2-NEXT: LBB24_27: ## %cond.load37 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255] +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 13(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 +; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2] +; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE2-NEXT: je LBB24_30 +; SSE2-NEXT: LBB24_29: ## %cond.load40 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255] +; SSE2-NEXT: pand %xmm0, %xmm2 +; SSE2-NEXT: movzbl 14(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm4 +; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1] +; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm2 +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE2-NEXT: jne LBB24_31 +; SSE2-NEXT: jmp LBB24_32 +; SSE2-NEXT: LBB24_33: ## %cond.load46 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 16(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_54: ## %else77 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $131072, %eax ## imm = 0x20000 +; SSE2-NEXT: je LBB24_36 +; SSE2-NEXT: LBB24_35: ## %cond.load49 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 17(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: psllw $8, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $262144, %eax ## imm = 0x40000 +; SSE2-NEXT: je LBB24_38 +; SSE2-NEXT: LBB24_37: ## %cond.load52 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,0,255,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 18(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslld $16, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $524288, %eax ## imm = 0x80000 +; SSE2-NEXT: je LBB24_40 +; SSE2-NEXT: LBB24_39: ## %cond.load55 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,0,255,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 19(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslld $24, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $1048576, %eax ## imm = 0x100000 +; SSE2-NEXT: je LBB24_42 +; SSE2-NEXT: LBB24_41: ## %cond.load58 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,0,255,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 20(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,1,1] +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $2097152, %eax ## imm = 0x200000 +; SSE2-NEXT: je LBB24_44 +; SSE2-NEXT: LBB24_43: ## %cond.load61 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,0,255,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 21(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: psllq $40, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $4194304, %eax ## imm = 0x400000 +; SSE2-NEXT: je LBB24_46 +; SSE2-NEXT: LBB24_45: ## %cond.load64 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 22(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: psllq $48, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $8388608, %eax ## imm = 0x800000 +; SSE2-NEXT: je LBB24_48 +; SSE2-NEXT: LBB24_47: ## %cond.load67 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,0,255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 23(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: psllq $56, %xmm1 +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; SSE2-NEXT: je LBB24_50 +; SSE2-NEXT: LBB24_49: ## %cond.load70 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,0,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 24(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,0,1] +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; SSE2-NEXT: je LBB24_52 +; SSE2-NEXT: LBB24_51: ## %cond.load73 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 25(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5,6] +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; SSE2-NEXT: je LBB24_54 +; SSE2-NEXT: LBB24_53: ## %cond.load76 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255] +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: movzbl 26(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4,5] +; SSE2-NEXT: pandn %xmm1, %xmm0 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; SSE2-NEXT: je LBB24_56 -; SSE2-NEXT: ## %bb.55: ## %cond.load79 +; SSE2-NEXT: LBB24_55: ## %cond.load79 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255] ; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 27(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 -; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2,3,4] -; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: movzbl 27(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2,3,4] +; SSE2-NEXT: pandn %xmm1, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_56: ## %else80 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; SSE2-NEXT: je LBB24_58 -; SSE2-NEXT: ## %bb.57: ## %cond.load82 +; SSE2-NEXT: LBB24_57: ## %cond.load82 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255] ; SSE2-NEXT: pand %xmm0, %xmm3 ; SSE2-NEXT: movzbl 28(%rdi), %ecx -; SSE2-NEXT: movd %ecx, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,1,2,0] -; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,1,2,0] +; SSE2-NEXT: pandn %xmm1, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_58: ## %else83 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; SSE2-NEXT: je LBB24_60 -; SSE2-NEXT: ## %bb.59: ## %cond.load85 +; SSE2-NEXT: LBB24_59: ## %cond.load85 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,0,255,255] ; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: movzbl 29(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm4 -; SSE2-NEXT: pslldq {{.*#+}} xmm4 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm4[0,1,2] -; SSE2-NEXT: pandn %xmm4, %xmm0 +; SSE2-NEXT: movzbl 29(%rdi), %ecx +; SSE2-NEXT: movd %ecx, %xmm1 +; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1,2] +; SSE2-NEXT: pandn %xmm1, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_60: ## %else86 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 ; SSE2-NEXT: je LBB24_62 -; SSE2-NEXT: ## %bb.61: ## %cond.load88 +; SSE2-NEXT: LBB24_61: ## %cond.load88 ; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,255] ; SSE2-NEXT: pand %xmm0, %xmm3 ; SSE2-NEXT: movzbl 30(%rdi), %ecx @@ -4600,1182 +4645,1058 @@ ; SSE2-NEXT: pslldq {{.*#+}} xmm1 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm1[0,1] ; SSE2-NEXT: pandn %xmm1, %xmm0 ; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_62: ## %else89 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB24_64 -; SSE2-NEXT: ## %bb.63: ## %cond.load91 -; SSE2-NEXT: pand {{.*}}(%rip), %xmm3 -; SSE2-NEXT: movzbl 31(%rdi), %eax -; SSE2-NEXT: movd %eax, %xmm0 -; SSE2-NEXT: pslldq {{.*#+}} xmm0 = zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,xmm0[0] -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: LBB24_64: ## %else92 -; SSE2-NEXT: movdqa %xmm2, %xmm0 -; SSE2-NEXT: movdqa %xmm3, %xmm1 -; SSE2-NEXT: retq +; SSE2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE2-NEXT: jne LBB24_63 +; SSE2-NEXT: jmp LBB24_64 ; ; SSE42-LABEL: load_v32i8_v32i8: ; SSE42: ## %bb.0: -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $0, %xmm4, %eax +; SSE42-NEXT: pmovmskb %xmm0, %eax ; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB24_2 -; SSE42-NEXT: ## %bb.1: ## %cond.load +; SSE42-NEXT: jne LBB24_1 +; SSE42-NEXT: ## %bb.2: ## %else +; SSE42-NEXT: testb $2, %al +; SSE42-NEXT: jne LBB24_3 +; SSE42-NEXT: LBB24_4: ## %else2 +; SSE42-NEXT: testb $4, %al +; SSE42-NEXT: jne LBB24_5 +; SSE42-NEXT: LBB24_6: ## %else5 +; SSE42-NEXT: testb $8, %al +; SSE42-NEXT: jne LBB24_7 +; SSE42-NEXT: LBB24_8: ## %else8 +; SSE42-NEXT: testb $16, %al +; SSE42-NEXT: jne LBB24_9 +; SSE42-NEXT: LBB24_10: ## %else11 +; SSE42-NEXT: testb $32, %al +; SSE42-NEXT: jne LBB24_11 +; SSE42-NEXT: LBB24_12: ## %else14 +; SSE42-NEXT: testb $64, %al +; SSE42-NEXT: jne LBB24_13 +; SSE42-NEXT: LBB24_14: ## %else17 +; SSE42-NEXT: testb $-128, %al +; SSE42-NEXT: jne LBB24_15 +; SSE42-NEXT: LBB24_16: ## %else20 +; SSE42-NEXT: testl $256, %eax ## imm = 0x100 +; SSE42-NEXT: jne LBB24_17 +; SSE42-NEXT: LBB24_18: ## %else23 +; SSE42-NEXT: testl $512, %eax ## imm = 0x200 +; SSE42-NEXT: jne LBB24_19 +; SSE42-NEXT: LBB24_20: ## %else26 +; SSE42-NEXT: testl $1024, %eax ## imm = 0x400 +; SSE42-NEXT: jne LBB24_21 +; SSE42-NEXT: LBB24_22: ## %else29 +; SSE42-NEXT: testl $2048, %eax ## imm = 0x800 +; SSE42-NEXT: jne LBB24_23 +; SSE42-NEXT: LBB24_24: ## %else32 +; SSE42-NEXT: testl $4096, %eax ## imm = 0x1000 +; SSE42-NEXT: jne LBB24_25 +; SSE42-NEXT: LBB24_26: ## %else35 +; SSE42-NEXT: testl $8192, %eax ## imm = 0x2000 +; SSE42-NEXT: jne LBB24_27 +; SSE42-NEXT: LBB24_28: ## %else38 +; SSE42-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE42-NEXT: jne LBB24_29 +; SSE42-NEXT: LBB24_30: ## %else41 +; SSE42-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE42-NEXT: je LBB24_32 +; SSE42-NEXT: LBB24_31: ## %cond.load43 +; SSE42-NEXT: pinsrb $15, 15(%rdi), %xmm2 +; SSE42-NEXT: LBB24_32: ## %else44 +; SSE42-NEXT: pmovmskb %xmm1, %eax +; SSE42-NEXT: shll $16, %eax +; SSE42-NEXT: testl $65536, %eax ## imm = 0x10000 +; SSE42-NEXT: jne LBB24_33 +; SSE42-NEXT: ## %bb.34: ## %else47 +; SSE42-NEXT: testl $131072, %eax ## imm = 0x20000 +; SSE42-NEXT: jne LBB24_35 +; SSE42-NEXT: LBB24_36: ## %else50 +; SSE42-NEXT: testl $262144, %eax ## imm = 0x40000 +; SSE42-NEXT: jne LBB24_37 +; SSE42-NEXT: LBB24_38: ## %else53 +; SSE42-NEXT: testl $524288, %eax ## imm = 0x80000 +; SSE42-NEXT: jne LBB24_39 +; SSE42-NEXT: LBB24_40: ## %else56 +; SSE42-NEXT: testl $1048576, %eax ## imm = 0x100000 +; SSE42-NEXT: jne LBB24_41 +; SSE42-NEXT: LBB24_42: ## %else59 +; SSE42-NEXT: testl $2097152, %eax ## imm = 0x200000 +; SSE42-NEXT: jne LBB24_43 +; SSE42-NEXT: LBB24_44: ## %else62 +; SSE42-NEXT: testl $4194304, %eax ## imm = 0x400000 +; SSE42-NEXT: jne LBB24_45 +; SSE42-NEXT: LBB24_46: ## %else65 +; SSE42-NEXT: testl $8388608, %eax ## imm = 0x800000 +; SSE42-NEXT: jne LBB24_47 +; SSE42-NEXT: LBB24_48: ## %else68 +; SSE42-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; SSE42-NEXT: jne LBB24_49 +; SSE42-NEXT: LBB24_50: ## %else71 +; SSE42-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; SSE42-NEXT: jne LBB24_51 +; SSE42-NEXT: LBB24_52: ## %else74 +; SSE42-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; SSE42-NEXT: jne LBB24_53 +; SSE42-NEXT: LBB24_54: ## %else77 +; SSE42-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; SSE42-NEXT: jne LBB24_55 +; SSE42-NEXT: LBB24_56: ## %else80 +; SSE42-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; SSE42-NEXT: jne LBB24_57 +; SSE42-NEXT: LBB24_58: ## %else83 +; SSE42-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; SSE42-NEXT: jne LBB24_59 +; SSE42-NEXT: LBB24_60: ## %else86 +; SSE42-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; SSE42-NEXT: jne LBB24_61 +; SSE42-NEXT: LBB24_62: ## %else89 +; SSE42-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE42-NEXT: je LBB24_64 +; SSE42-NEXT: LBB24_63: ## %cond.load91 +; SSE42-NEXT: pinsrb $15, 31(%rdi), %xmm3 +; SSE42-NEXT: LBB24_64: ## %else92 +; SSE42-NEXT: movdqa %xmm2, %xmm0 +; SSE42-NEXT: movdqa %xmm3, %xmm1 +; SSE42-NEXT: retq +; SSE42-NEXT: LBB24_1: ## %cond.load ; SSE42-NEXT: pinsrb $0, (%rdi), %xmm2 -; SSE42-NEXT: LBB24_2: ## %else -; SSE42-NEXT: pextrb $1, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $2, %al ; SSE42-NEXT: je LBB24_4 -; SSE42-NEXT: ## %bb.3: ## %cond.load1 +; SSE42-NEXT: LBB24_3: ## %cond.load1 ; SSE42-NEXT: pinsrb $1, 1(%rdi), %xmm2 -; SSE42-NEXT: LBB24_4: ## %else2 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $2, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $4, %al ; SSE42-NEXT: je LBB24_6 -; SSE42-NEXT: ## %bb.5: ## %cond.load4 +; SSE42-NEXT: LBB24_5: ## %cond.load4 ; SSE42-NEXT: pinsrb $2, 2(%rdi), %xmm2 -; SSE42-NEXT: LBB24_6: ## %else5 -; SSE42-NEXT: pextrb $3, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $8, %al ; SSE42-NEXT: je LBB24_8 -; SSE42-NEXT: ## %bb.7: ## %cond.load7 +; SSE42-NEXT: LBB24_7: ## %cond.load7 ; SSE42-NEXT: pinsrb $3, 3(%rdi), %xmm2 -; SSE42-NEXT: LBB24_8: ## %else8 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $4, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $16, %al ; SSE42-NEXT: je LBB24_10 -; SSE42-NEXT: ## %bb.9: ## %cond.load10 +; SSE42-NEXT: LBB24_9: ## %cond.load10 ; SSE42-NEXT: pinsrb $4, 4(%rdi), %xmm2 -; SSE42-NEXT: LBB24_10: ## %else11 -; SSE42-NEXT: pextrb $5, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $32, %al ; SSE42-NEXT: je LBB24_12 -; SSE42-NEXT: ## %bb.11: ## %cond.load13 +; SSE42-NEXT: LBB24_11: ## %cond.load13 ; SSE42-NEXT: pinsrb $5, 5(%rdi), %xmm2 -; SSE42-NEXT: LBB24_12: ## %else14 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $6, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $64, %al ; SSE42-NEXT: je LBB24_14 -; SSE42-NEXT: ## %bb.13: ## %cond.load16 +; SSE42-NEXT: LBB24_13: ## %cond.load16 ; SSE42-NEXT: pinsrb $6, 6(%rdi), %xmm2 -; SSE42-NEXT: LBB24_14: ## %else17 -; SSE42-NEXT: pextrb $7, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testb $-128, %al ; SSE42-NEXT: je LBB24_16 -; SSE42-NEXT: ## %bb.15: ## %cond.load19 +; SSE42-NEXT: LBB24_15: ## %cond.load19 ; SSE42-NEXT: pinsrb $7, 7(%rdi), %xmm2 -; SSE42-NEXT: LBB24_16: ## %else20 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $8, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $256, %eax ## imm = 0x100 ; SSE42-NEXT: je LBB24_18 -; SSE42-NEXT: ## %bb.17: ## %cond.load22 +; SSE42-NEXT: LBB24_17: ## %cond.load22 ; SSE42-NEXT: pinsrb $8, 8(%rdi), %xmm2 -; SSE42-NEXT: LBB24_18: ## %else23 -; SSE42-NEXT: pextrb $9, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $512, %eax ## imm = 0x200 ; SSE42-NEXT: je LBB24_20 -; SSE42-NEXT: ## %bb.19: ## %cond.load25 +; SSE42-NEXT: LBB24_19: ## %cond.load25 ; SSE42-NEXT: pinsrb $9, 9(%rdi), %xmm2 -; SSE42-NEXT: LBB24_20: ## %else26 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $10, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE42-NEXT: je LBB24_22 -; SSE42-NEXT: ## %bb.21: ## %cond.load28 +; SSE42-NEXT: LBB24_21: ## %cond.load28 ; SSE42-NEXT: pinsrb $10, 10(%rdi), %xmm2 -; SSE42-NEXT: LBB24_22: ## %else29 -; SSE42-NEXT: pextrb $11, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE42-NEXT: je LBB24_24 -; SSE42-NEXT: ## %bb.23: ## %cond.load31 +; SSE42-NEXT: LBB24_23: ## %cond.load31 ; SSE42-NEXT: pinsrb $11, 11(%rdi), %xmm2 -; SSE42-NEXT: LBB24_24: ## %else32 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $12, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE42-NEXT: je LBB24_26 -; SSE42-NEXT: ## %bb.25: ## %cond.load34 +; SSE42-NEXT: LBB24_25: ## %cond.load34 ; SSE42-NEXT: pinsrb $12, 12(%rdi), %xmm2 -; SSE42-NEXT: LBB24_26: ## %else35 -; SSE42-NEXT: pextrb $13, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE42-NEXT: je LBB24_28 -; SSE42-NEXT: ## %bb.27: ## %cond.load37 +; SSE42-NEXT: LBB24_27: ## %cond.load37 ; SSE42-NEXT: pinsrb $13, 13(%rdi), %xmm2 -; SSE42-NEXT: LBB24_28: ## %else38 -; SSE42-NEXT: pxor %xmm4, %xmm4 -; SSE42-NEXT: pcmpgtb %xmm0, %xmm4 -; SSE42-NEXT: pextrb $14, %xmm4, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE42-NEXT: je LBB24_30 -; SSE42-NEXT: ## %bb.29: ## %cond.load40 +; SSE42-NEXT: LBB24_29: ## %cond.load40 ; SSE42-NEXT: pinsrb $14, 14(%rdi), %xmm2 -; SSE42-NEXT: LBB24_30: ## %else41 -; SSE42-NEXT: pextrb $15, %xmm4, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB24_32 -; SSE42-NEXT: ## %bb.31: ## %cond.load43 -; SSE42-NEXT: pinsrb $15, 15(%rdi), %xmm2 -; SSE42-NEXT: LBB24_32: ## %else44 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $0, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB24_34 -; SSE42-NEXT: ## %bb.33: ## %cond.load46 +; SSE42-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE42-NEXT: jne LBB24_31 +; SSE42-NEXT: jmp LBB24_32 +; SSE42-NEXT: LBB24_33: ## %cond.load46 ; SSE42-NEXT: pinsrb $0, 16(%rdi), %xmm3 -; SSE42-NEXT: LBB24_34: ## %else47 -; SSE42-NEXT: pextrb $1, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $131072, %eax ## imm = 0x20000 ; SSE42-NEXT: je LBB24_36 -; SSE42-NEXT: ## %bb.35: ## %cond.load49 +; SSE42-NEXT: LBB24_35: ## %cond.load49 ; SSE42-NEXT: pinsrb $1, 17(%rdi), %xmm3 -; SSE42-NEXT: LBB24_36: ## %else50 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $2, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $262144, %eax ## imm = 0x40000 ; SSE42-NEXT: je LBB24_38 -; SSE42-NEXT: ## %bb.37: ## %cond.load52 +; SSE42-NEXT: LBB24_37: ## %cond.load52 ; SSE42-NEXT: pinsrb $2, 18(%rdi), %xmm3 -; SSE42-NEXT: LBB24_38: ## %else53 -; SSE42-NEXT: pextrb $3, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $524288, %eax ## imm = 0x80000 ; SSE42-NEXT: je LBB24_40 -; SSE42-NEXT: ## %bb.39: ## %cond.load55 +; SSE42-NEXT: LBB24_39: ## %cond.load55 ; SSE42-NEXT: pinsrb $3, 19(%rdi), %xmm3 -; SSE42-NEXT: LBB24_40: ## %else56 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $4, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $1048576, %eax ## imm = 0x100000 ; SSE42-NEXT: je LBB24_42 -; SSE42-NEXT: ## %bb.41: ## %cond.load58 +; SSE42-NEXT: LBB24_41: ## %cond.load58 ; SSE42-NEXT: pinsrb $4, 20(%rdi), %xmm3 -; SSE42-NEXT: LBB24_42: ## %else59 -; SSE42-NEXT: pextrb $5, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $2097152, %eax ## imm = 0x200000 ; SSE42-NEXT: je LBB24_44 -; SSE42-NEXT: ## %bb.43: ## %cond.load61 +; SSE42-NEXT: LBB24_43: ## %cond.load61 ; SSE42-NEXT: pinsrb $5, 21(%rdi), %xmm3 -; SSE42-NEXT: LBB24_44: ## %else62 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $6, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $4194304, %eax ## imm = 0x400000 ; SSE42-NEXT: je LBB24_46 -; SSE42-NEXT: ## %bb.45: ## %cond.load64 +; SSE42-NEXT: LBB24_45: ## %cond.load64 ; SSE42-NEXT: pinsrb $6, 22(%rdi), %xmm3 -; SSE42-NEXT: LBB24_46: ## %else65 -; SSE42-NEXT: pextrb $7, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $8388608, %eax ## imm = 0x800000 ; SSE42-NEXT: je LBB24_48 -; SSE42-NEXT: ## %bb.47: ## %cond.load67 +; SSE42-NEXT: LBB24_47: ## %cond.load67 ; SSE42-NEXT: pinsrb $7, 23(%rdi), %xmm3 -; SSE42-NEXT: LBB24_48: ## %else68 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $8, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; SSE42-NEXT: je LBB24_50 -; SSE42-NEXT: ## %bb.49: ## %cond.load70 +; SSE42-NEXT: LBB24_49: ## %cond.load70 ; SSE42-NEXT: pinsrb $8, 24(%rdi), %xmm3 -; SSE42-NEXT: LBB24_50: ## %else71 -; SSE42-NEXT: pextrb $9, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; SSE42-NEXT: je LBB24_52 -; SSE42-NEXT: ## %bb.51: ## %cond.load73 +; SSE42-NEXT: LBB24_51: ## %cond.load73 ; SSE42-NEXT: pinsrb $9, 25(%rdi), %xmm3 -; SSE42-NEXT: LBB24_52: ## %else74 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $10, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; SSE42-NEXT: je LBB24_54 -; SSE42-NEXT: ## %bb.53: ## %cond.load76 +; SSE42-NEXT: LBB24_53: ## %cond.load76 ; SSE42-NEXT: pinsrb $10, 26(%rdi), %xmm3 -; SSE42-NEXT: LBB24_54: ## %else77 -; SSE42-NEXT: pextrb $11, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; SSE42-NEXT: je LBB24_56 -; SSE42-NEXT: ## %bb.55: ## %cond.load79 +; SSE42-NEXT: LBB24_55: ## %cond.load79 ; SSE42-NEXT: pinsrb $11, 27(%rdi), %xmm3 -; SSE42-NEXT: LBB24_56: ## %else80 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $12, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; SSE42-NEXT: je LBB24_58 -; SSE42-NEXT: ## %bb.57: ## %cond.load82 +; SSE42-NEXT: LBB24_57: ## %cond.load82 ; SSE42-NEXT: pinsrb $12, 28(%rdi), %xmm3 -; SSE42-NEXT: LBB24_58: ## %else83 -; SSE42-NEXT: pextrb $13, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; SSE42-NEXT: je LBB24_60 -; SSE42-NEXT: ## %bb.59: ## %cond.load85 +; SSE42-NEXT: LBB24_59: ## %cond.load85 ; SSE42-NEXT: pinsrb $13, 29(%rdi), %xmm3 -; SSE42-NEXT: LBB24_60: ## %else86 -; SSE42-NEXT: pxor %xmm0, %xmm0 -; SSE42-NEXT: pcmpgtb %xmm1, %xmm0 -; SSE42-NEXT: pextrb $14, %xmm0, %eax -; SSE42-NEXT: testb $1, %al +; SSE42-NEXT: testl $1073741824, %eax ## imm = 0x40000000 ; SSE42-NEXT: je LBB24_62 -; SSE42-NEXT: ## %bb.61: ## %cond.load88 +; SSE42-NEXT: LBB24_61: ## %cond.load88 ; SSE42-NEXT: pinsrb $14, 30(%rdi), %xmm3 -; SSE42-NEXT: LBB24_62: ## %else89 -; SSE42-NEXT: pextrb $15, %xmm0, %eax -; SSE42-NEXT: testb $1, %al -; SSE42-NEXT: je LBB24_64 -; SSE42-NEXT: ## %bb.63: ## %cond.load91 -; SSE42-NEXT: pinsrb $15, 31(%rdi), %xmm3 -; SSE42-NEXT: LBB24_64: ## %else92 -; SSE42-NEXT: movdqa %xmm2, %xmm0 -; SSE42-NEXT: movdqa %xmm3, %xmm1 -; SSE42-NEXT: retq +; SSE42-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE42-NEXT: jne LBB24_63 +; SSE42-NEXT: jmp LBB24_64 ; ; AVX1-LABEL: load_v32i8_v32i8: ; AVX1: ## %bb.0: -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vpmovmskb %xmm0, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je LBB24_2 ; AVX1-NEXT: ## %bb.1: ## %cond.load -; AVX1-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_2: ## %else -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB24_4 ; AVX1-NEXT: ## %bb.3: ## %cond.load1 ; AVX1-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_4: ## %else2 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je LBB24_6 ; AVX1-NEXT: ## %bb.5: ## %cond.load4 -; AVX1-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_6: ## %else5 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je LBB24_8 ; AVX1-NEXT: ## %bb.7: ## %cond.load7 ; AVX1-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_8: ## %else8 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je LBB24_10 ; AVX1-NEXT: ## %bb.9: ## %cond.load10 -; AVX1-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_10: ## %else11 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je LBB24_12 ; AVX1-NEXT: ## %bb.11: ## %cond.load13 ; AVX1-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_12: ## %else14 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je LBB24_14 ; AVX1-NEXT: ## %bb.13: ## %cond.load16 -; AVX1-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_14: ## %else17 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je LBB24_16 ; AVX1-NEXT: ## %bb.15: ## %cond.load19 ; AVX1-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_16: ## %else20 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1-NEXT: je LBB24_18 ; AVX1-NEXT: ## %bb.17: ## %cond.load22 -; AVX1-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_18: ## %else23 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB24_20 ; AVX1-NEXT: ## %bb.19: ## %cond.load25 ; AVX1-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_20: ## %else26 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1-NEXT: je LBB24_22 ; AVX1-NEXT: ## %bb.21: ## %cond.load28 -; AVX1-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_22: ## %else29 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1-NEXT: je LBB24_24 ; AVX1-NEXT: ## %bb.23: ## %cond.load31 ; AVX1-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_24: ## %else32 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1-NEXT: je LBB24_26 ; AVX1-NEXT: ## %bb.25: ## %cond.load34 -; AVX1-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_26: ## %else35 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1-NEXT: je LBB24_28 ; AVX1-NEXT: ## %bb.27: ## %cond.load37 ; AVX1-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_28: ## %else38 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm3 -; AVX1-NEXT: vpextrb $14, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX1-NEXT: je LBB24_30 ; AVX1-NEXT: ## %bb.29: ## %cond.load40 -; AVX1-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm3 -; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX1-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm2 +; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_30: ## %else41 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $15, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1-NEXT: je LBB24_32 ; AVX1-NEXT: ## %bb.31: ## %cond.load43 ; AVX1-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm2 ; AVX1-NEXT: vblendps {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] ; AVX1-NEXT: LBB24_32: ## %else44 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_34 -; AVX1-NEXT: ## %bb.33: ## %cond.load46 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $0, 16(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 -; AVX1-NEXT: LBB24_34: ## %else47 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_36 -; AVX1-NEXT: ## %bb.35: ## %cond.load49 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $1, 17(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $65536, %eax ## imm = 0x10000 +; AVX1-NEXT: jne LBB24_33 +; AVX1-NEXT: ## %bb.34: ## %else47 +; AVX1-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX1-NEXT: jne LBB24_35 ; AVX1-NEXT: LBB24_36: ## %else50 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_38 -; AVX1-NEXT: ## %bb.37: ## %cond.load52 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $2, 18(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX1-NEXT: jne LBB24_37 ; AVX1-NEXT: LBB24_38: ## %else53 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_40 -; AVX1-NEXT: ## %bb.39: ## %cond.load55 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $3, 19(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX1-NEXT: jne LBB24_39 ; AVX1-NEXT: LBB24_40: ## %else56 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_42 -; AVX1-NEXT: ## %bb.41: ## %cond.load58 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $4, 20(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX1-NEXT: jne LBB24_41 ; AVX1-NEXT: LBB24_42: ## %else59 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_44 -; AVX1-NEXT: ## %bb.43: ## %cond.load61 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $5, 21(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX1-NEXT: jne LBB24_43 ; AVX1-NEXT: LBB24_44: ## %else62 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_46 -; AVX1-NEXT: ## %bb.45: ## %cond.load64 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $6, 22(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX1-NEXT: jne LBB24_45 ; AVX1-NEXT: LBB24_46: ## %else65 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_48 -; AVX1-NEXT: ## %bb.47: ## %cond.load67 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $7, 23(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX1-NEXT: jne LBB24_47 ; AVX1-NEXT: LBB24_48: ## %else68 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_50 -; AVX1-NEXT: ## %bb.49: ## %cond.load70 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $8, 24(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX1-NEXT: jne LBB24_49 ; AVX1-NEXT: LBB24_50: ## %else71 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_52 -; AVX1-NEXT: ## %bb.51: ## %cond.load73 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $9, 25(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX1-NEXT: jne LBB24_51 ; AVX1-NEXT: LBB24_52: ## %else74 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_54 -; AVX1-NEXT: ## %bb.53: ## %cond.load76 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $10, 26(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX1-NEXT: jne LBB24_53 ; AVX1-NEXT: LBB24_54: ## %else77 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_56 -; AVX1-NEXT: ## %bb.55: ## %cond.load79 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $11, 27(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX1-NEXT: jne LBB24_55 ; AVX1-NEXT: LBB24_56: ## %else80 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_58 -; AVX1-NEXT: ## %bb.57: ## %cond.load82 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpinsrb $12, 28(%rdi), %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm1, %ymm1 +; AVX1-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX1-NEXT: jne LBB24_57 ; AVX1-NEXT: LBB24_58: ## %else83 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_60 -; AVX1-NEXT: ## %bb.59: ## %cond.load85 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $13, 29(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX1-NEXT: jne LBB24_59 ; AVX1-NEXT: LBB24_60: ## %else86 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX1-NEXT: vpcmpgtb %xmm0, %xmm2, %xmm0 -; AVX1-NEXT: vpextrb $14, %xmm0, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB24_62 -; AVX1-NEXT: ## %bb.61: ## %cond.load88 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpinsrb $14, 30(%rdi), %xmm2, %xmm2 -; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm1, %ymm1 +; AVX1-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX1-NEXT: jne LBB24_61 ; AVX1-NEXT: LBB24_62: ## %else89 -; AVX1-NEXT: vpextrb $15, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX1-NEXT: jne LBB24_63 +; AVX1-NEXT: LBB24_64: ## %else92 +; AVX1-NEXT: vmovaps %ymm1, %ymm0 +; AVX1-NEXT: retq +; AVX1-NEXT: LBB24_33: ## %cond.load46 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $0, 16(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX1-NEXT: je LBB24_36 +; AVX1-NEXT: LBB24_35: ## %cond.load49 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $1, 17(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX1-NEXT: je LBB24_38 +; AVX1-NEXT: LBB24_37: ## %cond.load52 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $2, 18(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX1-NEXT: je LBB24_40 +; AVX1-NEXT: LBB24_39: ## %cond.load55 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $3, 19(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX1-NEXT: je LBB24_42 +; AVX1-NEXT: LBB24_41: ## %cond.load58 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $4, 20(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX1-NEXT: je LBB24_44 +; AVX1-NEXT: LBB24_43: ## %cond.load61 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $5, 21(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX1-NEXT: je LBB24_46 +; AVX1-NEXT: LBB24_45: ## %cond.load64 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $6, 22(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX1-NEXT: je LBB24_48 +; AVX1-NEXT: LBB24_47: ## %cond.load67 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $7, 23(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX1-NEXT: je LBB24_50 +; AVX1-NEXT: LBB24_49: ## %cond.load70 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $8, 24(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX1-NEXT: je LBB24_52 +; AVX1-NEXT: LBB24_51: ## %cond.load73 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $9, 25(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX1-NEXT: je LBB24_54 +; AVX1-NEXT: LBB24_53: ## %cond.load76 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $10, 26(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX1-NEXT: je LBB24_56 +; AVX1-NEXT: LBB24_55: ## %cond.load79 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $11, 27(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX1-NEXT: je LBB24_58 +; AVX1-NEXT: LBB24_57: ## %cond.load82 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $12, 28(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX1-NEXT: je LBB24_60 +; AVX1-NEXT: LBB24_59: ## %cond.load85 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $13, 29(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX1-NEXT: je LBB24_62 +; AVX1-NEXT: LBB24_61: ## %cond.load88 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpinsrb $14, 30(%rdi), %xmm0, %xmm0 +; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 +; AVX1-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX1-NEXT: je LBB24_64 -; AVX1-NEXT: ## %bb.63: ## %cond.load91 +; AVX1-NEXT: LBB24_63: ## %cond.load91 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 ; AVX1-NEXT: vpinsrb $15, 31(%rdi), %xmm0, %xmm0 ; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm1 -; AVX1-NEXT: LBB24_64: ## %else92 ; AVX1-NEXT: vmovaps %ymm1, %ymm0 ; AVX1-NEXT: retq ; ; AVX2-LABEL: load_v32i8_v32i8: ; AVX2: ## %bb.0: -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_2 -; AVX2-NEXT: ## %bb.1: ## %cond.load -; AVX2-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] -; AVX2-NEXT: LBB24_2: ## %else -; AVX2-NEXT: vpextrb $1, %xmm2, %eax +; AVX2-NEXT: vpmovmskb %ymm0, %eax ; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_4 -; AVX2-NEXT: ## %bb.3: ## %cond.load1 -; AVX2-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: jne LBB24_1 +; AVX2-NEXT: ## %bb.2: ## %else +; AVX2-NEXT: testb $2, %al +; AVX2-NEXT: jne LBB24_3 ; AVX2-NEXT: LBB24_4: ## %else2 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_6 -; AVX2-NEXT: ## %bb.5: ## %cond.load4 -; AVX2-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne LBB24_5 ; AVX2-NEXT: LBB24_6: ## %else5 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_8 -; AVX2-NEXT: ## %bb.7: ## %cond.load7 -; AVX2-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne LBB24_7 ; AVX2-NEXT: LBB24_8: ## %else8 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_10 -; AVX2-NEXT: ## %bb.9: ## %cond.load10 -; AVX2-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $16, %al +; AVX2-NEXT: jne LBB24_9 ; AVX2-NEXT: LBB24_10: ## %else11 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_12 -; AVX2-NEXT: ## %bb.11: ## %cond.load13 -; AVX2-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $32, %al +; AVX2-NEXT: jne LBB24_11 ; AVX2-NEXT: LBB24_12: ## %else14 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_14 -; AVX2-NEXT: ## %bb.13: ## %cond.load16 -; AVX2-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne LBB24_13 ; AVX2-NEXT: LBB24_14: ## %else17 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_16 -; AVX2-NEXT: ## %bb.15: ## %cond.load19 -; AVX2-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne LBB24_15 ; AVX2-NEXT: LBB24_16: ## %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_18 -; AVX2-NEXT: ## %bb.17: ## %cond.load22 -; AVX2-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $256, %eax ## imm = 0x100 +; AVX2-NEXT: jne LBB24_17 ; AVX2-NEXT: LBB24_18: ## %else23 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_20 -; AVX2-NEXT: ## %bb.19: ## %cond.load25 -; AVX2-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $512, %eax ## imm = 0x200 +; AVX2-NEXT: jne LBB24_19 ; AVX2-NEXT: LBB24_20: ## %else26 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_22 -; AVX2-NEXT: ## %bb.21: ## %cond.load28 -; AVX2-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX2-NEXT: jne LBB24_21 ; AVX2-NEXT: LBB24_22: ## %else29 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_24 -; AVX2-NEXT: ## %bb.23: ## %cond.load31 -; AVX2-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX2-NEXT: jne LBB24_23 ; AVX2-NEXT: LBB24_24: ## %else32 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_26 -; AVX2-NEXT: ## %bb.25: ## %cond.load34 -; AVX2-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX2-NEXT: jne LBB24_25 ; AVX2-NEXT: LBB24_26: ## %else35 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_28 -; AVX2-NEXT: ## %bb.27: ## %cond.load37 -; AVX2-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX2-NEXT: jne LBB24_27 ; AVX2-NEXT: LBB24_28: ## %else38 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_30 -; AVX2-NEXT: ## %bb.29: ## %cond.load40 -; AVX2-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm3 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX2-NEXT: jne LBB24_29 ; AVX2-NEXT: LBB24_30: ## %else41 -; AVX2-NEXT: vpextrb $15, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_32 -; AVX2-NEXT: ## %bb.31: ## %cond.load43 -; AVX2-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm2 -; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX2-NEXT: jne LBB24_31 ; AVX2-NEXT: LBB24_32: ## %else44 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_34 -; AVX2-NEXT: ## %bb.33: ## %cond.load46 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $0, 16(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $65536, %eax ## imm = 0x10000 +; AVX2-NEXT: jne LBB24_33 ; AVX2-NEXT: LBB24_34: ## %else47 -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_36 -; AVX2-NEXT: ## %bb.35: ## %cond.load49 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $1, 17(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX2-NEXT: jne LBB24_35 ; AVX2-NEXT: LBB24_36: ## %else50 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_38 -; AVX2-NEXT: ## %bb.37: ## %cond.load52 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $2, 18(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX2-NEXT: jne LBB24_37 ; AVX2-NEXT: LBB24_38: ## %else53 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_40 -; AVX2-NEXT: ## %bb.39: ## %cond.load55 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $3, 19(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX2-NEXT: jne LBB24_39 ; AVX2-NEXT: LBB24_40: ## %else56 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_42 -; AVX2-NEXT: ## %bb.41: ## %cond.load58 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $4, 20(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX2-NEXT: jne LBB24_41 ; AVX2-NEXT: LBB24_42: ## %else59 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_44 -; AVX2-NEXT: ## %bb.43: ## %cond.load61 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $5, 21(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX2-NEXT: jne LBB24_43 ; AVX2-NEXT: LBB24_44: ## %else62 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_46 -; AVX2-NEXT: ## %bb.45: ## %cond.load64 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $6, 22(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX2-NEXT: jne LBB24_45 ; AVX2-NEXT: LBB24_46: ## %else65 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_48 -; AVX2-NEXT: ## %bb.47: ## %cond.load67 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $7, 23(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX2-NEXT: jne LBB24_47 ; AVX2-NEXT: LBB24_48: ## %else68 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_50 -; AVX2-NEXT: ## %bb.49: ## %cond.load70 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $8, 24(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX2-NEXT: jne LBB24_49 ; AVX2-NEXT: LBB24_50: ## %else71 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_52 -; AVX2-NEXT: ## %bb.51: ## %cond.load73 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $9, 25(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX2-NEXT: jne LBB24_51 ; AVX2-NEXT: LBB24_52: ## %else74 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_54 -; AVX2-NEXT: ## %bb.53: ## %cond.load76 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $10, 26(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX2-NEXT: jne LBB24_53 ; AVX2-NEXT: LBB24_54: ## %else77 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_56 -; AVX2-NEXT: ## %bb.55: ## %cond.load79 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $11, 27(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX2-NEXT: jne LBB24_55 ; AVX2-NEXT: LBB24_56: ## %else80 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_58 -; AVX2-NEXT: ## %bb.57: ## %cond.load82 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpinsrb $12, 28(%rdi), %xmm3, %xmm3 -; AVX2-NEXT: vinserti128 $1, %xmm3, %ymm1, %ymm1 +; AVX2-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX2-NEXT: jne LBB24_57 ; AVX2-NEXT: LBB24_58: ## %else83 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_60 -; AVX2-NEXT: ## %bb.59: ## %cond.load85 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $13, 29(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX2-NEXT: jne LBB24_59 ; AVX2-NEXT: LBB24_60: ## %else86 -; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX2-NEXT: vpextrb $14, %xmm0, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB24_62 -; AVX2-NEXT: ## %bb.61: ## %cond.load88 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpinsrb $14, 30(%rdi), %xmm2, %xmm2 -; AVX2-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX2-NEXT: jne LBB24_61 ; AVX2-NEXT: LBB24_62: ## %else89 -; AVX2-NEXT: vpextrb $15, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX2-NEXT: jne LBB24_63 +; AVX2-NEXT: LBB24_64: ## %else92 +; AVX2-NEXT: vmovdqa %ymm1, %ymm0 +; AVX2-NEXT: retq +; AVX2-NEXT: LBB24_1: ## %cond.load +; AVX2-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $2, %al +; AVX2-NEXT: je LBB24_4 +; AVX2-NEXT: LBB24_3: ## %cond.load1 +; AVX2-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: je LBB24_6 +; AVX2-NEXT: LBB24_5: ## %cond.load4 +; AVX2-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: je LBB24_8 +; AVX2-NEXT: LBB24_7: ## %cond.load7 +; AVX2-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $16, %al +; AVX2-NEXT: je LBB24_10 +; AVX2-NEXT: LBB24_9: ## %cond.load10 +; AVX2-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $32, %al +; AVX2-NEXT: je LBB24_12 +; AVX2-NEXT: LBB24_11: ## %cond.load13 +; AVX2-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: je LBB24_14 +; AVX2-NEXT: LBB24_13: ## %cond.load16 +; AVX2-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: je LBB24_16 +; AVX2-NEXT: LBB24_15: ## %cond.load19 +; AVX2-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $256, %eax ## imm = 0x100 +; AVX2-NEXT: je LBB24_18 +; AVX2-NEXT: LBB24_17: ## %cond.load22 +; AVX2-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $512, %eax ## imm = 0x200 +; AVX2-NEXT: je LBB24_20 +; AVX2-NEXT: LBB24_19: ## %cond.load25 +; AVX2-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX2-NEXT: je LBB24_22 +; AVX2-NEXT: LBB24_21: ## %cond.load28 +; AVX2-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX2-NEXT: je LBB24_24 +; AVX2-NEXT: LBB24_23: ## %cond.load31 +; AVX2-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX2-NEXT: je LBB24_26 +; AVX2-NEXT: LBB24_25: ## %cond.load34 +; AVX2-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX2-NEXT: je LBB24_28 +; AVX2-NEXT: LBB24_27: ## %cond.load37 +; AVX2-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX2-NEXT: je LBB24_30 +; AVX2-NEXT: LBB24_29: ## %cond.load40 +; AVX2-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX2-NEXT: je LBB24_32 +; AVX2-NEXT: LBB24_31: ## %cond.load43 +; AVX2-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm0 +; AVX2-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX2-NEXT: testl $65536, %eax ## imm = 0x10000 +; AVX2-NEXT: je LBB24_34 +; AVX2-NEXT: LBB24_33: ## %cond.load46 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $0, 16(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX2-NEXT: je LBB24_36 +; AVX2-NEXT: LBB24_35: ## %cond.load49 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $1, 17(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX2-NEXT: je LBB24_38 +; AVX2-NEXT: LBB24_37: ## %cond.load52 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $2, 18(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX2-NEXT: je LBB24_40 +; AVX2-NEXT: LBB24_39: ## %cond.load55 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $3, 19(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX2-NEXT: je LBB24_42 +; AVX2-NEXT: LBB24_41: ## %cond.load58 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $4, 20(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX2-NEXT: je LBB24_44 +; AVX2-NEXT: LBB24_43: ## %cond.load61 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $5, 21(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX2-NEXT: je LBB24_46 +; AVX2-NEXT: LBB24_45: ## %cond.load64 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $6, 22(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX2-NEXT: je LBB24_48 +; AVX2-NEXT: LBB24_47: ## %cond.load67 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $7, 23(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX2-NEXT: je LBB24_50 +; AVX2-NEXT: LBB24_49: ## %cond.load70 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $8, 24(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX2-NEXT: je LBB24_52 +; AVX2-NEXT: LBB24_51: ## %cond.load73 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $9, 25(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX2-NEXT: je LBB24_54 +; AVX2-NEXT: LBB24_53: ## %cond.load76 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $10, 26(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX2-NEXT: je LBB24_56 +; AVX2-NEXT: LBB24_55: ## %cond.load79 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $11, 27(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX2-NEXT: je LBB24_58 +; AVX2-NEXT: LBB24_57: ## %cond.load82 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $12, 28(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX2-NEXT: je LBB24_60 +; AVX2-NEXT: LBB24_59: ## %cond.load85 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $13, 29(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX2-NEXT: je LBB24_62 +; AVX2-NEXT: LBB24_61: ## %cond.load88 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpinsrb $14, 30(%rdi), %xmm0, %xmm0 +; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX2-NEXT: je LBB24_64 -; AVX2-NEXT: ## %bb.63: ## %cond.load91 +; AVX2-NEXT: LBB24_63: ## %cond.load91 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX2-NEXT: vpinsrb $15, 31(%rdi), %xmm0, %xmm0 ; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 -; AVX2-NEXT: LBB24_64: ## %else92 ; AVX2-NEXT: vmovdqa %ymm1, %ymm0 ; AVX2-NEXT: retq ; ; AVX512F-LABEL: load_v32i8_v32i8: ; AVX512F: ## %bb.0: -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kmovw %k0, %eax +; AVX512F-NEXT: vpmovmskb %ymm0, %eax ; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_2 -; AVX512F-NEXT: ## %bb.1: ## %cond.load -; AVX512F-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] -; AVX512F-NEXT: LBB24_2: ## %else -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_4 -; AVX512F-NEXT: ## %bb.3: ## %cond.load1 -; AVX512F-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: jne LBB24_1 +; AVX512F-NEXT: ## %bb.2: ## %else +; AVX512F-NEXT: testb $2, %al +; AVX512F-NEXT: jne LBB24_3 ; AVX512F-NEXT: LBB24_4: ## %else2 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_6 -; AVX512F-NEXT: ## %bb.5: ## %cond.load4 -; AVX512F-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $4, %al +; AVX512F-NEXT: jne LBB24_5 ; AVX512F-NEXT: LBB24_6: ## %else5 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_8 -; AVX512F-NEXT: ## %bb.7: ## %cond.load7 -; AVX512F-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $8, %al +; AVX512F-NEXT: jne LBB24_7 ; AVX512F-NEXT: LBB24_8: ## %else8 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_10 -; AVX512F-NEXT: ## %bb.9: ## %cond.load10 -; AVX512F-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $16, %al +; AVX512F-NEXT: jne LBB24_9 ; AVX512F-NEXT: LBB24_10: ## %else11 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_12 -; AVX512F-NEXT: ## %bb.11: ## %cond.load13 -; AVX512F-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $32, %al +; AVX512F-NEXT: jne LBB24_11 ; AVX512F-NEXT: LBB24_12: ## %else14 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_14 -; AVX512F-NEXT: ## %bb.13: ## %cond.load16 -; AVX512F-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $64, %al +; AVX512F-NEXT: jne LBB24_13 ; AVX512F-NEXT: LBB24_14: ## %else17 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_16 -; AVX512F-NEXT: ## %bb.15: ## %cond.load19 -; AVX512F-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $-128, %al +; AVX512F-NEXT: jne LBB24_15 ; AVX512F-NEXT: LBB24_16: ## %else20 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_18 -; AVX512F-NEXT: ## %bb.17: ## %cond.load22 -; AVX512F-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 +; AVX512F-NEXT: jne LBB24_17 ; AVX512F-NEXT: LBB24_18: ## %else23 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_20 -; AVX512F-NEXT: ## %bb.19: ## %cond.load25 -; AVX512F-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 +; AVX512F-NEXT: jne LBB24_19 ; AVX512F-NEXT: LBB24_20: ## %else26 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_22 -; AVX512F-NEXT: ## %bb.21: ## %cond.load28 -; AVX512F-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX512F-NEXT: jne LBB24_21 ; AVX512F-NEXT: LBB24_22: ## %else29 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_24 -; AVX512F-NEXT: ## %bb.23: ## %cond.load31 -; AVX512F-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX512F-NEXT: jne LBB24_23 ; AVX512F-NEXT: LBB24_24: ## %else32 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_26 -; AVX512F-NEXT: ## %bb.25: ## %cond.load34 -; AVX512F-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX512F-NEXT: jne LBB24_25 ; AVX512F-NEXT: LBB24_26: ## %else35 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_28 -; AVX512F-NEXT: ## %bb.27: ## %cond.load37 -; AVX512F-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX512F-NEXT: jne LBB24_27 ; AVX512F-NEXT: LBB24_28: ## %else38 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_30 -; AVX512F-NEXT: ## %bb.29: ## %cond.load40 -; AVX512F-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm3 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm3[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX512F-NEXT: jne LBB24_29 ; AVX512F-NEXT: LBB24_30: ## %else41 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_32 -; AVX512F-NEXT: ## %bb.31: ## %cond.load43 -; AVX512F-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm2 -; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm2[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX512F-NEXT: jne LBB24_31 ; AVX512F-NEXT: LBB24_32: ## %else44 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_34 -; AVX512F-NEXT: ## %bb.33: ## %cond.load46 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $0, 16(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $65536, %eax ## imm = 0x10000 +; AVX512F-NEXT: jne LBB24_33 ; AVX512F-NEXT: LBB24_34: ## %else47 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_36 -; AVX512F-NEXT: ## %bb.35: ## %cond.load49 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $1, 17(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX512F-NEXT: jne LBB24_35 ; AVX512F-NEXT: LBB24_36: ## %else50 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_38 -; AVX512F-NEXT: ## %bb.37: ## %cond.load52 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $2, 18(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX512F-NEXT: jne LBB24_37 ; AVX512F-NEXT: LBB24_38: ## %else53 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_40 -; AVX512F-NEXT: ## %bb.39: ## %cond.load55 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $3, 19(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX512F-NEXT: jne LBB24_39 ; AVX512F-NEXT: LBB24_40: ## %else56 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_42 -; AVX512F-NEXT: ## %bb.41: ## %cond.load58 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $4, 20(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX512F-NEXT: jne LBB24_41 ; AVX512F-NEXT: LBB24_42: ## %else59 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_44 -; AVX512F-NEXT: ## %bb.43: ## %cond.load61 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $5, 21(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX512F-NEXT: jne LBB24_43 ; AVX512F-NEXT: LBB24_44: ## %else62 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_46 -; AVX512F-NEXT: ## %bb.45: ## %cond.load64 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $6, 22(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX512F-NEXT: jne LBB24_45 ; AVX512F-NEXT: LBB24_46: ## %else65 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_48 -; AVX512F-NEXT: ## %bb.47: ## %cond.load67 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $7, 23(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX512F-NEXT: jne LBB24_47 ; AVX512F-NEXT: LBB24_48: ## %else68 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_50 -; AVX512F-NEXT: ## %bb.49: ## %cond.load70 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $8, 24(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX512F-NEXT: jne LBB24_49 ; AVX512F-NEXT: LBB24_50: ## %else71 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_52 -; AVX512F-NEXT: ## %bb.51: ## %cond.load73 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $9, 25(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX512F-NEXT: jne LBB24_51 ; AVX512F-NEXT: LBB24_52: ## %else74 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_54 -; AVX512F-NEXT: ## %bb.53: ## %cond.load76 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $10, 26(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX512F-NEXT: jne LBB24_53 ; AVX512F-NEXT: LBB24_54: ## %else77 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_56 -; AVX512F-NEXT: ## %bb.55: ## %cond.load79 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $11, 27(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX512F-NEXT: jne LBB24_55 ; AVX512F-NEXT: LBB24_56: ## %else80 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_58 -; AVX512F-NEXT: ## %bb.57: ## %cond.load82 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $12, 28(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX512F-NEXT: jne LBB24_57 ; AVX512F-NEXT: LBB24_58: ## %else83 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB24_60 -; AVX512F-NEXT: ## %bb.59: ## %cond.load85 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX512F-NEXT: vpinsrb $13, 29(%rdi), %xmm2, %xmm2 -; AVX512F-NEXT: vinserti128 $1, %xmm2, %ymm1, %ymm1 +; AVX512F-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX512F-NEXT: jne LBB24_59 ; AVX512F-NEXT: LBB24_60: ## %else86 -; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 -; AVX512F-NEXT: vpcmpgtb %ymm0, %ymm2, %ymm0 -; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 -; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX512F-NEXT: jne LBB24_61 +; AVX512F-NEXT: LBB24_62: ## %else89 +; AVX512F-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX512F-NEXT: jne LBB24_63 +; AVX512F-NEXT: LBB24_64: ## %else92 +; AVX512F-NEXT: vmovdqa %ymm1, %ymm0 +; AVX512F-NEXT: retq +; AVX512F-NEXT: LBB24_1: ## %cond.load +; AVX512F-NEXT: vpinsrb $0, (%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $2, %al +; AVX512F-NEXT: je LBB24_4 +; AVX512F-NEXT: LBB24_3: ## %cond.load1 +; AVX512F-NEXT: vpinsrb $1, 1(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $4, %al +; AVX512F-NEXT: je LBB24_6 +; AVX512F-NEXT: LBB24_5: ## %cond.load4 +; AVX512F-NEXT: vpinsrb $2, 2(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $8, %al +; AVX512F-NEXT: je LBB24_8 +; AVX512F-NEXT: LBB24_7: ## %cond.load7 +; AVX512F-NEXT: vpinsrb $3, 3(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $16, %al +; AVX512F-NEXT: je LBB24_10 +; AVX512F-NEXT: LBB24_9: ## %cond.load10 +; AVX512F-NEXT: vpinsrb $4, 4(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $32, %al +; AVX512F-NEXT: je LBB24_12 +; AVX512F-NEXT: LBB24_11: ## %cond.load13 +; AVX512F-NEXT: vpinsrb $5, 5(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $64, %al +; AVX512F-NEXT: je LBB24_14 +; AVX512F-NEXT: LBB24_13: ## %cond.load16 +; AVX512F-NEXT: vpinsrb $6, 6(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testb $-128, %al +; AVX512F-NEXT: je LBB24_16 +; AVX512F-NEXT: LBB24_15: ## %cond.load19 +; AVX512F-NEXT: vpinsrb $7, 7(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 +; AVX512F-NEXT: je LBB24_18 +; AVX512F-NEXT: LBB24_17: ## %cond.load22 +; AVX512F-NEXT: vpinsrb $8, 8(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 +; AVX512F-NEXT: je LBB24_20 +; AVX512F-NEXT: LBB24_19: ## %cond.load25 +; AVX512F-NEXT: vpinsrb $9, 9(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 +; AVX512F-NEXT: je LBB24_22 +; AVX512F-NEXT: LBB24_21: ## %cond.load28 +; AVX512F-NEXT: vpinsrb $10, 10(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 +; AVX512F-NEXT: je LBB24_24 +; AVX512F-NEXT: LBB24_23: ## %cond.load31 +; AVX512F-NEXT: vpinsrb $11, 11(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 +; AVX512F-NEXT: je LBB24_26 +; AVX512F-NEXT: LBB24_25: ## %cond.load34 +; AVX512F-NEXT: vpinsrb $12, 12(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 +; AVX512F-NEXT: je LBB24_28 +; AVX512F-NEXT: LBB24_27: ## %cond.load37 +; AVX512F-NEXT: vpinsrb $13, 13(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX512F-NEXT: je LBB24_30 +; AVX512F-NEXT: LBB24_29: ## %cond.load40 +; AVX512F-NEXT: vpinsrb $14, 14(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX512F-NEXT: je LBB24_32 +; AVX512F-NEXT: LBB24_31: ## %cond.load43 +; AVX512F-NEXT: vpinsrb $15, 15(%rdi), %xmm1, %xmm0 +; AVX512F-NEXT: vpblendd {{.*#+}} ymm1 = ymm0[0,1,2,3],ymm1[4,5,6,7] +; AVX512F-NEXT: testl $65536, %eax ## imm = 0x10000 +; AVX512F-NEXT: je LBB24_34 +; AVX512F-NEXT: LBB24_33: ## %cond.load46 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $0, 16(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $131072, %eax ## imm = 0x20000 +; AVX512F-NEXT: je LBB24_36 +; AVX512F-NEXT: LBB24_35: ## %cond.load49 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $1, 17(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $262144, %eax ## imm = 0x40000 +; AVX512F-NEXT: je LBB24_38 +; AVX512F-NEXT: LBB24_37: ## %cond.load52 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $2, 18(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $524288, %eax ## imm = 0x80000 +; AVX512F-NEXT: je LBB24_40 +; AVX512F-NEXT: LBB24_39: ## %cond.load55 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $3, 19(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $1048576, %eax ## imm = 0x100000 +; AVX512F-NEXT: je LBB24_42 +; AVX512F-NEXT: LBB24_41: ## %cond.load58 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $4, 20(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $2097152, %eax ## imm = 0x200000 +; AVX512F-NEXT: je LBB24_44 +; AVX512F-NEXT: LBB24_43: ## %cond.load61 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $5, 21(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $4194304, %eax ## imm = 0x400000 +; AVX512F-NEXT: je LBB24_46 +; AVX512F-NEXT: LBB24_45: ## %cond.load64 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $6, 22(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $8388608, %eax ## imm = 0x800000 +; AVX512F-NEXT: je LBB24_48 +; AVX512F-NEXT: LBB24_47: ## %cond.load67 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $7, 23(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $16777216, %eax ## imm = 0x1000000 +; AVX512F-NEXT: je LBB24_50 +; AVX512F-NEXT: LBB24_49: ## %cond.load70 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $8, 24(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $33554432, %eax ## imm = 0x2000000 +; AVX512F-NEXT: je LBB24_52 +; AVX512F-NEXT: LBB24_51: ## %cond.load73 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $9, 25(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $67108864, %eax ## imm = 0x4000000 +; AVX512F-NEXT: je LBB24_54 +; AVX512F-NEXT: LBB24_53: ## %cond.load76 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $10, 26(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $134217728, %eax ## imm = 0x8000000 +; AVX512F-NEXT: je LBB24_56 +; AVX512F-NEXT: LBB24_55: ## %cond.load79 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $11, 27(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $268435456, %eax ## imm = 0x10000000 +; AVX512F-NEXT: je LBB24_58 +; AVX512F-NEXT: LBB24_57: ## %cond.load82 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $12, 28(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $536870912, %eax ## imm = 0x20000000 +; AVX512F-NEXT: je LBB24_60 +; AVX512F-NEXT: LBB24_59: ## %cond.load85 +; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX512F-NEXT: vpinsrb $13, 29(%rdi), %xmm0, %xmm0 +; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 +; AVX512F-NEXT: testl $1073741824, %eax ## imm = 0x40000000 ; AVX512F-NEXT: je LBB24_62 -; AVX512F-NEXT: ## %bb.61: ## %cond.load88 +; AVX512F-NEXT: LBB24_61: ## %cond.load88 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX512F-NEXT: vpinsrb $14, 30(%rdi), %xmm0, %xmm0 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 -; AVX512F-NEXT: LBB24_62: ## %else89 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX512F-NEXT: je LBB24_64 -; AVX512F-NEXT: ## %bb.63: ## %cond.load91 +; AVX512F-NEXT: LBB24_63: ## %cond.load91 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX512F-NEXT: vpinsrb $15, 31(%rdi), %xmm0, %xmm0 ; AVX512F-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm1 -; AVX512F-NEXT: LBB24_64: ## %else92 ; AVX512F-NEXT: vmovdqa %ymm1, %ymm0 ; AVX512F-NEXT: retq ; Index: test/CodeGen/X86/masked_store.ll =================================================================== --- test/CodeGen/X86/masked_store.ll +++ test/CodeGen/X86/masked_store.ll @@ -34,48 +34,23 @@ } define void @store_v2f64_v2i64(<2 x i64> %trigger, <2 x double>* %addr, <2 x double> %val) { -; SSE2-LABEL: store_v2f64_v2i64: -; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm3, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB1_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movlpd %xmm1, (%rdi) -; SSE2-NEXT: LBB1_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB1_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 -; SSE2-NEXT: movhpd %xmm1, 8(%rdi) -; SSE2-NEXT: LBB1_4: ## %else2 -; SSE2-NEXT: retq -; -; SSE4-LABEL: store_v2f64_v2i64: -; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm2, %xmm2 -; SSE4-NEXT: pcmpgtq %xmm0, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB1_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store -; SSE4-NEXT: movlpd %xmm1, (%rdi) -; SSE4-NEXT: LBB1_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB1_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 -; SSE4-NEXT: movhpd %xmm1, 8(%rdi) -; SSE4-NEXT: LBB1_4: ## %else2 -; SSE4-NEXT: retq +; SSE-LABEL: store_v2f64_v2i64: +; SSE: ## %bb.0: +; SSE-NEXT: movmskpd %xmm0, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: jne LBB1_1 +; SSE-NEXT: ## %bb.2: ## %else +; SSE-NEXT: testb $2, %al +; SSE-NEXT: jne LBB1_3 +; SSE-NEXT: LBB1_4: ## %else2 +; SSE-NEXT: retq +; SSE-NEXT: LBB1_1: ## %cond.store +; SSE-NEXT: movlpd %xmm1, (%rdi) +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB1_4 +; SSE-NEXT: LBB1_3: ## %cond.store1 +; SSE-NEXT: movhpd %xmm1, 8(%rdi) +; SSE-NEXT: retq ; ; AVX1OR2-LABEL: store_v2f64_v2i64: ; AVX1OR2: ## %bb.0: @@ -106,82 +81,38 @@ } define void @store_v4f64_v4i64(<4 x i64> %trigger, <4 x double>* %addr, <4 x double> %val) { -; SSE2-LABEL: store_v4f64_v4i64: -; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm5, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movlpd %xmm2, (%rdi) -; SSE2-NEXT: LBB2_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 -; SSE2-NEXT: movhpd %xmm2, 8(%rdi) -; SSE2-NEXT: LBB2_4: ## %else2 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: movdqa %xmm4, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-NEXT: por %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_6 -; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: movlpd %xmm3, 16(%rdi) -; SSE2-NEXT: LBB2_6: ## %else4 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB2_8 -; SSE2-NEXT: ## %bb.7: ## %cond.store5 -; SSE2-NEXT: movhpd %xmm3, 24(%rdi) -; SSE2-NEXT: LBB2_8: ## %else6 -; SSE2-NEXT: retq -; -; SSE4-LABEL: store_v4f64_v4i64: -; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm4, %xmm4 -; SSE4-NEXT: pcmpgtq %xmm0, %xmm4 -; SSE4-NEXT: pextrb $0, %xmm4, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB2_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store -; SSE4-NEXT: movlpd %xmm2, (%rdi) -; SSE4-NEXT: LBB2_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm4, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB2_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 -; SSE4-NEXT: movhpd %xmm2, 8(%rdi) -; SSE4-NEXT: LBB2_4: ## %else2 -; SSE4-NEXT: pxor %xmm0, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB2_6 -; SSE4-NEXT: ## %bb.5: ## %cond.store3 -; SSE4-NEXT: movlpd %xmm3, 16(%rdi) -; SSE4-NEXT: LBB2_6: ## %else4 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB2_8 -; SSE4-NEXT: ## %bb.7: ## %cond.store5 -; SSE4-NEXT: movhpd %xmm3, 24(%rdi) -; SSE4-NEXT: LBB2_8: ## %else6 -; SSE4-NEXT: retq +; SSE-LABEL: store_v4f64_v4i64: +; SSE: ## %bb.0: +; SSE-NEXT: movdqa %xmm0, %xmm4 +; SSE-NEXT: packssdw %xmm0, %xmm4 +; SSE-NEXT: movmskps %xmm4, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: je LBB2_2 +; SSE-NEXT: ## %bb.1: ## %cond.store +; SSE-NEXT: movlpd %xmm2, (%rdi) +; SSE-NEXT: LBB2_2: ## %else +; SSE-NEXT: packssdw %xmm0, %xmm0 +; SSE-NEXT: movmskps %xmm0, %eax +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB2_4 +; SSE-NEXT: ## %bb.3: ## %cond.store1 +; SSE-NEXT: movhpd %xmm2, 8(%rdi) +; SSE-NEXT: LBB2_4: ## %else2 +; SSE-NEXT: packssdw %xmm1, %xmm0 +; SSE-NEXT: movmskps %xmm0, %eax +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB2_6 +; SSE-NEXT: ## %bb.5: ## %cond.store3 +; SSE-NEXT: movlpd %xmm3, 16(%rdi) +; SSE-NEXT: LBB2_6: ## %else4 +; SSE-NEXT: packssdw %xmm1, %xmm0 +; SSE-NEXT: movmskps %xmm0, %eax +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB2_8 +; SSE-NEXT: ## %bb.7: ## %cond.store5 +; SSE-NEXT: movhpd %xmm3, 24(%rdi) +; SSE-NEXT: LBB2_8: ## %else6 +; SSE-NEXT: retq ; ; AVX1OR2-LABEL: store_v4f64_v4i64: ; AVX1OR2: ## %bb.0: @@ -225,19 +156,21 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB3_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store +; SSE2-NEXT: jne LBB3_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB3_3 +; SSE2-NEXT: LBB3_4: ## %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB3_1: ## %cond.store ; SSE2-NEXT: movss %xmm1, (%rdi) -; SSE2-NEXT: LBB3_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB3_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 +; SSE2-NEXT: LBB3_3: ## %cond.store1 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1,2,3] ; SSE2-NEXT: movss %xmm1, 4(%rdi) -; SSE2-NEXT: LBB3_4: ## %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v2f32_v2i32: @@ -245,18 +178,20 @@ ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] ; SSE4-NEXT: pcmpeqq %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax +; SSE4-NEXT: movmskpd %xmm0, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB3_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store +; SSE4-NEXT: jne LBB3_1 +; SSE4-NEXT: ## %bb.2: ## %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne LBB3_3 +; SSE4-NEXT: LBB3_4: ## %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB3_1: ## %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) -; SSE4-NEXT: LBB3_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB3_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 +; SSE4-NEXT: LBB3_3: ## %cond.store1 ; SSE4-NEXT: extractps $1, %xmm1, 4(%rdi) -; SSE4-NEXT: LBB3_4: ## %else2 ; SSE4-NEXT: retq ; ; AVX1-LABEL: store_v2f32_v2i32: @@ -307,71 +242,71 @@ define void @store_v4f32_v4i32(<4 x float> %x, <4 x float>* %ptr, <4 x float> %y, <4 x i32> %mask) { ; SSE2-LABEL: store_v4f32_v4i32: ; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax +; SSE2-NEXT: movmskps %xmm2, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB4_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store +; SSE2-NEXT: jne LBB4_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB4_3 +; SSE2-NEXT: LBB4_4: ## %else2 +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB4_5 +; SSE2-NEXT: LBB4_6: ## %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB4_7 +; SSE2-NEXT: LBB4_8: ## %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB4_1: ## %cond.store ; SSE2-NEXT: movss %xmm0, (%rdi) -; SSE2-NEXT: LBB4_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB4_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 +; SSE2-NEXT: LBB4_3: ## %cond.store1 ; SSE2-NEXT: movaps %xmm0, %xmm1 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm0[2,3] ; SSE2-NEXT: movss %xmm1, 4(%rdi) -; SSE2-NEXT: LBB4_4: ## %else2 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB4_6 -; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: movaps %xmm0, %xmm2 -; SSE2-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm0[1] -; SSE2-NEXT: movss %xmm2, 8(%rdi) -; SSE2-NEXT: LBB4_6: ## %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: LBB4_5: ## %cond.store3 +; SSE2-NEXT: movaps %xmm0, %xmm1 +; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm0[1] +; SSE2-NEXT: movss %xmm1, 8(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB4_8 -; SSE2-NEXT: ## %bb.7: ## %cond.store5 +; SSE2-NEXT: LBB4_7: ## %cond.store5 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movss %xmm0, 12(%rdi) -; SSE2-NEXT: LBB4_8: ## %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v4f32_v4i32: ; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax +; SSE4-NEXT: movmskps %xmm2, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB4_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store +; SSE4-NEXT: jne LBB4_1 +; SSE4-NEXT: ## %bb.2: ## %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne LBB4_3 +; SSE4-NEXT: LBB4_4: ## %else2 +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne LBB4_5 +; SSE4-NEXT: LBB4_6: ## %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne LBB4_7 +; SSE4-NEXT: LBB4_8: ## %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB4_1: ## %cond.store ; SSE4-NEXT: movss %xmm0, (%rdi) -; SSE4-NEXT: LBB4_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB4_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 +; SSE4-NEXT: LBB4_3: ## %cond.store1 ; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi) -; SSE4-NEXT: LBB4_4: ## %else2 -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB4_6 -; SSE4-NEXT: ## %bb.5: ## %cond.store3 +; SSE4-NEXT: LBB4_5: ## %cond.store3 ; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi) -; SSE4-NEXT: LBB4_6: ## %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB4_8 -; SSE4-NEXT: ## %bb.7: ## %cond.store5 +; SSE4-NEXT: LBB4_7: ## %cond.store5 ; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi) -; SSE4-NEXT: LBB4_8: ## %else6 ; SSE4-NEXT: retq ; ; AVX1OR2-LABEL: store_v4f32_v4i32: @@ -405,71 +340,78 @@ define void @store_v8f32_v8i32(<8 x float> %x, <8 x float>* %ptr, <8 x float> %y, <8 x i32> %mask) { ; SSE2-LABEL: store_v8f32_v8i32: ; SSE2: ## %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: packssdw %xmm0, %xmm3 -; SSE2-NEXT: movd %xmm3, %eax +; SSE2-NEXT: movdqa %xmm4, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB5_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movd %xmm0, (%rdi) ; SSE2-NEXT: LBB5_2: ## %else -; SSE2-NEXT: psrlq $16, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm4, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB5_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: movdqa %xmm0, %xmm2 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[2,3] ; SSE2-NEXT: movss %xmm2, 4(%rdi) ; SSE2-NEXT: LBB5_4: ## %else2 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm4, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB5_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: punpckhqdq {{.*#+}} xmm3 = xmm3[1],xmm0[1] -; SSE2-NEXT: movd %xmm3, 8(%rdi) +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm0[1] +; SSE2-NEXT: movd %xmm2, 8(%rdi) ; SSE2-NEXT: LBB5_6: ## %else4 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB5_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movss %xmm0, 12(%rdi) ; SSE2-NEXT: LBB5_8: ## %else6 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB5_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: movss %xmm1, 16(%rdi) ; SSE2-NEXT: LBB5_10: ## %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB5_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: movaps %xmm1, %xmm0 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[2,3] ; SSE2-NEXT: movss %xmm0, 20(%rdi) ; SSE2-NEXT: LBB5_12: ## %else10 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB5_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 -; SSE2-NEXT: movaps %xmm1, %xmm2 -; SSE2-NEXT: unpckhpd {{.*#+}} xmm2 = xmm2[1],xmm1[1] -; SSE2-NEXT: movss %xmm2, 24(%rdi) +; SSE2-NEXT: movaps %xmm1, %xmm0 +; SSE2-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1] +; SSE2-NEXT: movss %xmm0, 24(%rdi) ; SSE2-NEXT: LBB5_14: ## %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm5, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB5_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] @@ -479,58 +421,69 @@ ; ; SSE4-LABEL: store_v8f32_v8i32: ; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm2, %xmm2 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movdqa %xmm4, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB5_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: movd %xmm0, (%rdi) ; SSE4-NEXT: LBB5_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm4, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB5_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) ; SSE4-NEXT: LBB5_4: ## %else2 -; SSE4-NEXT: pxor %xmm2, %xmm2 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm4, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB5_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrd $2, %xmm0, 8(%rdi) ; SSE4-NEXT: LBB5_6: ## %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB5_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrd $3, %xmm0, 12(%rdi) ; SSE4-NEXT: LBB5_8: ## %else6 -; SSE4-NEXT: pxor %xmm0, %xmm0 -; SSE4-NEXT: pcmpgtd %xmm5, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm5, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB5_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: movss %xmm1, 16(%rdi) ; SSE4-NEXT: LBB5_10: ## %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm5, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB5_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: extractps $1, %xmm1, 20(%rdi) ; SSE4-NEXT: LBB5_12: ## %else10 -; SSE4-NEXT: pxor %xmm0, %xmm0 -; SSE4-NEXT: pcmpgtd %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm5, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB5_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: extractps $2, %xmm1, 24(%rdi) ; SSE4-NEXT: LBB5_14: ## %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm5, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB5_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: extractps $3, %xmm1, 28(%rdi) @@ -570,61 +523,70 @@ define void @store_v16f32_v16i32(<16 x float> %x, <16 x float>* %ptr, <16 x float> %y, <16 x i32> %mask) { ; SSE2-LABEL: store_v16f32_v16i32: ; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm4 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 +; SSE2-NEXT: movdqa %xmm5, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB6_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movss %xmm0, (%rdi) +; SSE2-NEXT: movd %xmm0, (%rdi) ; SSE2-NEXT: LBB6_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm5, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB6_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 -; SSE2-NEXT: movaps %xmm0, %xmm5 -; SSE2-NEXT: shufps {{.*#+}} xmm5 = xmm5[1,1],xmm0[2,3] -; SSE2-NEXT: movss %xmm5, 4(%rdi) +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: shufps {{.*#+}} xmm4 = xmm4[1,1],xmm0[2,3] +; SSE2-NEXT: movss %xmm4, 4(%rdi) ; SSE2-NEXT: LBB6_4: ## %else2 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE2-NEXT: pextrw $4, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm5, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB6_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: movaps %xmm0, %xmm4 -; SSE2-NEXT: unpckhpd {{.*#+}} xmm4 = xmm4[1],xmm0[1] -; SSE2-NEXT: movss %xmm4, 8(%rdi) +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: punpckhqdq {{.*#+}} xmm4 = xmm4[1],xmm0[1] +; SSE2-NEXT: movd %xmm4, 8(%rdi) ; SSE2-NEXT: LBB6_6: ## %else4 ; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm4 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB6_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movss %xmm0, 12(%rdi) ; SSE2-NEXT: LBB6_8: ## %else6 -; SSE2-NEXT: xorps %xmm0, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm4, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB6_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: movss %xmm1, 16(%rdi) ; SSE2-NEXT: LBB6_10: ## %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm4, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB6_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: movaps %xmm1, %xmm0 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1],xmm1[2,3] ; SSE2-NEXT: movss %xmm0, 20(%rdi) ; SSE2-NEXT: LBB6_12: ## %else10 -; SSE2-NEXT: pxor %xmm5, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE2-NEXT: pextrw $4, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm4, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB6_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: movaps %xmm1, %xmm0 @@ -632,75 +594,88 @@ ; SSE2-NEXT: movss %xmm0, 24(%rdi) ; SSE2-NEXT: LBB6_14: ## %else12 ; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm4, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB6_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[3,1,2,3] ; SSE2-NEXT: movss %xmm1, 28(%rdi) ; SSE2-NEXT: LBB6_16: ## %else14 -; SSE2-NEXT: xorps %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 ; SSE2-NEXT: je LBB6_18 ; SSE2-NEXT: ## %bb.17: ## %cond.store15 ; SSE2-NEXT: movss %xmm2, 32(%rdi) ; SSE2-NEXT: LBB6_18: ## %else16 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 ; SSE2-NEXT: je LBB6_20 ; SSE2-NEXT: ## %bb.19: ## %cond.store17 ; SSE2-NEXT: movaps %xmm2, %xmm1 ; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm2[2,3] ; SSE2-NEXT: movss %xmm1, 36(%rdi) ; SSE2-NEXT: LBB6_20: ## %else18 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE2-NEXT: je LBB6_22 ; SSE2-NEXT: ## %bb.21: ## %cond.store19 -; SSE2-NEXT: movaps %xmm2, %xmm0 -; SSE2-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm2[1] -; SSE2-NEXT: movss %xmm0, 40(%rdi) +; SSE2-NEXT: movaps %xmm2, %xmm1 +; SSE2-NEXT: unpckhpd {{.*#+}} xmm1 = xmm1[1],xmm2[1] +; SSE2-NEXT: movss %xmm1, 40(%rdi) ; SSE2-NEXT: LBB6_22: ## %else20 -; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE2-NEXT: je LBB6_24 ; SSE2-NEXT: ## %bb.23: ## %cond.store21 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,1,2,3] ; SSE2-NEXT: movss %xmm2, 44(%rdi) ; SSE2-NEXT: LBB6_24: ## %else22 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE2-NEXT: je LBB6_26 ; SSE2-NEXT: ## %bb.25: ## %cond.store23 ; SSE2-NEXT: movss %xmm3, 48(%rdi) ; SSE2-NEXT: LBB6_26: ## %else24 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE2-NEXT: je LBB6_28 ; SSE2-NEXT: ## %bb.27: ## %cond.store25 -; SSE2-NEXT: movaps %xmm3, %xmm1 -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[1,1],xmm3[2,3] -; SSE2-NEXT: movss %xmm1, 52(%rdi) +; SSE2-NEXT: movaps %xmm3, %xmm0 +; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1],xmm3[2,3] +; SSE2-NEXT: movss %xmm0, 52(%rdi) ; SSE2-NEXT: LBB6_28: ## %else26 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE2-NEXT: je LBB6_30 ; SSE2-NEXT: ## %bb.29: ## %cond.store27 ; SSE2-NEXT: movaps %xmm3, %xmm0 ; SSE2-NEXT: unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm3[1] ; SSE2-NEXT: movss %xmm0, 56(%rdi) ; SSE2-NEXT: LBB6_30: ## %else28 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE2-NEXT: je LBB6_32 ; SSE2-NEXT: ## %bb.31: ## %cond.store29 ; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[3,1,2,3] @@ -710,118 +685,140 @@ ; ; SSE4-LABEL: store_v16f32_v16i32: ; SSE4: ## %bb.0: -; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm4 -; SSE4-NEXT: pxor %xmm5, %xmm5 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE4-NEXT: pextrb $0, %xmm5, %eax +; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm5 +; SSE4-NEXT: movdqa %xmm5, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB6_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: movd %xmm0, (%rdi) ; SSE4-NEXT: LBB6_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm5, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm5, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB6_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) ; SSE4-NEXT: LBB6_4: ## %else2 -; SSE4-NEXT: pxor %xmm5, %xmm5 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE4-NEXT: pextrb $8, %xmm5, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm5, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB6_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrd $2, %xmm0, 8(%rdi) ; SSE4-NEXT: LBB6_6: ## %else4 ; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm4 -; SSE4-NEXT: pextrb $12, %xmm5, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB6_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrd $3, %xmm0, 12(%rdi) ; SSE4-NEXT: LBB6_8: ## %else6 -; SSE4-NEXT: pxor %xmm0, %xmm0 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm4, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB6_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 -; SSE4-NEXT: movd %xmm1, 16(%rdi) +; SSE4-NEXT: movss %xmm1, 16(%rdi) ; SSE4-NEXT: LBB6_10: ## %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm4, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB6_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 -; SSE4-NEXT: pextrd $1, %xmm1, 20(%rdi) +; SSE4-NEXT: extractps $1, %xmm1, 20(%rdi) ; SSE4-NEXT: LBB6_12: ## %else10 -; SSE4-NEXT: pxor %xmm5, %xmm5 -; SSE4-NEXT: pcmpgtd %xmm4, %xmm5 -; SSE4-NEXT: pextrb $8, %xmm5, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm4, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB6_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 -; SSE4-NEXT: pextrd $2, %xmm1, 24(%rdi) +; SSE4-NEXT: extractps $2, %xmm1, 24(%rdi) ; SSE4-NEXT: LBB6_14: ## %else12 ; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 -; SSE4-NEXT: pextrb $12, %xmm5, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm4, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB6_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 -; SSE4-NEXT: pextrd $3, %xmm1, 28(%rdi) +; SSE4-NEXT: extractps $3, %xmm1, 28(%rdi) ; SSE4-NEXT: LBB6_16: ## %else14 -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $256, %eax ## imm = 0x100 ; SSE4-NEXT: je LBB6_18 ; SSE4-NEXT: ## %bb.17: ## %cond.store15 ; SSE4-NEXT: movss %xmm2, 32(%rdi) ; SSE4-NEXT: LBB6_18: ## %else16 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $512, %eax ## imm = 0x200 ; SSE4-NEXT: je LBB6_20 ; SSE4-NEXT: ## %bb.19: ## %cond.store17 ; SSE4-NEXT: extractps $1, %xmm2, 36(%rdi) ; SSE4-NEXT: LBB6_20: ## %else18 -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE4-NEXT: je LBB6_22 ; SSE4-NEXT: ## %bb.21: ## %cond.store19 ; SSE4-NEXT: extractps $2, %xmm2, 40(%rdi) ; SSE4-NEXT: LBB6_22: ## %else20 -; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm0 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa {{[0-9]+}}(%rsp), %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE4-NEXT: je LBB6_24 ; SSE4-NEXT: ## %bb.23: ## %cond.store21 ; SSE4-NEXT: extractps $3, %xmm2, 44(%rdi) ; SSE4-NEXT: LBB6_24: ## %else22 -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE4-NEXT: je LBB6_26 ; SSE4-NEXT: ## %bb.25: ## %cond.store23 ; SSE4-NEXT: movss %xmm3, 48(%rdi) ; SSE4-NEXT: LBB6_26: ## %else24 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE4-NEXT: je LBB6_28 ; SSE4-NEXT: ## %bb.27: ## %cond.store25 ; SSE4-NEXT: extractps $1, %xmm3, 52(%rdi) ; SSE4-NEXT: LBB6_28: ## %else26 -; SSE4-NEXT: pxor %xmm1, %xmm1 -; SSE4-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE4-NEXT: je LBB6_30 ; SSE4-NEXT: ## %bb.29: ## %cond.store27 ; SSE4-NEXT: extractps $2, %xmm3, 56(%rdi) ; SSE4-NEXT: LBB6_30: ## %else28 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE4-NEXT: je LBB6_32 ; SSE4-NEXT: ## %bb.31: ## %cond.store29 ; SSE4-NEXT: extractps $3, %xmm3, 60(%rdi) @@ -854,46 +851,39 @@ define void @store_v2i64_v2i64(<2 x i64> %trigger, <2 x i64>* %addr, <2 x i64> %val) { ; SSE2-LABEL: store_v2i64_v2i64: ; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm3, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB7_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store +; SSE2-NEXT: jne LBB7_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB7_3 +; SSE2-NEXT: LBB7_4: ## %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB7_1: ## %cond.store ; SSE2-NEXT: movq %xmm1, (%rdi) -; SSE2-NEXT: LBB7_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB7_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 +; SSE2-NEXT: LBB7_3: ## %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] ; SSE2-NEXT: movq %xmm0, 8(%rdi) -; SSE2-NEXT: LBB7_4: ## %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v2i64_v2i64: ; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm2, %xmm2 -; SSE4-NEXT: pcmpgtq %xmm0, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movmskpd %xmm0, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB7_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store +; SSE4-NEXT: jne LBB7_1 +; SSE4-NEXT: ## %bb.2: ## %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne LBB7_3 +; SSE4-NEXT: LBB7_4: ## %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB7_1: ## %cond.store ; SSE4-NEXT: movq %xmm1, (%rdi) -; SSE4-NEXT: LBB7_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB7_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 +; SSE4-NEXT: LBB7_3: ## %cond.store1 ; SSE4-NEXT: pextrq $1, %xmm1, 8(%rdi) -; SSE4-NEXT: LBB7_4: ## %else2 ; SSE4-NEXT: retq ; ; AVX1-LABEL: store_v2i64_v2i64: @@ -932,44 +922,32 @@ define void @store_v4i64_v4i64(<4 x i64> %trigger, <4 x i64>* %addr, <4 x i64> %val) { ; SSE2-LABEL: store_v4i64_v4i64: ; SSE2: ## %bb.0: -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm5, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB8_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movq %xmm2, (%rdi) ; SSE2-NEXT: LBB8_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB8_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] ; SSE2-NEXT: movq %xmm0, 8(%rdi) ; SSE2-NEXT: LBB8_4: ## %else2 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: movdqa %xmm4, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-NEXT: por %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB8_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: movq %xmm3, 16(%rdi) ; SSE2-NEXT: LBB8_6: ## %else4 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB8_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1] @@ -979,30 +957,31 @@ ; ; SSE4-LABEL: store_v4i64_v4i64: ; SSE4: ## %bb.0: -; SSE4-NEXT: pxor %xmm4, %xmm4 -; SSE4-NEXT: pcmpgtq %xmm0, %xmm4 -; SSE4-NEXT: pextrb $0, %xmm4, %eax +; SSE4-NEXT: movdqa %xmm0, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB8_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: movq %xmm2, (%rdi) ; SSE4-NEXT: LBB8_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB8_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrq $1, %xmm2, 8(%rdi) ; SSE4-NEXT: LBB8_4: ## %else2 -; SSE4-NEXT: pxor %xmm0, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB8_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: movq %xmm3, 16(%rdi) ; SSE4-NEXT: LBB8_6: ## %else4 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB8_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrq $1, %xmm3, 24(%rdi) @@ -1080,19 +1059,21 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movmskpd %xmm0, %eax ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB10_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store +; SSE2-NEXT: jne LBB10_1 +; SSE2-NEXT: ## %bb.2: ## %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne LBB10_3 +; SSE2-NEXT: LBB10_4: ## %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB10_1: ## %cond.store ; SSE2-NEXT: movd %xmm1, (%rdi) -; SSE2-NEXT: LBB10_2: ## %else -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB10_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 +; SSE2-NEXT: LBB10_3: ## %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 4(%rdi) -; SSE2-NEXT: LBB10_4: ## %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v2i32_v2i32: @@ -1100,18 +1081,20 @@ ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0,1],xmm2[2,3],xmm0[4,5],xmm2[6,7] ; SSE4-NEXT: pcmpeqq %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax +; SSE4-NEXT: movmskpd %xmm0, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB10_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store +; SSE4-NEXT: jne LBB10_1 +; SSE4-NEXT: ## %bb.2: ## %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne LBB10_3 +; SSE4-NEXT: LBB10_4: ## %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB10_1: ## %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) -; SSE4-NEXT: LBB10_2: ## %else -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB10_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 +; SSE4-NEXT: LBB10_3: ## %cond.store1 ; SSE4-NEXT: extractps $2, %xmm1, 4(%rdi) -; SSE4-NEXT: LBB10_4: ## %else2 ; SSE4-NEXT: retq ; ; AVX1-LABEL: store_v2i32_v2i32: @@ -1163,14 +1146,13 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movmskps %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB11_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movd %xmm1, (%rdi) ; SSE2-NEXT: LBB11_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB11_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,2,3] @@ -1178,52 +1160,55 @@ ; SSE2-NEXT: LBB11_4: ## %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB11_6 -; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[2,3,0,1] -; SSE2-NEXT: movd %xmm2, 8(%rdi) -; SSE2-NEXT: LBB11_6: ## %else4 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne LBB11_5 +; SSE2-NEXT: ## %bb.6: ## %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne LBB11_7 +; SSE2-NEXT: LBB11_8: ## %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB11_5: ## %cond.store3 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] +; SSE2-NEXT: movd %xmm0, 8(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB11_8 -; SSE2-NEXT: ## %bb.7: ## %cond.store5 +; SSE2-NEXT: LBB11_7: ## %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) -; SSE2-NEXT: LBB11_8: ## %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v4i32_v4i32: ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movmskps %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB11_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) ; SSE4-NEXT: LBB11_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB11_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: extractps $1, %xmm1, 4(%rdi) ; SSE4-NEXT: LBB11_4: ## %else2 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB11_6 -; SSE4-NEXT: ## %bb.5: ## %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne LBB11_5 +; SSE4-NEXT: ## %bb.6: ## %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne LBB11_7 +; SSE4-NEXT: LBB11_8: ## %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB11_5: ## %cond.store3 ; SSE4-NEXT: extractps $2, %xmm1, 8(%rdi) -; SSE4-NEXT: LBB11_6: ## %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB11_8 -; SSE4-NEXT: ## %bb.7: ## %cond.store5 +; SSE4-NEXT: LBB11_7: ## %cond.store5 ; SSE4-NEXT: extractps $3, %xmm1, 12(%rdi) -; SSE4-NEXT: LBB11_8: ## %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: store_v4i32_v4i32: @@ -1268,16 +1253,17 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB12_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movd %xmm2, (%rdi) ; SSE2-NEXT: LBB12_2: ## %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB12_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[1,1,2,3] @@ -1285,15 +1271,20 @@ ; SSE2-NEXT: LBB12_4: ## %else2 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB12_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[2,3,0,1] ; SSE2-NEXT: movd %xmm4, 8(%rdi) ; SSE2-NEXT: LBB12_6: ## %else4 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB12_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[3,1,2,3] @@ -1301,14 +1292,18 @@ ; SSE2-NEXT: LBB12_8: ## %else6 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB12_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: movd %xmm3, 16(%rdi) ; SSE2-NEXT: LBB12_10: ## %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB12_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,2,3] @@ -1316,15 +1311,19 @@ ; SSE2-NEXT: LBB12_12: ## %else10 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB12_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 24(%rdi) ; SSE2-NEXT: LBB12_14: ## %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB12_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[3,1,2,3] @@ -1336,56 +1335,74 @@ ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 -; SSE4-NEXT: pextrb $0, %xmm4, %eax +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB12_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store -; SSE4-NEXT: movss %xmm2, (%rdi) +; SSE4-NEXT: movd %xmm2, (%rdi) ; SSE4-NEXT: LBB12_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB12_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 -; SSE4-NEXT: extractps $1, %xmm2, 4(%rdi) +; SSE4-NEXT: pextrd $1, %xmm2, 4(%rdi) ; SSE4-NEXT: LBB12_4: ## %else2 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB12_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 -; SSE4-NEXT: extractps $2, %xmm2, 8(%rdi) +; SSE4-NEXT: pextrd $2, %xmm2, 8(%rdi) ; SSE4-NEXT: LBB12_6: ## %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB12_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 -; SSE4-NEXT: extractps $3, %xmm2, 12(%rdi) +; SSE4-NEXT: pextrd $3, %xmm2, 12(%rdi) ; SSE4-NEXT: LBB12_8: ## %else6 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB12_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: movss %xmm3, 16(%rdi) ; SSE4-NEXT: LBB12_10: ## %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB12_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: extractps $1, %xmm3, 20(%rdi) ; SSE4-NEXT: LBB12_12: ## %else10 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB12_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: extractps $2, %xmm3, 24(%rdi) ; SSE4-NEXT: LBB12_14: ## %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB12_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: extractps $3, %xmm3, 28(%rdi) @@ -1442,15 +1459,18 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB13_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movd %xmm1, %ecx -; SSE2-NEXT: movw %cx, (%rdi) +; SSE2-NEXT: movd %xmm1, %eax +; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: LBB13_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB13_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm1, %eax @@ -1458,15 +1478,18 @@ ; SSE2-NEXT: LBB13_4: ## %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB13_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm1, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: LBB13_6: ## %else4 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB13_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm1, %eax @@ -1474,15 +1497,18 @@ ; SSE2-NEXT: LBB13_8: ## %else6 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB13_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm1, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: LBB13_10: ## %else8 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB13_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm1, %eax @@ -1490,15 +1516,18 @@ ; SSE2-NEXT: LBB13_12: ## %else10 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqw %xmm2, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB13_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm1, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: LBB13_14: ## %else12 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB13_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm1, %eax @@ -1510,56 +1539,68 @@ ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB13_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) ; SSE4-NEXT: LBB13_2: ## %else -; SSE4-NEXT: pextrb $2, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB13_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm1, 2(%rdi) ; SSE4-NEXT: LBB13_4: ## %else2 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB13_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm1, 4(%rdi) ; SSE4-NEXT: LBB13_6: ## %else4 -; SSE4-NEXT: pextrb $6, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB13_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm1, 6(%rdi) ; SSE4-NEXT: LBB13_8: ## %else6 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB13_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm1, 8(%rdi) ; SSE4-NEXT: LBB13_10: ## %else8 -; SSE4-NEXT: pextrb $10, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB13_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm1, 10(%rdi) ; SSE4-NEXT: LBB13_12: ## %else10 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqw %xmm2, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB13_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm1, 12(%rdi) ; SSE4-NEXT: LBB13_14: ## %else12 -; SSE4-NEXT: pextrb $14, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB13_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm1, 14(%rdi) @@ -1570,56 +1611,64 @@ ; AVX1OR2: ## %bb.0: ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $0, %xmm2, %eax +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX1OR2-NEXT: vpmovmskb %xmm3, %eax ; AVX1OR2-NEXT: testb $1, %al ; AVX1OR2-NEXT: je LBB13_2 ; AVX1OR2-NEXT: ## %bb.1: ## %cond.store ; AVX1OR2-NEXT: vpextrw $0, %xmm1, (%rdi) ; AVX1OR2-NEXT: LBB13_2: ## %else -; AVX1OR2-NEXT: vpextrb $2, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $2, %al ; AVX1OR2-NEXT: je LBB13_4 ; AVX1OR2-NEXT: ## %bb.3: ## %cond.store1 ; AVX1OR2-NEXT: vpextrw $1, %xmm1, 2(%rdi) ; AVX1OR2-NEXT: LBB13_4: ## %else2 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $4, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX1OR2-NEXT: vpmovmskb %xmm3, %eax +; AVX1OR2-NEXT: testb $4, %al ; AVX1OR2-NEXT: je LBB13_6 ; AVX1OR2-NEXT: ## %bb.5: ## %cond.store3 ; AVX1OR2-NEXT: vpextrw $2, %xmm1, 4(%rdi) ; AVX1OR2-NEXT: LBB13_6: ## %else4 -; AVX1OR2-NEXT: vpextrb $6, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $8, %al ; AVX1OR2-NEXT: je LBB13_8 ; AVX1OR2-NEXT: ## %bb.7: ## %cond.store5 ; AVX1OR2-NEXT: vpextrw $3, %xmm1, 6(%rdi) ; AVX1OR2-NEXT: LBB13_8: ## %else6 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $8, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX1OR2-NEXT: vpmovmskb %xmm3, %eax +; AVX1OR2-NEXT: testb $16, %al ; AVX1OR2-NEXT: je LBB13_10 ; AVX1OR2-NEXT: ## %bb.9: ## %cond.store7 ; AVX1OR2-NEXT: vpextrw $4, %xmm1, 8(%rdi) ; AVX1OR2-NEXT: LBB13_10: ## %else8 -; AVX1OR2-NEXT: vpextrb $10, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $32, %al ; AVX1OR2-NEXT: je LBB13_12 ; AVX1OR2-NEXT: ## %bb.11: ## %cond.store9 ; AVX1OR2-NEXT: vpextrw $5, %xmm1, 10(%rdi) ; AVX1OR2-NEXT: LBB13_12: ## %else10 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0 -; AVX1OR2-NEXT: vpextrb $12, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $64, %al ; AVX1OR2-NEXT: je LBB13_14 ; AVX1OR2-NEXT: ## %bb.13: ## %cond.store11 ; AVX1OR2-NEXT: vpextrw $6, %xmm1, 12(%rdi) ; AVX1OR2-NEXT: LBB13_14: ## %else12 -; AVX1OR2-NEXT: vpextrb $14, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax +; AVX1OR2-NEXT: testb $-128, %al ; AVX1OR2-NEXT: je LBB13_16 ; AVX1OR2-NEXT: ## %bb.15: ## %cond.store13 ; AVX1OR2-NEXT: vpextrw $7, %xmm1, 14(%rdi) @@ -1717,15 +1766,18 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax +; SSE2-NEXT: movdqa %xmm4, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB14_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movd %xmm2, %ecx -; SSE2-NEXT: movw %cx, (%rdi) +; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: LBB14_2: ## %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB14_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm2, %eax @@ -1733,15 +1785,18 @@ ; SSE2-NEXT: LBB14_4: ## %else2 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE2-NEXT: pextrw $2, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm4, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB14_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: LBB14_6: ## %else4 -; SSE2-NEXT: pextrw $3, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB14_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm2, %eax @@ -1749,15 +1804,18 @@ ; SSE2-NEXT: LBB14_8: ## %else6 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE2-NEXT: pextrw $4, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm4, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB14_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm2, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: LBB14_10: ## %else8 -; SSE2-NEXT: pextrw $5, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB14_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -1765,15 +1823,18 @@ ; SSE2-NEXT: LBB14_12: ## %else10 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqw %xmm4, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB14_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: LBB14_14: ## %else12 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB14_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm2, %eax @@ -1781,15 +1842,17 @@ ; SSE2-NEXT: LBB14_16: ## %else14 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 ; SSE2-NEXT: je LBB14_18 ; SSE2-NEXT: ## %bb.17: ## %cond.store15 -; SSE2-NEXT: movd %xmm3, %ecx -; SSE2-NEXT: movw %cx, 16(%rdi) +; SSE2-NEXT: movd %xmm3, %eax +; SSE2-NEXT: movw %ax, 16(%rdi) ; SSE2-NEXT: LBB14_18: ## %else16 -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 ; SSE2-NEXT: je LBB14_20 ; SSE2-NEXT: ## %bb.19: ## %cond.store17 ; SSE2-NEXT: pextrw $1, %xmm3, %eax @@ -1797,15 +1860,17 @@ ; SSE2-NEXT: LBB14_20: ## %else18 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE2-NEXT: je LBB14_22 ; SSE2-NEXT: ## %bb.21: ## %cond.store19 ; SSE2-NEXT: pextrw $2, %xmm3, %eax ; SSE2-NEXT: movw %ax, 20(%rdi) ; SSE2-NEXT: LBB14_22: ## %else20 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE2-NEXT: je LBB14_24 ; SSE2-NEXT: ## %bb.23: ## %cond.store21 ; SSE2-NEXT: pextrw $3, %xmm3, %eax @@ -1813,15 +1878,17 @@ ; SSE2-NEXT: LBB14_24: ## %else22 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE2-NEXT: je LBB14_26 ; SSE2-NEXT: ## %bb.25: ## %cond.store23 ; SSE2-NEXT: pextrw $4, %xmm3, %eax ; SSE2-NEXT: movw %ax, 24(%rdi) ; SSE2-NEXT: LBB14_26: ## %else24 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE2-NEXT: je LBB14_28 ; SSE2-NEXT: ## %bb.27: ## %cond.store25 ; SSE2-NEXT: pextrw $5, %xmm3, %eax @@ -1829,15 +1896,17 @@ ; SSE2-NEXT: LBB14_28: ## %else26 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqw %xmm0, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm1, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE2-NEXT: je LBB14_30 ; SSE2-NEXT: ## %bb.29: ## %cond.store27 ; SSE2-NEXT: pextrw $6, %xmm3, %eax ; SSE2-NEXT: movw %ax, 28(%rdi) ; SSE2-NEXT: LBB14_30: ## %else28 -; SSE2-NEXT: pextrw $7, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm1, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE2-NEXT: je LBB14_32 ; SSE2-NEXT: ## %bb.31: ## %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm3, %eax @@ -1849,112 +1918,132 @@ ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE4-NEXT: pextrb $0, %xmm4, %eax +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB14_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: pextrw $0, %xmm2, (%rdi) ; SSE4-NEXT: LBB14_2: ## %else -; SSE4-NEXT: pextrb $2, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB14_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm2, 2(%rdi) ; SSE4-NEXT: LBB14_4: ## %else2 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB14_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm2, 4(%rdi) ; SSE4-NEXT: LBB14_6: ## %else4 -; SSE4-NEXT: pextrb $6, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB14_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm2, 6(%rdi) ; SSE4-NEXT: LBB14_8: ## %else6 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm4 -; SSE4-NEXT: pextrb $8, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB14_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm2, 8(%rdi) ; SSE4-NEXT: LBB14_10: ## %else8 -; SSE4-NEXT: pextrb $10, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB14_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm2, 10(%rdi) ; SSE4-NEXT: LBB14_12: ## %else10 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqw %xmm4, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB14_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm2, 12(%rdi) ; SSE4-NEXT: LBB14_14: ## %else12 -; SSE4-NEXT: pextrb $14, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB14_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm2, 14(%rdi) ; SSE4-NEXT: LBB14_16: ## %else14 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $256, %eax ## imm = 0x100 ; SSE4-NEXT: je LBB14_18 ; SSE4-NEXT: ## %bb.17: ## %cond.store15 ; SSE4-NEXT: pextrw $0, %xmm3, 16(%rdi) ; SSE4-NEXT: LBB14_18: ## %else16 -; SSE4-NEXT: pextrb $2, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $512, %eax ## imm = 0x200 ; SSE4-NEXT: je LBB14_20 ; SSE4-NEXT: ## %bb.19: ## %cond.store17 ; SSE4-NEXT: pextrw $1, %xmm3, 18(%rdi) ; SSE4-NEXT: LBB14_20: ## %else18 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE4-NEXT: je LBB14_22 ; SSE4-NEXT: ## %bb.21: ## %cond.store19 ; SSE4-NEXT: pextrw $2, %xmm3, 20(%rdi) ; SSE4-NEXT: LBB14_22: ## %else20 -; SSE4-NEXT: pextrb $6, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE4-NEXT: je LBB14_24 ; SSE4-NEXT: ## %bb.23: ## %cond.store21 ; SSE4-NEXT: pextrw $3, %xmm3, 22(%rdi) ; SSE4-NEXT: LBB14_24: ## %else22 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE4-NEXT: je LBB14_26 ; SSE4-NEXT: ## %bb.25: ## %cond.store23 ; SSE4-NEXT: pextrw $4, %xmm3, 24(%rdi) ; SSE4-NEXT: LBB14_26: ## %else24 -; SSE4-NEXT: pextrb $10, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE4-NEXT: je LBB14_28 ; SSE4-NEXT: ## %bb.27: ## %cond.store25 ; SSE4-NEXT: pextrw $5, %xmm3, 26(%rdi) ; SSE4-NEXT: LBB14_28: ## %else26 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqw %xmm0, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm1, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE4-NEXT: je LBB14_30 ; SSE4-NEXT: ## %bb.29: ## %cond.store27 ; SSE4-NEXT: pextrw $6, %xmm3, 28(%rdi) ; SSE4-NEXT: LBB14_30: ## %else28 -; SSE4-NEXT: pextrb $14, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm1, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE4-NEXT: je LBB14_32 ; SSE4-NEXT: ## %bb.31: ## %cond.store29 ; SSE4-NEXT: pextrw $7, %xmm3, 30(%rdi) @@ -1965,60 +2054,68 @@ ; AVX1: ## %bb.0: ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je LBB14_2 ; AVX1-NEXT: ## %bb.1: ## %cond.store ; AVX1-NEXT: vpextrw $0, %xmm1, (%rdi) ; AVX1-NEXT: LBB14_2: ## %else ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB14_4 ; AVX1-NEXT: ## %bb.3: ## %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm1, 2(%rdi) ; AVX1-NEXT: LBB14_4: ## %else2 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je LBB14_6 ; AVX1-NEXT: ## %bb.5: ## %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm1, 4(%rdi) ; AVX1-NEXT: LBB14_6: ## %else4 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je LBB14_8 ; AVX1-NEXT: ## %bb.7: ## %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm1, 6(%rdi) ; AVX1-NEXT: LBB14_8: ## %else6 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je LBB14_10 ; AVX1-NEXT: ## %bb.9: ## %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm1, 8(%rdi) ; AVX1-NEXT: LBB14_10: ## %else8 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je LBB14_12 ; AVX1-NEXT: ## %bb.11: ## %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm1, 10(%rdi) ; AVX1-NEXT: LBB14_12: ## %else10 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm3, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je LBB14_14 ; AVX1-NEXT: ## %bb.13: ## %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm1, 12(%rdi) ; AVX1-NEXT: LBB14_14: ## %else12 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je LBB14_16 ; AVX1-NEXT: ## %bb.15: ## %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm1, 14(%rdi) @@ -2026,15 +2123,17 @@ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1-NEXT: je LBB14_18 ; AVX1-NEXT: ## %bb.17: ## %cond.store15 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 ; AVX1-NEXT: vpextrw $0, %xmm3, 16(%rdi) ; AVX1-NEXT: LBB14_18: ## %else16 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB14_20 ; AVX1-NEXT: ## %bb.19: ## %cond.store17 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -2042,15 +2141,17 @@ ; AVX1-NEXT: LBB14_20: ## %else18 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1-NEXT: je LBB14_22 ; AVX1-NEXT: ## %bb.21: ## %cond.store19 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 ; AVX1-NEXT: vpextrw $2, %xmm3, 20(%rdi) ; AVX1-NEXT: LBB14_22: ## %else20 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1-NEXT: je LBB14_24 ; AVX1-NEXT: ## %bb.23: ## %cond.store21 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -2058,15 +2159,17 @@ ; AVX1-NEXT: LBB14_24: ## %else22 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1-NEXT: je LBB14_26 ; AVX1-NEXT: ## %bb.25: ## %cond.store23 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 ; AVX1-NEXT: vpextrw $4, %xmm3, 24(%rdi) ; AVX1-NEXT: LBB14_26: ## %else24 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1-NEXT: je LBB14_28 ; AVX1-NEXT: ## %bb.27: ## %cond.store25 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -2074,15 +2177,17 @@ ; AVX1-NEXT: LBB14_28: ## %else26 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqw %xmm2, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $12, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX1-NEXT: je LBB14_30 ; AVX1-NEXT: ## %bb.29: ## %cond.store27 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 ; AVX1-NEXT: vpextrw $6, %xmm2, 28(%rdi) ; AVX1-NEXT: LBB14_30: ## %else28 -; AVX1-NEXT: vpextrb $14, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1-NEXT: je LBB14_32 ; AVX1-NEXT: ## %bb.31: ## %cond.store29 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 @@ -2095,56 +2200,64 @@ ; AVX2: ## %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je LBB14_2 ; AVX2-NEXT: ## %bb.1: ## %cond.store ; AVX2-NEXT: vpextrw $0, %xmm1, (%rdi) ; AVX2-NEXT: LBB14_2: ## %else -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je LBB14_4 ; AVX2-NEXT: ## %bb.3: ## %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm1, 2(%rdi) ; AVX2-NEXT: LBB14_4: ## %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je LBB14_6 ; AVX2-NEXT: ## %bb.5: ## %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm1, 4(%rdi) ; AVX2-NEXT: LBB14_6: ## %else4 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je LBB14_8 ; AVX2-NEXT: ## %bb.7: ## %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm1, 6(%rdi) ; AVX2-NEXT: LBB14_8: ## %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je LBB14_10 ; AVX2-NEXT: ## %bb.9: ## %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm1, 8(%rdi) ; AVX2-NEXT: LBB14_10: ## %else8 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je LBB14_12 ; AVX2-NEXT: ## %bb.11: ## %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm1, 10(%rdi) ; AVX2-NEXT: LBB14_12: ## %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je LBB14_14 ; AVX2-NEXT: ## %bb.13: ## %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm1, 12(%rdi) ; AVX2-NEXT: LBB14_14: ## %else12 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je LBB14_16 ; AVX2-NEXT: ## %bb.15: ## %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm1, 14(%rdi) @@ -2152,15 +2265,17 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $256, %eax ## imm = 0x100 ; AVX2-NEXT: je LBB14_18 ; AVX2-NEXT: ## %bb.17: ## %cond.store15 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpextrw $0, %xmm3, 16(%rdi) ; AVX2-NEXT: LBB14_18: ## %else16 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $512, %eax ## imm = 0x200 ; AVX2-NEXT: je LBB14_20 ; AVX2-NEXT: ## %bb.19: ## %cond.store17 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -2169,15 +2284,17 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX2-NEXT: je LBB14_22 ; AVX2-NEXT: ## %bb.21: ## %cond.store19 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpextrw $2, %xmm3, 20(%rdi) ; AVX2-NEXT: LBB14_22: ## %else20 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX2-NEXT: je LBB14_24 ; AVX2-NEXT: ## %bb.23: ## %cond.store21 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -2186,15 +2303,17 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm2 ; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm3 +; AVX2-NEXT: vpmovmskb %xmm3, %eax +; AVX2-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX2-NEXT: je LBB14_26 ; AVX2-NEXT: ## %bb.25: ## %cond.store23 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 ; AVX2-NEXT: vpextrw $4, %xmm3, 24(%rdi) ; AVX2-NEXT: LBB14_26: ## %else24 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX2-NEXT: je LBB14_28 ; AVX2-NEXT: ## %bb.27: ## %cond.store25 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -2203,15 +2322,17 @@ ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqw %ymm2, %ymm0, %ymm0 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX2-NEXT: vpextrb $12, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX2-NEXT: je LBB14_30 ; AVX2-NEXT: ## %bb.29: ## %cond.store27 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX2-NEXT: vpextrw $6, %xmm2, 28(%rdi) ; AVX2-NEXT: LBB14_30: ## %else28 -; AVX2-NEXT: vpextrb $14, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX2-NEXT: vpmovmskb %xmm0, %eax +; AVX2-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX2-NEXT: je LBB14_32 ; AVX2-NEXT: ## %bb.31: ## %cond.store29 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 @@ -2396,15 +2517,14 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: pmovmskb %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB15_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movd %xmm1, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: LBB15_2: ## %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB15_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: movd %xmm1, %eax @@ -2412,18 +2532,15 @@ ; SSE2-NEXT: LBB15_4: ## %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB15_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: movd %xmm1, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: LBB15_6: ## %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB15_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: movd %xmm1, %eax @@ -2432,15 +2549,14 @@ ; SSE2-NEXT: LBB15_8: ## %else6 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB15_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: LBB15_10: ## %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB15_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm1, %eax @@ -2448,15 +2564,14 @@ ; SSE2-NEXT: LBB15_12: ## %else10 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB15_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: LBB15_14: ## %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB15_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm1, %eax @@ -2464,15 +2579,14 @@ ; SSE2-NEXT: LBB15_16: ## %else14 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 ; SSE2-NEXT: je LBB15_18 ; SSE2-NEXT: ## %bb.17: ## %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: LBB15_18: ## %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 ; SSE2-NEXT: je LBB15_20 ; SSE2-NEXT: ## %bb.19: ## %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm1, %eax @@ -2480,15 +2594,14 @@ ; SSE2-NEXT: LBB15_20: ## %else18 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE2-NEXT: je LBB15_22 ; SSE2-NEXT: ## %bb.21: ## %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: LBB15_22: ## %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE2-NEXT: je LBB15_24 ; SSE2-NEXT: ## %bb.23: ## %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm1, %eax @@ -2496,15 +2609,14 @@ ; SSE2-NEXT: LBB15_24: ## %else22 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE2-NEXT: je LBB15_26 ; SSE2-NEXT: ## %bb.25: ## %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: LBB15_26: ## %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE2-NEXT: je LBB15_28 ; SSE2-NEXT: ## %bb.27: ## %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm1, %eax @@ -2512,400 +2624,355 @@ ; SSE2-NEXT: LBB15_28: ## %else26 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm0 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB15_30 -; SSE2-NEXT: ## %bb.29: ## %cond.store27 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE2-NEXT: jne LBB15_29 +; SSE2-NEXT: ## %bb.30: ## %else28 +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE2-NEXT: jne LBB15_31 +; SSE2-NEXT: LBB15_32: ## %else30 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB15_29: ## %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm1, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) -; SSE2-NEXT: LBB15_30: ## %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE2-NEXT: je LBB15_32 -; SSE2-NEXT: ## %bb.31: ## %cond.store29 +; SSE2-NEXT: LBB15_31: ## %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm1, %eax ; SSE2-NEXT: movb %ah, 15(%rdi) -; SSE2-NEXT: LBB15_32: ## %else30 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v16i8_v16i8: ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: pmovmskb %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB15_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) ; SSE4-NEXT: LBB15_2: ## %else -; SSE4-NEXT: pextrb $1, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB15_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm1, 1(%rdi) ; SSE4-NEXT: LBB15_4: ## %else2 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $2, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB15_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm1, 2(%rdi) ; SSE4-NEXT: LBB15_6: ## %else4 -; SSE4-NEXT: pextrb $3, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB15_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm1, 3(%rdi) ; SSE4-NEXT: LBB15_8: ## %else6 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB15_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm1, 4(%rdi) ; SSE4-NEXT: LBB15_10: ## %else8 -; SSE4-NEXT: pextrb $5, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB15_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm1, 5(%rdi) ; SSE4-NEXT: LBB15_12: ## %else10 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $6, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB15_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm1, 6(%rdi) ; SSE4-NEXT: LBB15_14: ## %else12 -; SSE4-NEXT: pextrb $7, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB15_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm1, 7(%rdi) ; SSE4-NEXT: LBB15_16: ## %else14 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $256, %eax ## imm = 0x100 ; SSE4-NEXT: je LBB15_18 ; SSE4-NEXT: ## %bb.17: ## %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm1, 8(%rdi) ; SSE4-NEXT: LBB15_18: ## %else16 -; SSE4-NEXT: pextrb $9, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax ## imm = 0x200 ; SSE4-NEXT: je LBB15_20 ; SSE4-NEXT: ## %bb.19: ## %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm1, 9(%rdi) ; SSE4-NEXT: LBB15_20: ## %else18 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $10, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE4-NEXT: je LBB15_22 ; SSE4-NEXT: ## %bb.21: ## %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm1, 10(%rdi) ; SSE4-NEXT: LBB15_22: ## %else20 -; SSE4-NEXT: pextrb $11, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE4-NEXT: je LBB15_24 ; SSE4-NEXT: ## %bb.23: ## %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm1, 11(%rdi) ; SSE4-NEXT: LBB15_24: ## %else22 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE4-NEXT: je LBB15_26 ; SSE4-NEXT: ## %bb.25: ## %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm1, 12(%rdi) ; SSE4-NEXT: LBB15_26: ## %else24 -; SSE4-NEXT: pextrb $13, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE4-NEXT: je LBB15_28 ; SSE4-NEXT: ## %bb.27: ## %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm1, 13(%rdi) ; SSE4-NEXT: LBB15_28: ## %else26 ; SSE4-NEXT: pxor %xmm2, %xmm2 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm0 -; SSE4-NEXT: pextrb $14, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB15_30 -; SSE4-NEXT: ## %bb.29: ## %cond.store27 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $16384, %eax ## imm = 0x4000 +; SSE4-NEXT: jne LBB15_29 +; SSE4-NEXT: ## %bb.30: ## %else28 +; SSE4-NEXT: testl $32768, %eax ## imm = 0x8000 +; SSE4-NEXT: jne LBB15_31 +; SSE4-NEXT: LBB15_32: ## %else30 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB15_29: ## %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm1, 14(%rdi) -; SSE4-NEXT: LBB15_30: ## %else28 -; SSE4-NEXT: pextrb $15, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE4-NEXT: je LBB15_32 -; SSE4-NEXT: ## %bb.31: ## %cond.store29 +; SSE4-NEXT: LBB15_31: ## %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm1, 15(%rdi) -; SSE4-NEXT: LBB15_32: ## %else30 ; SSE4-NEXT: retq ; ; AVX1OR2-LABEL: store_v16i8_v16i8: ; AVX1OR2: ## %bb.0: ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $0, %xmm2, %eax +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax ; AVX1OR2-NEXT: testb $1, %al ; AVX1OR2-NEXT: je LBB15_2 ; AVX1OR2-NEXT: ## %bb.1: ## %cond.store ; AVX1OR2-NEXT: vpextrb $0, %xmm1, (%rdi) ; AVX1OR2-NEXT: LBB15_2: ## %else -; AVX1OR2-NEXT: vpextrb $1, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $2, %al ; AVX1OR2-NEXT: je LBB15_4 ; AVX1OR2-NEXT: ## %bb.3: ## %cond.store1 ; AVX1OR2-NEXT: vpextrb $1, %xmm1, 1(%rdi) ; AVX1OR2-NEXT: LBB15_4: ## %else2 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $2, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $4, %al ; AVX1OR2-NEXT: je LBB15_6 ; AVX1OR2-NEXT: ## %bb.5: ## %cond.store3 ; AVX1OR2-NEXT: vpextrb $2, %xmm1, 2(%rdi) ; AVX1OR2-NEXT: LBB15_6: ## %else4 -; AVX1OR2-NEXT: vpextrb $3, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $8, %al ; AVX1OR2-NEXT: je LBB15_8 ; AVX1OR2-NEXT: ## %bb.7: ## %cond.store5 ; AVX1OR2-NEXT: vpextrb $3, %xmm1, 3(%rdi) ; AVX1OR2-NEXT: LBB15_8: ## %else6 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $4, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $16, %al ; AVX1OR2-NEXT: je LBB15_10 ; AVX1OR2-NEXT: ## %bb.9: ## %cond.store7 ; AVX1OR2-NEXT: vpextrb $4, %xmm1, 4(%rdi) ; AVX1OR2-NEXT: LBB15_10: ## %else8 -; AVX1OR2-NEXT: vpextrb $5, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $32, %al ; AVX1OR2-NEXT: je LBB15_12 ; AVX1OR2-NEXT: ## %bb.11: ## %cond.store9 ; AVX1OR2-NEXT: vpextrb $5, %xmm1, 5(%rdi) ; AVX1OR2-NEXT: LBB15_12: ## %else10 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $6, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testb $64, %al ; AVX1OR2-NEXT: je LBB15_14 ; AVX1OR2-NEXT: ## %bb.13: ## %cond.store11 ; AVX1OR2-NEXT: vpextrb $6, %xmm1, 6(%rdi) ; AVX1OR2-NEXT: LBB15_14: ## %else12 -; AVX1OR2-NEXT: vpextrb $7, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testb $-128, %al ; AVX1OR2-NEXT: je LBB15_16 ; AVX1OR2-NEXT: ## %bb.15: ## %cond.store13 ; AVX1OR2-NEXT: vpextrb $7, %xmm1, 7(%rdi) ; AVX1OR2-NEXT: LBB15_16: ## %else14 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $8, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1OR2-NEXT: je LBB15_18 ; AVX1OR2-NEXT: ## %bb.17: ## %cond.store15 ; AVX1OR2-NEXT: vpextrb $8, %xmm1, 8(%rdi) ; AVX1OR2-NEXT: LBB15_18: ## %else16 -; AVX1OR2-NEXT: vpextrb $9, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1OR2-NEXT: je LBB15_20 ; AVX1OR2-NEXT: ## %bb.19: ## %cond.store17 ; AVX1OR2-NEXT: vpextrb $9, %xmm1, 9(%rdi) ; AVX1OR2-NEXT: LBB15_20: ## %else18 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $10, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1OR2-NEXT: je LBB15_22 ; AVX1OR2-NEXT: ## %bb.21: ## %cond.store19 ; AVX1OR2-NEXT: vpextrb $10, %xmm1, 10(%rdi) ; AVX1OR2-NEXT: LBB15_22: ## %else20 -; AVX1OR2-NEXT: vpextrb $11, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1OR2-NEXT: je LBB15_24 ; AVX1OR2-NEXT: ## %bb.23: ## %cond.store21 ; AVX1OR2-NEXT: vpextrb $11, %xmm1, 11(%rdi) ; AVX1OR2-NEXT: LBB15_24: ## %else22 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1OR2-NEXT: vpextrb $12, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: vpmovmskb %xmm2, %eax +; AVX1OR2-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1OR2-NEXT: je LBB15_26 ; AVX1OR2-NEXT: ## %bb.25: ## %cond.store23 ; AVX1OR2-NEXT: vpextrb $12, %xmm1, 12(%rdi) ; AVX1OR2-NEXT: LBB15_26: ## %else24 -; AVX1OR2-NEXT: vpextrb $13, %xmm2, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1OR2-NEXT: je LBB15_28 ; AVX1OR2-NEXT: ## %bb.27: ## %cond.store25 ; AVX1OR2-NEXT: vpextrb $13, %xmm1, 13(%rdi) ; AVX1OR2-NEXT: LBB15_28: ## %else26 ; AVX1OR2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1OR2-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 -; AVX1OR2-NEXT: vpextrb $14, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al -; AVX1OR2-NEXT: je LBB15_30 -; AVX1OR2-NEXT: ## %bb.29: ## %cond.store27 +; AVX1OR2-NEXT: vpmovmskb %xmm0, %eax +; AVX1OR2-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX1OR2-NEXT: jne LBB15_29 +; AVX1OR2-NEXT: ## %bb.30: ## %else28 +; AVX1OR2-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX1OR2-NEXT: jne LBB15_31 +; AVX1OR2-NEXT: LBB15_32: ## %else30 +; AVX1OR2-NEXT: retq +; AVX1OR2-NEXT: LBB15_29: ## %cond.store27 ; AVX1OR2-NEXT: vpextrb $14, %xmm1, 14(%rdi) -; AVX1OR2-NEXT: LBB15_30: ## %else28 -; AVX1OR2-NEXT: vpextrb $15, %xmm0, %eax -; AVX1OR2-NEXT: testb $1, %al +; AVX1OR2-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1OR2-NEXT: je LBB15_32 -; AVX1OR2-NEXT: ## %bb.31: ## %cond.store29 +; AVX1OR2-NEXT: LBB15_31: ## %cond.store29 ; AVX1OR2-NEXT: vpextrb $15, %xmm1, 15(%rdi) -; AVX1OR2-NEXT: LBB15_32: ## %else30 ; AVX1OR2-NEXT: retq ; ; AVX512F-LABEL: store_v16i8_v16i8: ; AVX512F: ## %bb.0: ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kmovw %k0, %eax +; AVX512F-NEXT: vpmovmskb %xmm2, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je LBB15_2 ; AVX512F-NEXT: ## %bb.1: ## %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm1, (%rdi) ; AVX512F-NEXT: LBB15_2: ## %else -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je LBB15_4 ; AVX512F-NEXT: ## %bb.3: ## %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm1, 1(%rdi) ; AVX512F-NEXT: LBB15_4: ## %else2 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je LBB15_6 ; AVX512F-NEXT: ## %bb.5: ## %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm1, 2(%rdi) ; AVX512F-NEXT: LBB15_6: ## %else4 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je LBB15_8 ; AVX512F-NEXT: ## %bb.7: ## %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm1, 3(%rdi) ; AVX512F-NEXT: LBB15_8: ## %else6 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je LBB15_10 ; AVX512F-NEXT: ## %bb.9: ## %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm1, 4(%rdi) ; AVX512F-NEXT: LBB15_10: ## %else8 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je LBB15_12 ; AVX512F-NEXT: ## %bb.11: ## %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm1, 5(%rdi) ; AVX512F-NEXT: LBB15_12: ## %else10 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je LBB15_14 ; AVX512F-NEXT: ## %bb.13: ## %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm1, 6(%rdi) ; AVX512F-NEXT: LBB15_14: ## %else12 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je LBB15_16 ; AVX512F-NEXT: ## %bb.15: ## %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm1, 7(%rdi) ; AVX512F-NEXT: LBB15_16: ## %else14 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 ; AVX512F-NEXT: je LBB15_18 ; AVX512F-NEXT: ## %bb.17: ## %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm1, 8(%rdi) ; AVX512F-NEXT: LBB15_18: ## %else16 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 ; AVX512F-NEXT: je LBB15_20 ; AVX512F-NEXT: ## %bb.19: ## %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm1, 9(%rdi) ; AVX512F-NEXT: LBB15_20: ## %else18 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX512F-NEXT: je LBB15_22 ; AVX512F-NEXT: ## %bb.21: ## %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm1, 10(%rdi) ; AVX512F-NEXT: LBB15_22: ## %else20 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX512F-NEXT: je LBB15_24 ; AVX512F-NEXT: ## %bb.23: ## %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm1, 11(%rdi) ; AVX512F-NEXT: LBB15_24: ## %else22 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX512F-NEXT: je LBB15_26 ; AVX512F-NEXT: ## %bb.25: ## %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm1, 12(%rdi) ; AVX512F-NEXT: LBB15_26: ## %else24 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX512F-NEXT: je LBB15_28 ; AVX512F-NEXT: ## %bb.27: ## %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm1, 13(%rdi) ; AVX512F-NEXT: LBB15_28: ## %else26 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 -; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 -; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB15_30 -; AVX512F-NEXT: ## %bb.29: ## %cond.store27 +; AVX512F-NEXT: vpmovmskb %xmm0, %eax +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 +; AVX512F-NEXT: jne LBB15_29 +; AVX512F-NEXT: ## %bb.30: ## %else28 +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 +; AVX512F-NEXT: jne LBB15_31 +; AVX512F-NEXT: LBB15_32: ## %else30 +; AVX512F-NEXT: retq +; AVX512F-NEXT: LBB15_29: ## %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm1, 14(%rdi) -; AVX512F-NEXT: LBB15_30: ## %else28 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX512F-NEXT: je LBB15_32 -; AVX512F-NEXT: ## %bb.31: ## %cond.store29 +; AVX512F-NEXT: LBB15_31: ## %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm1, 15(%rdi) -; AVX512F-NEXT: LBB15_32: ## %else30 -; AVX512F-NEXT: vzeroupper ; AVX512F-NEXT: retq ; ; AVX512VLBW-LABEL: store_v16i8_v16i8: @@ -2923,15 +2990,14 @@ ; SSE2: ## %bb.0: ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax +; SSE2-NEXT: pmovmskb %xmm4, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB16_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: LBB16_2: ## %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB16_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 ; SSE2-NEXT: movd %xmm2, %eax @@ -2939,18 +3005,15 @@ ; SSE2-NEXT: LBB16_4: ## %else2 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB16_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: LBB16_6: ## %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB16_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: movd %xmm2, %eax @@ -2959,15 +3022,14 @@ ; SSE2-NEXT: LBB16_8: ## %else6 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $2, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je LBB16_10 ; SSE2-NEXT: ## %bb.9: ## %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: LBB16_10: ## %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je LBB16_12 ; SSE2-NEXT: ## %bb.11: ## %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm2, %eax @@ -2975,15 +3037,14 @@ ; SSE2-NEXT: LBB16_12: ## %else10 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $3, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je LBB16_14 ; SSE2-NEXT: ## %bb.13: ## %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: LBB16_14: ## %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je LBB16_16 ; SSE2-NEXT: ## %bb.15: ## %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm2, %eax @@ -2991,15 +3052,14 @@ ; SSE2-NEXT: LBB16_16: ## %else14 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $4, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testl $256, %eax ## imm = 0x100 ; SSE2-NEXT: je LBB16_18 ; SSE2-NEXT: ## %bb.17: ## %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: LBB16_18: ## %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax ## imm = 0x200 ; SSE2-NEXT: je LBB16_20 ; SSE2-NEXT: ## %bb.19: ## %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm2, %eax @@ -3007,15 +3067,14 @@ ; SSE2-NEXT: LBB16_20: ## %else18 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $5, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE2-NEXT: je LBB16_22 ; SSE2-NEXT: ## %bb.21: ## %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: LBB16_22: ## %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE2-NEXT: je LBB16_24 ; SSE2-NEXT: ## %bb.23: ## %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -3023,15 +3082,14 @@ ; SSE2-NEXT: LBB16_24: ## %else22 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE2-NEXT: je LBB16_26 ; SSE2-NEXT: ## %bb.25: ## %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: LBB16_26: ## %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE2-NEXT: je LBB16_28 ; SSE2-NEXT: ## %bb.27: ## %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm2, %eax @@ -3039,15 +3097,14 @@ ; SSE2-NEXT: LBB16_28: ## %else26 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm0 -; SSE2-NEXT: pextrw $7, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE2-NEXT: je LBB16_30 ; SSE2-NEXT: ## %bb.29: ## %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) ; SSE2-NEXT: LBB16_30: ## %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE2-NEXT: je LBB16_32 ; SSE2-NEXT: ## %bb.31: ## %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm2, %eax @@ -3055,15 +3112,15 @@ ; SSE2-NEXT: LBB16_32: ## %else30 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $65536, %eax ## imm = 0x10000 ; SSE2-NEXT: je LBB16_34 ; SSE2-NEXT: ## %bb.33: ## %cond.store31 ; SSE2-NEXT: movd %xmm3, %ecx ; SSE2-NEXT: movb %cl, 16(%rdi) ; SSE2-NEXT: LBB16_34: ## %else32 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $131072, %eax ## imm = 0x20000 ; SSE2-NEXT: je LBB16_36 ; SSE2-NEXT: ## %bb.35: ## %cond.store33 ; SSE2-NEXT: movd %xmm3, %eax @@ -3071,18 +3128,16 @@ ; SSE2-NEXT: LBB16_36: ## %else34 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $262144, %eax ## imm = 0x40000 ; SSE2-NEXT: je LBB16_38 ; SSE2-NEXT: ## %bb.37: ## %cond.store35 ; SSE2-NEXT: movd %xmm3, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 18(%rdi) ; SSE2-NEXT: LBB16_38: ## %else36 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $524288, %eax ## imm = 0x80000 ; SSE2-NEXT: je LBB16_40 ; SSE2-NEXT: ## %bb.39: ## %cond.store37 ; SSE2-NEXT: movd %xmm3, %eax @@ -3091,15 +3146,15 @@ ; SSE2-NEXT: LBB16_40: ## %else38 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1048576, %eax ## imm = 0x100000 ; SSE2-NEXT: je LBB16_42 ; SSE2-NEXT: ## %bb.41: ## %cond.store39 ; SSE2-NEXT: pextrw $2, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 20(%rdi) ; SSE2-NEXT: LBB16_42: ## %else40 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2097152, %eax ## imm = 0x200000 ; SSE2-NEXT: je LBB16_44 ; SSE2-NEXT: ## %bb.43: ## %cond.store41 ; SSE2-NEXT: pextrw $2, %xmm3, %eax @@ -3107,15 +3162,15 @@ ; SSE2-NEXT: LBB16_44: ## %else42 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $4194304, %eax ## imm = 0x400000 ; SSE2-NEXT: je LBB16_46 ; SSE2-NEXT: ## %bb.45: ## %cond.store43 ; SSE2-NEXT: pextrw $3, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 22(%rdi) ; SSE2-NEXT: LBB16_46: ## %else44 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8388608, %eax ## imm = 0x800000 ; SSE2-NEXT: je LBB16_48 ; SSE2-NEXT: ## %bb.47: ## %cond.store45 ; SSE2-NEXT: pextrw $3, %xmm3, %eax @@ -3123,15 +3178,15 @@ ; SSE2-NEXT: LBB16_48: ## %else46 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; SSE2-NEXT: je LBB16_50 ; SSE2-NEXT: ## %bb.49: ## %cond.store47 ; SSE2-NEXT: pextrw $4, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 24(%rdi) ; SSE2-NEXT: LBB16_50: ## %else48 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; SSE2-NEXT: je LBB16_52 ; SSE2-NEXT: ## %bb.51: ## %cond.store49 ; SSE2-NEXT: pextrw $4, %xmm3, %eax @@ -3139,15 +3194,15 @@ ; SSE2-NEXT: LBB16_52: ## %else50 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; SSE2-NEXT: je LBB16_54 ; SSE2-NEXT: ## %bb.53: ## %cond.store51 ; SSE2-NEXT: pextrw $5, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 26(%rdi) ; SSE2-NEXT: LBB16_54: ## %else52 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; SSE2-NEXT: je LBB16_56 ; SSE2-NEXT: ## %bb.55: ## %cond.store53 ; SSE2-NEXT: pextrw $5, %xmm3, %eax @@ -3155,15 +3210,15 @@ ; SSE2-NEXT: LBB16_56: ## %else54 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; SSE2-NEXT: je LBB16_58 ; SSE2-NEXT: ## %bb.57: ## %cond.store55 ; SSE2-NEXT: pextrw $6, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 28(%rdi) ; SSE2-NEXT: LBB16_58: ## %else56 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; SSE2-NEXT: je LBB16_60 ; SSE2-NEXT: ## %bb.59: ## %cond.store57 ; SSE2-NEXT: pextrw $6, %xmm3, %eax @@ -3171,368 +3226,366 @@ ; SSE2-NEXT: LBB16_60: ## %else58 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm1 -; SSE2-NEXT: pextrw $7, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB16_62 -; SSE2-NEXT: ## %bb.61: ## %cond.store59 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; SSE2-NEXT: jne LBB16_61 +; SSE2-NEXT: ## %bb.62: ## %else60 +; SSE2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE2-NEXT: jne LBB16_63 +; SSE2-NEXT: LBB16_64: ## %else62 +; SSE2-NEXT: retq +; SSE2-NEXT: LBB16_61: ## %cond.store59 ; SSE2-NEXT: pextrw $7, %xmm3, %ecx ; SSE2-NEXT: movb %cl, 30(%rdi) -; SSE2-NEXT: LBB16_62: ## %else60 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; SSE2-NEXT: je LBB16_64 -; SSE2-NEXT: ## %bb.63: ## %cond.store61 +; SSE2-NEXT: LBB16_63: ## %cond.store61 ; SSE2-NEXT: pextrw $7, %xmm3, %eax ; SSE2-NEXT: movb %ah, 31(%rdi) -; SSE2-NEXT: LBB16_64: ## %else62 ; SSE2-NEXT: retq ; ; SSE4-LABEL: store_v32i8_v32i8: ; SSE4: ## %bb.0: ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $0, %xmm4, %eax +; SSE4-NEXT: pmovmskb %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB16_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: pextrb $0, %xmm2, (%rdi) ; SSE4-NEXT: LBB16_2: ## %else -; SSE4-NEXT: pextrb $1, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB16_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm2, 1(%rdi) ; SSE4-NEXT: LBB16_4: ## %else2 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $2, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB16_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm2, 2(%rdi) ; SSE4-NEXT: LBB16_6: ## %else4 -; SSE4-NEXT: pextrb $3, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB16_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm2, 3(%rdi) ; SSE4-NEXT: LBB16_8: ## %else6 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je LBB16_10 ; SSE4-NEXT: ## %bb.9: ## %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm2, 4(%rdi) ; SSE4-NEXT: LBB16_10: ## %else8 -; SSE4-NEXT: pextrb $5, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je LBB16_12 ; SSE4-NEXT: ## %bb.11: ## %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm2, 5(%rdi) ; SSE4-NEXT: LBB16_12: ## %else10 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $6, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je LBB16_14 ; SSE4-NEXT: ## %bb.13: ## %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm2, 6(%rdi) ; SSE4-NEXT: LBB16_14: ## %else12 -; SSE4-NEXT: pextrb $7, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je LBB16_16 ; SSE4-NEXT: ## %bb.15: ## %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm2, 7(%rdi) ; SSE4-NEXT: LBB16_16: ## %else14 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $8, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testl $256, %eax ## imm = 0x100 ; SSE4-NEXT: je LBB16_18 ; SSE4-NEXT: ## %bb.17: ## %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm2, 8(%rdi) ; SSE4-NEXT: LBB16_18: ## %else16 -; SSE4-NEXT: pextrb $9, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax ## imm = 0x200 ; SSE4-NEXT: je LBB16_20 ; SSE4-NEXT: ## %bb.19: ## %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm2, 9(%rdi) ; SSE4-NEXT: LBB16_20: ## %else18 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $10, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testl $1024, %eax ## imm = 0x400 ; SSE4-NEXT: je LBB16_22 ; SSE4-NEXT: ## %bb.21: ## %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm2, 10(%rdi) ; SSE4-NEXT: LBB16_22: ## %else20 -; SSE4-NEXT: pextrb $11, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax ## imm = 0x800 ; SSE4-NEXT: je LBB16_24 ; SSE4-NEXT: ## %bb.23: ## %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm2, 11(%rdi) ; SSE4-NEXT: LBB16_24: ## %else22 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm4 -; SSE4-NEXT: pextrb $12, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testl $4096, %eax ## imm = 0x1000 ; SSE4-NEXT: je LBB16_26 ; SSE4-NEXT: ## %bb.25: ## %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm2, 12(%rdi) ; SSE4-NEXT: LBB16_26: ## %else24 -; SSE4-NEXT: pextrb $13, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax ## imm = 0x2000 ; SSE4-NEXT: je LBB16_28 ; SSE4-NEXT: ## %bb.27: ## %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm2, 13(%rdi) ; SSE4-NEXT: LBB16_28: ## %else26 ; SSE4-NEXT: pxor %xmm4, %xmm4 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm0 -; SSE4-NEXT: pextrb $14, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $16384, %eax ## imm = 0x4000 ; SSE4-NEXT: je LBB16_30 ; SSE4-NEXT: ## %bb.29: ## %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm2, 14(%rdi) ; SSE4-NEXT: LBB16_30: ## %else28 -; SSE4-NEXT: pextrb $15, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax ## imm = 0x8000 ; SSE4-NEXT: je LBB16_32 ; SSE4-NEXT: ## %bb.31: ## %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm2, 15(%rdi) ; SSE4-NEXT: LBB16_32: ## %else30 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $65536, %eax ## imm = 0x10000 ; SSE4-NEXT: je LBB16_34 ; SSE4-NEXT: ## %bb.33: ## %cond.store31 ; SSE4-NEXT: pextrb $0, %xmm3, 16(%rdi) ; SSE4-NEXT: LBB16_34: ## %else32 -; SSE4-NEXT: pextrb $1, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $131072, %eax ## imm = 0x20000 ; SSE4-NEXT: je LBB16_36 ; SSE4-NEXT: ## %bb.35: ## %cond.store33 ; SSE4-NEXT: pextrb $1, %xmm3, 17(%rdi) ; SSE4-NEXT: LBB16_36: ## %else34 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $2, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $262144, %eax ## imm = 0x40000 ; SSE4-NEXT: je LBB16_38 ; SSE4-NEXT: ## %bb.37: ## %cond.store35 ; SSE4-NEXT: pextrb $2, %xmm3, 18(%rdi) ; SSE4-NEXT: LBB16_38: ## %else36 -; SSE4-NEXT: pextrb $3, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $524288, %eax ## imm = 0x80000 ; SSE4-NEXT: je LBB16_40 ; SSE4-NEXT: ## %bb.39: ## %cond.store37 ; SSE4-NEXT: pextrb $3, %xmm3, 19(%rdi) ; SSE4-NEXT: LBB16_40: ## %else38 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1048576, %eax ## imm = 0x100000 ; SSE4-NEXT: je LBB16_42 ; SSE4-NEXT: ## %bb.41: ## %cond.store39 ; SSE4-NEXT: pextrb $4, %xmm3, 20(%rdi) ; SSE4-NEXT: LBB16_42: ## %else40 -; SSE4-NEXT: pextrb $5, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2097152, %eax ## imm = 0x200000 ; SSE4-NEXT: je LBB16_44 ; SSE4-NEXT: ## %bb.43: ## %cond.store41 ; SSE4-NEXT: pextrb $5, %xmm3, 21(%rdi) ; SSE4-NEXT: LBB16_44: ## %else42 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $6, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $4194304, %eax ## imm = 0x400000 ; SSE4-NEXT: je LBB16_46 ; SSE4-NEXT: ## %bb.45: ## %cond.store43 ; SSE4-NEXT: pextrb $6, %xmm3, 22(%rdi) ; SSE4-NEXT: LBB16_46: ## %else44 -; SSE4-NEXT: pextrb $7, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8388608, %eax ## imm = 0x800000 ; SSE4-NEXT: je LBB16_48 ; SSE4-NEXT: ## %bb.47: ## %cond.store45 ; SSE4-NEXT: pextrb $7, %xmm3, 23(%rdi) ; SSE4-NEXT: LBB16_48: ## %else46 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; SSE4-NEXT: je LBB16_50 ; SSE4-NEXT: ## %bb.49: ## %cond.store47 ; SSE4-NEXT: pextrb $8, %xmm3, 24(%rdi) ; SSE4-NEXT: LBB16_50: ## %else48 -; SSE4-NEXT: pextrb $9, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; SSE4-NEXT: je LBB16_52 ; SSE4-NEXT: ## %bb.51: ## %cond.store49 ; SSE4-NEXT: pextrb $9, %xmm3, 25(%rdi) ; SSE4-NEXT: LBB16_52: ## %else50 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $10, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; SSE4-NEXT: je LBB16_54 ; SSE4-NEXT: ## %bb.53: ## %cond.store51 ; SSE4-NEXT: pextrb $10, %xmm3, 26(%rdi) ; SSE4-NEXT: LBB16_54: ## %else52 -; SSE4-NEXT: pextrb $11, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; SSE4-NEXT: je LBB16_56 ; SSE4-NEXT: ## %bb.55: ## %cond.store53 ; SSE4-NEXT: pextrb $11, %xmm3, 27(%rdi) ; SSE4-NEXT: LBB16_56: ## %else54 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; SSE4-NEXT: je LBB16_58 ; SSE4-NEXT: ## %bb.57: ## %cond.store55 ; SSE4-NEXT: pextrb $12, %xmm3, 28(%rdi) ; SSE4-NEXT: LBB16_58: ## %else56 -; SSE4-NEXT: pextrb $13, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; SSE4-NEXT: je LBB16_60 ; SSE4-NEXT: ## %bb.59: ## %cond.store57 ; SSE4-NEXT: pextrb $13, %xmm3, 29(%rdi) ; SSE4-NEXT: LBB16_60: ## %else58 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm1 -; SSE4-NEXT: pextrb $14, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB16_62 -; SSE4-NEXT: ## %bb.61: ## %cond.store59 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; SSE4-NEXT: jne LBB16_61 +; SSE4-NEXT: ## %bb.62: ## %else60 +; SSE4-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; SSE4-NEXT: jne LBB16_63 +; SSE4-NEXT: LBB16_64: ## %else62 +; SSE4-NEXT: retq +; SSE4-NEXT: LBB16_61: ## %cond.store59 ; SSE4-NEXT: pextrb $14, %xmm3, 30(%rdi) -; SSE4-NEXT: LBB16_62: ## %else60 -; SSE4-NEXT: pextrb $15, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; SSE4-NEXT: je LBB16_64 -; SSE4-NEXT: ## %bb.63: ## %cond.store61 +; SSE4-NEXT: LBB16_63: ## %cond.store61 ; SSE4-NEXT: pextrb $15, %xmm3, 31(%rdi) -; SSE4-NEXT: LBB16_64: ## %else62 ; SSE4-NEXT: retq ; ; AVX1-LABEL: store_v32i8_v32i8: ; AVX1: ## %bb.0: ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, %eax +; AVX1-NEXT: vpmovmskb %xmm3, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je LBB16_2 ; AVX1-NEXT: ## %bb.1: ## %cond.store ; AVX1-NEXT: vpextrb $0, %xmm1, (%rdi) ; AVX1-NEXT: LBB16_2: ## %else ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je LBB16_4 ; AVX1-NEXT: ## %bb.3: ## %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm1, 1(%rdi) ; AVX1-NEXT: LBB16_4: ## %else2 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je LBB16_6 ; AVX1-NEXT: ## %bb.5: ## %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm1, 2(%rdi) ; AVX1-NEXT: LBB16_6: ## %else4 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je LBB16_8 ; AVX1-NEXT: ## %bb.7: ## %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm1, 3(%rdi) ; AVX1-NEXT: LBB16_8: ## %else6 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je LBB16_10 ; AVX1-NEXT: ## %bb.9: ## %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm1, 4(%rdi) ; AVX1-NEXT: LBB16_10: ## %else8 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je LBB16_12 ; AVX1-NEXT: ## %bb.11: ## %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm1, 5(%rdi) ; AVX1-NEXT: LBB16_12: ## %else10 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je LBB16_14 ; AVX1-NEXT: ## %bb.13: ## %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm1, 6(%rdi) ; AVX1-NEXT: LBB16_14: ## %else12 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je LBB16_16 ; AVX1-NEXT: ## %bb.15: ## %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm1, 7(%rdi) ; AVX1-NEXT: LBB16_16: ## %else14 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $256, %eax ## imm = 0x100 ; AVX1-NEXT: je LBB16_18 ; AVX1-NEXT: ## %bb.17: ## %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm1, 8(%rdi) ; AVX1-NEXT: LBB16_18: ## %else16 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $512, %eax ## imm = 0x200 ; AVX1-NEXT: je LBB16_20 ; AVX1-NEXT: ## %bb.19: ## %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm1, 9(%rdi) ; AVX1-NEXT: LBB16_20: ## %else18 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX1-NEXT: je LBB16_22 ; AVX1-NEXT: ## %bb.21: ## %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm1, 10(%rdi) ; AVX1-NEXT: LBB16_22: ## %else20 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX1-NEXT: je LBB16_24 ; AVX1-NEXT: ## %bb.23: ## %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm1, 11(%rdi) ; AVX1-NEXT: LBB16_24: ## %else22 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX1-NEXT: je LBB16_26 ; AVX1-NEXT: ## %bb.25: ## %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm1, 12(%rdi) ; AVX1-NEXT: LBB16_26: ## %else24 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX1-NEXT: je LBB16_28 ; AVX1-NEXT: ## %bb.27: ## %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm1, 13(%rdi) ; AVX1-NEXT: LBB16_28: ## %else26 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $14, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX1-NEXT: je LBB16_30 ; AVX1-NEXT: ## %bb.29: ## %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm1, 14(%rdi) ; AVX1-NEXT: LBB16_30: ## %else28 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $15, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX1-NEXT: je LBB16_32 ; AVX1-NEXT: ## %bb.31: ## %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm1, 15(%rdi) @@ -3540,15 +3593,15 @@ ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $65536, %eax ## imm = 0x10000 ; AVX1-NEXT: je LBB16_34 ; AVX1-NEXT: ## %bb.33: ## %cond.store31 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX1-NEXT: LBB16_34: ## %else32 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $131072, %eax ## imm = 0x20000 ; AVX1-NEXT: je LBB16_36 ; AVX1-NEXT: ## %bb.35: ## %cond.store33 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3556,15 +3609,15 @@ ; AVX1-NEXT: LBB16_36: ## %else34 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $262144, %eax ## imm = 0x40000 ; AVX1-NEXT: je LBB16_38 ; AVX1-NEXT: ## %bb.37: ## %cond.store35 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX1-NEXT: LBB16_38: ## %else36 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $524288, %eax ## imm = 0x80000 ; AVX1-NEXT: je LBB16_40 ; AVX1-NEXT: ## %bb.39: ## %cond.store37 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3572,15 +3625,15 @@ ; AVX1-NEXT: LBB16_40: ## %else38 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1048576, %eax ## imm = 0x100000 ; AVX1-NEXT: je LBB16_42 ; AVX1-NEXT: ## %bb.41: ## %cond.store39 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX1-NEXT: LBB16_42: ## %else40 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2097152, %eax ## imm = 0x200000 ; AVX1-NEXT: je LBB16_44 ; AVX1-NEXT: ## %bb.43: ## %cond.store41 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3588,15 +3641,15 @@ ; AVX1-NEXT: LBB16_44: ## %else42 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $4194304, %eax ## imm = 0x400000 ; AVX1-NEXT: je LBB16_46 ; AVX1-NEXT: ## %bb.45: ## %cond.store43 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX1-NEXT: LBB16_46: ## %else44 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8388608, %eax ## imm = 0x800000 ; AVX1-NEXT: je LBB16_48 ; AVX1-NEXT: ## %bb.47: ## %cond.store45 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3604,15 +3657,15 @@ ; AVX1-NEXT: LBB16_48: ## %else46 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; AVX1-NEXT: je LBB16_50 ; AVX1-NEXT: ## %bb.49: ## %cond.store47 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX1-NEXT: LBB16_50: ## %else48 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; AVX1-NEXT: je LBB16_52 ; AVX1-NEXT: ## %bb.51: ## %cond.store49 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3620,15 +3673,15 @@ ; AVX1-NEXT: LBB16_52: ## %else50 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; AVX1-NEXT: je LBB16_54 ; AVX1-NEXT: ## %bb.53: ## %cond.store51 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX1-NEXT: LBB16_54: ## %else52 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; AVX1-NEXT: je LBB16_56 ; AVX1-NEXT: ## %bb.55: ## %cond.store53 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3636,15 +3689,15 @@ ; AVX1-NEXT: LBB16_56: ## %else54 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; AVX1-NEXT: je LBB16_58 ; AVX1-NEXT: ## %bb.57: ## %cond.store55 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 +; AVX1-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX1-NEXT: LBB16_58: ## %else56 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; AVX1-NEXT: je LBB16_60 ; AVX1-NEXT: ## %bb.59: ## %cond.store57 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 @@ -3652,20 +3705,24 @@ ; AVX1-NEXT: LBB16_60: ## %else58 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $14, %xmm0, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je LBB16_62 -; AVX1-NEXT: ## %bb.61: ## %cond.store59 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX1-NEXT: LBB16_62: ## %else60 -; AVX1-NEXT: vpextrb $15, %xmm0, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm0, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX1-NEXT: jne LBB16_61 +; AVX1-NEXT: ## %bb.62: ## %else60 +; AVX1-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX1-NEXT: jne LBB16_63 +; AVX1-NEXT: LBB16_64: ## %else62 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: LBB16_61: ## %cond.store59 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 +; AVX1-NEXT: vpextrb $14, %xmm0, 30(%rdi) +; AVX1-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX1-NEXT: je LBB16_64 -; AVX1-NEXT: ## %bb.63: ## %cond.store61 +; AVX1-NEXT: LBB16_63: ## %cond.store61 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm0 ; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX1-NEXT: LBB16_64: ## %else62 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -3673,128 +3730,118 @@ ; AVX2: ## %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vpmovmskb %ymm2, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je LBB16_2 ; AVX2-NEXT: ## %bb.1: ## %cond.store ; AVX2-NEXT: vpextrb $0, %xmm1, (%rdi) ; AVX2-NEXT: LBB16_2: ## %else -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je LBB16_4 ; AVX2-NEXT: ## %bb.3: ## %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm1, 1(%rdi) ; AVX2-NEXT: LBB16_4: ## %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je LBB16_6 ; AVX2-NEXT: ## %bb.5: ## %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm1, 2(%rdi) ; AVX2-NEXT: LBB16_6: ## %else4 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je LBB16_8 ; AVX2-NEXT: ## %bb.7: ## %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm1, 3(%rdi) ; AVX2-NEXT: LBB16_8: ## %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je LBB16_10 ; AVX2-NEXT: ## %bb.9: ## %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm1, 4(%rdi) ; AVX2-NEXT: LBB16_10: ## %else8 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je LBB16_12 ; AVX2-NEXT: ## %bb.11: ## %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm1, 5(%rdi) ; AVX2-NEXT: LBB16_12: ## %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je LBB16_14 ; AVX2-NEXT: ## %bb.13: ## %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm1, 6(%rdi) ; AVX2-NEXT: LBB16_14: ## %else12 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je LBB16_16 ; AVX2-NEXT: ## %bb.15: ## %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm1, 7(%rdi) ; AVX2-NEXT: LBB16_16: ## %else14 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $256, %eax ## imm = 0x100 ; AVX2-NEXT: je LBB16_18 ; AVX2-NEXT: ## %bb.17: ## %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm1, 8(%rdi) ; AVX2-NEXT: LBB16_18: ## %else16 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax ## imm = 0x200 ; AVX2-NEXT: je LBB16_20 ; AVX2-NEXT: ## %bb.19: ## %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm1, 9(%rdi) ; AVX2-NEXT: LBB16_20: ## %else18 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX2-NEXT: je LBB16_22 ; AVX2-NEXT: ## %bb.21: ## %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm1, 10(%rdi) ; AVX2-NEXT: LBB16_22: ## %else20 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX2-NEXT: je LBB16_24 ; AVX2-NEXT: ## %bb.23: ## %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm1, 11(%rdi) ; AVX2-NEXT: LBB16_24: ## %else22 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX2-NEXT: je LBB16_26 ; AVX2-NEXT: ## %bb.25: ## %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm1, 12(%rdi) ; AVX2-NEXT: LBB16_26: ## %else24 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX2-NEXT: je LBB16_28 ; AVX2-NEXT: ## %bb.27: ## %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm1, 13(%rdi) ; AVX2-NEXT: LBB16_28: ## %else26 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX2-NEXT: je LBB16_30 ; AVX2-NEXT: ## %bb.29: ## %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm1, 14(%rdi) ; AVX2-NEXT: LBB16_30: ## %else28 -; AVX2-NEXT: vpextrb $15, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX2-NEXT: je LBB16_32 ; AVX2-NEXT: ## %bb.31: ## %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm1, 15(%rdi) ; AVX2-NEXT: LBB16_32: ## %else30 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $65536, %eax ## imm = 0x10000 ; AVX2-NEXT: je LBB16_34 ; AVX2-NEXT: ## %bb.33: ## %cond.store31 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX2-NEXT: LBB16_34: ## %else32 -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $131072, %eax ## imm = 0x20000 ; AVX2-NEXT: je LBB16_36 ; AVX2-NEXT: ## %bb.35: ## %cond.store33 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3802,16 +3849,14 @@ ; AVX2-NEXT: LBB16_36: ## %else34 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $262144, %eax ## imm = 0x40000 ; AVX2-NEXT: je LBB16_38 ; AVX2-NEXT: ## %bb.37: ## %cond.store35 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX2-NEXT: LBB16_38: ## %else36 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $524288, %eax ## imm = 0x80000 ; AVX2-NEXT: je LBB16_40 ; AVX2-NEXT: ## %bb.39: ## %cond.store37 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3819,16 +3864,14 @@ ; AVX2-NEXT: LBB16_40: ## %else38 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $1048576, %eax ## imm = 0x100000 ; AVX2-NEXT: je LBB16_42 ; AVX2-NEXT: ## %bb.41: ## %cond.store39 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX2-NEXT: LBB16_42: ## %else40 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2097152, %eax ## imm = 0x200000 ; AVX2-NEXT: je LBB16_44 ; AVX2-NEXT: ## %bb.43: ## %cond.store41 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3836,16 +3879,14 @@ ; AVX2-NEXT: LBB16_44: ## %else42 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $4194304, %eax ## imm = 0x400000 ; AVX2-NEXT: je LBB16_46 ; AVX2-NEXT: ## %bb.45: ## %cond.store43 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX2-NEXT: LBB16_46: ## %else44 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8388608, %eax ## imm = 0x800000 ; AVX2-NEXT: je LBB16_48 ; AVX2-NEXT: ## %bb.47: ## %cond.store45 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3853,16 +3894,14 @@ ; AVX2-NEXT: LBB16_48: ## %else46 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; AVX2-NEXT: je LBB16_50 ; AVX2-NEXT: ## %bb.49: ## %cond.store47 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX2-NEXT: LBB16_50: ## %else48 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; AVX2-NEXT: je LBB16_52 ; AVX2-NEXT: ## %bb.51: ## %cond.store49 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3870,16 +3909,14 @@ ; AVX2-NEXT: LBB16_52: ## %else50 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; AVX2-NEXT: je LBB16_54 ; AVX2-NEXT: ## %bb.53: ## %cond.store51 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX2-NEXT: LBB16_54: ## %else52 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; AVX2-NEXT: je LBB16_56 ; AVX2-NEXT: ## %bb.55: ## %cond.store53 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3887,16 +3924,14 @@ ; AVX2-NEXT: LBB16_56: ## %else54 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm2, %eax +; AVX2-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; AVX2-NEXT: je LBB16_58 ; AVX2-NEXT: ## %bb.57: ## %cond.store55 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm3 -; AVX2-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 +; AVX2-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX2-NEXT: LBB16_58: ## %else56 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; AVX2-NEXT: je LBB16_60 ; AVX2-NEXT: ## %bb.59: ## %cond.store57 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -3904,21 +3939,23 @@ ; AVX2-NEXT: LBB16_60: ## %else58 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX2-NEXT: vpextrb $14, %xmm0, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je LBB16_62 -; AVX2-NEXT: ## %bb.61: ## %cond.store59 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX2-NEXT: LBB16_62: ## %else60 -; AVX2-NEXT: vpextrb $15, %xmm0, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %ymm0, %eax +; AVX2-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX2-NEXT: jne LBB16_61 +; AVX2-NEXT: ## %bb.62: ## %else60 +; AVX2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX2-NEXT: jne LBB16_63 +; AVX2-NEXT: LBB16_64: ## %else62 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: LBB16_61: ## %cond.store59 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 +; AVX2-NEXT: vpextrb $14, %xmm0, 30(%rdi) +; AVX2-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX2-NEXT: je LBB16_64 -; AVX2-NEXT: ## %bb.63: ## %cond.store61 +; AVX2-NEXT: LBB16_63: ## %cond.store61 ; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX2-NEXT: LBB16_64: ## %else62 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -3926,178 +3963,118 @@ ; AVX512F: ## %bb.0: ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kmovw %k0, %eax +; AVX512F-NEXT: vpmovmskb %ymm2, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je LBB16_2 ; AVX512F-NEXT: ## %bb.1: ## %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm1, (%rdi) ; AVX512F-NEXT: LBB16_2: ## %else -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je LBB16_4 ; AVX512F-NEXT: ## %bb.3: ## %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm1, 1(%rdi) ; AVX512F-NEXT: LBB16_4: ## %else2 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je LBB16_6 ; AVX512F-NEXT: ## %bb.5: ## %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm1, 2(%rdi) ; AVX512F-NEXT: LBB16_6: ## %else4 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je LBB16_8 ; AVX512F-NEXT: ## %bb.7: ## %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm1, 3(%rdi) ; AVX512F-NEXT: LBB16_8: ## %else6 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je LBB16_10 ; AVX512F-NEXT: ## %bb.9: ## %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm1, 4(%rdi) ; AVX512F-NEXT: LBB16_10: ## %else8 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je LBB16_12 ; AVX512F-NEXT: ## %bb.11: ## %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm1, 5(%rdi) ; AVX512F-NEXT: LBB16_12: ## %else10 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je LBB16_14 ; AVX512F-NEXT: ## %bb.13: ## %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm1, 6(%rdi) ; AVX512F-NEXT: LBB16_14: ## %else12 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je LBB16_16 ; AVX512F-NEXT: ## %bb.15: ## %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm1, 7(%rdi) ; AVX512F-NEXT: LBB16_16: ## %else14 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $256, %eax ## imm = 0x100 ; AVX512F-NEXT: je LBB16_18 ; AVX512F-NEXT: ## %bb.17: ## %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm1, 8(%rdi) ; AVX512F-NEXT: LBB16_18: ## %else16 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $512, %eax ## imm = 0x200 ; AVX512F-NEXT: je LBB16_20 ; AVX512F-NEXT: ## %bb.19: ## %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm1, 9(%rdi) ; AVX512F-NEXT: LBB16_20: ## %else18 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $1024, %eax ## imm = 0x400 ; AVX512F-NEXT: je LBB16_22 ; AVX512F-NEXT: ## %bb.21: ## %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm1, 10(%rdi) ; AVX512F-NEXT: LBB16_22: ## %else20 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $2048, %eax ## imm = 0x800 ; AVX512F-NEXT: je LBB16_24 ; AVX512F-NEXT: ## %bb.23: ## %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm1, 11(%rdi) ; AVX512F-NEXT: LBB16_24: ## %else22 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $4096, %eax ## imm = 0x1000 ; AVX512F-NEXT: je LBB16_26 ; AVX512F-NEXT: ## %bb.25: ## %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm1, 12(%rdi) ; AVX512F-NEXT: LBB16_26: ## %else24 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $8192, %eax ## imm = 0x2000 ; AVX512F-NEXT: je LBB16_28 ; AVX512F-NEXT: ## %bb.27: ## %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm1, 13(%rdi) ; AVX512F-NEXT: LBB16_28: ## %else26 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $16384, %eax ## imm = 0x4000 ; AVX512F-NEXT: je LBB16_30 ; AVX512F-NEXT: ## %bb.29: ## %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm1, 14(%rdi) ; AVX512F-NEXT: LBB16_30: ## %else28 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $32768, %eax ## imm = 0x8000 ; AVX512F-NEXT: je LBB16_32 ; AVX512F-NEXT: ## %bb.31: ## %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm1, 15(%rdi) ; AVX512F-NEXT: LBB16_32: ## %else30 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $65536, %eax ## imm = 0x10000 ; AVX512F-NEXT: je LBB16_34 ; AVX512F-NEXT: ## %bb.33: ## %cond.store31 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX512F-NEXT: LBB16_34: ## %else32 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $131072, %eax ## imm = 0x20000 ; AVX512F-NEXT: je LBB16_36 ; AVX512F-NEXT: ## %bb.35: ## %cond.store33 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4105,20 +4082,14 @@ ; AVX512F-NEXT: LBB16_36: ## %else34 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $262144, %eax ## imm = 0x40000 ; AVX512F-NEXT: je LBB16_38 ; AVX512F-NEXT: ## %bb.37: ## %cond.store35 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX512F-NEXT: LBB16_38: ## %else36 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $524288, %eax ## imm = 0x80000 ; AVX512F-NEXT: je LBB16_40 ; AVX512F-NEXT: ## %bb.39: ## %cond.store37 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4126,20 +4097,14 @@ ; AVX512F-NEXT: LBB16_40: ## %else38 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $1048576, %eax ## imm = 0x100000 ; AVX512F-NEXT: je LBB16_42 ; AVX512F-NEXT: ## %bb.41: ## %cond.store39 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX512F-NEXT: LBB16_42: ## %else40 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $2097152, %eax ## imm = 0x200000 ; AVX512F-NEXT: je LBB16_44 ; AVX512F-NEXT: ## %bb.43: ## %cond.store41 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4147,20 +4112,14 @@ ; AVX512F-NEXT: LBB16_44: ## %else42 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $4194304, %eax ## imm = 0x400000 ; AVX512F-NEXT: je LBB16_46 ; AVX512F-NEXT: ## %bb.45: ## %cond.store43 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX512F-NEXT: LBB16_46: ## %else44 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $8388608, %eax ## imm = 0x800000 ; AVX512F-NEXT: je LBB16_48 ; AVX512F-NEXT: ## %bb.47: ## %cond.store45 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4168,20 +4127,14 @@ ; AVX512F-NEXT: LBB16_48: ## %else46 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $16777216, %eax ## imm = 0x1000000 ; AVX512F-NEXT: je LBB16_50 ; AVX512F-NEXT: ## %bb.49: ## %cond.store47 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX512F-NEXT: LBB16_50: ## %else48 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $33554432, %eax ## imm = 0x2000000 ; AVX512F-NEXT: je LBB16_52 ; AVX512F-NEXT: ## %bb.51: ## %cond.store49 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4189,20 +4142,14 @@ ; AVX512F-NEXT: LBB16_52: ## %else50 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $67108864, %eax ## imm = 0x4000000 ; AVX512F-NEXT: je LBB16_54 ; AVX512F-NEXT: ## %bb.53: ## %cond.store51 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX512F-NEXT: LBB16_54: ## %else52 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $134217728, %eax ## imm = 0x8000000 ; AVX512F-NEXT: je LBB16_56 ; AVX512F-NEXT: ## %bb.55: ## %cond.store53 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4210,20 +4157,14 @@ ; AVX512F-NEXT: LBB16_56: ## %else54 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm2 -; AVX512F-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $268435456, %eax ## imm = 0x10000000 ; AVX512F-NEXT: je LBB16_58 ; AVX512F-NEXT: ## %bb.57: ## %cond.store55 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 ; AVX512F-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX512F-NEXT: LBB16_58: ## %else56 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $536870912, %eax ## imm = 0x20000000 ; AVX512F-NEXT: je LBB16_60 ; AVX512F-NEXT: ## %bb.59: ## %cond.store57 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm2 @@ -4231,25 +4172,23 @@ ; AVX512F-NEXT: LBB16_60: ## %else58 ; AVX512F-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX512F-NEXT: vpcmpeqb %ymm2, %ymm0, %ymm0 -; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 -; AVX512F-NEXT: vpmovsxbd %xmm0, %zmm0 -; AVX512F-NEXT: vptestmd %zmm0, %zmm0, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k1 -; AVX512F-NEXT: kmovw %k1, %eax -; AVX512F-NEXT: testb $1, %al -; AVX512F-NEXT: je LBB16_62 -; AVX512F-NEXT: ## %bb.61: ## %cond.store59 +; AVX512F-NEXT: vpmovmskb %ymm0, %eax +; AVX512F-NEXT: testl $1073741824, %eax ## imm = 0x40000000 +; AVX512F-NEXT: jne LBB16_61 +; AVX512F-NEXT: ## %bb.62: ## %else60 +; AVX512F-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 +; AVX512F-NEXT: jne LBB16_63 +; AVX512F-NEXT: LBB16_64: ## %else62 +; AVX512F-NEXT: vzeroupper +; AVX512F-NEXT: retq +; AVX512F-NEXT: LBB16_61: ## %cond.store59 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX512F-NEXT: vpextrb $14, %xmm0, 30(%rdi) -; AVX512F-NEXT: LBB16_62: ## %else60 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: testl $-2147483648, %eax ## imm = 0x80000000 ; AVX512F-NEXT: je LBB16_64 -; AVX512F-NEXT: ## %bb.63: ## %cond.store61 +; AVX512F-NEXT: LBB16_63: ## %cond.store61 ; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm0 ; AVX512F-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX512F-NEXT: LBB16_64: ## %else62 ; AVX512F-NEXT: vzeroupper ; AVX512F-NEXT: retq ; @@ -4405,61 +4344,38 @@ ; SimplifyDemandedBits eliminates an ashr here. define void @masked_store_bool_mask_demand_trunc_sext(<4 x double> %x, <4 x double>* %p, <4 x i32> %masksrc) { -; SSE2-LABEL: masked_store_bool_mask_demand_trunc_sext: -; SSE2: ## %bb.0: -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_2 -; SSE2-NEXT: ## %bb.1: ## %cond.store -; SSE2-NEXT: movlpd %xmm0, (%rdi) -; SSE2-NEXT: LBB23_2: ## %else -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_4 -; SSE2-NEXT: ## %bb.3: ## %cond.store1 -; SSE2-NEXT: movhpd %xmm0, 8(%rdi) -; SSE2-NEXT: LBB23_4: ## %else2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_6 -; SSE2-NEXT: ## %bb.5: ## %cond.store3 -; SSE2-NEXT: movlpd %xmm1, 16(%rdi) -; SSE2-NEXT: LBB23_6: ## %else4 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je LBB23_8 -; SSE2-NEXT: ## %bb.7: ## %cond.store5 -; SSE2-NEXT: movhpd %xmm1, 24(%rdi) -; SSE2-NEXT: LBB23_8: ## %else6 -; SSE2-NEXT: retq -; -; SSE4-LABEL: masked_store_bool_mask_demand_trunc_sext: -; SSE4: ## %bb.0: -; SSE4-NEXT: pextrb $0, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB23_2 -; SSE4-NEXT: ## %bb.1: ## %cond.store -; SSE4-NEXT: movlpd %xmm0, (%rdi) -; SSE4-NEXT: LBB23_2: ## %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB23_4 -; SSE4-NEXT: ## %bb.3: ## %cond.store1 -; SSE4-NEXT: movhpd %xmm0, 8(%rdi) -; SSE4-NEXT: LBB23_4: ## %else2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB23_6 -; SSE4-NEXT: ## %bb.5: ## %cond.store3 -; SSE4-NEXT: movlpd %xmm1, 16(%rdi) -; SSE4-NEXT: LBB23_6: ## %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je LBB23_8 -; SSE4-NEXT: ## %bb.7: ## %cond.store5 -; SSE4-NEXT: movhpd %xmm1, 24(%rdi) -; SSE4-NEXT: LBB23_8: ## %else6 -; SSE4-NEXT: retq +; SSE-LABEL: masked_store_bool_mask_demand_trunc_sext: +; SSE: ## %bb.0: +; SSE-NEXT: pslld $31, %xmm2 +; SSE-NEXT: movmskps %xmm2, %eax +; SSE-NEXT: testb $1, %al +; SSE-NEXT: jne LBB23_1 +; SSE-NEXT: ## %bb.2: ## %else +; SSE-NEXT: testb $2, %al +; SSE-NEXT: jne LBB23_3 +; SSE-NEXT: LBB23_4: ## %else2 +; SSE-NEXT: testb $4, %al +; SSE-NEXT: jne LBB23_5 +; SSE-NEXT: LBB23_6: ## %else4 +; SSE-NEXT: testb $8, %al +; SSE-NEXT: jne LBB23_7 +; SSE-NEXT: LBB23_8: ## %else6 +; SSE-NEXT: retq +; SSE-NEXT: LBB23_1: ## %cond.store +; SSE-NEXT: movlpd %xmm0, (%rdi) +; SSE-NEXT: testb $2, %al +; SSE-NEXT: je LBB23_4 +; SSE-NEXT: LBB23_3: ## %cond.store1 +; SSE-NEXT: movhpd %xmm0, 8(%rdi) +; SSE-NEXT: testb $4, %al +; SSE-NEXT: je LBB23_6 +; SSE-NEXT: LBB23_5: ## %cond.store3 +; SSE-NEXT: movlpd %xmm1, 16(%rdi) +; SSE-NEXT: testb $8, %al +; SSE-NEXT: je LBB23_8 +; SSE-NEXT: LBB23_7: ## %cond.store5 +; SSE-NEXT: movhpd %xmm1, 24(%rdi) +; SSE-NEXT: retq ; ; AVX1-LABEL: masked_store_bool_mask_demand_trunc_sext: ; AVX1: ## %bb.0: @@ -4512,26 +4428,25 @@ ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] ; SSE2-NEXT: pand %xmm2, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax +; SSE2-NEXT: movmskps %xmm2, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je LBB24_2 ; SSE2-NEXT: ## %bb.1: ## %cond.store ; SSE2-NEXT: movss %xmm0, (%rdi) ; SSE2-NEXT: LBB24_2: ## %else -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je LBB24_4 ; SSE2-NEXT: ## %bb.3: ## %cond.store1 -; SSE2-NEXT: movaps %xmm0, %xmm3 -; SSE2-NEXT: shufps {{.*#+}} xmm3 = xmm3[1,1],xmm0[2,3] -; SSE2-NEXT: movss %xmm3, 4(%rdi) +; SSE2-NEXT: movaps %xmm0, %xmm2 +; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[1,1],xmm0[2,3] +; SSE2-NEXT: movss %xmm2, 4(%rdi) ; SSE2-NEXT: LBB24_4: ## %else2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je LBB24_6 ; SSE2-NEXT: ## %bb.5: ## %cond.store3 ; SSE2-NEXT: movaps %xmm0, %xmm2 @@ -4542,8 +4457,8 @@ ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movmskps %xmm2, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je LBB24_8 ; SSE2-NEXT: ## %bb.7: ## %cond.store5 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,1,2,3] @@ -4556,24 +4471,23 @@ ; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648,2147483648,2147483648] ; SSE4-NEXT: pand %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movmskps %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je LBB24_2 ; SSE4-NEXT: ## %bb.1: ## %cond.store ; SSE4-NEXT: movss %xmm0, (%rdi) ; SSE4-NEXT: LBB24_2: ## %else -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je LBB24_4 ; SSE4-NEXT: ## %bb.3: ## %cond.store1 ; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi) ; SSE4-NEXT: LBB24_4: ## %else2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je LBB24_6 ; SSE4-NEXT: ## %bb.5: ## %cond.store3 ; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi) @@ -4582,8 +4496,8 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je LBB24_8 ; SSE4-NEXT: ## %bb.7: ## %cond.store5 ; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi) Index: test/CodeGen/X86/masked_store_trunc.ll =================================================================== --- test/CodeGen/X86/masked_store_trunc.ll +++ test/CodeGen/X86/masked_store_trunc.ll @@ -17,17 +17,18 @@ ; SSE2-NEXT: pxor %xmm7, %xmm6 ; SSE2-NEXT: movdqa %xmm6, %xmm7 ; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE2-NEXT: movd %xmm7, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB0_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movss %xmm0, (%rdi) ; SSE2-NEXT: .LBB0_2: # %else -; SSE2-NEXT: psrlq $16, %xmm6 -; SSE2-NEXT: movd %xmm6, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB0_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] @@ -37,15 +38,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB0_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm4, 8(%rdi) ; SSE2-NEXT: .LBB0_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB0_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] @@ -56,14 +62,18 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB0_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: movss %xmm2, 16(%rdi) ; SSE2-NEXT: .LBB0_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB0_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3] @@ -73,15 +83,19 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB0_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 24(%rdi) ; SSE2-NEXT: .LBB0_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB0_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[3,1,2,3] @@ -95,48 +109,62 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 ; SSE4-NEXT: pxor %xmm7, %xmm6 +; SSE4-NEXT: movdqa %xmm6, %xmm7 +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE4-NEXT: pextrb $0, %xmm6, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB0_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: movss %xmm0, (%rdi) ; SSE4-NEXT: .LBB0_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm6 +; SSE4-NEXT: packsswb %xmm0, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB0_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi) +; SSE4-NEXT: pextrd $1, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB0_4: # %else2 ; SSE4-NEXT: xorps %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB0_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 -; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi) +; SSE4-NEXT: pextrd $2, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB0_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB0_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 -; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi) +; SSE4-NEXT: pextrd $3, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB0_8: # %else6 ; SSE4-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB0_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: movss %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB0_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB0_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: extractps $1, %xmm2, 20(%rdi) @@ -145,14 +173,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB0_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: extractps $2, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB0_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB0_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: extractps $3, %xmm2, 28(%rdi) @@ -230,28 +262,29 @@ ; SSE2-NEXT: pxor %xmm7, %xmm6 ; SSE2-NEXT: movdqa %xmm6, %xmm7 ; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm1[0,2,2,3,4,5,6,7] +; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7] -; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1] +; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm0[0,2,2,3,4,5,6,7] +; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm1[0],xmm7[1],xmm1[1] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7] +; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] -; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] -; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] -; SSE2-NEXT: movd %xmm7, %eax +; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] +; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm7[0],xmm0[1] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB1_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB1_2: # %else -; SSE2-NEXT: psrlq $16, %xmm6 -; SSE2-NEXT: movd %xmm6, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB1_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -261,15 +294,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB1_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB1_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB1_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -279,15 +317,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB1_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB1_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB1_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -297,15 +339,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB1_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB1_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB1_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -320,6 +366,10 @@ ; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 ; SSE4-NEXT: pxor %xmm7, %xmm6 +; SSE4-NEXT: movdqa %xmm6, %xmm7 +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm8[1,2,3],xmm3[4],xmm8[5,6,7] ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm8[1,2,3],xmm2[4],xmm8[5,6,7] ; SSE4-NEXT: packusdw %xmm3, %xmm2 @@ -327,14 +377,15 @@ ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1,2,3],xmm0[4],xmm8[5,6,7] ; SSE4-NEXT: packusdw %xmm1, %xmm0 ; SSE4-NEXT: packusdw %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm6, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB1_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB1_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm6 +; SSE4-NEXT: packsswb %xmm0, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB1_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -343,14 +394,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB1_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB1_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB1_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -359,14 +415,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB1_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB1_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB1_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -375,14 +435,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB1_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB1_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB1_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -395,15 +459,15 @@ ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [65535,65535,65535,65535] -; AVX1-NEXT: vandps %ymm6, %ymm1, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vandps %ymm6, %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovaps {{.*#+}} ymm5 = [65535,65535,65535,65535] +; AVX1-NEXT: vandps %ymm5, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpackusdw %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vandps %ymm5, %ymm0, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB1_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -411,8 +475,8 @@ ; AVX1-NEXT: .LBB1_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB1_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -421,16 +485,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB1_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB1_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB1_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -440,30 +504,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB1_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB1_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB1_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB1_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB1_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB1_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB1_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -475,79 +543,75 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2] -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2] +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm3 +; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 +; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] ; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB1_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB1_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB1_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB1_4: # %else2 -; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB1_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB1_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB1_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB1_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB1_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB1_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB1_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB1_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB1_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB1_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB1_15 +; AVX2-NEXT: .LBB1_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB1_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB1_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB1_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB1_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB1_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -650,28 +714,29 @@ ; SSE2-NEXT: pxor %xmm7, %xmm6 ; SSE2-NEXT: movdqa %xmm6, %xmm7 ; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm8 = xmm1[0,2,2,3,4,5,6,7] +; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm1[0,2,2,3,4,5,6,7] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,2,2,3,4,5,6,7] -; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm8[0],xmm1[1],xmm8[1] +; SSE2-NEXT: pshuflw {{.*#+}} xmm7 = xmm0[0,2,2,3,4,5,6,7] +; SSE2-NEXT: punpckldq {{.*#+}} xmm7 = xmm7[0],xmm1[0],xmm7[1],xmm1[1] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[0,2,2,3] -; SSE2-NEXT: pshuflw {{.*#+}} xmm3 = xmm0[0,1,0,2,4,5,6,7] +; SSE2-NEXT: pshuflw {{.*#+}} xmm1 = xmm0[0,1,0,2,4,5,6,7] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] -; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm3[0],xmm0[1],xmm3[1] -; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] -; SSE2-NEXT: movd %xmm7, %eax +; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1] +; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm7[0],xmm0[1] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB2_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB2_2: # %else -; SSE2-NEXT: psrlq $16, %xmm6 -; SSE2-NEXT: movd %xmm6, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB2_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -682,15 +747,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB2_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB2_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB2_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -700,15 +770,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB2_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB2_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB2_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -718,15 +792,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB2_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB2_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB2_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -741,6 +819,10 @@ ; SSE4-NEXT: pcmpeqd %xmm8, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 ; SSE4-NEXT: pxor %xmm7, %xmm6 +; SSE4-NEXT: movdqa %xmm6, %xmm7 +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm8[1,2,3],xmm3[4],xmm8[5,6,7] ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm8[1,2,3],xmm2[4],xmm8[5,6,7] ; SSE4-NEXT: packusdw %xmm3, %xmm2 @@ -748,14 +830,15 @@ ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1,2,3],xmm0[4],xmm8[5,6,7] ; SSE4-NEXT: packusdw %xmm1, %xmm0 ; SSE4-NEXT: packusdw %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm6, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB2_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB2_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm6 +; SSE4-NEXT: packsswb %xmm0, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB2_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -764,14 +847,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB2_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB2_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB2_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -780,14 +868,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB2_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB2_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB2_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -796,14 +888,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB2_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB2_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB2_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -816,15 +912,15 @@ ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [65535,65535,65535,65535] -; AVX1-NEXT: vandps %ymm6, %ymm1, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vandps %ymm6, %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovaps {{.*#+}} ymm5 = [65535,65535,65535,65535] +; AVX1-NEXT: vandps %ymm5, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpackusdw %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vandps %ymm5, %ymm0, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB2_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -832,8 +928,8 @@ ; AVX1-NEXT: .LBB2_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB2_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -842,16 +938,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB2_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB2_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB2_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -861,30 +957,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB2_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB2_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB2_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB2_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB2_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB2_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB2_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -896,79 +996,75 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm6[0,2] -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm6[0,2] +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vextractf128 $1, %ymm1, %xmm3 +; AVX2-NEXT: vshufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 +; AVX2-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] ; AVX2-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB2_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB2_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB2_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB2_4: # %else2 -; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 +; AVX2-NEXT: vxorps %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB2_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB2_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB2_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB2_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB2_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB2_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB2_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB2_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB2_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB2_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB2_15 +; AVX2-NEXT: .LBB2_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB2_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB2_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB2_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB2_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB2_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -1067,59 +1163,57 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB3_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movss %xmm0, (%rdi) ; SSE2-NEXT: .LBB3_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB3_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm3, 4(%rdi) +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] +; SSE2-NEXT: movd %xmm1, 4(%rdi) ; SSE2-NEXT: .LBB3_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 +; SSE2-NEXT: xorps %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB3_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB3_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB3_7 +; SSE2-NEXT: .LBB3_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB3_5: # %cond.store3 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 8(%rdi) -; SSE2-NEXT: .LBB3_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB3_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB3_7: # %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) -; SSE2-NEXT: .LBB3_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i32: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm4, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm4, %xmm3 +; SSE4-NEXT: pxor %xmm3, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB3_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: movss %xmm0, (%rdi) ; SSE4-NEXT: .LBB3_2: # %else -; SSE4-NEXT: pextrb $4, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB3_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: extractps $1, %xmm0, 4(%rdi) @@ -1128,18 +1222,20 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB3_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm1, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB3_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB3_7 +; SSE4-NEXT: .LBB3_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB3_5: # %cond.store3 ; SSE4-NEXT: extractps $2, %xmm0, 8(%rdi) -; SSE4-NEXT: .LBB3_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB3_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB3_7: # %cond.store5 ; SSE4-NEXT: extractps $3, %xmm0, 12(%rdi) -; SSE4-NEXT: .LBB3_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i32: @@ -1207,60 +1303,58 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB4_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB4_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB4_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) ; SSE2-NEXT: .LBB4_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB4_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB4_6: # %else4 +; SSE2-NEXT: xorps %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB4_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB4_7 +; SSE2-NEXT: .LBB4_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB4_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB4_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB4_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB4_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i16: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm4, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm4, %xmm3 +; SSE4-NEXT: pxor %xmm3, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB4_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB4_2: # %else -; SSE4-NEXT: pextrb $4, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB4_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm0, 2(%rdi) @@ -1269,18 +1363,20 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB4_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm1, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB4_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB4_7 +; SSE4-NEXT: .LBB4_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB4_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm0, 4(%rdi) -; SSE4-NEXT: .LBB4_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB4_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB4_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm0, 6(%rdi) -; SSE4-NEXT: .LBB4_8: # %else6 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v4i64_v4i16: @@ -1289,36 +1385,38 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] -; AVX-NEXT: vpextrb $0, %xmm2, %eax +; AVX-NEXT: vmovmskps %xmm2, %eax +; AVX-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB4_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB4_2: # %else -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB4_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrw $2, %xmm0, 2(%rdi) ; AVX-NEXT: .LBB4_4: # %else2 -; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB4_6 -; AVX-NEXT: # %bb.5: # %cond.store3 +; AVX-NEXT: vmovmskps %xmm1, %eax +; AVX-NEXT: testb $4, %al +; AVX-NEXT: jne .LBB4_5 +; AVX-NEXT: # %bb.6: # %else4 +; AVX-NEXT: testb $8, %al +; AVX-NEXT: jne .LBB4_7 +; AVX-NEXT: .LBB4_8: # %else6 +; AVX-NEXT: vzeroupper +; AVX-NEXT: retq +; AVX-NEXT: .LBB4_5: # %cond.store3 ; AVX-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX-NEXT: .LBB4_6: # %else4 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB4_8 -; AVX-NEXT: # %bb.7: # %cond.store5 +; AVX-NEXT: .LBB4_7: # %cond.store5 ; AVX-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX-NEXT: .LBB4_8: # %else6 ; AVX-NEXT: vzeroupper ; AVX-NEXT: retq ; @@ -1391,60 +1489,58 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB5_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB5_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB5_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 1(%rdi) ; SSE2-NEXT: .LBB5_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB5_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB5_6: # %else4 +; SSE2-NEXT: xorps %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB5_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB5_7 +; SSE2-NEXT: .LBB5_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB5_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB5_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB5_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB5_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm4, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm4 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm4, %xmm3 +; SSE4-NEXT: pxor %xmm3, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB5_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB5_2: # %else -; SSE4-NEXT: pextrb $4, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB5_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm0, 1(%rdi) @@ -1453,18 +1549,20 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB5_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm1, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB5_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB5_7 +; SSE4-NEXT: .LBB5_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB5_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm0, 2(%rdi) -; SSE4-NEXT: .LBB5_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB5_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB5_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm0, 3(%rdi) -; SSE4-NEXT: .LBB5_8: # %else6 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v4i64_v4i8: @@ -1473,36 +1571,38 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm3[0,2] -; AVX-NEXT: vpextrb $0, %xmm2, %eax +; AVX-NEXT: vmovmskps %xmm2, %eax +; AVX-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX-NEXT: vshufps {{.*#+}} xmm0 = xmm0[0,2],xmm2[0,2] ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB5_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB5_2: # %else -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB5_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrb $4, %xmm0, 1(%rdi) ; AVX-NEXT: .LBB5_4: # %else2 -; AVX-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB5_6 -; AVX-NEXT: # %bb.5: # %cond.store3 +; AVX-NEXT: vmovmskps %xmm1, %eax +; AVX-NEXT: testb $4, %al +; AVX-NEXT: jne .LBB5_5 +; AVX-NEXT: # %bb.6: # %else4 +; AVX-NEXT: testb $8, %al +; AVX-NEXT: jne .LBB5_7 +; AVX-NEXT: .LBB5_8: # %else6 +; AVX-NEXT: vzeroupper +; AVX-NEXT: retq +; AVX-NEXT: .LBB5_5: # %cond.store3 ; AVX-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX-NEXT: .LBB5_6: # %else4 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB5_8 -; AVX-NEXT: # %bb.7: # %cond.store5 +; AVX-NEXT: .LBB5_7: # %cond.store5 ; AVX-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX-NEXT: .LBB5_8: # %else6 ; AVX-NEXT: vzeroupper ; AVX-NEXT: retq ; @@ -1577,22 +1677,23 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB6_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, (%rdi) -; SSE2-NEXT: .LBB6_2: # %else ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB6_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB6_3 +; SSE2-NEXT: .LBB6_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB6_1: # %cond.store +; SSE2-NEXT: movd %xmm0, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB6_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB6_3: # %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 4(%rdi) -; SSE2-NEXT: .LBB6_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i32: @@ -1601,18 +1702,20 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB6_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB6_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB6_3 +; SSE4-NEXT: .LBB6_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB6_1: # %cond.store ; SSE4-NEXT: movss %xmm0, (%rdi) -; SSE4-NEXT: .LBB6_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB6_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB6_3: # %cond.store1 ; SSE4-NEXT: extractps $2, %xmm0, 4(%rdi) -; SSE4-NEXT: .LBB6_4: # %else2 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v2i64_v2i32: @@ -1677,23 +1780,24 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB7_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) -; SSE2-NEXT: .LBB7_2: # %else ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB7_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB7_3 +; SSE2-NEXT: .LBB7_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB7_1: # %cond.store +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB7_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB7_3: # %cond.store1 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) -; SSE2-NEXT: .LBB7_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i16: @@ -1702,18 +1806,20 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB7_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB7_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB7_3 +; SSE4-NEXT: .LBB7_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB7_1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) -; SSE4-NEXT: .LBB7_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB7_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB7_3: # %cond.store1 ; SSE4-NEXT: pextrw $4, %xmm0, 2(%rdi) -; SSE4-NEXT: .LBB7_4: # %else2 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i16: @@ -1722,18 +1828,20 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB7_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB7_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB7_3 +; AVX-NEXT: .LBB7_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB7_1: # %cond.store ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB7_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB7_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB7_3: # %cond.store1 ; AVX-NEXT: vpextrw $4, %xmm0, 2(%rdi) -; AVX-NEXT: .LBB7_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i16: @@ -1787,23 +1895,24 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB8_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) -; SSE2-NEXT: .LBB8_2: # %else ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB8_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB8_3 +; SSE2-NEXT: .LBB8_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB8_1: # %cond.store +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB8_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB8_3: # %cond.store1 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 1(%rdi) -; SSE2-NEXT: .LBB8_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i8: @@ -1812,18 +1921,20 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB8_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB8_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB8_3 +; SSE4-NEXT: .LBB8_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB8_1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) -; SSE4-NEXT: .LBB8_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB8_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB8_3: # %cond.store1 ; SSE4-NEXT: pextrb $8, %xmm0, 1(%rdi) -; SSE4-NEXT: .LBB8_4: # %else2 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i8: @@ -1832,18 +1943,20 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB8_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB8_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB8_3 +; AVX-NEXT: .LBB8_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB8_1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB8_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB8_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB8_3: # %cond.store1 ; AVX-NEXT: vpextrb $8, %xmm0, 1(%rdi) -; AVX-NEXT: .LBB8_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i8: @@ -1892,25 +2005,29 @@ define void @truncstore_v16i32_v16i16(<16 x i32> %x, <16 x i16>* %p, <16 x i32> %mask) { ; SSE2-LABEL: truncstore_v16i32_v16i16: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm8, %xmm8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm9 +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax ; SSE2-NEXT: pslld $16, %xmm1 ; SSE2-NEXT: psrad $16, %xmm1 ; SSE2-NEXT: pslld $16, %xmm0 ; SSE2-NEXT: psrad $16, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB9_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB9_2: # %else -; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm9, %xmm8 -; SSE2-NEXT: pextrw $2, %xmm8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB9_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -1918,18 +2035,22 @@ ; SSE2-NEXT: .LBB9_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm9 -; SSE2-NEXT: pextrw $4, %xmm9, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB9_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB9_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB9_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -1937,18 +2058,21 @@ ; SSE2-NEXT: .LBB9_8: # %else6 ; SSE2-NEXT: pxor %xmm4, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB9_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB9_10: # %else8 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm4 -; SSE2-NEXT: pextrw $2, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB9_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -1956,11 +2080,14 @@ ; SSE2-NEXT: .LBB9_12: # %else10 ; SSE2-NEXT: pslld $16, %xmm3 ; SSE2-NEXT: pslld $16, %xmm2 -; SSE2-NEXT: pxor %xmm4, %xmm4 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm5 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB9_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -1968,30 +2095,34 @@ ; SSE2-NEXT: .LBB9_14: # %else12 ; SSE2-NEXT: psrad $16, %xmm3 ; SSE2-NEXT: psrad $16, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB9_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movw %ax, 14(%rdi) ; SSE2-NEXT: .LBB9_16: # %else14 ; SSE2-NEXT: packssdw %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB9_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: movd %xmm2, %eax ; SSE2-NEXT: movw %ax, 16(%rdi) ; SSE2-NEXT: .LBB9_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB9_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $1, %xmm2, %eax @@ -1999,37 +2130,44 @@ ; SSE2-NEXT: .LBB9_20: # %else18 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm6, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB9_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movw %ax, 20(%rdi) ; SSE2-NEXT: .LBB9_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB9_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $3, %xmm2, %eax ; SSE2-NEXT: movw %ax, 22(%rdi) ; SSE2-NEXT: .LBB9_24: # %else22 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB9_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $4, %xmm2, %eax ; SSE2-NEXT: movw %ax, 24(%rdi) ; SSE2-NEXT: .LBB9_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB9_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -2037,18 +2175,21 @@ ; SSE2-NEXT: .LBB9_28: # %else26 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB9_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movw %ax, 28(%rdi) ; SSE2-NEXT: .LBB9_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB9_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm2, %eax @@ -2063,17 +2204,22 @@ ; SSE4-NEXT: pcmpeqd %xmm8, %xmm10 ; SSE4-NEXT: pcmpeqd %xmm9, %xmm9 ; SSE4-NEXT: pxor %xmm10, %xmm9 +; SSE4-NEXT: movdqa %xmm9, %xmm10 +; SSE4-NEXT: packssdw %xmm0, %xmm10 +; SSE4-NEXT: packsswb %xmm0, %xmm10 +; SSE4-NEXT: pmovmskb %xmm10, %eax ; SSE4-NEXT: pblendw {{.*#+}} xmm1 = xmm1[0],xmm8[1],xmm1[2],xmm8[3],xmm1[4],xmm8[5],xmm1[6],xmm8[7] ; SSE4-NEXT: pblendw {{.*#+}} xmm0 = xmm0[0],xmm8[1],xmm0[2],xmm8[3],xmm0[4],xmm8[5],xmm0[6],xmm8[7] ; SSE4-NEXT: packusdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm9, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB9_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB9_2: # %else -; SSE4-NEXT: pextrb $4, %xmm9, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB9_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -2082,14 +2228,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB9_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB9_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB9_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -2098,14 +2249,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB9_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB9_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB9_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -2114,16 +2269,20 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB9_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB9_14: # %else12 ; SSE4-NEXT: pblendw {{.*#+}} xmm3 = xmm3[0],xmm8[1],xmm3[2],xmm8[3],xmm3[4],xmm8[5],xmm3[6],xmm8[7] ; SSE4-NEXT: pblendw {{.*#+}} xmm2 = xmm2[0],xmm8[1],xmm2[2],xmm8[3],xmm2[4],xmm8[5],xmm2[6],xmm8[7] -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB9_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -2133,14 +2292,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB9_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB9_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB9_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi) @@ -2149,14 +2313,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm6, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB9_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB9_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB9_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi) @@ -2165,14 +2334,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB9_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB9_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB9_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi) @@ -2181,14 +2354,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm7, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB9_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB9_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB9_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi) @@ -2197,32 +2374,32 @@ ; ; AVX1-LABEL: truncstore_v16i32_v16i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm6 +; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm6 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vmovaps {{.*#+}} ymm7 = [65535,65535,65535,65535,65535,65535,65535,65535] -; AVX1-NEXT: vandps %ymm7, %ymm1, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 -; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vandps %ymm7, %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [65535,65535,65535,65535,65535,65535,65535,65535] +; AVX1-NEXT: vandps %ymm6, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 +; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vandps %ymm6, %ymm0, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB9_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB9_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB9_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -2233,8 +2410,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB9_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) @@ -2243,8 +2420,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB9_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -2256,16 +2433,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB9_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB9_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB9_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) @@ -2276,16 +2453,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB9_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB9_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB9_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -2296,8 +2473,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB9_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -2307,8 +2484,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB9_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -2320,8 +2497,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB9_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -2331,8 +2508,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB9_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -2345,8 +2522,8 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB9_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 @@ -2354,8 +2531,8 @@ ; AVX1-NEXT: .LBB9_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB9_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -2367,8 +2544,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB9_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -2376,8 +2553,8 @@ ; AVX1-NEXT: .LBB9_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB9_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 @@ -2390,112 +2567,118 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vmovdqa {{.*#+}} ymm7 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] -; AVX2-NEXT: vpshufb %ymm7, %ymm0, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] +; AVX2-NEXT: vpshufb %ymm5, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpshufb %ymm7, %ymm1, %ymm1 +; AVX2-NEXT: vpshufb %ymm5, %ymm1, %ymm1 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB9_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB9_2: # %else -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB9_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB9_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB9_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB9_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB9_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB9_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB9_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB9_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB9_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB9_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB9_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB9_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB9_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB9_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB9_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $0, %xmm4, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $0, %xmm2, 16(%rdi) ; AVX2-NEXT: .LBB9_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB9_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -2503,22 +2686,25 @@ ; AVX2-NEXT: .LBB9_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB9_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $2, %xmm4, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $2, %xmm2, 20(%rdi) ; AVX2-NEXT: .LBB9_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB9_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -2526,22 +2712,23 @@ ; AVX2-NEXT: .LBB9_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB9_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $4, %xmm2, 24(%rdi) ; AVX2-NEXT: .LBB9_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB9_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -2549,22 +2736,23 @@ ; AVX2-NEXT: .LBB9_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB9_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $6, %xmm2, 28(%rdi) ; AVX2-NEXT: .LBB9_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB9_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -2721,8 +2909,14 @@ define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) { ; SSE2-LABEL: truncstore_v16i32_v16i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm8, %xmm8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm9 +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] ; SSE2-NEXT: pand %xmm9, %xmm3 ; SSE2-NEXT: pand %xmm9, %xmm2 @@ -2731,58 +2925,63 @@ ; SSE2-NEXT: pand %xmm9, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 ; SSE2-NEXT: packuswb %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB10_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB10_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm8 -; SSE2-NEXT: pextrw $2, %xmm8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB10_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %ah, 1(%rdi) ; SSE2-NEXT: .LBB10_4: # %else2 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB10_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: shrl $16, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB10_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB10_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: shrl $24, %eax ; SSE2-NEXT: movb %al, 3(%rdi) ; SSE2-NEXT: .LBB10_8: # %else6 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB10_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB10_10: # %else8 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB10_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -2790,37 +2989,44 @@ ; SSE2-NEXT: .LBB10_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 -; SSE2-NEXT: pxor %xmm5, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm5, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB10_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB10_14: # %else12 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB10_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax ; SSE2-NEXT: movb %ah, 7(%rdi) ; SSE2-NEXT: .LBB10_16: # %else14 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB10_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 8(%rdi) ; SSE2-NEXT: .LBB10_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB10_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -2828,37 +3034,44 @@ ; SSE2-NEXT: .LBB10_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm6, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB10_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %eax ; SSE2-NEXT: movb %al, 10(%rdi) ; SSE2-NEXT: .LBB10_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB10_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax ; SSE2-NEXT: movb %ah, 11(%rdi) ; SSE2-NEXT: .LBB10_24: # %else22 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB10_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 12(%rdi) ; SSE2-NEXT: .LBB10_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB10_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -2866,18 +3079,21 @@ ; SSE2-NEXT: .LBB10_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm7, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB10_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movb %al, 14(%rdi) ; SSE2-NEXT: .LBB10_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB10_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -2891,6 +3107,10 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm9 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 ; SSE4-NEXT: pxor %xmm9, %xmm8 +; SSE4-NEXT: movdqa %xmm8, %xmm9 +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm9 = [255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0] ; SSE4-NEXT: pand %xmm9, %xmm3 ; SSE4-NEXT: pand %xmm9, %xmm2 @@ -2899,14 +3119,15 @@ ; SSE4-NEXT: pand %xmm9, %xmm0 ; SSE4-NEXT: packusdw %xmm1, %xmm0 ; SSE4-NEXT: packuswb %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm8, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB10_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB10_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm8 +; SSE4-NEXT: packsswb %xmm0, %xmm8 +; SSE4-NEXT: pmovmskb %xmm8, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB10_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) @@ -2915,14 +3136,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB10_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB10_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB10_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) @@ -2931,14 +3157,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB10_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB10_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB10_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) @@ -2947,14 +3177,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB10_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB10_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB10_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) @@ -2963,14 +3197,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB10_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB10_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB10_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) @@ -2979,14 +3218,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm6, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB10_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB10_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB10_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) @@ -2995,14 +3239,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB10_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB10_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB10_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) @@ -3011,14 +3259,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm7, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB10_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB10_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB10_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -3027,32 +3279,32 @@ ; ; AVX1-LABEL: truncstore_v16i32_v16i8: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm6 +; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm6 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vmovaps {{.*#+}} ymm7 = [255,255,255,255,255,255,255,255] -; AVX1-NEXT: vandps %ymm7, %ymm1, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 -; AVX1-NEXT: vpackusdw %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vandps %ymm7, %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [255,255,255,255,255,255,255,255] +; AVX1-NEXT: vandps %ymm6, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 +; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vandps %ymm6, %ymm0, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB10_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB10_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB10_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -3063,8 +3315,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB10_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) @@ -3073,8 +3325,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB10_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -3086,16 +3338,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB10_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB10_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB10_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -3106,16 +3358,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB10_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB10_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB10_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -3126,8 +3378,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB10_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) @@ -3136,8 +3388,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB10_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -3148,8 +3400,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB10_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) @@ -3158,8 +3410,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB10_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -3171,16 +3423,16 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB10_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB10_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB10_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -3191,16 +3443,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB10_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB10_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB10_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -3212,177 +3464,188 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm8, %xmm8, %xmm8 -; AVX2-NEXT: vpxor %xmm8, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vmovdqa {{.*#+}} ymm7 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] -; AVX2-NEXT: vpshufb %ymm7, %ymm1, %ymm1 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: vmovdqa {{.*#+}} ymm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] +; AVX2-NEXT: vpshufb %ymm5, %ymm1, %ymm1 ; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] -; AVX2-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255,255,255,255,255] -; AVX2-NEXT: vpand %xmm5, %xmm1, %xmm1 -; AVX2-NEXT: vpshufb %ymm7, %ymm0, %ymm0 +; AVX2-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] +; AVX2-NEXT: vpand %xmm6, %xmm1, %xmm1 +; AVX2-NEXT: vpshufb %ymm5, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpand %xmm5, %xmm0, %xmm0 +; AVX2-NEXT: vpand %xmm6, %xmm0, %xmm0 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB10_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB10_2: # %else -; AVX2-NEXT: vpxor %xmm8, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB10_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB10_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB10_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB10_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB10_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB10_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB10_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB10_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB10_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB10_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB10_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB10_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB10_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB10_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB10_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB10_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB10_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB10_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB10_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB10_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB10_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB10_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB10_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB10_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB10_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB10_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB10_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB10_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB10_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -3536,22 +3799,23 @@ ; SSE2-NEXT: pxor %xmm5, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: pslld $16, %xmm1 ; SSE2-NEXT: psrad $16, %xmm1 ; SSE2-NEXT: pslld $16, %xmm0 ; SSE2-NEXT: psrad $16, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB11_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB11_2: # %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB11_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -3561,15 +3825,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB11_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB11_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB11_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -3579,15 +3848,19 @@ ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB11_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB11_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB11_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -3597,15 +3870,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm3, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB11_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB11_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB11_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -3619,18 +3896,23 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] ; SSE4-NEXT: pshufb %xmm5, %xmm1 ; SSE4-NEXT: pshufb %xmm5, %xmm0 ; SSE4-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB11_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB11_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB11_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -3639,14 +3921,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB11_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB11_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB11_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -3655,14 +3942,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB11_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB11_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB11_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -3671,14 +3962,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB11_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB11_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB11_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -3691,12 +3986,12 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; AVX1-NEXT: vpshufb %xmm6, %xmm5, %xmm5 -; AVX1-NEXT: vpshufb %xmm6, %xmm0, %xmm0 -; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0] -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm4 +; AVX1-NEXT: vpshufb %xmm5, %xmm0, %xmm0 +; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0] ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB11_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -3704,8 +3999,8 @@ ; AVX1-NEXT: .LBB11_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB11_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -3714,16 +4009,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB11_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB11_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB11_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -3733,30 +4028,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB11_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB11_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB11_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB11_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB11_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB11_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB11_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -3768,74 +4067,70 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpextrb $0, %xmm4, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB11_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB11_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB11_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB11_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB11_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB11_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB11_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB11_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB11_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB11_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB11_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB11_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB11_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB11_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB11_15 +; AVX2-NEXT: .LBB11_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB11_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB11_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB11_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB11_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB11_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -3943,22 +4238,23 @@ ; SSE2-NEXT: pxor %xmm5, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: pslld $16, %xmm1 ; SSE2-NEXT: psrad $16, %xmm1 ; SSE2-NEXT: pslld $16, %xmm0 ; SSE2-NEXT: psrad $16, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB12_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB12_2: # %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB12_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -3969,15 +4265,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB12_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB12_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB12_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -3987,15 +4288,19 @@ ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB12_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB12_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB12_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -4005,15 +4310,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm3, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB12_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB12_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB12_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -4027,18 +4336,23 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] ; SSE4-NEXT: pshufb %xmm5, %xmm1 ; SSE4-NEXT: pshufb %xmm5, %xmm0 ; SSE4-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB12_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB12_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB12_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -4047,14 +4361,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB12_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB12_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB12_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -4063,14 +4382,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB12_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB12_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB12_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -4079,14 +4402,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB12_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB12_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB12_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -4099,12 +4426,12 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] -; AVX1-NEXT: vpshufb %xmm6, %xmm5, %xmm5 -; AVX1-NEXT: vpshufb %xmm6, %xmm0, %xmm0 -; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm5[0] -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15] +; AVX1-NEXT: vpshufb %xmm5, %xmm4, %xmm4 +; AVX1-NEXT: vpshufb %xmm5, %xmm0, %xmm0 +; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm4[0] ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB12_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -4112,8 +4439,8 @@ ; AVX1-NEXT: .LBB12_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB12_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -4122,16 +4449,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB12_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB12_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB12_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -4141,30 +4468,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB12_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB12_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB12_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB12_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB12_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB12_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB12_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -4176,74 +4507,70 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax ; AVX2-NEXT: vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,8,9,12,13,12,13,14,15,16,17,20,21,24,25,28,29,24,25,28,29,28,29,30,31] ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3] -; AVX2-NEXT: vpextrb $0, %xmm4, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB12_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB12_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB12_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB12_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB12_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB12_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB12_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB12_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB12_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB12_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB12_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB12_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB12_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB12_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB12_15 +; AVX2-NEXT: .LBB12_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB12_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB12_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB12_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB12_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB12_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -4348,18 +4675,16 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB13_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB13_2: # %else -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB13_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -4367,39 +4692,39 @@ ; SSE2-NEXT: .LBB13_4: # %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $4, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB13_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB13_6: # %else4 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskps %xmm2, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB13_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB13_7 +; SSE2-NEXT: .LBB13_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB13_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB13_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB13_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB13_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i16: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB13_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB13_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB13_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm0, 2(%rdi) @@ -4408,18 +4733,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB13_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB13_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB13_7 +; SSE4-NEXT: .LBB13_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB13_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm0, 4(%rdi) -; SSE4-NEXT: .LBB13_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB13_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB13_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm0, 6(%rdi) -; SSE4-NEXT: .LBB13_8: # %else6 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v4i32_v4i16: @@ -4428,14 +4755,13 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $0, %xmm2, %eax +; AVX-NEXT: vmovmskps %xmm2, %eax ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB13_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB13_2: # %else -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB13_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -4444,18 +4770,20 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB13_6 -; AVX-NEXT: # %bb.5: # %cond.store3 +; AVX-NEXT: vmovmskps %xmm1, %eax +; AVX-NEXT: testb $4, %al +; AVX-NEXT: jne .LBB13_5 +; AVX-NEXT: # %bb.6: # %else4 +; AVX-NEXT: testb $8, %al +; AVX-NEXT: jne .LBB13_7 +; AVX-NEXT: .LBB13_8: # %else6 +; AVX-NEXT: retq +; AVX-NEXT: .LBB13_5: # %cond.store3 ; AVX-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX-NEXT: .LBB13_6: # %else4 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB13_8 -; AVX-NEXT: # %bb.7: # %cond.store5 +; AVX-NEXT: .LBB13_7: # %cond.store5 ; AVX-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX-NEXT: .LBB13_8: # %else6 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i16: @@ -4522,18 +4850,16 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB14_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB14_2: # %else -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB14_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -4541,39 +4867,39 @@ ; SSE2-NEXT: .LBB14_4: # %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $4, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB14_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB14_6: # %else4 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskps %xmm2, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB14_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB14_7 +; SSE2-NEXT: .LBB14_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB14_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB14_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB14_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB14_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB14_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB14_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB14_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm0, 1(%rdi) @@ -4582,18 +4908,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB14_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB14_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB14_7 +; SSE4-NEXT: .LBB14_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB14_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm0, 2(%rdi) -; SSE4-NEXT: .LBB14_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB14_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB14_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm0, 3(%rdi) -; SSE4-NEXT: .LBB14_8: # %else6 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v4i32_v4i8: @@ -4602,14 +4930,13 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $0, %xmm2, %eax +; AVX-NEXT: vmovmskps %xmm2, %eax ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB14_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB14_2: # %else -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB14_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -4618,18 +4945,20 @@ ; AVX-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB14_6 -; AVX-NEXT: # %bb.5: # %cond.store3 +; AVX-NEXT: vmovmskps %xmm1, %eax +; AVX-NEXT: testb $4, %al +; AVX-NEXT: jne .LBB14_5 +; AVX-NEXT: # %bb.6: # %else4 +; AVX-NEXT: testb $8, %al +; AVX-NEXT: jne .LBB14_7 +; AVX-NEXT: .LBB14_8: # %else6 +; AVX-NEXT: retq +; AVX-NEXT: .LBB14_5: # %cond.store3 ; AVX-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX-NEXT: .LBB14_6: # %else4 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB14_8 -; AVX-NEXT: # %bb.7: # %cond.store5 +; AVX-NEXT: .LBB14_7: # %cond.store5 ; AVX-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX-NEXT: .LBB14_8: # %else6 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i8: @@ -4694,24 +5023,22 @@ define void @truncstore_v32i16_v32i8(<32 x i16> %x, <32 x i8>* %p, <32 x i8> %mask) { ; SSE2-LABEL: truncstore_v32i16_v32i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm7, %xmm7 -; SSE2-NEXT: pcmpeqb %xmm4, %xmm7 +; SSE2-NEXT: pxor %xmm6, %xmm6 +; SSE2-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm6, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] ; SSE2-NEXT: pand %xmm6, %xmm1 ; SSE2-NEXT: pand %xmm6, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm7, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB15_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB15_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB15_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -4719,20 +5046,17 @@ ; SSE2-NEXT: .LBB15_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB15_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB15_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB15_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -4741,18 +5065,16 @@ ; SSE2-NEXT: .LBB15_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB15_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB15_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB15_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -4760,18 +5082,16 @@ ; SSE2-NEXT: .LBB15_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB15_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB15_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB15_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -4779,18 +5099,16 @@ ; SSE2-NEXT: .LBB15_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB15_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB15_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB15_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -4798,18 +5116,16 @@ ; SSE2-NEXT: .LBB15_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB15_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB15_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB15_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -4817,18 +5133,16 @@ ; SSE2-NEXT: .LBB15_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB15_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: .LBB15_26: # %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB15_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -4836,10 +5150,10 @@ ; SSE2-NEXT: .LBB15_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE2-NEXT: pextrw $7, %xmm4, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB15_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx @@ -4847,9 +5161,7 @@ ; SSE2-NEXT: .LBB15_30: # %else28 ; SSE2-NEXT: pand %xmm6, %xmm3 ; SSE2-NEXT: pand %xmm6, %xmm2 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB15_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -4858,18 +5170,17 @@ ; SSE2-NEXT: packuswb %xmm3, %xmm2 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE2-NEXT: je .LBB15_34 ; SSE2-NEXT: # %bb.33: # %cond.store31 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: movb %cl, 16(%rdi) ; SSE2-NEXT: .LBB15_34: # %else32 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE2-NEXT: je .LBB15_36 ; SSE2-NEXT: # %bb.35: # %cond.store33 ; SSE2-NEXT: movd %xmm2, %eax @@ -4877,20 +5188,18 @@ ; SSE2-NEXT: .LBB15_36: # %else34 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE2-NEXT: je .LBB15_38 ; SSE2-NEXT: # %bb.37: # %cond.store35 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 18(%rdi) ; SSE2-NEXT: .LBB15_38: # %else36 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE2-NEXT: je .LBB15_40 ; SSE2-NEXT: # %bb.39: # %cond.store37 ; SSE2-NEXT: movd %xmm2, %eax @@ -4899,18 +5208,17 @@ ; SSE2-NEXT: .LBB15_40: # %else38 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE2-NEXT: je .LBB15_42 ; SSE2-NEXT: # %bb.41: # %cond.store39 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 20(%rdi) ; SSE2-NEXT: .LBB15_42: # %else40 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE2-NEXT: je .LBB15_44 ; SSE2-NEXT: # %bb.43: # %cond.store41 ; SSE2-NEXT: pextrw $2, %xmm2, %eax @@ -4918,18 +5226,17 @@ ; SSE2-NEXT: .LBB15_44: # %else42 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE2-NEXT: je .LBB15_46 ; SSE2-NEXT: # %bb.45: # %cond.store43 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 22(%rdi) ; SSE2-NEXT: .LBB15_46: # %else44 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE2-NEXT: je .LBB15_48 ; SSE2-NEXT: # %bb.47: # %cond.store45 ; SSE2-NEXT: pextrw $3, %xmm2, %eax @@ -4937,18 +5244,17 @@ ; SSE2-NEXT: .LBB15_48: # %else46 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE2-NEXT: je .LBB15_50 ; SSE2-NEXT: # %bb.49: # %cond.store47 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 24(%rdi) ; SSE2-NEXT: .LBB15_50: # %else48 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE2-NEXT: je .LBB15_52 ; SSE2-NEXT: # %bb.51: # %cond.store49 ; SSE2-NEXT: pextrw $4, %xmm2, %eax @@ -4956,18 +5262,17 @@ ; SSE2-NEXT: .LBB15_52: # %else50 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE2-NEXT: je .LBB15_54 ; SSE2-NEXT: # %bb.53: # %cond.store51 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 26(%rdi) ; SSE2-NEXT: .LBB15_54: # %else52 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE2-NEXT: je .LBB15_56 ; SSE2-NEXT: # %bb.55: # %cond.store53 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -4975,18 +5280,17 @@ ; SSE2-NEXT: .LBB15_56: # %else54 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE2-NEXT: je .LBB15_58 ; SSE2-NEXT: # %bb.57: # %cond.store55 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 28(%rdi) ; SSE2-NEXT: .LBB15_58: # %else56 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE2-NEXT: je .LBB15_60 ; SSE2-NEXT: # %bb.59: # %cond.store57 ; SSE2-NEXT: pextrw $6, %xmm2, %eax @@ -4994,157 +5298,151 @@ ; SSE2-NEXT: .LBB15_60: # %else58 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE2-NEXT: pextrw $7, %xmm5, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB15_62 -; SSE2-NEXT: # %bb.61: # %cond.store59 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm5, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE2-NEXT: jne .LBB15_61 +; SSE2-NEXT: # %bb.62: # %else60 +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE2-NEXT: jne .LBB15_63 +; SSE2-NEXT: .LBB15_64: # %else62 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB15_61: # %cond.store59 ; SSE2-NEXT: pextrw $7, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 30(%rdi) -; SSE2-NEXT: .LBB15_62: # %else60 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE2-NEXT: je .LBB15_64 -; SSE2-NEXT: # %bb.63: # %cond.store61 +; SSE2-NEXT: .LBB15_63: # %cond.store61 ; SSE2-NEXT: pextrw $7, %xmm2, %eax ; SSE2-NEXT: movb %ah, 31(%rdi) -; SSE2-NEXT: .LBB15_64: # %else62 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v32i16_v32i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm7, %xmm7 -; SSE4-NEXT: pcmpeqb %xmm4, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm6 +; SSE4-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm6 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> ; SSE4-NEXT: pshufb %xmm6, %xmm1 ; SSE4-NEXT: pshufb %xmm6, %xmm0 ; SSE4-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE4-NEXT: pextrb $0, %xmm7, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB15_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB15_2: # %else -; SSE4-NEXT: pextrb $1, %xmm7, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB15_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB15_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB15_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB15_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB15_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB15_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB15_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB15_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB15_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB15_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB15_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB15_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB15_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB15_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB15_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB15_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB15_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB15_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB15_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB15_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB15_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB15_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB15_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB15_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB15_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB15_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE4-NEXT: pextrb $14, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm4, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB15_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB15_30: # %else28 ; SSE4-NEXT: pshufb %xmm6, %xmm3 ; SSE4-NEXT: pshufb %xmm6, %xmm2 -; SSE4-NEXT: pextrb $15, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB15_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -5152,132 +5450,135 @@ ; SSE4-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm3[0] ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE4-NEXT: je .LBB15_34 ; SSE4-NEXT: # %bb.33: # %cond.store31 ; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB15_34: # %else32 -; SSE4-NEXT: pextrb $1, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE4-NEXT: je .LBB15_36 ; SSE4-NEXT: # %bb.35: # %cond.store33 ; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi) ; SSE4-NEXT: .LBB15_36: # %else34 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $2, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE4-NEXT: je .LBB15_38 ; SSE4-NEXT: # %bb.37: # %cond.store35 ; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi) ; SSE4-NEXT: .LBB15_38: # %else36 -; SSE4-NEXT: pextrb $3, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE4-NEXT: je .LBB15_40 ; SSE4-NEXT: # %bb.39: # %cond.store37 ; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi) ; SSE4-NEXT: .LBB15_40: # %else38 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE4-NEXT: je .LBB15_42 ; SSE4-NEXT: # %bb.41: # %cond.store39 ; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB15_42: # %else40 -; SSE4-NEXT: pextrb $5, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE4-NEXT: je .LBB15_44 ; SSE4-NEXT: # %bb.43: # %cond.store41 ; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi) ; SSE4-NEXT: .LBB15_44: # %else42 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $6, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE4-NEXT: je .LBB15_46 ; SSE4-NEXT: # %bb.45: # %cond.store43 ; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi) ; SSE4-NEXT: .LBB15_46: # %else44 -; SSE4-NEXT: pextrb $7, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE4-NEXT: je .LBB15_48 ; SSE4-NEXT: # %bb.47: # %cond.store45 ; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi) ; SSE4-NEXT: .LBB15_48: # %else46 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE4-NEXT: je .LBB15_50 ; SSE4-NEXT: # %bb.49: # %cond.store47 ; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB15_50: # %else48 -; SSE4-NEXT: pextrb $9, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE4-NEXT: je .LBB15_52 ; SSE4-NEXT: # %bb.51: # %cond.store49 ; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi) ; SSE4-NEXT: .LBB15_52: # %else50 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $10, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE4-NEXT: je .LBB15_54 ; SSE4-NEXT: # %bb.53: # %cond.store51 ; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi) ; SSE4-NEXT: .LBB15_54: # %else52 -; SSE4-NEXT: pextrb $11, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE4-NEXT: je .LBB15_56 ; SSE4-NEXT: # %bb.55: # %cond.store53 ; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi) ; SSE4-NEXT: .LBB15_56: # %else54 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE4-NEXT: je .LBB15_58 ; SSE4-NEXT: # %bb.57: # %cond.store55 ; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB15_58: # %else56 -; SSE4-NEXT: pextrb $13, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE4-NEXT: je .LBB15_60 ; SSE4-NEXT: # %bb.59: # %cond.store57 ; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi) ; SSE4-NEXT: .LBB15_60: # %else58 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE4-NEXT: pextrb $14, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB15_62 -; SSE4-NEXT: # %bb.61: # %cond.store59 +; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE4-NEXT: pxor %xmm5, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE4-NEXT: jne .LBB15_61 +; SSE4-NEXT: # %bb.62: # %else60 +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE4-NEXT: jne .LBB15_63 +; SSE4-NEXT: .LBB15_64: # %else62 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB15_61: # %cond.store59 ; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi) -; SSE4-NEXT: .LBB15_62: # %else60 -; SSE4-NEXT: pextrb $15, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE4-NEXT: je .LBB15_64 -; SSE4-NEXT: # %bb.63: # %cond.store61 +; SSE4-NEXT: .LBB15_63: # %cond.store61 ; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi) -; SSE4-NEXT: .LBB15_64: # %else62 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v32i16_v32i8: @@ -5286,15 +5587,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vmovaps {{.*#+}} ymm6 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; AVX1-NEXT: vandps %ymm6, %ymm1, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpackuswb %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vandps %ymm6, %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX1-NEXT: vpackuswb %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: vmovaps {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; AVX1-NEXT: vandps %ymm5, %ymm1, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpackuswb %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vandps %ymm5, %ymm0, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpackuswb %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB15_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -5302,8 +5603,8 @@ ; AVX1-NEXT: .LBB15_2: # %else ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB15_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -5312,16 +5613,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $2, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB15_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB15_6: # %else4 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB15_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -5330,16 +5631,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB15_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB15_10: # %else8 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $5, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB15_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -5348,16 +5649,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $6, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB15_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB15_14: # %else12 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB15_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -5366,16 +5667,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB15_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB15_18: # %else16 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB15_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -5384,16 +5685,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB15_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB15_22: # %else20 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB15_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -5402,16 +5703,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $12, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB15_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB15_26: # %else24 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $13, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB15_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -5420,16 +5721,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $14, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB15_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB15_30: # %else28 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB15_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -5439,15 +5740,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX1-NEXT: je .LBB15_34 ; AVX1-NEXT: # %bb.33: # %cond.store31 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX1-NEXT: .LBB15_34: # %else32 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX1-NEXT: je .LBB15_36 ; AVX1-NEXT: # %bb.35: # %cond.store33 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5457,15 +5758,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX1-NEXT: je .LBB15_38 ; AVX1-NEXT: # %bb.37: # %cond.store35 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX1-NEXT: .LBB15_38: # %else36 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX1-NEXT: je .LBB15_40 ; AVX1-NEXT: # %bb.39: # %cond.store37 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5475,15 +5776,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX1-NEXT: je .LBB15_42 ; AVX1-NEXT: # %bb.41: # %cond.store39 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX1-NEXT: .LBB15_42: # %else40 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX1-NEXT: je .LBB15_44 ; AVX1-NEXT: # %bb.43: # %cond.store41 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5493,15 +5794,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX1-NEXT: je .LBB15_46 ; AVX1-NEXT: # %bb.45: # %cond.store43 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX1-NEXT: .LBB15_46: # %else44 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX1-NEXT: je .LBB15_48 ; AVX1-NEXT: # %bb.47: # %cond.store45 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5511,15 +5812,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX1-NEXT: je .LBB15_50 ; AVX1-NEXT: # %bb.49: # %cond.store47 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX1-NEXT: .LBB15_50: # %else48 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX1-NEXT: je .LBB15_52 ; AVX1-NEXT: # %bb.51: # %cond.store49 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5529,15 +5830,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX1-NEXT: je .LBB15_54 ; AVX1-NEXT: # %bb.53: # %cond.store51 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX1-NEXT: .LBB15_54: # %else52 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX1-NEXT: je .LBB15_56 ; AVX1-NEXT: # %bb.55: # %cond.store53 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5547,15 +5848,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX1-NEXT: je .LBB15_58 ; AVX1-NEXT: # %bb.57: # %cond.store55 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX1-NEXT: .LBB15_58: # %else56 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX1-NEXT: je .LBB15_60 ; AVX1-NEXT: # %bb.59: # %cond.store57 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -5565,20 +5866,24 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB15_62 -; AVX1-NEXT: # %bb.61: # %cond.store59 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX1-NEXT: .LBB15_62: # %else60 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX1-NEXT: jne .LBB15_61 +; AVX1-NEXT: # %bb.62: # %else60 +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX1-NEXT: jne .LBB15_63 +; AVX1-NEXT: .LBB15_64: # %else62 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB15_61: # %cond.store59 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX1-NEXT: je .LBB15_64 -; AVX1-NEXT: # %bb.63: # %cond.store61 +; AVX1-NEXT: .LBB15_63: # %cond.store61 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX1-NEXT: .LBB15_64: # %else62 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -5586,154 +5891,144 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; AVX2-NEXT: vpand %ymm4, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 -; AVX2-NEXT: vpackuswb %xmm5, %xmm1, %xmm1 -; AVX2-NEXT: vpand %ymm4, %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpackuswb %xmm4, %xmm0, %xmm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vpmovmskb %ymm3, %eax +; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; AVX2-NEXT: vpand %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm4 +; AVX2-NEXT: vpackuswb %xmm4, %xmm1, %xmm1 +; AVX2-NEXT: vpand %ymm3, %ymm0, %ymm0 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 +; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 ; AVX2-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 -; AVX2-NEXT: vpextrb $0, %xmm3, %eax -; AVX2-NEXT: notb %al ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB15_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB15_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm3, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB15_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB15_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB15_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB15_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB15_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB15_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB15_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB15_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB15_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB15_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB15_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB15_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB15_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB15_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB15_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB15_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB15_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB15_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB15_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB15_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB15_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB15_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB15_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB15_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB15_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB15_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB15_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB15_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB15_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX2-NEXT: .LBB15_32: # %else30 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX2-NEXT: je .LBB15_34 ; AVX2-NEXT: # %bb.33: # %cond.store31 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $0, %xmm1, 16(%rdi) ; AVX2-NEXT: .LBB15_34: # %else32 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX2-NEXT: je .LBB15_36 ; AVX2-NEXT: # %bb.35: # %cond.store33 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5741,18 +6036,16 @@ ; AVX2-NEXT: .LBB15_36: # %else34 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX2-NEXT: je .LBB15_38 ; AVX2-NEXT: # %bb.37: # %cond.store35 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $2, %xmm1, 18(%rdi) ; AVX2-NEXT: .LBB15_38: # %else36 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX2-NEXT: je .LBB15_40 ; AVX2-NEXT: # %bb.39: # %cond.store37 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5760,18 +6053,16 @@ ; AVX2-NEXT: .LBB15_40: # %else38 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX2-NEXT: je .LBB15_42 ; AVX2-NEXT: # %bb.41: # %cond.store39 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $4, %xmm1, 20(%rdi) ; AVX2-NEXT: .LBB15_42: # %else40 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX2-NEXT: je .LBB15_44 ; AVX2-NEXT: # %bb.43: # %cond.store41 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5779,18 +6070,16 @@ ; AVX2-NEXT: .LBB15_44: # %else42 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX2-NEXT: je .LBB15_46 ; AVX2-NEXT: # %bb.45: # %cond.store43 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $6, %xmm1, 22(%rdi) ; AVX2-NEXT: .LBB15_46: # %else44 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX2-NEXT: je .LBB15_48 ; AVX2-NEXT: # %bb.47: # %cond.store45 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5798,18 +6087,16 @@ ; AVX2-NEXT: .LBB15_48: # %else46 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX2-NEXT: je .LBB15_50 ; AVX2-NEXT: # %bb.49: # %cond.store47 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $8, %xmm1, 24(%rdi) ; AVX2-NEXT: .LBB15_50: # %else48 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX2-NEXT: je .LBB15_52 ; AVX2-NEXT: # %bb.51: # %cond.store49 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5817,18 +6104,16 @@ ; AVX2-NEXT: .LBB15_52: # %else50 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX2-NEXT: je .LBB15_54 ; AVX2-NEXT: # %bb.53: # %cond.store51 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $10, %xmm1, 26(%rdi) ; AVX2-NEXT: .LBB15_54: # %else52 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX2-NEXT: je .LBB15_56 ; AVX2-NEXT: # %bb.55: # %cond.store53 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5836,18 +6121,16 @@ ; AVX2-NEXT: .LBB15_56: # %else54 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX2-NEXT: je .LBB15_58 ; AVX2-NEXT: # %bb.57: # %cond.store55 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $12, %xmm1, 28(%rdi) ; AVX2-NEXT: .LBB15_58: # %else56 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX2-NEXT: je .LBB15_60 ; AVX2-NEXT: # %bb.59: # %cond.store57 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -5855,23 +6138,25 @@ ; AVX2-NEXT: .LBB15_60: # %else58 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB15_62 -; AVX2-NEXT: # %bb.61: # %cond.store59 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX2-NEXT: .LBB15_62: # %else60 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB15_64 -; AVX2-NEXT: # %bb.63: # %cond.store61 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX2-NEXT: jne .LBB15_61 +; AVX2-NEXT: # %bb.62: # %else60 +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX2-NEXT: jne .LBB15_63 +; AVX2-NEXT: .LBB15_64: # %else62 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB15_61: # %cond.store59 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX2-NEXT: je .LBB15_64 +; AVX2-NEXT: .LBB15_63: # %cond.store61 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX2-NEXT: .LBB15_64: # %else62 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -5881,25 +6166,20 @@ ; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 ; AVX512F-NEXT: vmovdqa64 %zmm3, %zmm4 ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm4 -; AVX512F-NEXT: vpmovsxbd %xmm4, %zmm4 -; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k0 +; AVX512F-NEXT: vpmovmskb %ymm4, %eax ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB15_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB15_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB15_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -5908,21 +6188,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB15_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB15_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB15_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -5931,21 +6205,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB15_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB15_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB15_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -5954,21 +6222,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB15_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB15_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB15_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -5977,21 +6239,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB15_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB15_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB15_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -6000,21 +6256,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB15_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB15_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB15_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -6023,21 +6273,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB15_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB15_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB15_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -6046,45 +6290,33 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB15_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB15_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB15_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX512F-NEXT: .LBB15_32: # %else30 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX512F-NEXT: je .LBB15_34 ; AVX512F-NEXT: # %bb.33: # %cond.store31 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $0, %xmm3, 16(%rdi) ; AVX512F-NEXT: .LBB15_34: # %else32 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX512F-NEXT: je .LBB15_36 ; AVX512F-NEXT: # %bb.35: # %cond.store33 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6092,25 +6324,18 @@ ; AVX512F-NEXT: .LBB15_36: # %else34 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX512F-NEXT: je .LBB15_38 ; AVX512F-NEXT: # %bb.37: # %cond.store35 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $2, %xmm3, 18(%rdi) ; AVX512F-NEXT: .LBB15_38: # %else36 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX512F-NEXT: je .LBB15_40 ; AVX512F-NEXT: # %bb.39: # %cond.store37 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6118,25 +6343,18 @@ ; AVX512F-NEXT: .LBB15_40: # %else38 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX512F-NEXT: je .LBB15_42 ; AVX512F-NEXT: # %bb.41: # %cond.store39 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $4, %xmm3, 20(%rdi) ; AVX512F-NEXT: .LBB15_42: # %else40 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX512F-NEXT: je .LBB15_44 ; AVX512F-NEXT: # %bb.43: # %cond.store41 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6144,25 +6362,18 @@ ; AVX512F-NEXT: .LBB15_44: # %else42 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX512F-NEXT: je .LBB15_46 ; AVX512F-NEXT: # %bb.45: # %cond.store43 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $6, %xmm3, 22(%rdi) ; AVX512F-NEXT: .LBB15_46: # %else44 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX512F-NEXT: je .LBB15_48 ; AVX512F-NEXT: # %bb.47: # %cond.store45 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6170,25 +6381,18 @@ ; AVX512F-NEXT: .LBB15_48: # %else46 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX512F-NEXT: je .LBB15_50 ; AVX512F-NEXT: # %bb.49: # %cond.store47 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $8, %xmm3, 24(%rdi) ; AVX512F-NEXT: .LBB15_50: # %else48 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX512F-NEXT: je .LBB15_52 ; AVX512F-NEXT: # %bb.51: # %cond.store49 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6196,25 +6400,18 @@ ; AVX512F-NEXT: .LBB15_52: # %else50 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX512F-NEXT: je .LBB15_54 ; AVX512F-NEXT: # %bb.53: # %cond.store51 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $10, %xmm3, 26(%rdi) ; AVX512F-NEXT: .LBB15_54: # %else52 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX512F-NEXT: je .LBB15_56 ; AVX512F-NEXT: # %bb.55: # %cond.store53 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6222,25 +6419,18 @@ ; AVX512F-NEXT: .LBB15_56: # %else54 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX512F-NEXT: je .LBB15_58 ; AVX512F-NEXT: # %bb.57: # %cond.store55 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $12, %xmm3, 28(%rdi) ; AVX512F-NEXT: .LBB15_58: # %else56 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX512F-NEXT: je .LBB15_60 ; AVX512F-NEXT: # %bb.59: # %cond.store57 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6248,25 +6438,18 @@ ; AVX512F-NEXT: .LBB15_60: # %else58 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 ; AVX512F-NEXT: je .LBB15_62 ; AVX512F-NEXT: # %bb.61: # %cond.store59 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX512F-NEXT: vpextrb $14, %xmm2, 30(%rdi) ; AVX512F-NEXT: .LBB15_62: # %else60 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX512F-NEXT: je .LBB15_64 ; AVX512F-NEXT: # %bb.63: # %cond.store61 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -6300,22 +6483,20 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] -; SSE2-NEXT: pand %xmm4, %xmm1 -; SSE2-NEXT: pand %xmm4, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: pand %xmm3, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB16_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB16_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB16_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -6323,20 +6504,17 @@ ; SSE2-NEXT: .LBB16_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB16_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB16_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB16_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -6345,18 +6523,16 @@ ; SSE2-NEXT: .LBB16_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB16_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB16_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB16_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -6364,18 +6540,16 @@ ; SSE2-NEXT: .LBB16_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB16_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB16_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB16_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -6383,18 +6557,16 @@ ; SSE2-NEXT: .LBB16_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB16_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB16_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB16_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -6402,18 +6574,16 @@ ; SSE2-NEXT: .LBB16_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB16_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB16_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB16_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -6421,18 +6591,16 @@ ; SSE2-NEXT: .LBB16_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB16_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: .LBB16_26: # %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB16_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -6440,294 +6608,286 @@ ; SSE2-NEXT: .LBB16_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB16_30 -; SSE2-NEXT: # %bb.29: # %cond.store27 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE2-NEXT: jne .LBB16_29 +; SSE2-NEXT: # %bb.30: # %else28 +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE2-NEXT: jne .LBB16_31 +; SSE2-NEXT: .LBB16_32: # %else30 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB16_29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) -; SSE2-NEXT: .LBB16_30: # %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB16_32 -; SSE2-NEXT: # %bb.31: # %cond.store29 +; SSE2-NEXT: .LBB16_31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movb %ah, 15(%rdi) -; SSE2-NEXT: .LBB16_32: # %else30 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v16i16_v16i8: ; SSE4: # %bb.0: ; SSE4-NEXT: pxor %xmm3, %xmm3 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm3 -; SSE4-NEXT: movdqa {{.*#+}} xmm4 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> -; SSE4-NEXT: pshufb %xmm4, %xmm1 -; SSE4-NEXT: pshufb %xmm4, %xmm0 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm3 = <0,2,4,6,8,10,12,14,u,u,u,u,u,u,u,u> +; SSE4-NEXT: pshufb %xmm3, %xmm1 +; SSE4-NEXT: pshufb %xmm3, %xmm0 ; SSE4-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0] -; SSE4-NEXT: pextrb $0, %xmm3, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB16_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB16_2: # %else -; SSE4-NEXT: pextrb $1, %xmm3, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB16_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB16_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB16_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB16_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB16_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB16_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB16_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB16_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB16_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB16_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB16_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB16_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB16_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB16_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB16_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB16_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB16_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB16_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB16_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB16_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB16_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB16_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB16_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB16_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB16_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB16_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB16_30 -; SSE4-NEXT: # %bb.29: # %cond.store27 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm2, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE4-NEXT: jne .LBB16_29 +; SSE4-NEXT: # %bb.30: # %else28 +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE4-NEXT: jne .LBB16_31 +; SSE4-NEXT: .LBB16_32: # %else30 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB16_29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) -; SSE4-NEXT: .LBB16_30: # %else28 -; SSE4-NEXT: pextrb $15, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB16_32 -; SSE4-NEXT: # %bb.31: # %cond.store29 +; SSE4-NEXT: .LBB16_31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) -; SSE4-NEXT: .LBB16_32: # %else30 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v16i16_v16i8: ; AVX1: # %bb.0: ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax ; AVX1-NEXT: vandps {{.*}}(%rip), %ymm0, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: notb %al +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB16_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB16_2: # %else -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB16_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX1-NEXT: .LBB16_4: # %else2 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB16_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB16_6: # %else4 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB16_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX1-NEXT: .LBB16_8: # %else6 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB16_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB16_10: # %else8 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB16_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB16_12: # %else10 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB16_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB16_14: # %else12 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB16_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX1-NEXT: .LBB16_16: # %else14 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB16_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB16_18: # %else16 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB16_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX1-NEXT: .LBB16_20: # %else18 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB16_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB16_22: # %else20 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB16_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX1-NEXT: .LBB16_24: # %else22 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB16_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB16_26: # %else24 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB16_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX1-NEXT: .LBB16_28: # %else26 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB16_30 -; AVX1-NEXT: # %bb.29: # %cond.store27 +; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX1-NEXT: jne .LBB16_29 +; AVX1-NEXT: # %bb.30: # %else28 +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX1-NEXT: jne .LBB16_31 +; AVX1-NEXT: .LBB16_32: # %else30 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB16_29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX1-NEXT: .LBB16_30: # %else28 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB16_32 -; AVX1-NEXT: # %bb.31: # %cond.store29 +; AVX1-NEXT: .LBB16_31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX1-NEXT: .LBB16_32: # %else30 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -6735,135 +6895,131 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax ; AVX2-NEXT: vpand {{.*}}(%rip), %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: notb %al +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB16_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB16_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB16_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB16_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB16_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB16_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB16_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB16_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB16_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB16_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB16_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB16_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB16_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB16_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB16_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB16_16: # %else14 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB16_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB16_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB16_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB16_20: # %else18 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB16_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB16_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB16_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB16_24: # %else22 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB16_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB16_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB16_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB16_28: # %else26 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB16_30 -; AVX2-NEXT: # %bb.29: # %cond.store27 +; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX2-NEXT: jne .LBB16_29 +; AVX2-NEXT: # %bb.30: # %else28 +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX2-NEXT: jne .LBB16_31 +; AVX2-NEXT: .LBB16_32: # %else30 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB16_29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB16_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB16_32 -; AVX2-NEXT: # %bb.31: # %cond.store29 +; AVX2-NEXT: .LBB16_31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX2-NEXT: .LBB16_32: # %else30 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -6873,22 +7029,17 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 +; AVX512F-NEXT: vpmovmskb %xmm3, %eax ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB16_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB16_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB16_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -6897,21 +7048,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB16_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB16_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB16_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -6920,21 +7065,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB16_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB16_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB16_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -6943,21 +7082,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB16_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB16_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB16_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -6966,21 +7099,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB16_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB16_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB16_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -6989,21 +7116,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB16_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB16_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB16_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -7012,21 +7133,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB16_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB16_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB16_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -7035,21 +7150,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB16_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB16_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB16_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -7083,19 +7192,22 @@ define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) { ; SSE2-LABEL: truncstore_v8i16_v8i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqw %xmm1, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 -; SSE2-NEXT: movd %xmm3, %eax +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm3, %xmm2 +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB17_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB17_2: # %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB17_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -7106,15 +7218,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB17_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB17_6: # %else4 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB17_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -7124,15 +7239,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB17_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB17_10: # %else8 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB17_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -7142,15 +7260,18 @@ ; SSE2-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB17_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB17_14: # %else12 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB17_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -7164,14 +7285,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm2, %eax +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB17_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB17_2: # %else -; SSE4-NEXT: pextrb $2, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB17_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -7180,14 +7304,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB17_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB17_6: # %else4 -; SSE4-NEXT: pextrb $6, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB17_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -7196,14 +7323,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB17_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB17_10: # %else8 -; SSE4-NEXT: pextrb $10, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB17_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -7212,14 +7342,17 @@ ; SSE4-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB17_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB17_14: # %else12 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB17_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -7232,14 +7365,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $0, %xmm2, %eax +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB17_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB17_2: # %else -; AVX-NEXT: vpextrb $2, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB17_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -7248,14 +7383,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $4, %al ; AVX-NEXT: je .LBB17_6 ; AVX-NEXT: # %bb.5: # %cond.store3 ; AVX-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX-NEXT: .LBB17_6: # %else4 -; AVX-NEXT: vpextrb $6, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB17_8 ; AVX-NEXT: # %bb.7: # %cond.store5 ; AVX-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -7264,14 +7401,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $8, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $16, %al ; AVX-NEXT: je .LBB17_10 ; AVX-NEXT: # %bb.9: # %cond.store7 ; AVX-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX-NEXT: .LBB17_10: # %else8 -; AVX-NEXT: vpextrb $10, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $32, %al ; AVX-NEXT: je .LBB17_12 ; AVX-NEXT: # %bb.11: # %cond.store9 ; AVX-NEXT: vpextrb $10, %xmm0, 5(%rdi) @@ -7280,14 +7419,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $64, %al ; AVX-NEXT: je .LBB17_14 ; AVX-NEXT: # %bb.13: # %cond.store11 ; AVX-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX-NEXT: .LBB17_14: # %else12 -; AVX-NEXT: vpextrb $14, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 +; AVX-NEXT: vpmovmskb %xmm1, %eax +; AVX-NEXT: testb $-128, %al ; AVX-NEXT: je .LBB17_16 ; AVX-NEXT: # %bb.15: # %cond.store13 ; AVX-NEXT: vpextrb $14, %xmm0, 7(%rdi) Index: test/CodeGen/X86/masked_store_trunc_ssat.ll =================================================================== --- test/CodeGen/X86/masked_store_trunc_ssat.ll +++ test/CodeGen/X86/masked_store_trunc_ssat.ll @@ -13,290 +13,322 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm6, %xmm9 -; SSE2-NEXT: movdqa %xmm9, %xmm8 -; SSE2-NEXT: packssdw %xmm0, %xmm8 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483647,2147483647] -; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [2147483648,2147483648] +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm6, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483647,2147483647] +; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm2, %xmm6 -; SSE2-NEXT: pxor %xmm12, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [4294967295,4294967295] -; SSE2-NEXT: movdqa %xmm11, %xmm7 +; SSE2-NEXT: pxor %xmm11, %xmm6 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [4294967295,4294967295] +; SSE2-NEXT: movdqa %xmm10, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm13 -; SSE2-NEXT: pand %xmm13, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm13 -; SSE2-NEXT: por %xmm2, %xmm13 +; SSE2-NEXT: pand %xmm12, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm12 +; SSE2-NEXT: pand %xmm12, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm12 +; SSE2-NEXT: por %xmm2, %xmm12 ; SSE2-NEXT: movdqa %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm12, %xmm2 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm2 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm14, %xmm7 +; SSE2-NEXT: pand %xmm13, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm12, %xmm3 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm3 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm14, %xmm7 +; SSE2-NEXT: pand %xmm13, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm3 ; SSE2-NEXT: pand %xmm3, %xmm0 -; SSE2-NEXT: pandn %xmm10, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm3 ; SSE2-NEXT: por %xmm0, %xmm3 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm6 ; SSE2-NEXT: pand %xmm6, %xmm1 -; SSE2-NEXT: pandn %xmm10, %xmm6 +; SSE2-NEXT: pandn %xmm9, %xmm6 ; SSE2-NEXT: por %xmm1, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562067968,18446744071562067968] -; SSE2-NEXT: movdqa %xmm6, %xmm1 -; SSE2-NEXT: pxor %xmm12, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm14 = [18446744069414584320,18446744069414584320] -; SSE2-NEXT: movdqa %xmm1, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm14, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm14, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm1, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm6 -; SSE2-NEXT: pandn %xmm10, %xmm0 -; SSE2-NEXT: por %xmm6, %xmm0 -; SSE2-NEXT: movdqa %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm12, %xmm1 -; SSE2-NEXT: movdqa %xmm1, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm14, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm14, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm11, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm6[1,1,3,3] -; SSE2-NEXT: por %xmm7, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm1 -; SSE2-NEXT: por %xmm3, %xmm1 -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm0[0,2] -; SSE2-NEXT: movdqa %xmm2, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744071562067968,18446744071562067968] +; SSE2-NEXT: movdqa %xmm6, %xmm0 +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [18446744069414584320,18446744069414584320] +; SSE2-NEXT: movdqa %xmm0, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm13, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm13, %xmm0 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] +; SSE2-NEXT: pand %xmm1, %xmm0 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm0, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm6 +; SSE2-NEXT: pandn %xmm9, %xmm1 +; SSE2-NEXT: por %xmm6, %xmm1 +; SSE2-NEXT: movdqa %xmm3, %xmm0 +; SSE2-NEXT: pxor %xmm11, %xmm0 ; SSE2-NEXT: movdqa %xmm0, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm14, %xmm6 +; SSE2-NEXT: pcmpgtd %xmm13, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm13, %xmm0 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] +; SSE2-NEXT: pand %xmm10, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] +; SSE2-NEXT: por %xmm7, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm0 +; SSE2-NEXT: por %xmm3, %xmm0 +; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] +; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: pxor %xmm11, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm6 +; SSE2-NEXT: pcmpgtd %xmm13, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm14, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm13, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[1,1,3,3] -; SSE2-NEXT: pxor %xmm13, %xmm12 -; SSE2-NEXT: movdqa %xmm12, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm14, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm14, %xmm12 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm12[1,1,3,3] -; SSE2-NEXT: pand %xmm7, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[1,1,3,3] -; SSE2-NEXT: movd %xmm8, %eax +; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[1,1,3,3] +; SSE2-NEXT: pxor %xmm12, %xmm11 +; SSE2-NEXT: movdqa %xmm11, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm13, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm13, %xmm11 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,1,3,3] +; SSE2-NEXT: pand %xmm6, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB0_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movss %xmm1, (%rdi) +; SSE2-NEXT: movss %xmm0, (%rdi) ; SSE2-NEXT: .LBB0_2: # %else -; SSE2-NEXT: por %xmm11, %xmm3 -; SSE2-NEXT: por %xmm7, %xmm0 -; SSE2-NEXT: psrlq $16, %xmm9 -; SSE2-NEXT: movd %xmm9, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: por %xmm10, %xmm3 +; SSE2-NEXT: por %xmm1, %xmm7 +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB0_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm6, 4(%rdi) +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] +; SSE2-NEXT: movd %xmm1, 4(%rdi) ; SSE2-NEXT: .LBB0_4: # %else2 ; SSE2-NEXT: pand %xmm3, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm3 -; SSE2-NEXT: pand %xmm0, %xmm13 -; SSE2-NEXT: pandn %xmm10, %xmm0 -; SSE2-NEXT: pxor %xmm6, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 -; SSE2-NEXT: pxor %xmm4, %xmm7 -; SSE2-NEXT: pextrw $4, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pandn %xmm9, %xmm3 +; SSE2-NEXT: pand %xmm7, %xmm12 +; SSE2-NEXT: pandn %xmm9, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB0_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,0,1] +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm4, 8(%rdi) ; SSE2-NEXT: .LBB0_6: # %else4 ; SSE2-NEXT: por %xmm3, %xmm2 -; SSE2-NEXT: por %xmm0, %xmm13 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: por %xmm7, %xmm12 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB0_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) ; SSE2-NEXT: .LBB0_8: # %else6 -; SSE2-NEXT: shufps {{.*#+}} xmm13 = xmm13[0,2],xmm2[0,2] +; SSE2-NEXT: shufps {{.*#+}} xmm12 = xmm12[0,2],xmm2[0,2] ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB0_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 -; SSE2-NEXT: movss %xmm13, 16(%rdi) +; SSE2-NEXT: movss %xmm12, 16(%rdi) ; SSE2-NEXT: .LBB0_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB0_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[1,1,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm12[1,1,2,3] ; SSE2-NEXT: movd %xmm0, 20(%rdi) ; SSE2-NEXT: .LBB0_12: # %else10 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB0_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm13[2,3,0,1] +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm12[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 24(%rdi) ; SSE2-NEXT: .LBB0_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB0_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[3,1,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm12[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 28(%rdi) ; SSE2-NEXT: .LBB0_16: # %else14 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v8i64_v8i32: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm9 +; SSE4-NEXT: movdqa %xmm0, %xmm8 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 -; SSE4-NEXT: pxor %xmm0, %xmm8 -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [2147483647,2147483647] +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm0, %xmm7 ; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [2147483647,2147483647] +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm10 -; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm9 +; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm9 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 -; SSE4-NEXT: movdqa %xmm7, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm2 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 +; SSE4-NEXT: movdqa %xmm6, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm3 +; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm3 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 -; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968] -; SSE4-NEXT: movapd %xmm7, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm2, %xmm1 -; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm1 -; SSE4-NEXT: movapd %xmm3, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm2, %xmm7 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 -; SSE4-NEXT: shufps {{.*#+}} xmm7 = xmm7[0,2],xmm1[0,2] +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm6 +; SSE4-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968] ; SSE4-NEXT: movapd %xmm6, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm2, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm3 -; SSE4-NEXT: movapd %xmm10, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm8, %eax +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm8, %xmm1 +; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 +; SSE4-NEXT: movapd %xmm3, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm8, %xmm6 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 +; SSE4-NEXT: shufps {{.*#+}} xmm6 = xmm6[0,2],xmm1[0,2] +; SSE4-NEXT: movapd %xmm2, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm8, %xmm3 +; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 +; SSE4-NEXT: movapd %xmm9, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm8 ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB0_2 ; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: movss %xmm7, (%rdi) +; SSE4-NEXT: movss %xmm6, (%rdi) ; SSE4-NEXT: .LBB0_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB0_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: extractps $1, %xmm7, 4(%rdi) +; SSE4-NEXT: extractps $1, %xmm6, 4(%rdi) ; SSE4-NEXT: .LBB0_4: # %else2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB0_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 -; SSE4-NEXT: extractps $2, %xmm7, 8(%rdi) +; SSE4-NEXT: extractps $2, %xmm6, 8(%rdi) ; SSE4-NEXT: .LBB0_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB0_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 -; SSE4-NEXT: extractps $3, %xmm7, 12(%rdi) +; SSE4-NEXT: extractps $3, %xmm6, 12(%rdi) ; SSE4-NEXT: .LBB0_8: # %else6 -; SSE4-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] -; SSE4-NEXT: xorps %xmm1, %xmm1 +; SSE4-NEXT: shufps {{.*#+}} xmm8 = xmm8[0,2],xmm3[0,2] +; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB0_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 -; SSE4-NEXT: movss %xmm2, 16(%rdi) +; SSE4-NEXT: movss %xmm8, 16(%rdi) ; SSE4-NEXT: .LBB0_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB0_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 -; SSE4-NEXT: extractps $1, %xmm2, 20(%rdi) +; SSE4-NEXT: extractps $1, %xmm8, 20(%rdi) ; SSE4-NEXT: .LBB0_12: # %else10 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB0_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 -; SSE4-NEXT: extractps $2, %xmm2, 24(%rdi) +; SSE4-NEXT: extractps $2, %xmm8, 24(%rdi) ; SSE4-NEXT: .LBB0_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB0_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 -; SSE4-NEXT: extractps $3, %xmm2, 28(%rdi) +; SSE4-NEXT: extractps $3, %xmm8, 28(%rdi) ; SSE4-NEXT: .LBB0_16: # %else14 ; SSE4-NEXT: retq ; @@ -411,132 +443,133 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm6, %xmm9 -; SSE2-NEXT: movdqa %xmm9, %xmm8 -; SSE2-NEXT: packssdw %xmm0, %xmm8 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [32767,32767] -; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [2147483648,2147483648] +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm6, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [32767,32767] +; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm2, %xmm6 -; SSE2-NEXT: pxor %xmm12, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147516415,2147516415] -; SSE2-NEXT: movdqa %xmm11, %xmm7 +; SSE2-NEXT: pxor %xmm11, %xmm6 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147516415,2147516415] +; SSE2-NEXT: movdqa %xmm10, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm14 -; SSE2-NEXT: pand %xmm14, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm14 -; SSE2-NEXT: por %xmm2, %xmm14 +; SSE2-NEXT: pand %xmm12, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm13 +; SSE2-NEXT: pand %xmm13, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm13 +; SSE2-NEXT: por %xmm2, %xmm13 ; SSE2-NEXT: movdqa %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm12, %xmm2 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm2 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm12, %xmm3 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm3 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm3 ; SSE2-NEXT: pand %xmm3, %xmm0 -; SSE2-NEXT: pandn %xmm10, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm3 ; SSE2-NEXT: por %xmm0, %xmm3 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm6 ; SSE2-NEXT: pand %xmm6, %xmm1 -; SSE2-NEXT: pandn %xmm10, %xmm6 +; SSE2-NEXT: pandn %xmm9, %xmm6 ; SSE2-NEXT: por %xmm1, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744073709518848,18446744073709518848] +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744073709518848,18446744073709518848] ; SSE2-NEXT: movdqa %xmm6, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [18446744071562035200,18446744071562035200] +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562035200,18446744071562035200] ; SSE2-NEXT: movdqa %xmm0, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm1 ; SSE2-NEXT: pand %xmm1, %xmm6 -; SSE2-NEXT: pandn %xmm10, %xmm1 +; SSE2-NEXT: pandn %xmm9, %xmm1 ; SSE2-NEXT: por %xmm6, %xmm1 ; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 +; SSE2-NEXT: pxor %xmm11, %xmm0 ; SSE2-NEXT: movdqa %xmm0, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm0 ; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm0 +; SSE2-NEXT: pandn %xmm9, %xmm0 ; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 ; SSE2-NEXT: movdqa %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm12, %xmm1 +; SSE2-NEXT: pxor %xmm11, %xmm1 ; SSE2-NEXT: movdqa %xmm1, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] ; SSE2-NEXT: por %xmm1, %xmm3 ; SSE2-NEXT: pand %xmm3, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm3 ; SSE2-NEXT: por %xmm2, %xmm3 -; SSE2-NEXT: pxor %xmm14, %xmm12 -; SSE2-NEXT: movdqa %xmm12, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm1 +; SSE2-NEXT: pxor %xmm13, %xmm11 +; SSE2-NEXT: movdqa %xmm11, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm12 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm12[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3] ; SSE2-NEXT: pand %xmm2, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] ; SSE2-NEXT: por %xmm6, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm14 -; SSE2-NEXT: pandn %xmm10, %xmm1 -; SSE2-NEXT: por %xmm14, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm13 +; SSE2-NEXT: pandn %xmm9, %xmm1 +; SSE2-NEXT: por %xmm13, %xmm1 ; SSE2-NEXT: packssdw %xmm3, %xmm1 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB1_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB1_2: # %else -; SSE2-NEXT: psrlq $16, %xmm9 -; SSE2-NEXT: movd %xmm9, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB1_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -546,15 +579,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB1_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB1_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB1_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -564,15 +602,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB1_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB1_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB1_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -582,15 +624,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB1_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB1_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB1_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -600,153 +646,171 @@ ; ; SSE4-LABEL: truncstore_v8i64_v8i16: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm9 +; SSE4-NEXT: movdqa %xmm0, %xmm8 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 -; SSE4-NEXT: pxor %xmm0, %xmm8 -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [32767,32767] +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm0, %xmm7 ; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [32767,32767] +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm10 -; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm9 +; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm9 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm2 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 -; SSE4-NEXT: movdqa %xmm7, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm10 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm10 +; SSE4-NEXT: movdqa %xmm6, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm3 +; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm3 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm6 ; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] -; SSE4-NEXT: movapd %xmm7, %xmm0 +; SSE4-NEXT: movapd %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm6 +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm2 ; SSE4-NEXT: movapd %xmm3, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm7 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 -; SSE4-NEXT: packssdw %xmm6, %xmm7 -; SSE4-NEXT: movapd %xmm2, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 +; SSE4-NEXT: movdqa %xmm1, %xmm6 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 +; SSE4-NEXT: packssdw %xmm2, %xmm6 ; SSE4-NEXT: movapd %xmm10, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm1 -; SSE4-NEXT: packssdw %xmm3, %xmm1 -; SSE4-NEXT: packssdw %xmm1, %xmm7 -; SSE4-NEXT: pextrb $0, %xmm8, %eax +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm2 +; SSE4-NEXT: movapd %xmm9, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm1 +; SSE4-NEXT: packssdw %xmm2, %xmm1 +; SSE4-NEXT: packssdw %xmm1, %xmm6 ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB1_2 ; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: pextrw $0, %xmm7, (%rdi) +; SSE4-NEXT: pextrw $0, %xmm6, (%rdi) ; SSE4-NEXT: .LBB1_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB1_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: pextrw $1, %xmm7, 2(%rdi) +; SSE4-NEXT: pextrw $1, %xmm6, 2(%rdi) ; SSE4-NEXT: .LBB1_4: # %else2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB1_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 -; SSE4-NEXT: pextrw $2, %xmm7, 4(%rdi) +; SSE4-NEXT: pextrw $2, %xmm6, 4(%rdi) ; SSE4-NEXT: .LBB1_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB1_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 -; SSE4-NEXT: pextrw $3, %xmm7, 6(%rdi) +; SSE4-NEXT: pextrw $3, %xmm6, 6(%rdi) ; SSE4-NEXT: .LBB1_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB1_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 -; SSE4-NEXT: pextrw $4, %xmm7, 8(%rdi) +; SSE4-NEXT: pextrw $4, %xmm6, 8(%rdi) ; SSE4-NEXT: .LBB1_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB1_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 -; SSE4-NEXT: pextrw $5, %xmm7, 10(%rdi) +; SSE4-NEXT: pextrw $5, %xmm6, 10(%rdi) ; SSE4-NEXT: .LBB1_12: # %else10 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB1_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 -; SSE4-NEXT: pextrw $6, %xmm7, 12(%rdi) +; SSE4-NEXT: pextrw $6, %xmm6, 12(%rdi) ; SSE4-NEXT: .LBB1_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB1_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 -; SSE4-NEXT: pextrw $7, %xmm7, 14(%rdi) +; SSE4-NEXT: pextrw $7, %xmm6, 14(%rdi) ; SSE4-NEXT: .LBB1_16: # %else14 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v8i64_v8i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm5 +; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vmovapd {{.*#+}} ymm6 = [32767,32767,32767,32767] -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [32767,32767] -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm3, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm9 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm9, %ymm7 -; AVX1-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm3, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm3, %ymm3 -; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm6, %ymm0 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [32767,32767,32767,32767] +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [32767,32767] +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm1, %xmm7, %xmm8 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm5, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm0, %xmm7, %xmm7 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm5, %ymm0 +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [18446744073709518848,18446744073709518848] ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm0, %xmm9 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm9, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vpcmpgtq %xmm7, %xmm0, %xmm8 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm5, %ymm0 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm7 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm3, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 +; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm5, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 +; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB1_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB1_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB1_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -755,16 +819,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB1_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB1_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB1_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -774,30 +838,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB1_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB1_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB1_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB1_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB1_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB1_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB1_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -809,86 +877,82 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [32767,32767,32767,32767] -; AVX2-NEXT: vpcmpgtq %ymm0, %ymm6, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 -; AVX2-NEXT: vpcmpgtq %ymm1, %ymm6, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] -; AVX2-NEXT: vpcmpgtq %ymm6, %ymm1, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpcmpgtq %ymm6, %ymm0, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [32767,32767,32767,32767] +; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX2-NEXT: vpcmpgtq %ymm1, %ymm3, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB1_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB1_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB1_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB1_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB1_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB1_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB1_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB1_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB1_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB1_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB1_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB1_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB1_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB1_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB1_15 +; AVX2-NEXT: .LBB1_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB1_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB1_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB1_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB1_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB1_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -995,132 +1059,133 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm6, %xmm9 -; SSE2-NEXT: movdqa %xmm9, %xmm8 -; SSE2-NEXT: packssdw %xmm0, %xmm8 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [127,127] -; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [2147483648,2147483648] +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm6, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [127,127] +; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm2, %xmm6 -; SSE2-NEXT: pxor %xmm12, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483775,2147483775] -; SSE2-NEXT: movdqa %xmm11, %xmm7 +; SSE2-NEXT: pxor %xmm11, %xmm6 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483775,2147483775] +; SSE2-NEXT: movdqa %xmm10, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm14 -; SSE2-NEXT: pand %xmm14, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm14 -; SSE2-NEXT: por %xmm2, %xmm14 +; SSE2-NEXT: pand %xmm12, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm13 +; SSE2-NEXT: pand %xmm13, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm13 +; SSE2-NEXT: por %xmm2, %xmm13 ; SSE2-NEXT: movdqa %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm12, %xmm2 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm2 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm2 +; SSE2-NEXT: pandn %xmm9, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm12, %xmm3 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm3 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm3 ; SSE2-NEXT: pand %xmm3, %xmm0 -; SSE2-NEXT: pandn %xmm10, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm3 ; SSE2-NEXT: por %xmm0, %xmm3 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm6 ; SSE2-NEXT: pand %xmm6, %xmm1 -; SSE2-NEXT: pandn %xmm10, %xmm6 +; SSE2-NEXT: pandn %xmm9, %xmm6 ; SSE2-NEXT: por %xmm1, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744073709551488,18446744073709551488] +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [18446744073709551488,18446744073709551488] ; SSE2-NEXT: movdqa %xmm6, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [18446744071562067840,18446744071562067840] +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [18446744071562067840,18446744071562067840] ; SSE2-NEXT: movdqa %xmm0, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm1 ; SSE2-NEXT: pand %xmm1, %xmm6 -; SSE2-NEXT: pandn %xmm10, %xmm1 +; SSE2-NEXT: pandn %xmm9, %xmm1 ; SSE2-NEXT: por %xmm6, %xmm1 ; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 +; SSE2-NEXT: pxor %xmm11, %xmm0 ; SSE2-NEXT: movdqa %xmm0, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm0[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 +; SSE2-NEXT: pand %xmm12, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm0 ; SSE2-NEXT: pand %xmm0, %xmm3 -; SSE2-NEXT: pandn %xmm10, %xmm0 +; SSE2-NEXT: pandn %xmm9, %xmm0 ; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 ; SSE2-NEXT: movdqa %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm12, %xmm1 +; SSE2-NEXT: pxor %xmm11, %xmm1 ; SSE2-NEXT: movdqa %xmm1, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] ; SSE2-NEXT: por %xmm1, %xmm3 ; SSE2-NEXT: pand %xmm3, %xmm2 -; SSE2-NEXT: pandn %xmm10, %xmm3 +; SSE2-NEXT: pandn %xmm9, %xmm3 ; SSE2-NEXT: por %xmm2, %xmm3 -; SSE2-NEXT: pxor %xmm14, %xmm12 -; SSE2-NEXT: movdqa %xmm12, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm11, %xmm1 +; SSE2-NEXT: pxor %xmm13, %xmm11 +; SSE2-NEXT: movdqa %xmm11, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm10, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm12 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm12[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm11[1,1,3,3] ; SSE2-NEXT: pand %xmm2, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] ; SSE2-NEXT: por %xmm6, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm14 -; SSE2-NEXT: pandn %xmm10, %xmm1 -; SSE2-NEXT: por %xmm14, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm13 +; SSE2-NEXT: pandn %xmm9, %xmm1 +; SSE2-NEXT: por %xmm13, %xmm1 ; SSE2-NEXT: packssdw %xmm3, %xmm1 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB2_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB2_2: # %else -; SSE2-NEXT: psrlq $16, %xmm9 -; SSE2-NEXT: movd %xmm9, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB2_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -1131,15 +1196,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB2_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB2_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB2_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -1149,15 +1219,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB2_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB2_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB2_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -1167,15 +1241,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB2_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB2_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB2_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -1185,153 +1263,171 @@ ; ; SSE4-LABEL: truncstore_v8i64_v8i8: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm9 +; SSE4-NEXT: movdqa %xmm0, %xmm8 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 -; SSE4-NEXT: pxor %xmm0, %xmm8 -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [127,127] +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm0, %xmm7 ; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [127,127] +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm10 -; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm10 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm9 +; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm9 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm2 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 -; SSE4-NEXT: movdqa %xmm7, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm9, %xmm0 -; SSE4-NEXT: movdqa %xmm7, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm3 -; SSE4-NEXT: movdqa %xmm7, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm10 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm10 +; SSE4-NEXT: movdqa %xmm6, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm8, %xmm0 +; SSE4-NEXT: movdqa %xmm6, %xmm3 +; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm3 +; SSE4-NEXT: movdqa %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm6 ; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488] -; SSE4-NEXT: movapd %xmm7, %xmm0 +; SSE4-NEXT: movapd %xmm6, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm7, %xmm6 +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm2 ; SSE4-NEXT: movapd %xmm3, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm7 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm7 -; SSE4-NEXT: packssdw %xmm6, %xmm7 -; SSE4-NEXT: movapd %xmm2, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 +; SSE4-NEXT: movdqa %xmm1, %xmm6 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 +; SSE4-NEXT: packssdw %xmm2, %xmm6 ; SSE4-NEXT: movapd %xmm10, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm1 -; SSE4-NEXT: packssdw %xmm3, %xmm1 -; SSE4-NEXT: packssdw %xmm1, %xmm7 -; SSE4-NEXT: pextrb $0, %xmm8, %eax +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: blendvpd %xmm0, %xmm10, %xmm2 +; SSE4-NEXT: movapd %xmm9, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm9, %xmm1 +; SSE4-NEXT: packssdw %xmm2, %xmm1 +; SSE4-NEXT: packssdw %xmm1, %xmm6 ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB2_2 ; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: pextrb $0, %xmm7, (%rdi) +; SSE4-NEXT: pextrb $0, %xmm6, (%rdi) ; SSE4-NEXT: .LBB2_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm7 +; SSE4-NEXT: packsswb %xmm0, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB2_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: pextrb $2, %xmm7, 1(%rdi) +; SSE4-NEXT: pextrb $2, %xmm6, 1(%rdi) ; SSE4-NEXT: .LBB2_4: # %else2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB2_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 -; SSE4-NEXT: pextrb $4, %xmm7, 2(%rdi) +; SSE4-NEXT: pextrb $4, %xmm6, 2(%rdi) ; SSE4-NEXT: .LBB2_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB2_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 -; SSE4-NEXT: pextrb $6, %xmm7, 3(%rdi) +; SSE4-NEXT: pextrb $6, %xmm6, 3(%rdi) ; SSE4-NEXT: .LBB2_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB2_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 -; SSE4-NEXT: pextrb $8, %xmm7, 4(%rdi) +; SSE4-NEXT: pextrb $8, %xmm6, 4(%rdi) ; SSE4-NEXT: .LBB2_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB2_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 -; SSE4-NEXT: pextrb $10, %xmm7, 5(%rdi) +; SSE4-NEXT: pextrb $10, %xmm6, 5(%rdi) ; SSE4-NEXT: .LBB2_12: # %else10 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB2_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 -; SSE4-NEXT: pextrb $12, %xmm7, 6(%rdi) +; SSE4-NEXT: pextrb $12, %xmm6, 6(%rdi) ; SSE4-NEXT: .LBB2_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB2_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 -; SSE4-NEXT: pextrb $14, %xmm7, 7(%rdi) +; SSE4-NEXT: pextrb $14, %xmm6, 7(%rdi) ; SSE4-NEXT: .LBB2_16: # %else14 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v8i64_v8i8: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm5 +; AVX1-NEXT: vpxor %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vmovapd {{.*#+}} ymm6 = [127,127,127,127] -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [127,127] -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm3, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm1, %xmm3, %xmm9 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm9, %ymm7 -; AVX1-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm3, %xmm7 -; AVX1-NEXT: vpcmpgtq %xmm0, %xmm3, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm3, %ymm3 -; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm6, %ymm0 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [127,127,127,127] +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [127,127] +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm1, %xmm7, %xmm8 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm5, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm7, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm0, %xmm7, %xmm7 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm5, %ymm0 +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 ; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [18446744073709551488,18446744073709551488] ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm0, %xmm9 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm9, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vpcmpgtq %xmm7, %xmm0, %xmm8 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm8, %ymm6 +; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm5, %ymm0 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm6, %xmm6 ; AVX1-NEXT: vpcmpgtq %xmm7, %xmm1, %xmm7 ; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm7, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm3, %ymm1 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 +; AVX1-NEXT: vblendvpd %ymm6, %ymm1, %ymm5, %ymm1 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 +; AVX1-NEXT: vpackssdw %xmm5, %xmm1, %xmm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB2_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB2_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB2_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -1340,16 +1436,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB2_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB2_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB2_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -1359,30 +1455,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB2_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB2_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB2_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB2_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB2_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB2_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB2_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -1394,86 +1494,82 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [127,127,127,127] -; AVX2-NEXT: vpcmpgtq %ymm0, %ymm6, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 -; AVX2-NEXT: vpcmpgtq %ymm1, %ymm6, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] -; AVX2-NEXT: vpcmpgtq %ymm6, %ymm1, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpcmpgtq %ymm6, %ymm0, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [127,127,127,127] +; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX2-NEXT: vpcmpgtq %ymm1, %ymm3, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm1, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB2_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB2_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB2_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB2_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB2_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB2_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB2_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB2_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB2_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB2_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB2_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB2_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB2_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB2_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB2_15 +; AVX2-NEXT: .LBB2_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB2_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB2_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB2_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB2_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB2_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -1580,40 +1676,43 @@ define void @truncstore_v4i64_v4i32(<4 x i64> %x, <4 x i32>* %p, <4 x i32> %mask) { ; SSE2-LABEL: truncstore_v4i64_v4i32: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm10, %xmm10 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm10 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [2147483647,2147483647] -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [4294967295,4294967295] ; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm5 -; SSE2-NEXT: pand %xmm5, %xmm0 -; SSE2-NEXT: pandn %xmm8, %xmm5 -; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm4 +; SSE2-NEXT: pand %xmm4, %xmm0 +; SSE2-NEXT: pandn %xmm8, %xmm4 +; SSE2-NEXT: por %xmm0, %xmm4 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm9, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] +; SSE2-NEXT: pxor %xmm3, %xmm0 +; SSE2-NEXT: movdqa %xmm9, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: pand %xmm3, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm3 -; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] +; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pand %xmm5, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm5 +; SSE2-NEXT: por %xmm1, %xmm5 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744071562067968,18446744071562067968] -; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 +; SSE2-NEXT: movdqa %xmm5, %xmm0 +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [18446744069414584320,18446744069414584320] ; SSE2-NEXT: movdqa %xmm0, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 @@ -1623,57 +1722,53 @@ ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm3 +; SSE2-NEXT: pand %xmm1, %xmm5 ; SSE2-NEXT: pandn %xmm8, %xmm1 -; SSE2-NEXT: por %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm5, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm0 +; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm3 +; SSE2-NEXT: movdqa %xmm3, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] -; SSE2-NEXT: pand %xmm3, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm5 +; SSE2-NEXT: por %xmm3, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm4 ; SSE2-NEXT: pandn %xmm8, %xmm0 -; SSE2-NEXT: por %xmm5, %xmm0 +; SSE2-NEXT: por %xmm4, %xmm0 ; SSE2-NEXT: shufps {{.*#+}} xmm0 = xmm0[0,2],xmm1[0,2] -; SSE2-NEXT: movd %xmm10, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB3_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movss %xmm0, (%rdi) ; SSE2-NEXT: .LBB3_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm10 -; SSE2-NEXT: pextrw $2, %xmm10, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB3_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm3, 4(%rdi) +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] +; SSE2-NEXT: movd %xmm1, 4(%rdi) ; SSE2-NEXT: .LBB3_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB3_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB3_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB3_7 +; SSE2-NEXT: .LBB3_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB3_5: # %cond.store3 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 8(%rdi) -; SSE2-NEXT: .LBB3_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB3_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB3_7: # %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) -; SSE2-NEXT: .LBB3_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i32: @@ -1683,31 +1778,30 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm0, %xmm4 -; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [2147483647,2147483647] -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movmskps %xmm4, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [2147483647,2147483647] +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm5, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm4 ; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968] -; SSE4-NEXT: movapd %xmm5, %xmm0 +; SSE4-NEXT: movapd %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 ; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm3 -; SSE4-NEXT: movapd %xmm6, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm3 +; SSE4-NEXT: movapd %xmm5, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 +; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm1 ; SSE4-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB3_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) ; SSE4-NEXT: .LBB3_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB3_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: extractps $1, %xmm1, 4(%rdi) @@ -1716,18 +1810,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB3_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB3_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB3_7 +; SSE4-NEXT: .LBB3_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB3_5: # %cond.store3 ; SSE4-NEXT: extractps $2, %xmm1, 8(%rdi) -; SSE4-NEXT: .LBB3_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB3_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB3_7: # %cond.store5 ; SSE4-NEXT: extractps $3, %xmm1, 12(%rdi) -; SSE4-NEXT: .LBB3_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i32: @@ -1827,40 +1923,43 @@ define void @truncstore_v4i64_v4i16(<4 x i64> %x, <4 x i16>* %p, <4 x i32> %mask) { ; SSE2-LABEL: truncstore_v4i64_v4i16: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm10, %xmm10 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm10 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [32767,32767] -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147516415,2147516415] ; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm5 -; SSE2-NEXT: pand %xmm5, %xmm0 -; SSE2-NEXT: pandn %xmm8, %xmm5 -; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm4 +; SSE2-NEXT: pand %xmm4, %xmm0 +; SSE2-NEXT: pandn %xmm8, %xmm4 +; SSE2-NEXT: por %xmm0, %xmm4 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm9, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] +; SSE2-NEXT: pxor %xmm3, %xmm0 +; SSE2-NEXT: movdqa %xmm9, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: pand %xmm3, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm3 -; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] +; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pand %xmm5, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm5 +; SSE2-NEXT: por %xmm1, %xmm5 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709518848,18446744073709518848] -; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 +; SSE2-NEXT: movdqa %xmm5, %xmm0 +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562035200,18446744071562035200] ; SSE2-NEXT: movdqa %xmm0, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 @@ -1870,58 +1969,54 @@ ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm3 +; SSE2-NEXT: pand %xmm1, %xmm5 ; SSE2-NEXT: pandn %xmm8, %xmm1 -; SSE2-NEXT: por %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm5, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm0 +; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm3 +; SSE2-NEXT: movdqa %xmm3, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] -; SSE2-NEXT: pand %xmm3, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm5 +; SSE2-NEXT: por %xmm3, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm4 ; SSE2-NEXT: pandn %xmm8, %xmm0 -; SSE2-NEXT: por %xmm5, %xmm0 +; SSE2-NEXT: por %xmm4, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm10, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB4_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB4_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm10 -; SSE2-NEXT: pextrw $2, %xmm10, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB4_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) ; SSE2-NEXT: .LBB4_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB4_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB4_6: # %else4 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB4_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB4_7 +; SSE2-NEXT: .LBB4_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB4_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB4_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB4_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB4_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i16: @@ -1931,31 +2026,30 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm0, %xmm4 -; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [32767,32767] -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movmskps %xmm4, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [32767,32767] +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm5, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm4 ; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] -; SSE4-NEXT: movapd %xmm5, %xmm0 +; SSE4-NEXT: movapd %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 ; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm3 -; SSE4-NEXT: movapd %xmm6, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm3 +; SSE4-NEXT: movapd %xmm5, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 +; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm1 ; SSE4-NEXT: packssdw %xmm3, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB4_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) ; SSE4-NEXT: .LBB4_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB4_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm1, 2(%rdi) @@ -1964,18 +2058,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB4_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB4_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB4_7 +; SSE4-NEXT: .LBB4_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB4_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm1, 4(%rdi) -; SSE4-NEXT: .LBB4_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB4_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB4_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm1, 6(%rdi) -; SSE4-NEXT: .LBB4_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i16: @@ -1984,30 +2080,29 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [32767,32767,32767,32767] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [32767,32767] -; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 -; AVX1-NEXT: vpcmpgtq %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744073709518848,18446744073709518848] -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4 -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vmovmskps %xmm2, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [32767,32767,32767,32767] +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [32767,32767] +; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 +; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709518848,18446744073709518848] +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB4_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB4_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB4_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -2016,18 +2111,21 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB4_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB4_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB4_7 +; AVX1-NEXT: .LBB4_8: # %else6 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB4_5: # %cond.store3 ; AVX1-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX1-NEXT: .LBB4_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB4_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB4_7: # %cond.store5 ; AVX1-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX1-NEXT: .LBB4_8: # %else6 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -2037,22 +2135,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [32767,32767,32767,32767] -; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] -; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [32767,32767,32767,32767] +; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709518848,18446744073709518848,18446744073709518848,18446744073709518848] +; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB4_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB4_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB4_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -2061,18 +2158,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB4_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB4_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB4_7 +; AVX2-NEXT: .LBB4_8: # %else6 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB4_5: # %cond.store3 ; AVX2-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX2-NEXT: .LBB4_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB4_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB4_7: # %cond.store5 ; AVX2-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB4_8: # %else6 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -2157,40 +2257,43 @@ define void @truncstore_v4i64_v4i8(<4 x i64> %x, <4 x i8>* %p, <4 x i32> %mask) { ; SSE2-LABEL: truncstore_v4i64_v4i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm10, %xmm10 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm10 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [127,127] -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 ; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483775,2147483775] ; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm5 -; SSE2-NEXT: pand %xmm5, %xmm0 -; SSE2-NEXT: pandn %xmm8, %xmm5 -; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm6, %xmm4 +; SSE2-NEXT: pand %xmm4, %xmm0 +; SSE2-NEXT: pandn %xmm8, %xmm4 +; SSE2-NEXT: por %xmm0, %xmm4 ; SSE2-NEXT: movdqa %xmm1, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: movdqa %xmm9, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm3[0,0,2,2] +; SSE2-NEXT: pxor %xmm3, %xmm0 +; SSE2-NEXT: movdqa %xmm9, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] ; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm0, %xmm3 -; SSE2-NEXT: pand %xmm3, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm3 -; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] +; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: pand %xmm5, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm5 +; SSE2-NEXT: por %xmm1, %xmm5 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [18446744073709551488,18446744073709551488] -; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 +; SSE2-NEXT: movdqa %xmm5, %xmm0 +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [18446744071562067840,18446744071562067840] ; SSE2-NEXT: movdqa %xmm0, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 @@ -2200,58 +2303,54 @@ ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: pand %xmm1, %xmm3 +; SSE2-NEXT: pand %xmm1, %xmm5 ; SSE2-NEXT: pandn %xmm8, %xmm1 -; SSE2-NEXT: por %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm5, %xmm4 -; SSE2-NEXT: movdqa %xmm4, %xmm0 +; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm3 +; SSE2-NEXT: movdqa %xmm3, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] -; SSE2-NEXT: pand %xmm3, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm0[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm5 +; SSE2-NEXT: por %xmm3, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm4 ; SSE2-NEXT: pandn %xmm8, %xmm0 -; SSE2-NEXT: por %xmm5, %xmm0 +; SSE2-NEXT: por %xmm4, %xmm0 ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm10, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB5_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB5_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm10 -; SSE2-NEXT: pextrw $2, %xmm10, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB5_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 1(%rdi) ; SSE2-NEXT: .LBB5_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB5_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB5_6: # %else4 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB5_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB5_7 +; SSE2-NEXT: .LBB5_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB5_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB5_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB5_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB5_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i8: @@ -2261,31 +2360,30 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm0, %xmm4 -; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [127,127] -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movmskps %xmm4, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [127,127] +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movdqa %xmm5, %xmm6 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm6 -; SSE4-NEXT: movdqa %xmm5, %xmm0 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: movdqa %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm5 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm4 ; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488] -; SSE4-NEXT: movapd %xmm5, %xmm0 +; SSE4-NEXT: movapd %xmm4, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 ; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm3 -; SSE4-NEXT: movapd %xmm6, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm4, %xmm3 +; SSE4-NEXT: movapd %xmm5, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm6, %xmm1 +; SSE4-NEXT: blendvpd %xmm0, %xmm5, %xmm1 ; SSE4-NEXT: packssdw %xmm3, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB5_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) ; SSE4-NEXT: .LBB5_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB5_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm1, 1(%rdi) @@ -2294,18 +2392,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB5_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB5_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB5_7 +; SSE4-NEXT: .LBB5_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB5_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm1, 2(%rdi) -; SSE4-NEXT: .LBB5_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB5_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB5_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm1, 3(%rdi) -; SSE4-NEXT: .LBB5_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i8: @@ -2314,30 +2414,29 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [127,127,127,127] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [127,127] -; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 -; AVX1-NEXT: vpcmpgtq %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [18446744073709551488,18446744073709551488] -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm4, %xmm4 -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm0, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vmovmskps %xmm2, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [127,127,127,127] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127] +; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 +; AVX1-NEXT: vpcmpgtq %xmm0, %xmm4, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [18446744073709551488,18446744073709551488] +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm3 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm0, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB5_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB5_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB5_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -2346,18 +2445,21 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB5_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB5_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB5_7 +; AVX1-NEXT: .LBB5_8: # %else6 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB5_5: # %cond.store3 ; AVX1-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX1-NEXT: .LBB5_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB5_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB5_7: # %cond.store5 ; AVX1-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX1-NEXT: .LBB5_8: # %else6 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -2367,22 +2469,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [127,127,127,127] -; AVX2-NEXT: vpcmpgtq %ymm0, %ymm3, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] -; AVX2-NEXT: vpcmpgtq %ymm3, %ymm0, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackssdw %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [127,127,127,127] +; AVX2-NEXT: vpcmpgtq %ymm0, %ymm2, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm2 = [18446744073709551488,18446744073709551488,18446744073709551488,18446744073709551488] +; AVX2-NEXT: vpcmpgtq %ymm2, %ymm0, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB5_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB5_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB5_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -2391,18 +2492,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB5_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB5_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB5_7 +; AVX2-NEXT: .LBB5_8: # %else6 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB5_5: # %cond.store3 ; AVX2-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX2-NEXT: .LBB5_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB5_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB5_7: # %cond.store5 ; AVX2-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX2-NEXT: .LBB5_8: # %else6 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -2491,50 +2595,51 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [4294967295,4294967295] -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm4 -; SSE2-NEXT: por %xmm0, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320] -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967295,4294967295] +; SSE2-NEXT: movdqa %xmm3, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] ; SSE2-NEXT: pand %xmm5, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: pxor %xmm3, %xmm1 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744069414584320,18446744069414584320] +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] +; SSE2-NEXT: por %xmm1, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB6_2 -; SSE2-NEXT: # %bb.1: # %cond.store +; SSE2-NEXT: jne .LBB6_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB6_3 +; SSE2-NEXT: .LBB6_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB6_1: # %cond.store ; SSE2-NEXT: movd %xmm0, (%rdi) -; SSE2-NEXT: .LBB6_2: # %else -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB6_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB6_3: # %cond.store1 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 4(%rdi) -; SSE2-NEXT: .LBB6_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i32: @@ -2544,27 +2649,29 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [2147483647,2147483647] ; SSE4-NEXT: movdqa %xmm3, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 -; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744071562067968,18446744071562067968] +; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744071562067968,18446744071562067968] ; SSE4-NEXT: movapd %xmm3, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB6_2 -; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: movss %xmm2, (%rdi) -; SSE4-NEXT: .LBB6_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax +; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm1 ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB6_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: extractps $2, %xmm2, 4(%rdi) +; SSE4-NEXT: jne .LBB6_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB6_3 ; SSE4-NEXT: .LBB6_4: # %else2 ; SSE4-NEXT: retq +; SSE4-NEXT: .LBB6_1: # %cond.store +; SSE4-NEXT: movss %xmm1, (%rdi) +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: je .LBB6_4 +; SSE4-NEXT: .LBB6_3: # %cond.store1 +; SSE4-NEXT: extractps $2, %xmm1, 4(%rdi) +; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v2i64_v2i32: ; AVX1: # %bb.0: @@ -2656,51 +2763,52 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147516415,2147516415] -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm4 -; SSE2-NEXT: por %xmm0, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200] -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147516415,2147516415] +; SSE2-NEXT: movdqa %xmm3, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] ; SSE2-NEXT: pand %xmm5, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: pxor %xmm3, %xmm1 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562035200,18446744071562035200] +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] +; SSE2-NEXT: por %xmm1, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB7_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) -; SSE2-NEXT: .LBB7_2: # %else -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB7_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB7_3 +; SSE2-NEXT: .LBB7_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB7_1: # %cond.store +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB7_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB7_3: # %cond.store1 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) -; SSE2-NEXT: .LBB7_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i16: @@ -2710,27 +2818,29 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [32767,32767] ; SSE4-NEXT: movdqa %xmm3, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 -; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744073709518848,18446744073709518848] +; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] ; SSE4-NEXT: movapd %xmm3, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB7_2 -; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: pextrw $0, %xmm2, (%rdi) -; SSE4-NEXT: .LBB7_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax +; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm1 ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB7_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: pextrw $4, %xmm2, 2(%rdi) +; SSE4-NEXT: jne .LBB7_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB7_3 ; SSE4-NEXT: .LBB7_4: # %else2 ; SSE4-NEXT: retq +; SSE4-NEXT: .LBB7_1: # %cond.store +; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: je .LBB7_4 +; SSE4-NEXT: .LBB7_3: # %cond.store1 +; SSE4-NEXT: pextrw $4, %xmm1, 2(%rdi) +; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i16: ; AVX: # %bb.0: @@ -2738,24 +2848,26 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [32767,32767] -; AVX-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744073709518848,18446744073709518848] -; AVX-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax +; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [32767,32767] +; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 +; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709518848,18446744073709518848] +; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB7_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB7_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB7_3 +; AVX-NEXT: .LBB7_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB7_1: # %cond.store ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB7_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB7_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB7_3: # %cond.store1 ; AVX-NEXT: vpextrw $4, %xmm0, 2(%rdi) -; AVX-NEXT: .LBB7_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i16: @@ -2825,51 +2937,52 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483775,2147483775] -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm5 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm5[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm4, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm5[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm4 -; SSE2-NEXT: por %xmm0, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840] -; SSE2-NEXT: movdqa %xmm2, %xmm3 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm3[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483775,2147483775] +; SSE2-NEXT: movdqa %xmm3, %xmm4 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[1,1,3,3] ; SSE2-NEXT: pand %xmm5, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[1,1,3,3] -; SSE2-NEXT: por %xmm2, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm4[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm3 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: pxor %xmm3, %xmm1 +; SSE2-NEXT: movdqa {{.*#+}} xmm0 = [18446744071562067840,18446744071562067840] +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm2[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] +; SSE2-NEXT: por %xmm1, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB8_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) -; SSE2-NEXT: .LBB8_2: # %else -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB8_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB8_3 +; SSE2-NEXT: .LBB8_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB8_1: # %cond.store +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB8_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 +; SSE2-NEXT: .LBB8_3: # %cond.store1 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 1(%rdi) -; SSE2-NEXT: .LBB8_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i8: @@ -2879,27 +2992,29 @@ ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [127,127] ; SSE4-NEXT: movdqa %xmm3, %xmm0 ; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm3 -; SSE4-NEXT: movdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488] +; SSE4-NEXT: movdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488] ; SSE4-NEXT: movapd %xmm3, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm2, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm2 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB8_2 -; SSE4-NEXT: # %bb.1: # %cond.store -; SSE4-NEXT: pextrb $0, %xmm2, (%rdi) -; SSE4-NEXT: .LBB8_2: # %else -; SSE4-NEXT: pextrb $8, %xmm1, %eax +; SSE4-NEXT: pcmpgtq %xmm1, %xmm0 +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm1 ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB8_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 -; SSE4-NEXT: pextrb $8, %xmm2, 1(%rdi) +; SSE4-NEXT: jne .LBB8_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB8_3 ; SSE4-NEXT: .LBB8_4: # %else2 ; SSE4-NEXT: retq +; SSE4-NEXT: .LBB8_1: # %cond.store +; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: je .LBB8_4 +; SSE4-NEXT: .LBB8_3: # %cond.store1 +; SSE4-NEXT: pextrb $8, %xmm1, 1(%rdi) +; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i8: ; AVX: # %bb.0: @@ -2907,24 +3022,26 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127] -; AVX-NEXT: vpcmpgtq %xmm0, %xmm2, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [18446744073709551488,18446744073709551488] -; AVX-NEXT: vpcmpgtq %xmm2, %xmm0, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax +; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [127,127] +; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 +; AVX-NEXT: vmovdqa {{.*#+}} xmm1 = [18446744073709551488,18446744073709551488] +; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB8_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB8_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB8_3 +; AVX-NEXT: .LBB8_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB8_1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB8_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB8_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB8_3: # %cond.store1 ; AVX-NEXT: vpextrb $8, %xmm0, 1(%rdi) -; AVX-NEXT: .LBB8_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i8: @@ -2989,21 +3106,25 @@ define void @truncstore_v16i32_v16i16(<16 x i32> %x, <16 x i16>* %p, <16 x i32> %mask) { ; SSE2-LABEL: truncstore_v16i32_v16i16: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm8, %xmm8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm9 +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB9_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB9_2: # %else -; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm9, %xmm8 -; SSE2-NEXT: pextrw $2, %xmm8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB9_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -3011,37 +3132,44 @@ ; SSE2-NEXT: .LBB9_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm9 -; SSE2-NEXT: pextrw $4, %xmm9, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB9_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB9_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB9_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) ; SSE2-NEXT: .LBB9_8: # %else6 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm4, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB9_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB9_10: # %else8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB9_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -3049,38 +3177,45 @@ ; SSE2-NEXT: .LBB9_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 -; SSE2-NEXT: pxor %xmm5, %xmm4 -; SSE2-NEXT: pextrw $4, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm5, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB9_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB9_14: # %else12 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB9_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movw %ax, 14(%rdi) ; SSE2-NEXT: .LBB9_16: # %else14 ; SSE2-NEXT: packssdw %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB9_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: movd %xmm2, %eax ; SSE2-NEXT: movw %ax, 16(%rdi) ; SSE2-NEXT: .LBB9_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB9_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $1, %xmm2, %eax @@ -3088,37 +3223,44 @@ ; SSE2-NEXT: .LBB9_20: # %else18 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm6, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB9_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movw %ax, 20(%rdi) -; SSE2-NEXT: .LBB9_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: .LBB9_22: # %else20 +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB9_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $3, %xmm2, %eax ; SSE2-NEXT: movw %ax, 22(%rdi) ; SSE2-NEXT: .LBB9_24: # %else22 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB9_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $4, %xmm2, %eax ; SSE2-NEXT: movw %ax, 24(%rdi) ; SSE2-NEXT: .LBB9_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB9_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -3126,18 +3268,21 @@ ; SSE2-NEXT: .LBB9_28: # %else26 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB9_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movw %ax, 28(%rdi) ; SSE2-NEXT: .LBB9_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB9_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm2, %eax @@ -3151,15 +3296,20 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm9 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 ; SSE4-NEXT: pxor %xmm9, %xmm8 +; SSE4-NEXT: movdqa %xmm8, %xmm9 +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax ; SSE4-NEXT: packssdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm8, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB9_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB9_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm8 +; SSE4-NEXT: packsswb %xmm0, %xmm8 +; SSE4-NEXT: pmovmskb %xmm8, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB9_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -3168,14 +3318,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB9_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB9_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB9_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -3184,14 +3339,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB9_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB9_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB9_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -3200,14 +3359,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB9_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB9_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB9_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -3217,14 +3380,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB9_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB9_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB9_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi) @@ -3233,14 +3401,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm6, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB9_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB9_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB9_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi) @@ -3249,14 +3422,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB9_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB9_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB9_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi) @@ -3265,14 +3442,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm7, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB9_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB9_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB9_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi) @@ -3287,12 +3468,12 @@ ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpackssdw %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpackssdw %xmm6, %xmm0, %xmm0 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB9_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -3302,8 +3483,8 @@ ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB9_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -3314,8 +3495,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB9_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) @@ -3324,8 +3505,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB9_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -3337,16 +3518,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB9_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB9_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB9_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) @@ -3357,16 +3538,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB9_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB9_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB9_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -3377,8 +3558,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB9_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -3388,8 +3569,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB9_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -3401,8 +3582,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB9_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -3412,8 +3593,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB9_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -3426,8 +3607,8 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB9_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 @@ -3435,8 +3616,8 @@ ; AVX1-NEXT: .LBB9_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB9_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -3448,8 +3629,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB9_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -3457,8 +3638,8 @@ ; AVX1-NEXT: .LBB9_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB9_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 @@ -3471,108 +3652,114 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB9_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB9_2: # %else -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB9_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB9_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB9_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB9_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB9_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB9_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB9_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB9_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB9_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB9_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB9_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB9_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB9_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB9_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB9_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $0, %xmm4, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $0, %xmm2, 16(%rdi) ; AVX2-NEXT: .LBB9_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB9_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3580,22 +3767,25 @@ ; AVX2-NEXT: .LBB9_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB9_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $2, %xmm4, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $2, %xmm2, 20(%rdi) ; AVX2-NEXT: .LBB9_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB9_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3603,22 +3793,23 @@ ; AVX2-NEXT: .LBB9_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB9_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $4, %xmm2, 24(%rdi) ; AVX2-NEXT: .LBB9_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB9_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3626,22 +3817,23 @@ ; AVX2-NEXT: .LBB9_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB9_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $6, %xmm2, 28(%rdi) ; AVX2-NEXT: .LBB9_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB9_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -3806,63 +3998,74 @@ define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) { ; SSE2-LABEL: truncstore_v16i32_v16i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm8, %xmm8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm9 +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax ; SSE2-NEXT: packssdw %xmm3, %xmm2 ; SSE2-NEXT: packssdw %xmm1, %xmm0 ; SSE2-NEXT: packsswb %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm8, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB10_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB10_2: # %else -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm8 -; SSE2-NEXT: pextrw $2, %xmm8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB10_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %ah, 1(%rdi) ; SSE2-NEXT: .LBB10_4: # %else2 -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB10_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: shrl $16, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB10_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB10_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: shrl $24, %eax ; SSE2-NEXT: movb %al, 3(%rdi) ; SSE2-NEXT: .LBB10_8: # %else6 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB10_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB10_10: # %else8 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB10_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -3870,37 +4073,44 @@ ; SSE2-NEXT: .LBB10_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 -; SSE2-NEXT: pxor %xmm5, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm5, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB10_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB10_14: # %else12 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB10_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax ; SSE2-NEXT: movb %ah, 7(%rdi) ; SSE2-NEXT: .LBB10_16: # %else14 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB10_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 8(%rdi) ; SSE2-NEXT: .LBB10_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB10_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -3908,37 +4118,44 @@ ; SSE2-NEXT: .LBB10_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm6, %xmm1 +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB10_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %eax ; SSE2-NEXT: movb %al, 10(%rdi) ; SSE2-NEXT: .LBB10_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB10_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax ; SSE2-NEXT: movb %ah, 11(%rdi) ; SSE2-NEXT: .LBB10_24: # %else22 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB10_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 12(%rdi) ; SSE2-NEXT: .LBB10_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB10_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -3946,18 +4163,21 @@ ; SSE2-NEXT: .LBB10_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm7, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm2, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB10_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movb %al, 14(%rdi) ; SSE2-NEXT: .LBB10_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB10_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -3971,17 +4191,22 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm9 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 ; SSE4-NEXT: pxor %xmm9, %xmm8 +; SSE4-NEXT: movdqa %xmm8, %xmm9 +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax ; SSE4-NEXT: packssdw %xmm3, %xmm2 ; SSE4-NEXT: packssdw %xmm1, %xmm0 ; SSE4-NEXT: packsswb %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm8, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB10_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB10_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm8 +; SSE4-NEXT: packsswb %xmm0, %xmm8 +; SSE4-NEXT: pmovmskb %xmm8, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB10_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) @@ -3990,14 +4215,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB10_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB10_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB10_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) @@ -4006,14 +4236,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB10_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB10_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB10_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) @@ -4022,14 +4256,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB10_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB10_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB10_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) @@ -4038,14 +4276,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB10_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB10_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB10_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) @@ -4054,14 +4297,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm6, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB10_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB10_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB10_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) @@ -4070,14 +4318,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB10_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB10_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB10_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) @@ -4086,14 +4338,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm7, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB10_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB10_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB10_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -4108,12 +4364,12 @@ ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpackssdw %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vpackssdw %xmm7, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpackssdw %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vpackssdw %xmm6, %xmm0, %xmm0 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB10_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -4123,8 +4379,8 @@ ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB10_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -4135,8 +4391,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB10_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) @@ -4145,8 +4401,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB10_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -4158,16 +4414,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB10_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB10_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB10_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -4178,16 +4434,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB10_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB10_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB10_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -4198,8 +4454,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB10_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) @@ -4208,8 +4464,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB10_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -4220,8 +4476,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB10_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) @@ -4230,8 +4486,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB10_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -4243,16 +4499,16 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB10_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB10_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB10_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -4263,16 +4519,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB10_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB10_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB10_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -4284,172 +4540,183 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax ; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB10_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB10_2: # %else -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB10_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB10_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB10_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB10_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB10_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB10_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB10_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB10_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB10_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB10_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB10_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB10_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB10_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB10_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB10_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB10_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB10_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB10_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB10_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB10_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB10_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB10_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB10_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB10_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB10_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB10_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB10_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB10_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB10_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -4611,18 +4878,19 @@ ; SSE2-NEXT: pxor %xmm5, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax ; SSE2-NEXT: packssdw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm5, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB11_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB11_2: # %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB11_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -4632,15 +4900,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB11_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB11_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB11_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -4650,15 +4923,19 @@ ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB11_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB11_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB11_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -4668,15 +4945,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm3, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB11_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB11_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB11_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -4690,15 +4971,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: packssdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB11_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB11_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB11_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -4707,14 +4993,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB11_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB11_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB11_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -4723,14 +5014,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB11_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB11_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB11_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -4739,14 +5034,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB11_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB11_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB11_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -4759,9 +5058,9 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 +; AVX1-NEXT: vpackssdw %xmm4, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB11_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -4769,8 +5068,8 @@ ; AVX1-NEXT: .LBB11_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB11_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -4779,16 +5078,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB11_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB11_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB11_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -4798,30 +5097,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB11_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB11_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB11_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB11_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB11_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB11_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB11_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -4833,74 +5136,70 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 -; AVX2-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm4, %eax +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB11_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB11_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB11_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB11_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB11_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB11_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB11_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB11_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB11_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB11_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB11_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB11_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB11_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB11_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB11_15 +; AVX2-NEXT: .LBB11_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB11_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB11_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB11_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB11_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB11_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -5020,40 +5319,41 @@ ; SSE2-NEXT: pxor %xmm5, %xmm4 ; SSE2-NEXT: movdqa %xmm4, %xmm5 ; SSE2-NEXT: packssdw %xmm0, %xmm5 -; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [127,127,127,127] -; SSE2-NEXT: movdqa %xmm6, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm7 -; SSE2-NEXT: pand %xmm7, %xmm0 -; SSE2-NEXT: pandn %xmm6, %xmm7 -; SSE2-NEXT: por %xmm0, %xmm7 -; SSE2-NEXT: movdqa %xmm6, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [127,127,127,127] +; SSE2-NEXT: movdqa %xmm5, %xmm6 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm6 +; SSE2-NEXT: pand %xmm6, %xmm0 +; SSE2-NEXT: pandn %xmm5, %xmm6 +; SSE2-NEXT: por %xmm0, %xmm6 +; SSE2-NEXT: movdqa %xmm5, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 ; SSE2-NEXT: pand %xmm0, %xmm1 -; SSE2-NEXT: pandn %xmm6, %xmm0 +; SSE2-NEXT: pandn %xmm5, %xmm0 ; SSE2-NEXT: por %xmm1, %xmm0 ; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [4294967168,4294967168,4294967168,4294967168] -; SSE2-NEXT: movdqa %xmm0, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 -; SSE2-NEXT: pand %xmm6, %xmm0 -; SSE2-NEXT: pandn %xmm1, %xmm6 -; SSE2-NEXT: por %xmm0, %xmm6 -; SSE2-NEXT: movdqa %xmm7, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm5 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm5 +; SSE2-NEXT: pand %xmm5, %xmm0 +; SSE2-NEXT: pandn %xmm1, %xmm5 +; SSE2-NEXT: por %xmm0, %xmm5 +; SSE2-NEXT: movdqa %xmm6, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm7 +; SSE2-NEXT: pand %xmm0, %xmm6 ; SSE2-NEXT: pandn %xmm1, %xmm0 -; SSE2-NEXT: por %xmm7, %xmm0 -; SSE2-NEXT: packssdw %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: por %xmm6, %xmm0 +; SSE2-NEXT: packssdw %xmm5, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB12_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB12_2: # %else -; SSE2-NEXT: psrlq $16, %xmm4 -; SSE2-NEXT: movd %xmm4, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB12_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -5064,15 +5364,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB12_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB12_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB12_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -5082,15 +5387,19 @@ ; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB12_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB12_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB12_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -5100,15 +5409,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm3, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB12_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB12_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB12_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -5122,6 +5435,10 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [127,127,127,127] ; SSE4-NEXT: pminsd %xmm5, %xmm0 ; SSE4-NEXT: pminsd %xmm5, %xmm1 @@ -5129,14 +5446,15 @@ ; SSE4-NEXT: pmaxsd %xmm5, %xmm1 ; SSE4-NEXT: pmaxsd %xmm5, %xmm0 ; SSE4-NEXT: packssdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB12_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB12_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB12_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -5145,14 +5463,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB12_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB12_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB12_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -5161,14 +5484,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB12_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB12_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB12_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -5177,14 +5504,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB12_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB12_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB12_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -5197,15 +5528,15 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [127,127,127,127] -; AVX1-NEXT: vpminsd %xmm5, %xmm0, %xmm6 +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [127,127,127,127] +; AVX1-NEXT: vpminsd %xmm4, %xmm0, %xmm5 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 -; AVX1-NEXT: vpminsd %xmm5, %xmm0, %xmm0 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [4294967168,4294967168,4294967168,4294967168] -; AVX1-NEXT: vpmaxsd %xmm5, %xmm0, %xmm0 -; AVX1-NEXT: vpmaxsd %xmm5, %xmm6, %xmm5 -; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vpminsd %xmm4, %xmm0, %xmm0 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [4294967168,4294967168,4294967168,4294967168] +; AVX1-NEXT: vpmaxsd %xmm4, %xmm0, %xmm0 +; AVX1-NEXT: vpmaxsd %xmm4, %xmm5, %xmm4 +; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB12_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -5213,8 +5544,8 @@ ; AVX1-NEXT: .LBB12_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB12_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -5223,16 +5554,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB12_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB12_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB12_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -5242,30 +5573,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB12_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB12_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB12_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB12_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB12_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB12_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB12_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -5277,78 +5612,74 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [127,127,127,127,127,127,127,127] -; AVX2-NEXT: vpminsd %ymm5, %ymm0, %ymm0 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168] -; AVX2-NEXT: vpmaxsd %ymm5, %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 -; AVX2-NEXT: vpackssdw %xmm5, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm4, %eax +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [127,127,127,127,127,127,127,127] +; AVX2-NEXT: vpminsd %ymm2, %ymm0, %ymm0 +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168,4294967168] +; AVX2-NEXT: vpmaxsd %ymm2, %ymm0, %ymm0 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackssdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB12_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB12_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB12_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB12_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB12_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB12_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB12_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB12_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB12_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB12_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB12_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB12_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB12_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB12_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB12_15 +; AVX2-NEXT: .LBB12_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB12_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB12_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB12_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB12_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB12_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -5465,30 +5796,28 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32767,32767,32767,32767] -; SSE2-NEXT: movdqa %xmm3, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: pandn %xmm3, %xmm4 -; SSE2-NEXT: por %xmm0, %xmm4 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294934528,4294934528,4294934528,4294934528] -; SSE2-NEXT: movdqa %xmm4, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm4 -; SSE2-NEXT: pandn %xmm3, %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32767,32767,32767,32767] +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm0 +; SSE2-NEXT: pandn %xmm2, %xmm3 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294934528,4294934528,4294934528,4294934528] +; SSE2-NEXT: movdqa %xmm3, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB13_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB13_2: # %else -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB13_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -5496,41 +5825,41 @@ ; SSE2-NEXT: .LBB13_4: # %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $4, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB13_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB13_6: # %else4 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskps %xmm2, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB13_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB13_7 +; SSE2-NEXT: .LBB13_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB13_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB13_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB13_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB13_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i16: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: pminsd {{.*}}(%rip), %xmm0 ; SSE4-NEXT: pmaxsd {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB13_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB13_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB13_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm0, 2(%rdi) @@ -5539,18 +5868,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB13_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB13_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB13_7 +; SSE4-NEXT: .LBB13_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB13_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm0, 4(%rdi) -; SSE4-NEXT: .LBB13_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB13_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB13_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm0, 6(%rdi) -; SSE4-NEXT: .LBB13_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i32_v4i16: @@ -5559,16 +5890,15 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vmovmskps %xmm2, %eax ; AVX1-NEXT: vpminsd {{.*}}(%rip), %xmm0, %xmm0 ; AVX1-NEXT: vpmaxsd {{.*}}(%rip), %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB13_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB13_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB13_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -5577,18 +5907,20 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB13_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB13_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB13_7 +; AVX1-NEXT: .LBB13_8: # %else6 +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB13_5: # %cond.store3 ; AVX1-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX1-NEXT: .LBB13_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB13_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB13_7: # %cond.store5 ; AVX1-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX1-NEXT: .LBB13_8: # %else6 ; AVX1-NEXT: retq ; ; AVX2-LABEL: truncstore_v4i32_v4i16: @@ -5597,18 +5929,17 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [32767,32767,32767,32767] -; AVX2-NEXT: vpminsd %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294934528,4294934528,4294934528,4294934528] -; AVX2-NEXT: vpmaxsd %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [32767,32767,32767,32767] +; AVX2-NEXT: vpminsd %xmm2, %xmm0, %xmm0 +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [4294934528,4294934528,4294934528,4294934528] +; AVX2-NEXT: vpmaxsd %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB13_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB13_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB13_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -5617,18 +5948,20 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB13_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB13_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB13_7 +; AVX2-NEXT: .LBB13_8: # %else6 +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB13_5: # %cond.store3 ; AVX2-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX2-NEXT: .LBB13_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB13_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB13_7: # %cond.store5 ; AVX2-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB13_8: # %else6 ; AVX2-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i16: @@ -5709,30 +6042,28 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [127,127,127,127] -; SSE2-NEXT: movdqa %xmm3, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm0, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm0 -; SSE2-NEXT: pandn %xmm3, %xmm4 -; SSE2-NEXT: por %xmm0, %xmm4 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [4294967168,4294967168,4294967168,4294967168] -; SSE2-NEXT: movdqa %xmm4, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm3, %xmm0 -; SSE2-NEXT: pand %xmm0, %xmm4 -; SSE2-NEXT: pandn %xmm3, %xmm0 -; SSE2-NEXT: por %xmm4, %xmm0 -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127] +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm0, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm0 +; SSE2-NEXT: pandn %xmm2, %xmm3 +; SSE2-NEXT: por %xmm0, %xmm3 +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [4294967168,4294967168,4294967168,4294967168] +; SSE2-NEXT: movdqa %xmm3, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm2, %xmm0 +; SSE2-NEXT: pand %xmm0, %xmm3 +; SSE2-NEXT: pandn %xmm2, %xmm0 +; SSE2-NEXT: por %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB14_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm0, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB14_2: # %else -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB14_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -5740,41 +6071,41 @@ ; SSE2-NEXT: .LBB14_4: # %else2 ; SSE2-NEXT: pxor %xmm2, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm3 -; SSE2-NEXT: pextrw $4, %xmm3, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB14_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB14_6: # %else4 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskps %xmm2, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB14_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB14_7 +; SSE2-NEXT: .LBB14_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB14_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm0, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB14_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB14_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB14_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: pminsd {{.*}}(%rip), %xmm0 ; SSE4-NEXT: pmaxsd {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB14_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB14_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB14_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm0, 1(%rdi) @@ -5783,18 +6114,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB14_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB14_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB14_7 +; SSE4-NEXT: .LBB14_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB14_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm0, 2(%rdi) -; SSE4-NEXT: .LBB14_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB14_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB14_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm0, 3(%rdi) -; SSE4-NEXT: .LBB14_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i32_v4i8: @@ -5803,16 +6136,15 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vmovmskps %xmm2, %eax ; AVX1-NEXT: vpminsd {{.*}}(%rip), %xmm0, %xmm0 ; AVX1-NEXT: vpmaxsd {{.*}}(%rip), %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB14_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB14_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB14_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -5821,18 +6153,20 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB14_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB14_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB14_7 +; AVX1-NEXT: .LBB14_8: # %else6 +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB14_5: # %cond.store3 ; AVX1-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX1-NEXT: .LBB14_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB14_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB14_7: # %cond.store5 ; AVX1-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX1-NEXT: .LBB14_8: # %else6 ; AVX1-NEXT: retq ; ; AVX2-LABEL: truncstore_v4i32_v4i8: @@ -5841,18 +6175,17 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [127,127,127,127] -; AVX2-NEXT: vpminsd %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [4294967168,4294967168,4294967168,4294967168] -; AVX2-NEXT: vpmaxsd %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [127,127,127,127] +; AVX2-NEXT: vpminsd %xmm2, %xmm0, %xmm0 +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [4294967168,4294967168,4294967168,4294967168] +; AVX2-NEXT: vpmaxsd %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB14_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB14_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB14_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -5861,18 +6194,20 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB14_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB14_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB14_7 +; AVX2-NEXT: .LBB14_8: # %else6 +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB14_5: # %cond.store3 ; AVX2-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX2-NEXT: .LBB14_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB14_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB14_7: # %cond.store5 ; AVX2-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX2-NEXT: .LBB14_8: # %else6 ; AVX2-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i8: @@ -5953,19 +6288,17 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm6, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: packsswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm6, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB15_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB15_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB15_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -5973,20 +6306,17 @@ ; SSE2-NEXT: .LBB15_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB15_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB15_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB15_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -5995,18 +6325,16 @@ ; SSE2-NEXT: .LBB15_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB15_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB15_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB15_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -6014,18 +6342,16 @@ ; SSE2-NEXT: .LBB15_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB15_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB15_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB15_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -6033,18 +6359,16 @@ ; SSE2-NEXT: .LBB15_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB15_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB15_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB15_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -6052,18 +6376,16 @@ ; SSE2-NEXT: .LBB15_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB15_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB15_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB15_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -6071,18 +6393,16 @@ ; SSE2-NEXT: .LBB15_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE2-NEXT: pxor %xmm1, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB15_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: .LBB15_26: # %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB15_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -6090,18 +6410,16 @@ ; SSE2-NEXT: .LBB15_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE2-NEXT: pextrw $7, %xmm4, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB15_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) ; SSE2-NEXT: .LBB15_30: # %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB15_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -6110,18 +6428,17 @@ ; SSE2-NEXT: packsswb %xmm3, %xmm2 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE2-NEXT: je .LBB15_34 ; SSE2-NEXT: # %bb.33: # %cond.store31 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: movb %cl, 16(%rdi) ; SSE2-NEXT: .LBB15_34: # %else32 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE2-NEXT: je .LBB15_36 ; SSE2-NEXT: # %bb.35: # %cond.store33 ; SSE2-NEXT: movd %xmm2, %eax @@ -6129,20 +6446,18 @@ ; SSE2-NEXT: .LBB15_36: # %else34 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE2-NEXT: je .LBB15_38 ; SSE2-NEXT: # %bb.37: # %cond.store35 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 18(%rdi) -; SSE2-NEXT: .LBB15_38: # %else36 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: .LBB15_38: # %else36 +; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE2-NEXT: je .LBB15_40 ; SSE2-NEXT: # %bb.39: # %cond.store37 ; SSE2-NEXT: movd %xmm2, %eax @@ -6151,18 +6466,17 @@ ; SSE2-NEXT: .LBB15_40: # %else38 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE2-NEXT: je .LBB15_42 ; SSE2-NEXT: # %bb.41: # %cond.store39 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 20(%rdi) ; SSE2-NEXT: .LBB15_42: # %else40 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE2-NEXT: je .LBB15_44 ; SSE2-NEXT: # %bb.43: # %cond.store41 ; SSE2-NEXT: pextrw $2, %xmm2, %eax @@ -6170,18 +6484,17 @@ ; SSE2-NEXT: .LBB15_44: # %else42 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE2-NEXT: je .LBB15_46 ; SSE2-NEXT: # %bb.45: # %cond.store43 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 22(%rdi) ; SSE2-NEXT: .LBB15_46: # %else44 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE2-NEXT: je .LBB15_48 ; SSE2-NEXT: # %bb.47: # %cond.store45 ; SSE2-NEXT: pextrw $3, %xmm2, %eax @@ -6189,18 +6502,17 @@ ; SSE2-NEXT: .LBB15_48: # %else46 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE2-NEXT: je .LBB15_50 ; SSE2-NEXT: # %bb.49: # %cond.store47 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 24(%rdi) ; SSE2-NEXT: .LBB15_50: # %else48 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE2-NEXT: je .LBB15_52 ; SSE2-NEXT: # %bb.51: # %cond.store49 ; SSE2-NEXT: pextrw $4, %xmm2, %eax @@ -6208,18 +6520,17 @@ ; SSE2-NEXT: .LBB15_52: # %else50 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE2-NEXT: je .LBB15_54 ; SSE2-NEXT: # %bb.53: # %cond.store51 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 26(%rdi) ; SSE2-NEXT: .LBB15_54: # %else52 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE2-NEXT: je .LBB15_56 ; SSE2-NEXT: # %bb.55: # %cond.store53 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -6227,18 +6538,17 @@ ; SSE2-NEXT: .LBB15_56: # %else54 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE2-NEXT: je .LBB15_58 ; SSE2-NEXT: # %bb.57: # %cond.store55 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 28(%rdi) ; SSE2-NEXT: .LBB15_58: # %else56 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE2-NEXT: je .LBB15_60 ; SSE2-NEXT: # %bb.59: # %cond.store57 ; SSE2-NEXT: pextrw $6, %xmm2, %eax @@ -6246,152 +6556,146 @@ ; SSE2-NEXT: .LBB15_60: # %else58 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE2-NEXT: pextrw $7, %xmm5, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB15_62 -; SSE2-NEXT: # %bb.61: # %cond.store59 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm5, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE2-NEXT: jne .LBB15_61 +; SSE2-NEXT: # %bb.62: # %else60 +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE2-NEXT: jne .LBB15_63 +; SSE2-NEXT: .LBB15_64: # %else62 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB15_61: # %cond.store59 ; SSE2-NEXT: pextrw $7, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 30(%rdi) -; SSE2-NEXT: .LBB15_62: # %else60 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE2-NEXT: je .LBB15_64 -; SSE2-NEXT: # %bb.63: # %cond.store61 +; SSE2-NEXT: .LBB15_63: # %cond.store61 ; SSE2-NEXT: pextrw $7, %xmm2, %eax ; SSE2-NEXT: movb %ah, 31(%rdi) -; SSE2-NEXT: .LBB15_64: # %else62 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v32i16_v32i8: ; SSE4: # %bb.0: ; SSE4-NEXT: pxor %xmm6, %xmm6 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: packsswb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm6, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB15_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB15_2: # %else -; SSE4-NEXT: pextrb $1, %xmm6, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB15_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB15_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB15_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB15_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB15_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB15_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB15_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB15_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB15_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB15_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB15_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB15_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB15_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB15_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB15_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB15_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB15_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB15_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB15_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB15_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB15_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB15_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 +; SSE4-NEXT: pxor %xmm1, %xmm6 +; SSE4-NEXT: pmovmskb %xmm6, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB15_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB15_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB15_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB15_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE4-NEXT: pextrb $14, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm4, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB15_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB15_30: # %else28 -; SSE4-NEXT: pextrb $15, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB15_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -6399,132 +6703,135 @@ ; SSE4-NEXT: packsswb %xmm3, %xmm2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE4-NEXT: je .LBB15_34 ; SSE4-NEXT: # %bb.33: # %cond.store31 ; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB15_34: # %else32 -; SSE4-NEXT: pextrb $1, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE4-NEXT: je .LBB15_36 ; SSE4-NEXT: # %bb.35: # %cond.store33 ; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi) ; SSE4-NEXT: .LBB15_36: # %else34 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $2, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE4-NEXT: je .LBB15_38 ; SSE4-NEXT: # %bb.37: # %cond.store35 ; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi) ; SSE4-NEXT: .LBB15_38: # %else36 -; SSE4-NEXT: pextrb $3, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE4-NEXT: je .LBB15_40 ; SSE4-NEXT: # %bb.39: # %cond.store37 ; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi) ; SSE4-NEXT: .LBB15_40: # %else38 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE4-NEXT: je .LBB15_42 ; SSE4-NEXT: # %bb.41: # %cond.store39 ; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB15_42: # %else40 -; SSE4-NEXT: pextrb $5, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE4-NEXT: je .LBB15_44 ; SSE4-NEXT: # %bb.43: # %cond.store41 ; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi) ; SSE4-NEXT: .LBB15_44: # %else42 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $6, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE4-NEXT: je .LBB15_46 ; SSE4-NEXT: # %bb.45: # %cond.store43 ; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi) ; SSE4-NEXT: .LBB15_46: # %else44 -; SSE4-NEXT: pextrb $7, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE4-NEXT: je .LBB15_48 ; SSE4-NEXT: # %bb.47: # %cond.store45 ; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi) ; SSE4-NEXT: .LBB15_48: # %else46 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE4-NEXT: je .LBB15_50 ; SSE4-NEXT: # %bb.49: # %cond.store47 ; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB15_50: # %else48 -; SSE4-NEXT: pextrb $9, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE4-NEXT: je .LBB15_52 ; SSE4-NEXT: # %bb.51: # %cond.store49 ; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi) ; SSE4-NEXT: .LBB15_52: # %else50 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $10, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE4-NEXT: je .LBB15_54 ; SSE4-NEXT: # %bb.53: # %cond.store51 ; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi) ; SSE4-NEXT: .LBB15_54: # %else52 -; SSE4-NEXT: pextrb $11, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE4-NEXT: je .LBB15_56 ; SSE4-NEXT: # %bb.55: # %cond.store53 ; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi) ; SSE4-NEXT: .LBB15_56: # %else54 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE4-NEXT: je .LBB15_58 ; SSE4-NEXT: # %bb.57: # %cond.store55 ; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB15_58: # %else56 -; SSE4-NEXT: pextrb $13, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE4-NEXT: je .LBB15_60 ; SSE4-NEXT: # %bb.59: # %cond.store57 ; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi) ; SSE4-NEXT: .LBB15_60: # %else58 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE4-NEXT: pextrb $14, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB15_62 -; SSE4-NEXT: # %bb.61: # %cond.store59 +; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE4-NEXT: pxor %xmm5, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE4-NEXT: jne .LBB15_61 +; SSE4-NEXT: # %bb.62: # %else60 +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE4-NEXT: jne .LBB15_63 +; SSE4-NEXT: .LBB15_64: # %else62 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB15_61: # %cond.store59 ; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi) -; SSE4-NEXT: .LBB15_62: # %else60 -; SSE4-NEXT: pextrb $15, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE4-NEXT: je .LBB15_64 -; SSE4-NEXT: # %bb.63: # %cond.store61 +; SSE4-NEXT: .LBB15_63: # %cond.store61 ; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi) -; SSE4-NEXT: .LBB15_64: # %else62 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v32i16_v32i8: @@ -6533,12 +6840,12 @@ ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX1-NEXT: vpacksswb %xmm6, %xmm1, %xmm1 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX1-NEXT: vpacksswb %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 +; AVX1-NEXT: vpacksswb %xmm5, %xmm1, %xmm1 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vpacksswb %xmm5, %xmm0, %xmm0 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB15_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -6546,8 +6853,8 @@ ; AVX1-NEXT: .LBB15_2: # %else ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB15_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -6556,16 +6863,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $2, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB15_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB15_6: # %else4 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB15_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -6574,16 +6881,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB15_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB15_10: # %else8 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $5, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB15_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -6592,16 +6899,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $6, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB15_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB15_14: # %else12 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB15_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -6610,16 +6917,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB15_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB15_18: # %else16 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB15_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -6628,16 +6935,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB15_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB15_22: # %else20 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB15_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -6646,16 +6953,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $12, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB15_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB15_26: # %else24 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $13, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB15_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -6664,16 +6971,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $14, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB15_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB15_30: # %else28 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB15_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -6683,15 +6990,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX1-NEXT: je .LBB15_34 ; AVX1-NEXT: # %bb.33: # %cond.store31 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX1-NEXT: .LBB15_34: # %else32 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX1-NEXT: je .LBB15_36 ; AVX1-NEXT: # %bb.35: # %cond.store33 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6701,15 +7008,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX1-NEXT: je .LBB15_38 ; AVX1-NEXT: # %bb.37: # %cond.store35 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX1-NEXT: .LBB15_38: # %else36 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX1-NEXT: je .LBB15_40 ; AVX1-NEXT: # %bb.39: # %cond.store37 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6719,15 +7026,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX1-NEXT: je .LBB15_42 ; AVX1-NEXT: # %bb.41: # %cond.store39 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX1-NEXT: .LBB15_42: # %else40 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX1-NEXT: je .LBB15_44 ; AVX1-NEXT: # %bb.43: # %cond.store41 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6737,15 +7044,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX1-NEXT: je .LBB15_46 ; AVX1-NEXT: # %bb.45: # %cond.store43 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX1-NEXT: .LBB15_46: # %else44 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX1-NEXT: je .LBB15_48 ; AVX1-NEXT: # %bb.47: # %cond.store45 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6755,15 +7062,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX1-NEXT: je .LBB15_50 ; AVX1-NEXT: # %bb.49: # %cond.store47 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX1-NEXT: .LBB15_50: # %else48 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX1-NEXT: je .LBB15_52 ; AVX1-NEXT: # %bb.51: # %cond.store49 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6773,15 +7080,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX1-NEXT: je .LBB15_54 ; AVX1-NEXT: # %bb.53: # %cond.store51 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX1-NEXT: .LBB15_54: # %else52 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX1-NEXT: je .LBB15_56 ; AVX1-NEXT: # %bb.55: # %cond.store53 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6791,15 +7098,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX1-NEXT: je .LBB15_58 ; AVX1-NEXT: # %bb.57: # %cond.store55 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX1-NEXT: .LBB15_58: # %else56 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX1-NEXT: je .LBB15_60 ; AVX1-NEXT: # %bb.59: # %cond.store57 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6809,20 +7116,24 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB15_62 -; AVX1-NEXT: # %bb.61: # %cond.store59 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX1-NEXT: .LBB15_62: # %else60 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX1-NEXT: jne .LBB15_61 +; AVX1-NEXT: # %bb.62: # %else60 +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX1-NEXT: jne .LBB15_63 +; AVX1-NEXT: .LBB15_64: # %else62 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB15_61: # %cond.store59 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX1-NEXT: je .LBB15_64 -; AVX1-NEXT: # %bb.63: # %cond.store61 +; AVX1-NEXT: .LBB15_63: # %cond.store61 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX1-NEXT: .LBB15_64: # %else62 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -6830,148 +7141,138 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vpmovmskb %ymm3, %eax ; AVX2-NEXT: vpacksswb %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] -; AVX2-NEXT: vpextrb $0, %xmm3, %eax -; AVX2-NEXT: notb %al ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB15_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB15_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm3, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB15_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB15_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB15_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB15_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB15_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB15_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB15_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB15_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB15_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB15_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB15_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB15_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB15_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB15_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB15_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB15_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB15_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB15_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB15_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB15_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB15_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB15_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB15_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB15_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB15_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB15_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB15_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB15_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB15_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX2-NEXT: .LBB15_32: # %else30 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX2-NEXT: je .LBB15_34 ; AVX2-NEXT: # %bb.33: # %cond.store31 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $0, %xmm1, 16(%rdi) ; AVX2-NEXT: .LBB15_34: # %else32 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX2-NEXT: je .LBB15_36 ; AVX2-NEXT: # %bb.35: # %cond.store33 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6979,18 +7280,16 @@ ; AVX2-NEXT: .LBB15_36: # %else34 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX2-NEXT: je .LBB15_38 ; AVX2-NEXT: # %bb.37: # %cond.store35 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $2, %xmm1, 18(%rdi) ; AVX2-NEXT: .LBB15_38: # %else36 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX2-NEXT: je .LBB15_40 ; AVX2-NEXT: # %bb.39: # %cond.store37 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6998,18 +7297,16 @@ ; AVX2-NEXT: .LBB15_40: # %else38 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX2-NEXT: je .LBB15_42 ; AVX2-NEXT: # %bb.41: # %cond.store39 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $4, %xmm1, 20(%rdi) ; AVX2-NEXT: .LBB15_42: # %else40 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX2-NEXT: je .LBB15_44 ; AVX2-NEXT: # %bb.43: # %cond.store41 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7017,18 +7314,16 @@ ; AVX2-NEXT: .LBB15_44: # %else42 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX2-NEXT: je .LBB15_46 ; AVX2-NEXT: # %bb.45: # %cond.store43 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $6, %xmm1, 22(%rdi) ; AVX2-NEXT: .LBB15_46: # %else44 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX2-NEXT: je .LBB15_48 ; AVX2-NEXT: # %bb.47: # %cond.store45 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7036,18 +7331,16 @@ ; AVX2-NEXT: .LBB15_48: # %else46 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX2-NEXT: je .LBB15_50 ; AVX2-NEXT: # %bb.49: # %cond.store47 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $8, %xmm1, 24(%rdi) ; AVX2-NEXT: .LBB15_50: # %else48 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX2-NEXT: je .LBB15_52 ; AVX2-NEXT: # %bb.51: # %cond.store49 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7055,18 +7348,16 @@ ; AVX2-NEXT: .LBB15_52: # %else50 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX2-NEXT: je .LBB15_54 ; AVX2-NEXT: # %bb.53: # %cond.store51 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $10, %xmm1, 26(%rdi) ; AVX2-NEXT: .LBB15_54: # %else52 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX2-NEXT: je .LBB15_56 ; AVX2-NEXT: # %bb.55: # %cond.store53 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7074,18 +7365,16 @@ ; AVX2-NEXT: .LBB15_56: # %else54 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX2-NEXT: je .LBB15_58 ; AVX2-NEXT: # %bb.57: # %cond.store55 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $12, %xmm1, 28(%rdi) ; AVX2-NEXT: .LBB15_58: # %else56 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX2-NEXT: je .LBB15_60 ; AVX2-NEXT: # %bb.59: # %cond.store57 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7093,23 +7382,25 @@ ; AVX2-NEXT: .LBB15_60: # %else58 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB15_62 -; AVX2-NEXT: # %bb.61: # %cond.store59 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX2-NEXT: .LBB15_62: # %else60 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX2-NEXT: jne .LBB15_61 +; AVX2-NEXT: # %bb.62: # %else60 +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX2-NEXT: jne .LBB15_63 +; AVX2-NEXT: .LBB15_64: # %else62 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB15_61: # %cond.store59 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX2-NEXT: je .LBB15_64 -; AVX2-NEXT: # %bb.63: # %cond.store61 +; AVX2-NEXT: .LBB15_63: # %cond.store61 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX2-NEXT: .LBB15_64: # %else62 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -7119,8 +7410,7 @@ ; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 ; AVX512F-NEXT: vmovdqa64 %zmm3, %zmm4 ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm4 -; AVX512F-NEXT: vpmovsxbd %xmm4, %zmm4 -; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k0 +; AVX512F-NEXT: vpmovmskb %ymm4, %eax ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] ; AVX512F-NEXT: vpminsw %ymm4, %ymm0, %ymm0 ; AVX512F-NEXT: vpminsw %ymm4, %ymm1, %ymm1 @@ -7132,18 +7422,14 @@ ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB15_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB15_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB15_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -7152,21 +7438,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB15_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB15_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB15_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -7175,21 +7455,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB15_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB15_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB15_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -7198,21 +7472,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB15_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB15_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB15_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -7221,21 +7489,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB15_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB15_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB15_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -7244,21 +7506,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB15_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB15_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB15_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -7267,21 +7523,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB15_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB15_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB15_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -7290,45 +7540,33 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB15_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB15_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB15_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX512F-NEXT: .LBB15_32: # %else30 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX512F-NEXT: je .LBB15_34 ; AVX512F-NEXT: # %bb.33: # %cond.store31 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $0, %xmm3, 16(%rdi) ; AVX512F-NEXT: .LBB15_34: # %else32 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX512F-NEXT: je .LBB15_36 ; AVX512F-NEXT: # %bb.35: # %cond.store33 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7336,25 +7574,18 @@ ; AVX512F-NEXT: .LBB15_36: # %else34 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX512F-NEXT: je .LBB15_38 ; AVX512F-NEXT: # %bb.37: # %cond.store35 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $2, %xmm3, 18(%rdi) -; AVX512F-NEXT: .LBB15_38: # %else36 -; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: .LBB15_38: # %else36 +; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX512F-NEXT: je .LBB15_40 ; AVX512F-NEXT: # %bb.39: # %cond.store37 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7362,25 +7593,18 @@ ; AVX512F-NEXT: .LBB15_40: # %else38 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX512F-NEXT: je .LBB15_42 ; AVX512F-NEXT: # %bb.41: # %cond.store39 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $4, %xmm3, 20(%rdi) ; AVX512F-NEXT: .LBB15_42: # %else40 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX512F-NEXT: je .LBB15_44 ; AVX512F-NEXT: # %bb.43: # %cond.store41 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7388,25 +7612,18 @@ ; AVX512F-NEXT: .LBB15_44: # %else42 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX512F-NEXT: je .LBB15_46 ; AVX512F-NEXT: # %bb.45: # %cond.store43 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $6, %xmm3, 22(%rdi) ; AVX512F-NEXT: .LBB15_46: # %else44 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX512F-NEXT: je .LBB15_48 ; AVX512F-NEXT: # %bb.47: # %cond.store45 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7414,25 +7631,18 @@ ; AVX512F-NEXT: .LBB15_48: # %else46 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX512F-NEXT: je .LBB15_50 ; AVX512F-NEXT: # %bb.49: # %cond.store47 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $8, %xmm3, 24(%rdi) ; AVX512F-NEXT: .LBB15_50: # %else48 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX512F-NEXT: je .LBB15_52 ; AVX512F-NEXT: # %bb.51: # %cond.store49 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7440,25 +7650,18 @@ ; AVX512F-NEXT: .LBB15_52: # %else50 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX512F-NEXT: je .LBB15_54 ; AVX512F-NEXT: # %bb.53: # %cond.store51 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $10, %xmm3, 26(%rdi) ; AVX512F-NEXT: .LBB15_54: # %else52 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX512F-NEXT: je .LBB15_56 ; AVX512F-NEXT: # %bb.55: # %cond.store53 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7466,25 +7669,18 @@ ; AVX512F-NEXT: .LBB15_56: # %else54 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX512F-NEXT: je .LBB15_58 ; AVX512F-NEXT: # %bb.57: # %cond.store55 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $12, %xmm3, 28(%rdi) ; AVX512F-NEXT: .LBB15_58: # %else56 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX512F-NEXT: je .LBB15_60 ; AVX512F-NEXT: # %bb.59: # %cond.store57 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7492,25 +7688,18 @@ ; AVX512F-NEXT: .LBB15_60: # %else58 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 ; AVX512F-NEXT: je .LBB15_62 ; AVX512F-NEXT: # %bb.61: # %cond.store59 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX512F-NEXT: vpextrb $14, %xmm2, 30(%rdi) ; AVX512F-NEXT: .LBB15_62: # %else60 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX512F-NEXT: je .LBB15_64 ; AVX512F-NEXT: # %bb.63: # %cond.store61 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -7552,19 +7741,17 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax ; SSE2-NEXT: packsswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB16_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB16_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB16_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -7572,20 +7759,17 @@ ; SSE2-NEXT: .LBB16_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB16_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB16_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB16_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -7594,18 +7778,16 @@ ; SSE2-NEXT: .LBB16_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB16_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB16_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB16_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -7613,18 +7795,16 @@ ; SSE2-NEXT: .LBB16_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB16_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB16_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB16_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -7632,18 +7812,16 @@ ; SSE2-NEXT: .LBB16_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB16_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB16_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB16_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -7651,18 +7829,16 @@ ; SSE2-NEXT: .LBB16_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB16_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB16_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB16_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -7670,18 +7846,16 @@ ; SSE2-NEXT: .LBB16_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB16_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: .LBB16_26: # %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB16_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -7689,290 +7863,282 @@ ; SSE2-NEXT: .LBB16_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB16_30 -; SSE2-NEXT: # %bb.29: # %cond.store27 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE2-NEXT: jne .LBB16_29 +; SSE2-NEXT: # %bb.30: # %else28 +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE2-NEXT: jne .LBB16_31 +; SSE2-NEXT: .LBB16_32: # %else30 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB16_29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) -; SSE2-NEXT: .LBB16_30: # %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB16_32 -; SSE2-NEXT: # %bb.31: # %cond.store29 +; SSE2-NEXT: .LBB16_31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movb %ah, 15(%rdi) -; SSE2-NEXT: .LBB16_32: # %else30 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v16i16_v16i8: ; SSE4: # %bb.0: ; SSE4-NEXT: pxor %xmm3, %xmm3 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax ; SSE4-NEXT: packsswb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm3, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB16_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB16_2: # %else -; SSE4-NEXT: pextrb $1, %xmm3, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB16_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB16_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB16_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB16_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB16_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB16_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB16_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB16_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB16_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB16_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB16_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB16_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB16_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB16_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB16_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB16_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB16_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB16_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB16_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB16_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB16_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB16_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB16_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB16_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB16_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB16_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB16_30 -; SSE4-NEXT: # %bb.29: # %cond.store27 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm2, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE4-NEXT: jne .LBB16_29 +; SSE4-NEXT: # %bb.30: # %else28 +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE4-NEXT: jne .LBB16_31 +; SSE4-NEXT: .LBB16_32: # %else30 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB16_29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) -; SSE4-NEXT: .LBB16_30: # %else28 -; SSE4-NEXT: pextrb $15, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB16_32 -; SSE4-NEXT: # %bb.31: # %cond.store29 +; SSE4-NEXT: .LBB16_31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) -; SSE4-NEXT: .LBB16_32: # %else30 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v16i16_v16i8: ; AVX1: # %bb.0: ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: notb %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB16_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB16_2: # %else -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB16_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX1-NEXT: .LBB16_4: # %else2 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB16_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB16_6: # %else4 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB16_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX1-NEXT: .LBB16_8: # %else6 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB16_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB16_10: # %else8 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB16_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB16_12: # %else10 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB16_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB16_14: # %else12 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB16_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX1-NEXT: .LBB16_16: # %else14 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB16_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB16_18: # %else16 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB16_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX1-NEXT: .LBB16_20: # %else18 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB16_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB16_22: # %else20 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB16_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX1-NEXT: .LBB16_24: # %else22 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB16_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB16_26: # %else24 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB16_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX1-NEXT: .LBB16_28: # %else26 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB16_30 -; AVX1-NEXT: # %bb.29: # %cond.store27 +; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX1-NEXT: jne .LBB16_29 +; AVX1-NEXT: # %bb.30: # %else28 +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX1-NEXT: jne .LBB16_31 +; AVX1-NEXT: .LBB16_32: # %else30 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB16_29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX1-NEXT: .LBB16_30: # %else28 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB16_32 -; AVX1-NEXT: # %bb.31: # %cond.store29 +; AVX1-NEXT: .LBB16_31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX1-NEXT: .LBB16_32: # %else30 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -7980,134 +8146,130 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpacksswb %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: notb %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB16_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB16_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB16_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB16_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB16_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB16_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB16_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB16_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB16_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB16_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB16_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB16_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB16_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB16_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB16_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB16_16: # %else14 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB16_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB16_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB16_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB16_20: # %else18 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB16_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB16_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB16_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB16_24: # %else22 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB16_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB16_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB16_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB16_28: # %else26 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB16_30 -; AVX2-NEXT: # %bb.29: # %cond.store27 +; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX2-NEXT: jne .LBB16_29 +; AVX2-NEXT: # %bb.30: # %else28 +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX2-NEXT: jne .LBB16_31 +; AVX2-NEXT: .LBB16_32: # %else30 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB16_29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB16_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB16_32 -; AVX2-NEXT: # %bb.31: # %cond.store29 +; AVX2-NEXT: .LBB16_31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX2-NEXT: .LBB16_32: # %else30 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -8117,24 +8279,19 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 +; AVX512F-NEXT: vpmovmskb %xmm3, %eax ; AVX512F-NEXT: vpminsw {{.*}}(%rip), %ymm0, %ymm0 ; AVX512F-NEXT: vpmaxsw {{.*}}(%rip), %ymm0, %ymm0 ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB16_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB16_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB16_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -8143,21 +8300,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB16_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB16_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB16_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -8166,21 +8317,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB16_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB16_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB16_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -8189,21 +8334,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB16_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB16_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB16_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -8212,21 +8351,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB16_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB16_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB16_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -8235,21 +8368,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB16_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB16_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB16_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -8258,21 +8385,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB16_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB16_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB16_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -8281,21 +8402,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB16_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB16_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB16_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -8336,21 +8451,24 @@ define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) { ; SSE2-LABEL: truncstore_v8i16_v8i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqw %xmm1, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm3, %xmm2 +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax ; SSE2-NEXT: pminsw {{.*}}(%rip), %xmm0 ; SSE2-NEXT: pmaxsw {{.*}}(%rip), %xmm0 -; SSE2-NEXT: movd %xmm3, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB17_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB17_2: # %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB17_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -8361,15 +8479,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB17_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB17_6: # %else4 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB17_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -8379,15 +8500,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB17_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB17_10: # %else8 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB17_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -8397,15 +8521,18 @@ ; SSE2-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB17_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB17_14: # %else12 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB17_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -8419,16 +8546,19 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax ; SSE4-NEXT: pminsw {{.*}}(%rip), %xmm0 ; SSE4-NEXT: pmaxsw {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB17_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB17_2: # %else -; SSE4-NEXT: pextrb $2, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB17_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -8437,14 +8567,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB17_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB17_6: # %else4 -; SSE4-NEXT: pextrb $6, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB17_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -8453,14 +8586,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB17_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB17_10: # %else8 -; SSE4-NEXT: pextrb $10, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB17_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -8469,14 +8605,17 @@ ; SSE4-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB17_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB17_14: # %else12 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB17_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -8489,16 +8628,18 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax ; AVX-NEXT: vpminsw {{.*}}(%rip), %xmm0, %xmm0 ; AVX-NEXT: vpmaxsw {{.*}}(%rip), %xmm0, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm2, %eax ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB17_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB17_2: # %else -; AVX-NEXT: vpextrb $2, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB17_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -8507,14 +8648,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $4, %al ; AVX-NEXT: je .LBB17_6 ; AVX-NEXT: # %bb.5: # %cond.store3 ; AVX-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX-NEXT: .LBB17_6: # %else4 -; AVX-NEXT: vpextrb $6, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB17_8 ; AVX-NEXT: # %bb.7: # %cond.store5 ; AVX-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -8523,14 +8666,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $8, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $16, %al ; AVX-NEXT: je .LBB17_10 ; AVX-NEXT: # %bb.9: # %cond.store7 ; AVX-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX-NEXT: .LBB17_10: # %else8 -; AVX-NEXT: vpextrb $10, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $32, %al ; AVX-NEXT: je .LBB17_12 ; AVX-NEXT: # %bb.11: # %cond.store9 ; AVX-NEXT: vpextrb $10, %xmm0, 5(%rdi) @@ -8539,14 +8684,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $64, %al ; AVX-NEXT: je .LBB17_14 ; AVX-NEXT: # %bb.13: # %cond.store11 ; AVX-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX-NEXT: .LBB17_14: # %else12 -; AVX-NEXT: vpextrb $14, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 +; AVX-NEXT: vpmovmskb %xmm1, %eax +; AVX-NEXT: testb $-128, %al ; AVX-NEXT: je .LBB17_16 ; AVX-NEXT: # %bb.15: # %cond.store13 ; AVX-NEXT: vpextrb $14, %xmm0, 7(%rdi) Index: test/CodeGen/X86/masked_store_trunc_usat.ll =================================================================== --- test/CodeGen/X86/masked_store_trunc_usat.ll +++ test/CodeGen/X86/masked_store_trunc_usat.ll @@ -13,72 +13,73 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm12, %xmm12 -; SSE2-NEXT: pxor %xmm6, %xmm12 -; SSE2-NEXT: movdqa %xmm12, %xmm9 -; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm11, %xmm11 +; SSE2-NEXT: pxor %xmm6, %xmm11 +; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] -; SSE2-NEXT: movdqa {{.*#+}} xmm13 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: movdqa %xmm1, %xmm7 -; SSE2-NEXT: pxor %xmm13, %xmm7 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259455,9223372039002259455] -; SSE2-NEXT: movdqa %xmm10, %xmm6 +; SSE2-NEXT: pxor %xmm12, %xmm7 +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455] +; SSE2-NEXT: movdqa %xmm9, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] -; SSE2-NEXT: pand %xmm11, %xmm7 +; SSE2-NEXT: pand %xmm10, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm6 ; SSE2-NEXT: pand %xmm6, %xmm1 ; SSE2-NEXT: pandn %xmm8, %xmm6 ; SSE2-NEXT: por %xmm1, %xmm6 ; SSE2-NEXT: movdqa %xmm0, %xmm1 -; SSE2-NEXT: pxor %xmm13, %xmm1 -; SSE2-NEXT: movdqa %xmm10, %xmm7 +; SSE2-NEXT: pxor %xmm12, %xmm1 +; SSE2-NEXT: movdqa %xmm9, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm11, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm1, %xmm14 -; SSE2-NEXT: pand %xmm14, %xmm0 -; SSE2-NEXT: pandn %xmm8, %xmm14 -; SSE2-NEXT: por %xmm0, %xmm14 -; SSE2-NEXT: shufps {{.*#+}} xmm14 = xmm14[0,2],xmm6[0,2] +; SSE2-NEXT: pand %xmm10, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm1, %xmm13 +; SSE2-NEXT: pand %xmm13, %xmm0 +; SSE2-NEXT: pandn %xmm8, %xmm13 +; SSE2-NEXT: por %xmm0, %xmm13 +; SSE2-NEXT: shufps {{.*#+}} xmm13 = xmm13[0,2],xmm6[0,2] ; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm13, %xmm0 -; SSE2-NEXT: movdqa %xmm10, %xmm1 +; SSE2-NEXT: pxor %xmm12, %xmm0 +; SSE2-NEXT: movdqa %xmm9, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm6, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm11 = xmm1[1,1,3,3] -; SSE2-NEXT: pxor %xmm2, %xmm13 -; SSE2-NEXT: movdqa %xmm10, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm13, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] +; SSE2-NEXT: pxor %xmm2, %xmm12 +; SSE2-NEXT: movdqa %xmm9, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm12, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm13 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm13[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm12 +; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm12[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm10 = xmm1[1,1,3,3] -; SSE2-NEXT: movd %xmm9, %eax +; SSE2-NEXT: pshufd {{.*#+}} xmm9 = xmm1[1,1,3,3] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB0_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movss %xmm14, (%rdi) +; SSE2-NEXT: movss %xmm13, (%rdi) ; SSE2-NEXT: .LBB0_2: # %else -; SSE2-NEXT: por %xmm11, %xmm0 -; SSE2-NEXT: por %xmm10, %xmm6 -; SSE2-NEXT: psrlq $16, %xmm12 -; SSE2-NEXT: movd %xmm12, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: por %xmm10, %xmm0 +; SSE2-NEXT: por %xmm9, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm11 +; SSE2-NEXT: packsswb %xmm0, %xmm11 +; SSE2-NEXT: pmovmskb %xmm11, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB0_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm14[1,1,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm13[1,1,2,3] ; SSE2-NEXT: movd %xmm1, 4(%rdi) ; SSE2-NEXT: .LBB0_4: # %else2 ; SSE2-NEXT: pand %xmm0, %xmm3 @@ -89,20 +90,25 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 ; SSE2-NEXT: pxor %xmm4, %xmm7 -; SSE2-NEXT: pextrw $4, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm7, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB0_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm14[2,3,0,1] +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm13[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 8(%rdi) ; SSE2-NEXT: .LBB0_6: # %else4 ; SSE2-NEXT: por %xmm0, %xmm3 ; SSE2-NEXT: por %xmm6, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB0_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm14[3,1,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) ; SSE2-NEXT: .LBB0_8: # %else6 ; SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[0,2],xmm3[0,2] @@ -110,14 +116,18 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB0_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: movss %xmm2, 16(%rdi) ; SSE2-NEXT: .LBB0_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB0_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,2,3] @@ -127,15 +137,19 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB0_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,0,1] ; SSE2-NEXT: movd %xmm1, 24(%rdi) ; SSE2-NEXT: .LBB0_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB0_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[3,1,2,3] @@ -150,6 +164,10 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm10, %xmm10 ; SSE4-NEXT: pxor %xmm0, %xmm10 +; SSE4-NEXT: movdqa %xmm10, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm9 = [4294967295,4294967295] ; SSE4-NEXT: movdqa {{.*#+}} xmm11 = [9223372036854775808,9223372036854775808] ; SSE4-NEXT: movdqa %xmm1, %xmm6 @@ -176,14 +194,15 @@ ; SSE4-NEXT: pcmpgtq %xmm11, %xmm7 ; SSE4-NEXT: movdqa %xmm7, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm9 -; SSE4-NEXT: pextrb $0, %xmm10, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB0_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) ; SSE4-NEXT: .LBB0_2: # %else -; SSE4-NEXT: pextrb $4, %xmm10, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm10 +; SSE4-NEXT: packsswb %xmm0, %xmm10 +; SSE4-NEXT: pmovmskb %xmm10, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB0_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: extractps $1, %xmm1, 4(%rdi) @@ -192,14 +211,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB0_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: extractps $2, %xmm1, 8(%rdi) ; SSE4-NEXT: .LBB0_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB0_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: extractps $3, %xmm1, 12(%rdi) @@ -209,14 +233,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB0_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: movss %xmm9, 16(%rdi) ; SSE4-NEXT: .LBB0_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB0_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: extractps $1, %xmm9, 20(%rdi) @@ -225,14 +253,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB0_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: extractps $2, %xmm9, 24(%rdi) ; SSE4-NEXT: .LBB0_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB0_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: extractps $3, %xmm9, 28(%rdi) @@ -337,45 +369,47 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm6, %xmm6 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm6 -; SSE2-NEXT: pcmpeqd %xmm10, %xmm10 -; SSE2-NEXT: pxor %xmm6, %xmm10 -; SSE2-NEXT: movdqa %xmm10, %xmm9 -; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 +; SSE2-NEXT: pxor %xmm6, %xmm9 +; SSE2-NEXT: movdqa %xmm9, %xmm6 +; SSE2-NEXT: packssdw %xmm0, %xmm6 +; SSE2-NEXT: packsswb %xmm0, %xmm6 +; SSE2-NEXT: pmovmskb %xmm6, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] -; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: movdqa %xmm2, %xmm7 -; SSE2-NEXT: pxor %xmm12, %xmm7 -; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002324991,9223372039002324991] -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm7 +; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002324991,9223372039002324991] +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm7, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm14 = xmm6[1,1,3,3] -; SSE2-NEXT: por %xmm7, %xmm14 -; SSE2-NEXT: pand %xmm14, %xmm2 -; SSE2-NEXT: pandn %xmm8, %xmm14 -; SSE2-NEXT: por %xmm2, %xmm14 +; SSE2-NEXT: pand %xmm12, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[1,1,3,3] +; SSE2-NEXT: por %xmm7, %xmm13 +; SSE2-NEXT: pand %xmm13, %xmm2 +; SSE2-NEXT: pandn %xmm8, %xmm13 +; SSE2-NEXT: por %xmm2, %xmm13 ; SSE2-NEXT: movdqa %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm12, %xmm2 -; SSE2-NEXT: movdqa %xmm11, %xmm7 +; SSE2-NEXT: pxor %xmm11, %xmm2 +; SSE2-NEXT: movdqa %xmm10, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm2, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm6 +; SSE2-NEXT: pand %xmm12, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm6, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm3 ; SSE2-NEXT: pandn %xmm8, %xmm2 ; SSE2-NEXT: por %xmm3, %xmm2 ; SSE2-NEXT: movdqa %xmm0, %xmm3 -; SSE2-NEXT: pxor %xmm12, %xmm3 -; SSE2-NEXT: movdqa %xmm11, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm3 +; SSE2-NEXT: movdqa %xmm10, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm3, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm3[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm3 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] @@ -383,12 +417,12 @@ ; SSE2-NEXT: pand %xmm6, %xmm0 ; SSE2-NEXT: pandn %xmm8, %xmm6 ; SSE2-NEXT: por %xmm0, %xmm6 -; SSE2-NEXT: pxor %xmm1, %xmm12 -; SSE2-NEXT: movdqa %xmm11, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm12, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm11 +; SSE2-NEXT: movdqa %xmm10, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm11, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm11, %xmm12 -; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm12[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm10, %xmm11 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,1,3,3] ; SSE2-NEXT: pand %xmm3, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm0 @@ -402,21 +436,20 @@ ; SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1] ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[0,2,2,3] ; SSE2-NEXT: pshuflw {{.*#+}} xmm2 = xmm0[0,1,0,2,4,5,6,7] -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm14[0,2,2,3] +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm13[0,2,2,3] ; SSE2-NEXT: pshuflw {{.*#+}} xmm0 = xmm0[0,1,0,2,4,5,6,7] ; SSE2-NEXT: punpckldq {{.*#+}} xmm0 = xmm0[0],xmm2[0],xmm0[1],xmm2[1] ; SSE2-NEXT: movsd {{.*#+}} xmm0 = xmm1[0],xmm0[1] -; SSE2-NEXT: movd %xmm9, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB1_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB1_2: # %else -; SSE2-NEXT: psrlq $16, %xmm10 -; SSE2-NEXT: movd %xmm10, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB1_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm0, %eax @@ -426,15 +459,20 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm2 +; SSE2-NEXT: packssdw %xmm0, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB1_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB1_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB1_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -444,15 +482,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm2, %xmm1 -; SSE2-NEXT: pextrw $0, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB1_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB1_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB1_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -462,15 +504,19 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm5, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm2 +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB1_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB1_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB1_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -485,6 +531,10 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm9, %xmm9 ; SSE4-NEXT: pxor %xmm0, %xmm9 +; SSE4-NEXT: movdqa %xmm9, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm6 = [65535,65535] ; SSE4-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808] ; SSE4-NEXT: movdqa %xmm1, %xmm7 @@ -513,14 +563,15 @@ ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm6 ; SSE4-NEXT: packusdw %xmm7, %xmm6 ; SSE4-NEXT: packusdw %xmm6, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm9, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB1_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) ; SSE4-NEXT: .LBB1_2: # %else -; SSE4-NEXT: pextrb $4, %xmm9, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB1_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm1, 2(%rdi) @@ -529,14 +580,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB1_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm1, 4(%rdi) ; SSE4-NEXT: .LBB1_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB1_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm1, 6(%rdi) @@ -545,14 +601,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB1_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm1, 8(%rdi) ; SSE4-NEXT: .LBB1_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB1_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm1, 10(%rdi) @@ -561,14 +621,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB1_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm1, 12(%rdi) ; SSE4-NEXT: .LBB1_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB1_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm1, 14(%rdi) @@ -581,29 +645,29 @@ ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm9, %xmm9 ; AVX1-NEXT: vpxor %xmm9, %xmm5, %xmm5 -; AVX1-NEXT: vmovapd {{.*#+}} ymm10 = [65535,65535,65535,65535] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] -; AVX1-NEXT: vpxor %xmm3, %xmm7, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854841343,9223372036854841343] -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7 -; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm6, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm10, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX1-NEXT: vpxor %xmm3, %xmm6, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3 -; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3 -; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm10, %ymm1 +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [65535,65535,65535,65535] +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] +; AVX1-NEXT: vpxor %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343] +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm6 +; AVX1-NEXT: vpxor %xmm7, %xmm0, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm4, %ymm4 +; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm5, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 +; AVX1-NEXT: vpxor %xmm7, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm4 +; AVX1-NEXT: vpxor %xmm7, %xmm1, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm3 +; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm5, %ymm1 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB1_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -611,8 +675,8 @@ ; AVX1-NEXT: .LBB1_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm9, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB1_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -621,16 +685,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB1_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB1_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB1_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -640,30 +704,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB1_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB1_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB1_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB1_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB1_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB1_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB1_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -675,85 +743,81 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [65535,65535,65535,65535] -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] -; AVX2-NEXT: vpxor %ymm7, %ymm1, %ymm8 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm9 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] -; AVX2-NEXT: vpcmpgtq %ymm8, %ymm9, %ymm8 -; AVX2-NEXT: vblendvpd %ymm8, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpxor %ymm7, %ymm0, %ymm7 -; AVX2-NEXT: vpcmpgtq %ymm7, %ymm9, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [65535,65535,65535,65535] +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] +; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5 +; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm4 +; AVX2-NEXT: vpcmpgtq %ymm4, %ymm6, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB1_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB1_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB1_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB1_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB1_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB1_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB1_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB1_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB1_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB1_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB1_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB1_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB1_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB1_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB1_15 +; AVX2-NEXT: .LBB1_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB1_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB1_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB1_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB1_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB1_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -856,34 +920,36 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm7, %xmm7 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm7 -; SSE2-NEXT: pcmpeqd %xmm11, %xmm11 -; SSE2-NEXT: pxor %xmm7, %xmm11 -; SSE2-NEXT: movdqa %xmm11, %xmm9 -; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm10, %xmm10 +; SSE2-NEXT: pxor %xmm7, %xmm10 +; SSE2-NEXT: movdqa %xmm10, %xmm7 +; SSE2-NEXT: packssdw %xmm0, %xmm7 +; SSE2-NEXT: packsswb %xmm0, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] -; SSE2-NEXT: movdqa {{.*#+}} xmm12 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: movdqa %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm12, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [9223372039002259711,9223372039002259711] -; SSE2-NEXT: movdqa %xmm10, %xmm7 +; SSE2-NEXT: pxor %xmm11, %xmm6 +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] +; SSE2-NEXT: movdqa %xmm9, %xmm7 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm6 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm6 +; SSE2-NEXT: pand %xmm12, %xmm6 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm7[1,1,3,3] ; SSE2-NEXT: por %xmm6, %xmm7 ; SSE2-NEXT: pand %xmm7, %xmm1 ; SSE2-NEXT: pandn %xmm8, %xmm7 ; SSE2-NEXT: por %xmm1, %xmm7 ; SSE2-NEXT: movdqa %xmm0, %xmm1 -; SSE2-NEXT: pxor %xmm12, %xmm1 -; SSE2-NEXT: movdqa %xmm10, %xmm6 +; SSE2-NEXT: pxor %xmm11, %xmm1 +; SSE2-NEXT: movdqa %xmm9, %xmm6 ; SSE2-NEXT: pcmpgtd %xmm1, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm13 = xmm6[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm12 = xmm6[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: pand %xmm13, %xmm1 +; SSE2-NEXT: pand %xmm12, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] ; SSE2-NEXT: por %xmm1, %xmm6 ; SSE2-NEXT: pand %xmm6, %xmm0 @@ -891,11 +957,11 @@ ; SSE2-NEXT: por %xmm0, %xmm6 ; SSE2-NEXT: packuswb %xmm7, %xmm6 ; SSE2-NEXT: movdqa %xmm3, %xmm0 -; SSE2-NEXT: pxor %xmm12, %xmm0 -; SSE2-NEXT: movdqa %xmm10, %xmm1 +; SSE2-NEXT: pxor %xmm11, %xmm0 +; SSE2-NEXT: movdqa %xmm9, %xmm1 ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 ; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm9, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: pand %xmm7, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] @@ -903,12 +969,12 @@ ; SSE2-NEXT: pand %xmm1, %xmm3 ; SSE2-NEXT: pandn %xmm8, %xmm1 ; SSE2-NEXT: por %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm2, %xmm12 -; SSE2-NEXT: movdqa %xmm10, %xmm0 -; SSE2-NEXT: pcmpgtd %xmm12, %xmm0 +; SSE2-NEXT: pxor %xmm2, %xmm11 +; SSE2-NEXT: movdqa %xmm9, %xmm0 +; SSE2-NEXT: pcmpgtd %xmm11, %xmm0 ; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm0[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm10, %xmm12 -; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm12[1,1,3,3] +; SSE2-NEXT: pcmpeqd %xmm9, %xmm11 +; SSE2-NEXT: pshufd {{.*#+}} xmm7 = xmm11[1,1,3,3] ; SSE2-NEXT: pand %xmm3, %xmm7 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] ; SSE2-NEXT: por %xmm7, %xmm0 @@ -917,17 +983,16 @@ ; SSE2-NEXT: por %xmm2, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 ; SSE2-NEXT: packuswb %xmm0, %xmm6 -; SSE2-NEXT: movd %xmm9, %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB2_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm6, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB2_2: # %else -; SSE2-NEXT: psrlq $16, %xmm11 -; SSE2-NEXT: movd %xmm11, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm10 +; SSE2-NEXT: packsswb %xmm0, %xmm10 +; SSE2-NEXT: pmovmskb %xmm10, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB2_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm6, %eax @@ -938,15 +1003,20 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB2_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm6, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB2_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB2_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm6, %eax @@ -956,15 +1026,19 @@ ; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB2_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm6, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB2_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB2_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm6, %eax @@ -974,15 +1048,19 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB2_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm6, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB2_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB2_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm6, %eax @@ -997,6 +1075,10 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm9, %xmm9 ; SSE4-NEXT: pxor %xmm0, %xmm9 +; SSE4-NEXT: movdqa %xmm9, %xmm0 +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm6 = [255,255] ; SSE4-NEXT: movdqa {{.*#+}} xmm10 = [9223372036854775808,9223372036854775808] ; SSE4-NEXT: movdqa %xmm1, %xmm7 @@ -1025,14 +1107,15 @@ ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm6 ; SSE4-NEXT: packusdw %xmm7, %xmm6 ; SSE4-NEXT: packusdw %xmm6, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm9, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB2_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) ; SSE4-NEXT: .LBB2_2: # %else -; SSE4-NEXT: pextrb $4, %xmm9, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB2_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm1, 1(%rdi) @@ -1041,14 +1124,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm4, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB2_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm1, 2(%rdi) ; SSE4-NEXT: .LBB2_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB2_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm1, 3(%rdi) @@ -1057,14 +1145,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB2_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm1, 4(%rdi) ; SSE4-NEXT: .LBB2_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB2_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm1, 5(%rdi) @@ -1073,14 +1165,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB2_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm1, 6(%rdi) ; SSE4-NEXT: .LBB2_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB2_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm1, 7(%rdi) @@ -1093,29 +1189,29 @@ ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm9, %xmm9, %xmm9 ; AVX1-NEXT: vpxor %xmm9, %xmm5, %xmm5 -; AVX1-NEXT: vmovapd {{.*#+}} ymm10 = [255,255,255,255] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] -; AVX1-NEXT: vpxor %xmm3, %xmm7, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854776063,9223372036854776063] -; AVX1-NEXT: vpcmpgtq %xmm7, %xmm4, %xmm7 -; AVX1-NEXT: vpxor %xmm3, %xmm0, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vinsertf128 $1, %xmm7, %ymm6, %ymm6 -; AVX1-NEXT: vblendvpd %ymm6, %ymm0, %ymm10, %ymm0 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX1-NEXT: vpxor %xmm3, %xmm6, %xmm6 -; AVX1-NEXT: vpcmpgtq %xmm6, %xmm4, %xmm6 -; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm3 -; AVX1-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 -; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm3, %ymm3 -; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm10, %ymm1 +; AVX1-NEXT: vmovmskps %ymm5, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm5 = [255,255,255,255] +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] +; AVX1-NEXT: vpxor %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063] +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm6 +; AVX1-NEXT: vpxor %xmm7, %xmm0, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm6, %ymm4, %ymm4 +; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm5, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm4 +; AVX1-NEXT: vpxor %xmm7, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm3, %xmm4 +; AVX1-NEXT: vpxor %xmm7, %xmm1, %xmm6 +; AVX1-NEXT: vpcmpgtq %xmm6, %xmm3, %xmm3 +; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm3, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm1, %ymm5, %ymm1 ; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3 ; AVX1-NEXT: vpackusdw %xmm3, %xmm1, %xmm1 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 ; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 ; AVX1-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB2_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -1123,8 +1219,8 @@ ; AVX1-NEXT: .LBB2_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm9, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $4, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB2_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -1133,16 +1229,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB2_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB2_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB2_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -1152,30 +1248,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB2_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB2_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB2_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB2_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB2_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB2_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB2_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -1187,85 +1287,81 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqd %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm5 -; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm6 = [255,255,255,255] -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm7 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] -; AVX2-NEXT: vpxor %ymm7, %ymm1, %ymm8 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm9 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] -; AVX2-NEXT: vpcmpgtq %ymm8, %ymm9, %ymm8 -; AVX2-NEXT: vblendvpd %ymm8, %ymm1, %ymm6, %ymm1 -; AVX2-NEXT: vpxor %ymm7, %ymm0, %ymm7 -; AVX2-NEXT: vpcmpgtq %ymm7, %ymm9, %ymm7 -; AVX2-NEXT: vblendvpd %ymm7, %ymm0, %ymm6, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vmovmskps %ymm3, %eax +; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [255,255,255,255] +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm5 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm6 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] +; AVX2-NEXT: vpcmpgtq %ymm5, %ymm6, %ymm5 +; AVX2-NEXT: vblendvpd %ymm5, %ymm1, %ymm3, %ymm1 +; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm4 +; AVX2-NEXT: vpcmpgtq %ymm4, %ymm6, %ymm4 +; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpackusdw %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm5, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB2_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB2_2: # %else -; AVX2-NEXT: vpxor %xmm4, %xmm3, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB2_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB2_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB2_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB2_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB2_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB2_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB2_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB2_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB2_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB2_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB2_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB2_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB2_15 +; AVX2-NEXT: .LBB2_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB2_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB2_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB2_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB2_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB2_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -1369,101 +1465,99 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [4294967295,4294967295] -; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: movdqa %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm5, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259455,9223372039002259455] -; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm4, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm4 -; SSE2-NEXT: por %xmm1, %xmm4 -; SSE2-NEXT: pxor %xmm0, %xmm5 -; SSE2-NEXT: movdqa %xmm9, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa %xmm1, %xmm5 +; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259455,9223372039002259455] +; SSE2-NEXT: movdqa %xmm6, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm5 +; SSE2-NEXT: pand %xmm3, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm5, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm3 +; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pxor %xmm0, %xmm4 +; SSE2-NEXT: movdqa %xmm6, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: por %xmm4, %xmm1 ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pandn %xmm8, %xmm1 ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2] -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB3_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movss %xmm1, (%rdi) ; SSE2-NEXT: .LBB3_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB3_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm3, 4(%rdi) +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] +; SSE2-NEXT: movd %xmm0, 4(%rdi) ; SSE2-NEXT: .LBB3_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB3_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB3_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB3_7 +; SSE2-NEXT: .LBB3_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB3_5: # %cond.store3 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 8(%rdi) -; SSE2-NEXT: .LBB3_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB3_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB3_7: # %cond.store5 ; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3] ; SSE2-NEXT: movd %xmm0, 12(%rdi) -; SSE2-NEXT: .LBB3_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i32: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm8 +; SSE4-NEXT: movdqa %xmm0, %xmm3 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 -; SSE4-NEXT: pxor %xmm0, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm0, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm5 = [4294967295,4294967295] -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm7, %xmm3 +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: movdqa %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 ; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372041149743103,9223372041149743103] ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movapd %xmm5, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm8, %xmm7 -; SSE4-NEXT: pcmpgtq %xmm7, %xmm4 +; SSE4-NEXT: pcmpgtq %xmm7, %xmm0 +; SSE4-NEXT: movapd %xmm5, %xmm7 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm3, %xmm6 +; SSE4-NEXT: pcmpgtq %xmm6, %xmm4 ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm5 -; SSE4-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm3[0,2] -; SSE4-NEXT: pextrb $0, %xmm6, %eax +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: shufps {{.*#+}} xmm5 = xmm5[0,2],xmm7[0,2] ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB3_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: movss %xmm5, (%rdi) ; SSE4-NEXT: .LBB3_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB3_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: extractps $1, %xmm5, 4(%rdi) @@ -1472,18 +1566,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB3_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB3_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB3_7 +; SSE4-NEXT: .LBB3_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB3_5: # %cond.store3 ; SSE4-NEXT: extractps $2, %xmm5, 8(%rdi) -; SSE4-NEXT: .LBB3_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB3_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB3_7: # %cond.store5 ; SSE4-NEXT: extractps $3, %xmm5, 12(%rdi) -; SSE4-NEXT: .LBB3_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i32: @@ -1574,102 +1670,100 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535] -; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: movdqa %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm5, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002324991,9223372039002324991] -; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm4, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm4 -; SSE2-NEXT: por %xmm1, %xmm4 -; SSE2-NEXT: pxor %xmm0, %xmm5 -; SSE2-NEXT: movdqa %xmm9, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa %xmm1, %xmm5 +; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002324991,9223372039002324991] +; SSE2-NEXT: movdqa %xmm6, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm5 +; SSE2-NEXT: pand %xmm3, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm5, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm3 +; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pxor %xmm0, %xmm4 +; SSE2-NEXT: movdqa %xmm6, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: por %xmm4, %xmm1 ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pandn %xmm8, %xmm1 ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm4[0,2] -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,2],xmm3[0,2] ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB4_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm1, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB4_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB4_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm1, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) ; SSE2-NEXT: .LBB4_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB4_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB4_6: # %else4 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB4_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB4_7 +; SSE2-NEXT: .LBB4_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB4_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm1, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB4_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB4_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm1, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB4_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i16: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm8 +; SSE4-NEXT: movdqa %xmm0, %xmm3 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 -; SSE4-NEXT: pxor %xmm0, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm0, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm5 = [65535,65535] -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm7, %xmm3 +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: movdqa %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 ; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854841343,9223372036854841343] ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movapd %xmm5, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm8, %xmm7 -; SSE4-NEXT: pcmpgtq %xmm7, %xmm4 +; SSE4-NEXT: pcmpgtq %xmm7, %xmm0 +; SSE4-NEXT: movapd %xmm5, %xmm7 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm3, %xmm6 +; SSE4-NEXT: pcmpgtq %xmm6, %xmm4 ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm5 -; SSE4-NEXT: packusdw %xmm3, %xmm5 -; SSE4-NEXT: pextrb $0, %xmm6, %eax +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: packusdw %xmm7, %xmm5 ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB4_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm5, (%rdi) ; SSE4-NEXT: .LBB4_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB4_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm5, 2(%rdi) @@ -1678,18 +1772,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB4_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB4_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB4_7 +; SSE4-NEXT: .LBB4_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB4_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm5, 4(%rdi) -; SSE4-NEXT: .LBB4_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB4_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB4_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm5, 6(%rdi) -; SSE4-NEXT: .LBB4_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i16: @@ -1698,26 +1794,25 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [65535,65535,65535,65535] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808] -; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854841343,9223372036854841343] -; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4 -; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm5 -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vmovmskps %xmm2, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [65535,65535,65535,65535] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] +; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854841343,9223372036854841343] +; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 +; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB4_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB4_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB4_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -1726,18 +1821,21 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB4_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB4_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB4_7 +; AVX1-NEXT: .LBB4_8: # %else6 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB4_5: # %cond.store3 ; AVX1-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX1-NEXT: .LBB4_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB4_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB4_7: # %cond.store5 ; AVX1-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX1-NEXT: .LBB4_8: # %else6 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -1747,22 +1845,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [65535,65535,65535,65535] -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] -; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm4 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] -; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [65535,65535,65535,65535] +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] +; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854841343,9223372036854841343,9223372036854841343,9223372036854841343] +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB4_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB4_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB4_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -1771,18 +1868,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB4_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB4_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB4_7 +; AVX2-NEXT: .LBB4_8: # %else6 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB4_5: # %cond.store3 ; AVX2-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX2-NEXT: .LBB4_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB4_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB4_7: # %cond.store5 ; AVX2-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB4_8: # %else6 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -1862,102 +1962,100 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: movmskps %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255] -; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: movdqa %xmm1, %xmm6 -; SSE2-NEXT: pxor %xmm5, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [9223372039002259711,9223372039002259711] -; SSE2-NEXT: movdqa %xmm9, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm6, %xmm7 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm6[1,1,3,3] -; SSE2-NEXT: pand %xmm4, %xmm6 -; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm7[1,1,3,3] -; SSE2-NEXT: por %xmm6, %xmm4 -; SSE2-NEXT: pand %xmm4, %xmm1 -; SSE2-NEXT: pandn %xmm8, %xmm4 -; SSE2-NEXT: por %xmm1, %xmm4 -; SSE2-NEXT: pxor %xmm0, %xmm5 -; SSE2-NEXT: movdqa %xmm9, %xmm1 -; SSE2-NEXT: pcmpgtd %xmm5, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm6 = xmm1[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm9, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [9223372039002259456,9223372039002259456] +; SSE2-NEXT: movdqa %xmm1, %xmm5 +; SSE2-NEXT: pxor %xmm4, %xmm5 +; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [9223372039002259711,9223372039002259711] +; SSE2-NEXT: movdqa %xmm6, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm5, %xmm7 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm5 ; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm5[1,1,3,3] -; SSE2-NEXT: pand %xmm6, %xmm5 +; SSE2-NEXT: pand %xmm3, %xmm5 +; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm7[1,1,3,3] +; SSE2-NEXT: por %xmm5, %xmm3 +; SSE2-NEXT: pand %xmm3, %xmm1 +; SSE2-NEXT: pandn %xmm8, %xmm3 +; SSE2-NEXT: por %xmm1, %xmm3 +; SSE2-NEXT: pxor %xmm0, %xmm4 +; SSE2-NEXT: movdqa %xmm6, %xmm1 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm1[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm6, %xmm4 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[1,1,3,3] +; SSE2-NEXT: pand %xmm5, %xmm4 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] -; SSE2-NEXT: por %xmm5, %xmm1 +; SSE2-NEXT: por %xmm4, %xmm1 ; SSE2-NEXT: pand %xmm1, %xmm0 ; SSE2-NEXT: pandn %xmm8, %xmm1 ; SSE2-NEXT: por %xmm0, %xmm1 -; SSE2-NEXT: packuswb %xmm4, %xmm1 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax +; SSE2-NEXT: packuswb %xmm3, %xmm1 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB5_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm1, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB5_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB5_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm1, %eax ; SSE2-NEXT: movb %al, 1(%rdi) ; SSE2-NEXT: .LBB5_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB5_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB5_6: # %else4 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm2, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB5_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB5_7 +; SSE2-NEXT: .LBB5_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB5_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm1, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB5_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB5_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm1, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB5_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i64_v4i8: ; SSE4: # %bb.0: -; SSE4-NEXT: movdqa %xmm0, %xmm8 +; SSE4-NEXT: movdqa %xmm0, %xmm3 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm6, %xmm6 -; SSE4-NEXT: pxor %xmm0, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm0, %xmm4 +; SSE4-NEXT: movmskps %xmm4, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm5 = [255,255] -; SSE4-NEXT: movdqa {{.*#+}} xmm7 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: movdqa %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm7, %xmm3 +; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: movdqa %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 ; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854776063,9223372036854776063] ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 -; SSE4-NEXT: movapd %xmm5, %xmm3 -; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm3 -; SSE4-NEXT: pxor %xmm8, %xmm7 -; SSE4-NEXT: pcmpgtq %xmm7, %xmm4 +; SSE4-NEXT: pcmpgtq %xmm7, %xmm0 +; SSE4-NEXT: movapd %xmm5, %xmm7 +; SSE4-NEXT: blendvpd %xmm0, %xmm1, %xmm7 +; SSE4-NEXT: pxor %xmm3, %xmm6 +; SSE4-NEXT: pcmpgtq %xmm6, %xmm4 ; SSE4-NEXT: movdqa %xmm4, %xmm0 -; SSE4-NEXT: blendvpd %xmm0, %xmm8, %xmm5 -; SSE4-NEXT: packusdw %xmm3, %xmm5 -; SSE4-NEXT: pextrb $0, %xmm6, %eax +; SSE4-NEXT: blendvpd %xmm0, %xmm3, %xmm5 +; SSE4-NEXT: packusdw %xmm7, %xmm5 ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB5_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm5, (%rdi) ; SSE4-NEXT: .LBB5_2: # %else -; SSE4-NEXT: pextrb $4, %xmm6, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB5_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm5, 1(%rdi) @@ -1966,18 +2064,20 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm2, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB5_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm0, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB5_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB5_7 +; SSE4-NEXT: .LBB5_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB5_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm5, 2(%rdi) -; SSE4-NEXT: .LBB5_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB5_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB5_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm5, 3(%rdi) -; SSE4-NEXT: .LBB5_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i64_v4i8: @@ -1986,26 +2086,25 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vmovapd {{.*#+}} ymm3 = [255,255,255,255] -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854775808,9223372036854775808] -; AVX1-NEXT: vpxor %xmm5, %xmm4, %xmm4 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [9223372036854776063,9223372036854776063] -; AVX1-NEXT: vpcmpgtq %xmm4, %xmm6, %xmm4 -; AVX1-NEXT: vpxor %xmm5, %xmm0, %xmm5 -; AVX1-NEXT: vpcmpgtq %xmm5, %xmm6, %xmm5 -; AVX1-NEXT: vinsertf128 $1, %xmm4, %ymm5, %ymm4 -; AVX1-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 +; AVX1-NEXT: vmovmskps %xmm2, %eax +; AVX1-NEXT: vmovapd {{.*#+}} ymm2 = [255,255,255,255] ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax +; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] +; AVX1-NEXT: vpxor %xmm4, %xmm3, %xmm3 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [9223372036854776063,9223372036854776063] +; AVX1-NEXT: vpcmpgtq %xmm3, %xmm5, %xmm3 +; AVX1-NEXT: vpxor %xmm4, %xmm0, %xmm4 +; AVX1-NEXT: vpcmpgtq %xmm4, %xmm5, %xmm4 +; AVX1-NEXT: vinsertf128 $1, %xmm3, %ymm4, %ymm3 +; AVX1-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB5_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB5_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB5_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -2014,18 +2113,21 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB5_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB5_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB5_7 +; AVX1-NEXT: .LBB5_8: # %else6 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB5_5: # %cond.store3 ; AVX1-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX1-NEXT: .LBB5_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB5_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB5_7: # %cond.store5 ; AVX1-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX1-NEXT: .LBB5_8: # %else6 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -2035,22 +2137,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm3 = [255,255,255,255] -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] -; AVX2-NEXT: vpxor %ymm4, %ymm0, %ymm4 -; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm5 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] -; AVX2-NEXT: vpcmpgtq %ymm4, %ymm5, %ymm4 -; AVX2-NEXT: vblendvpd %ymm4, %ymm0, %ymm3, %ymm0 -; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackusdw %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vbroadcastsd {{.*#+}} ymm2 = [255,255,255,255] +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm3 = [9223372036854775808,9223372036854775808,9223372036854775808,9223372036854775808] +; AVX2-NEXT: vpxor %ymm3, %ymm0, %ymm3 +; AVX2-NEXT: vpbroadcastq {{.*#+}} ymm4 = [9223372036854776063,9223372036854776063,9223372036854776063,9223372036854776063] +; AVX2-NEXT: vpcmpgtq %ymm3, %ymm4, %ymm3 +; AVX2-NEXT: vblendvpd %ymm3, %ymm0, %ymm2, %ymm0 +; AVX2-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB5_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB5_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB5_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -2059,18 +2160,21 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB5_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB5_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB5_7 +; AVX2-NEXT: .LBB5_8: # %else6 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB5_5: # %cond.store3 ; AVX2-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX2-NEXT: .LBB5_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB5_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB5_7: # %cond.store5 ; AVX2-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX2-NEXT: .LBB5_8: # %else6 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -2152,36 +2256,37 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259455,9223372039002259455] -; SSE2-NEXT: movdqa %xmm3, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm5, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm2 -; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2 -; SSE2-NEXT: por %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB6_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm2, (%rdi) -; SSE2-NEXT: .LBB6_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259455,9223372039002259455] +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSE2-NEXT: por %xmm0, %xmm1 ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB6_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB6_3 +; SSE2-NEXT: .LBB6_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB6_1: # %cond.store +; SSE2-NEXT: movd %xmm1, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB6_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,0,1] +; SSE2-NEXT: .LBB6_3: # %cond.store1 +; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] ; SSE2-NEXT: movd %xmm0, 4(%rdi) -; SSE2-NEXT: .LBB6_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i32: @@ -2189,26 +2294,28 @@ ; SSE4-NEXT: movdqa %xmm0, %xmm2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm0, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm1 = [4294967295,4294967295] -; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: pxor %xmm2, %xmm4 +; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: pxor %xmm2, %xmm3 ; SSE4-NEXT: movdqa {{.*#+}} xmm0 = [9223372041149743103,9223372041149743103] -; SSE4-NEXT: pcmpgtq %xmm4, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB6_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB6_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB6_3 +; SSE4-NEXT: .LBB6_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB6_1: # %cond.store ; SSE4-NEXT: movss %xmm1, (%rdi) -; SSE4-NEXT: .LBB6_2: # %else -; SSE4-NEXT: pextrb $8, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB6_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB6_3: # %cond.store1 ; SSE4-NEXT: extractps $2, %xmm1, 4(%rdi) -; SSE4-NEXT: .LBB6_4: # %else2 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v2i64_v2i32: @@ -2292,37 +2399,38 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002324991,9223372039002324991] -; SSE2-NEXT: movdqa %xmm3, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm5, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm2 -; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2 -; SSE2-NEXT: por %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB7_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movw %ax, (%rdi) -; SSE2-NEXT: .LBB7_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002324991,9223372039002324991] +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSE2-NEXT: por %xmm0, %xmm1 ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB7_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB7_3 +; SSE2-NEXT: .LBB7_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB7_1: # %cond.store +; SSE2-NEXT: movd %xmm1, %ecx +; SSE2-NEXT: movw %cx, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB7_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pextrw $4, %xmm2, %eax +; SSE2-NEXT: .LBB7_3: # %cond.store1 +; SSE2-NEXT: pextrw $4, %xmm1, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) -; SSE2-NEXT: .LBB7_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i16: @@ -2330,26 +2438,28 @@ ; SSE4-NEXT: movdqa %xmm0, %xmm2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm0, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm1 = [65535,65535] -; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: pxor %xmm2, %xmm4 +; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: pxor %xmm2, %xmm3 ; SSE4-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854841343,9223372036854841343] -; SSE4-NEXT: pcmpgtq %xmm4, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB7_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB7_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB7_3 +; SSE4-NEXT: .LBB7_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB7_1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm1, (%rdi) -; SSE4-NEXT: .LBB7_2: # %else -; SSE4-NEXT: pextrb $8, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB7_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB7_3: # %cond.store1 ; SSE4-NEXT: pextrw $4, %xmm1, 2(%rdi) -; SSE4-NEXT: .LBB7_4: # %else2 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i16: @@ -2358,23 +2468,25 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vmovapd {{.*#+}} xmm2 = [65535,65535] -; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3 -; AVX-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854841343,9223372036854841343] -; AVX-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax +; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [65535,65535] +; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm2 +; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854841343,9223372036854841343] +; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB7_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB7_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB7_3 +; AVX-NEXT: .LBB7_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB7_1: # %cond.store ; AVX-NEXT: vpextrw $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB7_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB7_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB7_3: # %cond.store1 ; AVX-NEXT: vpextrw $4, %xmm0, 2(%rdi) -; AVX-NEXT: .LBB7_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i16: @@ -2437,37 +2549,38 @@ ; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,0,3,2] ; SSE2-NEXT: pand %xmm2, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259456,9223372039002259456] -; SSE2-NEXT: pxor %xmm0, %xmm2 -; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [9223372039002259711,9223372039002259711] -; SSE2-NEXT: movdqa %xmm3, %xmm4 -; SSE2-NEXT: pcmpgtd %xmm2, %xmm4 -; SSE2-NEXT: pshufd {{.*#+}} xmm5 = xmm4[0,0,2,2] -; SSE2-NEXT: pcmpeqd %xmm3, %xmm2 -; SSE2-NEXT: pshufd {{.*#+}} xmm3 = xmm2[1,1,3,3] -; SSE2-NEXT: pand %xmm5, %xmm3 -; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm4[1,1,3,3] -; SSE2-NEXT: por %xmm3, %xmm2 -; SSE2-NEXT: pand %xmm2, %xmm0 -; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2 -; SSE2-NEXT: por %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB8_2 -; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movb %al, (%rdi) -; SSE2-NEXT: .LBB8_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm1, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm1 = [9223372039002259456,9223372039002259456] ; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [9223372039002259711,9223372039002259711] +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: pcmpgtd %xmm1, %xmm3 +; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm3[0,0,2,2] +; SSE2-NEXT: pcmpeqd %xmm2, %xmm1 +; SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm1[1,1,3,3] +; SSE2-NEXT: pand %xmm4, %xmm2 +; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm3[1,1,3,3] +; SSE2-NEXT: por %xmm2, %xmm1 +; SSE2-NEXT: pand %xmm1, %xmm0 +; SSE2-NEXT: pandn {{.*}}(%rip), %xmm1 +; SSE2-NEXT: por %xmm0, %xmm1 ; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: jne .LBB8_1 +; SSE2-NEXT: # %bb.2: # %else +; SSE2-NEXT: testb $2, %al +; SSE2-NEXT: jne .LBB8_3 +; SSE2-NEXT: .LBB8_4: # %else2 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB8_1: # %cond.store +; SSE2-NEXT: movd %xmm1, %ecx +; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB8_4 -; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pextrw $4, %xmm2, %eax +; SSE2-NEXT: .LBB8_3: # %cond.store1 +; SSE2-NEXT: pextrw $4, %xmm1, %eax ; SSE2-NEXT: movb %al, 1(%rdi) -; SSE2-NEXT: .LBB8_4: # %else2 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v2i64_v2i8: @@ -2475,26 +2588,28 @@ ; SSE4-NEXT: movdqa %xmm0, %xmm2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqq %xmm1, %xmm0 -; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE4-NEXT: pxor %xmm0, %xmm3 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: movmskpd %xmm1, %eax ; SSE4-NEXT: movapd {{.*#+}} xmm1 = [255,255] -; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [9223372036854775808,9223372036854775808] -; SSE4-NEXT: pxor %xmm2, %xmm4 +; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [9223372036854775808,9223372036854775808] +; SSE4-NEXT: pxor %xmm2, %xmm3 ; SSE4-NEXT: movdqa {{.*#+}} xmm0 = [9223372036854776063,9223372036854776063] -; SSE4-NEXT: pcmpgtq %xmm4, %xmm0 +; SSE4-NEXT: pcmpgtq %xmm3, %xmm0 ; SSE4-NEXT: blendvpd %xmm0, %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm3, %eax ; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB8_2 -; SSE4-NEXT: # %bb.1: # %cond.store +; SSE4-NEXT: jne .LBB8_1 +; SSE4-NEXT: # %bb.2: # %else +; SSE4-NEXT: testb $2, %al +; SSE4-NEXT: jne .LBB8_3 +; SSE4-NEXT: .LBB8_4: # %else2 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB8_1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm1, (%rdi) -; SSE4-NEXT: .LBB8_2: # %else -; SSE4-NEXT: pextrb $8, %xmm3, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB8_4 -; SSE4-NEXT: # %bb.3: # %cond.store1 +; SSE4-NEXT: .LBB8_3: # %cond.store1 ; SSE4-NEXT: pextrb $8, %xmm1, 1(%rdi) -; SSE4-NEXT: .LBB8_4: # %else2 ; SSE4-NEXT: retq ; ; AVX-LABEL: truncstore_v2i64_v2i8: @@ -2503,23 +2618,25 @@ ; AVX-NEXT: vpcmpeqq %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vmovapd {{.*#+}} xmm2 = [255,255] -; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm3 -; AVX-NEXT: vmovdqa {{.*#+}} xmm4 = [9223372036854776063,9223372036854776063] -; AVX-NEXT: vpcmpgtq %xmm3, %xmm4, %xmm3 -; AVX-NEXT: vblendvpd %xmm3, %xmm0, %xmm2, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm1, %eax +; AVX-NEXT: vmovmskpd %xmm1, %eax +; AVX-NEXT: vmovapd {{.*#+}} xmm1 = [255,255] +; AVX-NEXT: vpxor {{.*}}(%rip), %xmm0, %xmm2 +; AVX-NEXT: vmovdqa {{.*#+}} xmm3 = [9223372036854776063,9223372036854776063] +; AVX-NEXT: vpcmpgtq %xmm2, %xmm3, %xmm2 +; AVX-NEXT: vblendvpd %xmm2, %xmm0, %xmm1, %xmm0 ; AVX-NEXT: testb $1, %al -; AVX-NEXT: je .LBB8_2 -; AVX-NEXT: # %bb.1: # %cond.store +; AVX-NEXT: jne .LBB8_1 +; AVX-NEXT: # %bb.2: # %else +; AVX-NEXT: testb $2, %al +; AVX-NEXT: jne .LBB8_3 +; AVX-NEXT: .LBB8_4: # %else2 +; AVX-NEXT: retq +; AVX-NEXT: .LBB8_1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) -; AVX-NEXT: .LBB8_2: # %else -; AVX-NEXT: vpextrb $8, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB8_4 -; AVX-NEXT: # %bb.3: # %cond.store1 +; AVX-NEXT: .LBB8_3: # %cond.store1 ; AVX-NEXT: vpextrb $8, %xmm0, 1(%rdi) -; AVX-NEXT: .LBB8_4: # %else2 ; AVX-NEXT: retq ; ; AVX512F-LABEL: truncstore_v2i64_v2i8: @@ -2580,6 +2697,11 @@ ; SSE2-NEXT: pxor %xmm12, %xmm12 ; SSE2-NEXT: pcmpeqd %xmm4, %xmm12 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 +; SSE2-NEXT: pxor %xmm9, %xmm12 +; SSE2-NEXT: movdqa %xmm12, %xmm8 +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm0, %xmm13 ; SSE2-NEXT: pxor %xmm11, %xmm13 @@ -2601,17 +2723,16 @@ ; SSE2-NEXT: pslld $16, %xmm8 ; SSE2-NEXT: psrad $16, %xmm8 ; SSE2-NEXT: packssdw %xmm0, %xmm8 -; SSE2-NEXT: movd %xmm12, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB9_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm8, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB9_2: # %else -; SSE2-NEXT: pxor %xmm9, %xmm12 -; SSE2-NEXT: pextrw $2, %xmm12, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm12 +; SSE2-NEXT: packsswb %xmm0, %xmm12 +; SSE2-NEXT: pmovmskb %xmm12, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB9_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $1, %xmm8, %eax @@ -2624,8 +2745,11 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB9_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm8, %eax @@ -2634,8 +2758,10 @@ ; SSE2-NEXT: movdqa %xmm10, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm12, %xmm0 ; SSE2-NEXT: pcmpgtd %xmm11, %xmm10 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB9_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm8, %eax @@ -2645,11 +2771,14 @@ ; SSE2-NEXT: pxor %xmm9, %xmm0 ; SSE2-NEXT: pxor %xmm10, %xmm9 ; SSE2-NEXT: pand %xmm10, %xmm3 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm4, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: packssdw %xmm1, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB9_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm8, %eax @@ -2657,10 +2786,10 @@ ; SSE2-NEXT: .LBB9_10: # %else8 ; SSE2-NEXT: por %xmm0, %xmm2 ; SSE2-NEXT: por %xmm9, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm1, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB9_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm8, %eax @@ -2668,11 +2797,14 @@ ; SSE2-NEXT: .LBB9_12: # %else10 ; SSE2-NEXT: pslld $16, %xmm3 ; SSE2-NEXT: pslld $16, %xmm2 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm5 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB9_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm8, %eax @@ -2680,30 +2812,34 @@ ; SSE2-NEXT: .LBB9_14: # %else12 ; SSE2-NEXT: psrad $16, %xmm3 ; SSE2-NEXT: psrad $16, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB9_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm8, %eax ; SSE2-NEXT: movw %ax, 14(%rdi) ; SSE2-NEXT: .LBB9_16: # %else14 ; SSE2-NEXT: packssdw %xmm3, %xmm2 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB9_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: movd %xmm2, %eax ; SSE2-NEXT: movw %ax, 16(%rdi) ; SSE2-NEXT: .LBB9_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB9_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $1, %xmm2, %eax @@ -2711,37 +2847,44 @@ ; SSE2-NEXT: .LBB9_20: # %else18 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm6, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB9_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movw %ax, 20(%rdi) ; SSE2-NEXT: .LBB9_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB9_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $3, %xmm2, %eax ; SSE2-NEXT: movw %ax, 22(%rdi) ; SSE2-NEXT: .LBB9_24: # %else22 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB9_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $4, %xmm2, %eax ; SSE2-NEXT: movw %ax, 24(%rdi) ; SSE2-NEXT: .LBB9_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB9_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -2749,18 +2892,21 @@ ; SSE2-NEXT: .LBB9_28: # %else26 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB9_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movw %ax, 28(%rdi) ; SSE2-NEXT: .LBB9_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB9_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm2, %eax @@ -2774,18 +2920,23 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm8 ; SSE4-NEXT: pcmpeqd %xmm9, %xmm9 ; SSE4-NEXT: pxor %xmm8, %xmm9 +; SSE4-NEXT: movdqa %xmm9, %xmm8 +; SSE4-NEXT: packssdw %xmm0, %xmm8 +; SSE4-NEXT: packsswb %xmm0, %xmm8 +; SSE4-NEXT: pmovmskb %xmm8, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm8 = [65535,65535,65535,65535] ; SSE4-NEXT: pminud %xmm8, %xmm1 ; SSE4-NEXT: pminud %xmm8, %xmm0 ; SSE4-NEXT: packusdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm9, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB9_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB9_2: # %else -; SSE4-NEXT: pextrb $4, %xmm9, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB9_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -2794,14 +2945,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm4 +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB9_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB9_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB9_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -2810,14 +2966,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB9_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB9_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB9_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -2826,16 +2986,20 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB9_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB9_14: # %else12 ; SSE4-NEXT: pminud %xmm8, %xmm3 ; SSE4-NEXT: pminud %xmm8, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB9_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -2845,14 +3009,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB9_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrw $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB9_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB9_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrw $1, %xmm2, 18(%rdi) @@ -2861,14 +3030,19 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm6, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm0, %xmm1 +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB9_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrw $2, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB9_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB9_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrw $3, %xmm2, 22(%rdi) @@ -2877,14 +3051,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB9_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrw $4, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB9_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB9_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrw $5, %xmm2, 26(%rdi) @@ -2893,14 +3071,18 @@ ; SSE4-NEXT: pcmpeqd %xmm0, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE4-NEXT: pxor %xmm7, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB9_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrw $6, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB9_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm0 +; SSE4-NEXT: packsswb %xmm0, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB9_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrw $7, %xmm2, 30(%rdi) @@ -2909,34 +3091,34 @@ ; ; AVX1-LABEL: truncstore_v16i32_v16i16: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm6 +; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm6 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [65535,65535,65535,65535] -; AVX1-NEXT: vpminud %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpackusdw %xmm7, %xmm0, %xmm0 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [65535,65535,65535,65535] +; AVX1-NEXT: vpminud %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm0, %xmm0 +; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vpackusdw %xmm6, %xmm1, %xmm1 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB9_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB9_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB9_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -2947,8 +3129,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB9_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) @@ -2957,8 +3139,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB9_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -2970,16 +3152,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB9_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB9_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB9_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) @@ -2990,16 +3172,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB9_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB9_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB9_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -3010,8 +3192,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB9_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -3021,8 +3203,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB9_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -3034,8 +3216,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB9_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 @@ -3045,8 +3227,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB9_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 @@ -3059,8 +3241,8 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB9_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 @@ -3068,8 +3250,8 @@ ; AVX1-NEXT: .LBB9_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB9_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -3081,8 +3263,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB9_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -3090,8 +3272,8 @@ ; AVX1-NEXT: .LBB9_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB9_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 @@ -3104,111 +3286,117 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm7 = [65535,65535,65535,65535,65535,65535,65535,65535] -; AVX2-NEXT: vpminud %ymm7, %ymm1, %ymm1 -; AVX2-NEXT: vpminud %ymm7, %ymm0, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [65535,65535,65535,65535,65535,65535,65535,65535] +; AVX2-NEXT: vpminud %ymm5, %ymm1, %ymm1 +; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB9_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB9_2: # %else -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB9_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB9_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB9_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB9_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB9_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB9_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB9_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB9_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB9_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB9_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB9_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB9_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB9_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB9_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB9_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $0, %xmm4, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $0, %xmm2, 16(%rdi) ; AVX2-NEXT: .LBB9_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB9_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3216,22 +3404,25 @@ ; AVX2-NEXT: .LBB9_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB9_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 -; AVX2-NEXT: vpextrw $2, %xmm4, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpextrw $2, %xmm2, 20(%rdi) ; AVX2-NEXT: .LBB9_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB9_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3239,22 +3430,23 @@ ; AVX2-NEXT: .LBB9_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB9_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $4, %xmm2, 24(%rdi) ; AVX2-NEXT: .LBB9_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB9_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -3262,22 +3454,23 @@ ; AVX2-NEXT: .LBB9_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB9_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX2-NEXT: vpextrw $6, %xmm2, 28(%rdi) ; AVX2-NEXT: .LBB9_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB9_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -3438,8 +3631,14 @@ define void @truncstore_v16i32_v16i8(<16 x i32> %x, <16 x i8>* %p, <16 x i32> %mask) { ; SSE2-LABEL: truncstore_v16i32_v16i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm8, %xmm8 -; SSE2-NEXT: pcmpeqd %xmm4, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm9 +; SSE2-NEXT: pcmpeqd %xmm8, %xmm8 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: movdqa %xmm8, %xmm9 +; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: packsswb %xmm0, %xmm9 +; SSE2-NEXT: pmovmskb %xmm9, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [255,255,255,255] ; SSE2-NEXT: movdqa {{.*#+}} xmm11 = [2147483648,2147483648,2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm1, %xmm12 @@ -3472,58 +3671,63 @@ ; SSE2-NEXT: por %xmm2, %xmm9 ; SSE2-NEXT: packuswb %xmm1, %xmm9 ; SSE2-NEXT: packuswb %xmm9, %xmm12 -; SSE2-NEXT: movd %xmm8, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB10_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm12, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB10_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm8 -; SSE2-NEXT: pextrw $2, %xmm8, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm8 +; SSE2-NEXT: packsswb %xmm0, %xmm8 +; SSE2-NEXT: pmovmskb %xmm8, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB10_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm12, %eax ; SSE2-NEXT: movb %ah, 1(%rdi) ; SSE2-NEXT: .LBB10_4: # %else2 -; SSE2-NEXT: pxor %xmm1, %xmm1 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm4 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm4 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB10_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm12, %eax ; SSE2-NEXT: shrl $16, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB10_6: # %else4 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm4 -; SSE2-NEXT: pextrw $6, %xmm4, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB10_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm12, %eax ; SSE2-NEXT: shrl $24, %eax ; SSE2-NEXT: movb %al, 3(%rdi) ; SSE2-NEXT: .LBB10_8: # %else6 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm5, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB10_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm12, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB10_10: # %else8 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB10_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm12, %eax @@ -3531,37 +3735,44 @@ ; SSE2-NEXT: .LBB10_12: # %else10 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm5, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm5, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB10_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm12, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB10_14: # %else12 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm5 -; SSE2-NEXT: pextrw $6, %xmm5, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB10_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm12, %eax ; SSE2-NEXT: movb %ah, 7(%rdi) ; SSE2-NEXT: .LBB10_16: # %else14 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm6, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm6, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB10_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm12, %eax ; SSE2-NEXT: movb %al, 8(%rdi) ; SSE2-NEXT: .LBB10_18: # %else16 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB10_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm12, %eax @@ -3569,37 +3780,44 @@ ; SSE2-NEXT: .LBB10_20: # %else18 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm6 -; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm6, %xmm0 +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB10_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm12, %eax ; SSE2-NEXT: movb %al, 10(%rdi) ; SSE2-NEXT: .LBB10_22: # %else20 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm6 -; SSE2-NEXT: pextrw $6, %xmm6, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB10_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm12, %eax ; SSE2-NEXT: movb %ah, 11(%rdi) ; SSE2-NEXT: .LBB10_24: # %else22 -; SSE2-NEXT: pxor %xmm0, %xmm0 -; SSE2-NEXT: pcmpeqd %xmm7, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm1 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB10_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm12, %eax ; SSE2-NEXT: movb %al, 12(%rdi) ; SSE2-NEXT: .LBB10_26: # %else24 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB10_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm12, %eax @@ -3607,18 +3825,21 @@ ; SSE2-NEXT: .LBB10_28: # %else26 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm7 -; SSE2-NEXT: pxor %xmm7, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm7, %xmm0 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm1, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB10_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm12, %eax ; SSE2-NEXT: movb %al, 14(%rdi) ; SSE2-NEXT: .LBB10_30: # %else28 -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm7 -; SSE2-NEXT: pextrw $6, %xmm7, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB10_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm12, %eax @@ -3632,6 +3853,10 @@ ; SSE4-NEXT: pcmpeqd %xmm4, %xmm9 ; SSE4-NEXT: pcmpeqd %xmm8, %xmm8 ; SSE4-NEXT: pxor %xmm9, %xmm8 +; SSE4-NEXT: movdqa %xmm8, %xmm9 +; SSE4-NEXT: packssdw %xmm0, %xmm9 +; SSE4-NEXT: packsswb %xmm0, %xmm9 +; SSE4-NEXT: pmovmskb %xmm9, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm9 = [255,255,255,255] ; SSE4-NEXT: pminud %xmm9, %xmm1 ; SSE4-NEXT: pminud %xmm9, %xmm0 @@ -3640,14 +3865,15 @@ ; SSE4-NEXT: pminud %xmm9, %xmm2 ; SSE4-NEXT: packusdw %xmm3, %xmm2 ; SSE4-NEXT: packuswb %xmm2, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm8, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB10_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB10_2: # %else -; SSE4-NEXT: pextrb $4, %xmm8, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm8 +; SSE4-NEXT: packsswb %xmm0, %xmm8 +; SSE4-NEXT: pmovmskb %xmm8, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB10_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) @@ -3656,14 +3882,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm4 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB10_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB10_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB10_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) @@ -3672,14 +3903,18 @@ ; SSE4-NEXT: pcmpeqd %xmm5, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB10_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB10_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB10_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) @@ -3688,14 +3923,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm5, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB10_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB10_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB10_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) @@ -3704,14 +3943,19 @@ ; SSE4-NEXT: pcmpeqd %xmm6, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB10_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB10_18: # %else16 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB10_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) @@ -3720,14 +3964,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm6 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm6, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB10_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB10_22: # %else20 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB10_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) @@ -3736,14 +3985,18 @@ ; SSE4-NEXT: pcmpeqd %xmm7, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB10_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB10_26: # %else24 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB10_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) @@ -3752,14 +4005,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm7 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm7, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm2, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB10_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB10_30: # %else28 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm1, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB10_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -3768,34 +4025,34 @@ ; ; AVX1-LABEL: truncstore_v16i32_v16i8: ; AVX1: # %bb.0: -; AVX1-NEXT: vpxor %xmm8, %xmm8, %xmm8 -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm6 +; AVX1-NEXT: vpxor %xmm4, %xmm4, %xmm4 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm6 ; AVX1-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 ; AVX1-NEXT: vpxor %xmm5, %xmm6, %xmm6 ; AVX1-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 ; AVX1-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm7 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255] -; AVX1-NEXT: vpminud %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpackusdw %xmm7, %xmm0, %xmm0 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm7, %xmm7 -; AVX1-NEXT: vpminud %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpackusdw %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm6, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [255,255,255,255] +; AVX1-NEXT: vpminud %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm0, %xmm0 +; AVX1-NEXT: vpackusdw %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm6, %xmm6 +; AVX1-NEXT: vpminud %xmm7, %xmm1, %xmm1 +; AVX1-NEXT: vpackusdw %xmm6, %xmm1, %xmm1 ; AVX1-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm6, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB10_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB10_2: # %else -; AVX1-NEXT: vpcmpeqd %xmm8, %xmm2, %xmm1 +; AVX1-NEXT: vpcmpeqd %xmm4, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB10_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -3806,8 +4063,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 ; AVX1-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 ; AVX1-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX1-NEXT: vpextrb $2, %xmm5, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB10_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) @@ -3816,8 +4073,8 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB10_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -3829,16 +4086,16 @@ ; AVX1-NEXT: vpxor %xmm4, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm4 ; AVX1-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB10_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB10_10: # %else8 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB10_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -3849,16 +4106,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB10_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB10_14: # %else12 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB10_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -3869,8 +4126,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB10_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) @@ -3879,8 +4136,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB10_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -3891,8 +4148,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm4, %xmm4 ; AVX1-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 ; AVX1-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB10_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) @@ -3901,8 +4158,8 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB10_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -3914,16 +4171,16 @@ ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm3 ; AVX1-NEXT: vpacksswb %xmm3, %xmm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm3, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB10_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB10_26: # %else24 ; AVX1-NEXT: vpackssdw %xmm2, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB10_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -3934,16 +4191,16 @@ ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 ; AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB10_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB10_30: # %else28 ; AVX1-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 ; AVX1-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB10_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -3955,175 +4212,186 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm4, %xmm4, %xmm4 ; AVX2-NEXT: vpcmpeqd %ymm4, %ymm2, %ymm4 -; AVX2-NEXT: vpcmpeqd %xmm5, %xmm5, %xmm5 -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm6 -; AVX2-NEXT: vpackssdw %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpacksswb %xmm0, %xmm6, %xmm6 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm7 = [255,255,255,255,255,255,255,255] -; AVX2-NEXT: vpminud %ymm7, %ymm1, %ymm1 -; AVX2-NEXT: vpminud %ymm7, %ymm0, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm5, %ymm5, %ymm5 +; AVX2-NEXT: vpxor %ymm5, %ymm4, %ymm4 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm5 +; AVX2-NEXT: vpermq {{.*#+}} ymm5 = ymm5[0,2,2,3] +; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 +; AVX2-NEXT: vpmovmskb %xmm5, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255] +; AVX2-NEXT: vpminud %ymm5, %ymm1, %ymm1 +; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 ; AVX2-NEXT: vpackusdw %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 ; AVX2-NEXT: vpackuswb %xmm1, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm6, %eax ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB10_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB10_2: # %else -; AVX2-NEXT: vpxor %xmm5, %xmm4, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm4, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB10_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB10_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm5 -; AVX2-NEXT: vpackssdw %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpacksswb %xmm0, %xmm5, %xmm5 -; AVX2-NEXT: vpextrb $2, %xmm5, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB10_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB10_6: # %else4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB10_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB10_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 -; AVX2-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm4 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm4 +; AVX2-NEXT: vextracti128 $1, %ymm4, %xmm4 +; AVX2-NEXT: vpbroadcastw %xmm4, %ymm4 ; AVX2-NEXT: vpacksswb %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpextrb $4, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm4, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB10_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB10_10: # %else8 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 +; AVX2-NEXT: vpbroadcastd %xmm1, %ymm1 ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB10_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB10_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB10_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB10_14: # %else12 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm0, %ymm1, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,2,2,3] ; AVX2-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB10_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB10_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpmovzxwd {{.*#+}} ymm2 = xmm2[0],zero,xmm2[1],zero,xmm2[2],zero,xmm2[3],zero,xmm2[4],zero,xmm2[5],zero,xmm2[6],zero,xmm2[7],zero +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB10_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB10_18: # %else16 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB10_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB10_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm4 -; AVX2-NEXT: vpackssdw %xmm0, %xmm4, %xmm4 -; AVX2-NEXT: vpacksswb %xmm4, %xmm0, %xmm4 -; AVX2-NEXT: vpextrb $10, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vpermq {{.*#+}} ymm2 = ymm2[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 +; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB10_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB10_22: # %else20 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm0, %xmm1, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vpermq {{.*#+}} ymm1 = ymm1[0,1,1,3] +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB10_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB10_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB10_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB10_26: # %else24 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB10_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB10_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %ymm1, %ymm3, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm2 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm2 +; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 ; AVX2-NEXT: vpacksswb %xmm2, %xmm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB10_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB10_30: # %else28 -; AVX2-NEXT: vpackssdw %xmm1, %xmm0, %xmm1 +; AVX2-NEXT: vpackssdw %ymm1, %ymm0, %ymm1 +; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm1 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB10_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -4275,99 +4543,113 @@ define void @truncstore_v8i32_v8i16(<8 x i32> %x, <8 x i16>* %p, <8 x i32> %mask) { ; SSE2-LABEL: truncstore_v8i32_v8i16: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm10, %xmm10 -; SSE2-NEXT: pcmpeqd %xmm2, %xmm10 +; SSE2-NEXT: pxor %xmm5, %xmm5 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE2-NEXT: pcmpeqd %xmm9, %xmm9 -; SSE2-NEXT: pxor %xmm9, %xmm10 -; SSE2-NEXT: movdqa %xmm10, %xmm8 -; SSE2-NEXT: packssdw %xmm0, %xmm8 -; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: movdqa %xmm0, %xmm7 -; SSE2-NEXT: pxor %xmm6, %xmm7 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147549183,2147549183,2147549183,2147549183] -; SSE2-NEXT: movdqa %xmm4, %xmm5 -; SSE2-NEXT: pcmpgtd %xmm7, %xmm5 -; SSE2-NEXT: pand %xmm5, %xmm0 ; SSE2-NEXT: pxor %xmm9, %xmm5 -; SSE2-NEXT: por %xmm0, %xmm5 -; SSE2-NEXT: pxor %xmm1, %xmm6 -; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 -; SSE2-NEXT: pxor %xmm4, %xmm9 -; SSE2-NEXT: pand %xmm1, %xmm4 -; SSE2-NEXT: por %xmm9, %xmm4 -; SSE2-NEXT: pslld $16, %xmm4 -; SSE2-NEXT: psrad $16, %xmm4 -; SSE2-NEXT: pslld $16, %xmm5 -; SSE2-NEXT: psrad $16, %xmm5 -; SSE2-NEXT: packssdw %xmm4, %xmm5 -; SSE2-NEXT: movd %xmm8, %eax +; SSE2-NEXT: movdqa %xmm5, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648] +; SSE2-NEXT: movdqa %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm7, %xmm4 +; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [2147549183,2147549183,2147549183,2147549183] +; SSE2-NEXT: movdqa %xmm6, %xmm8 +; SSE2-NEXT: pcmpgtd %xmm4, %xmm8 +; SSE2-NEXT: pand %xmm8, %xmm0 +; SSE2-NEXT: pxor %xmm9, %xmm8 +; SSE2-NEXT: por %xmm0, %xmm8 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pcmpgtd %xmm7, %xmm6 +; SSE2-NEXT: pxor %xmm6, %xmm9 +; SSE2-NEXT: pand %xmm1, %xmm6 +; SSE2-NEXT: por %xmm9, %xmm6 +; SSE2-NEXT: pslld $16, %xmm6 +; SSE2-NEXT: psrad $16, %xmm6 +; SSE2-NEXT: pslld $16, %xmm8 +; SSE2-NEXT: psrad $16, %xmm8 +; SSE2-NEXT: packssdw %xmm6, %xmm8 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB11_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm5, %eax +; SSE2-NEXT: movd %xmm8, %eax ; SSE2-NEXT: movw %ax, (%rdi) ; SSE2-NEXT: .LBB11_2: # %else -; SSE2-NEXT: psrlq $16, %xmm10 -; SSE2-NEXT: movd %xmm10, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB11_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: pextrw $1, %xmm5, %eax +; SSE2-NEXT: pextrw $1, %xmm8, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) ; SSE2-NEXT: .LBB11_4: # %else2 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB11_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $2, %xmm5, %eax +; SSE2-NEXT: pextrw $2, %xmm8, %eax ; SSE2-NEXT: movw %ax, 4(%rdi) ; SSE2-NEXT: .LBB11_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB11_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 -; SSE2-NEXT: pextrw $3, %xmm5, %eax +; SSE2-NEXT: pextrw $3, %xmm8, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) ; SSE2-NEXT: .LBB11_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB11_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 -; SSE2-NEXT: pextrw $4, %xmm5, %eax +; SSE2-NEXT: pextrw $4, %xmm8, %eax ; SSE2-NEXT: movw %ax, 8(%rdi) ; SSE2-NEXT: .LBB11_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB11_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 -; SSE2-NEXT: pextrw $5, %xmm5, %eax +; SSE2-NEXT: pextrw $5, %xmm8, %eax ; SSE2-NEXT: movw %ax, 10(%rdi) ; SSE2-NEXT: .LBB11_12: # %else10 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm3, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB11_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 -; SSE2-NEXT: pextrw $6, %xmm5, %eax +; SSE2-NEXT: pextrw $6, %xmm8, %eax ; SSE2-NEXT: movw %ax, 12(%rdi) ; SSE2-NEXT: .LBB11_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB11_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 -; SSE2-NEXT: pextrw $7, %xmm5, %eax +; SSE2-NEXT: pextrw $7, %xmm8, %eax ; SSE2-NEXT: movw %ax, 14(%rdi) ; SSE2-NEXT: .LBB11_16: # %else14 ; SSE2-NEXT: retq @@ -4378,18 +4660,23 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] ; SSE4-NEXT: pminud %xmm5, %xmm1 ; SSE4-NEXT: pminud %xmm5, %xmm0 ; SSE4-NEXT: packusdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB11_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB11_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB11_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $1, %xmm0, 2(%rdi) @@ -4398,14 +4685,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB11_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrw $2, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB11_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB11_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrw $3, %xmm0, 6(%rdi) @@ -4414,14 +4706,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB11_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrw $4, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB11_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB11_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrw $5, %xmm0, 10(%rdi) @@ -4430,14 +4726,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB11_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrw $6, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB11_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB11_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrw $7, %xmm0, 14(%rdi) @@ -4450,12 +4750,12 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [65535,65535,65535,65535] -; AVX1-NEXT: vpminud %xmm6, %xmm5, %xmm5 -; AVX1-NEXT: vpminud %xmm6, %xmm0, %xmm0 -; AVX1-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [65535,65535,65535,65535] +; AVX1-NEXT: vpminud %xmm5, %xmm4, %xmm4 +; AVX1-NEXT: vpminud %xmm5, %xmm0, %xmm0 +; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB11_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -4463,8 +4763,8 @@ ; AVX1-NEXT: .LBB11_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB11_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $1, %xmm0, 2(%rdi) @@ -4473,16 +4773,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB11_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB11_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB11_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrw $3, %xmm0, 6(%rdi) @@ -4492,30 +4792,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB11_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB11_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB11_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB11_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB11_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrw $6, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB11_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB11_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrw $7, %xmm0, 14(%rdi) @@ -4527,76 +4831,72 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [65535,65535,65535,65535,65535,65535,65535,65535] -; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 -; AVX2-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm4, %eax +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [65535,65535,65535,65535,65535,65535,65535,65535] +; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB11_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) -; AVX2-NEXT: .LBB11_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: .LBB11_2: # %else +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB11_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $1, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB11_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB11_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrw $2, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB11_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB11_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrw $3, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB11_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB11_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrw $4, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB11_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB11_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrw $5, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB11_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB11_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB11_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB11_15 +; AVX2-NEXT: .LBB11_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB11_13: # %cond.store11 ; AVX2-NEXT: vpextrw $6, %xmm0, 12(%rdi) -; AVX2-NEXT: .LBB11_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB11_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB11_15: # %cond.store13 ; AVX2-NEXT: vpextrw $7, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB11_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -4707,38 +5007,39 @@ ; SSE2-NEXT: pcmpeqd %xmm2, %xmm4 ; SSE2-NEXT: pcmpeqd %xmm5, %xmm5 ; SSE2-NEXT: pxor %xmm4, %xmm5 -; SSE2-NEXT: movdqa %xmm5, %xmm9 -; SSE2-NEXT: packssdw %xmm0, %xmm9 +; SSE2-NEXT: movdqa %xmm5, %xmm4 +; SSE2-NEXT: packssdw %xmm0, %xmm4 +; SSE2-NEXT: packsswb %xmm0, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [255,255,255,255] ; SSE2-NEXT: movdqa {{.*#+}} xmm7 = [2147483648,2147483648,2147483648,2147483648] ; SSE2-NEXT: movdqa %xmm1, %xmm6 ; SSE2-NEXT: pxor %xmm7, %xmm6 -; SSE2-NEXT: movdqa {{.*#+}} xmm10 = [2147483903,2147483903,2147483903,2147483903] -; SSE2-NEXT: movdqa %xmm10, %xmm4 +; SSE2-NEXT: movdqa {{.*#+}} xmm9 = [2147483903,2147483903,2147483903,2147483903] +; SSE2-NEXT: movdqa %xmm9, %xmm4 ; SSE2-NEXT: pcmpgtd %xmm6, %xmm4 ; SSE2-NEXT: pand %xmm4, %xmm1 ; SSE2-NEXT: pandn %xmm8, %xmm4 ; SSE2-NEXT: por %xmm1, %xmm4 ; SSE2-NEXT: pxor %xmm0, %xmm7 -; SSE2-NEXT: pcmpgtd %xmm7, %xmm10 -; SSE2-NEXT: pand %xmm10, %xmm0 -; SSE2-NEXT: pandn %xmm8, %xmm10 -; SSE2-NEXT: por %xmm0, %xmm10 -; SSE2-NEXT: packuswb %xmm4, %xmm10 -; SSE2-NEXT: movd %xmm9, %eax +; SSE2-NEXT: pcmpgtd %xmm7, %xmm9 +; SSE2-NEXT: pand %xmm9, %xmm0 +; SSE2-NEXT: pandn %xmm8, %xmm9 +; SSE2-NEXT: por %xmm0, %xmm9 +; SSE2-NEXT: packuswb %xmm4, %xmm9 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB12_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm10, %eax +; SSE2-NEXT: movd %xmm9, %eax ; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB12_2: # %else -; SSE2-NEXT: psrlq $16, %xmm5 -; SSE2-NEXT: movd %xmm5, %eax -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm5 +; SSE2-NEXT: packsswb %xmm0, %xmm5 +; SSE2-NEXT: pmovmskb %xmm5, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB12_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 -; SSE2-NEXT: movd %xmm10, %eax +; SSE2-NEXT: movd %xmm9, %eax ; SSE2-NEXT: shrl $16, %eax ; SSE2-NEXT: movb %al, 1(%rdi) ; SSE2-NEXT: .LBB12_4: # %else2 @@ -4746,54 +5047,67 @@ ; SSE2-NEXT: pcmpeqd %xmm0, %xmm2 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm0, %xmm1 +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB12_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $2, %xmm10, %eax +; SSE2-NEXT: pextrw $2, %xmm9, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB12_6: # %else4 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB12_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 -; SSE2-NEXT: pextrw $3, %xmm10, %eax +; SSE2-NEXT: pextrw $3, %xmm9, %eax ; SSE2-NEXT: movb %al, 3(%rdi) ; SSE2-NEXT: .LBB12_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $0, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB12_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 -; SSE2-NEXT: pextrw $4, %xmm10, %eax +; SSE2-NEXT: pextrw $4, %xmm9, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB12_10: # %else8 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB12_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 -; SSE2-NEXT: pextrw $5, %xmm10, %eax +; SSE2-NEXT: pextrw $5, %xmm9, %eax ; SSE2-NEXT: movb %al, 5(%rdi) ; SSE2-NEXT: .LBB12_12: # %else10 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm3, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB12_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 -; SSE2-NEXT: pextrw $6, %xmm10, %eax +; SSE2-NEXT: pextrw $6, %xmm9, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB12_14: # %else12 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packssdw %xmm0, %xmm0 +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB12_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 -; SSE2-NEXT: pextrw $7, %xmm10, %eax +; SSE2-NEXT: pextrw $7, %xmm9, %eax ; SSE2-NEXT: movb %al, 7(%rdi) ; SSE2-NEXT: .LBB12_16: # %else14 ; SSE2-NEXT: retq @@ -4804,18 +5118,23 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm5 ; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 ; SSE4-NEXT: pxor %xmm5, %xmm4 +; SSE4-NEXT: movdqa %xmm4, %xmm5 +; SSE4-NEXT: packssdw %xmm0, %xmm5 +; SSE4-NEXT: packsswb %xmm0, %xmm5 +; SSE4-NEXT: pmovmskb %xmm5, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm5 = [255,255,255,255] ; SSE4-NEXT: pminud %xmm5, %xmm1 ; SSE4-NEXT: pminud %xmm5, %xmm0 ; SSE4-NEXT: packusdw %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm4, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB12_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB12_2: # %else -; SSE4-NEXT: pextrb $4, %xmm4, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm4 +; SSE4-NEXT: packsswb %xmm0, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB12_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -4824,14 +5143,19 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm1, %xmm2 +; SSE4-NEXT: packssdw %xmm0, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB12_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB12_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm0, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB12_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -4840,14 +5164,18 @@ ; SSE4-NEXT: pcmpeqd %xmm3, %xmm2 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm2, %xmm1 -; SSE4-NEXT: pextrb $0, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB12_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB12_10: # %else8 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB12_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -4856,14 +5184,18 @@ ; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 ; SSE4-NEXT: pxor %xmm3, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm2 +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB12_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB12_14: # %else12 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packssdw %xmm1, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB12_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -4876,12 +5208,12 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255] -; AVX1-NEXT: vpminud %xmm6, %xmm5, %xmm5 -; AVX1-NEXT: vpminud %xmm6, %xmm0, %xmm0 -; AVX1-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm4, %eax +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm5 = [255,255,255,255] +; AVX1-NEXT: vpminud %xmm5, %xmm4, %xmm4 +; AVX1-NEXT: vpminud %xmm5, %xmm0, %xmm0 +; AVX1-NEXT: vpackusdw %xmm4, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB12_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -4889,8 +5221,8 @@ ; AVX1-NEXT: .LBB12_2: # %else ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB12_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -4899,16 +5231,16 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB12_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB12_6: # %else4 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB12_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -4918,30 +5250,34 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm3 +; AVX1-NEXT: vmovmskps %ymm3, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB12_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB12_10: # %else8 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB12_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB12_12: # %else10 -; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm2 +; AVX1-NEXT: vmovmskps %ymm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB12_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB12_14: # %else12 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm1 +; AVX1-NEXT: vmovmskps %ymm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB12_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $14, %xmm0, 7(%rdi) @@ -4953,76 +5289,72 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm5 = [255,255,255,255,255,255,255,255] -; AVX2-NEXT: vpminud %ymm5, %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm5 -; AVX2-NEXT: vpackusdw %xmm5, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm4, %eax +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} ymm2 = [255,255,255,255,255,255,255,255] +; AVX2-NEXT: vpminud %ymm2, %ymm0, %ymm0 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackusdw %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB12_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB12_2: # %else -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB12_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $2, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB12_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm4 -; AVX2-NEXT: vpextrb $8, %xmm4, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB12_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB12_6: # %else4 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB12_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $6, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB12_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm2 -; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm2 -; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 -; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm2, %ymm2 +; AVX2-NEXT: vmovmskps %ymm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB12_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB12_10: # %else8 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB12_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $10, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB12_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqd %ymm2, %ymm1, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 -; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB12_14 -; AVX2-NEXT: # %bb.13: # %cond.store11 +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vmovmskps %ymm1, %eax +; AVX2-NEXT: testb $64, %al +; AVX2-NEXT: jne .LBB12_13 +; AVX2-NEXT: # %bb.14: # %else12 +; AVX2-NEXT: testb $-128, %al +; AVX2-NEXT: jne .LBB12_15 +; AVX2-NEXT: .LBB12_16: # %else14 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB12_13: # %cond.store11 ; AVX2-NEXT: vpextrb $12, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB12_14: # %else12 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB12_16 -; AVX2-NEXT: # %bb.15: # %cond.store13 +; AVX2-NEXT: .LBB12_15: # %cond.store13 ; AVX2-NEXT: vpextrb $14, %xmm0, 7(%rdi) -; AVX2-NEXT: .LBB12_16: # %else14 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -5130,68 +5462,66 @@ define void @truncstore_v4i32_v4i16(<4 x i32> %x, <4 x i16>* %p, <4 x i32> %mask) { ; SSE2-LABEL: truncstore_v4i32_v4i16: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: pxor %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] +; SSE2-NEXT: pxor %xmm0, %xmm3 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147549183,2147549183,2147549183,2147549183] -; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 +; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm0 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2 ; SSE2-NEXT: por %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB13_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movw %ax, (%rdi) +; SSE2-NEXT: movd %xmm2, %ecx +; SSE2-NEXT: movw %cx, (%rdi) ; SSE2-NEXT: .LBB13_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB13_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movw %ax, 2(%rdi) ; SSE2-NEXT: .LBB13_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB13_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: movw %ax, 4(%rdi) -; SSE2-NEXT: .LBB13_6: # %else4 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB13_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB13_7 +; SSE2-NEXT: .LBB13_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB13_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm2, %ecx +; SSE2-NEXT: movw %cx, 4(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB13_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB13_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movw %ax, 6(%rdi) -; SSE2-NEXT: .LBB13_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i16: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: pminud {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB13_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrw $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB13_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB13_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrw $2, %xmm0, 2(%rdi) @@ -5200,18 +5530,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB13_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB13_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB13_7 +; SSE4-NEXT: .LBB13_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB13_5: # %cond.store3 ; SSE4-NEXT: pextrw $4, %xmm0, 4(%rdi) -; SSE4-NEXT: .LBB13_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB13_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB13_7: # %cond.store5 ; SSE4-NEXT: pextrw $6, %xmm0, 6(%rdi) -; SSE4-NEXT: .LBB13_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i32_v4i16: @@ -5220,15 +5552,14 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vmovmskps %xmm2, %eax ; AVX1-NEXT: vpminud {{.*}}(%rip), %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB13_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB13_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB13_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -5237,18 +5568,20 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB13_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB13_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB13_7 +; AVX1-NEXT: .LBB13_8: # %else6 +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB13_5: # %cond.store3 ; AVX1-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX1-NEXT: .LBB13_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB13_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB13_7: # %cond.store5 ; AVX1-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX1-NEXT: .LBB13_8: # %else6 ; AVX1-NEXT: retq ; ; AVX2-LABEL: truncstore_v4i32_v4i16: @@ -5257,16 +5590,15 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [65535,65535,65535,65535] -; AVX2-NEXT: vpminud %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [65535,65535,65535,65535] +; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB13_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrw $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB13_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB13_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrw $2, %xmm0, 2(%rdi) @@ -5275,18 +5607,20 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB13_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB13_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB13_7 +; AVX2-NEXT: .LBB13_8: # %else6 +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB13_5: # %cond.store3 ; AVX2-NEXT: vpextrw $4, %xmm0, 4(%rdi) -; AVX2-NEXT: .LBB13_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB13_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB13_7: # %cond.store5 ; AVX2-NEXT: vpextrw $6, %xmm0, 6(%rdi) -; AVX2-NEXT: .LBB13_8: # %else6 ; AVX2-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i16: @@ -5358,68 +5692,66 @@ define void @truncstore_v4i32_v4i8(<4 x i32> %x, <4 x i8>* %p, <4 x i32> %mask) { ; SSE2-LABEL: truncstore_v4i32_v4i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [2147483648,2147483648,2147483648,2147483648] -; SSE2-NEXT: pxor %xmm0, %xmm4 +; SSE2-NEXT: pxor %xmm2, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm2, %xmm3 +; SSE2-NEXT: movmskps %xmm3, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [2147483648,2147483648,2147483648,2147483648] +; SSE2-NEXT: pxor %xmm0, %xmm3 ; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [2147483903,2147483903,2147483903,2147483903] -; SSE2-NEXT: pcmpgtd %xmm4, %xmm2 +; SSE2-NEXT: pcmpgtd %xmm3, %xmm2 ; SSE2-NEXT: pand %xmm2, %xmm0 ; SSE2-NEXT: pandn {{.*}}(%rip), %xmm2 ; SSE2-NEXT: por %xmm0, %xmm2 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: notl %eax ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB14_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm2, %eax -; SSE2-NEXT: movb %al, (%rdi) +; SSE2-NEXT: movd %xmm2, %ecx +; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB14_2: # %else -; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm3 -; SSE2-NEXT: pextrw $2, %xmm3, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB14_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: pextrw $2, %xmm2, %eax ; SSE2-NEXT: movb %al, 1(%rdi) ; SSE2-NEXT: .LBB14_4: # %else2 -; SSE2-NEXT: pxor %xmm3, %xmm3 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm1 -; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: testb $1, %al -; SSE2-NEXT: je .LBB14_6 -; SSE2-NEXT: # %bb.5: # %cond.store3 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: movb %al, 2(%rdi) -; SSE2-NEXT: .LBB14_6: # %else4 +; SSE2-NEXT: pxor %xmm0, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 -; SSE2-NEXT: pxor %xmm0, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: pxor %xmm1, %xmm0 +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $4, %al +; SSE2-NEXT: jne .LBB14_5 +; SSE2-NEXT: # %bb.6: # %else4 +; SSE2-NEXT: testb $8, %al +; SSE2-NEXT: jne .LBB14_7 +; SSE2-NEXT: .LBB14_8: # %else6 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB14_5: # %cond.store3 +; SSE2-NEXT: pextrw $4, %xmm2, %ecx +; SSE2-NEXT: movb %cl, 2(%rdi) +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB14_8 -; SSE2-NEXT: # %bb.7: # %cond.store5 +; SSE2-NEXT: .LBB14_7: # %cond.store5 ; SSE2-NEXT: pextrw $6, %xmm2, %eax ; SSE2-NEXT: movb %al, 3(%rdi) -; SSE2-NEXT: .LBB14_8: # %else6 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v4i32_v4i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm3, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm1, %xmm3 -; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 -; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: pxor %xmm2, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm2 +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm2, %xmm3 +; SSE4-NEXT: movmskps %xmm3, %eax ; SSE4-NEXT: pminud {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB14_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB14_2: # %else -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB14_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $4, %xmm0, 1(%rdi) @@ -5428,18 +5760,20 @@ ; SSE4-NEXT: pcmpeqd %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB14_6 -; SSE4-NEXT: # %bb.5: # %cond.store3 +; SSE4-NEXT: movmskps %xmm2, %eax +; SSE4-NEXT: testb $4, %al +; SSE4-NEXT: jne .LBB14_5 +; SSE4-NEXT: # %bb.6: # %else4 +; SSE4-NEXT: testb $8, %al +; SSE4-NEXT: jne .LBB14_7 +; SSE4-NEXT: .LBB14_8: # %else6 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB14_5: # %cond.store3 ; SSE4-NEXT: pextrb $8, %xmm0, 2(%rdi) -; SSE4-NEXT: .LBB14_6: # %else4 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB14_8 -; SSE4-NEXT: # %bb.7: # %cond.store5 +; SSE4-NEXT: .LBB14_7: # %cond.store5 ; SSE4-NEXT: pextrb $12, %xmm0, 3(%rdi) -; SSE4-NEXT: .LBB14_8: # %else6 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v4i32_v4i8: @@ -5448,15 +5782,14 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vmovmskps %xmm2, %eax ; AVX1-NEXT: vpminud {{.*}}(%rip), %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB14_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB14_2: # %else -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB14_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -5465,18 +5798,20 @@ ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $8, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB14_6 -; AVX1-NEXT: # %bb.5: # %cond.store3 +; AVX1-NEXT: vmovmskps %xmm1, %eax +; AVX1-NEXT: testb $4, %al +; AVX1-NEXT: jne .LBB14_5 +; AVX1-NEXT: # %bb.6: # %else4 +; AVX1-NEXT: testb $8, %al +; AVX1-NEXT: jne .LBB14_7 +; AVX1-NEXT: .LBB14_8: # %else6 +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB14_5: # %cond.store3 ; AVX1-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX1-NEXT: .LBB14_6: # %else4 -; AVX1-NEXT: vpextrb $12, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB14_8 -; AVX1-NEXT: # %bb.7: # %cond.store5 +; AVX1-NEXT: .LBB14_7: # %cond.store5 ; AVX1-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX1-NEXT: .LBB14_8: # %else6 ; AVX1-NEXT: retq ; ; AVX2-LABEL: truncstore_v4i32_v4i8: @@ -5485,16 +5820,15 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm2 ; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm3 = [255,255,255,255] -; AVX2-NEXT: vpminud %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax +; AVX2-NEXT: vmovmskps %xmm2, %eax +; AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [255,255,255,255] +; AVX2-NEXT: vpminud %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB14_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB14_2: # %else -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB14_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $4, %xmm0, 1(%rdi) @@ -5503,18 +5837,20 @@ ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB14_6 -; AVX2-NEXT: # %bb.5: # %cond.store3 +; AVX2-NEXT: vmovmskps %xmm1, %eax +; AVX2-NEXT: testb $4, %al +; AVX2-NEXT: jne .LBB14_5 +; AVX2-NEXT: # %bb.6: # %else4 +; AVX2-NEXT: testb $8, %al +; AVX2-NEXT: jne .LBB14_7 +; AVX2-NEXT: .LBB14_8: # %else6 +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB14_5: # %cond.store3 ; AVX2-NEXT: vpextrb $8, %xmm0, 2(%rdi) -; AVX2-NEXT: .LBB14_6: # %else4 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB14_8 -; AVX2-NEXT: # %bb.7: # %cond.store5 +; AVX2-NEXT: .LBB14_7: # %cond.store5 ; AVX2-NEXT: vpextrb $12, %xmm0, 3(%rdi) -; AVX2-NEXT: .LBB14_8: # %else6 ; AVX2-NEXT: retq ; ; AVX512F-LABEL: truncstore_v4i32_v4i8: @@ -5586,8 +5922,11 @@ define void @truncstore_v32i16_v32i8(<32 x i16> %x, <32 x i8>* %p, <32 x i8> %mask) { ; SSE2-LABEL: truncstore_v32i16_v32i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm7, %xmm7 -; SSE2-NEXT: pcmpeqb %xmm4, %xmm7 +; SSE2-NEXT: pxor %xmm6, %xmm6 +; SSE2-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm6, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax ; SSE2-NEXT: movdqa {{.*#+}} xmm6 = [32768,32768,32768,32768,32768,32768,32768,32768] ; SSE2-NEXT: pxor %xmm6, %xmm1 ; SSE2-NEXT: movdqa {{.*#+}} xmm8 = [33023,33023,33023,33023,33023,33023,33023,33023] @@ -5597,18 +5936,13 @@ ; SSE2-NEXT: pminsw %xmm8, %xmm0 ; SSE2-NEXT: pxor %xmm6, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm7, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB15_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB15_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB15_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -5616,20 +5950,17 @@ ; SSE2-NEXT: .LBB15_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB15_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB15_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB15_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -5638,18 +5969,16 @@ ; SSE2-NEXT: .LBB15_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB15_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB15_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB15_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -5657,18 +5986,16 @@ ; SSE2-NEXT: .LBB15_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB15_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB15_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB15_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -5676,18 +6003,16 @@ ; SSE2-NEXT: .LBB15_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB15_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB15_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB15_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -5695,18 +6020,16 @@ ; SSE2-NEXT: .LBB15_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB15_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB15_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB15_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -5714,10 +6037,10 @@ ; SSE2-NEXT: .LBB15_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE2-NEXT: pxor %xmm1, %xmm7 +; SSE2-NEXT: pmovmskb %xmm7, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB15_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx @@ -5725,9 +6048,7 @@ ; SSE2-NEXT: .LBB15_26: # %else24 ; SSE2-NEXT: pxor %xmm6, %xmm3 ; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB15_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -5737,10 +6058,10 @@ ; SSE2-NEXT: pminsw %xmm8, %xmm2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE2-NEXT: pextrw $7, %xmm4, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm4, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE2-NEXT: je .LBB15_30 ; SSE2-NEXT: # %bb.29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx @@ -5748,9 +6069,7 @@ ; SSE2-NEXT: .LBB15_30: # %else28 ; SSE2-NEXT: pxor %xmm6, %xmm3 ; SSE2-NEXT: pxor %xmm6, %xmm2 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB15_32 ; SSE2-NEXT: # %bb.31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -5759,18 +6078,17 @@ ; SSE2-NEXT: packuswb %xmm3, %xmm2 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE2-NEXT: je .LBB15_34 ; SSE2-NEXT: # %bb.33: # %cond.store31 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: movb %cl, 16(%rdi) ; SSE2-NEXT: .LBB15_34: # %else32 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE2-NEXT: je .LBB15_36 ; SSE2-NEXT: # %bb.35: # %cond.store33 ; SSE2-NEXT: movd %xmm2, %eax @@ -5778,20 +6096,18 @@ ; SSE2-NEXT: .LBB15_36: # %else34 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE2-NEXT: je .LBB15_38 ; SSE2-NEXT: # %bb.37: # %cond.store35 ; SSE2-NEXT: movd %xmm2, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 18(%rdi) -; SSE2-NEXT: .LBB15_38: # %else36 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: .LBB15_38: # %else36 +; SSE2-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE2-NEXT: je .LBB15_40 ; SSE2-NEXT: # %bb.39: # %cond.store37 ; SSE2-NEXT: movd %xmm2, %eax @@ -5800,18 +6116,17 @@ ; SSE2-NEXT: .LBB15_40: # %else38 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $2, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE2-NEXT: je .LBB15_42 ; SSE2-NEXT: # %bb.41: # %cond.store39 ; SSE2-NEXT: pextrw $2, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 20(%rdi) ; SSE2-NEXT: .LBB15_42: # %else40 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE2-NEXT: je .LBB15_44 ; SSE2-NEXT: # %bb.43: # %cond.store41 ; SSE2-NEXT: pextrw $2, %xmm2, %eax @@ -5819,18 +6134,17 @@ ; SSE2-NEXT: .LBB15_44: # %else42 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $3, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE2-NEXT: je .LBB15_46 ; SSE2-NEXT: # %bb.45: # %cond.store43 ; SSE2-NEXT: pextrw $3, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 22(%rdi) ; SSE2-NEXT: .LBB15_46: # %else44 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE2-NEXT: je .LBB15_48 ; SSE2-NEXT: # %bb.47: # %cond.store45 ; SSE2-NEXT: pextrw $3, %xmm2, %eax @@ -5838,18 +6152,17 @@ ; SSE2-NEXT: .LBB15_48: # %else46 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE2-NEXT: je .LBB15_50 ; SSE2-NEXT: # %bb.49: # %cond.store47 ; SSE2-NEXT: pextrw $4, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 24(%rdi) ; SSE2-NEXT: .LBB15_50: # %else48 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE2-NEXT: je .LBB15_52 ; SSE2-NEXT: # %bb.51: # %cond.store49 ; SSE2-NEXT: pextrw $4, %xmm2, %eax @@ -5857,18 +6170,17 @@ ; SSE2-NEXT: .LBB15_52: # %else50 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $5, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE2-NEXT: je .LBB15_54 ; SSE2-NEXT: # %bb.53: # %cond.store51 ; SSE2-NEXT: pextrw $5, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 26(%rdi) ; SSE2-NEXT: .LBB15_54: # %else52 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE2-NEXT: je .LBB15_56 ; SSE2-NEXT: # %bb.55: # %cond.store53 ; SSE2-NEXT: pextrw $5, %xmm2, %eax @@ -5876,18 +6188,17 @@ ; SSE2-NEXT: .LBB15_56: # %else54 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE2-NEXT: je .LBB15_58 ; SSE2-NEXT: # %bb.57: # %cond.store55 ; SSE2-NEXT: pextrw $6, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 28(%rdi) ; SSE2-NEXT: .LBB15_58: # %else56 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE2-NEXT: je .LBB15_60 ; SSE2-NEXT: # %bb.59: # %cond.store57 ; SSE2-NEXT: pextrw $6, %xmm2, %eax @@ -5895,157 +6206,151 @@ ; SSE2-NEXT: .LBB15_60: # %else58 ; SSE2-NEXT: pxor %xmm0, %xmm0 ; SSE2-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE2-NEXT: pextrw $7, %xmm5, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB15_62 -; SSE2-NEXT: # %bb.61: # %cond.store59 +; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE2-NEXT: pxor %xmm5, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: shll $16, %eax +; SSE2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE2-NEXT: jne .LBB15_61 +; SSE2-NEXT: # %bb.62: # %else60 +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE2-NEXT: jne .LBB15_63 +; SSE2-NEXT: .LBB15_64: # %else62 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB15_61: # %cond.store59 ; SSE2-NEXT: pextrw $7, %xmm2, %ecx ; SSE2-NEXT: movb %cl, 30(%rdi) -; SSE2-NEXT: .LBB15_62: # %else60 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE2-NEXT: je .LBB15_64 -; SSE2-NEXT: # %bb.63: # %cond.store61 +; SSE2-NEXT: .LBB15_63: # %cond.store61 ; SSE2-NEXT: pextrw $7, %xmm2, %eax ; SSE2-NEXT: movb %ah, 31(%rdi) -; SSE2-NEXT: .LBB15_64: # %else62 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v32i16_v32i8: ; SSE4: # %bb.0: -; SSE4-NEXT: pxor %xmm7, %xmm7 -; SSE4-NEXT: pcmpeqb %xmm4, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm6 +; SSE4-NEXT: pcmpeqb %xmm4, %xmm6 +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm6, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax ; SSE4-NEXT: movdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] ; SSE4-NEXT: pminuw %xmm6, %xmm1 ; SSE4-NEXT: pminuw %xmm6, %xmm0 ; SSE4-NEXT: packuswb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm7, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB15_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB15_2: # %else -; SSE4-NEXT: pextrb $1, %xmm7, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB15_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB15_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB15_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB15_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB15_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB15_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB15_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB15_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB15_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB15_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB15_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB15_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB15_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB15_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB15_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB15_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB15_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB15_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB15_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB15_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB15_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB15_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm4, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm7, %xmm7 +; SSE4-NEXT: pxor %xmm1, %xmm7 +; SSE4-NEXT: pmovmskb %xmm7, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB15_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB15_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB15_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB15_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm4 -; SSE4-NEXT: pextrb $14, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm4, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 ; SSE4-NEXT: je .LBB15_30 ; SSE4-NEXT: # %bb.29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) ; SSE4-NEXT: .LBB15_30: # %else28 ; SSE4-NEXT: pminuw %xmm6, %xmm3 ; SSE4-NEXT: pminuw %xmm6, %xmm2 -; SSE4-NEXT: pextrb $15, %xmm4, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB15_32 ; SSE4-NEXT: # %bb.31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) @@ -6053,132 +6358,135 @@ ; SSE4-NEXT: packuswb %xmm3, %xmm2 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $65536, %eax # imm = 0x10000 ; SSE4-NEXT: je .LBB15_34 ; SSE4-NEXT: # %bb.33: # %cond.store31 ; SSE4-NEXT: pextrb $0, %xmm2, 16(%rdi) ; SSE4-NEXT: .LBB15_34: # %else32 -; SSE4-NEXT: pextrb $1, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $131072, %eax # imm = 0x20000 ; SSE4-NEXT: je .LBB15_36 ; SSE4-NEXT: # %bb.35: # %cond.store33 ; SSE4-NEXT: pextrb $1, %xmm2, 17(%rdi) ; SSE4-NEXT: .LBB15_36: # %else34 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $2, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $262144, %eax # imm = 0x40000 ; SSE4-NEXT: je .LBB15_38 ; SSE4-NEXT: # %bb.37: # %cond.store35 ; SSE4-NEXT: pextrb $2, %xmm2, 18(%rdi) ; SSE4-NEXT: .LBB15_38: # %else36 -; SSE4-NEXT: pextrb $3, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $524288, %eax # imm = 0x80000 ; SSE4-NEXT: je .LBB15_40 ; SSE4-NEXT: # %bb.39: # %cond.store37 ; SSE4-NEXT: pextrb $3, %xmm2, 19(%rdi) ; SSE4-NEXT: .LBB15_40: # %else38 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $4, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1048576, %eax # imm = 0x100000 ; SSE4-NEXT: je .LBB15_42 ; SSE4-NEXT: # %bb.41: # %cond.store39 ; SSE4-NEXT: pextrb $4, %xmm2, 20(%rdi) ; SSE4-NEXT: .LBB15_42: # %else40 -; SSE4-NEXT: pextrb $5, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2097152, %eax # imm = 0x200000 ; SSE4-NEXT: je .LBB15_44 ; SSE4-NEXT: # %bb.43: # %cond.store41 ; SSE4-NEXT: pextrb $5, %xmm2, 21(%rdi) ; SSE4-NEXT: .LBB15_44: # %else42 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $6, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $4194304, %eax # imm = 0x400000 ; SSE4-NEXT: je .LBB15_46 ; SSE4-NEXT: # %bb.45: # %cond.store43 ; SSE4-NEXT: pextrb $6, %xmm2, 22(%rdi) ; SSE4-NEXT: .LBB15_46: # %else44 -; SSE4-NEXT: pextrb $7, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8388608, %eax # imm = 0x800000 ; SSE4-NEXT: je .LBB15_48 ; SSE4-NEXT: # %bb.47: # %cond.store45 ; SSE4-NEXT: pextrb $7, %xmm2, 23(%rdi) ; SSE4-NEXT: .LBB15_48: # %else46 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $8, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $16777216, %eax # imm = 0x1000000 ; SSE4-NEXT: je .LBB15_50 ; SSE4-NEXT: # %bb.49: # %cond.store47 ; SSE4-NEXT: pextrb $8, %xmm2, 24(%rdi) ; SSE4-NEXT: .LBB15_50: # %else48 -; SSE4-NEXT: pextrb $9, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $33554432, %eax # imm = 0x2000000 ; SSE4-NEXT: je .LBB15_52 ; SSE4-NEXT: # %bb.51: # %cond.store49 ; SSE4-NEXT: pextrb $9, %xmm2, 25(%rdi) ; SSE4-NEXT: .LBB15_52: # %else50 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $10, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $67108864, %eax # imm = 0x4000000 ; SSE4-NEXT: je .LBB15_54 ; SSE4-NEXT: # %bb.53: # %cond.store51 ; SSE4-NEXT: pextrb $10, %xmm2, 26(%rdi) ; SSE4-NEXT: .LBB15_54: # %else52 -; SSE4-NEXT: pextrb $11, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $134217728, %eax # imm = 0x8000000 ; SSE4-NEXT: je .LBB15_56 ; SSE4-NEXT: # %bb.55: # %cond.store53 ; SSE4-NEXT: pextrb $11, %xmm2, 27(%rdi) ; SSE4-NEXT: .LBB15_56: # %else54 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm5, %xmm0 -; SSE4-NEXT: pextrb $12, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $268435456, %eax # imm = 0x10000000 ; SSE4-NEXT: je .LBB15_58 ; SSE4-NEXT: # %bb.57: # %cond.store55 ; SSE4-NEXT: pextrb $12, %xmm2, 28(%rdi) ; SSE4-NEXT: .LBB15_58: # %else56 -; SSE4-NEXT: pextrb $13, %xmm0, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $536870912, %eax # imm = 0x20000000 ; SSE4-NEXT: je .LBB15_60 ; SSE4-NEXT: # %bb.59: # %cond.store57 ; SSE4-NEXT: pextrb $13, %xmm2, 29(%rdi) ; SSE4-NEXT: .LBB15_60: # %else58 ; SSE4-NEXT: pxor %xmm0, %xmm0 ; SSE4-NEXT: pcmpeqb %xmm0, %xmm5 -; SSE4-NEXT: pextrb $14, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB15_62 -; SSE4-NEXT: # %bb.61: # %cond.store59 +; SSE4-NEXT: pcmpeqd %xmm0, %xmm0 +; SSE4-NEXT: pxor %xmm5, %xmm0 +; SSE4-NEXT: pmovmskb %xmm0, %eax +; SSE4-NEXT: shll $16, %eax +; SSE4-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; SSE4-NEXT: jne .LBB15_61 +; SSE4-NEXT: # %bb.62: # %else60 +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; SSE4-NEXT: jne .LBB15_63 +; SSE4-NEXT: .LBB15_64: # %else62 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB15_61: # %cond.store59 ; SSE4-NEXT: pextrb $14, %xmm2, 30(%rdi) -; SSE4-NEXT: .LBB15_62: # %else60 -; SSE4-NEXT: pextrb $15, %xmm5, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; SSE4-NEXT: je .LBB15_64 -; SSE4-NEXT: # %bb.63: # %cond.store61 +; SSE4-NEXT: .LBB15_63: # %cond.store61 ; SSE4-NEXT: pextrb $15, %xmm2, 31(%rdi) -; SSE4-NEXT: .LBB15_64: # %else62 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v32i16_v32i8: @@ -6187,17 +6495,17 @@ ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm5 ; AVX1-NEXT: vpcmpeqd %xmm4, %xmm4, %xmm4 ; AVX1-NEXT: vpxor %xmm4, %xmm5, %xmm5 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm6 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm7 = [255,255,255,255,255,255,255,255] -; AVX1-NEXT: vpminuw %xmm7, %xmm6, %xmm6 -; AVX1-NEXT: vpminuw %xmm7, %xmm0, %xmm0 -; AVX1-NEXT: vpackuswb %xmm6, %xmm0, %xmm0 -; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm6 -; AVX1-NEXT: vpminuw %xmm7, %xmm6, %xmm6 -; AVX1-NEXT: vpminuw %xmm7, %xmm1, %xmm1 -; AVX1-NEXT: vpackuswb %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm5, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm5 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm6 = [255,255,255,255,255,255,255,255] +; AVX1-NEXT: vpminuw %xmm6, %xmm5, %xmm5 +; AVX1-NEXT: vpminuw %xmm6, %xmm0, %xmm0 +; AVX1-NEXT: vpackuswb %xmm5, %xmm0, %xmm0 +; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 +; AVX1-NEXT: vpminuw %xmm6, %xmm5, %xmm5 +; AVX1-NEXT: vpminuw %xmm6, %xmm1, %xmm1 +; AVX1-NEXT: vpackuswb %xmm5, %xmm1, %xmm1 ; AVX1-NEXT: vinsertf128 $1, %xmm1, %ymm0, %ymm0 -; AVX1-NEXT: vpextrb $0, %xmm5, %eax ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB15_2 ; AVX1-NEXT: # %bb.1: # %cond.store @@ -6205,8 +6513,8 @@ ; AVX1-NEXT: .LBB15_2: # %else ; AVX1-NEXT: vpcmpeqb %xmm3, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm4, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $1, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB15_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -6215,16 +6523,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $2, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB15_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB15_6: # %else4 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $3, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB15_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -6233,16 +6541,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $4, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB15_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB15_10: # %else8 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $5, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB15_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -6251,16 +6559,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $6, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB15_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB15_14: # %else12 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $7, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB15_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -6269,16 +6577,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $8, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB15_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB15_18: # %else16 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $9, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB15_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -6287,16 +6595,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $10, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB15_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB15_22: # %else20 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $11, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB15_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -6305,16 +6613,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $12, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB15_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB15_26: # %else24 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $13, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB15_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -6323,16 +6631,16 @@ ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm4 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm4, %xmm4 -; AVX1-NEXT: vpextrb $14, %xmm4, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm4, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX1-NEXT: je .LBB15_30 ; AVX1-NEXT: # %bb.29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX1-NEXT: .LBB15_30: # %else28 ; AVX1-NEXT: vpcmpeqb %xmm1, %xmm2, %xmm1 ; AVX1-NEXT: vpxor %xmm3, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB15_32 ; AVX1-NEXT: # %bb.31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -6342,15 +6650,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX1-NEXT: je .LBB15_34 ; AVX1-NEXT: # %bb.33: # %cond.store31 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $0, %xmm2, 16(%rdi) ; AVX1-NEXT: .LBB15_34: # %else32 -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX1-NEXT: je .LBB15_36 ; AVX1-NEXT: # %bb.35: # %cond.store33 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6360,15 +6668,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX1-NEXT: je .LBB15_38 ; AVX1-NEXT: # %bb.37: # %cond.store35 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $2, %xmm2, 18(%rdi) ; AVX1-NEXT: .LBB15_38: # %else36 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX1-NEXT: je .LBB15_40 ; AVX1-NEXT: # %bb.39: # %cond.store37 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6378,15 +6686,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX1-NEXT: je .LBB15_42 ; AVX1-NEXT: # %bb.41: # %cond.store39 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $4, %xmm2, 20(%rdi) ; AVX1-NEXT: .LBB15_42: # %else40 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX1-NEXT: je .LBB15_44 ; AVX1-NEXT: # %bb.43: # %cond.store41 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6396,15 +6704,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX1-NEXT: je .LBB15_46 ; AVX1-NEXT: # %bb.45: # %cond.store43 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $6, %xmm2, 22(%rdi) ; AVX1-NEXT: .LBB15_46: # %else44 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX1-NEXT: je .LBB15_48 ; AVX1-NEXT: # %bb.47: # %cond.store45 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6414,15 +6722,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX1-NEXT: je .LBB15_50 ; AVX1-NEXT: # %bb.49: # %cond.store47 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $8, %xmm2, 24(%rdi) ; AVX1-NEXT: .LBB15_50: # %else48 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX1-NEXT: je .LBB15_52 ; AVX1-NEXT: # %bb.51: # %cond.store49 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6432,15 +6740,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX1-NEXT: je .LBB15_54 ; AVX1-NEXT: # %bb.53: # %cond.store51 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $10, %xmm2, 26(%rdi) ; AVX1-NEXT: .LBB15_54: # %else52 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX1-NEXT: je .LBB15_56 ; AVX1-NEXT: # %bb.55: # %cond.store53 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6450,15 +6758,15 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX1-NEXT: je .LBB15_58 ; AVX1-NEXT: # %bb.57: # %cond.store55 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vpextrb $12, %xmm2, 28(%rdi) ; AVX1-NEXT: .LBB15_58: # %else56 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX1-NEXT: je .LBB15_60 ; AVX1-NEXT: # %bb.59: # %cond.store57 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 @@ -6468,20 +6776,24 @@ ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB15_62 -; AVX1-NEXT: # %bb.61: # %cond.store59 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 -; AVX1-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX1-NEXT: .LBB15_62: # %else60 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: shll $16, %eax +; AVX1-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX1-NEXT: jne .LBB15_61 +; AVX1-NEXT: # %bb.62: # %else60 +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX1-NEXT: jne .LBB15_63 +; AVX1-NEXT: .LBB15_64: # %else62 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB15_61: # %cond.store59 +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm1 +; AVX1-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX1-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX1-NEXT: je .LBB15_64 -; AVX1-NEXT: # %bb.63: # %cond.store61 +; AVX1-NEXT: .LBB15_63: # %cond.store61 ; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm0 ; AVX1-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX1-NEXT: .LBB15_64: # %else62 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -6489,151 +6801,141 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm3, %xmm3, %xmm3 ; AVX2-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 -; AVX2-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] -; AVX2-NEXT: vpminuw %ymm4, %ymm1, %ymm1 -; AVX2-NEXT: vpminuw %ymm4, %ymm0, %ymm0 +; AVX2-NEXT: vpcmpeqd %ymm4, %ymm4, %ymm4 +; AVX2-NEXT: vpxor %ymm4, %ymm3, %ymm3 +; AVX2-NEXT: vpmovmskb %ymm3, %eax +; AVX2-NEXT: vmovdqa {{.*#+}} ymm3 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] +; AVX2-NEXT: vpminuw %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpminuw %ymm3, %ymm0, %ymm0 ; AVX2-NEXT: vpackuswb %ymm1, %ymm0, %ymm0 ; AVX2-NEXT: vpermq {{.*#+}} ymm0 = ymm0[0,2,1,3] -; AVX2-NEXT: vpextrb $0, %xmm3, %eax -; AVX2-NEXT: notb %al ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB15_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB15_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm3, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB15_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB15_4: # %else2 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB15_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB15_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB15_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB15_8: # %else6 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB15_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB15_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB15_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB15_12: # %else10 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB15_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB15_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB15_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB15_16: # %else14 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB15_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB15_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB15_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB15_20: # %else18 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB15_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB15_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB15_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB15_24: # %else22 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB15_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB15_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB15_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB15_28: # %else26 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX2-NEXT: je .LBB15_30 ; AVX2-NEXT: # %bb.29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX2-NEXT: .LBB15_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB15_32 ; AVX2-NEXT: # %bb.31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX2-NEXT: .LBB15_32: # %else30 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $0, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX2-NEXT: je .LBB15_34 ; AVX2-NEXT: # %bb.33: # %cond.store31 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $0, %xmm3, 16(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $0, %xmm1, 16(%rdi) ; AVX2-NEXT: .LBB15_34: # %else32 -; AVX2-NEXT: vpextrb $1, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX2-NEXT: je .LBB15_36 ; AVX2-NEXT: # %bb.35: # %cond.store33 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6641,18 +6943,16 @@ ; AVX2-NEXT: .LBB15_36: # %else34 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $2, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX2-NEXT: je .LBB15_38 ; AVX2-NEXT: # %bb.37: # %cond.store35 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $2, %xmm3, 18(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $2, %xmm1, 18(%rdi) ; AVX2-NEXT: .LBB15_38: # %else36 -; AVX2-NEXT: vpextrb $3, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX2-NEXT: je .LBB15_40 ; AVX2-NEXT: # %bb.39: # %cond.store37 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6660,18 +6960,16 @@ ; AVX2-NEXT: .LBB15_40: # %else38 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $4, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX2-NEXT: je .LBB15_42 ; AVX2-NEXT: # %bb.41: # %cond.store39 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $4, %xmm3, 20(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $4, %xmm1, 20(%rdi) ; AVX2-NEXT: .LBB15_42: # %else40 -; AVX2-NEXT: vpextrb $5, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX2-NEXT: je .LBB15_44 ; AVX2-NEXT: # %bb.43: # %cond.store41 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6679,18 +6977,16 @@ ; AVX2-NEXT: .LBB15_44: # %else42 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $6, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX2-NEXT: je .LBB15_46 ; AVX2-NEXT: # %bb.45: # %cond.store43 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $6, %xmm3, 22(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $6, %xmm1, 22(%rdi) ; AVX2-NEXT: .LBB15_46: # %else44 -; AVX2-NEXT: vpextrb $7, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX2-NEXT: je .LBB15_48 ; AVX2-NEXT: # %bb.47: # %cond.store45 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6698,18 +6994,16 @@ ; AVX2-NEXT: .LBB15_48: # %else46 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $8, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX2-NEXT: je .LBB15_50 ; AVX2-NEXT: # %bb.49: # %cond.store47 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $8, %xmm3, 24(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $8, %xmm1, 24(%rdi) ; AVX2-NEXT: .LBB15_50: # %else48 -; AVX2-NEXT: vpextrb $9, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX2-NEXT: je .LBB15_52 ; AVX2-NEXT: # %bb.51: # %cond.store49 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6717,18 +7011,16 @@ ; AVX2-NEXT: .LBB15_52: # %else50 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $10, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX2-NEXT: je .LBB15_54 ; AVX2-NEXT: # %bb.53: # %cond.store51 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $10, %xmm3, 26(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $10, %xmm1, 26(%rdi) ; AVX2-NEXT: .LBB15_54: # %else52 -; AVX2-NEXT: vpextrb $11, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX2-NEXT: je .LBB15_56 ; AVX2-NEXT: # %bb.55: # %cond.store53 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6736,18 +7028,16 @@ ; AVX2-NEXT: .LBB15_56: # %else54 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $12, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm3, %ymm3, %ymm3 +; AVX2-NEXT: vpxor %ymm3, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX2-NEXT: je .LBB15_58 ; AVX2-NEXT: # %bb.57: # %cond.store55 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpextrb $12, %xmm3, 28(%rdi) +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $12, %xmm1, 28(%rdi) ; AVX2-NEXT: .LBB15_58: # %else56 -; AVX2-NEXT: vpextrb $13, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX2-NEXT: je .LBB15_60 ; AVX2-NEXT: # %bb.59: # %cond.store57 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6755,23 +7045,25 @@ ; AVX2-NEXT: .LBB15_60: # %else58 ; AVX2-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX2-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB15_62 -; AVX2-NEXT: # %bb.61: # %cond.store59 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 -; AVX2-NEXT: vpextrb $14, %xmm2, 30(%rdi) -; AVX2-NEXT: .LBB15_62: # %else60 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %ymm2, %ymm2, %ymm2 +; AVX2-NEXT: vpxor %ymm2, %ymm1, %ymm1 +; AVX2-NEXT: vpmovmskb %ymm1, %eax +; AVX2-NEXT: testl $1073741824, %eax # imm = 0x40000000 +; AVX2-NEXT: jne .LBB15_61 +; AVX2-NEXT: # %bb.62: # %else60 +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 +; AVX2-NEXT: jne .LBB15_63 +; AVX2-NEXT: .LBB15_64: # %else62 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB15_61: # %cond.store59 +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1 +; AVX2-NEXT: vpextrb $14, %xmm1, 30(%rdi) +; AVX2-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX2-NEXT: je .LBB15_64 -; AVX2-NEXT: # %bb.63: # %cond.store61 +; AVX2-NEXT: .LBB15_63: # %cond.store61 ; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm0 ; AVX2-NEXT: vpextrb $15, %xmm0, 31(%rdi) -; AVX2-NEXT: .LBB15_64: # %else62 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -6781,8 +7073,7 @@ ; AVX512F-NEXT: vpcmpeqb %ymm3, %ymm2, %ymm3 ; AVX512F-NEXT: vmovdqa64 %zmm3, %zmm4 ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm4 -; AVX512F-NEXT: vpmovsxbd %xmm4, %zmm4 -; AVX512F-NEXT: vptestmd %zmm4, %zmm4, %k0 +; AVX512F-NEXT: vpmovmskb %ymm4, %eax ; AVX512F-NEXT: vmovdqa {{.*#+}} ymm4 = [255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255] ; AVX512F-NEXT: vpminuw %ymm4, %ymm1, %ymm1 ; AVX512F-NEXT: vpminuw %ymm4, %ymm0, %ymm0 @@ -6791,18 +7082,14 @@ ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm1 = ymm1[0],zero,ymm1[1],zero,ymm1[2],zero,ymm1[3],zero,ymm1[4],zero,ymm1[5],zero,ymm1[6],zero,ymm1[7],zero,ymm1[8],zero,ymm1[9],zero,ymm1[10],zero,ymm1[11],zero,ymm1[12],zero,ymm1[13],zero,ymm1[14],zero,ymm1[15],zero ; AVX512F-NEXT: vpmovdb %zmm1, %xmm1 ; AVX512F-NEXT: vinserti128 $1, %xmm1, %ymm0, %ymm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB15_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB15_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm3, %zmm3, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB15_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -6811,21 +7098,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB15_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB15_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB15_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -6834,21 +7115,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB15_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB15_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB15_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -6857,21 +7132,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB15_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB15_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB15_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -6880,21 +7149,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB15_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB15_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB15_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -6903,21 +7166,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB15_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB15_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB15_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -6926,21 +7183,15 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB15_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB15_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB15_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -6949,45 +7200,33 @@ ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB15_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB15_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB15_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) ; AVX512F-NEXT: .LBB15_32: # %else30 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $65536, %eax # imm = 0x10000 ; AVX512F-NEXT: je .LBB15_34 ; AVX512F-NEXT: # %bb.33: # %cond.store31 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $0, %xmm3, 16(%rdi) ; AVX512F-NEXT: .LBB15_34: # %else32 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $131072, %eax # imm = 0x20000 ; AVX512F-NEXT: je .LBB15_36 ; AVX512F-NEXT: # %bb.35: # %cond.store33 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -6995,25 +7234,18 @@ ; AVX512F-NEXT: .LBB15_36: # %else34 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $262144, %eax # imm = 0x40000 ; AVX512F-NEXT: je .LBB15_38 ; AVX512F-NEXT: # %bb.37: # %cond.store35 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $2, %xmm3, 18(%rdi) ; AVX512F-NEXT: .LBB15_38: # %else36 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $524288, %eax # imm = 0x80000 ; AVX512F-NEXT: je .LBB15_40 ; AVX512F-NEXT: # %bb.39: # %cond.store37 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7021,25 +7253,18 @@ ; AVX512F-NEXT: .LBB15_40: # %else38 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 -; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $1048576, %eax # imm = 0x100000 ; AVX512F-NEXT: je .LBB15_42 ; AVX512F-NEXT: # %bb.41: # %cond.store39 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $4, %xmm3, 20(%rdi) ; AVX512F-NEXT: .LBB15_42: # %else40 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $2097152, %eax # imm = 0x200000 ; AVX512F-NEXT: je .LBB15_44 ; AVX512F-NEXT: # %bb.43: # %cond.store41 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7047,25 +7272,18 @@ ; AVX512F-NEXT: .LBB15_44: # %else42 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $4194304, %eax # imm = 0x400000 ; AVX512F-NEXT: je .LBB15_46 ; AVX512F-NEXT: # %bb.45: # %cond.store43 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $6, %xmm3, 22(%rdi) ; AVX512F-NEXT: .LBB15_46: # %else44 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $8388608, %eax # imm = 0x800000 ; AVX512F-NEXT: je .LBB15_48 ; AVX512F-NEXT: # %bb.47: # %cond.store45 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7073,25 +7291,18 @@ ; AVX512F-NEXT: .LBB15_48: # %else46 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $16777216, %eax # imm = 0x1000000 ; AVX512F-NEXT: je .LBB15_50 ; AVX512F-NEXT: # %bb.49: # %cond.store47 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $8, %xmm3, 24(%rdi) ; AVX512F-NEXT: .LBB15_50: # %else48 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $33554432, %eax # imm = 0x2000000 ; AVX512F-NEXT: je .LBB15_52 ; AVX512F-NEXT: # %bb.51: # %cond.store49 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7099,25 +7310,18 @@ ; AVX512F-NEXT: .LBB15_52: # %else50 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $67108864, %eax # imm = 0x4000000 ; AVX512F-NEXT: je .LBB15_54 ; AVX512F-NEXT: # %bb.53: # %cond.store51 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $10, %xmm3, 26(%rdi) ; AVX512F-NEXT: .LBB15_54: # %else52 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $134217728, %eax # imm = 0x8000000 ; AVX512F-NEXT: je .LBB15_56 ; AVX512F-NEXT: # %bb.55: # %cond.store53 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7125,25 +7329,18 @@ ; AVX512F-NEXT: .LBB15_56: # %else54 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm3, %eax +; AVX512F-NEXT: testl $268435456, %eax # imm = 0x10000000 ; AVX512F-NEXT: je .LBB15_58 ; AVX512F-NEXT: # %bb.57: # %cond.store55 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm3 ; AVX512F-NEXT: vpextrb $12, %xmm3, 28(%rdi) ; AVX512F-NEXT: .LBB15_58: # %else56 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $536870912, %eax # imm = 0x20000000 ; AVX512F-NEXT: je .LBB15_60 ; AVX512F-NEXT: # %bb.59: # %cond.store57 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm1 @@ -7151,25 +7348,18 @@ ; AVX512F-NEXT: .LBB15_60: # %else58 ; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1 ; AVX512F-NEXT: vpcmpeqb %ymm1, %ymm2, %ymm1 -; AVX512F-NEXT: vextracti128 $1, %ymm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm2, %eax +; AVX512F-NEXT: testl $1073741824, %eax # imm = 0x40000000 ; AVX512F-NEXT: je .LBB15_62 ; AVX512F-NEXT: # %bb.61: # %cond.store59 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm2 ; AVX512F-NEXT: vpextrb $14, %xmm2, 30(%rdi) ; AVX512F-NEXT: .LBB15_62: # %else60 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %ymm1, %eax +; AVX512F-NEXT: testl $-2147483648, %eax # imm = 0x80000000 ; AVX512F-NEXT: je .LBB15_64 ; AVX512F-NEXT: # %bb.63: # %cond.store61 ; AVX512F-NEXT: vextracti128 $1, %ymm0, %xmm0 @@ -7207,27 +7397,25 @@ ; SSE2: # %bb.0: ; SSE2-NEXT: pxor %xmm3, %xmm3 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [32768,32768,32768,32768,32768,32768,32768,32768] -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: movdqa {{.*#+}} xmm5 = [33023,33023,33023,33023,33023,33023,33023,33023] -; SSE2-NEXT: pminsw %xmm5, %xmm1 -; SSE2-NEXT: pxor %xmm4, %xmm1 -; SSE2-NEXT: pxor %xmm4, %xmm0 -; SSE2-NEXT: pminsw %xmm5, %xmm0 -; SSE2-NEXT: pxor %xmm4, %xmm0 +; SSE2-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE2-NEXT: pxor %xmm3, %xmm4 +; SSE2-NEXT: pmovmskb %xmm4, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] +; SSE2-NEXT: pxor %xmm3, %xmm1 +; SSE2-NEXT: movdqa {{.*#+}} xmm4 = [33023,33023,33023,33023,33023,33023,33023,33023] +; SSE2-NEXT: pminsw %xmm4, %xmm1 +; SSE2-NEXT: pxor %xmm3, %xmm1 +; SSE2-NEXT: pxor %xmm3, %xmm0 +; SSE2-NEXT: pminsw %xmm4, %xmm0 +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: packuswb %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm3, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB16_2 ; SSE2-NEXT: # %bb.1: # %cond.store ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: movb %cl, (%rdi) ; SSE2-NEXT: .LBB16_2: # %else -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB16_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -7235,20 +7423,17 @@ ; SSE2-NEXT: .LBB16_4: # %else2 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: movd %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: shrl $16, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB16_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: movd %xmm0, %ecx ; SSE2-NEXT: shrl $16, %ecx ; SSE2-NEXT: movb %cl, 2(%rdi) ; SSE2-NEXT: .LBB16_6: # %else4 -; SSE2-NEXT: shrl $24, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB16_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: movd %xmm0, %eax @@ -7257,18 +7442,16 @@ ; SSE2-NEXT: .LBB16_8: # %else6 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $2, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB16_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $2, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 4(%rdi) ; SSE2-NEXT: .LBB16_10: # %else8 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB16_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $2, %xmm0, %eax @@ -7276,18 +7459,16 @@ ; SSE2-NEXT: .LBB16_12: # %else10 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $3, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB16_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $3, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 6(%rdi) ; SSE2-NEXT: .LBB16_14: # %else12 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB16_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -7295,18 +7476,16 @@ ; SSE2-NEXT: .LBB16_16: # %else14 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $4, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $256, %eax # imm = 0x100 ; SSE2-NEXT: je .LBB16_18 ; SSE2-NEXT: # %bb.17: # %cond.store15 ; SSE2-NEXT: pextrw $4, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 8(%rdi) ; SSE2-NEXT: .LBB16_18: # %else16 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $512, %eax # imm = 0x200 ; SSE2-NEXT: je .LBB16_20 ; SSE2-NEXT: # %bb.19: # %cond.store17 ; SSE2-NEXT: pextrw $4, %xmm0, %eax @@ -7314,18 +7493,16 @@ ; SSE2-NEXT: .LBB16_20: # %else18 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $5, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $1024, %eax # imm = 0x400 ; SSE2-NEXT: je .LBB16_22 ; SSE2-NEXT: # %bb.21: # %cond.store19 ; SSE2-NEXT: pextrw $5, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 10(%rdi) ; SSE2-NEXT: .LBB16_22: # %else20 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $2048, %eax # imm = 0x800 ; SSE2-NEXT: je .LBB16_24 ; SSE2-NEXT: # %bb.23: # %cond.store21 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -7333,18 +7510,16 @@ ; SSE2-NEXT: .LBB16_24: # %else22 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE2-NEXT: pextrw $6, %xmm1, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl +; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE2-NEXT: pxor %xmm1, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE2-NEXT: je .LBB16_26 ; SSE2-NEXT: # %bb.25: # %cond.store23 ; SSE2-NEXT: pextrw $6, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 12(%rdi) ; SSE2-NEXT: .LBB16_26: # %else24 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE2-NEXT: je .LBB16_28 ; SSE2-NEXT: # %bb.27: # %cond.store25 ; SSE2-NEXT: pextrw $6, %xmm0, %eax @@ -7352,296 +7527,288 @@ ; SSE2-NEXT: .LBB16_28: # %else26 ; SSE2-NEXT: pxor %xmm1, %xmm1 ; SSE2-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: movl %eax, %ecx -; SSE2-NEXT: notb %cl -; SSE2-NEXT: testb $1, %cl -; SSE2-NEXT: je .LBB16_30 -; SSE2-NEXT: # %bb.29: # %cond.store27 +; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE2-NEXT: pxor %xmm2, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE2-NEXT: jne .LBB16_29 +; SSE2-NEXT: # %bb.30: # %else28 +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE2-NEXT: jne .LBB16_31 +; SSE2-NEXT: .LBB16_32: # %else30 +; SSE2-NEXT: retq +; SSE2-NEXT: .LBB16_29: # %cond.store27 ; SSE2-NEXT: pextrw $7, %xmm0, %ecx ; SSE2-NEXT: movb %cl, 14(%rdi) -; SSE2-NEXT: .LBB16_30: # %else28 -; SSE2-NEXT: shrl $8, %eax -; SSE2-NEXT: notb %al -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE2-NEXT: je .LBB16_32 -; SSE2-NEXT: # %bb.31: # %cond.store29 +; SSE2-NEXT: .LBB16_31: # %cond.store29 ; SSE2-NEXT: pextrw $7, %xmm0, %eax ; SSE2-NEXT: movb %ah, 15(%rdi) -; SSE2-NEXT: .LBB16_32: # %else30 ; SSE2-NEXT: retq ; ; SSE4-LABEL: truncstore_v16i16_v16i8: ; SSE4: # %bb.0: ; SSE4-NEXT: pxor %xmm3, %xmm3 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm3 -; SSE4-NEXT: movdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] -; SSE4-NEXT: pminuw %xmm4, %xmm1 -; SSE4-NEXT: pminuw %xmm4, %xmm0 +; SSE4-NEXT: pcmpeqd %xmm4, %xmm4 +; SSE4-NEXT: pxor %xmm3, %xmm4 +; SSE4-NEXT: pmovmskb %xmm4, %eax +; SSE4-NEXT: movdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] +; SSE4-NEXT: pminuw %xmm3, %xmm1 +; SSE4-NEXT: pminuw %xmm3, %xmm0 ; SSE4-NEXT: packuswb %xmm1, %xmm0 -; SSE4-NEXT: pextrb $0, %xmm3, %eax -; SSE4-NEXT: notb %al ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB16_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB16_2: # %else -; SSE4-NEXT: pextrb $1, %xmm3, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB16_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $1, %xmm0, 1(%rdi) ; SSE4-NEXT: .LBB16_4: # %else2 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $2, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB16_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $2, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB16_6: # %else4 -; SSE4-NEXT: pextrb $3, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB16_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $3, %xmm0, 3(%rdi) ; SSE4-NEXT: .LBB16_8: # %else6 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $4, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB16_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $4, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB16_10: # %else8 -; SSE4-NEXT: pextrb $5, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB16_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $5, %xmm0, 5(%rdi) ; SSE4-NEXT: .LBB16_12: # %else10 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $6, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB16_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $6, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB16_14: # %else12 -; SSE4-NEXT: pextrb $7, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB16_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $7, %xmm0, 7(%rdi) ; SSE4-NEXT: .LBB16_16: # %else14 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $8, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $256, %eax # imm = 0x100 ; SSE4-NEXT: je .LBB16_18 ; SSE4-NEXT: # %bb.17: # %cond.store15 ; SSE4-NEXT: pextrb $8, %xmm0, 8(%rdi) ; SSE4-NEXT: .LBB16_18: # %else16 -; SSE4-NEXT: pextrb $9, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $512, %eax # imm = 0x200 ; SSE4-NEXT: je .LBB16_20 ; SSE4-NEXT: # %bb.19: # %cond.store17 ; SSE4-NEXT: pextrb $9, %xmm0, 9(%rdi) ; SSE4-NEXT: .LBB16_20: # %else18 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $10, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $1024, %eax # imm = 0x400 ; SSE4-NEXT: je .LBB16_22 ; SSE4-NEXT: # %bb.21: # %cond.store19 ; SSE4-NEXT: pextrb $10, %xmm0, 10(%rdi) ; SSE4-NEXT: .LBB16_22: # %else20 -; SSE4-NEXT: pextrb $11, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $2048, %eax # imm = 0x800 ; SSE4-NEXT: je .LBB16_24 ; SSE4-NEXT: # %bb.23: # %cond.store21 ; SSE4-NEXT: pextrb $11, %xmm0, 11(%rdi) ; SSE4-NEXT: .LBB16_24: # %else22 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm2, %xmm1 -; SSE4-NEXT: pextrb $12, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: pcmpeqd %xmm3, %xmm3 +; SSE4-NEXT: pxor %xmm1, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testl $4096, %eax # imm = 0x1000 ; SSE4-NEXT: je .LBB16_26 ; SSE4-NEXT: # %bb.25: # %cond.store23 ; SSE4-NEXT: pextrb $12, %xmm0, 12(%rdi) ; SSE4-NEXT: .LBB16_26: # %else24 -; SSE4-NEXT: pextrb $13, %xmm1, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $8192, %eax # imm = 0x2000 ; SSE4-NEXT: je .LBB16_28 ; SSE4-NEXT: # %bb.27: # %cond.store25 ; SSE4-NEXT: pextrb $13, %xmm0, 13(%rdi) ; SSE4-NEXT: .LBB16_28: # %else26 ; SSE4-NEXT: pxor %xmm1, %xmm1 ; SSE4-NEXT: pcmpeqb %xmm1, %xmm2 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al -; SSE4-NEXT: je .LBB16_30 -; SSE4-NEXT: # %bb.29: # %cond.store27 +; SSE4-NEXT: pcmpeqd %xmm1, %xmm1 +; SSE4-NEXT: pxor %xmm2, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testl $16384, %eax # imm = 0x4000 +; SSE4-NEXT: jne .LBB16_29 +; SSE4-NEXT: # %bb.30: # %else28 +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 +; SSE4-NEXT: jne .LBB16_31 +; SSE4-NEXT: .LBB16_32: # %else30 +; SSE4-NEXT: retq +; SSE4-NEXT: .LBB16_29: # %cond.store27 ; SSE4-NEXT: pextrb $14, %xmm0, 14(%rdi) -; SSE4-NEXT: .LBB16_30: # %else28 -; SSE4-NEXT: pextrb $15, %xmm2, %eax -; SSE4-NEXT: notb %al -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: testl $32768, %eax # imm = 0x8000 ; SSE4-NEXT: je .LBB16_32 -; SSE4-NEXT: # %bb.31: # %cond.store29 +; SSE4-NEXT: .LBB16_31: # %cond.store29 ; SSE4-NEXT: pextrb $15, %xmm0, 15(%rdi) -; SSE4-NEXT: .LBB16_32: # %else30 ; SSE4-NEXT: retq ; ; AVX1-LABEL: truncstore_v16i16_v16i8: ; AVX1: # %bb.0: ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3 -; AVX1-NEXT: vmovdqa {{.*#+}} xmm4 = [255,255,255,255,255,255,255,255] -; AVX1-NEXT: vpminuw %xmm4, %xmm3, %xmm3 -; AVX1-NEXT: vpminuw %xmm4, %xmm0, %xmm0 -; AVX1-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 -; AVX1-NEXT: vpextrb $0, %xmm2, %eax -; AVX1-NEXT: notb %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2 +; AVX1-NEXT: vmovdqa {{.*#+}} xmm3 = [255,255,255,255,255,255,255,255] +; AVX1-NEXT: vpminuw %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpminuw %xmm3, %xmm0, %xmm0 +; AVX1-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 ; AVX1-NEXT: testb $1, %al ; AVX1-NEXT: je .LBB16_2 ; AVX1-NEXT: # %bb.1: # %cond.store ; AVX1-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX1-NEXT: .LBB16_2: # %else -; AVX1-NEXT: vpextrb $1, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $2, %al ; AVX1-NEXT: je .LBB16_4 ; AVX1-NEXT: # %bb.3: # %cond.store1 ; AVX1-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX1-NEXT: .LBB16_4: # %else2 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $2, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $4, %al ; AVX1-NEXT: je .LBB16_6 ; AVX1-NEXT: # %bb.5: # %cond.store3 ; AVX1-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX1-NEXT: .LBB16_6: # %else4 -; AVX1-NEXT: vpextrb $3, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $8, %al ; AVX1-NEXT: je .LBB16_8 ; AVX1-NEXT: # %bb.7: # %cond.store5 ; AVX1-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX1-NEXT: .LBB16_8: # %else6 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $4, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $16, %al ; AVX1-NEXT: je .LBB16_10 ; AVX1-NEXT: # %bb.9: # %cond.store7 ; AVX1-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX1-NEXT: .LBB16_10: # %else8 -; AVX1-NEXT: vpextrb $5, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $32, %al ; AVX1-NEXT: je .LBB16_12 ; AVX1-NEXT: # %bb.11: # %cond.store9 ; AVX1-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX1-NEXT: .LBB16_12: # %else10 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $6, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testb $64, %al ; AVX1-NEXT: je .LBB16_14 ; AVX1-NEXT: # %bb.13: # %cond.store11 ; AVX1-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX1-NEXT: .LBB16_14: # %else12 -; AVX1-NEXT: vpextrb $7, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testb $-128, %al ; AVX1-NEXT: je .LBB16_16 ; AVX1-NEXT: # %bb.15: # %cond.store13 ; AVX1-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX1-NEXT: .LBB16_16: # %else14 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $8, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $256, %eax # imm = 0x100 ; AVX1-NEXT: je .LBB16_18 ; AVX1-NEXT: # %bb.17: # %cond.store15 ; AVX1-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX1-NEXT: .LBB16_18: # %else16 -; AVX1-NEXT: vpextrb $9, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $512, %eax # imm = 0x200 ; AVX1-NEXT: je .LBB16_20 ; AVX1-NEXT: # %bb.19: # %cond.store17 ; AVX1-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX1-NEXT: .LBB16_20: # %else18 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $10, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $1024, %eax # imm = 0x400 ; AVX1-NEXT: je .LBB16_22 ; AVX1-NEXT: # %bb.21: # %cond.store19 ; AVX1-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX1-NEXT: .LBB16_22: # %else20 -; AVX1-NEXT: vpextrb $11, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $2048, %eax # imm = 0x800 ; AVX1-NEXT: je .LBB16_24 ; AVX1-NEXT: # %bb.23: # %cond.store21 ; AVX1-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX1-NEXT: .LBB16_24: # %else22 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX1-NEXT: vpextrb $12, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX1-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX1-NEXT: vpmovmskb %xmm2, %eax +; AVX1-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX1-NEXT: je .LBB16_26 ; AVX1-NEXT: # %bb.25: # %cond.store23 ; AVX1-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX1-NEXT: .LBB16_26: # %else24 -; AVX1-NEXT: vpextrb $13, %xmm2, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX1-NEXT: je .LBB16_28 ; AVX1-NEXT: # %bb.27: # %cond.store25 ; AVX1-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX1-NEXT: .LBB16_28: # %else26 ; AVX1-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX1-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX1-NEXT: vpextrb $14, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al -; AVX1-NEXT: je .LBB16_30 -; AVX1-NEXT: # %bb.29: # %cond.store27 +; AVX1-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX1-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX1-NEXT: vpmovmskb %xmm1, %eax +; AVX1-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX1-NEXT: jne .LBB16_29 +; AVX1-NEXT: # %bb.30: # %else28 +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX1-NEXT: jne .LBB16_31 +; AVX1-NEXT: .LBB16_32: # %else30 +; AVX1-NEXT: vzeroupper +; AVX1-NEXT: retq +; AVX1-NEXT: .LBB16_29: # %cond.store27 ; AVX1-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX1-NEXT: .LBB16_30: # %else28 -; AVX1-NEXT: vpextrb $15, %xmm1, %eax -; AVX1-NEXT: notb %al -; AVX1-NEXT: testb $1, %al +; AVX1-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX1-NEXT: je .LBB16_32 -; AVX1-NEXT: # %bb.31: # %cond.store29 +; AVX1-NEXT: .LBB16_31: # %cond.store29 ; AVX1-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX1-NEXT: .LBB16_32: # %else30 ; AVX1-NEXT: vzeroupper ; AVX1-NEXT: retq ; @@ -7649,135 +7816,131 @@ ; AVX2: # %bb.0: ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax ; AVX2-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 -; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm3 -; AVX2-NEXT: vpackuswb %xmm3, %xmm0, %xmm0 -; AVX2-NEXT: vpextrb $0, %xmm2, %eax -; AVX2-NEXT: notb %al +; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm2 +; AVX2-NEXT: vpackuswb %xmm2, %xmm0, %xmm0 ; AVX2-NEXT: testb $1, %al ; AVX2-NEXT: je .LBB16_2 ; AVX2-NEXT: # %bb.1: # %cond.store ; AVX2-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX2-NEXT: .LBB16_2: # %else -; AVX2-NEXT: vpextrb $1, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $2, %al ; AVX2-NEXT: je .LBB16_4 ; AVX2-NEXT: # %bb.3: # %cond.store1 ; AVX2-NEXT: vpextrb $1, %xmm0, 1(%rdi) ; AVX2-NEXT: .LBB16_4: # %else2 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $2, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $4, %al ; AVX2-NEXT: je .LBB16_6 ; AVX2-NEXT: # %bb.5: # %cond.store3 ; AVX2-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX2-NEXT: .LBB16_6: # %else4 -; AVX2-NEXT: vpextrb $3, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $8, %al ; AVX2-NEXT: je .LBB16_8 ; AVX2-NEXT: # %bb.7: # %cond.store5 ; AVX2-NEXT: vpextrb $3, %xmm0, 3(%rdi) ; AVX2-NEXT: .LBB16_8: # %else6 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $4, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $16, %al ; AVX2-NEXT: je .LBB16_10 ; AVX2-NEXT: # %bb.9: # %cond.store7 ; AVX2-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX2-NEXT: .LBB16_10: # %else8 -; AVX2-NEXT: vpextrb $5, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $32, %al ; AVX2-NEXT: je .LBB16_12 ; AVX2-NEXT: # %bb.11: # %cond.store9 ; AVX2-NEXT: vpextrb $5, %xmm0, 5(%rdi) ; AVX2-NEXT: .LBB16_12: # %else10 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $6, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testb $64, %al ; AVX2-NEXT: je .LBB16_14 ; AVX2-NEXT: # %bb.13: # %cond.store11 ; AVX2-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX2-NEXT: .LBB16_14: # %else12 -; AVX2-NEXT: vpextrb $7, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testb $-128, %al ; AVX2-NEXT: je .LBB16_16 ; AVX2-NEXT: # %bb.15: # %cond.store13 ; AVX2-NEXT: vpextrb $7, %xmm0, 7(%rdi) ; AVX2-NEXT: .LBB16_16: # %else14 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $8, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $256, %eax # imm = 0x100 ; AVX2-NEXT: je .LBB16_18 ; AVX2-NEXT: # %bb.17: # %cond.store15 ; AVX2-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX2-NEXT: .LBB16_18: # %else16 -; AVX2-NEXT: vpextrb $9, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $512, %eax # imm = 0x200 ; AVX2-NEXT: je .LBB16_20 ; AVX2-NEXT: # %bb.19: # %cond.store17 ; AVX2-NEXT: vpextrb $9, %xmm0, 9(%rdi) ; AVX2-NEXT: .LBB16_20: # %else18 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $10, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $1024, %eax # imm = 0x400 ; AVX2-NEXT: je .LBB16_22 ; AVX2-NEXT: # %bb.21: # %cond.store19 ; AVX2-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX2-NEXT: .LBB16_22: # %else20 -; AVX2-NEXT: vpextrb $11, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $2048, %eax # imm = 0x800 ; AVX2-NEXT: je .LBB16_24 ; AVX2-NEXT: # %bb.23: # %cond.store21 ; AVX2-NEXT: vpextrb $11, %xmm0, 11(%rdi) ; AVX2-NEXT: .LBB16_24: # %else22 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 -; AVX2-NEXT: vpextrb $12, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 +; AVX2-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX2-NEXT: vpmovmskb %xmm2, %eax +; AVX2-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX2-NEXT: je .LBB16_26 ; AVX2-NEXT: # %bb.25: # %cond.store23 ; AVX2-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX2-NEXT: .LBB16_26: # %else24 -; AVX2-NEXT: vpextrb $13, %xmm2, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX2-NEXT: je .LBB16_28 ; AVX2-NEXT: # %bb.27: # %cond.store25 ; AVX2-NEXT: vpextrb $13, %xmm0, 13(%rdi) ; AVX2-NEXT: .LBB16_28: # %else26 ; AVX2-NEXT: vpxor %xmm2, %xmm2, %xmm2 ; AVX2-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 -; AVX2-NEXT: vpextrb $14, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al -; AVX2-NEXT: je .LBB16_30 -; AVX2-NEXT: # %bb.29: # %cond.store27 +; AVX2-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 +; AVX2-NEXT: vpxor %xmm2, %xmm1, %xmm1 +; AVX2-NEXT: vpmovmskb %xmm1, %eax +; AVX2-NEXT: testl $16384, %eax # imm = 0x4000 +; AVX2-NEXT: jne .LBB16_29 +; AVX2-NEXT: # %bb.30: # %else28 +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 +; AVX2-NEXT: jne .LBB16_31 +; AVX2-NEXT: .LBB16_32: # %else30 +; AVX2-NEXT: vzeroupper +; AVX2-NEXT: retq +; AVX2-NEXT: .LBB16_29: # %cond.store27 ; AVX2-NEXT: vpextrb $14, %xmm0, 14(%rdi) -; AVX2-NEXT: .LBB16_30: # %else28 -; AVX2-NEXT: vpextrb $15, %xmm1, %eax -; AVX2-NEXT: notb %al -; AVX2-NEXT: testb $1, %al +; AVX2-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX2-NEXT: je .LBB16_32 -; AVX2-NEXT: # %bb.31: # %cond.store29 +; AVX2-NEXT: .LBB16_31: # %cond.store29 ; AVX2-NEXT: vpextrb $15, %xmm0, 15(%rdi) -; AVX2-NEXT: .LBB16_32: # %else30 ; AVX2-NEXT: vzeroupper ; AVX2-NEXT: retq ; @@ -7787,23 +7950,18 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 +; AVX512F-NEXT: vpmovmskb %xmm3, %eax ; AVX512F-NEXT: vpminuw {{.*}}(%rip), %ymm0, %ymm0 ; AVX512F-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero ; AVX512F-NEXT: vpmovdb %zmm0, %xmm0 -; AVX512F-NEXT: kmovw %k0, %eax ; AVX512F-NEXT: testb $1, %al ; AVX512F-NEXT: je .LBB16_2 ; AVX512F-NEXT: # %bb.1: # %cond.store ; AVX512F-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX512F-NEXT: .LBB16_2: # %else ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $1, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $2, %al ; AVX512F-NEXT: je .LBB16_4 ; AVX512F-NEXT: # %bb.3: # %cond.store1 ; AVX512F-NEXT: vpextrb $1, %xmm0, 1(%rdi) @@ -7812,21 +7970,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $2, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $4, %al ; AVX512F-NEXT: je .LBB16_6 ; AVX512F-NEXT: # %bb.5: # %cond.store3 ; AVX512F-NEXT: vpextrb $2, %xmm0, 2(%rdi) ; AVX512F-NEXT: .LBB16_6: # %else4 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $3, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $8, %al ; AVX512F-NEXT: je .LBB16_8 ; AVX512F-NEXT: # %bb.7: # %cond.store5 ; AVX512F-NEXT: vpextrb $3, %xmm0, 3(%rdi) @@ -7835,21 +7987,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $4, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $16, %al ; AVX512F-NEXT: je .LBB16_10 ; AVX512F-NEXT: # %bb.9: # %cond.store7 ; AVX512F-NEXT: vpextrb $4, %xmm0, 4(%rdi) ; AVX512F-NEXT: .LBB16_10: # %else8 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $5, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $32, %al ; AVX512F-NEXT: je .LBB16_12 ; AVX512F-NEXT: # %bb.11: # %cond.store9 ; AVX512F-NEXT: vpextrb $5, %xmm0, 5(%rdi) @@ -7858,21 +8004,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $6, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testb $64, %al ; AVX512F-NEXT: je .LBB16_14 ; AVX512F-NEXT: # %bb.13: # %cond.store11 ; AVX512F-NEXT: vpextrb $6, %xmm0, 6(%rdi) ; AVX512F-NEXT: .LBB16_14: # %else12 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $7, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testb $-128, %al ; AVX512F-NEXT: je .LBB16_16 ; AVX512F-NEXT: # %bb.15: # %cond.store13 ; AVX512F-NEXT: vpextrb $7, %xmm0, 7(%rdi) @@ -7881,21 +8021,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $8, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $256, %eax # imm = 0x100 ; AVX512F-NEXT: je .LBB16_18 ; AVX512F-NEXT: # %bb.17: # %cond.store15 ; AVX512F-NEXT: vpextrb $8, %xmm0, 8(%rdi) ; AVX512F-NEXT: .LBB16_18: # %else16 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $9, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $512, %eax # imm = 0x200 ; AVX512F-NEXT: je .LBB16_20 ; AVX512F-NEXT: # %bb.19: # %cond.store17 ; AVX512F-NEXT: vpextrb $9, %xmm0, 9(%rdi) @@ -7904,21 +8038,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $10, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $1024, %eax # imm = 0x400 ; AVX512F-NEXT: je .LBB16_22 ; AVX512F-NEXT: # %bb.21: # %cond.store19 ; AVX512F-NEXT: vpextrb $10, %xmm0, 10(%rdi) ; AVX512F-NEXT: .LBB16_22: # %else20 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $11, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $2048, %eax # imm = 0x800 ; AVX512F-NEXT: je .LBB16_24 ; AVX512F-NEXT: # %bb.23: # %cond.store21 ; AVX512F-NEXT: vpextrb $11, %xmm0, 11(%rdi) @@ -7927,21 +8055,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm2 ; AVX512F-NEXT: vmovdqa64 %zmm2, %zmm3 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm3 -; AVX512F-NEXT: vpmovsxbd %xmm3, %zmm3 -; AVX512F-NEXT: vptestmd %zmm3, %zmm3, %k0 -; AVX512F-NEXT: kshiftrw $12, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm3, %eax +; AVX512F-NEXT: testl $4096, %eax # imm = 0x1000 ; AVX512F-NEXT: je .LBB16_26 ; AVX512F-NEXT: # %bb.25: # %cond.store23 ; AVX512F-NEXT: vpextrb $12, %xmm0, 12(%rdi) ; AVX512F-NEXT: .LBB16_26: # %else24 ; AVX512F-NEXT: vpternlogq $15, %zmm2, %zmm2, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $13, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $8192, %eax # imm = 0x2000 ; AVX512F-NEXT: je .LBB16_28 ; AVX512F-NEXT: # %bb.27: # %cond.store25 ; AVX512F-NEXT: vpextrb $13, %xmm0, 13(%rdi) @@ -7950,21 +8072,15 @@ ; AVX512F-NEXT: vpcmpeqb %xmm2, %xmm1, %xmm1 ; AVX512F-NEXT: vmovdqa64 %zmm1, %zmm2 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm2 -; AVX512F-NEXT: vpmovsxbd %xmm2, %zmm2 -; AVX512F-NEXT: vptestmd %zmm2, %zmm2, %k0 -; AVX512F-NEXT: kshiftrw $14, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm2, %eax +; AVX512F-NEXT: testl $16384, %eax # imm = 0x4000 ; AVX512F-NEXT: je .LBB16_30 ; AVX512F-NEXT: # %bb.29: # %cond.store27 ; AVX512F-NEXT: vpextrb $14, %xmm0, 14(%rdi) ; AVX512F-NEXT: .LBB16_30: # %else28 ; AVX512F-NEXT: vpternlogq $15, %zmm1, %zmm1, %zmm1 -; AVX512F-NEXT: vpmovsxbd %xmm1, %zmm1 -; AVX512F-NEXT: vptestmd %zmm1, %zmm1, %k0 -; AVX512F-NEXT: kshiftrw $15, %k0, %k0 -; AVX512F-NEXT: kmovw %k0, %eax -; AVX512F-NEXT: testb $1, %al +; AVX512F-NEXT: vpmovmskb %xmm1, %eax +; AVX512F-NEXT: testl $32768, %eax # imm = 0x8000 ; AVX512F-NEXT: je .LBB16_32 ; AVX512F-NEXT: # %bb.31: # %cond.store29 ; AVX512F-NEXT: vpextrb $15, %xmm0, 15(%rdi) @@ -8001,23 +8117,26 @@ define void @truncstore_v8i16_v8i8(<8 x i16> %x, <8 x i8>* %p, <8 x i16> %mask) { ; SSE2-LABEL: truncstore_v8i16_v8i8: ; SSE2: # %bb.0: -; SSE2-NEXT: pxor %xmm2, %xmm2 -; SSE2-NEXT: pcmpeqw %xmm1, %xmm2 -; SSE2-NEXT: pcmpeqd %xmm3, %xmm3 -; SSE2-NEXT: pxor %xmm2, %xmm3 -; SSE2-NEXT: movdqa {{.*#+}} xmm2 = [32768,32768,32768,32768,32768,32768,32768,32768] -; SSE2-NEXT: pxor %xmm2, %xmm0 +; SSE2-NEXT: pxor %xmm3, %xmm3 +; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 +; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 +; SSE2-NEXT: pxor %xmm3, %xmm2 +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: movdqa {{.*#+}} xmm3 = [32768,32768,32768,32768,32768,32768,32768,32768] +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: pminsw {{.*}}(%rip), %xmm0 -; SSE2-NEXT: pxor %xmm2, %xmm0 -; SSE2-NEXT: movd %xmm3, %eax +; SSE2-NEXT: pxor %xmm3, %xmm0 ; SSE2-NEXT: testb $1, %al ; SSE2-NEXT: je .LBB17_2 ; SSE2-NEXT: # %bb.1: # %cond.store -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: movb %cl, (%rdi) +; SSE2-NEXT: movd %xmm0, %eax +; SSE2-NEXT: movb %al, (%rdi) ; SSE2-NEXT: .LBB17_2: # %else -; SSE2-NEXT: shrl $16, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: je .LBB17_4 ; SSE2-NEXT: # %bb.3: # %cond.store1 ; SSE2-NEXT: movd %xmm0, %eax @@ -8028,15 +8147,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $2, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $4, %al ; SSE2-NEXT: je .LBB17_6 ; SSE2-NEXT: # %bb.5: # %cond.store3 ; SSE2-NEXT: pextrw $2, %xmm0, %eax ; SSE2-NEXT: movb %al, 2(%rdi) ; SSE2-NEXT: .LBB17_6: # %else4 -; SSE2-NEXT: pextrw $3, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $8, %al ; SSE2-NEXT: je .LBB17_8 ; SSE2-NEXT: # %bb.7: # %cond.store5 ; SSE2-NEXT: pextrw $3, %xmm0, %eax @@ -8046,15 +8168,18 @@ ; SSE2-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm3, %xmm2 -; SSE2-NEXT: pextrw $4, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm3 +; SSE2-NEXT: packsswb %xmm0, %xmm3 +; SSE2-NEXT: pmovmskb %xmm3, %eax +; SSE2-NEXT: testb $16, %al ; SSE2-NEXT: je .LBB17_10 ; SSE2-NEXT: # %bb.9: # %cond.store7 ; SSE2-NEXT: pextrw $4, %xmm0, %eax ; SSE2-NEXT: movb %al, 4(%rdi) ; SSE2-NEXT: .LBB17_10: # %else8 -; SSE2-NEXT: pextrw $5, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $32, %al ; SSE2-NEXT: je .LBB17_12 ; SSE2-NEXT: # %bb.11: # %cond.store9 ; SSE2-NEXT: pextrw $5, %xmm0, %eax @@ -8064,15 +8189,18 @@ ; SSE2-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE2-NEXT: pxor %xmm1, %xmm2 -; SSE2-NEXT: pextrw $6, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: movdqa %xmm2, %xmm1 +; SSE2-NEXT: packsswb %xmm0, %xmm1 +; SSE2-NEXT: pmovmskb %xmm1, %eax +; SSE2-NEXT: testb $64, %al ; SSE2-NEXT: je .LBB17_14 ; SSE2-NEXT: # %bb.13: # %cond.store11 ; SSE2-NEXT: pextrw $6, %xmm0, %eax ; SSE2-NEXT: movb %al, 6(%rdi) ; SSE2-NEXT: .LBB17_14: # %else12 -; SSE2-NEXT: pextrw $7, %xmm2, %eax -; SSE2-NEXT: testb $1, %al +; SSE2-NEXT: packsswb %xmm0, %xmm2 +; SSE2-NEXT: pmovmskb %xmm2, %eax +; SSE2-NEXT: testb $-128, %al ; SSE2-NEXT: je .LBB17_16 ; SSE2-NEXT: # %bb.15: # %cond.store13 ; SSE2-NEXT: pextrw $7, %xmm0, %eax @@ -8086,15 +8214,18 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax ; SSE4-NEXT: pminuw {{.*}}(%rip), %xmm0 -; SSE4-NEXT: pextrb $0, %xmm2, %eax ; SSE4-NEXT: testb $1, %al ; SSE4-NEXT: je .LBB17_2 ; SSE4-NEXT: # %bb.1: # %cond.store ; SSE4-NEXT: pextrb $0, %xmm0, (%rdi) ; SSE4-NEXT: .LBB17_2: # %else -; SSE4-NEXT: pextrb $2, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $2, %al ; SSE4-NEXT: je .LBB17_4 ; SSE4-NEXT: # %bb.3: # %cond.store1 ; SSE4-NEXT: pextrb $2, %xmm0, 1(%rdi) @@ -8103,14 +8234,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $4, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $4, %al ; SSE4-NEXT: je .LBB17_6 ; SSE4-NEXT: # %bb.5: # %cond.store3 ; SSE4-NEXT: pextrb $4, %xmm0, 2(%rdi) ; SSE4-NEXT: .LBB17_6: # %else4 -; SSE4-NEXT: pextrb $6, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $8, %al ; SSE4-NEXT: je .LBB17_8 ; SSE4-NEXT: # %bb.7: # %cond.store5 ; SSE4-NEXT: pextrb $6, %xmm0, 3(%rdi) @@ -8119,14 +8253,17 @@ ; SSE4-NEXT: pcmpeqw %xmm1, %xmm3 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm3, %xmm2 -; SSE4-NEXT: pextrb $8, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm3 +; SSE4-NEXT: packsswb %xmm0, %xmm3 +; SSE4-NEXT: pmovmskb %xmm3, %eax +; SSE4-NEXT: testb $16, %al ; SSE4-NEXT: je .LBB17_10 ; SSE4-NEXT: # %bb.9: # %cond.store7 ; SSE4-NEXT: pextrb $8, %xmm0, 4(%rdi) ; SSE4-NEXT: .LBB17_10: # %else8 -; SSE4-NEXT: pextrb $10, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $32, %al ; SSE4-NEXT: je .LBB17_12 ; SSE4-NEXT: # %bb.11: # %cond.store9 ; SSE4-NEXT: pextrb $10, %xmm0, 5(%rdi) @@ -8135,14 +8272,17 @@ ; SSE4-NEXT: pcmpeqw %xmm2, %xmm1 ; SSE4-NEXT: pcmpeqd %xmm2, %xmm2 ; SSE4-NEXT: pxor %xmm1, %xmm2 -; SSE4-NEXT: pextrb $12, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: movdqa %xmm2, %xmm1 +; SSE4-NEXT: packsswb %xmm0, %xmm1 +; SSE4-NEXT: pmovmskb %xmm1, %eax +; SSE4-NEXT: testb $64, %al ; SSE4-NEXT: je .LBB17_14 ; SSE4-NEXT: # %bb.13: # %cond.store11 ; SSE4-NEXT: pextrb $12, %xmm0, 6(%rdi) ; SSE4-NEXT: .LBB17_14: # %else12 -; SSE4-NEXT: pextrb $14, %xmm2, %eax -; SSE4-NEXT: testb $1, %al +; SSE4-NEXT: packsswb %xmm0, %xmm2 +; SSE4-NEXT: pmovmskb %xmm2, %eax +; SSE4-NEXT: testb $-128, %al ; SSE4-NEXT: je .LBB17_16 ; SSE4-NEXT: # %bb.15: # %cond.store13 ; SSE4-NEXT: pextrb $14, %xmm0, 7(%rdi) @@ -8155,15 +8295,17 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax ; AVX-NEXT: vpminuw {{.*}}(%rip), %xmm0, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm2, %eax ; AVX-NEXT: testb $1, %al ; AVX-NEXT: je .LBB17_2 ; AVX-NEXT: # %bb.1: # %cond.store ; AVX-NEXT: vpextrb $0, %xmm0, (%rdi) ; AVX-NEXT: .LBB17_2: # %else -; AVX-NEXT: vpextrb $2, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $2, %al ; AVX-NEXT: je .LBB17_4 ; AVX-NEXT: # %bb.3: # %cond.store1 ; AVX-NEXT: vpextrb $2, %xmm0, 1(%rdi) @@ -8172,14 +8314,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $4, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $4, %al ; AVX-NEXT: je .LBB17_6 ; AVX-NEXT: # %bb.5: # %cond.store3 ; AVX-NEXT: vpextrb $4, %xmm0, 2(%rdi) ; AVX-NEXT: .LBB17_6: # %else4 -; AVX-NEXT: vpextrb $6, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $8, %al ; AVX-NEXT: je .LBB17_8 ; AVX-NEXT: # %bb.7: # %cond.store5 ; AVX-NEXT: vpextrb $6, %xmm0, 3(%rdi) @@ -8188,14 +8332,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm2 ; AVX-NEXT: vpcmpeqd %xmm3, %xmm3, %xmm3 ; AVX-NEXT: vpxor %xmm3, %xmm2, %xmm2 -; AVX-NEXT: vpextrb $8, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm3 +; AVX-NEXT: vpmovmskb %xmm3, %eax +; AVX-NEXT: testb $16, %al ; AVX-NEXT: je .LBB17_10 ; AVX-NEXT: # %bb.9: # %cond.store7 ; AVX-NEXT: vpextrb $8, %xmm0, 4(%rdi) ; AVX-NEXT: .LBB17_10: # %else8 -; AVX-NEXT: vpextrb $10, %xmm2, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm2, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $32, %al ; AVX-NEXT: je .LBB17_12 ; AVX-NEXT: # %bb.11: # %cond.store9 ; AVX-NEXT: vpextrb $10, %xmm0, 5(%rdi) @@ -8204,14 +8350,16 @@ ; AVX-NEXT: vpcmpeqw %xmm2, %xmm1, %xmm1 ; AVX-NEXT: vpcmpeqd %xmm2, %xmm2, %xmm2 ; AVX-NEXT: vpxor %xmm2, %xmm1, %xmm1 -; AVX-NEXT: vpextrb $12, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vpmovmskb %xmm2, %eax +; AVX-NEXT: testb $64, %al ; AVX-NEXT: je .LBB17_14 ; AVX-NEXT: # %bb.13: # %cond.store11 ; AVX-NEXT: vpextrb $12, %xmm0, 6(%rdi) ; AVX-NEXT: .LBB17_14: # %else12 -; AVX-NEXT: vpextrb $14, %xmm1, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vpacksswb %xmm0, %xmm1, %xmm1 +; AVX-NEXT: vpmovmskb %xmm1, %eax +; AVX-NEXT: testb $-128, %al ; AVX-NEXT: je .LBB17_16 ; AVX-NEXT: # %bb.15: # %cond.store13 ; AVX-NEXT: vpextrb $14, %xmm0, 7(%rdi) Index: test/CodeGen/X86/movmsk-cmp.ll =================================================================== --- test/CodeGen/X86/movmsk-cmp.ll +++ test/CodeGen/X86/movmsk-cmp.ll @@ -4273,19 +4273,31 @@ ; SSE2-LABEL: movmsk_v16i8: ; SSE2: # %bb.0: ; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 -; SSE2-NEXT: movdqa %xmm0, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: movb -{{[0-9]+}}(%rsp), %al -; SSE2-NEXT: xorb -{{[0-9]+}}(%rsp), %al -; SSE2-NEXT: andb -{{[0-9]+}}(%rsp), %al +; SSE2-NEXT: pmovmskb %xmm0, %eax +; SSE2-NEXT: movl %eax, %ecx +; SSE2-NEXT: shrl $15, %ecx +; SSE2-NEXT: movl %eax, %edx +; SSE2-NEXT: shrl $8, %edx +; SSE2-NEXT: andl $1, %edx +; SSE2-NEXT: andl $8, %eax +; SSE2-NEXT: shrl $3, %eax +; SSE2-NEXT: xorl %edx, %eax +; SSE2-NEXT: andl %ecx, %eax +; SSE2-NEXT: # kill: def $al killed $al killed $eax ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v16i8: ; AVX: # %bb.0: ; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 -; AVX-NEXT: vpextrb $3, %xmm0, %eax -; AVX-NEXT: vpextrb $8, %xmm0, %ecx -; AVX-NEXT: xorl %eax, %ecx -; AVX-NEXT: vpextrb $15, %xmm0, %eax +; AVX-NEXT: vpmovmskb %xmm0, %eax +; AVX-NEXT: movl %eax, %ecx +; AVX-NEXT: shrl $15, %ecx +; AVX-NEXT: movl %eax, %edx +; AVX-NEXT: shrl $8, %edx +; AVX-NEXT: andl $1, %edx +; AVX-NEXT: andl $8, %eax +; AVX-NEXT: shrl $3, %eax +; AVX-NEXT: xorl %edx, %eax ; AVX-NEXT: andl %ecx, %eax ; AVX-NEXT: # kill: def $al killed $al killed $eax ; AVX-NEXT: retq @@ -4333,27 +4345,35 @@ ; SSE2-LABEL: movmsk_v8i16: ; SSE2: # %bb.0: ; SSE2-NEXT: pcmpgtw %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: pextrw $1, %xmm0, %edx -; SSE2-NEXT: pextrw $7, %xmm0, %esi -; SSE2-NEXT: pextrw $4, %xmm0, %eax -; SSE2-NEXT: andl %esi, %eax -; SSE2-NEXT: andl %edx, %eax -; SSE2-NEXT: andl %ecx, %eax -; SSE2-NEXT: # kill: def $al killed $al killed $eax +; SSE2-NEXT: packsswb %xmm0, %xmm0 +; SSE2-NEXT: pmovmskb %xmm0, %ecx +; SSE2-NEXT: movl %ecx, %eax +; SSE2-NEXT: shrb $7, %al +; SSE2-NEXT: movl %ecx, %edx +; SSE2-NEXT: andb $16, %dl +; SSE2-NEXT: shrb $4, %dl +; SSE2-NEXT: andb %al, %dl +; SSE2-NEXT: movl %ecx, %eax +; SSE2-NEXT: shrb %al +; SSE2-NEXT: andb %dl, %al +; SSE2-NEXT: andb %cl, %al ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v8i16: ; AVX: # %bb.0: ; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 -; AVX-NEXT: vmovd %xmm0, %ecx -; AVX-NEXT: vpextrw $1, %xmm0, %edx -; AVX-NEXT: vpextrw $7, %xmm0, %esi -; AVX-NEXT: vpextrw $4, %xmm0, %eax -; AVX-NEXT: andl %esi, %eax -; AVX-NEXT: andl %edx, %eax -; AVX-NEXT: andl %ecx, %eax -; AVX-NEXT: # kill: def $al killed $al killed $eax +; AVX-NEXT: vpacksswb %xmm0, %xmm0, %xmm0 +; AVX-NEXT: vpmovmskb %xmm0, %ecx +; AVX-NEXT: movl %ecx, %eax +; AVX-NEXT: shrb $7, %al +; AVX-NEXT: movl %ecx, %edx +; AVX-NEXT: andb $16, %dl +; AVX-NEXT: shrb $4, %dl +; AVX-NEXT: andb %al, %dl +; AVX-NEXT: movl %ecx, %eax +; AVX-NEXT: shrb %al +; AVX-NEXT: andb %dl, %al +; AVX-NEXT: andb %cl, %al ; AVX-NEXT: retq ; ; KNL-LABEL: movmsk_v8i16: @@ -4405,20 +4425,24 @@ ; SSE2-LABEL: movmsk_v4i32: ; SSE2: # %bb.0: ; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[3,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: xorl %ecx, %eax +; SSE2-NEXT: movmskps %xmm1, %eax +; SSE2-NEXT: movl %eax, %ecx +; SSE2-NEXT: shrb $3, %cl +; SSE2-NEXT: andb $4, %al +; SSE2-NEXT: shrb $2, %al +; SSE2-NEXT: xorb %cl, %al ; SSE2-NEXT: # kill: def $al killed $al killed $eax ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v4i32: ; AVX: # %bb.0: ; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 -; AVX-NEXT: vpextrd $2, %xmm0, %ecx -; AVX-NEXT: vpextrd $3, %xmm0, %eax -; AVX-NEXT: xorl %ecx, %eax +; AVX-NEXT: vmovmskps %xmm0, %eax +; AVX-NEXT: movl %eax, %ecx +; AVX-NEXT: shrb $3, %cl +; AVX-NEXT: andb $4, %al +; AVX-NEXT: shrb $2, %al +; AVX-NEXT: xorb %cl, %al ; AVX-NEXT: # kill: def $al killed $al killed $eax ; AVX-NEXT: retq ; @@ -4461,11 +4485,10 @@ ; SSE2-NEXT: pand %xmm0, %xmm1 ; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 ; SSE2-NEXT: pxor %xmm1, %xmm0 -; SSE2-NEXT: movd %xmm0, %ecx -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,0,1] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: andl %ecx, %eax -; SSE2-NEXT: # kill: def $al killed $al killed $eax +; SSE2-NEXT: movmskpd %xmm0, %ecx +; SSE2-NEXT: movl %ecx, %eax +; SSE2-NEXT: shrb %al +; SSE2-NEXT: andb %cl, %al ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v2i64: @@ -4473,10 +4496,10 @@ ; AVX-NEXT: vpcmpeqq %xmm1, %xmm0, %xmm0 ; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 ; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 -; AVX-NEXT: vpextrd $2, %xmm0, %ecx -; AVX-NEXT: vmovd %xmm0, %eax -; AVX-NEXT: andl %ecx, %eax -; AVX-NEXT: # kill: def $al killed $al killed $eax +; AVX-NEXT: vmovmskpd %xmm0, %ecx +; AVX-NEXT: movl %ecx, %eax +; AVX-NEXT: shrb %al +; AVX-NEXT: andb %cl, %al ; AVX-NEXT: retq ; ; KNL-LABEL: movmsk_v2i64: @@ -4515,25 +4538,17 @@ ; SSE2-NEXT: cmpeqps %xmm1, %xmm2 ; SSE2-NEXT: cmpunordps %xmm1, %xmm0 ; SSE2-NEXT: orps %xmm2, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm1, %ecx -; SSE2-NEXT: pshufd {{.*#+}} xmm1 = xmm0[2,3,0,1] -; SSE2-NEXT: movd %xmm1, %edx -; SSE2-NEXT: pextrw $6, %xmm0, %eax -; SSE2-NEXT: orl %edx, %eax -; SSE2-NEXT: orl %ecx, %eax -; SSE2-NEXT: # kill: def $al killed $al killed $eax +; SSE2-NEXT: movmskps %xmm0, %eax +; SSE2-NEXT: testb $14, %al +; SSE2-NEXT: setne %al ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v4f32: ; AVX: # %bb.0: ; AVX-NEXT: vcmpeq_uqps %xmm1, %xmm0, %xmm0 -; AVX-NEXT: vextractps $1, %xmm0, %ecx -; AVX-NEXT: vextractps $2, %xmm0, %edx -; AVX-NEXT: vpextrb $12, %xmm0, %eax -; AVX-NEXT: orl %edx, %eax -; AVX-NEXT: orl %ecx, %eax -; AVX-NEXT: # kill: def $al killed $al killed $eax +; AVX-NEXT: vmovmskps %xmm0, %eax +; AVX-NEXT: testb $14, %al +; AVX-NEXT: setne %al ; AVX-NEXT: retq ; ; KNL-LABEL: movmsk_v4f32: @@ -4578,21 +4593,23 @@ define i1 @movmsk_v2f64(<2 x double> %x, <2 x double> %y) { ; SSE2-LABEL: movmsk_v2f64: ; SSE2: # %bb.0: -; SSE2-NEXT: cmplepd %xmm0, %xmm1 -; SSE2-NEXT: movd %xmm1, %ecx -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[2,3,0,1] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: andl %ecx, %eax -; SSE2-NEXT: # kill: def $al killed $al killed $eax +; SSE2-NEXT: movapd %xmm1, %xmm2 +; SSE2-NEXT: cmplepd %xmm0, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %ecx +; SSE2-NEXT: shrb %cl +; SSE2-NEXT: ucomisd %xmm1, %xmm0 +; SSE2-NEXT: setae %al +; SSE2-NEXT: andb %cl, %al ; SSE2-NEXT: retq ; ; AVX-LABEL: movmsk_v2f64: ; AVX: # %bb.0: -; AVX-NEXT: vcmplepd %xmm0, %xmm1, %xmm0 -; AVX-NEXT: vextractps $2, %xmm0, %ecx -; AVX-NEXT: vmovd %xmm0, %eax -; AVX-NEXT: andl %ecx, %eax -; AVX-NEXT: # kill: def $al killed $al killed $eax +; AVX-NEXT: vcmplepd %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vmovmskpd %xmm2, %ecx +; AVX-NEXT: shrb %cl +; AVX-NEXT: vucomisd %xmm1, %xmm0 +; AVX-NEXT: setae %al +; AVX-NEXT: andb %cl, %al ; AVX-NEXT: retq ; ; KNL-LABEL: movmsk_v2f64: @@ -4627,27 +4644,27 @@ define i32 @PR39665_c_ray(<2 x double> %x, <2 x double> %y) { ; SSE2-LABEL: PR39665_c_ray: ; SSE2: # %bb.0: -; SSE2-NEXT: cmpltpd %xmm0, %xmm1 -; SSE2-NEXT: movapd %xmm1, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) +; SSE2-NEXT: movapd %xmm1, %xmm2 +; SSE2-NEXT: cmpltpd %xmm0, %xmm2 +; SSE2-NEXT: movmskpd %xmm2, %eax +; SSE2-NEXT: testb $2, %al ; SSE2-NEXT: movl $42, %eax ; SSE2-NEXT: movl $99, %ecx ; SSE2-NEXT: cmovel %ecx, %eax -; SSE2-NEXT: testb $1, -{{[0-9]+}}(%rsp) -; SSE2-NEXT: cmovel %ecx, %eax +; SSE2-NEXT: ucomisd %xmm1, %xmm0 +; SSE2-NEXT: cmovbel %ecx, %eax ; SSE2-NEXT: retq ; ; AVX-LABEL: PR39665_c_ray: ; AVX: # %bb.0: -; AVX-NEXT: vcmpltpd %xmm0, %xmm1, %xmm0 -; AVX-NEXT: vpextrb $0, %xmm0, %ecx -; AVX-NEXT: vpextrb $8, %xmm0, %eax -; AVX-NEXT: testb $1, %al +; AVX-NEXT: vcmpltpd %xmm0, %xmm1, %xmm2 +; AVX-NEXT: vmovmskpd %xmm2, %eax +; AVX-NEXT: testb $2, %al ; AVX-NEXT: movl $42, %eax -; AVX-NEXT: movl $99, %edx -; AVX-NEXT: cmovel %edx, %eax -; AVX-NEXT: testb $1, %cl -; AVX-NEXT: cmovel %edx, %eax +; AVX-NEXT: movl $99, %ecx +; AVX-NEXT: cmovel %ecx, %eax +; AVX-NEXT: vucomisd %xmm1, %xmm0 +; AVX-NEXT: cmovbel %ecx, %eax ; AVX-NEXT: retq ; ; KNL-LABEL: PR39665_c_ray: Index: test/CodeGen/X86/pr39666.ll =================================================================== --- test/CodeGen/X86/pr39666.ll +++ test/CodeGen/X86/pr39666.ll @@ -14,19 +14,22 @@ define void @test11(i64* %base, <2 x i64> %V, <2 x i1> %mask) { ; CHECK-LABEL: test11: ; CHECK: # %bb.0: -; CHECK-NEXT: vpextrb $0, %xmm1, %eax +; CHECK-NEXT: vpsllq $63, %xmm1, %xmm1 +; CHECK-NEXT: vmovmskpd %xmm1, %eax ; CHECK-NEXT: testb $1, %al -; CHECK-NEXT: je .LBB1_2 -; CHECK-NEXT: # %bb.1: # %cond.store +; CHECK-NEXT: jne .LBB1_1 +; CHECK-NEXT: # %bb.2: # %else +; CHECK-NEXT: testb $2, %al +; CHECK-NEXT: jne .LBB1_3 +; CHECK-NEXT: .LBB1_4: # %else2 +; CHECK-NEXT: retq +; CHECK-NEXT: .LBB1_1: # %cond.store ; CHECK-NEXT: vmovq %xmm0, (%rdi) ; CHECK-NEXT: addq $8, %rdi -; CHECK-NEXT: .LBB1_2: # %else -; CHECK-NEXT: vpextrb $8, %xmm1, %eax -; CHECK-NEXT: testb $1, %al +; CHECK-NEXT: testb $2, %al ; CHECK-NEXT: je .LBB1_4 -; CHECK-NEXT: # %bb.3: # %cond.store1 +; CHECK-NEXT: .LBB1_3: # %cond.store1 ; CHECK-NEXT: vpextrq $1, %xmm0, (%rdi) -; CHECK-NEXT: .LBB1_4: # %else2 ; CHECK-NEXT: retq call void @llvm.masked.compressstore.v2i64(<2 x i64> %V, i64* %base, <2 x i1> %mask) ret void Index: test/CodeGen/X86/setcc-combine.ll =================================================================== --- test/CodeGen/X86/setcc-combine.ll +++ test/CodeGen/X86/setcc-combine.ll @@ -3,20 +3,17 @@ ; RUN: llc -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 < %s | FileCheck %s --check-prefixes=CHECK,SSE41 define i32 @test_eq_1(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_eq_1: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_eq_1: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE41-NEXT: pextrd $1, %xmm1, %eax -; SSE41-NEXT: notl %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_eq_1: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer @@ -26,18 +23,19 @@ } define i32 @test_ne_1(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_ne_1: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_ne_1: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE41-NEXT: pextrd $1, %xmm1, %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_ne_1: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer @@ -49,7 +47,16 @@ define i32 @test_le_1(<4 x i32> %A, <4 x i32> %B) { ; CHECK-LABEL: test_le_1: ; CHECK: # %bb.0: -; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm0 +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm0, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax ; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> @@ -60,20 +67,17 @@ } define i32 @test_ge_1(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_ge_1: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_ge_1: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE41-NEXT: pextrd $1, %xmm1, %eax -; SSE41-NEXT: notl %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_ge_1: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm0, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp sge <4 x i32> %sext, zeroinitializer @@ -83,18 +87,15 @@ } define i32 @test_lt_1(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_lt_1: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_lt_1: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm0, %xmm1 -; SSE41-NEXT: pextrd $1, %xmm1, %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_lt_1: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp slt <4 x i32> %sext, zeroinitializer @@ -106,7 +107,14 @@ define i32 @test_gt_1(<4 x i32> %A, <4 x i32> %B) { ; CHECK-LABEL: test_gt_1: ; CHECK: # %bb.0: -; CHECK-NEXT: xorl %eax, %eax +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm0 +; CHECK-NEXT: pcmpgtd %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax ; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %A, %B %sext = sext <4 x i1> %cmp to <4 x i32> @@ -117,20 +125,17 @@ } define i32 @test_eq_2(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_eq_2: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_eq_2: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE41-NEXT: pextrd $1, %xmm0, %eax -; SSE41-NEXT: notl %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_eq_2: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp eq <4 x i32> %sext, zeroinitializer @@ -140,18 +145,19 @@ } define i32 @test_ne_2(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_ne_2: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_ne_2: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE41-NEXT: pextrd $1, %xmm0, %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_ne_2: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm0, %xmm1 +; CHECK-NEXT: pcmpeqd %xmm0, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp ne <4 x i32> %sext, zeroinitializer @@ -161,20 +167,17 @@ } define i32 @test_le_2(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_le_2: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: notl %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_le_2: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE41-NEXT: pextrd $1, %xmm0, %eax -; SSE41-NEXT: notl %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_le_2: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp sle <4 x i32> zeroinitializer, %sext @@ -186,7 +189,16 @@ define i32 @test_ge_2(<4 x i32> %A, <4 x i32> %B) { ; CHECK-LABEL: test_ge_2: ; CHECK: # %bb.0: -; CHECK-NEXT: movl $-1, %eax +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pxor %xmm1, %xmm1 +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: pcmpeqd %xmm1, %xmm1 +; CHECK-NEXT: pxor %xmm0, %xmm1 +; CHECK-NEXT: movmskps %xmm1, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax ; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> @@ -197,18 +209,15 @@ } define i32 @test_lt_2(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_lt_2: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_lt_2: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE41-NEXT: pextrd $1, %xmm0, %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_lt_2: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp slt <4 x i32> zeroinitializer, %sext @@ -218,18 +227,15 @@ } define i32 @test_gt_2(<4 x i32> %A, <4 x i32> %B) { -; SSE2-LABEL: test_gt_2: -; SSE2: # %bb.0: -; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,2,3] -; SSE2-NEXT: movd %xmm0, %eax -; SSE2-NEXT: retq -; -; SSE41-LABEL: test_gt_2: -; SSE41: # %bb.0: -; SSE41-NEXT: pcmpgtd %xmm1, %xmm0 -; SSE41-NEXT: pextrd $1, %xmm0, %eax -; SSE41-NEXT: retq +; CHECK-LABEL: test_gt_2: +; CHECK: # %bb.0: +; CHECK-NEXT: pcmpgtd %xmm1, %xmm0 +; CHECK-NEXT: movmskps %xmm0, %eax +; CHECK-NEXT: shrb %al +; CHECK-NEXT: movzbl %al, %eax +; CHECK-NEXT: andl $1, %eax +; CHECK-NEXT: negl %eax +; CHECK-NEXT: retq %cmp = icmp slt <4 x i32> %B, %A %sext = sext <4 x i1> %cmp to <4 x i32> %cmp1 = icmp sgt <4 x i32> zeroinitializer, %sext Index: test/CodeGen/X86/test-shrink-bug.ll =================================================================== --- test/CodeGen/X86/test-shrink-bug.ll +++ test/CodeGen/X86/test-shrink-bug.ll @@ -75,8 +75,8 @@ ; CHECK-X64-NEXT: pcmpeqd {{.*}}(%rip), %xmm0 ; CHECK-X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2] ; CHECK-X64-NEXT: pand %xmm0, %xmm1 -; CHECK-X64-NEXT: pextrw $4, %xmm1, %eax -; CHECK-X64-NEXT: testb $1, %al +; CHECK-X64-NEXT: movmskpd %xmm1, %eax +; CHECK-X64-NEXT: shrb %al ; CHECK-X64-NEXT: jne .LBB1_2 ; CHECK-X64-NEXT: # %bb.3: # %no ; CHECK-X64-NEXT: callq bar