machmode.h (SCALAR_INT_MODE_P): New macro to test for scaler integer mode (MODE_INT or MODE_PARTIAL_INT).
* machmode.h (SCALAR_INT_MODE_P): New macro to test for scaler integer mode (MODE_INT or MODE_PARTIAL_INT). * explow.c (trunc_int_for_mode): Abort when the mode is not a scaler integer mode. * combine.c (expand_compound_operation): Don't expand Vector or Complex modes into shifts. (expand_field_assignment): Don't do bitwise arithmatic and shifts on Vector or Complex modes. (simplify_comparison): Don't call trunc_int_for_mode for VOIDmode. * recog.c (general_operand): Likewise. (immediate_operand): Likewise. (nonmemory_operand): Likewise. Co-Authored-By: Steve Ellcey <sje@cup.hp.com> From-SVN: r56443
This commit is contained in:
parent
35fb4cf611
commit
71012d9720
@ -1,3 +1,20 @@
|
|||||||
|
2002-08-19 Geoffrey Keating <geoffk@redhat.com>
|
||||||
|
Steve Ellcey <sje@cup.hp.com>
|
||||||
|
|
||||||
|
* machmode.h (SCALAR_INT_MODE_P): New macro to test for
|
||||||
|
scaler integer mode (MODE_INT or MODE_PARTIAL_INT).
|
||||||
|
* explow.c (trunc_int_for_mode): Abort when the mode is not
|
||||||
|
a scaler integer mode.
|
||||||
|
* combine.c (expand_compound_operation): Don't expand Vector
|
||||||
|
or Complex modes into shifts.
|
||||||
|
(expand_field_assignment): Don't do bitwise arithmatic and
|
||||||
|
shifts on Vector or Complex modes.
|
||||||
|
(simplify_comparison): Don't call trunc_int_for_mode
|
||||||
|
for VOIDmode.
|
||||||
|
* recog.c (general_operand): Likewise.
|
||||||
|
(immediate_operand): Likewise.
|
||||||
|
(nonmemory_operand): Likewise.
|
||||||
|
|
||||||
2002-08-19 David Edelsohn <edelsohn@gnu.org>
|
2002-08-19 David Edelsohn <edelsohn@gnu.org>
|
||||||
|
|
||||||
* config/rs6000/rs6000.c (rs6000_emit_set_const): Inline
|
* config/rs6000/rs6000.c (rs6000_emit_set_const): Inline
|
||||||
|
@ -5634,6 +5634,12 @@ expand_compound_operation (x)
|
|||||||
if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
|
if (GET_MODE_SIZE (GET_MODE (XEXP (x, 0))) > UNITS_PER_WORD)
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
|
/* Reject MODEs that aren't scalar integers because turning vector
|
||||||
|
or complex modes into shifts causes problems. */
|
||||||
|
|
||||||
|
if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
|
||||||
|
return x;
|
||||||
|
|
||||||
len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
|
len = GET_MODE_BITSIZE (GET_MODE (XEXP (x, 0)));
|
||||||
/* If the inner object has VOIDmode (the only way this can happen
|
/* If the inner object has VOIDmode (the only way this can happen
|
||||||
is if it is an ASM_OPERANDS), we can't do anything since we don't
|
is if it is an ASM_OPERANDS), we can't do anything since we don't
|
||||||
@ -5655,6 +5661,12 @@ expand_compound_operation (x)
|
|||||||
|| GET_MODE (XEXP (x, 0)) == VOIDmode)
|
|| GET_MODE (XEXP (x, 0)) == VOIDmode)
|
||||||
return x;
|
return x;
|
||||||
|
|
||||||
|
/* Reject MODEs that aren't scalar integers because turning vector
|
||||||
|
or complex modes into shifts causes problems. */
|
||||||
|
|
||||||
|
if (! SCALAR_INT_MODE_P (GET_MODE (XEXP (x, 0))))
|
||||||
|
return x;
|
||||||
|
|
||||||
len = INTVAL (XEXP (x, 1));
|
len = INTVAL (XEXP (x, 1));
|
||||||
pos = INTVAL (XEXP (x, 2));
|
pos = INTVAL (XEXP (x, 2));
|
||||||
|
|
||||||
@ -5862,12 +5874,12 @@ expand_field_assignment (x)
|
|||||||
|
|
||||||
compute_mode = GET_MODE (inner);
|
compute_mode = GET_MODE (inner);
|
||||||
|
|
||||||
/* Don't attempt bitwise arithmetic on non-integral modes. */
|
/* Don't attempt bitwise arithmetic on non scalar integer modes. */
|
||||||
if (! INTEGRAL_MODE_P (compute_mode))
|
if (! SCALAR_INT_MODE_P (compute_mode))
|
||||||
{
|
{
|
||||||
enum machine_mode imode;
|
enum machine_mode imode;
|
||||||
|
|
||||||
/* Something is probably seriously wrong if this matches. */
|
/* Don't do anything for vector or complex integral types. */
|
||||||
if (! FLOAT_MODE_P (compute_mode))
|
if (! FLOAT_MODE_P (compute_mode))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -10177,7 +10189,9 @@ simplify_comparison (code, pop0, pop1)
|
|||||||
|
|
||||||
/* Get the constant we are comparing against and turn off all bits
|
/* Get the constant we are comparing against and turn off all bits
|
||||||
not on in our mode. */
|
not on in our mode. */
|
||||||
const_op = trunc_int_for_mode (INTVAL (op1), mode);
|
const_op = INTVAL (op1);
|
||||||
|
if (mode != VOIDmode)
|
||||||
|
const_op = trunc_int_for_mode (const_op, mode);
|
||||||
op1 = GEN_INT (const_op);
|
op1 = GEN_INT (const_op);
|
||||||
|
|
||||||
/* If we are comparing against a constant power of two and the value
|
/* If we are comparing against a constant power of two and the value
|
||||||
|
@ -49,6 +49,10 @@ trunc_int_for_mode (c, mode)
|
|||||||
{
|
{
|
||||||
int width = GET_MODE_BITSIZE (mode);
|
int width = GET_MODE_BITSIZE (mode);
|
||||||
|
|
||||||
|
/* You want to truncate to a _what_? */
|
||||||
|
if (! SCALAR_INT_MODE_P (mode))
|
||||||
|
abort ();
|
||||||
|
|
||||||
/* Canonicalize BImode to 0 and STORE_FLAG_VALUE. */
|
/* Canonicalize BImode to 0 and STORE_FLAG_VALUE. */
|
||||||
if (mode == BImode)
|
if (mode == BImode)
|
||||||
return c & 1 ? STORE_FLAG_VALUE : 0;
|
return c & 1 ? STORE_FLAG_VALUE : 0;
|
||||||
|
@ -75,6 +75,11 @@ extern const enum mode_class mode_class[NUM_MACHINE_MODES];
|
|||||||
(GET_MODE_CLASS (MODE) == MODE_VECTOR_INT \
|
(GET_MODE_CLASS (MODE) == MODE_VECTOR_INT \
|
||||||
|| GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
|
|| GET_MODE_CLASS (MODE) == MODE_VECTOR_FLOAT)
|
||||||
|
|
||||||
|
/* Nonzero if MODE is a scalar integral mode. */
|
||||||
|
#define SCALAR_INT_MODE_P(MODE) \
|
||||||
|
(GET_MODE_CLASS (MODE) == MODE_INT \
|
||||||
|
|| GET_MODE_CLASS (MODE) == MODE_PARTIAL_INT)
|
||||||
|
|
||||||
/* Get the size in bytes of an object of mode MODE. */
|
/* Get the size in bytes of an object of mode MODE. */
|
||||||
|
|
||||||
extern const unsigned char mode_size[NUM_MACHINE_MODES];
|
extern const unsigned char mode_size[NUM_MACHINE_MODES];
|
||||||
|
@ -954,6 +954,7 @@ general_operand (op, mode)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (GET_CODE (op) == CONST_INT
|
if (GET_CODE (op) == CONST_INT
|
||||||
|
&& mode != VOIDmode
|
||||||
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1159,6 +1160,7 @@ immediate_operand (op, mode)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (GET_CODE (op) == CONST_INT
|
if (GET_CODE (op) == CONST_INT
|
||||||
|
&& mode != VOIDmode
|
||||||
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
@ -1241,6 +1243,7 @@ nonmemory_operand (op, mode)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (GET_CODE (op) == CONST_INT
|
if (GET_CODE (op) == CONST_INT
|
||||||
|
&& mode != VOIDmode
|
||||||
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
&& trunc_int_for_mode (INTVAL (op), mode) != INTVAL (op))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user