rl78.c (rl78_asm_file_start): Specify alternate vregs location for RL78/G10.
* config/rl78/rl78.c (rl78_asm_file_start): Specify alternate vregs location for RL78/G10. (rl78_expand_prologue): Avoid SEL on G10. (rl78_expand_epilogue): Likewise. (rl78_peep_movhi_p): Can't move a constant to memory in HImode. * config/rl78/rl78.h (TARGET_CPU_CPP_BUILTINS): Define __RL78_G10__ when appropriate. (ASM_SPEC): Pass -mg10 along to the assembler. * config/rl78/rl78.md (sel_rb): Disable for G10. * config/rl78/rl78.opt: Add -mg10 option. * config/rl78/t-rl78: Add -mg10 multilib. * config/rl78/lib2mul.c: Enable for RL78/G10. * config/rl78/lib2div.c: Likewise. * config/rl78/lshrsi3.S: Use vregs.h. * config/rl78/cmpsi2.S: Likewise. * config/rl78/trampoline.S: Likewise. * config/rl78/mulsi2.S: Likewise. Disable for RL78/G10. From-SVN: r202637
This commit is contained in:
parent
ea0f3e87b9
commit
5c0029ded7
12 changed files with 111 additions and 67 deletions
|
@ -1,3 +1,17 @@
|
|||
2013-09-16 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* config/rl78/rl78.c (rl78_asm_file_start): Specify alternate
|
||||
vregs location for RL78/G10.
|
||||
(rl78_expand_prologue): Avoid SEL on G10.
|
||||
(rl78_expand_epilogue): Likewise.
|
||||
(rl78_peep_movhi_p): Can't move a constant to memory in HImode.
|
||||
* config/rl78/rl78.h (TARGET_CPU_CPP_BUILTINS): Define
|
||||
__RL78_G10__ when appropriate.
|
||||
(ASM_SPEC): Pass -mg10 along to the assembler.
|
||||
* config/rl78/rl78.md (sel_rb): Disable for G10.
|
||||
* config/rl78/rl78.opt: Add -mg10 option.
|
||||
* config/rl78/t-rl78: Add -mg10 multilib.
|
||||
|
||||
2013-09-16 Xinliang David Li <davidxl@google.com>
|
||||
|
||||
* tree-if-conv.c (main_tree_if_conversion): Check new flag.
|
||||
|
|
|
@ -259,10 +259,20 @@ rl78_asm_file_start (void)
|
|||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
if (TARGET_G10)
|
||||
{
|
||||
fprintf (asm_out_file, "r%d\t=\t0x%x\n", 8 + i, 0xffef0 + i);
|
||||
fprintf (asm_out_file, "r%d\t=\t0x%x\n", 16 + i, 0xffee8 + i);
|
||||
/* The memory used is 0xffec8 to 0xffedf; real registers are in
|
||||
0xffee0 to 0xffee7. */
|
||||
for (i = 8; i < 32; i++)
|
||||
fprintf (asm_out_file, "r%d\t=\t0x%x\n", i, 0xffec0 + i);
|
||||
}
|
||||
else
|
||||
{
|
||||
for (i = 0; i < 8; i++)
|
||||
{
|
||||
fprintf (asm_out_file, "r%d\t=\t0x%x\n", 8 + i, 0xffef0 + i);
|
||||
fprintf (asm_out_file, "r%d\t=\t0x%x\n", 16 + i, 0xffee8 + i);
|
||||
}
|
||||
}
|
||||
|
||||
opt_pass *rl78_devirt_pass = make_pass_rl78_devirt (g);
|
||||
|
@ -1018,19 +1028,26 @@ rl78_expand_prologue (void)
|
|||
if (flag_stack_usage_info)
|
||||
current_function_static_stack_size = cfun->machine->framesize;
|
||||
|
||||
if (is_interrupt_func (cfun->decl))
|
||||
if (is_interrupt_func (cfun->decl) && !TARGET_G10)
|
||||
emit_insn (gen_sel_rb (GEN_INT (0)));
|
||||
|
||||
for (i = 0; i < 16; i++)
|
||||
if (cfun->machine->need_to_push [i])
|
||||
{
|
||||
int need_bank = i/4;
|
||||
if (need_bank != rb)
|
||||
if (TARGET_G10)
|
||||
{
|
||||
emit_insn (gen_sel_rb (GEN_INT (need_bank)));
|
||||
rb = need_bank;
|
||||
emit_move_insn (gen_rtx_REG (HImode, 0), gen_rtx_REG (HImode, i*2));
|
||||
F (emit_insn (gen_push (gen_rtx_REG (HImode, 0))));
|
||||
}
|
||||
F (emit_insn (gen_push (gen_rtx_REG (HImode, i*2))));
|
||||
else {
|
||||
int need_bank = i/4;
|
||||
if (need_bank != rb)
|
||||
{
|
||||
emit_insn (gen_sel_rb (GEN_INT (need_bank)));
|
||||
rb = need_bank;
|
||||
}
|
||||
F (emit_insn (gen_push (gen_rtx_REG (HImode, i*2))));
|
||||
}
|
||||
}
|
||||
if (rb != 0)
|
||||
emit_insn (gen_sel_rb (GEN_INT (0)));
|
||||
|
@ -1085,14 +1102,22 @@ rl78_expand_epilogue (void)
|
|||
for (i = 15; i >= 0; i--)
|
||||
if (cfun->machine->need_to_push [i])
|
||||
{
|
||||
int need_bank = i / 4;
|
||||
|
||||
if (need_bank != rb)
|
||||
if (TARGET_G10)
|
||||
{
|
||||
emit_insn (gen_sel_rb (GEN_INT (need_bank)));
|
||||
rb = need_bank;
|
||||
emit_insn (gen_pop (gen_rtx_REG (HImode, 0)));
|
||||
emit_move_insn (gen_rtx_REG (HImode, i*2), gen_rtx_REG (HImode, 0));
|
||||
}
|
||||
else
|
||||
{
|
||||
int need_bank = i / 4;
|
||||
|
||||
if (need_bank != rb)
|
||||
{
|
||||
emit_insn (gen_sel_rb (GEN_INT (need_bank)));
|
||||
rb = need_bank;
|
||||
}
|
||||
emit_insn (gen_pop (gen_rtx_REG (HImode, i * 2)));
|
||||
}
|
||||
emit_insn (gen_pop (gen_rtx_REG (HImode, i * 2)));
|
||||
}
|
||||
|
||||
if (rb != 0)
|
||||
|
@ -1630,6 +1655,16 @@ rl78_peep_movhi_p (rtx *operands)
|
|||
fprintf (stderr, "\033[0m");
|
||||
#endif
|
||||
|
||||
/* You can move a constant to memory as QImode, but not HImode. */
|
||||
if (GET_CODE (operands[0]) == MEM
|
||||
&& GET_CODE (operands[1]) != REG)
|
||||
{
|
||||
#if DEBUG_PEEP
|
||||
fprintf (stderr, "no peep: move constant to memory\n");
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
if (rtx_equal_p (operands[0], operands[3]))
|
||||
{
|
||||
#if DEBUG_PEEP
|
||||
|
|
|
@ -32,6 +32,8 @@
|
|||
builtin_define ("__RL78_MUL_RL78__"); \
|
||||
if (RL78_MUL_G13) \
|
||||
builtin_define ("__RL78_MUL_G13__"); \
|
||||
if (TARGET_G10) \
|
||||
builtin_define ("__RL78_G10__"); \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
@ -44,6 +46,7 @@
|
|||
#undef ASM_SPEC
|
||||
#define ASM_SPEC "\
|
||||
%{mrelax:-relax} \
|
||||
%{mg10} \
|
||||
"
|
||||
|
||||
#undef LINK_SPEC
|
||||
|
|
|
@ -45,3 +45,7 @@ Enum(rl78_mul_types) String(g13) Value(MUL_G13)
|
|||
mrelax
|
||||
Target
|
||||
Enable assembler and linker relaxation.
|
||||
|
||||
mg10
|
||||
Target Mask(G10)
|
||||
Target the RL78/G10 series
|
||||
|
|
|
@ -20,3 +20,8 @@
|
|||
|
||||
rl78-c.o: $(srcdir)/config/rl78/rl78-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)
|
||||
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
|
||||
|
||||
# Enable multilibs:
|
||||
|
||||
MULTILIB_OPTIONS = mg10
|
||||
MULTILIB_DIRNAMES = g10
|
||||
|
|
|
@ -1,3 +1,12 @@
|
|||
2013-09-16 DJ Delorie <dj@redhat.com>
|
||||
|
||||
* config/rl78/lib2mul.c: Enable for RL78/G10.
|
||||
* config/rl78/lib2div.c: Likewise.
|
||||
* config/rl78/lshrsi3.S: Use vregs.h.
|
||||
* config/rl78/cmpsi2.S: Likewise.
|
||||
* config/rl78/trampoline.S: Likewise.
|
||||
* config/rl78/mulsi2.S: Likewise. Disable for RL78/G10.
|
||||
|
||||
2013-09-14 DJ Delorie <dj@redhat.com>
|
||||
Nick Clifton <nickc@redhat.com>
|
||||
|
||||
|
|
|
@ -21,8 +21,7 @@
|
|||
; <http://www.gnu.org/licenses/>.
|
||||
|
||||
|
||||
; clobberable
|
||||
r8 = 0xffef0
|
||||
#include "vregs.h"
|
||||
|
||||
.text
|
||||
|
||||
|
|
|
@ -34,7 +34,7 @@ typedef int word_type __attribute__ ((mode (__word__)));
|
|||
#define C3B(a,b,c) a##b##c
|
||||
#define C3(a,b,c) C3B(a,b,c)
|
||||
|
||||
#if 0
|
||||
#ifdef __RL78_G10__
|
||||
|
||||
#define UINT_TYPE uint32_type
|
||||
#define SINT_TYPE sint32_type
|
||||
|
|
|
@ -30,12 +30,25 @@ typedef unsigned int uint08_type __attribute__ ((mode (QI)));
|
|||
#define C3B(a,b,c) a##b##c
|
||||
#define C3(a,b,c) C3B(a,b,c)
|
||||
|
||||
#ifdef __RL78_G10__
|
||||
|
||||
#define UINT_TYPE uint32_type
|
||||
#define BITS_MINUS_1 31
|
||||
#define NAME_MODE si
|
||||
|
||||
#include "rl78-mul.h"
|
||||
|
||||
#undef UINT_TYPE
|
||||
#undef BITS_MINUS_1
|
||||
#undef NAME_MODE
|
||||
|
||||
#define UINT_TYPE uint16_type
|
||||
#define BITS_MINUS_1 15
|
||||
#define NAME_MODE hi
|
||||
|
||||
/*#include "rl78-mul.h"*/
|
||||
#include "rl78-mul.h"
|
||||
|
||||
#endif
|
||||
|
||||
#undef UINT_TYPE
|
||||
#undef BITS_MINUS_1
|
||||
|
|
|
@ -20,22 +20,7 @@
|
|||
; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
|
||||
; <http://www.gnu.org/licenses/>.
|
||||
|
||||
r8 = 0xffef0
|
||||
r16 = 0xffee8
|
||||
r9 = 0xffef1
|
||||
r17 = 0xffee9
|
||||
r10 = 0xffef2
|
||||
r18 = 0xffeea
|
||||
r11 = 0xffef3
|
||||
r19 = 0xffeeb
|
||||
r12 = 0xffef4
|
||||
r20 = 0xffeec
|
||||
r13 = 0xffef5
|
||||
r21 = 0xffeed
|
||||
r14 = 0xffef6
|
||||
r22 = 0xffeee
|
||||
r15 = 0xffef7
|
||||
r23 = 0xffeef
|
||||
#include "vregs.h"
|
||||
|
||||
.text
|
||||
.global ___lshrsi3
|
||||
|
|
|
@ -22,35 +22,12 @@
|
|||
|
||||
;; 32x32=32 multiply
|
||||
|
||||
; real
|
||||
; GAS defines r0..r7 as aliases for real registers; we want the saddr
|
||||
; forms here.
|
||||
r_0 = 0xffef8
|
||||
r_1 = 0xffef9
|
||||
r_2 = 0xffefa
|
||||
r_3 = 0xffefb
|
||||
r_4 = 0xffefc
|
||||
r_5 = 0xffefd
|
||||
r_6 = 0xffefe
|
||||
r_7 = 0xffeff
|
||||
; clobberable
|
||||
r8 = 0xffef0
|
||||
r9 = 0xffef1
|
||||
r10 = 0xffef2
|
||||
r11 = 0xffef3
|
||||
r12 = 0xffef4
|
||||
r13 = 0xffef5
|
||||
r14 = 0xffef6
|
||||
r15 = 0xffef7
|
||||
; preserved
|
||||
r16 = 0xffee8
|
||||
r17 = 0xffee9
|
||||
r18 = 0xffeea
|
||||
r19 = 0xffeeb
|
||||
r20 = 0xffeec
|
||||
r21 = 0xffeed
|
||||
r22 = 0xffeee
|
||||
r23 = 0xffeef
|
||||
#include "vregs.h"
|
||||
|
||||
; the G10 only has one register bank, so cannot use these optimized
|
||||
; versions. Use the C version instead.
|
||||
|
||||
#ifndef __RL78_G10__
|
||||
|
||||
|
||||
;----------------------------------------------------------------------
|
||||
|
@ -221,3 +198,5 @@ ___mulhi3:
|
|||
|
||||
.Lmul_hi_done:
|
||||
ret
|
||||
|
||||
#endif
|
||||
|
|
|
@ -32,9 +32,7 @@
|
|||
|
||||
*/
|
||||
|
||||
r8 = 0xffef0
|
||||
r10 = 0xffef2
|
||||
r14 = 0xffef6
|
||||
#include "vregs.h"
|
||||
|
||||
.data
|
||||
.p2align 1
|
||||
|
|
Loading…
Add table
Reference in a new issue