aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Kenner <kenner@gcc.gnu.org>1992-04-13 07:19:34 -0400
committerRichard Kenner <kenner@gcc.gnu.org>1992-04-13 07:19:34 -0400
commit1a5b457d5730b4f83540da3a814c5909d9ada14b (patch)
tree2efd39ce86d9eaa810dcf16d460511160a787598
parent77f934bbbf75bddbe4f31482025c68d627fedda7 (diff)
downloadgcc-1a5b457d5730b4f83540da3a814c5909d9ada14b.zip
gcc-1a5b457d5730b4f83540da3a814c5909d9ada14b.tar.gz
gcc-1a5b457d5730b4f83540da3a814c5909d9ada14b.tar.bz2
*** empty log message ***
From-SVN: r733
-rw-r--r--gcc/cccp.c4
-rw-r--r--gcc/emit-rtl.c37
2 files changed, 33 insertions, 8 deletions
diff --git a/gcc/cccp.c b/gcc/cccp.c
index 979ad89..eb974de 100644
--- a/gcc/cccp.c
+++ b/gcc/cccp.c
@@ -3318,6 +3318,8 @@ handle_directive (ip, op)
*cp++ = *xp++;
SKIP_WHITE_SPACE (xp);
}
+ } else {
+ *cp++ = *xp++;
}
break;
@@ -3325,7 +3327,7 @@ handle_directive (ip, op)
case '\"':
{
register U_CHAR *bp1
- = skip_quoted_string (xp - 1, limit, ip->lineno, 0, 0, 0);
+ = skip_quoted_string (xp - 1, bp, ip->lineno, 0, 0, 0);
while (xp != bp1)
if (*xp == '\\') {
if (*++xp != '\n')
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index 82160f5..ef3aeb9 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -529,13 +529,36 @@ gen_lowpart_common (mode, x)
from the low-order part of the constant. */
else if (GET_MODE_CLASS (mode) == MODE_INT && GET_MODE (x) == VOIDmode
&& (GET_CODE (x) == CONST_INT || GET_CODE (x) == CONST_DOUBLE))
- return (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_INT ? x
- : (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_INT
- && GET_CODE (x) == CONST_INT) ? x
- : gen_rtx (CONST_INT, VOIDmode,
- (GET_MODE_MASK (mode)
- & (GET_CODE (x) == CONST_INT
- ? INTVAL (x) : CONST_DOUBLE_LOW (x)))));
+ {
+ /* If MODE is twice the host word size, X is already the desired
+ representation. Otherwise, if MODE is wider than a word, we can't
+ do this. If MODE is exactly a word, return just one CONST_INT.
+ If MODE is smaller than a word, clear the bits that don't belong
+ in our mode, unless they and our sign bit are all one. So we get
+ either a reasonable negative value or a reasonable unsigned value
+ for this mode. */
+
+ if (GET_MODE_BITSIZE (mode) == 2 * HOST_BITS_PER_INT)
+ return x;
+ else if (GET_MODE_BITSIZE (mode) > HOST_BITS_PER_INT)
+ return 0;
+ else if (GET_MODE_BITSIZE (mode) == HOST_BITS_PER_INT)
+ return (GET_CODE (x) == CONST_INT ? x
+ : gen_rtx (CONST_INT, VOIDmode, CONST_DOUBLE_LOW (x)));
+ else
+ {
+ /* MODE must be narrower than HOST_BITS_PER_INT. */
+ int width = GET_MODE_BITSIZE (mode);
+ int val = (GET_CODE (x) == CONST_INT ? INTVAL (x)
+ : CONST_DOUBLE_LOW (x));
+
+ if (((val & ((-1) << (width - 1))) != ((-1) << (width - 1))))
+ val &= (1 << width) - 1;
+
+ return (GET_CODE (x) == CONST_INT && INTVAL (x) == val ? x
+ : gen_rtx (CONST_INT, VOIDmode, val));
+ }
+ }
/* Otherwise, we can't do this. */
return 0;