|
From: Dave A. <ai...@us...> - 2002-10-17 13:17:24
|
Update of /cvsroot/linux-vax/tools/src/gcc/config/vax
In directory usw-pr-cvs1:/tmp/cvs-serv8286/src/gcc/config/vax
Modified Files:
Tag: tools-linuxvax-dynamic-dev
vax.c vax.h
Log Message:
DA: no need for JUMP in vax.h linux.h has it already..
vax.c merge complete..
Index: vax.c
===================================================================
RCS file: /cvsroot/linux-vax/tools/src/gcc/config/vax/vax.c,v
retrieving revision 2.12.2.1
retrieving revision 2.12.2.2
diff -u -r2.12.2.1 -r2.12.2.2
--- vax.c 12 Oct 2002 11:41:55 -0000 2.12.2.1
+++ vax.c 17 Oct 2002 13:17:21 -0000 2.12.2.2
@@ -80,6 +80,22 @@
register rtx reg1, breg, ireg;
rtx offset;
rtx orig_addr = addr;
+
+#if 0
+ if (GET_CODE (addr) == PLUS && GET_CODE (XEXP (addr, 1)) == CONST)
+ debug_rtx (addr);
+#endif
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ if (flag_pic && GET_CODE (addr) == CONST &&
+ GET_CODE (XEXP (addr, 0)) == PLUS &&
+ GET_CODE (XEXP (XEXP (addr, 0), 0)) == SYMBOL_REF &&
+ !SYMBOL_REF_FLAG (XEXP (XEXP (addr, 0), 0)) &&
+ GET_CODE (XEXP (XEXP (addr, 0), 1)) == CONST_INT)
+ {
+ fatal_insn ("Non-PIC operand escaped:\n", addr);
+ }
+#endif
+
retry:
switch (GET_CODE (addr))
{
@@ -238,6 +254,16 @@
}
ireg = XEXP (addr, 1);
}
+ else if (GET_CODE (addr) == SYMBOL_REF)
+ {
+ output_addr_const (file, addr);
+ if (offset != 0)
+ {
+ fputc ('+', file);
+ output_address (offset);
+ offset = 0;
+ }
+ }
else
{
debug_rtx (orig_addr);
@@ -253,7 +279,12 @@
/* If REG1 is non-zero, figure out if it is a base or index register. */
if (reg1)
{
- if (breg != 0 || (offset && GET_CODE (offset) == MEM))
+ if (breg != 0
+ || GET_CODE (addr) == SYMBOL_REF
+ || (offset
+ && (GET_CODE (offset) == MEM
+ || GET_CODE (offset) == SYMBOL_REF
+ || GET_CODE (offset) == CONST)))
{
if (ireg)
{
@@ -709,6 +740,338 @@
}
return 0;
+}
+
+/* Nonzero if X is a hard reg that can be used as an index. */
+#define XREG_OK_FOR_INDEX_P(X, STRICT) (!(STRICT) || REGNO_OK_FOR_INDEX_P (REGNO (X)))
+/* Nonzero if X is a hard reg that can be used as a base reg. */
+#define XREG_OK_FOR_BASE_P(X, STRICT) (!(STRICT) || REGNO_OK_FOR_BASE_P (REGNO (X)))
+
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+
+/* Re-definition of CONSTANT_ADDRESS_P, which is true only when there
+ are no SYMBOL_REFs for external symbols present and allow valid
+ addressing modes. */
+
+#define INDIRECTABLE_CONSTANT_ADDRESS_P(X, INDEXED, INDIRECT) \
+ (GET_CODE (X) == LABEL_REF \
+ || (!INDEXED && GET_CODE (X) == SYMBOL_REF \
+ && (!INDIRECT || SYMBOL_REF_FLAG (X))) \
+ || (!INDEXED && GET_CODE (X) == CONST \
+ && GET_CODE (XEXP ((X), 0)) == PLUS \
+ && GET_CODE (XEXP (XEXP ((X), 0), 0)) == SYMBOL_REF \
+ && ((!INDIRECT && !flag_pic) \
+ || SYMBOL_REF_FLAG (XEXP (XEXP ((X), 0), 0)))) \
+ || GET_CODE (X) == CONST_INT)
+
+/* Non-zero if X is an address which can be indirected. External symbols
+ could be in a sharable image library, so we disallow those. */
+
+#define INDIRECTABLE_ADDRESS_P(X, STRICT, INDEXED, INDIRECT) \
+ (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, INDIRECT) \
+ || (GET_CODE (X) == REG && XREG_OK_FOR_BASE_P (X, STRICT)) \
+ || (GET_CODE (X) == PLUS \
+ && GET_CODE (XEXP (X, 0)) == REG \
+ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
+ && GET_CODE (XEXP (X, 1)) != SYMBOL_REF \
+ && !(GET_CODE (XEXP (X, 1)) == CONST \
+ && GET_CODE (XEXP (XEXP (X, 1), 0)) == PLUS \
+ && GET_CODE (XEXP (XEXP (XEXP (X, 1), 0), 0)) == SYMBOL_REF) \
+ && INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (X, 1), INDEXED, INDIRECT)))
+
+#else /* not NO_EXTERNAL_INDIRECT_ADDRESS */
+
+#define INDIRECTABLE_CONSTANT_ADDRESS_P(X, INDEXED, INDIRECT) \
+ CONSTANT_ADDRESS_P (X)
+
+/* Non-zero if X is an address which can be indirected. */
+#define INDIRECTABLE_ADDRESS_P(X, STRICT, INDEXED, INDIRECT) \
+ (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, INDIRECT) \
+ || (GET_CODE (X) == REG && XREG_OK_FOR_BASE_P (X, STRICT)) \
+ || (GET_CODE (X) == PLUS \
+ && GET_CODE (XEXP (X, 0)) == REG \
+ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
+ && CONSTANT_ADDRESS_P (XEXP (X, 1))))
+
+#endif /* not NO_EXTERNAL_INDIRECT_ADDRESS */
+
+/* Go to ADDR if X is a valid address not using indexing.
+ (This much is the easy part.) */
+#define GO_IF_NONINDEXED_ADDRESS(X, ADDR, STRICT, INDEXED) \
+{ register rtx xfoob = (X); \
+ if (GET_CODE (X) == REG) \
+ { \
+ extern rtx *reg_equiv_mem; \
+ if (! reload_in_progress) \
+ goto ADDR; \
+ if (!STRICT) \
+ { \
+ if ((xfoob = reg_equiv_mem[REGNO (xfoob)]) == 0) \
+ goto ADDR; \
+ } \
+ if (INDIRECTABLE_ADDRESS_P (xfoob, STRICT, INDEXED, 0)) \
+ goto ADDR; \
+ } \
+ if (INDIRECTABLE_CONSTANT_ADDRESS_P (X, INDEXED, 0)) goto ADDR; \
+ if (INDIRECTABLE_ADDRESS_P (X, STRICT, INDEXED, 0)) goto ADDR; \
+ xfoob = XEXP (X, 0); \
+ if (GET_CODE (X) == MEM \
+ && INDIRECTABLE_ADDRESS_P (xfoob, STRICT, INDEXED, !TARGET_INDIRECT)) \
+ goto ADDR; \
+ if ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_INC) \
+ && GET_CODE (xfoob) == REG \
+ && XREG_OK_FOR_BASE_P (xfoob, STRICT)) \
+ goto ADDR; }
+
+/* 1 if PROD is either a reg times size of mode MODE
+ or just a reg, if MODE is just one byte.
+ This macro's expansion uses the temporary variables xfoo0 and xfoo1
+ that must be declared in the surrounding context. */
+#define INDEX_TERM_P(PROD, MODE, STRICT) \
+(GET_MODE_SIZE (MODE) == 1 \
+ ? (GET_CODE (PROD) == REG && XREG_OK_FOR_BASE_P (PROD, STRICT)) \
+ : (GET_CODE (PROD) == MULT \
+ && \
+ (xfoo0 = XEXP (PROD, 0), xfoo1 = XEXP (PROD, 1), \
+ ((GET_CODE (xfoo0) == CONST_INT \
+ && GET_CODE (xfoo1) == REG \
+ && INTVAL (xfoo0) == (int)GET_MODE_SIZE (MODE) \
+ && XREG_OK_FOR_INDEX_P (xfoo1, STRICT)) \
+ || \
+ (GET_CODE (xfoo1) == CONST_INT \
+ && GET_CODE (xfoo0) == REG \
+ && INTVAL (xfoo1) == (int)GET_MODE_SIZE (MODE) \
+ && XREG_OK_FOR_INDEX_P (xfoo0, STRICT))))))
+
+/* Go to ADDR if X is the sum of a register
+ and a valid index term for mode MODE. */
+#define GO_IF_REG_PLUS_INDEX(X, MODE, ADDR, STRICT) \
+{ register rtx xfooa; \
+ if (GET_CODE (X) == PLUS) \
+ { if (GET_CODE (XEXP (X, 0)) == REG \
+ && XREG_OK_FOR_BASE_P (XEXP (X, 0), STRICT) \
+ && (xfooa = XEXP (X, 1), \
+ INDEX_TERM_P (xfooa, MODE, STRICT))) \
+ goto ADDR; \
+ if (GET_CODE (XEXP (X, 1)) == REG \
+ && XREG_OK_FOR_BASE_P (XEXP (X, 1), STRICT) \
+ && (xfooa = XEXP (X, 0), \
+ INDEX_TERM_P (xfooa, MODE, STRICT))) \
+ goto ADDR; } }
+
+int
+legitimate_pic_operand_p(x, strict)
+ register rtx x;
+ int strict ATTRIBUTE_UNUSED;
+{
+ if (GET_CODE (x) != SYMBOL_REF
+ && !(GET_CODE (x) == CONST
+ && GET_CODE (XEXP (x, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (x, 0), 0)) == SYMBOL_REF))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+int
+legitimate_address_p(mode, xbar, strict)
+ enum machine_mode mode;
+ register rtx xbar;
+ int strict;
+{
+ register rtx xfoo, xfoo0, xfoo1;
+ int from = __LINE__;
+ GO_IF_NONINDEXED_ADDRESS (xbar, win, strict, 0);
+ if (GET_CODE (xbar) == PLUS)
+ {
+ /* Handle <address>[index] represented with index-sum outermost */
+ xfoo = XEXP (xbar, 0);
+ if (INDEX_TERM_P (xfoo, mode, strict))
+ {
+ from = __LINE__;
+ GO_IF_NONINDEXED_ADDRESS (XEXP (xbar, 1), win, strict, 0);
+ }
+ xfoo = XEXP (xbar, 1);
+ if (INDEX_TERM_P (xfoo, mode, strict))
+ {
+ from = __LINE__;
+ GO_IF_NONINDEXED_ADDRESS (XEXP (xbar, 0), win, strict, 0);
+ }
+ /* Handle offset(reg)[index] with offset added outermost */
+ if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (xbar, 0), 1, 0))
+ {
+ from = __LINE__;
+ if (GET_CODE (XEXP (xbar, 1)) == REG
+ && XREG_OK_FOR_BASE_P (XEXP (xbar, 1), strict))
+ goto win;
+ from = __LINE__;
+ GO_IF_REG_PLUS_INDEX (XEXP (xbar, 1), mode, win, strict);
+ }
+ if (INDIRECTABLE_CONSTANT_ADDRESS_P (XEXP (xbar, 1), 1, 0))
+ {
+ from = __LINE__;
+ if (GET_CODE (XEXP (xbar, 0)) == REG
+ && XREG_OK_FOR_BASE_P (XEXP (xbar, 0), strict))
+ goto win;
+ from = __LINE__;
+ GO_IF_REG_PLUS_INDEX (XEXP (xbar, 0), mode, win, strict);
+ }
+ }
+ return 0;
+
+ win:
+#if 0
+ if (strict)
+ {
+ fprintf(stderr, "line=%d\n", from);
+ debug_rtx (xbar);
+ }
+#endif
+ if (flag_pic && GET_CODE (xbar) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && !SYMBOL_REF_FLAG (xbar)
+#endif
+ && mode == DImode)
+ return 0;
+ return 1;
+}
+
+int
+vax_symbolic_operand (op, mode)
+ register rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ if (!general_operand(op, mode))
+ return 0;
+ if (GET_CODE (op) == SYMBOL_REF
+ || GET_CODE (op) == LABEL_REF
+ || (GET_CODE (op) == CONST
+ && GET_CODE (XEXP (op, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && (SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0)) || !flag_pic)
+#endif
+ && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT)
+ || (GET_CODE (op) == PLUS
+ && GET_CODE (XEXP (op, 1)) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && (SYMBOL_REF_FLAG (XEXP (op, 1)) || !flag_pic)
+#endif
+ && GET_CODE (XEXP (op, 0)) == CONST_INT)
+ || (GET_CODE (op) == PLUS
+ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && (SYMBOL_REF_FLAG (XEXP (op, 0)) || !flag_pic)
+#endif
+ && GET_CODE (XEXP (op, 1)) == CONST_INT))
+ {
+ return 1;
+ }
+ return 0;
+}
+
+int
+vax_nonsymbolic_operand (op, mode)
+ register rtx op;
+ enum machine_mode mode ATTRIBUTE_UNUSED;
+{
+ if (!general_operand(op, mode))
+ return 0;
+ if (GET_CODE (op) == SYMBOL_REF
+ || GET_CODE (op) == LABEL_REF
+ || (GET_CODE (op) == CONST
+ && GET_CODE (XEXP (op, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF)
+ || (GET_CODE (op) == MEM
+ && GET_CODE (XEXP (op, 0)) == CONST
+ && GET_CODE (XEXP (XEXP (op, 0), 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (XEXP (op, 0), 0), 0)) == SYMBOL_REF)
+ || (GET_CODE (op) == PLUS
+ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+ && GET_CODE (XEXP (op, 1)) == CONST_INT))
+ return 0;
+#if 0
+ if (GET_CODE (op) == PLUS)
+ debug_rtx (op);
+#endif
+ if (vax_symbolic_operand (op, mode))
+ return 0;
+#if 0
+ if (GET_CODE (op) != CONST_INT && GET_CODE (op) != REG &&
+ GET_CODE (op) != MEM)
+ debug_rtx (op);
+#endif
+ return 1;
+}
+
+int
+vax_lvalue_operand(op, mode)
+ register rtx op;
+ enum machine_mode mode;
+{
+ if (!general_operand(op, mode))
+ return 0;
+ return GET_CODE (op) == REG
+ || GET_CODE (op) == SUBREG
+ || GET_CODE (op) == MEM
+ || GET_CODE (op) == CONCAT
+ || GET_CODE (op) == PARALLEL
+ || GET_CODE (op) == STRICT_LOW_PART;
+}
+
+int
+vax_general_operand(op, mode)
+ register rtx op;
+ enum machine_mode mode;
+{
+ if (!general_operand(op, mode))
+ return 0;
+ if (!flag_pic)
+ return 1;
+ if ((GET_CODE (op) == CONST
+ && GET_CODE (XEXP (op, 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (op, 0), 0)) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && !SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0))
+#endif
+ ) || (GET_CODE (op) == MEM
+ && GET_CODE (XEXP (op, 0)) == CONST
+ && GET_CODE (XEXP (XEXP (op, 0), 0)) == PLUS
+ && GET_CODE (XEXP (XEXP (XEXP (op, 0), 0), 0)) == SYMBOL_REF
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && !SYMBOL_REF_FLAG (XEXP (XEXP (op, 0), 0))
+#endif
+ ) || (GET_CODE (op) == PLUS
+ && GET_CODE (XEXP (op, 0)) == SYMBOL_REF
+ && GET_CODE (XEXP (op, 1)) == CONST_INT
+#ifdef NO_EXTERNAL_INDIRECT_ADDRESS
+ && !SYMBOL_REF_FLAG (XEXP (op, 0))
+#endif
+ ))
+ return 0;
+#if 0
+ debug_rtx (op);
+#endif
+ return 1;
+}
+
+int
+vax_reg_used_p(operand, reg)
+ rtx operand;
+ int reg;
+{
+ if (GET_CODE (operand) == REG && REGNO (operand) == reg)
+ return 1;
+ if (GET_CODE (operand) == MEM ||
+ GET_CODE (operand) == PRE_DEC ||
+ GET_CODE (operand) == POST_DEC)
+ return vax_reg_used_p (XEXP(operand, 0), reg);
+ if (GET_CODE (operand) == PLUS ||
+ GET_CODE (operand) == MULT)
+ return vax_reg_used_p (XEXP(operand, 0), reg) ||
+ vax_reg_used_p (XEXP(operand, 1), reg);
+ return 0;
}
#ifdef VMS_TARGET
Index: vax.h
===================================================================
RCS file: /cvsroot/linux-vax/tools/src/gcc/config/vax/vax.h,v
retrieving revision 2.17.2.3
retrieving revision 2.17.2.4
diff -u -r2.17.2.3 -r2.17.2.4
--- vax.h 17 Oct 2002 12:50:00 -0000 2.17.2.3
+++ vax.h 17 Oct 2002 13:17:21 -0000 2.17.2.4
@@ -878,10 +878,6 @@
jumps to the default label instead. */
#define CASE_DROPS_THROUGH
-/* Indicate that jump tables go in the text section. This is
- necessary when compiling PIC code. */
-#define JUMP_TABLES_IN_TEXT_SECTION 1
-
/* Specify the tree operation to be used to convert reals to integers. */
#define IMPLICIT_FIX_EXPR FIX_ROUND_EXPR
|