Index: lib/Target/X86/X86ISelDAGToDAG.cpp =================================================================== --- lib/Target/X86/X86ISelDAGToDAG.cpp +++ lib/Target/X86/X86ISelDAGToDAG.cpp @@ -2827,21 +2827,27 @@ SDLoc DL(Node); - SDValue OrigNBits = NBits; - if (NBits.getValueType() != NVT) { - // Truncate the shift amount. - NBits = CurDAG->getNode(ISD::TRUNCATE, DL, MVT::i8, NBits); - insertDAGNode(*CurDAG, OrigNBits, NBits); + auto MakeValBeZeroExtendedI8 = [this, NVT, DL](SDValue Val, + SDValue &OrigVal) { + OrigVal = Val; - // Insert 8-bit NBits into lowest 8 bits of NVT-sized (32 or 64-bit) + // Truncate the shift amount. + Val = CurDAG->getNode(ISD::TRUNCATE, DL, MVT::i8, Val); + insertDAGNode(*CurDAG, OrigVal, Val); + + // Insert 8-bit Val into lowest 8 bits of NVT-sized (32 or 64-bit) // register. All the other bits are undefined, we do not care about them. SDValue ImplDef = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF, DL, NVT), 0); - insertDAGNode(*CurDAG, OrigNBits, ImplDef); - NBits = - CurDAG->getTargetInsertSubreg(X86::sub_8bit, DL, NVT, ImplDef, NBits); - insertDAGNode(*CurDAG, OrigNBits, NBits); - } + insertDAGNode(*CurDAG, OrigVal, ImplDef); + Val = CurDAG->getTargetInsertSubreg(X86::sub_8bit, DL, NVT, ImplDef, Val); + insertDAGNode(*CurDAG, OrigVal, Val); + + return Val; + }; + + SDValue OrigNBits; + NBits = MakeValBeZeroExtendedI8(NBits, OrigNBits); if (Subtarget->hasBMI2()) { // Great, just emit the the BZHI.. @@ -2861,7 +2867,19 @@ SDValue C8 = CurDAG->getConstant(8, DL, MVT::i8); SDValue Control = CurDAG->getNode(ISD::SHL, DL, NVT, NBits, C8); insertDAGNode(*CurDAG, OrigNBits, Control); - // NOTE: could also try to extract start from (x >> start) + + // If the 'X' is *logically* shifted, we can fold that shift into 'control'. + if (X.getOpcode() == ISD::SRL) { + SDValue ShiftAmt = X.getOperand(1); + X = X.getOperand(0); + + SDValue OrigShiftAmt; + ShiftAmt = MakeValBeZeroExtendedI8(ShiftAmt, OrigShiftAmt); + + // Insert 8-bit ShiftAmt into lowest 8 bits of 'control'. + Control = CurDAG->getNode(ISD::OR, DL, NVT, Control, ShiftAmt); + insertDAGNode(*CurDAG, OrigNBits, Control); + } // And finally, form the BEXTR itself. SDValue Extract = CurDAG->getNode(X86ISD::BEXTR, DL, NVT, X, Control); Index: test/CodeGen/X86/extract-bits.ll =================================================================== --- test/CodeGen/X86/extract-bits.ll +++ test/CodeGen/X86/extract-bits.ll @@ -50,10 +50,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_a0: @@ -78,10 +77,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_a0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -184,10 +181,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_a1_indexzext: @@ -212,10 +208,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_a1_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -252,13 +246,12 @@ ; ; X86-BMI1NOTBM-LABEL: bextr32_a2_load: ; X86-BMI1NOTBM: # %bb.0: -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_a2_load: @@ -285,12 +278,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_a2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_a2_load: @@ -325,13 +315,12 @@ ; ; X86-BMI1NOTBM-LABEL: bextr32_a3_load_indexzext: ; X86-BMI1NOTBM: # %bb.0: -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_a3_load_indexzext: @@ -358,12 +347,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_a3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_a3_load_indexzext: @@ -401,10 +387,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_a4_commutative: @@ -429,10 +414,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_a4_commutative: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -477,11 +460,10 @@ ; X86-BMI1NOTBM-NEXT: pushl %esi ; X86-BMI1NOTBM-NEXT: subl $8, %esp ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %esi +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %esi ; X86-BMI1NOTBM-NEXT: movl %ecx, (%esp) ; X86-BMI1NOTBM-NEXT: calll use32 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax @@ -523,9 +505,8 @@ ; X64-BMI1NOTBM-LABEL: bextr32_a5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %ebx ; X64-BMI1NOTBM-NEXT: movl %esi, %edi ; X64-BMI1NOTBM-NEXT: callq use32 @@ -677,10 +658,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_a0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -967,10 +946,9 @@ ; X64-BMI1NOTBM-LABEL: bextr64_a1_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -1118,12 +1096,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_a2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_a2_load: @@ -1268,12 +1243,10 @@ ; X64-BMI1NOTBM-LABEL: bextr64_a3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_a3_load_indexzext: @@ -1417,10 +1390,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_a4_commutative: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -1605,9 +1576,8 @@ ; X64-BMI1NOTBM-LABEL: bextr64_a5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rbx ; X64-BMI1NOTBM-NEXT: movq %rsi, %rdi ; X64-BMI1NOTBM-NEXT: callq use64 @@ -1657,10 +1627,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_b0: @@ -1685,10 +1654,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_b0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -1724,10 +1691,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_b1_indexzext: @@ -1752,10 +1718,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_b1_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -1792,13 +1756,12 @@ ; ; X86-BMI1NOTBM-LABEL: bextr32_b2_load: ; X86-BMI1NOTBM: # %bb.0: -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_b2_load: @@ -1825,12 +1788,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_b2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_b2_load: @@ -1865,13 +1825,12 @@ ; ; X86-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext: ; X86-BMI1NOTBM: # %bb.0: -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_b3_load_indexzext: @@ -1898,12 +1857,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_b3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_b3_load_indexzext: @@ -1941,10 +1897,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_b4_commutative: @@ -1969,10 +1924,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_b4_commutative: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -2017,11 +1970,10 @@ ; X86-BMI1NOTBM-NEXT: pushl %esi ; X86-BMI1NOTBM-NEXT: subl $8, %esp ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %esi +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %esi ; X86-BMI1NOTBM-NEXT: movl %ecx, (%esp) ; X86-BMI1NOTBM-NEXT: calll use32 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax @@ -2063,9 +2015,8 @@ ; X64-BMI1NOTBM-LABEL: bextr32_b5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %ebx ; X64-BMI1NOTBM-NEXT: movl %esi, %edi ; X64-BMI1NOTBM-NEXT: callq use32 @@ -2214,10 +2165,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_b0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -2355,10 +2304,9 @@ ; X64-BMI1NOTBM-LABEL: bextr64_b1_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -2503,12 +2451,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_b2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_b2_load: @@ -2650,12 +2595,10 @@ ; X64-BMI1NOTBM-LABEL: bextr64_b3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_b3_load_indexzext: @@ -2796,10 +2739,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_b4_commutative: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -2979,9 +2920,8 @@ ; X64-BMI1NOTBM-LABEL: bextr64_b5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rbx ; X64-BMI1NOTBM-NEXT: movq %rsi, %rdi ; X64-BMI1NOTBM-NEXT: callq use64 @@ -5166,10 +5106,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_d0: @@ -5194,10 +5133,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_d0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -5230,10 +5167,9 @@ ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_d1_indexzext: @@ -5258,10 +5194,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_d1_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %eax ; X64-BMI1NOTBM-NEXT: retq ; @@ -5296,12 +5230,11 @@ ; X86-BMI1NOTBM-LABEL: bextr32_d2_load: ; X86-BMI1NOTBM: # %bb.0: ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_d2_load: @@ -5327,12 +5260,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_d2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_d2_load: @@ -5364,13 +5294,12 @@ ; ; X86-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext: ; X86-BMI1NOTBM: # %bb.0: -; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %al +; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %cl -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-BMI1NOTBM-NEXT: movl (%edx), %edx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx -; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %eax +; X86-BMI1NOTBM-NEXT: movb {{[0-9]+}}(%esp), %dl +; X86-BMI1NOTBM-NEXT: shll $8, %ecx +; X86-BMI1NOTBM-NEXT: orl %edx, %ecx +; X86-BMI1NOTBM-NEXT: bextrl %ecx, (%eax), %eax ; X86-BMI1NOTBM-NEXT: retl ; ; X86-BMI1BMI2-LABEL: bextr32_d3_load_indexzext: @@ -5396,12 +5325,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr32_d3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movl (%rdi), %eax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %eax ; X64-BMI1NOTBM-NEXT: shll $8, %edx -; X64-BMI1NOTBM-NEXT: bextrl %edx, %eax, %eax +; X64-BMI1NOTBM-NEXT: orl %esi, %edx +; X64-BMI1NOTBM-NEXT: bextrl %edx, (%rdi), %eax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr32_d3_load_indexzext: @@ -5445,11 +5371,10 @@ ; X86-BMI1NOTBM-NEXT: pushl %esi ; X86-BMI1NOTBM-NEXT: subl $8, %esp ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-BMI1NOTBM-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-BMI1NOTBM-NEXT: shrl %cl, %edx ; X86-BMI1NOTBM-NEXT: shll $8, %eax -; X86-BMI1NOTBM-NEXT: bextrl %eax, %edx, %esi +; X86-BMI1NOTBM-NEXT: orl %ecx, %eax +; X86-BMI1NOTBM-NEXT: bextrl %eax, {{[0-9]+}}(%esp), %esi ; X86-BMI1NOTBM-NEXT: movl %ecx, (%esp) ; X86-BMI1NOTBM-NEXT: calll use32 ; X86-BMI1NOTBM-NEXT: movl %esi, %eax @@ -5491,9 +5416,8 @@ ; X64-BMI1NOTBM-LABEL: bextr32_d5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: shrl %cl, %edi ; X64-BMI1NOTBM-NEXT: shll $8, %edx +; X64-BMI1NOTBM-NEXT: orl %esi, %edx ; X64-BMI1NOTBM-NEXT: bextrl %edx, %edi, %ebx ; X64-BMI1NOTBM-NEXT: movl %esi, %edi ; X64-BMI1NOTBM-NEXT: callq use32 @@ -5673,10 +5597,8 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_d0: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -5845,10 +5767,9 @@ ; X64-BMI1NOTBM-LABEL: bextr64_d1_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rax ; X64-BMI1NOTBM-NEXT: retq ; @@ -6023,12 +5944,9 @@ ; ; X64-BMI1NOTBM-LABEL: bextr64_d2_load: ; X64-BMI1NOTBM: # %bb.0: -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_d2_load: @@ -6200,12 +6118,10 @@ ; X64-BMI1NOTBM-LABEL: bextr64_d3_load_indexzext: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: # kill: def $edx killed $edx def $rdx -; X64-BMI1NOTBM-NEXT: movl %esi, %ecx -; X64-BMI1NOTBM-NEXT: movq (%rdi), %rax -; X64-BMI1NOTBM-NEXT: # kill: def $cl killed $cl killed $ecx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rax +; X64-BMI1NOTBM-NEXT: # kill: def $esi killed $esi def $rsi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx -; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rax, %rax +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx +; X64-BMI1NOTBM-NEXT: bextrq %rdx, (%rdi), %rax ; X64-BMI1NOTBM-NEXT: retq ; ; X64-BMI1BMI2-LABEL: bextr64_d3_load_indexzext: @@ -6419,9 +6335,8 @@ ; X64-BMI1NOTBM-LABEL: bextr64_d5_skipextrauses: ; X64-BMI1NOTBM: # %bb.0: ; X64-BMI1NOTBM-NEXT: pushq %rbx -; X64-BMI1NOTBM-NEXT: movq %rsi, %rcx -; X64-BMI1NOTBM-NEXT: shrq %cl, %rdi ; X64-BMI1NOTBM-NEXT: shlq $8, %rdx +; X64-BMI1NOTBM-NEXT: orq %rsi, %rdx ; X64-BMI1NOTBM-NEXT: bextrq %rdx, %rdi, %rbx ; X64-BMI1NOTBM-NEXT: movq %rsi, %rdi ; X64-BMI1NOTBM-NEXT: callq use64 Index: test/CodeGen/X86/extract-lowbits.ll =================================================================== --- test/CodeGen/X86/extract-lowbits.ll +++ test/CodeGen/X86/extract-lowbits.ll @@ -2908,7 +2908,7 @@ ; X86-BMI1BMI2: # %bb.0: ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-BMI1BMI2-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-BMI1BMI2-NEXT: bzhil %eax, (%ecx), %eax +; X86-BMI1BMI2-NEXT: bzhil %ecx, (%eax), %eax ; X86-BMI1BMI2-NEXT: retl ; ; X64-NOBMI-LABEL: bzhi32_d2_load: