XCHGB has higher latency than ROLW for non-pentium4 targets, so it
should be avoided. Switch from the preferred_for_size/preferred_for_speed
attributes to the "enabled" attribute to hard-disable unwanted alternatives.

    PR target/126433

gcc/ChangeLog:

    * config/i386/i386.md (*bswaphi2_movbe): Use enabled attribute.
    Remove preferred_for_speed and preferred_for_size attributes.
    (*bswaphi2): Ditto.
    (bswaphisi2_lowpart): Ditto.

gcc/testsuite/ChangeLog:

    * gcc.target/i386/xchg-1.c: Scan for ROL instead of XCHG.
    * gcc.target/i386/xchg-2.c: Use -O2 -march=pentium4 to emit XCHG.

Bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.

Uros.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index f762b2ccea2..230fcb576d0 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -23693,16 +23693,13 @@ (define_insn "*bswaphi2_movbe"
    (set_attr "c86_decode" "vector,*,*,*")
    (set_attr "bdver1_decode" "double,*,*,*")
    (set_attr "mode" "QI,HI,HI,HI")
-   (set (attr "preferred_for_size")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "false")
-          ]
-          (symbol_ref "true")))
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "!TARGET_USE_XCHGB")
+   (set (attr "enabled")
+     (cond [(eq_attr "alternative" "0")
+              (symbol_ref "TARGET_USE_XCHGB")
+           (eq_attr "alternative" "1")
+              (symbol_ref "!TARGET_USE_XCHGB")
           ]
-          (symbol_ref "true")))])
+          (const_string "*")))])
 
 (define_insn "*bswaphi2"
   [(set (match_operand:HI 0 "register_operand" "=Q,r")
@@ -23719,16 +23716,13 @@ (define_insn "*bswaphi2"
    (set_attr "c86_decode" "vector,*")
    (set_attr "bdver1_decode" "double,*")
    (set_attr "mode" "QI,HI")
-   (set (attr "preferred_for_size")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "false")
-          ]
-          (symbol_ref "true")))
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "!TARGET_USE_XCHGB")
+   (set (attr "enabled")
+     (cond [(eq_attr "alternative" "0")
+              (symbol_ref "TARGET_USE_XCHGB")
+           (eq_attr "alternative" "1")
+              (symbol_ref "!TARGET_USE_XCHGB")
           ]
-          (symbol_ref "true")))])
+          (const_string "*")))])
 
 (define_insn "bswaphisi2_lowpart"
   [(set (match_operand:SI 0 "register_operand" "=Q,r")
@@ -23748,16 +23742,13 @@ (define_insn "bswaphisi2_lowpart"
    (set_attr "c86_decode" "vector,*")
    (set_attr "bdver1_decode" "double,*")
    (set_attr "mode" "QI,HI")
-   (set (attr "preferred_for_size")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "false")
-          ]
-          (symbol_ref "true")))
-   (set (attr "preferred_for_speed")
-     (cond [(eq_attr "alternative" "1")
-             (symbol_ref "!TARGET_USE_XCHGB")
+   (set (attr "enabled")
+     (cond [(eq_attr "alternative" "0")
+              (symbol_ref "TARGET_USE_XCHGB")
+           (eq_attr "alternative" "1")
+              (symbol_ref "!TARGET_USE_XCHGB")
           ]
-          (symbol_ref "true")))])
+          (const_string "*")))])
 
 (define_expand "bitreverse<mode>2"
   [(set (match_operand:SWIDWI 0 "register_operand")
diff --git a/gcc/testsuite/gcc.target/i386/xchg-1.c 
b/gcc/testsuite/gcc.target/i386/xchg-1.c
index ea9fc7a8b14..f3e8f84ddf4 100644
--- a/gcc/testsuite/gcc.target/i386/xchg-1.c
+++ b/gcc/testsuite/gcc.target/i386/xchg-1.c
@@ -6,4 +6,4 @@ unsigned short good(unsigned short a)
        return (a >> 8 | a << 8);
 }
 
-/* { dg-final { scan-assembler "\[ \t\]xchg" } } */
+/* { dg-final { scan-assembler "\[ \t\]rol" } } */
diff --git a/gcc/testsuite/gcc.target/i386/xchg-2.c 
b/gcc/testsuite/gcc.target/i386/xchg-2.c
index f00fb0f2115..9cd02eb310b 100644
--- a/gcc/testsuite/gcc.target/i386/xchg-2.c
+++ b/gcc/testsuite/gcc.target/i386/xchg-2.c
@@ -1,9 +1,9 @@
-/* { dg-do compile } */
-/* { dg-options "-Os" } */
+/* { dg-do compile { target ia32 } } */
+/* { dg-options "-O2 -march=pentium4" } */
 
 unsigned short good(unsigned short a)
 {
        return (a >> 8 | a << 8);
 }
 
-/* { dg-final { scan-assembler "xchgb" } } */
+/* { dg-final { scan-assembler "\[ \t\]xchg" } } */

Reply via email to