From dee4095a023e08b724ff60729643a62639cb43b6 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 1 Jul 2000 14:20:32 -0700 Subject: [PATCH] ia64.c (symbolic_operand): Reject CONST expressions with the low 13 bits set. * config/ia64/ia64.c (symbolic_operand): Reject CONST expressions with the low 13 bits set. (move_operand): Check for CONST|SYMBOL_REF|LABEL_REF directly. * config/ia64/ia64.md (movdi): Likewise. Expand a CONST with one of the low 13 bits into a CONST plus an adddi3. (load_symptr): Set RTX_UNCHANGING_P. From-SVN: r34821 --- gcc/ChangeLog | 9 +++++++++ gcc/config/ia64/ia64.c | 19 ++++++++++++++++++- gcc/config/ia64/ia64.md | 29 +++++++++++++++++++++++------ 3 files changed, 50 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35be3b208831..48eef23543b0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2000-07-01 Richard Henderson + + * config/ia64/ia64.c (symbolic_operand): Reject CONST expressions + with the low 13 bits set. + (move_operand): Check for CONST|SYMBOL_REF|LABEL_REF directly. + * config/ia64/ia64.md (movdi): Likewise. Expand a CONST with one + of the low 13 bits into a CONST plus an adddi3. + (load_symptr): Set RTX_UNCHANGING_P. + 2000-06-30 Mark Mitchell * Makefile.in (c-common.o): Don't depend on c-tree.h or c-lex.h. diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index ca6ee297d065..e6dbd107c387 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -186,6 +186,20 @@ symbolic_operand (op, mode) switch (GET_CODE (op)) { case CONST: + op = XEXP (op, 0); + if (GET_CODE (op) != PLUS) + return 0; + if (GET_CODE (XEXP (op, 0)) != SYMBOL_REF) + return 0; + op = XEXP (op, 1); + if (GET_CODE (op) != CONST_INT) + return 0; + /* Force the low 13 bits of the constant to zero so that we do not + use up so many GOT entries. */ + if (! TARGET_NO_PIC && ! TARGET_AUTO_PIC && (INTVAL (op) & 0x1fff) != 0) + return 0; + return 1; + case SYMBOL_REF: case LABEL_REF: return 1; @@ -270,7 +284,10 @@ move_operand (op, mode) rtx op; enum machine_mode mode; { - if (! TARGET_NO_PIC && symbolic_operand (op, mode)) + if (! TARGET_NO_PIC + && (GET_CODE (op) == CONST + || GET_CODE (op) == SYMBOL_REF + || GET_CODE (op) == LABEL_REF)) return 0; return general_operand (op, mode); diff --git a/gcc/config/ia64/ia64.md b/gcc/config/ia64/ia64.md index bb9c3f328407..c6bfb9f94ebf 100644 --- a/gcc/config/ia64/ia64.md +++ b/gcc/config/ia64/ia64.md @@ -255,7 +255,10 @@ { /* ??? Should generalize this, so that we can also support 32 bit pointers. */ - if (! TARGET_NO_PIC && symbolic_operand (operands[1], DImode)) + if (! TARGET_NO_PIC + && (GET_CODE (operands[1]) == CONST + || GET_CODE (operands[1]) == SYMBOL_REF + || GET_CODE (operands[1]) == LABEL_REF)) { rtx temp; @@ -273,6 +276,21 @@ emit_insn (gen_load_fptr (temp, operands[1])); else if (sdata_symbolic_operand (operands[1], DImode)) emit_insn (gen_load_gprel (temp, operands[1])); + else if (GET_CODE (operands[1]) == CONST + && GET_CODE (XEXP (operands[1], 0)) == PLUS + && GET_CODE (XEXP (XEXP (operands[1], 0), 1)) == CONST_INT + && (INTVAL (XEXP (XEXP (operands[1], 0), 1)) & 0x1fff) != 0) + { + HOST_WIDE_INT ofs = INTVAL (XEXP (XEXP (operands[1], 0), 1)); + rtx sym = XEXP (XEXP (operands[1], 0), 0); + rtx subtarget = no_new_pseudos ? temp : gen_reg_rtx (DImode); + + sym = plus_constant (sym, ofs & ~(HOST_WIDE_INT)0x1fff); + ofs &= 0x1fff; + + emit_insn (gen_load_symptr (subtarget, sym)); + emit_insn (gen_adddi3 (temp, subtarget, GEN_INT (ofs))); + } else emit_insn (gen_load_symptr (temp, operands[1])); @@ -358,14 +376,13 @@ (define_expand "load_symptr" [(set (match_dup 2) (plus:DI (reg:DI 1) (match_operand:DI 1 "symbolic_operand" ""))) - (set (match_operand:DI 0 "register_operand" "") (mem:DI (match_dup 2)))] + (set (match_operand:DI 0 "register_operand" "") (match_dup 3))] "" " { - if (reload_in_progress) - operands[2] = operands[0]; - else - operands[2] = gen_reg_rtx (DImode); + operands[2] = reload_in_progress ? operands[0] : gen_reg_rtx (DImode); + operands[3] = gen_rtx_MEM (DImode, operands[2]); + RTX_UNCHANGING_P (operands[3]) = 1; }") (define_insn "*load_symptr_internal1" -- 2.43.5