diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 231007ba907127285e6f83b0635ab8a33823b38c..7c683827024b6a93c6b69c6e0151e34feddf5ef8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +Fri Apr 2 11:58:22 1999 Michael Hayes <m.hayes@elec.canterbury.ac.nz> + + * config/c4x/c4x.c (c4x_emit_move_sequence): Force invalid QImode + constants into memory if we get called directly from gen_move_insn + rather than emit_move_insn. + (c4x_legitimize_address): Fix up LABEL_REF addresses. + Thu Apr 1 12:04:05 1999 Jim Wilson <wilson@cygnus.com> * expr.c (store_field): When check direct_store, assume all complex diff --git a/gcc/config/c4x/c4x.c b/gcc/config/c4x/c4x.c index c1309f15ea91f4de1ffdfcb0f3b3bbb1eb61da25..e8cee04cf403afa6f3076a5a4912e99967bf40f9 100644 --- a/gcc/config/c4x/c4x.c +++ b/gcc/config/c4x/c4x.c @@ -1058,6 +1058,13 @@ c4x_emit_move_sequence (operands, mode) constants... */ op1 = force_const_mem (mode, op1); } + else if (mode == QImode && CONSTANT_P (op1) && ! LEGITIMATE_CONSTANT_P (op1)) + { + /* We shouldn't need this test if only emit_move_insn was called. + However, some routines call gen_move_insn which doesn't check that + the constants are legitimate. */ + op1 = force_const_mem (mode, op1); + } else if (mode == HImode && CONSTANT_P (op1) && ! LEGITIMATE_CONSTANT_P (op1)) { /* We could load all sorts of constants in two goes by pulling all @@ -1431,7 +1438,8 @@ c4x_legitimize_address (orig, mode) rtx orig ATTRIBUTE_UNUSED; enum machine_mode mode ATTRIBUTE_UNUSED; { - if (GET_CODE (orig) == SYMBOL_REF) + if (GET_CODE (orig) == SYMBOL_REF + || GET_CODE (orig) == LABEL_REF) { if (mode == HImode || mode == HFmode) { @@ -2183,9 +2191,9 @@ static int c4x_K_constant (op) rtx op; { - if (TARGET_C3X) + if (TARGET_C3X || ! c4x_immed_int_constant (op)) return 0; - return c4x_immed_int_constant (op) && IS_INT5_CONST (INTVAL (op)); + return IS_INT5_CONST (INTVAL (op)); } @@ -2876,7 +2884,7 @@ call_address_operand (op, mode) } -/* Symbolic operand. */ +/* Symbolic address operand. */ int symbolic_address_operand (op, mode) @@ -4387,4 +4395,3 @@ c4x_adjust_cost (insn, link, dep_insn, cost) else abort (); } -