From: Richard Kenner Date: Mon, 13 Apr 1992 11:19:34 +0000 (-0400) Subject: *** empty log message *** X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=1a5b457d5730b4f83540da3a814c5909d9ada14b;p=gcc.git *** empty log message *** From-SVN: r733 --- diff --git a/gcc/cccp.c b/gcc/cccp.c index 979ad89f5ee..eb974de75dc 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 82160f54cd1..ef3aeb91ca2 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;