OSDN Git Service

* config/vax/vax.h (target_flags, MASK_UNIX_ASM, MASK_VAXC_ALIGNMENT)
[pf3gnuchains/gcc-fork.git] / gcc / config / vax / vax.h
index fed8ac4..af3eab5 100644 (file)
@@ -1,21 +1,21 @@
 /* Definitions of target machine for GNU compiler.  VAX version.
    Copyright (C) 1987, 1988, 1991, 1993, 1994, 1995, 1996, 1997, 1998,
-   1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+   1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
 
-This file is part of GNU CC.
+This file is part of GCC.
 
-GNU CC is free software; you can redistribute it and/or modify
+GCC is free software; you can redistribute it and/or modify
 it under the terms of the GNU General Public License as published by
 the Free Software Foundation; either version 2, or (at your option)
 any later version.
 
-GNU CC is distributed in the hope that it will be useful,
+GCC is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.
 
 You should have received a copy of the GNU General Public License
-along with GNU CC; see the file COPYING.  If not, write to
+along with GCC; see the file COPYING.  If not, write to
 the Free Software Foundation, 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
@@ -60,52 +60,17 @@ Boston, MA 02111-1307, USA.  */
 
 /* Run-time compilation parameters selecting different hardware subsets.  */
 
-extern int target_flags;
-
-#define MASK_UNIX_ASM          1
-#define MASK_VAXC_ALIGNMENT    2
-#define MASK_G_FLOAT           4
-
-
-/* Macros used in the machine description to test the flags.  */
-
-/* Nonzero if compiling code that Unix assembler can assemble.  */
-#define TARGET_UNIX_ASM (target_flags & MASK_UNIX_ASM)
-
-/* Nonzero if compiling with VAX-11 "C" style structure alignment */
-#define        TARGET_VAXC_ALIGNMENT (target_flags & MASK_VAXC_ALIGNMENT)
-
-/* Nonzero if compiling with `G'-format floating point */
-#define TARGET_G_FLOAT (target_flags & MASK_G_FLOAT)
-
-/* Macro to define tables used to set the flags.
-   This is a list in braces of pairs in braces,
-   each pair being { "NAME", VALUE }
-   where VALUE is the bits to set or minus the bits to clear.
-   An empty string NAME is used to identify the default VALUE.  */
-
-#define TARGET_SWITCHES                                                \
-  { {"unix", MASK_UNIX_ASM,                                    \
-     "Generate code for UNIX assembler"},                      \
-    {"gnu", -MASK_UNIX_ASM,                                    \
-     "Generate code for GNU assembler (gas)"},                 \
-    {"vaxc-alignment", MASK_VAXC_ALIGNMENT,                    \
-     "Use VAXC structure conventions"},                        \
-    {"g", MASK_G_FLOAT,                                                \
-     "Generate GFLOAT double precision code"},                 \
-    {"g-float", MASK_G_FLOAT,                                  \
-     "Generate GFLOAT double precision code"},                 \
-    {"d", -MASK_G_FLOAT,                                       \
-     "Generate DFLOAT double precision code"},                 \
-    {"d-float", -MASK_G_FLOAT,                                 \
-     "Generate DFLOAT double precision code"},                 \
-    { "", TARGET_DEFAULT, 0}}
+/* Nonzero if ELF.  Redefined by vax/elf.h.  */
+#define TARGET_ELF 0
 
 /* Default target_flags if no switches specified.  */
 
 #ifndef TARGET_DEFAULT
 #define TARGET_DEFAULT (MASK_UNIX_ASM)
 #endif
+
+#define OVERRIDE_OPTIONS override_options ()
+
 \f
 /* Target machine storage layout */
 
@@ -138,7 +103,7 @@ extern int target_flags;
 /* Every structure's size must be a multiple of this.  */
 #define STRUCTURE_SIZE_BOUNDARY 8
 
-/* A bitfield declared as `int' forces `int' alignment for the struct.  */
+/* A bit-field declared as `int' forces `int' alignment for the struct.  */
 #define PCC_BITFIELD_TYPE_MATTERS (! TARGET_VAXC_ALIGNMENT)
 
 /* No data type wants to be aligned rounder than this.  */
@@ -224,7 +189,7 @@ extern int target_flags;
 
 /* Register in which address to store a structure value
    is passed to a function.  */
-#define STRUCT_VALUE_REGNUM 1
+#define VAX_STRUCT_VALUE_REGNUM 1
 \f
 /* Define the classes of registers for register constraints in the
    machine description.  Also define ranges of constants.
@@ -285,16 +250,28 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
 #define REG_CLASS_FROM_LETTER(C) NO_REGS
 
-/* The letters I, J, K, L and M in a register constraint string
+/* The letters I, J, K, L, M, N, and O in a register constraint string
    can be used to stand for particular ranges of immediate operands.
    This macro defines what the ranges are.
    C is the letter, and VALUE is a constant value.
    Return 1 if VALUE is in the range specified by C.
 
-   `I' is the constant zero.  */
+   `I' is the constant zero.
+   `J' is a value between 0 .. 63 (inclusive)
+   `K' is a value between -128 and 127 (inclusive)
+   'L' is a value between -32768 and 32767 (inclusive)
+   `M' is a value between 0 and 255 (inclusive)
+   'N' is a value between 0 and 65535 (inclusive)
+   `O' is a value between -63 and -1 (inclusive)  */
 
 #define CONST_OK_FOR_LETTER_P(VALUE, C) \
-  ((C) == 'I' ? (VALUE) == 0           \
+  (  (C) == 'I' ?      (VALUE) == 0                            \
+   : (C) == 'J' ?      0 <= (VALUE) && (VALUE) < 64            \
+   : (C) == 'O' ?      -63 <= (VALUE) && (VALUE) < 0           \
+   : (C) == 'K' ?      -128 <= (VALUE) && (VALUE) < 128        \
+   : (C) == 'M' ?      0 <= (VALUE) && (VALUE) < 256           \
+   : (C) == 'L' ?      -32768 <= (VALUE) && (VALUE) < 32768    \
+   : (C) == 'N' ?      0 <= (VALUE) && (VALUE) < 65536         \
    : 0)
 
 /* Similar, but for floating constants, and defining letters G and H.
@@ -423,7 +400,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
    On the VAX, the offset starts at 0.  */
 
-#define INIT_CUMULATIVE_ARGS(CUM,FNTYPE,LIBNAME,INDIRECT)      \
+#define INIT_CUMULATIVE_ARGS(CUM, FNTYPE, LIBNAME, INDIRECT, N_NAMED_ARGS) \
  ((CUM) = 0)
 
 /* Update the data in CUM to advance over an argument
@@ -455,9 +432,18 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  */
 
-#define FUNCTION_PROFILER(FILE, LABELNO)  \
-   fprintf (FILE, "\tmovab LP%d,%s\n\tjsb mcount\n", (LABELNO), \
-           reg_names[0]);
+#define VAX_FUNCTION_PROFILER_NAME "mcount"
+#define FUNCTION_PROFILER(FILE, LABELNO)                       \
+  do                                                           \
+    {                                                          \
+      char label[256];                                         \
+      ASM_GENERATE_INTERNAL_LABEL (label, "LP", (LABELNO));    \
+      fprintf (FILE, "\tmovab ");                              \
+      assemble_name (FILE, label);                             \
+      asm_fprintf (FILE, ",%Rr0\n\tjsb %s\n",                  \
+                  VAX_FUNCTION_PROFILER_NAME);                 \
+    }                                                          \
+  while (0)
 
 /* EXIT_IGNORE_STACK should be nonzero if, when returning from a function,
    the stack pointer does not matter.  The value is tested only in
@@ -502,9 +488,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    FNADDR is an RTX for the address of the function's pure code.
    CXT is an RTX for the static chain value for the function.  */
 
-/* Allow this be overriden with the correct register prefixes.  */
-#define VAX_ISTREAM_SYNC "movpsl -(sp)\n\tpushal 1(pc)\n\trei"
-
 /* We copy the register-mask from the function's pure code
    to the start of the trampoline.  */
 #define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT)                      \
@@ -514,7 +497,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 4)), CXT);        \
   emit_move_insn (gen_rtx_MEM (SImode, plus_constant (TRAMP, 11)),     \
                  plus_constant (FNADDR, 2));                           \
-  emit_insn (gen_rtx_ASM_INPUT (VOIDmode, VAX_ISTREAM_SYNC));          \
+  emit_insn (gen_sync_istream ());                                     \
 }
 
 /* Byte offset of return address in a stack frame.  The "saved PC" field
@@ -536,10 +519,8 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 /* Addressing modes, and classification of registers for them.  */
 
 #define HAVE_POST_INCREMENT 1
-/* #define HAVE_POST_DECREMENT 0 */
 
 #define HAVE_PRE_DECREMENT 1
-/* #define HAVE_PRE_INCREMENT 0 */
 
 /* Macros to check register numbers against specific register classes.  */
 
@@ -630,7 +611,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    || GET_CODE (X) == CONST_INT)
 
 
-/* Non-zero if X is an address which can be indirected.  External symbols
+/* Nonzero 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)  \
@@ -645,7 +626,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
 #define INDIRECTABLE_CONSTANT_ADDRESS_P(X) CONSTANT_ADDRESS_P(X)
 
-/* Non-zero if X is an address which can be indirected.  */
+/* Nonzero if X is an address which can be indirected.  */
 #define INDIRECTABLE_ADDRESS_P(X)  \
   (CONSTANT_ADDRESS_P (X)                                              \
    || (GET_CODE (X) == REG && REG_OK_FOR_BASE_P (X))                   \
@@ -736,23 +717,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
            goto ADDR;                                                  \
          GO_IF_REG_PLUS_INDEX (XEXP (X, 0), MODE, ADDR); } } }
 \f
-/* Try machine-dependent ways of modifying an illegitimate address
-   to be legitimate.  If we find one, return the new, valid address.
-   This macro is used in only one place: `memory_address' in explow.c.
-
-   OLDX is the address as it was before break_out_memory_refs was called.
-   In some cases it is useful to look at this to decide what needs to be done.
-
-   MODE and WIN are passed so that this macro can use
-   GO_IF_LEGITIMATE_ADDRESS.
-
-   It is always safe for this macro to do nothing.  It exists to recognize
-   opportunities to optimize the output.
-
-   For the VAX, nothing needs to be done.  */
-
-#define LEGITIMIZE_ADDRESS(X,OLDX,MODE,WIN)  {}
-
 /* Go to LABEL if ADDR (a legitimate address expression)
    has an effect that depends on the machine mode it is used for.
    On the VAX, the predecrement and postincrement address depend thus
@@ -779,10 +743,9 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    Do not define this if the table should contain absolute addresses.  */
 #define CASE_VECTOR_PC_RELATIVE 1
 
-/* Define this if the case instruction drops through after the table
-   when the index is out of range.  Don't define it if the case insn
-   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
 
 /* Define this as 1 if `char' should by default be signed; else as 0.  */
 #define DEFAULT_SIGNED_CHAR 1
@@ -807,10 +770,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    is done just by pretending it is already truncated.  */
 #define TRULY_NOOP_TRUNCATION(OUTPREC, INPREC) 1
 
-/* When a prototype says `char' or `short', really pass an `int'.
-   (On the VAX, this is required for system-library compatibility.)  */
-#define PROMOTE_PROTOTYPES 1
-
 /* Specify the machine mode that pointers have.
    After generation of rtl, the compiler makes no further distinction
    between pointers and any other objects of this machine mode.  */
@@ -825,51 +784,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
 #define TARGET_FLOAT_FORMAT VAX_FLOAT_FORMAT
 
-/* Compute the cost of computing a constant rtl expression RTX
-   whose rtx-code is CODE.  The body of this macro is a portion
-   of a switch statement.  If the code is computed here,
-   return it with a return statement.  Otherwise, break from the switch.  */
-
-/* On a VAX, constants from 0..63 are cheap because they can use the
-   1 byte literal constant format.  compare to -1 should be made cheap
-   so that decrement-and-branch insns can be formed more easily (if
-   the value -1 is copied to a register some decrement-and-branch patterns
-   will not match).  */
-
-#define CONST_COSTS(RTX,CODE,OUTER_CODE) \
-  case CONST_INT:                                              \
-    if (INTVAL (RTX) == 0) return 0;                           \
-    if ((OUTER_CODE) == AND)                                   \
-      return ((unsigned) ~INTVAL (RTX) <= 077) ? 1 : 2;                \
-    if ((unsigned) INTVAL (RTX) <= 077) return 1;              \
-    if ((OUTER_CODE) == COMPARE && INTVAL (RTX) == -1)         \
-      return 1;                                                        \
-    if ((OUTER_CODE) == PLUS && (unsigned) -INTVAL (RTX) <= 077)\
-      return 1;                                                        \
-  case CONST:                                                  \
-  case LABEL_REF:                                              \
-  case SYMBOL_REF:                                             \
-    return 3;                                                  \
-  case CONST_DOUBLE:                                           \
-    if (GET_MODE_CLASS (GET_MODE (RTX)) == MODE_FLOAT)         \
-      return vax_float_literal (RTX) ? 5 : 8;                  \
-    else                                                       \
-      return (((CONST_DOUBLE_HIGH (RTX) == 0                   \
-               && (unsigned) CONST_DOUBLE_LOW (RTX) < 64)      \
-              || ((OUTER_CODE) == PLUS                         \
-                  && CONST_DOUBLE_HIGH (RTX) == -1             \
-                  && (unsigned)-CONST_DOUBLE_LOW (RTX) < 64))  \
-             ? 2 : 5);
-
-#define RTX_COSTS(RTX,CODE,OUTER_CODE) case FIX: case FLOAT:   \
- case MULT: case DIV: case UDIV: case MOD: case UMOD:          \
- case ASHIFT: case LSHIFTRT: case ASHIFTRT:                    \
- case ROTATE: case ROTATERT: case PLUS: case MINUS: case IOR:  \
- case XOR: case AND: case NEG: case NOT: case ZERO_EXTRACT:    \
- case SIGN_EXTRACT: case MEM: return vax_rtx_cost(RTX)
-
-#define        ADDRESS_COST(RTX) (1 + (GET_CODE (RTX) == REG ? 0 : vax_address_cost(RTX)))
-
 /* Specify the cost of a branch insn; roughly the number of extra insns that
    should be added to avoid a branch.
 
@@ -877,14 +791,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    used to replace branches can be expensive.  */
 
 #define BRANCH_COST 0
-
-/*
- * We can use the BSD C library routines for the libgcc calls that are
- * still generated, since that's what they boil down to anyways.
- */
-
-#define UDIVSI3_LIBCALL "*udiv"
-#define UMODSI3_LIBCALL "*urem"
 \f
 /* Tell final.c how to eliminate redundant test instructions.  */
 
@@ -897,61 +803,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    Do not alter them if the instruction would not alter the cc's.  */
 
 #define NOTICE_UPDATE_CC(EXP, INSN) \
-{ if (GET_CODE (EXP) == SET)                                   \
-    { if (GET_CODE (SET_SRC (EXP)) == CALL)                    \
-       CC_STATUS_INIT;                                         \
-      else if (GET_CODE (SET_DEST (EXP)) != ZERO_EXTRACT       \
-              && GET_CODE (SET_DEST (EXP)) != PC)              \
-       {                                                       \
-         cc_status.flags = 0;                                  \
-         /* The integer operations below don't set carry or    \
-            set it in an incompatible way.  That's ok though   \
-            as the Z bit is all we need when doing unsigned    \
-            comparisons on the result of these insns (since    \
-            they're always with 0).  Set CC_NO_OVERFLOW to     \
-            generate the correct unsigned branches.  */        \
-         switch (GET_CODE (SET_SRC (EXP)))                     \
-           {                                                   \
-           case NEG:                                           \
-             if (GET_MODE_CLASS (GET_MODE (EXP)) == MODE_FLOAT)\
-               break;                                          \
-           case AND:                                           \
-           case IOR:                                           \
-           case XOR:                                           \
-           case NOT:                                           \
-           case MEM:                                           \
-           case REG:                                           \
-             cc_status.flags = CC_NO_OVERFLOW;                 \
-             break;                                            \
-           default:                                            \
-             break;                                            \
-           }                                                   \
-         cc_status.value1 = SET_DEST (EXP);                    \
-         cc_status.value2 = SET_SRC (EXP); } }                 \
-  else if (GET_CODE (EXP) == PARALLEL                          \
-          && GET_CODE (XVECEXP (EXP, 0, 0)) == SET)            \
-    {                                                          \
-      if (GET_CODE (SET_SRC (XVECEXP (EXP, 0, 0))) == CALL)    \
-       CC_STATUS_INIT;                                         \
-      else if (GET_CODE (SET_DEST (XVECEXP (EXP, 0, 0))) != PC) \
-       { cc_status.flags = 0;                                  \
-         cc_status.value1 = SET_DEST (XVECEXP (EXP, 0, 0));    \
-         cc_status.value2 = SET_SRC (XVECEXP (EXP, 0, 0)); }   \
-      else                                                     \
-       /* PARALLELs whose first element sets the PC are aob,   \
-          sob insns.  They do change the cc's.  */             \
-       CC_STATUS_INIT; }                                       \
-  else CC_STATUS_INIT;                                         \
-  if (cc_status.value1 && GET_CODE (cc_status.value1) == REG   \
-      && cc_status.value2                                      \
-      && reg_overlap_mentioned_p (cc_status.value1, cc_status.value2)) \
-    cc_status.value2 = 0;                                      \
-  if (cc_status.value1 && GET_CODE (cc_status.value1) == MEM   \
-      && cc_status.value2                                      \
-      && GET_CODE (cc_status.value2) == MEM)                   \
-    cc_status.value2 = 0; }
-/* Actual condition, one line up, should be that value2's address
-   depends on value1, but that is too much of a pain.  */
+  vax_notice_update_cc ((EXP), (INSN))
 
 #define OUTPUT_JUMP(NORMAL, FLOAT, NO_OV)  \
 { if (cc_status.flags & CC_NO_OVERFLOW)                                \
@@ -960,18 +812,11 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 \f
 /* Control the assembler format that we output.  */
 
-/* Output at beginning of assembler file.  */
-/* When debugging, we want to output an extra dummy label so that gas
-   can distinguish between D_float and G_float prior to processing the
-   .stabs directive identifying type double.  */
-
-#define ASM_FILE_START(FILE) \
-  do {                                                         \
-    fputs (ASM_APP_OFF, FILE);                                 \
-    if (write_symbols == DBX_DEBUG)                            \
-      fprintf (FILE, "___vax_%c_doubles:\n", ASM_DOUBLE_CHAR); \
-  } while (0)
+/* A C string constant describing how to begin a comment in the target
+   assembler language.  The compiler assumes that the comment will end at
+   the end of the line.  */
 
+#define ASM_COMMENT_START "#"
 
 /* Output to assembler file text saying following lines
    may contain character constants, extra white space, comments, etc.  */
@@ -1035,19 +880,13 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
 #define USER_LABEL_PREFIX "_"
 
-/* This is how to output an internal numbered label where
-   PREFIX is the class of label and NUM is the number within the class.  */
-
-#define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)     \
-  fprintf (FILE, "%s%d:\n", PREFIX, NUM)
-
 /* This is how to store into the string LABEL
    the symbol_ref name of an internal numbered label where
    PREFIX is the class of label and NUM is the number within the class.
    This is suitable for output with `assemble_name'.  */
 
 #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)  \
-  sprintf (LABEL, "*%s%d", PREFIX, NUM)
+  sprintf (LABEL, "*%s%ld", PREFIX, (long)(NUM))
 
 /* This is how to output an insn to push a register on the stack.
    It need not be very fast code.  */
@@ -1059,19 +898,39 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    It need not be very fast code.  */
 
 #define ASM_OUTPUT_REG_POP(FILE,REGNO)  \
-  fprintf (FILE, "\tmovl (sp)+,%s\n", reg_names[REGNO])
+  fprintf (FILE, "\tmovl (%s)+,%s\n", reg_names[STACK_POINTER_REGNUM], \
+          reg_names[REGNO])
 
 /* This is how to output an element of a case-vector that is absolute.
    (The VAX does not use such vectors,
    but we must define this macro anyway.)  */
 
-#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)  \
-  fprintf (FILE, "\t.long L%d\n", VALUE)
+#define ASM_OUTPUT_ADDR_VEC_ELT(FILE, VALUE)           \
+  do                                                   \
+    {                                                  \
+      char label[256];                                 \
+      ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));\
+      fprintf (FILE, "\t.long ");                      \
+      assemble_name (FILE, label);                     \
+      fprintf (FILE, "\n");                            \
+    }                                                  \
+  while (0)
 
 /* This is how to output an element of a case-vector that is relative.  */
 
-#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)  \
-  fprintf (FILE, "\t.word L%d-L%d\n", VALUE, REL)
+#define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, BODY, VALUE, REL)       \
+  do                                                           \
+    {                                                          \
+      char label[256];                                         \
+      ASM_GENERATE_INTERNAL_LABEL (label, "L", (VALUE));       \
+      fprintf (FILE, "\t.word ");                              \
+      assemble_name (FILE, label);                             \
+      ASM_GENERATE_INTERNAL_LABEL (label, "L", (REL));         \
+      fprintf (FILE, "-");                                     \
+      assemble_name (FILE, label);                             \
+      fprintf (FILE, "\n");                                    \
+    }                                                          \
+  while (0)
 
 /* This is how to output an assembler line
    that says to advance the location counter
@@ -1084,7 +943,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
    that says to advance the location counter by SIZE bytes.  */
 
 #define ASM_OUTPUT_SKIP(FILE,SIZE)  \
-  fprintf (FILE, "\t.space %u\n", (SIZE))
+  fprintf (FILE, "\t.space %u\n", (int)(SIZE))
 
 /* This says how to output an assembler line
    to define a global common symbol.  */
@@ -1092,7 +951,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 #define ASM_OUTPUT_COMMON(FILE, NAME, SIZE, ROUNDED)  \
 ( fputs (".comm ", (FILE)),                    \
   assemble_name ((FILE), (NAME)),              \
-  fprintf ((FILE), ",%u\n", (ROUNDED)))
+  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))
 
 /* This says how to output an assembler line
    to define a local common symbol.  */
@@ -1100,7 +959,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)  \
 ( fputs (".lcomm ", (FILE)),                   \
   assemble_name ((FILE), (NAME)),              \
-  fprintf ((FILE), ",%u\n", (ROUNDED)))
+  fprintf ((FILE), ",%u\n", (int)(ROUNDED)))
 
 /* Store in OUTPUT a string (made with alloca) containing
    an assembler-name for a local static variable named NAME.
@@ -1110,21 +969,6 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 ( (OUTPUT) = (char *) alloca (strlen ((NAME)) + 10),   \
   sprintf ((OUTPUT), "%s.%d", (NAME), (LABELNO)))
 
-/* Output code to add DELTA to the first argument, and then jump to FUNCTION.
-   Used for C++ multiple inheritance.
-       .mask   ^m<r2,r3,r4,r5,r6,r7,r8,r9,r10,r11>     #conservative entry mask
-       addl2   $DELTA, 4(ap)   #adjust first argument
-       jmp     FUNCTION+2      #jump beyond FUNCTION's entry mask
- */
-#define ASM_OUTPUT_MI_THUNK(FILE, THUNK_FNDECL, DELTA, FUNCTION)       \
-do {                                                                   \
-  fprintf (FILE, "\t.word 0x0ffc\n");                                  \
-  fprintf (FILE, "\taddl2 $%d,4(%sap)\n", DELTA, REGISTER_PREFIX);     \
-  fprintf (FILE, "\tjmp ");                                            \
-  assemble_name (FILE,  XSTR (XEXP (DECL_RTL (FUNCTION), 0), 0));      \
-  fprintf (FILE, "+2\n");                                              \
-} while (0)
-
 /* Print an instruction operand X on file FILE.
    CODE is the code from the %-spec that requested printing this operand;
    if `%z3' was used to print operand 3, then CODE is 'z'.
@@ -1142,36 +986,45 @@ VAX operand formatting codes:
    R   32 - constant operand
    b   the low 8 bits of a negated constant operand
    h   the low 16 bits of a negated constant operand
-   #   'd' or 'g' depending on whether dfloat or gfloat is used  */
+   #   'd' or 'g' depending on whether dfloat or gfloat is used
+   |   register prefix  */
 
 /* The purpose of D is to get around a quirk or bug in VAX assembler
    whereby -1 in a 64-bit immediate operand means 0x00000000ffffffff,
-   which is not a 64-bit minus one.  */
+   which is not a 64-bit minus one.  As a workaround, we output negative
+   values in hex.  */
+#if HOST_BITS_PER_WIDE_INT == 64
+#  define NEG_HWI_PRINT_HEX16 HOST_WIDE_INT_PRINT_HEX
+#else
+#  define NEG_HWI_PRINT_HEX16 "0xffffffff%08lx"
+#endif
 
 #define PRINT_OPERAND_PUNCT_VALID_P(CODE)                              \
-  ((CODE) == '#')
+  ((CODE) == '#' || (CODE) == '|')
 
 #define PRINT_OPERAND(FILE, X, CODE)  \
 { if (CODE == '#') fputc (ASM_DOUBLE_CHAR, FILE);                      \
+  else if (CODE == '|')                                                        \
+    fputs (REGISTER_PREFIX, FILE);                                     \
   else if (CODE == 'C')                                                        \
     fputs (rev_cond_name (X), FILE);                                   \
   else if (CODE == 'D' && GET_CODE (X) == CONST_INT && INTVAL (X) < 0) \
-    fprintf (FILE, "$0xffffffff%08x", INTVAL (X));                     \
+    fprintf (FILE, "$" NEG_HWI_PRINT_HEX16, INTVAL (X));               \
   else if (CODE == 'P' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", INTVAL (X) + 1);                             \
+    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, INTVAL (X) + 1);       \
   else if (CODE == 'N' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", ~ INTVAL (X));                               \
+    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, ~ INTVAL (X));         \
   /* rotl instruction cannot deal with negative arguments.  */         \
   else if (CODE == 'R' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", 32 - INTVAL (X));                            \
+    fprintf (FILE, "$" HOST_WIDE_INT_PRINT_DEC, 32 - INTVAL (X));      \
   else if (CODE == 'H' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", 0xffff & ~ INTVAL (X));                      \
+    fprintf (FILE, "$%d", (int) (0xffff & ~ INTVAL (X)));              \
   else if (CODE == 'h' && GET_CODE (X) == CONST_INT)                   \
     fprintf (FILE, "$%d", (short) - INTVAL (x));                       \
   else if (CODE == 'B' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", 0xff & ~ INTVAL (X));                                \
+    fprintf (FILE, "$%d", (int) (0xff & ~ INTVAL (X)));                        \
   else if (CODE == 'b' && GET_CODE (X) == CONST_INT)                   \
-    fprintf (FILE, "$%d", 0xff & - INTVAL (X));                                \
+    fprintf (FILE, "$%d", (int) (0xff & - INTVAL (X)));                        \
   else if (CODE == 'M' && GET_CODE (X) == CONST_INT)                   \
     fprintf (FILE, "$%d", ~((1 << INTVAL (x)) - 1));                   \
   else if (GET_CODE (X) == REG)                                                \
@@ -1179,14 +1032,14 @@ VAX operand formatting codes:
   else if (GET_CODE (X) == MEM)                                                \
     output_address (XEXP (X, 0));                                      \
   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == SFmode)     \
-    { REAL_VALUE_TYPE r; char dstr[30];                                        \
-      REAL_VALUE_FROM_CONST_DOUBLE (r, X);                             \
-      REAL_VALUE_TO_DECIMAL (r, dstr, -1);                             \
+    { char dstr[30];                                                   \
+      real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X),              \
+                      sizeof (dstr), 0, 1);                            \
       fprintf (FILE, "$0f%s", dstr); }                                 \
   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) == DFmode)     \
-    { REAL_VALUE_TYPE r; char dstr[30];                                        \
-      REAL_VALUE_FROM_CONST_DOUBLE (r, X);                             \
-      REAL_VALUE_TO_DECIMAL (r, dstr, -1);                             \
+    { char dstr[30];                                                   \
+      real_to_decimal (dstr, CONST_DOUBLE_REAL_VALUE (X),              \
+                      sizeof (dstr), 0, 1);                            \
       fprintf (FILE, "$0%c%s", ASM_DOUBLE_CHAR, dstr); }               \
   else { putc ('$', FILE); output_addr_const (FILE, X); }}
 
@@ -1195,3 +1048,8 @@ VAX operand formatting codes:
 
 #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  \
  print_operand_address (FILE, ADDR)
+
+/* This is a blatent lie.  However, it's good enough, since we don't
+   actually have any code whatsoever for which this isn't overridden
+   by the proper FDE definition.  */
+#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, PC_REGNUM)