summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-16 21:15:46 +0000
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2013-09-16 21:15:46 +0000
commitc5a0ae5e13c60a19a053a901e505ac71c05f5a82 (patch)
treeca39e481d4043f5d69add06ef190a5ec3d62d059 /gcc
parent043115ec2d2ce23d00b19598983d622d2d921e9c (diff)
downloadgcc-c5a0ae5e13c60a19a053a901e505ac71c05f5a82.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@202637 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog14
-rw-r--r--gcc/config/rl78/rl78.c65
-rw-r--r--gcc/config/rl78/rl78.h3
-rw-r--r--gcc/config/rl78/rl78.opt4
-rw-r--r--gcc/config/rl78/t-rl785
5 files changed, 76 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index fbcd00dcc3d..cc1935997dc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c
index 3f13955d896..d99cecfbff1 100644
--- a/gcc/config/rl78/rl78.c
+++ b/gcc/config/rl78/rl78.c
@@ -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
diff --git a/gcc/config/rl78/rl78.h b/gcc/config/rl78/rl78.h
index 00d2b83b9f5..8cf634eeb9f 100644
--- a/gcc/config/rl78/rl78.h
+++ b/gcc/config/rl78/rl78.h
@@ -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
diff --git a/gcc/config/rl78/rl78.opt b/gcc/config/rl78/rl78.opt
index 1538b897c57..9b573c10363 100644
--- a/gcc/config/rl78/rl78.opt
+++ b/gcc/config/rl78/rl78.opt
@@ -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
diff --git a/gcc/config/rl78/t-rl78 b/gcc/config/rl78/t-rl78
index ed7ee74448b..30705b3e5e5 100644
--- a/gcc/config/rl78/t-rl78
+++ b/gcc/config/rl78/t-rl78
@@ -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