OSDN Git Service

gcc/
[pf3gnuchains/gcc-fork.git] / gcc / config / m68k / m68k.h
index c0a3f9e..5c5d59e 100644 (file)
@@ -284,9 +284,11 @@ Boston, MA 02110-1301, USA.  */
 #define STACK_BOUNDARY 16
 #define FUNCTION_BOUNDARY 16
 #define EMPTY_FIELD_BOUNDARY 16
+/* ColdFire strongly prefers a 32-bit aligned stack.  */
+#define PREFERRED_STACK_BOUNDARY (TARGET_COLDFIRE ? 32 : 16)
 
 /* No data type wants to be aligned rounder than this.
-   Most published ABIs say that ints should be aligned on 16 bit
+   Most published ABIs say that ints should be aligned on 16-bit
    boundaries, but CPUs with 32-bit busses get better performance
    aligned on 32-bit boundaries.  ColdFires without a misalignment
    module require 32-bit alignment.  */
@@ -308,13 +310,16 @@ Boston, MA 02110-1301, USA.  */
 
 /* For the m68k, we give the data registers numbers 0-7,
    the address registers numbers 010-017 (8-15),
-   and the 68881 floating point registers numbers 020-027 (16-24).
-   We also have a fake `arg-pointer' register 030 (25) used for
+   and the 68881 floating point registers numbers 020-027 (16-23).
+   We also have a fake `arg-pointer' register 030 (24) used for
    register elimination.  */
 #define FIRST_PSEUDO_REGISTER 25
 
 /* All m68k targets (except AmigaOS) use %a5 as the PIC register  */
-#define PIC_OFFSET_TABLE_REGNUM (flag_pic ? 13 : INVALID_REGNUM)
+#define PIC_OFFSET_TABLE_REGNUM                                \
+  (!flag_pic ? INVALID_REGNUM                          \
+   : reload_completed ? REGNO (pic_offset_table_rtx)   \
+   : PIC_REG)
 
 /* 1 for registers that have pervasive standard uses
    and are not available for the register allocator.
@@ -381,9 +386,8 @@ Boston, MA 02110-1301, USA.  */
         if (TEST_HARD_REG_BIT (x, i))                          \
          fixed_regs[i] = call_used_regs[i] = 1;                \
     }                                                          \
-  if (PIC_OFFSET_TABLE_REGNUM != INVALID_REGNUM)               \
-    fixed_regs[PIC_OFFSET_TABLE_REGNUM]                                \
-      = call_used_regs[PIC_OFFSET_TABLE_REGNUM] = 1;           \
+  if (flag_pic)                                                        \
+    fixed_regs[PIC_REG] = call_used_regs[PIC_REG] = 1;         \
 }
 
 /* On the m68k, ordinary registers hold 32 bits worth;
@@ -399,13 +403,12 @@ Boston, MA 02110-1301, USA.  */
 #define HARD_REGNO_RENAME_OK(OLD_REG, NEW_REG) \
   m68k_hard_regno_rename_ok (OLD_REG, NEW_REG)
 
-/* Value is true if hard register REGNO can hold a value of machine-mode MODE.
-   On the 68000, the cpu registers can hold any mode except bytes in
-   address registers, the 68881 registers can hold only SFmode or DFmode.  */
-
 #define HARD_REGNO_MODE_OK(REGNO, MODE) \
   m68k_regno_mode_ok ((REGNO), (MODE))
 
+#define SECONDARY_RELOAD_CLASS(CLASS, MODE, X) \
+  m68k_secondary_reload_class (CLASS, MODE, X)
+
 #define MODES_TIEABLE_P(MODE1, MODE2)                  \
   (! TARGET_HARD_FLOAT                                 \
    || ((GET_MODE_CLASS (MODE1) == MODE_FLOAT           \
@@ -533,47 +536,17 @@ extern enum reg_class regno_reg_class[];
          || GET_CODE (OP) == CONST))                   \
    :                                                   \
    (CODE) == 'Q'                                       \
-   ? (GET_CODE (OP) == MEM                             \
-      && GET_CODE (XEXP (OP, 0)) == REG)               \
+   ? m68k_matches_q_p (OP)                             \
    :                                                   \
    (CODE) == 'U'                                       \
-   ? (GET_CODE (OP) == MEM                             \
-      && GET_CODE (XEXP (OP, 0)) == PLUS               \
-      && GET_CODE (XEXP (XEXP (OP, 0), 0)) == REG      \
-      && GET_CODE (XEXP (XEXP (OP, 0), 1)) == CONST_INT) \
+   ? m68k_matches_u_p (OP)                             \
    :                                                   \
    (CODE) == 'W'                                       \
    ? const_call_operand (OP, VOIDmode)                 \
    : 0)
 
-/* On the m68k, use a data reg if possible when the
-   value is a constant in the range where moveq could be used
-   and we ensure that QImodes are reloaded into data regs.  */
-#define PREFERRED_RELOAD_CLASS(X,CLASS)  \
-  ((GET_CODE (X) == CONST_INT                  \
-    && (unsigned) (INTVAL (X) + 0x80) < 0x100  \
-    && (CLASS) != ADDR_REGS)                   \
-   ? DATA_REGS                                 \
-   : (GET_MODE (X) == QImode && (CLASS) != ADDR_REGS) \
-   ? DATA_REGS                                 \
-   : (GET_CODE (X) == CONST_DOUBLE                                     \
-      && GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT)                  \
-   ? (TARGET_HARD_FLOAT && (CLASS == FP_REGS || CLASS == DATA_OR_FP_REGS) \
-      ? FP_REGS : NO_REGS)                                             \
-   : (TARGET_PCREL                             \
-      && (GET_CODE (X) == SYMBOL_REF || GET_CODE (X) == CONST \
-         || GET_CODE (X) == LABEL_REF))        \
-   ? ADDR_REGS                                 \
-   : (CLASS))
-
-/* Force QImode output reloads from subregs to be allocated to data regs,
-   since QImode stores from address regs are not supported.  We make the
-   assumption that if the class is not ADDR_REGS, then it must be a superset
-   of DATA_REGS.  */
-#define LIMIT_RELOAD_CLASS(MODE, CLASS) \
-  (((MODE) == QImode && (CLASS) != ADDR_REGS)  \
-   ? DATA_REGS                                 \
-   : (CLASS))
+#define PREFERRED_RELOAD_CLASS(X,CLASS) \
+  m68k_preferred_reload_class (X, CLASS)
 
 /* On the m68k, this is the size of MODE in words,
    except in the FP regs, where a single reg is always enough.  */
@@ -784,166 +757,52 @@ __transfer_from_trampoline ()                                    \
 /* 1 if X is an address register  */
 #define ADDRESS_REG_P(X) (REG_P (X) && REGNO_OK_FOR_BASE_P (REGNO (X)))
 \f
+/* True if SYMBOL + OFFSET constants must refer to something within
+   SYMBOL's section.  */
+#ifndef M68K_OFFSETS_MUST_BE_WITHIN_SECTIONS_P
+#define M68K_OFFSETS_MUST_BE_WITHIN_SECTIONS_P 0
+#endif
 
 #define MAX_REGS_PER_ADDRESS 2
 
-#define CONSTANT_ADDRESS_P(X)   \
-  (GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF             \
-   || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST               \
-   || GET_CODE (X) == HIGH)
+#define CONSTANT_ADDRESS_P(X)                                          \
+  ((GET_CODE (X) == LABEL_REF || GET_CODE (X) == SYMBOL_REF            \
+    || GET_CODE (X) == CONST_INT || GET_CODE (X) == CONST              \
+    || GET_CODE (X) == HIGH)                                           \
+   && LEGITIMATE_CONSTANT_P (X))
 
 /* Nonzero if the constant value X is a legitimate general operand.
    It is given that X satisfies CONSTANT_P or is a CONST_DOUBLE.  */
-#define LEGITIMATE_CONSTANT_P(X) (GET_MODE (X) != XFmode)
+#define LEGITIMATE_CONSTANT_P(X)                               \
+  (GET_MODE (X) != XFmode                                      \
+   && !m68k_illegitimate_symbolic_constant_p (X))
 
 #ifndef REG_OK_STRICT
-#define PCREL_GENERAL_OPERAND_OK 0
+#define REG_STRICT_P 0
 #else
-#define PCREL_GENERAL_OPERAND_OK (TARGET_PCREL)
+#define REG_STRICT_P 1
 #endif
 
-#define LEGITIMATE_PIC_OPERAND_P(X)    \
-  (! symbolic_operand (X, VOIDmode)                            \
-   || PCREL_GENERAL_OPERAND_OK)
-
-#ifndef REG_OK_STRICT
+#define LEGITIMATE_PIC_OPERAND_P(X)                            \
+  (!symbolic_operand (X, VOIDmode)                             \
+   || (TARGET_PCREL && REG_STRICT_P))
 
-/* Nonzero if X is a hard reg that can be used as an index
-   or if it is a pseudo reg.  */
-#define REG_OK_FOR_INDEX_P(X) !FP_REGNO_P (REGNO (X))
-/* Nonzero if X is a hard reg that can be used as a base reg
-   or if it is a pseudo reg.  */
 #define REG_OK_FOR_BASE_P(X) \
-  (!DATA_REGNO_P (REGNO (X)) && !FP_REGNO_P (REGNO (X)))
-
-#else
+  m68k_legitimate_base_reg_p (X, REG_STRICT_P)
 
-/* Nonzero if X is a hard reg that can be used as an index.  */
-#define REG_OK_FOR_INDEX_P(X) REGNO_OK_FOR_INDEX_P (REGNO (X))
-/* Nonzero if X is a hard reg that can be used as a base reg.  */
-#define REG_OK_FOR_BASE_P(X) REGNO_OK_FOR_BASE_P (REGNO (X))
+#define REG_OK_FOR_INDEX_P(X) \
+  m68k_legitimate_index_reg_p (X, REG_STRICT_P)
 
-#endif
-\f
-/* GO_IF_LEGITIMATE_ADDRESS recognizes an RTL expression
-   that is a valid memory address for an instruction.
-   The MODE argument is the machine mode for the MEM expression
-   that wants to use this address.
-
-   When generating PIC, an address involving a SYMBOL_REF is legitimate
-   if and only if it is the sum of pic_offset_table_rtx and the SYMBOL_REF.
-   We use LEGITIMATE_PIC_OPERAND_P to throw out the illegitimate addresses,
-   and we explicitly check for the sum of pic_offset_table_rtx and a SYMBOL_REF.
-
-   Likewise for a LABEL_REF when generating PIC.
-
-   The other macros defined here are used only in GO_IF_LEGITIMATE_ADDRESS.  */
-
-/* Allow SUBREG everywhere we allow REG.  This results in better code.  It
-   also makes function inlining work when inline functions are called with
-   arguments that are SUBREGs.  */
-
-#define LEGITIMATE_BASE_REG_P(X)   \
-  ((GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))      \
-   || (GET_CODE (X) == SUBREG                          \
-       && GET_CODE (SUBREG_REG (X)) == REG             \
-       && REG_OK_FOR_BASE_P (SUBREG_REG (X))))
-
-#define INDIRECTABLE_1_ADDRESS_P(X)  \
-  ((CONSTANT_ADDRESS_P (X) && (!flag_pic || LEGITIMATE_PIC_OPERAND_P (X))) \
-   || LEGITIMATE_BASE_REG_P (X)                                                \
-   || ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_INC)           \
-       && LEGITIMATE_BASE_REG_P (XEXP (X, 0)))                         \
-   || (GET_CODE (X) == PLUS                                            \
-       && LEGITIMATE_BASE_REG_P (XEXP (X, 0))                          \
-       && GET_CODE (XEXP (X, 1)) == CONST_INT                          \
-       && (TARGET_68020                                                        \
-          || ((unsigned) INTVAL (XEXP (X, 1)) + 0x8000) < 0x10000))    \
-   || (GET_CODE (X) == PLUS && XEXP (X, 0) == pic_offset_table_rtx     \
-       && flag_pic && GET_CODE (XEXP (X, 1)) == SYMBOL_REF)            \
-   || (GET_CODE (X) == PLUS && XEXP (X, 0) == pic_offset_table_rtx     \
-       && flag_pic && GET_CODE (XEXP (X, 1)) == LABEL_REF))
-
-#define GO_IF_NONINDEXED_ADDRESS(X, ADDR)  \
-{ if (INDIRECTABLE_1_ADDRESS_P (X)) goto ADDR; }
-
-/* Only labels on dispatch tables are valid for indexing from.  */
-#define GO_IF_INDEXABLE_BASE(X, ADDR)                          \
-{ rtx temp;                                                    \
-  if (GET_CODE (X) == LABEL_REF                                        \
-      && (temp = next_nonnote_insn (XEXP (X, 0))) != 0         \
-      && GET_CODE (temp) == JUMP_INSN                          \
-      && (GET_CODE (PATTERN (temp)) == ADDR_VEC                        \
-         || GET_CODE (PATTERN (temp)) == ADDR_DIFF_VEC))       \
-    goto ADDR;                                                 \
-  if (LEGITIMATE_BASE_REG_P (X)) goto ADDR; }
-
-#define GO_IF_INDEXING(X, ADDR)        \
-{ if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 0)))                \
-    { GO_IF_INDEXABLE_BASE (XEXP (X, 1), ADDR); }                      \
-  if (GET_CODE (X) == PLUS && LEGITIMATE_INDEX_P (XEXP (X, 1)))                \
-    { GO_IF_INDEXABLE_BASE (XEXP (X, 0), ADDR); } }
-
-#define GO_IF_INDEXED_ADDRESS(X, ADDR)  \
-{ GO_IF_INDEXING (X, ADDR);                                            \
-  if (GET_CODE (X) == PLUS)                                            \
-    { if (GET_CODE (XEXP (X, 1)) == CONST_INT                          \
-         && (TARGET_68020 || (unsigned) INTVAL (XEXP (X, 1)) + 0x80 < 0x100))          \
-       { rtx go_temp = XEXP (X, 0); GO_IF_INDEXING (go_temp, ADDR); }  \
-      if (GET_CODE (XEXP (X, 0)) == CONST_INT                          \
-         && (TARGET_68020 || (unsigned) INTVAL (XEXP (X, 0)) + 0x80 < 0x100))          \
-       { rtx go_temp = XEXP (X, 1); GO_IF_INDEXING (go_temp, ADDR); } } }
-
-/* ColdFire/5200 does not allow HImode index registers.  */
-#define LEGITIMATE_INDEX_REG_P(X)   \
-  ((GET_CODE (X) == REG && REG_OK_FOR_INDEX_P (X))     \
-   || (! TARGET_COLDFIRE                                       \
-       && GET_CODE (X) == SIGN_EXTEND                  \
-       && GET_CODE (XEXP (X, 0)) == REG                        \
-       && GET_MODE (XEXP (X, 0)) == HImode             \
-       && REG_OK_FOR_INDEX_P (XEXP (X, 0)))            \
-   || (GET_CODE (X) == SUBREG                          \
-       && GET_CODE (SUBREG_REG (X)) == REG             \
-       && REG_OK_FOR_INDEX_P (SUBREG_REG (X))))
-
-#define LEGITIMATE_INDEX_P(X)   \
-   (LEGITIMATE_INDEX_REG_P (X)                         \
-    || ((TARGET_68020 || TARGET_COLDFIRE) && GET_CODE (X) == MULT \
-       && LEGITIMATE_INDEX_REG_P (XEXP (X, 0))         \
-       && GET_CODE (XEXP (X, 1)) == CONST_INT          \
-       && (INTVAL (XEXP (X, 1)) == 2                   \
-           || INTVAL (XEXP (X, 1)) == 4                \
-           || (INTVAL (XEXP (X, 1)) == 8               \
-               && (TARGET_COLDFIRE_FPU || !TARGET_COLDFIRE)))))
-
-/* Coldfire FPU only accepts addressing modes 2-5 */
-#define GO_IF_COLDFIRE_FPU_LEGITIMATE_ADDRESS(MODE, X, ADDR)           \
-{ if (LEGITIMATE_BASE_REG_P (X)                                                \
-      || ((GET_CODE (X) == PRE_DEC || GET_CODE (X) == POST_INC)                \
-          && LEGITIMATE_BASE_REG_P (XEXP (X, 0)))                      \
-      || ((GET_CODE (X) == PLUS) && LEGITIMATE_BASE_REG_P (XEXP (X, 0))        \
-          && (GET_CODE (XEXP (X, 1)) == CONST_INT)                     \
-          && ((((unsigned) INTVAL (XEXP (X, 1)) + 0x8000) < 0x10000))))        \
-  goto ADDR;}
-
-/* If pic, we accept INDEX+LABEL, which is what do_tablejump makes.  */
 #define GO_IF_LEGITIMATE_ADDRESS(MODE, X, ADDR)                                \
-{ if (TARGET_COLDFIRE_FPU && (GET_MODE_CLASS (MODE) == MODE_FLOAT))    \
+  do                                                                   \
     {                                                                  \
-      GO_IF_COLDFIRE_FPU_LEGITIMATE_ADDRESS (MODE, X, ADDR);           \
+      if (m68k_legitimate_address_p (MODE, X, REG_STRICT_P))           \
+        goto ADDR;                                                     \
     }                                                                  \
-  else                                                                 \
-    {                                                                  \
-      GO_IF_NONINDEXED_ADDRESS (X, ADDR);                              \
-      GO_IF_INDEXED_ADDRESS (X, ADDR);                                 \
-      if (flag_pic && MODE == CASE_VECTOR_MODE && GET_CODE (X) == PLUS \
-         && LEGITIMATE_INDEX_P (XEXP (X, 0))                           \
-         && GET_CODE (XEXP (X, 1)) == LABEL_REF)                       \
-       goto ADDR;                                                      \
-    }}
+  while (0)
 
 /* Don't call memory_address_noforce for the address to fetch
-   the switch offset.  This address is ok as it stands (see above),
+   the switch offset.  This address is ok as it stands,
    but memory_address_noforce would alter it.  */
 #define PIC_CASE_VECTOR_ADDRESS(index) index
 \f
@@ -1090,11 +949,23 @@ do { if (cc_prev_status.flags & CC_IN_68881)                     \
 /* We must not use the DBX register numbers for the DWARF 2 CFA column
    numbers because that maps to numbers beyond FIRST_PSEUDO_REGISTER.
    Instead use the identity mapping.  */
-#define DWARF_FRAME_REGNUM(REG) REG
+#define DWARF_FRAME_REGNUM(REG) \
+  (INT_REGNO_P (REG) || FP_REGNO_P (REG) ? (REG) : INVALID_REGNUM)
+
+/* The return column was originally 24, but gcc used 25 for a while too.
+   Define both registers 24 and 25 as Pmode ones and use 24 in our own
+   unwind information.  */
+#define DWARF_FRAME_REGISTERS 25
+#define DWARF_FRAME_RETURN_COLUMN 24
+#define DWARF_ALT_FRAME_RETURN_COLUMN 25
 
 /* Before the prologue, the top of the frame is at 4(%sp).  */
 #define INCOMING_FRAME_SP_OFFSET 4
 
+/* All registers are live on exit from an interrupt routine.  */
+#define EPILOGUE_USES(REGNO) \
+  (reload_completed && m68k_interrupt_function_p (current_function_decl))
+
 /* Describe how we implement __builtin_eh_return.  */
 #define EH_RETURN_DATA_REGNO(N) \
   ((N) < 2 ? (N) : INVALID_REGNUM)
@@ -1231,6 +1102,7 @@ do { if (cc_prev_status.flags & CC_IN_68881)                      \
    '$' for the letter `s' in an op code, but only on the 68040.
    '&' for the letter `d' in an op code, but only on the 68040.
    '/' for register prefix needed by longlong.h.
+   '?' for m68k_library_id_string
 
    'b' for byte insn (no effect, on the Sun; this is for the ISI).
    'd' to force memory addressing to be absolute, not relative.
@@ -1241,7 +1113,7 @@ do { if (cc_prev_status.flags & CC_IN_68881)                      \
 #define PRINT_OPERAND_PUNCT_VALID_P(CODE)                              \
   ((CODE) == '.' || (CODE) == '#' || (CODE) == '-'                     \
    || (CODE) == '+' || (CODE) == '@' || (CODE) == '!'                  \
-   || (CODE) == '$' || (CODE) == '&' || (CODE) == '/')
+   || (CODE) == '$' || (CODE) == '&' || (CODE) == '/' || (CODE) == '?')
 
 
 /* See m68k.c for the m68k specific codes.  */