pa.h (PIC_OFFSET_TABLE_REGNUM_SAVED): Remove.

* config/pa/pa.h (PIC_OFFSET_TABLE_REGNUM_SAVED): Remove.
	(machine_function): Define.
	(PIC_OFFSET_TABLE_SAVE_RTX) : Define.
	* config/pa/pa.c (pa_init_machine_status, pa_mark_machine_status,
	pa_free_machine_status): New functions.
	(override_options): Set {init,mark,free}_machine_status to above.
	(hppa_expand_prologue): Use PIC_OFFSET_TABLE_SAVE_RTX instead of
	PIC_OFFSET_TABLE_REGNUM_SAVED.
	* config/pa/pa.md: Use PIC_OFFSET_TABLE_SAVE_RTX instead of
	PIC_OFFSET_TABLE_REGNUM_SAVED throughout.
	* config/pa/pa32-regs.h (CONDITIONAL_REGISTER_USAGE): Remove
	references to PIC_OFFSET_TABLE_REGNUM_SAVED.
	* config/pa/pa64-regs.h (CONDITIONAL_REGISTER_USAGE): Likewise.

From-SVN: r39083
This commit is contained in:
Alan Modra 2001-01-17 05:23:22 +00:00 committed by Jeff Law
parent 19c976393d
commit 5dfcd8e17e
6 changed files with 87 additions and 57 deletions

View File

@ -1,3 +1,19 @@
Tue Jan 16 22:23:04 2001 Alan Modra (alan@linuxcare.com.au)
* config/pa/pa.h (PIC_OFFSET_TABLE_REGNUM_SAVED): Remove.
(machine_function): Define.
(PIC_OFFSET_TABLE_SAVE_RTX) : Define.
* config/pa/pa.c (pa_init_machine_status, pa_mark_machine_status,
pa_free_machine_status): New functions.
(override_options): Set {init,mark,free}_machine_status to above.
(hppa_expand_prologue): Use PIC_OFFSET_TABLE_SAVE_RTX instead of
PIC_OFFSET_TABLE_REGNUM_SAVED.
* config/pa/pa.md: Use PIC_OFFSET_TABLE_SAVE_RTX instead of
PIC_OFFSET_TABLE_REGNUM_SAVED throughout.
* config/pa/pa32-regs.h (CONDITIONAL_REGISTER_USAGE): Remove
references to PIC_OFFSET_TABLE_REGNUM_SAVED.
* config/pa/pa64-regs.h (CONDITIONAL_REGISTER_USAGE): Likewise.
2001-01-15 DJ Delorie <dj@redhat.com>
* Makefile.in (gcov.1): Protect against texi2pod/pod2man failing.

View File

@ -1,5 +1,5 @@
/* Subroutines for insn-output.c for HPPA.
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
Free Software Foundation, Inc.
Contributed by Tim Moore (moore@cs.utah.edu), based on sparc.c
@ -43,6 +43,9 @@ Boston, MA 02111-1307, USA. */
#include "recog.h"
#include "tm_p.h"
static void pa_init_machine_status PARAMS ((struct function *));
static void pa_mark_machine_status PARAMS ((struct function *));
static void pa_free_machine_status PARAMS ((struct function *));
static void pa_combine_instructions PARAMS ((rtx));
static int pa_can_combine_p PARAMS ((rtx, rtx, rtx, int, rtx, rtx, rtx));
static int forward_branch_p PARAMS ((rtx));
@ -186,6 +189,43 @@ override_options ()
/* Register global variables with the garbage collector. */
pa_add_gc_roots ();
/* Arrange to save and restore machine status around nested functions. */
init_machine_status = pa_init_machine_status;
mark_machine_status = pa_mark_machine_status;
free_machine_status = pa_free_machine_status;
}
/* Functions to initialize pic_offset_table_save_rtx.
These will be called, via pointer variables,
from push_function_context and pop_function_context. */
static void
pa_init_machine_status (p)
struct function *p;
{
p->machine = (machine_function *) xmalloc (sizeof (machine_function));
p->machine->pic_offset_table_save_rtx = gen_reg_rtx (Pmode);
}
static void
pa_mark_machine_status (p)
struct function *p;
{
if (p->machine)
ggc_mark_rtx (p->machine->pic_offset_table_save_rtx);
}
static void
pa_free_machine_status (p)
struct function *p;
{
if (p->machine == NULL)
return;
free (p->machine);
p->machine = NULL;
}
@ -2653,7 +2693,7 @@ remove_useless_addtr_insns (insns, check_notes)
}
/* You may have trouble believing this, but this is the HP-PA stack
/* You may have trouble believing this, but this is the 32 bit HP-PA stack
layout. Wow.
Offset Contents
@ -3153,19 +3193,17 @@ hppa_expand_prologue()
made incorrect assumptions about using global variables to hold
per-function rtl code generated in the backend.
So instead, we copy the PIC register into a reserved callee saved
register in the prologue. Then after each call we reload the PIC
register from the callee saved register. We also reload the PIC
register from the callee saved register in the epilogue ensure the
PIC register is valid at function exit.
So instead, we copy the PIC register into a callee saved register
in the prologue. Then after each call we reload the PIC register
from the callee saved register.
This may (depending on the exact characteristics of the function)
even be more efficient.
Avoid doing this if the register isn't used (eg. leaf functions)
as it's an error to delete an instruction from the prologue. */
Avoid this if the callee saved register wasn't used (these are
leaf functions). */
if (flag_pic && regs_ever_live[PIC_OFFSET_TABLE_REGNUM_SAVED])
emit_move_insn (gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED),
if (flag_pic
&& (GET_CODE (PIC_OFFSET_TABLE_SAVE_RTX) != REG
|| HARD_REGISTER_P (PIC_OFFSET_TABLE_SAVE_RTX)))
emit_move_insn (PIC_OFFSET_TABLE_SAVE_RTX,
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM));
}

View File

@ -70,6 +70,14 @@ enum architecture_type
ARCHITECTURE_20
};
struct rtx_def;
/* A C structure for machine-specific, per-function data.
This is added to the cfun structure. */
typedef struct machine_function
{
struct rtx_def *pic_offset_table_save_rtx;
} machine_function;
/* For -march= option. */
extern const char *pa_arch_string;
extern enum architecture_type pa_arch;
@ -493,8 +501,8 @@ extern int target_flags;
#define PIC_OFFSET_TABLE_REG_CALL_CLOBBERED 1
/* Register into which we save the PIC_OFFEST_TABLE_REGNUM so that it
can be restore across function calls. */
#define PIC_OFFSET_TABLE_REGNUM_SAVED 4
can be restored across function calls. */
#define PIC_OFFSET_TABLE_SAVE_RTX (cfun->machine->pic_offset_table_save_rtx)
#define DEFAULT_PCC_STRUCT_RETURN 0

View File

@ -5735,18 +5735,12 @@
if (flag_pic)
{
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
if (TARGET_64BIT)
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
/* After each call we must restore the PIC register, even if it
doesn't appear to be used.
This will set regs_ever_live for the callee saved register we
stored the PIC register in. */
emit_move_insn (pic_offset_table_rtx,
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
doesn't appear to be used. */
emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
}
DONE;
}")
@ -5915,18 +5909,12 @@
if (flag_pic)
{
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
if (TARGET_64BIT)
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), arg_pointer_rtx);
/* After each call we must restore the PIC register, even if it
doesn't appear to be used.
This will set regs_ever_live for the callee saved register we
stored the PIC register in. */
emit_move_insn (pic_offset_table_rtx,
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
doesn't appear to be used. */
emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
}
DONE;
}")
@ -6096,16 +6084,10 @@
if (flag_pic)
{
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
/* After each call we must restore the PIC register, even if it
doesn't appear to be used.
This will set regs_ever_live for the callee saved register we
stored the PIC register in. */
emit_move_insn (pic_offset_table_rtx,
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
doesn't appear to be used. */
emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
}
DONE;
}")
@ -6158,16 +6140,10 @@
if (flag_pic)
{
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn), pic_offset_table_rtx);
use_reg (&CALL_INSN_FUNCTION_USAGE (call_insn),
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
/* After each call we must restore the PIC register, even if it
doesn't appear to be used.
This will set regs_ever_live for the callee saved register we
stored the PIC register in. */
emit_move_insn (pic_offset_table_rtx,
gen_rtx_REG (word_mode, PIC_OFFSET_TABLE_REGNUM_SAVED));
doesn't appear to be used. */
emit_move_insn (pic_offset_table_rtx, PIC_OFFSET_TABLE_SAVE_RTX);
}
DONE;
}")

View File

@ -110,11 +110,7 @@
fixed_regs[i] = call_used_regs[i] = 1; \
} \
if (flag_pic) \
{ \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
fixed_regs[PIC_OFFSET_TABLE_REGNUM_SAVED] = 1;\
call_used_regs[PIC_OFFSET_TABLE_REGNUM_SAVED] = 1;\
} \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
}
/* Allocate the call used registers first. This should minimize

View File

@ -109,11 +109,7 @@ Boston, MA 02111-1307, USA. */
fixed_regs[i] = call_used_regs[i] = 1; \
} \
if (flag_pic) \
{ \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
fixed_regs[PIC_OFFSET_TABLE_REGNUM_SAVED] = 1;\
call_used_regs[PIC_OFFSET_TABLE_REGNUM_SAVED] = 1;\
} \
fixed_regs[PIC_OFFSET_TABLE_REGNUM] = 1; \
}
/* Allocate the call used registers first. This should minimize