From 5c0029ded7da93866d45574032ee4c2543ca92aa Mon Sep 17 00:00:00 2001 From: DJ Delorie Date: Mon, 16 Sep 2013 17:15:46 -0400 Subject: [PATCH] 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 --- gcc/ChangeLog | 14 +++++++++ gcc/config/rl78/rl78.c | 65 +++++++++++++++++++++++++++++++---------- gcc/config/rl78/rl78.h | 3 ++ gcc/config/rl78/rl78.opt | 4 +++ gcc/config/rl78/t-rl78 | 5 ++++ libgcc/ChangeLog | 9 ++++++ libgcc/config/rl78/cmpsi2.S | 3 +- libgcc/config/rl78/lib2div.c | 2 +- libgcc/config/rl78/lib2mul.c | 15 +++++++++- libgcc/config/rl78/lshrsi3.S | 17 +---------- libgcc/config/rl78/mulsi3.S | 37 +++++------------------ libgcc/config/rl78/trampoline.S | 4 +-- 12 files changed, 111 insertions(+), 67 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index fbcd00d..cc19359 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2013-09-16 DJ Delorie + + * 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 * 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 3f13955..d99cecf 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 00d2b83..8cf634e 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 1538b89..9b573c1 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 ed7ee74..30705b3 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 diff --git a/libgcc/ChangeLog b/libgcc/ChangeLog index 518a26c..728360c 100644 --- a/libgcc/ChangeLog +++ b/libgcc/ChangeLog @@ -1,3 +1,12 @@ +2013-09-16 DJ Delorie + + * 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 Nick Clifton diff --git a/libgcc/config/rl78/cmpsi2.S b/libgcc/config/rl78/cmpsi2.S index d815793..7fdc76a 100644 --- a/libgcc/config/rl78/cmpsi2.S +++ b/libgcc/config/rl78/cmpsi2.S @@ -21,8 +21,7 @@ ; . -; clobberable -r8 = 0xffef0 +#include "vregs.h" .text diff --git a/libgcc/config/rl78/lib2div.c b/libgcc/config/rl78/lib2div.c index 4b5033e..b37f55a 100644 --- a/libgcc/config/rl78/lib2div.c +++ b/libgcc/config/rl78/lib2div.c @@ -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 diff --git a/libgcc/config/rl78/lib2mul.c b/libgcc/config/rl78/lib2mul.c index 6460f9e..fee5081 100644 --- a/libgcc/config/rl78/lib2mul.c +++ b/libgcc/config/rl78/lib2mul.c @@ -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 diff --git a/libgcc/config/rl78/lshrsi3.S b/libgcc/config/rl78/lshrsi3.S index 1ee7325..8bd9978 100644 --- a/libgcc/config/rl78/lshrsi3.S +++ b/libgcc/config/rl78/lshrsi3.S @@ -20,22 +20,7 @@ ; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ; . -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 diff --git a/libgcc/config/rl78/mulsi3.S b/libgcc/config/rl78/mulsi3.S index 012e87e..1ce45ba 100644 --- a/libgcc/config/rl78/mulsi3.S +++ b/libgcc/config/rl78/mulsi3.S @@ -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 diff --git a/libgcc/config/rl78/trampoline.S b/libgcc/config/rl78/trampoline.S index b15b0d3..59d429e 100644 --- a/libgcc/config/rl78/trampoline.S +++ b/libgcc/config/rl78/trampoline.S @@ -32,9 +32,7 @@ */ -r8 = 0xffef0 -r10 = 0xffef2 -r14 = 0xffef6 +#include "vregs.h" .data .p2align 1 -- 2.7.4