aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/pyr
diff options
context:
space:
mode:
authorRichard Stallman <rms@gnu.org>1992-03-14 06:41:00 +0000
committerRichard Stallman <rms@gnu.org>1992-03-14 06:41:00 +0000
commite97f2dc6c179a98a2225c83b82a70cd35712c358 (patch)
tree26aa096029f04cde71ea42933d08b8b84066961e /gcc/config/pyr
parent767fcd82fbb33936dee8507556c612d3da30f83f (diff)
downloadgcc-e97f2dc6c179a98a2225c83b82a70cd35712c358.zip
gcc-e97f2dc6c179a98a2225c83b82a70cd35712c358.tar.gz
gcc-e97f2dc6c179a98a2225c83b82a70cd35712c358.tar.bz2
*** empty log message ***
From-SVN: r485
Diffstat (limited to 'gcc/config/pyr')
-rw-r--r--gcc/config/pyr/pyr.h67
1 files changed, 59 insertions, 8 deletions
diff --git a/gcc/config/pyr/pyr.h b/gcc/config/pyr/pyr.h
index bf9ef37..d7aac72 100644
--- a/gcc/config/pyr/pyr.h
+++ b/gcc/config/pyr/pyr.h
@@ -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
/*** 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;
/*** 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;
/*** Condition Code Information ***/