mirror of
https://github.com/Mercury-Language/mercury.git
synced 2026-04-18 19:03:45 +00:00
Estimated hours taken: 1 runtime/machdeps/regtest.c: runtime/machdeps/regtest2.c: runtime/machdeps/doregtest: Add some more tests. runtime/machdeps/SPARC_REGS: Update the commentary here to reflect more a recent version of GNU C.
146 lines
4.7 KiB
Plaintext
146 lines
4.7 KiB
Plaintext
|
|
This file contains the relevant part of config/sparc/sparc.h from the
|
|
GNU C source code which describes how each register is used.
|
|
|
|
#define REGISTER_NAMES \
|
|
{"%g0", "%g1", "%g2", "%g3", "%g4", "%g5", "%g6", "%g7", \
|
|
"%o0", "%o1", "%o2", "%o3", "%o4", "%o5", "%sp", "%o7", \
|
|
"%l0", "%l1", "%l2", "%l3", "%l4", "%l5", "%l6", "%l7", \
|
|
"%i0", "%i1", "%i2", "%i3", "%i4", "%i5", "%fp", "%i7", \
|
|
"%f0", "%f1", "%f2", "%f3", "%f4", "%f5", "%f6", "%f7", \
|
|
"%f8", "%f9", "%f10", "%f11", "%f12", "%f13", "%f14", "%f15", \
|
|
"%f16", "%f17", "%f18", "%f19", "%f20", "%f21", "%f22", "%f23", \
|
|
"%f24", "%f25", "%f26", "%f27", "%f28", "%f29", "%f30", "%f31"}
|
|
|
|
/* 1 for registers that have pervasive standard uses
|
|
and are not available for the register allocator.
|
|
|
|
On non-v9 systems:
|
|
g1 is free to use as temporary.
|
|
g2-g4 are reserved for applications. Gcc normally uses them as
|
|
temporaries, but this can be disabled via the -mno-app-regs option.
|
|
g5 through g7 are reserved for the operating system.
|
|
|
|
On v9 systems:
|
|
g1,g5 are free to use as temporaries, and are free to use between calls
|
|
if the call is to an external function via the PLT.
|
|
g4 is free to use as a temporary in the non-embedded case.
|
|
g4 is reserved in the embedded case.
|
|
g2-g3 are reserved for applications. Gcc normally uses them as
|
|
temporaries, but this can be disabled via the -mno-app-regs option.
|
|
g6-g7 are reserved for the operating system (or application in
|
|
embedded case).
|
|
??? Register 1 is used as a temporary by the 64 bit sethi pattern, so must
|
|
currently be a fixed register until this pattern is rewritten.
|
|
Register 1 is also used when restoring call-preserved registers in large
|
|
stack frames.
|
|
|
|
Registers fixed in arch32 and not arch64 (or vice-versa) are marked in
|
|
CONDITIONAL_REGISTER_USAGE in order to properly handle -ffixed-.
|
|
*/
|
|
|
|
#define FIXED_REGISTERS \
|
|
{1, 0, 0, 0, 0, 0, 1, 1, \
|
|
0, 0, 0, 0, 0, 0, 1, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 1, 1, \
|
|
\
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
\
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
\
|
|
0, 0, 0, 0, 0}
|
|
|
|
/* 1 for registers not available across function calls.
|
|
These must include the FIXED_REGISTERS and also any
|
|
registers that can be used without being saved.
|
|
The latter must include the registers where values are returned
|
|
and the register where structure-value addresses are passed.
|
|
Aside from that, you can include as many other registers as you like. */
|
|
|
|
#define CALL_USED_REGISTERS \
|
|
{1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
0, 0, 0, 0, 0, 0, 0, 0, \
|
|
0, 0, 0, 0, 0, 0, 1, 1, \
|
|
\
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
\
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
1, 1, 1, 1, 1, 1, 1, 1, \
|
|
\
|
|
1, 1, 1, 1, 1}
|
|
|
|
/* If !TARGET_FPU, then make the fp registers and fp cc regs fixed so that
|
|
they won't be allocated. */
|
|
|
|
#define CONDITIONAL_REGISTER_USAGE \
|
|
do \
|
|
{ \
|
|
if (TARGET_ARCH32) \
|
|
{ \
|
|
fixed_regs[5] = 1; \
|
|
} \
|
|
else \
|
|
{ \
|
|
fixed_regs[1] = 1; \
|
|
} \
|
|
if (! TARGET_V9) \
|
|
{ \
|
|
int regno; \
|
|
for (regno = SPARC_FIRST_V9_FP_REG; \
|
|
regno <= SPARC_LAST_V9_FP_REG; \
|
|
regno++) \
|
|
fixed_regs[regno] = 1; \
|
|
/* %fcc0 is used by v8 and v9. */ \
|
|
for (regno = SPARC_FIRST_V9_FCC_REG + 1; \
|
|
regno <= SPARC_LAST_V9_FCC_REG; \
|
|
regno++) \
|
|
fixed_regs[regno] = 1; \
|
|
} \
|
|
if (! TARGET_FPU) \
|
|
{ \
|
|
int regno; \
|
|
for (regno = 32; regno < SPARC_LAST_V9_FCC_REG; regno++) \
|
|
fixed_regs[regno] = 1; \
|
|
} \
|
|
/* Don't unfix g2-g4 if they were fixed with -ffixed-. */ \
|
|
fixed_regs[2] |= ! TARGET_APP_REGS; \
|
|
fixed_regs[3] |= ! TARGET_APP_REGS; \
|
|
fixed_regs[4] |= ! TARGET_APP_REGS || TARGET_CM_EMBMEDANY; \
|
|
if (TARGET_FLAT) \
|
|
{ \
|
|
/* Let the compiler believe the frame pointer is still \
|
|
%fp, but output it as %i7. */ \
|
|
fixed_regs[31] = 1; \
|
|
reg_names[FRAME_POINTER_REGNUM] = "%i7"; \
|
|
/* ??? This is a hack to disable leaf functions. */ \
|
|
global_regs[7] = 1; \
|
|
} \
|
|
if (profile_block_flag) \
|
|
{ \
|
|
/* %g1 and %g2 must be fixed, because BLOCK_PROFILER \
|
|
uses them. */ \
|
|
fixed_regs[1] = 1; \
|
|
fixed_regs[2] = 1; \
|
|
} \
|
|
if (flag_pic != 0) \
|
|
{ \
|
|
fixed_regs[23] = 1; \
|
|
call_used_regs[23] = 1; \
|
|
} \
|
|
} \
|
|
while (0)
|
|
|