Commit 00b960c7 by Aldy Hernandez Committed by Aldy Hernandez

rs6000.c (direct_return): Check if we are saving altivec registers.

	* rs6000.c (direct_return): Check if we are saving altivec
	registers.
	(first_altivec_reg_to_save): New.
	Updated stack frame layout comments.
	(rs6000_stack_info): Calculate altivec register save size.
	Save link register if we saved some altivec registers.
	(rs6000_stack_info): Align save size to 16 if altivec abi or
	abi_darwin.
	(rs6000_stack_info): Calculate altivec register offsets.
	(rs6000_stack_info): Add altivec info to save_size.
	(debug_stack_info): Add altivec debug info.
	(rs6000_emit_prologue): Save altivec registers and vrsave.
	(compute_vrsave_mask): New.
	(altivec_expand_builtin): Remove unused variables.
	(rs6000_parse_abi_options): Add static qualifier.
	(rs6000_expand_builtin): Remove unused parameters.
	(altivec_expand_builtin): Cast bdesc_2arg to get rid of warning.
	(altivec_init_builtins): Same.
	(is_altivec_return_reg): New.
	(vrsave_operation): New.
	(ALTIVEC_REG_BIT): New.
	(generate_set_vrsave): New.

	* rs6000.md (get_vrsave): New.
	(set_vrsave): New.
	(*set_vrsave_internal): New.

	* rs6000.h (rs6000_stack): Add first_altivec_reg_save,
	altivec_save_offset, vrsave_save_offset, altive_size, vrsave_size,
	altivec_padding_size, vrsave_mask.
	(TOTAL_ALTIVEC_REGS): New.
	(EPILOGUE_USES): Add VRSAVE_REGNO.

From-SVN: r47228
parent 1b735a57
2001-11-15 Aldy Hernandez <aldyh@redhat.com>
* rs6000.c (direct_return): Check if we are saving altivec
registers.
(first_altivec_reg_to_save): New.
Updated stack frame layout comments.
(rs6000_stack_info): Calculate altivec register save size.
Save link register if we saved some altivec registers.
(rs6000_stack_info): Align save size to 16 if altivec abi or
abi_darwin.
(rs6000_stack_info): Calculate altivec register offsets.
(rs6000_stack_info): Add altivec info to save_size.
(debug_stack_info): Add altivec debug info.
(rs6000_emit_prologue): Save altivec registers and vrsave.
(compute_vrsave_mask): New.
(altivec_expand_builtin): Remove unused variables.
(rs6000_parse_abi_options): Add static qualifier.
(rs6000_expand_builtin): Remove unused parameters.
(altivec_expand_builtin): Cast bdesc_2arg to get rid of warning.
(altivec_init_builtins): Same.
(is_altivec_return_reg): New.
(vrsave_operation): New.
(ALTIVEC_REG_BIT): New.
(generate_set_vrsave): New.
* rs6000.md (get_vrsave): New.
(set_vrsave): New.
(*set_vrsave_internal): New.
* rs6000.h (rs6000_stack): Add first_altivec_reg_save,
altivec_save_offset, vrsave_save_offset, altive_size, vrsave_size,
altivec_padding_size, vrsave_mask.
(TOTAL_ALTIVEC_REGS): New.
(EPILOGUE_USES): Add VRSAVE_REGNO.
2001-11-20 Jeff Law <law@redhat.com>
* unroll.c (copy_loop_body): Update LABEL_NUSES for the
......
......@@ -736,6 +736,7 @@ extern int rs6000_debug_arg; /* debug argument handling */
#define XER_REGNO 76
#define FIRST_ALTIVEC_REGNO 77
#define LAST_ALTIVEC_REGNO 108
#define TOTAL_ALTIVEC_REGS (LAST_ALTIVEC_REGNO - FIRST_ALTIVEC_REGNO)
#define VRSAVE_REGNO 109
/* List the order in which to allocate registers. Each register must be
......@@ -1265,16 +1266,20 @@ extern enum rs6000_abi rs6000_current_abi; /* available for use by subtarget */
typedef struct rs6000_stack {
int first_gp_reg_save; /* first callee saved GP register used */
int first_fp_reg_save; /* first callee saved FP register used */
int first_altivec_reg_save; /* first callee saved AltiVec register used */
int lr_save_p; /* true if the link reg needs to be saved */
int cr_save_p; /* true if the CR reg needs to be saved */
unsigned int vrsave_mask; /* mask of vec registers to save */
int toc_save_p; /* true if the TOC needs to be saved */
int push_p; /* true if we need to allocate stack space */
int calls_p; /* true if the function makes any calls */
enum rs6000_abi abi; /* which ABI to use */
int gp_save_offset; /* offset to save GP regs from initial SP */
int fp_save_offset; /* offset to save FP regs from initial SP */
int altivec_save_offset; /* offset to save AltiVec regs from inital SP */
int lr_save_offset; /* offset to save LR from initial SP */
int cr_save_offset; /* offset to save CR from initial SP */
int vrsave_save_offset; /* offset to save VRSAVE from initial SP */
int toc_save_offset; /* offset to save the TOC pointer */
int varargs_save_offset; /* offset to save the varargs registers */
int ehrd_offset; /* offset to EH return data */
......@@ -1286,8 +1291,12 @@ typedef struct rs6000_stack {
int fixed_size; /* fixed size of stack frame */
int gp_size; /* size of saved GP registers */
int fp_size; /* size of saved FP registers */
int altivec_size; /* size of saved AltiVec registers */
int cr_size; /* size to hold CR if not in save_size */
int lr_size; /* size to hold LR if not in save_size */
int vrsave_size; /* size to hold VRSAVE if not in save_size */
int altivec_padding_size; /* size of altivec alignment padding if
not in save_size */
int toc_size; /* size to hold TOC if not in save_size */
int total_size; /* total bytes allocated for stack */
} rs6000_stack_t;
......@@ -1685,6 +1694,7 @@ typedef struct rs6000_args
#define EPILOGUE_USES(REGNO) \
((reload_completed && (REGNO) == LINK_REGISTER_REGNUM) \
|| (REGNO) == VRSAVE_REGNO \
|| (current_function_calls_eh_return \
&& TARGET_AIX \
&& (REGNO) == TOC_REGISTER))
......@@ -2792,6 +2802,7 @@ do { \
CONST_DOUBLE, SYMBOL_REF}}, \
{"load_multiple_operation", {PARALLEL}}, \
{"store_multiple_operation", {PARALLEL}}, \
{"vrsave_operation", {PARALLEL}}, \
{"branch_comparison_operator", {EQ, NE, LE, LT, GE, \
GT, LEU, LTU, GEU, GTU, \
UNORDERED, ORDERED, \
......
......@@ -13622,6 +13622,31 @@
vor %0,%1,%1"
[(set_attr "type" "altivec")])
;; Copy VRSAVE into a GPR.
(define_insn "get_vrsave"
[(set (match_operand:SI 0 "register_operand" "=r")
(unspec:SI [(reg:SI 109)] 28))]
"TARGET_ALTIVEC"
"mfvrsave %0"
[(set_attr "type" "altivec")])
(define_insn "*set_vrsave_internal"
[(match_parallel 0 "vrsave_operation"
[(set (reg:SI 109)
(unspec:SI [(match_operand:SI 1 "register_operand" "r")
(reg:SI 109)] 30))])]
"TARGET_ALTIVEC"
"mtvrsave %1"
[(set_attr "type" "altivec")])
(define_insn "set_vrsave"
[(set (reg:SI 109)
(unspec:SI [(match_operand:SI 0 "register_operand" "r")
(reg:SI 109)] 30))]
"TARGET_ALTIVEC"
"mtvrsave %0"
[(set_attr "type" "altivec")])
;; Simple binary operations.
(define_insn "altivec_vaddubm"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment