TARGET_NO_SPACE_REGS no longer affects call sequences.

* pa.h: Revise comments for TARGET_NO_SPACE_REGS and
	TARGET_FAST_INDIRECT_CALLS.
	* pa.c (override_options): TARGET_NO_SPACE_REGS is now OK with
	-fPIC.  Don't warn.
	(return_addr_rtx): Short circuit export stub matching when
	TARGET_NO_SPACE_REGS.
	(output_millicode_call): For out of range calls, make -fPIC
	take precedence, then TARGET_PORTABLE_RUNTIME, then ble.  Don't
	return before delay slot checks when TARGET_PORTABLE_RUNTIME.
	* pa.md: Modify length attr calculation of all millicode insns to
	match above.

From-SVN: r41042
This commit is contained in:
Alan Modra 2001-04-03 07:43:27 +00:00 committed by Alan Modra
parent 26ebcef1b5
commit a7721dc03f
4 changed files with 139 additions and 153 deletions

View File

@ -1,3 +1,17 @@
2001-04-03 Alan Modra <alan@linuxcare.com.au>
* pa.h: Revise comments for TARGET_NO_SPACE_REGS and
TARGET_FAST_INDIRECT_CALLS.
* pa.c (override_options): TARGET_NO_SPACE_REGS is now OK with
-fPIC. Don't warn.
(return_addr_rtx): Short circuit export stub matching when
TARGET_NO_SPACE_REGS.
(output_millicode_call): For out of range calls, make -fPIC
take precedence, then TARGET_PORTABLE_RUNTIME, then ble. Don't
return before delay slot checks when TARGET_PORTABLE_RUNTIME.
* pa.md: Modify length attr calculation of all millicode insns to
match above.
2001-04-02 Geoffrey Keating <geoffk@redhat.com>
* configure.in (gcc_cv_as_leb128): Correct name of cache variable.
@ -7,7 +21,7 @@
2001-04-03 Alan Modra <alan@linuxcare.com.au>
* config/pa/pa.c (override_options): Remove PIC profiling warning.
* pa.c (override_options): Remove PIC profiling warning.
(hp_profile_labelno): Delete.
(hp_profile_label_rtx): Delete.
(hp_profile_label_name): Delete.
@ -20,15 +34,15 @@
(hppa_init_pic_save): Emit before tail_recursion_reentry, and
cater for PROFILE_HOOK.
(hppa_profile_hook): New function.
* config/pa/pa.h (FUNCTION_PROFILER): Now does nothing.
* pa.h (FUNCTION_PROFILER): Now does nothing.
(PROFILE_HOOK): Define.
(hppa_profile_hook): Declare.
(PROFILE_BEFORE_PROLOGUE): Delete.
(ASM_OUTPUT_REG_PUSH): Delete.
(ASM_OUTPUT_REG_POP): Delete.
* config/pa/pa.md (call_profiler): Turn it into a call insn, and
don't `use' r24. Accept function name operand, and use this and a
locally generated label to calculate pc-rel offset to func start.
* pa.md (call_profiler): Turn it into a call insn, and don't `use'
r24. Accept function name operand, and use this and a locally
generated label to calculate pc-rel offset to func start.
2001-04-02 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
@ -4476,8 +4490,6 @@ Thu Feb 1 07:22:41 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
2001-01-31 Alan Modra <alan@linuxcare.com.au>
* (hppa_init_pic_save): Emit the pic offset table
reg save after last_parm_insn.
* pa.c (hppa_init_pic_save): New function.
* pa.h (hppa_init_pic_save): Declare.
* pa.md (call, call_value, sibcall, sibcall_value): Use

View File

@ -162,7 +162,7 @@ override_options ()
warning ("PIC code generation is not supported in the portable runtime model\n");
}
if (flag_pic && (TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS))
if (flag_pic && TARGET_FAST_INDIRECT_CALLS)
{
warning ("PIC code generation is not compatible with fast indirect calls\n");
}
@ -3402,15 +3402,17 @@ return_addr_rtx (count, frameaddr)
rtx saved_rp;
rtx ins;
saved_rp = gen_reg_rtx (Pmode);
if (TARGET_64BIT)
return gen_rtx_MEM (Pmode, plus_constant (frameaddr, -16));
if (TARGET_NO_SPACE_REGS)
return gen_rtx_MEM (Pmode, plus_constant (frameaddr, -20));
/* First, we start off with the normal return address pointer from
-20[frameaddr]. */
if (TARGET_64BIT)
return gen_rtx_MEM (Pmode, plus_constant (frameaddr, -16));
else
emit_move_insn (saved_rp, plus_constant (frameaddr, -5 * UNITS_PER_WORD));
saved_rp = gen_reg_rtx (Pmode);
emit_move_insn (saved_rp, plus_constant (frameaddr, -20));
/* Get pointer to the instruction stream. We have to mask out the
privilege level from the two low order bits of the return address
@ -3461,7 +3463,7 @@ return_addr_rtx (count, frameaddr)
but rather the return address that leads back into user code.
That return address is stored at -24[frameaddr]. */
emit_move_insn (saved_rp, plus_constant (frameaddr, -6 * UNITS_PER_WORD));
emit_move_insn (saved_rp, plus_constant (frameaddr, -24));
emit_label (label);
return gen_rtx_MEM (Pmode, memory_address (Pmode, saved_rp));
@ -5559,9 +5561,7 @@ output_millicode_call (insn, call_dest)
rtx xoperands[4];
rtx seq_insn;
xoperands[3] = gen_rtx_REG (SImode, 31);
if (TARGET_64BIT)
xoperands[3] = gen_rtx_REG (SImode, 2);
xoperands[3] = gen_rtx_REG (Pmode, TARGET_64BIT ? 2 : 31);
/* Handle common case -- empty delay slot or no jump in the delay slot,
and we're sure that the branch will reach the beginning of the $CODE$
@ -5597,38 +5597,8 @@ output_millicode_call (insn, call_dest)
delay_insn_deleted = 1;
}
/* If we're allowed to use be/ble instructions, then this is the
best sequence to use for a long millicode call. */
if (TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS
|| ! (flag_pic || TARGET_PORTABLE_RUNTIME))
{
xoperands[0] = call_dest;
output_asm_insn ("ldil L%%%0,%3", xoperands);
output_asm_insn ("{ble|be,l} R%%%0(%%sr4,%3)", xoperands);
output_asm_insn ("nop", xoperands);
}
/* Pure portable runtime doesn't allow be/ble; we also don't have
PIC support int he assembler/linker, so this sequence is needed. */
else if (TARGET_PORTABLE_RUNTIME)
{
xoperands[0] = call_dest;
/* Get the address of our target into %r29. */
output_asm_insn ("ldil L%%%0,%%r29", xoperands);
output_asm_insn ("ldo R%%%0(%%r29),%%r29", xoperands);
/* Get our return address into %r31. */
output_asm_insn ("blr %%r0,%3", xoperands);
/* Jump to our target address in %r29. */
output_asm_insn ("bv,n %%r0(%%r29)", xoperands);
/* Empty delay slot. Note this insn gets fetched twice and
executed once. To be safe we use a nop. */
output_asm_insn ("nop", xoperands);
return "";
}
/* PIC long millicode call sequence. */
else
if (flag_pic)
{
xoperands[0] = call_dest;
xoperands[1] = gen_label_rtx ();
@ -5651,6 +5621,34 @@ output_millicode_call (insn, call_dest)
executed once. To be safe we use a nop. */
output_asm_insn ("nop", xoperands);
}
/* Pure portable runtime doesn't allow be/ble; we also don't have
PIC support in the assembler/linker, so this sequence is needed. */
else if (TARGET_PORTABLE_RUNTIME)
{
xoperands[0] = call_dest;
/* Get the address of our target into %r29. */
output_asm_insn ("ldil L%%%0,%%r29", xoperands);
output_asm_insn ("ldo R%%%0(%%r29),%%r29", xoperands);
/* Get our return address into %r31. */
output_asm_insn ("blr %%r0,%3", xoperands);
/* Jump to our target address in %r29. */
output_asm_insn ("bv,n %%r0(%%r29)", xoperands);
/* Empty delay slot. Note this insn gets fetched twice and
executed once. To be safe we use a nop. */
output_asm_insn ("nop", xoperands);
}
/* If we're allowed to use be/ble instructions, then this is the
best sequence to use for a long millicode call. */
else
{
xoperands[0] = call_dest;
output_asm_insn ("ldil L%%%0,%3", xoperands);
output_asm_insn ("{ble|be,l} R%%%0(%%sr4,%3)", xoperands);
output_asm_insn ("nop", xoperands);
}
/* If we had a jump in the call's delay slot, output it now. */
if (dbr_sequence_length () != 0

View File

@ -106,13 +106,9 @@ extern int target_flags;
#define MASK_DISABLE_FPREGS 2
#define TARGET_DISABLE_FPREGS (target_flags & MASK_DISABLE_FPREGS)
/* Generate code which assumes that calls through function pointers will
never cross a space boundary. Such assumptions are generally safe for
building kernels and statically linked executables. Code compiled with
this option will fail miserably if the executable is dynamically linked
or uses nested functions!
This is also used to trigger aggressive unscaled index addressing. */
/* Generate code which assumes that all space register are equivalent.
Triggers aggressive unscaled index addressing and faster
builtin_return_address. */
#define MASK_NO_SPACE_REGS 4
#define TARGET_NO_SPACE_REGS (target_flags & MASK_NO_SPACE_REGS)
@ -148,7 +144,12 @@ extern int target_flags;
#define MASK_LONG_LOAD_STORE 512
#define TARGET_LONG_LOAD_STORE (target_flags & MASK_LONG_LOAD_STORE)
/* Use a faster sequence for indirect calls. */
/* Use a faster sequence for indirect calls. This assumes that calls
through function pointers will never cross a space boundary, and
that the executable is not dynamically linked. Such assumptions
are generally safe for building kernels and statically linked
executables. Code compiled with this option will fail miserably if
the executable is dynamically linked or uses nested functions! */
#define MASK_FAST_INDIRECT_CALLS 1024
#define TARGET_FAST_INDIRECT_CALLS (target_flags & MASK_FAST_INDIRECT_CALLS)

View File

@ -3942,21 +3942,18 @@
(const_int 0)))
(const_int 4)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 8)
(const_int 24)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 8)]
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range and either PIC or PORTABLE_RUNTIME
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
(define_expand "muldi3"
[(set (match_operand:DI 0 "register_operand" "")
@ -4049,21 +4046,18 @@
(const_int 0)))
(const_int 4)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 8)
(const_int 24)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 8)]
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range and either PIC or PORTABLE_RUNTIME
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
(define_expand "udivsi3"
[(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
@ -4107,21 +4101,18 @@
(const_int 0)))
(const_int 4)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 8)
(const_int 24)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 8)]
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range and either PIC or PORTABLE_RUNTIME
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
(define_expand "modsi3"
[(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
@ -4162,21 +4153,18 @@
(const_int 0)))
(const_int 4)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 8)
(const_int 24)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 8)]
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range and either PIC or PORTABLE_RUNTIME
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
(define_expand "umodsi3"
[(set (reg:SI 26) (match_operand:SI 1 "move_operand" ""))
@ -4217,21 +4205,18 @@
(const_int 0)))
(const_int 4)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 8)
(const_int 24)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 8)]
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range and either PIC or PORTABLE_RUNTIME
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
;;- and instructions
;; We define DImode `and` so with DImode `not` we can get
@ -5803,7 +5788,7 @@
rtx xoperands[2];
/* First the special case for kernels, level 0 systems, etc. */
if (TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS)
if (TARGET_FAST_INDIRECT_CALLS)
return \"ble 0(%%sr4,%%r22)\;copy %%r31,%%r2\";
/* Now the normal case -- we can reach $$dyncall directly or
@ -5838,8 +5823,8 @@
[(set_attr "type" "dyncall")
(set (attr "length")
(cond [
;; First NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; First FAST_INDIRECT_CALLS
(ne (symbol_ref "TARGET_FAST_INDIRECT_CALLS")
(const_int 0))
(const_int 8)
@ -5850,19 +5835,18 @@
(const_int 0)))
(const_int 8)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 12)
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 24)
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range PIC case
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
(define_expand "call_value"
[(parallel [(set (match_operand 0 "" "")
@ -5982,7 +5966,7 @@
rtx xoperands[2];
/* First the special case for kernels, level 0 systems, etc. */
if (TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS)
if (TARGET_FAST_INDIRECT_CALLS)
return \"ble 0(%%sr4,%%r22)\;copy %%r31,%%r2\";
/* Now the normal case -- we can reach $$dyncall directly or
@ -6017,8 +6001,8 @@
[(set_attr "type" "dyncall")
(set (attr "length")
(cond [
;; First NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
;; First FAST_INDIRECT_CALLS
(ne (symbol_ref "TARGET_FAST_INDIRECT_CALLS")
(const_int 0))
(const_int 8)
@ -6029,19 +6013,18 @@
(const_int 0)))
(const_int 8)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 12)
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 24)
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 20)]
;; Out of range PIC case
(const_int 24)))])
;; Out of reach, can use ble
(const_int 12)))])
;; Call subroutine returning any type.
@ -7109,26 +7092,18 @@
(const_int 0)))
(const_int 28)
;; NO_SPACE_REGS
(ne (symbol_ref "TARGET_NO_SPACE_REGS || TARGET_FAST_INDIRECT_CALLS")
(const_int 0))
(const_int 32)
;; Out of reach PIC
(ne (symbol_ref "flag_pic")
(const_int 0))
(const_int 44)
;; Out of reach, but not PIC or PORTABLE_RUNTIME
;; same as NO_SPACE_REGS code
(and (eq (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(eq (symbol_ref "flag_pic")
(const_int 0)))
(const_int 32)
;; PORTABLE_RUNTIME
;; Out of reach PORTABLE_RUNTIME
(ne (symbol_ref "TARGET_PORTABLE_RUNTIME")
(const_int 0))
(const_int 40)]
;; Out of range and PIC
(const_int 44)))])
;; Out of reach, can use ble
(const_int 32)))])
;; On the PA, the PIC register is call clobbered, so it must
;; be saved & restored around calls by the caller. If the call