*** empty log message ***
authorRichard Stallman <rms@gnu.org>
Sat, 14 Mar 1992 06:41:00 +0000 (06:41 +0000)
committerRichard Stallman <rms@gnu.org>
Sat, 14 Mar 1992 06:41:00 +0000 (06:41 +0000)
From-SVN: r485

gcc/config/pyr/pyr.h

index bf9ef3719d295184beb5a84fadc1cde2cb0c9c38..d7aac7277088359815ab4648cc6955a33c148f4a 100644 (file)
@@ -145,12 +145,16 @@ extern int target_flags;
 /* Alignment of field after `int : 0' in a structure.  */
 #define EMPTY_FIELD_BOUNDARY 32
 
+/* Every structure's size must be a multiple of this.  */
+/* ??? This is a guess.  */
+#define STRUCTURE_SIZE_BOUNDARY 32
+
 /* No data type wants to be aligned rounder than this.  */
 #define BIGGEST_ALIGNMENT 32
 
 /* Specified types of bitfields affect alignment of those fields
    and of the structure as a whole.  */
-#define PCC_BITFIELD_TYPE_MATTERS
+#define PCC_BITFIELD_TYPE_MATTERS 1
 
 /* Make strings word-aligned so strcpy from constants will be faster. 
    Pyramid documentation says the best alignment is to align
@@ -168,9 +172,9 @@ extern int target_flags;
    && TYPE_MODE (TREE_TYPE (TYPE)) == QImode   \
    && (ALIGN) < BITS_PER_WORD ? BITS_PER_WORD : (ALIGN))
 
-/* Define this if move instructions will actually fail to work
+/* Set this nonzero if move instructions will actually fail to work
    when given unaligned data.  */
-#define STRICT_ALIGNMENT
+#define STRICT_ALIGNMENT 1
 \f
 /*** Standard register usage.  ***/
 
@@ -329,6 +333,12 @@ frame n    |            |            |            |
 /* If needed, Pyramid says to use temporary register 12. */
 #define STATIC_CHAIN_REGNUM PYR_TREG(12)
 
+/* If register windows are used, STATIC_CHAIN_INCOMING_REGNUM
+   is the register number as seen by the called function, while
+   STATIC_CHAIN_REGNUM is the register number as seen by the calling
+   function. */
+#define STATIC_CHAIN_INCOMING_REGNUM PYR_PREG(12)
+
 /* Register in which address to store a structure value
    is passed to a function.
    On a Pyramid, this is temporary register 0 (TR0).   */
@@ -547,7 +557,7 @@ enum reg_class { NO_REGS, ALL_REGS, LIM_REG_CLASSES };
 
 #define CUMULATIVE_ARGS int
 
-/* Define the number of registers that can hold paramters.
+/* Define the number of registers that can hold parameters.
    This macro is used only in other macro definitions below.   */
 #define NPARM_REGS 12
 
@@ -694,6 +704,38 @@ extern void* pyr_function_arg ();
 
 #endif /* !FRAME_POINTER_REQUIRED */
 
+/* the trampoline stuff was taken from convex.h - S.P. */
+
+/* A C statement to output, on the stream FILE, assembler code for a
+   block of data that contains the constant parts of a trampoline.  This
+   code should not include a label - the label is taken care of
+   automatically.
+       We use TR12/PR12 for the static chain.
+       movew $<STATIC>,pr12    # I2R
+       jump $<func>            # S2R
+ */
+#define TRAMPOLINE_TEMPLATE(FILE) \
+{ ASM_OUTPUT_INT (FILE, gen_rtx (CONST_INT, VOIDmode, 0x2100001C));    \
+  ASM_OUTPUT_INT (FILE, gen_rtx (CONST_INT, VOIDmode, 0x00000000));    \
+  ASM_OUTPUT_INT (FILE, gen_rtx (CONST_INT, VOIDmode, 0x40000000));    \
+  ASM_OUTPUT_INT (FILE, gen_rtx (CONST_INT, VOIDmode, 0x00000000)); }
+
+#define TRAMPOLINE_SIZE                16
+#define TRAMPOLINE_ALIGNMENT   32
+
+/* Emit RTL insns to initialize the variable parts of a trampoline.
+   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.  */
+
+#define INITIALIZE_TRAMPOLINE(TRAMP, FNADDR, CXT) \
+{ emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (TRAMP, 4)), CXT);        \
+  emit_move_insn (gen_rtx (MEM, Pmode, plus_constant (TRAMP, 12)), FNADDR); \
+  emit_call_insn (gen_call (gen_rtx (MEM, QImode,                      \
+                                    gen_rtx (SYMBOL_REF, Pmode,        \
+                                             "__enable_execute_stack")), \
+                           const0_rtx));                               \
+}
+
 /* Output assembler code to FILE to increment profiler label # LABELNO
    for profiling a function entry.  */
 #define FUNCTION_PROFILER(FILE, LABELNO)  \
@@ -728,10 +770,15 @@ extern int current_function_calls_alloca;
    + current_function_args_size != 0                                   \
    || current_function_calls_alloca)                                   \
 
-/* If the memory address ADDR is relative to the frame pointer,
-   correct it to be relative to the stack pointer instead.
-   This is for when we don't use a frame pointer.
-   ADDR should be a variable name.  */
+/* Store in the variable DEPTH the initial difference between the
+   frame pointer reg contents and the stack pointer reg contents,
+   as of the start of the function body.  This depends on the layout
+   of the fixed parts of the stack frame and on how registers are saved.
+
+   On the Pyramid, FRAME_POINTER_REQUIRED is always 1, so the definition
+   of this macro doesn't matter.  But it must be defined.  */
+
+#define INITIAL_FRAME_POINTER_OFFSET(DEPTH) (DEPTH) = 0;
 \f
 /*** Addressing modes, and classification of registers for them.  ***/
 
@@ -1003,6 +1050,10 @@ extern int current_function_calls_alloca;
     return 4;                                                  \
   case CONST_DOUBLE:                                           \
     return 6;
+
+/* A flag which says to swap the operands of certain insns
+   when they are output.  */
+extern int swap_operands;
 \f
 /*** Condition Code Information ***/