https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104982

--- Comment #4 from Hongtao.liu <crazylht at gmail dot com> ---
I'm testing

diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 02f298c2846..c74edd1aaef 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -14182,12 +14182,12 @@ (define_insn_and_split "*jcc_bt<mode>_mask"
 (define_split
   [(set (match_operand:SWI248 0 "register_operand")
        (if_then_else:SWI248
-        (ne
-         (zero_extract:SWI48
-          (match_operand:SWI48 1 "register_operand")
-          (const_int 1)
-          (zero_extend:SI (match_operand:QI 2 "register_operand")))
-         (const_int 0))
+        (match_operator 5 "bt_comparison_operator"
+         [(zero_extract:SWI48
+           (match_operand:SWI48 1 "register_operand")
+           (const_int 1)
+           (zero_extend:SI (match_operand:QI 2 "register_operand")))
+          (const_int 0)])
         (match_operand:SWI248 3 "nonimmediate_operand")
         (match_operand:SWI248 4 "nonimmediate_operand")))]
   "TARGET_USE_BT && TARGET_CMOVE
@@ -14202,6 +14202,8 @@ (define_split
                             (match_dup 3)
                             (match_dup 4)))]
 {
+  if (GET_CODE (operands[5]) == EQ)
+    std::swap (operands[3], operands[4]);
   operands[2] = lowpart_subreg (SImode, operands[2], QImode);
 })

Reply via email to