diff options
author | Torbjorn Granlund <tege@gnu.org> | 1995-03-22 21:22:57 +0000 |
---|---|---|
committer | Torbjorn Granlund <tege@gnu.org> | 1995-03-22 21:22:57 +0000 |
commit | 0c235d7e400af767f7d148951717d3e2bd4d792a (patch) | |
tree | d78184734f188d38b57e2eebbf26c98f977436a5 /gcc/config/pa/pa.c | |
parent | 1d306530f70ea17fbf1fb0aee4f66e428e326cdb (diff) | |
download | gcc-0c235d7e400af767f7d148951717d3e2bd4d792a.zip gcc-0c235d7e400af767f7d148951717d3e2bd4d792a.tar.gz gcc-0c235d7e400af767f7d148951717d3e2bd4d792a.tar.bz2 |
(singlemove_string): Handle SFmode constants again. Simplify.
(zdepi_cint_p): Make some variables HOST_WIDE_INT.
(lhs_lshift_cint_operand): Likewise.
(output_and): Likewise.
(output_ior): Likewise.
From-SVN: r9222
Diffstat (limited to 'gcc/config/pa/pa.c')
-rw-r--r-- | gcc/config/pa/pa.c | 81 |
1 files changed, 28 insertions, 53 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index e539494..a164cd0 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -403,7 +403,7 @@ int zdepi_cint_p (x) unsigned HOST_WIDE_INT x; { - unsigned lsb_mask, t; + unsigned HOST_WIDE_INT lsb_mask, t; /* This might not be obvious, but it's at least fast. This function is critcal; we don't have the time loops would take. */ @@ -471,7 +471,7 @@ lhs_lshift_cint_operand (op, mode) rtx op; enum machine_mode mode; { - unsigned x; + unsigned HOST_WIDE_INT x; if (GET_CODE (op) != CONST_INT) return 0; x = INTVAL (op) >> 4; @@ -1037,63 +1037,38 @@ char * singlemove_string (operands) rtx *operands; { + HOST_WIDE_INT intval; + if (GET_CODE (operands[0]) == MEM) return "stw %r1,%0"; - else if (GET_CODE (operands[1]) == MEM) + if (GET_CODE (operands[1]) == MEM) return "ldw %1,%0"; - else if (GET_CODE (operands[1]) == CONST_DOUBLE - && GET_MODE (operands[1]) == SFmode) + if (GET_CODE (operands[1]) == CONST_DOUBLE) { - abort (); -#if 0 - /* Switched off since it is wrong, and should never really be used - anyway. If we want to switch this on again, we have to make it use - the REAL_ARITHMETIC stuff. */ - int i; - union real_extract u; - union float_extract { float f; int i; } v; + long i; + REAL_VALUE_TYPE d; - bcopy (&CONST_DOUBLE_LOW (operands[1]), &u, sizeof u); - v.f = REAL_VALUE_TRUNCATE (SFmode, u.d); - i = v.i; + if (GET_MODE (operands[1]) != SFmode) + abort (); - operands[1] = GEN_INT (i); + /* Translate the CONST_DOUBLE to a CONST_INT with the same target + bit pattern. */ + REAL_VALUE_FROM_CONST_DOUBLE (d, operands[1]); + REAL_VALUE_TO_TARGET_SINGLE (d, i); - /* See if we can handle this constant in a single instruction. */ - if (cint_ok_for_move (INTVAL (operands[1]))) - { - HOST_WIDE_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"; -#endif + operands[1] = GEN_INT (i); + /* Fall through to CONST_INT case. */ } - - else if (GET_CODE (operands[1]) == CONST_INT) + if (GET_CODE (operands[1]) == CONST_INT) { - /* 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"; - } + intval = INTVAL (operands[1]); + + 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"; } @@ -1731,7 +1706,7 @@ output_and (operands) { if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) != 0) { - unsigned mask = INTVAL (operands[2]); + unsigned HOST_WIDE_INT mask = INTVAL (operands[2]); int ls0, ls1, ms0, p, len; for (ls0 = 0; ls0 < 32; ls0++) @@ -1780,7 +1755,7 @@ char * output_ior (operands) rtx *operands; { - unsigned mask = INTVAL (operands[2]); + unsigned HOST_WIDE_INT mask = INTVAL (operands[2]); int bs0, bs1, p, len; if (INTVAL (operands[2]) == 0) @@ -1794,7 +1769,7 @@ output_ior (operands) if ((mask & (1 << bs1)) == 0) break; - if (bs1 != 32 && ((unsigned) 1 << bs1) <= mask) + if (bs1 != 32 && ((unsigned HOST_WIDE_INT) 1 << bs1) <= mask) abort(); p = 31 - bs0; |