From 3c84bf1b0f6a338cef5cf5e5e7d2c08a1bf64a3d Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 29 Jun 1993 20:28:38 -0600 Subject: [PATCH] pa.c (singlemove_string): Use zdepi and ldil to load constants into registers when appropriate. * pa.c (singlemove_string): Use zdepi and ldil to load constants into registers when appropriate. From-SVN: r4799 --- gcc/config/pa/pa.c | 39 +++++++++++++++++++++++++++++---------- 1 file changed, 29 insertions(+), 10 deletions(-) diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 84fab97..142e97f 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -890,12 +890,7 @@ read_only_operand (operand) /* Return the best assembler insn template - for moving operands[1] into operands[0] as a fullword. - - For CONST_DOUBLE and CONST_INT we should also check for - other values we can load directly via zdepi, ldil, etc. - ??? Do this for 2.5. */ - + for moving operands[1] into operands[0] as a fullword. */ char * singlemove_string (operands) rtx *operands; @@ -917,16 +912,40 @@ singlemove_string (operands) operands[1] = gen_rtx (CONST_INT, VOIDmode, i); - if (INT_14_BITS (operands[1])) - return (INTVAL (operands[1]) == 0 ? "copy 0,%0" : "ldi %1,%0"); + /* See if we can handle this constant in a single instruction. */ + if (cint_ok_for_move (INTVAL (operands[1]))) + { + int intval = INTVAL (operands[1]); + + if (intval == 0) + return "copy 0,%0"; + else if (VAL_14_BITS_P (intval)) + return "ldi %1,%0"; + else if ((intval & 0x7ff) == 0) + return "ldil L'%1,%0"; + else if (zdepi_cint_p (intval)) + return "zdepi %Z1,%0"; + } else return "ldil L'%1,%0\n\tldo R'%1(%0),%0"; } else if (GET_CODE (operands[1]) == CONST_INT) { - if (INT_14_BITS (operands[1])) - return (INTVAL (operands[1]) == 0 ? "copy 0,%0" : "ldi %1,%0"); + /* See if we can handle this in a single instruction. */ + if (cint_ok_for_move (INTVAL (operands[1]))) + { + int intval = INTVAL (operands[1]); + + if (intval == 0) + return "copy 0,%0"; + else if (VAL_14_BITS_P (intval)) + return "ldi %1,%0"; + else if ((intval & 0x7ff) == 0) + return "ldil L'%1,%0"; + else if (zdepi_cint_p (intval)) + return "zdepi %Z1,%0"; + } else return "ldil L'%1,%0\n\tldo R'%1(%0),%0"; } -- 2.7.4