mn10300.h (FIRST_PSEUDO_REGISTER): Increment by one.
* config/mn10300/mn10300.h (FIRST_PSEUDO_REGISTER): Increment by one. (MDR_REGNUM): Define. (FIXED_REGISTERS, CALL_USED_REGISTERS): Add MDR as a fixed register. (REG_CLASS_CONTENTS): Add MDR to ALL_REGS. (INCOMING_RETURN_ADDR_RTX): Define in terms of MDR. (REGISTER_NAMES): Add MDR. (DWARF2_DEBUGGING_INFO): Define to 1. * config/mn10300/mn10300.c (TARGET_EXCEPT_UNWIND_INFO): Define. (F): New function. Sets RTX_FRAME_RELATED_P. (mn10300_gen_multiple_store): Use F. (expand_prologue): Use F. Use gen_movsf() to push floating point registers. (expand_epilogue): Use gen_movsf() to pop floating point registers. (mn10300_option_override): Disable combine stack adjust pass. From-SVN: r165015
This commit is contained in:
parent
28ce2f29b8
commit
2720cc4717
|
@ -1,3 +1,23 @@
|
|||
2010-10-06 Nick Clifton <nickc@redhat.com>
|
||||
|
||||
* config/mn10300/mn10300.h (FIRST_PSEUDO_REGISTER): Increment by
|
||||
one.
|
||||
(MDR_REGNUM): Define.
|
||||
(FIXED_REGISTERS, CALL_USED_REGISTERS): Add MDR as a fixed
|
||||
register.
|
||||
(REG_CLASS_CONTENTS): Add MDR to ALL_REGS.
|
||||
(INCOMING_RETURN_ADDR_RTX): Define in terms of MDR.
|
||||
(REGISTER_NAMES): Add MDR.
|
||||
(DWARF2_DEBUGGING_INFO): Define to 1.
|
||||
* config/mn10300/mn10300.c (TARGET_EXCEPT_UNWIND_INFO): Define.
|
||||
(F): New function. Sets RTX_FRAME_RELATED_P.
|
||||
(mn10300_gen_multiple_store): Use F.
|
||||
(expand_prologue): Use F. Use gen_movsf() to push floating
|
||||
point registers.
|
||||
(expand_epilogue): Use gen_movsf() to pop floating point
|
||||
registers.
|
||||
(mn10300_option_override): Disable combine stack adjust pass.
|
||||
|
||||
2010-10-06 Thomas Schwinge <thomas@schwinge.name>
|
||||
|
||||
PR target/45901
|
||||
|
|
|
@ -93,6 +93,9 @@ static void mn10300_asm_output_mi_thunk (FILE *, tree, HOST_WIDE_INT, HOST_WIDE_
|
|||
static bool mn10300_can_output_mi_thunk (const_tree, HOST_WIDE_INT, HOST_WIDE_INT, const_tree);
|
||||
|
||||
/* Initialize the GCC target structure. */
|
||||
#undef TARGET_EXCEPT_UNWIND_INFO
|
||||
#define TARGET_EXCEPT_UNWIND_INFO sjlj_except_unwind_info
|
||||
|
||||
#undef TARGET_ASM_ALIGNED_HI_OP
|
||||
#define TARGET_ASM_ALIGNED_HI_OP "\t.hword\t"
|
||||
|
||||
|
@ -187,6 +190,12 @@ mn10300_option_override (void)
|
|||
{
|
||||
if (TARGET_AM33)
|
||||
target_flags &= ~MASK_MULT_BUG;
|
||||
|
||||
/* FIXME: The combine stack adjustments pass is breaking
|
||||
cc0-setter/cc0-user relationship by inserting a jump
|
||||
instruction. This should be investigated, but for now
|
||||
just disable the pass. */
|
||||
flag_combine_stack_adjustments = 0;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -661,6 +670,13 @@ mn10300_get_live_callee_saved_regs (void)
|
|||
return mask;
|
||||
}
|
||||
|
||||
static rtx
|
||||
F (rtx r)
|
||||
{
|
||||
RTX_FRAME_RELATED_P (r) = 1;
|
||||
return r;
|
||||
}
|
||||
|
||||
/* Generate an instruction that pushes several registers onto the stack.
|
||||
Register K will be saved if bit K in MASK is set. The function does
|
||||
nothing if MASK is zero.
|
||||
|
@ -702,11 +718,11 @@ mn10300_gen_multiple_store (int mask)
|
|||
|
||||
/* Create the instruction that updates the stack pointer. */
|
||||
XVECEXP (par, 0, 0)
|
||||
= gen_rtx_SET (SImode,
|
||||
stack_pointer_rtx,
|
||||
gen_rtx_PLUS (SImode,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-count * 4)));
|
||||
= F (gen_rtx_SET (SImode,
|
||||
stack_pointer_rtx,
|
||||
gen_rtx_PLUS (SImode,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-count * 4))));
|
||||
|
||||
/* Create each store. */
|
||||
pari = 1;
|
||||
|
@ -717,14 +733,13 @@ mn10300_gen_multiple_store (int mask)
|
|||
stack_pointer_rtx,
|
||||
GEN_INT (-pari * 4));
|
||||
XVECEXP(par, 0, pari)
|
||||
= gen_rtx_SET (VOIDmode,
|
||||
gen_rtx_MEM (SImode, address),
|
||||
gen_rtx_REG (SImode, i));
|
||||
= F (gen_rtx_SET (VOIDmode,
|
||||
gen_rtx_MEM (SImode, address),
|
||||
gen_rtx_REG (SImode, i)));
|
||||
pari += 1;
|
||||
}
|
||||
|
||||
par = emit_insn (par);
|
||||
RTX_FRAME_RELATED_P (par) = 1;
|
||||
F (emit_insn (par));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -751,7 +766,6 @@ expand_prologue (void)
|
|||
save_a0_no_merge } strategy;
|
||||
unsigned int strategy_size = (unsigned)-1, this_strategy_size;
|
||||
rtx reg;
|
||||
rtx insn;
|
||||
|
||||
/* We have several different strategies to save FP registers.
|
||||
We can store them using SP offsets, which is beneficial if
|
||||
|
@ -891,25 +905,25 @@ expand_prologue (void)
|
|||
{
|
||||
case save_sp_no_merge:
|
||||
case save_a0_no_merge:
|
||||
emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-4 * num_regs_to_save)));
|
||||
F (emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-4 * num_regs_to_save))));
|
||||
xsize = 0;
|
||||
break;
|
||||
|
||||
case save_sp_partial_merge:
|
||||
emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-128)));
|
||||
F (emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-128))));
|
||||
xsize = 128 - 4 * num_regs_to_save;
|
||||
size -= xsize;
|
||||
break;
|
||||
|
||||
case save_sp_merge:
|
||||
case save_a0_merge:
|
||||
emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-(size + 4 * num_regs_to_save))));
|
||||
F (emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-(size + 4 * num_regs_to_save)))));
|
||||
/* We'll have to adjust FP register saves according to the
|
||||
frame size. */
|
||||
xsize = size;
|
||||
|
@ -934,9 +948,9 @@ expand_prologue (void)
|
|||
case save_a0_merge:
|
||||
case save_a0_no_merge:
|
||||
reg = gen_rtx_REG (SImode, FIRST_ADDRESS_REGNUM);
|
||||
emit_insn (gen_movsi (reg, stack_pointer_rtx));
|
||||
F (emit_insn (gen_movsi (reg, stack_pointer_rtx)));
|
||||
if (xsize)
|
||||
emit_insn (gen_addsi3 (reg, reg, GEN_INT (xsize)));
|
||||
F (emit_insn (gen_addsi3 (reg, reg, GEN_INT (xsize))));
|
||||
reg = gen_rtx_POST_INC (SImode, reg);
|
||||
break;
|
||||
|
||||
|
@ -967,22 +981,21 @@ expand_prologue (void)
|
|||
xsize += 4;
|
||||
}
|
||||
|
||||
insn = emit_insn (gen_movsi (gen_rtx_MEM (SImode, addr),
|
||||
gen_rtx_REG (SImode, i)));
|
||||
|
||||
RTX_FRAME_RELATED_P (insn) = 1;
|
||||
F (emit_insn (gen_movsf (gen_rtx_MEM (SFmode, addr),
|
||||
gen_rtx_REG (SFmode, i))));
|
||||
}
|
||||
}
|
||||
|
||||
/* Now put the frame pointer into the frame pointer register. */
|
||||
if (frame_pointer_needed)
|
||||
emit_move_insn (frame_pointer_rtx, stack_pointer_rtx);
|
||||
F (emit_move_insn (frame_pointer_rtx, stack_pointer_rtx));
|
||||
|
||||
/* Allocate stack for this frame. */
|
||||
if (size)
|
||||
emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-size)));
|
||||
F (emit_insn (gen_addsi3 (stack_pointer_rtx,
|
||||
stack_pointer_rtx,
|
||||
GEN_INT (-size))));
|
||||
|
||||
if (flag_pic && df_regs_ever_live_p (PIC_OFFSET_TABLE_REGNUM))
|
||||
emit_insn (gen_GOTaddr2picreg ());
|
||||
}
|
||||
|
@ -1169,8 +1182,8 @@ expand_epilogue (void)
|
|||
|
||||
size += 4;
|
||||
|
||||
emit_insn (gen_movsi (gen_rtx_REG (SImode, i),
|
||||
gen_rtx_MEM (SImode, addr)));
|
||||
emit_insn (gen_movsf (gen_rtx_REG (SFmode, i),
|
||||
gen_rtx_MEM (SFmode, addr)));
|
||||
}
|
||||
|
||||
/* If we were using the restore_a1 strategy and the number of
|
||||
|
@ -1261,8 +1274,8 @@ notice_update_cc (rtx body, rtx insn)
|
|||
/* The insn is a compare instruction. */
|
||||
CC_STATUS_INIT;
|
||||
cc_status.value1 = SET_SRC (body);
|
||||
if (GET_CODE (cc_status.value1) == COMPARE
|
||||
&& GET_MODE (XEXP (cc_status.value1, 0)) == SFmode)
|
||||
if (GET_CODE (SET_SRC (body)) == COMPARE
|
||||
&& GET_MODE (XEXP (SET_SRC (body), 0)) == SFmode)
|
||||
cc_status.mdep.fpCC = 1;
|
||||
break;
|
||||
|
||||
|
@ -2138,7 +2151,7 @@ mn10300_rtx_costs (rtx x, int code, int outer_code, int *total, bool speed ATTRI
|
|||
bool
|
||||
mn10300_wide_const_load_uses_clr (rtx operands[2])
|
||||
{
|
||||
long val[2];
|
||||
long val[2] = {0, 0};
|
||||
|
||||
if (GET_CODE (operands[0]) != REG
|
||||
|| REGNO_REG_CLASS (REGNO (operands[0])) != DATA_REGS)
|
||||
|
|
|
@ -117,7 +117,7 @@ extern enum processor_type mn10300_processor;
|
|||
All registers that the compiler knows about must be given numbers,
|
||||
even those that are not normally considered general registers. */
|
||||
|
||||
#define FIRST_PSEUDO_REGISTER 50
|
||||
#define FIRST_PSEUDO_REGISTER 51
|
||||
|
||||
/* Specify machine-specific register numbers. */
|
||||
#define FIRST_DATA_REGNUM 0
|
||||
|
@ -128,6 +128,7 @@ extern enum processor_type mn10300_processor;
|
|||
#define LAST_EXTENDED_REGNUM 17
|
||||
#define FIRST_FP_REGNUM 18
|
||||
#define LAST_FP_REGNUM 49
|
||||
#define MDR_REGNUM 50
|
||||
#define FIRST_ARGUMENT_REGNUM 0
|
||||
|
||||
/* Specify the registers used for certain standard purposes.
|
||||
|
@ -153,7 +154,7 @@ extern enum processor_type mn10300_processor;
|
|||
#define FIXED_REGISTERS \
|
||||
{ 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, 1 \
|
||||
}
|
||||
|
||||
/* 1 for registers not available across function calls.
|
||||
|
@ -167,7 +168,7 @@ extern enum processor_type mn10300_processor;
|
|||
#define CALL_USED_REGISTERS \
|
||||
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0 \
|
||||
, 1, 1, 1, 1, 0, 0, 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 \
|
||||
, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 \
|
||||
}
|
||||
|
||||
/* Note: The definition of CALL_REALLY_USED_REGISTERS is not
|
||||
|
@ -298,7 +299,7 @@ enum reg_class {
|
|||
{ 0xfffc0000, 0x3ffff }, /* FP_REGS */ \
|
||||
{ 0x03fc0000, 0 }, /* FP_ACC_REGS */ \
|
||||
{ 0x3fdff, 0 }, /* GENERAL_REGS */ \
|
||||
{ 0xffffffff, 0x3ffff } /* ALL_REGS */ \
|
||||
{ 0xffffffff, 0x7ffff } /* ALL_REGS */ \
|
||||
}
|
||||
|
||||
/* The following macro defines cover classes for Integrated Register
|
||||
|
@ -587,6 +588,8 @@ struct cum_arg {int nbytes; };
|
|||
((COUNT == 0) \
|
||||
? gen_rtx_MEM (Pmode, arg_pointer_rtx) \
|
||||
: (rtx) 0)
|
||||
|
||||
#define INCOMING_RETURN_ADDR_RTX gen_rtx_REG (Pmode, MDR_REGNUM)
|
||||
|
||||
/* Maximum number of registers that can appear in a valid memory address. */
|
||||
|
||||
|
@ -765,7 +768,7 @@ struct cum_arg {int nbytes; };
|
|||
, "fs0", "fs1", "fs2", "fs3", "fs4", "fs5", "fs6", "fs7" \
|
||||
, "fs8", "fs9", "fs10", "fs11", "fs12", "fs13", "fs14", "fs15" \
|
||||
, "fs16", "fs17", "fs18", "fs19", "fs20", "fs21", "fs22", "fs23" \
|
||||
, "fs24", "fs25", "fs26", "fs27", "fs28", "fs29", "fs30", "fs31" \
|
||||
, "fs24", "fs25", "fs26", "fs27", "fs28", "fs29", "fs30", "fs31", "mdr" \
|
||||
}
|
||||
|
||||
#define ADDITIONAL_REGISTER_NAMES \
|
||||
|
@ -810,8 +813,9 @@ struct cum_arg {int nbytes; };
|
|||
#define DEFAULT_GDB_EXTENSIONS 1
|
||||
|
||||
/* Use dwarf2 debugging info by default. */
|
||||
#undef PREFERRED_DEBUGGING_TYPE
|
||||
#undef PREFERRED_DEBUGGING_TYPE
|
||||
#define PREFERRED_DEBUGGING_TYPE DWARF2_DEBUG
|
||||
#define DWARF2_DEBUGGING_INFO 1
|
||||
|
||||
#define DWARF2_ASM_LINE_DEBUG_INFO 1
|
||||
|
||||
|
|
Loading…
Reference in New Issue