]> gcc.gnu.org Git - gcc.git/commitdiff
RISC-V: Also invert the cond-move condition for GEU and LEU
authorMaciej W. Rozycki <macro@embecosm.com>
Wed, 22 Nov 2023 01:18:25 +0000 (01:18 +0000)
committerJeff Law <jlaw@ventanamicro.com>
Wed, 22 Nov 2023 05:05:12 +0000 (22:05 -0700)
Update `riscv_expand_conditional_move' and handle the missing GEU and
LEU operators there, avoiding an extraneous conditional set operation,
such as with this output:

sgtu a0,a0,a1
seqz a1,a0
czero.eqz a3,a3,a1
czero.nez a1,a2,a1
or a0,a1,a3

produced when optimizing for Zicond targets from:

int
movsigtu (int w, int x, int y, int z)
{
  return w > x ? y : z;
}

These operators can be inverted producing optimal code such as this:

sgtu a1,a0,a1
czero.nez a3,a3,a1
czero.eqz a1,a2,a1
or a0,a1,a3

which this change causes to happen.

gcc/
* config/riscv/riscv.cc (riscv_expand_conditional_move): Also
invert the condition for GEU and LEU.

(cherry picked from commit db9d825b212994e89dabc710c61944552eb1fe90)

gcc/config/riscv/riscv.cc

index e5f09c024ccf16f414c7b18b6da8af1a6aa8d5b2..c7de7720c39a392d5c9c707146347332df77a5fb 100644 (file)
@@ -4171,7 +4171,7 @@ riscv_expand_conditional_move (rtx dest, rtx op, rtx cons, rtx alt)
          /* If riscv_expand_int_scc inverts the condition, then it will
             flip the value of INVERT.  We need to know where so that
             we can adjust it for our needs.  */
-         if (code == LE || code == GE)
+         if (code == LE || code == LEU || code == GE || code == GEU)
            invert_ptr = &invert;
 
          /* Emit an scc like instruction into a temporary
This page took 0.077634 seconds and 5 git commands to generate.