https://gcc.gnu.org/g:a7a008375aaacb658bca0b57157366778a369ddf
commit r17-3191-ga7a008375aaacb658bca0b57157366778a369ddf Author: Uros Bizjak <[email protected]> Date: Mon Aug 10 09:58:11 2026 +0200 i386: Split MOVBE alternatives out of *bswaphi2_movbe to drop flags clobber The MOVBE alternatives in *bswaphi2_movbe carry a (clobber (reg:CC FLAGS_REG)) that only the ROL alternative sharing the pattern actually needs. MOVBE does not touch EFLAGS, so once reload has picked an alternative, split the MOVBE cases out into a new clobber-free *movbehi2 pattern. gcc/ChangeLog: * config/i386/i386.md (*movbehi2): New insn, split from the movbe alternatives of *bswaphi2_movbe. (*bswaphi2_movbe): Convert to define_insn_and_split. Split the MOVBE alternatives (mem<->reg) post-reload into *movbehi2 to drop the now-unneeded flags clobber. Diff: --- gcc/config/i386/i386.md | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 3b0f8b2cccd3..73d005ef5ed5 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -23658,7 +23658,21 @@ operands[1] = force_reg (HImode, operands[1]); }) -(define_insn "*bswaphi2_movbe" +(define_insn "*movbehi2" + [(set (match_operand:HI 0 "nonimmediate_operand" "=r,m") + (bswap:HI (match_operand:HI 1 "nonimmediate_operand" "m,r")))] + "TARGET_MOVBE + && MEM_P (operands[0]) != MEM_P (operands[1]) + && reload_completed" + "movbe{w}\t{%1, %0|%0, %1}" + [(set_attr "type" "imov") + (set_attr "modrm" "1") + (set_attr "prefix_0f" "1") + (set_attr "prefix_extra" "1") + (set_attr "mode" "HI")]) + +;; Convert movbe to avoid flags dependency. +(define_insn_and_split "*bswaphi2_movbe" [(set (match_operand:HI 0 "nonimmediate_operand" "=Q,r,r,m") (bswap:HI (match_operand:HI 1 "nonimmediate_operand" "0,0,m,r"))) (clobber (reg:CC FLAGS_REG))] @@ -23667,8 +23681,13 @@ "@ xchg{b}\t{%h0, %b0|%b0, %h0} rol{w}\t{$8, %0|%0, 8} - movbe{w}\t{%1, %0|%0, %1} - movbe{w}\t{%1, %0|%0, %1}" + # + #" + "&& MEM_P (operands[0]) != MEM_P (operands[1]) + && reload_completed" + [(set (match_dup 0) + (bswap:HI (match_dup 1)))] + "" [(set_attr "type" "imov,rotate1,imov,imov") (set_attr "modrm" "*,*,1,1") (set_attr "prefix_0f" "*,*,1,1")
