static int indirectable_constant_address_p (rtx x) { if (!CONSTANT_ADDRESS_P (x)) return 0; if (GET_CODE (x) == CONST && GET_CODE (XEXP ((x), 0)) == PLUS) x = XEXP (XEXP (x, 0), 0); if (GET_CODE (x) == SYMBOL_REF && !SYMBOL_REF_LOCAL_P (x)) return 0; return 1; }
int legitimate_address2(enum machine_mode MODE,rtx X) { rtx op1,op2; if(CONSTANT_ADDRESS_P(X)) return 1; if(GET_CODE(X)==REG) return 1; return 0; }
/*Non-strict definition*/ int legitimate_address2(enum machine_mode MODE,rtx X) { rtx op1,op2; if(CONSTANT_ADDRESS_P(X)) return 1; if(GET_CODE(X)==REG && non_strict_base_reg(REGNO(X))) return 1; return 0; }
static bool can_simplify_addr (rtx addr) { rtx reg; if (CONSTANT_ADDRESS_P (addr)) return false; if (GET_CODE (addr) == PLUS) reg = XEXP (addr, 0); else reg = addr; return (!REG_P (reg) || (REGNO (reg) != FRAME_POINTER_REGNUM && REGNO (reg) != HARD_FRAME_POINTER_REGNUM && REGNO (reg) != ARG_POINTER_REGNUM)); }
void print_operand_address (FILE * file, rtx addr) { rtx reg1, breg, ireg; rtx offset; retry: switch (GET_CODE (addr)) { case MEM: fprintf (file, "*"); addr = XEXP (addr, 0); goto retry; case REG: fprintf (file, "(%s)", reg_names[REGNO (addr)]); break; case PRE_DEC: fprintf (file, "-(%s)", reg_names[REGNO (XEXP (addr, 0))]); break; case POST_INC: fprintf (file, "(%s)+", reg_names[REGNO (XEXP (addr, 0))]); break; case PLUS: /* There can be either two or three things added here. One must be a REG. One can be either a REG or a MULT of a REG and an appropriate constant, and the third can only be a constant or a MEM. We get these two or three things and put the constant or MEM in OFFSET, the MULT or REG in IREG, and the REG in BREG. If we have a register and can't tell yet if it is a base or index register, put it into REG1. */ reg1 = 0; ireg = 0; breg = 0; offset = 0; if (CONSTANT_ADDRESS_P (XEXP (addr, 0)) || GET_CODE (XEXP (addr, 0)) == MEM) { offset = XEXP (addr, 0); addr = XEXP (addr, 1); } else if (CONSTANT_ADDRESS_P (XEXP (addr, 1)) || GET_CODE (XEXP (addr, 1)) == MEM) { offset = XEXP (addr, 1); addr = XEXP (addr, 0); } else if (GET_CODE (XEXP (addr, 1)) == MULT) { ireg = XEXP (addr, 1); addr = XEXP (addr, 0); } else if (GET_CODE (XEXP (addr, 0)) == MULT) { ireg = XEXP (addr, 0); addr = XEXP (addr, 1); } else if (GET_CODE (XEXP (addr, 1)) == REG) { reg1 = XEXP (addr, 1); addr = XEXP (addr, 0); } else if (GET_CODE (XEXP (addr, 0)) == REG) { reg1 = XEXP (addr, 0); addr = XEXP (addr, 1); } else gcc_unreachable (); if (GET_CODE (addr) == REG) { if (reg1) ireg = addr; else reg1 = addr; } else if (GET_CODE (addr) == MULT) ireg = addr; else { gcc_assert (GET_CODE (addr) == PLUS); if (CONSTANT_ADDRESS_P (XEXP (addr, 0)) || GET_CODE (XEXP (addr, 0)) == MEM) { if (offset) { if (GET_CODE (offset) == CONST_INT) offset = plus_constant (XEXP (addr, 0), INTVAL (offset)); else { gcc_assert (GET_CODE (XEXP (addr, 0)) == CONST_INT); offset = plus_constant (offset, INTVAL (XEXP (addr, 0))); } } offset = XEXP (addr, 0); } else if (GET_CODE (XEXP (addr, 0)) == REG) { if (reg1) ireg = reg1, breg = XEXP (addr, 0), reg1 = 0; else reg1 = XEXP (addr, 0); } else { gcc_assert (GET_CODE (XEXP (addr, 0)) == MULT); gcc_assert (!ireg); ireg = XEXP (addr, 0); } if (CONSTANT_ADDRESS_P (XEXP (addr, 1)) || GET_CODE (XEXP (addr, 1)) == MEM) { if (offset) { if (GET_CODE (offset) == CONST_INT) offset = plus_constant (XEXP (addr, 1), INTVAL (offset)); else { gcc_assert (GET_CODE (XEXP (addr, 1)) == CONST_INT); offset = plus_constant (offset, INTVAL (XEXP (addr, 1))); } } offset = XEXP (addr, 1); } else if (GET_CODE (XEXP (addr, 1)) == REG) { if (reg1) ireg = reg1, breg = XEXP (addr, 1), reg1 = 0; else reg1 = XEXP (addr, 1); } else { gcc_assert (GET_CODE (XEXP (addr, 1)) == MULT); gcc_assert (!ireg); ireg = XEXP (addr, 1); } } /* If REG1 is nonzero, figure out if it is a base or index register. */ if (reg1) { if (breg != 0 || (offset && GET_CODE (offset) == MEM)) { gcc_assert (!ireg); ireg = reg1; } else breg = reg1; } if (offset != 0) output_address (offset); if (breg != 0) fprintf (file, "(%s)", reg_names[REGNO (breg)]); if (ireg != 0) { if (GET_CODE (ireg) == MULT) ireg = XEXP (ireg, 0); gcc_assert (GET_CODE (ireg) == REG); fprintf (file, "[%s]", reg_names[REGNO (ireg)]); } break; default: output_addr_const (file, addr); } }
static int indirectable_constant_address_p (rtx x) { return CONSTANT_ADDRESS_P (x); }