Commit 5c0029de by DJ Delorie Committed by DJ Delorie

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
parent ea0f3e87
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> 2013-09-16 Xinliang David Li <davidxl@google.com>
* tree-if-conv.c (main_tree_if_conversion): Check new flag. * tree-if-conv.c (main_tree_if_conversion): Check new flag.
......
...@@ -259,10 +259,20 @@ rl78_asm_file_start (void) ...@@ -259,10 +259,20 @@ rl78_asm_file_start (void)
{ {
int i; 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); /* The memory used is 0xffec8 to 0xffedf; real registers are in
fprintf (asm_out_file, "r%d\t=\t0x%x\n", 16 + i, 0xffee8 + i); 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); opt_pass *rl78_devirt_pass = make_pass_rl78_devirt (g);
...@@ -1018,19 +1028,26 @@ rl78_expand_prologue (void) ...@@ -1018,19 +1028,26 @@ rl78_expand_prologue (void)
if (flag_stack_usage_info) if (flag_stack_usage_info)
current_function_static_stack_size = cfun->machine->framesize; 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))); emit_insn (gen_sel_rb (GEN_INT (0)));
for (i = 0; i < 16; i++) for (i = 0; i < 16; i++)
if (cfun->machine->need_to_push [i]) if (cfun->machine->need_to_push [i])
{ {
int need_bank = i/4; if (TARGET_G10)
if (need_bank != rb)
{ {
emit_insn (gen_sel_rb (GEN_INT (need_bank))); emit_move_insn (gen_rtx_REG (HImode, 0), gen_rtx_REG (HImode, i*2));
rb = need_bank; 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) if (rb != 0)
emit_insn (gen_sel_rb (GEN_INT (0))); emit_insn (gen_sel_rb (GEN_INT (0)));
...@@ -1085,14 +1102,22 @@ rl78_expand_epilogue (void) ...@@ -1085,14 +1102,22 @@ rl78_expand_epilogue (void)
for (i = 15; i >= 0; i--) for (i = 15; i >= 0; i--)
if (cfun->machine->need_to_push [i]) if (cfun->machine->need_to_push [i])
{ {
int need_bank = i / 4; if (TARGET_G10)
if (need_bank != rb)
{ {
emit_insn (gen_sel_rb (GEN_INT (need_bank))); emit_insn (gen_pop (gen_rtx_REG (HImode, 0)));
rb = need_bank; 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) if (rb != 0)
...@@ -1630,6 +1655,16 @@ rl78_peep_movhi_p (rtx *operands) ...@@ -1630,6 +1655,16 @@ rl78_peep_movhi_p (rtx *operands)
fprintf (stderr, "\033[0m"); fprintf (stderr, "\033[0m");
#endif #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 (rtx_equal_p (operands[0], operands[3]))
{ {
#if DEBUG_PEEP #if DEBUG_PEEP
......
...@@ -32,6 +32,8 @@ ...@@ -32,6 +32,8 @@
builtin_define ("__RL78_MUL_RL78__"); \ builtin_define ("__RL78_MUL_RL78__"); \
if (RL78_MUL_G13) \ if (RL78_MUL_G13) \
builtin_define ("__RL78_MUL_G13__"); \ builtin_define ("__RL78_MUL_G13__"); \
if (TARGET_G10) \
builtin_define ("__RL78_G10__"); \
} \ } \
while (0) while (0)
...@@ -44,6 +46,7 @@ ...@@ -44,6 +46,7 @@
#undef ASM_SPEC #undef ASM_SPEC
#define ASM_SPEC "\ #define ASM_SPEC "\
%{mrelax:-relax} \ %{mrelax:-relax} \
%{mg10} \
" "
#undef LINK_SPEC #undef LINK_SPEC
......
...@@ -45,3 +45,7 @@ Enum(rl78_mul_types) String(g13) Value(MUL_G13) ...@@ -45,3 +45,7 @@ Enum(rl78_mul_types) String(g13) Value(MUL_G13)
mrelax mrelax
Target Target
Enable assembler and linker relaxation. Enable assembler and linker relaxation.
mg10
Target Mask(G10)
Target the RL78/G10 series
...@@ -20,3 +20,8 @@ ...@@ -20,3 +20,8 @@
rl78-c.o: $(srcdir)/config/rl78/rl78-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H) rl78-c.o: $(srcdir)/config/rl78/rl78-c.c $(RTL_H) $(TREE_H) $(CONFIG_H) $(TM_H)
$(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $< $(COMPILER) -c $(ALL_COMPILERFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) $<
# Enable multilibs:
MULTILIB_OPTIONS = mg10
MULTILIB_DIRNAMES = g10
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> 2013-09-14 DJ Delorie <dj@redhat.com>
Nick Clifton <nickc@redhat.com> Nick Clifton <nickc@redhat.com>
......
...@@ -21,8 +21,7 @@ ...@@ -21,8 +21,7 @@
; <http://www.gnu.org/licenses/>. ; <http://www.gnu.org/licenses/>.
; clobberable #include "vregs.h"
r8 = 0xffef0
.text .text
......
...@@ -34,7 +34,7 @@ typedef int word_type __attribute__ ((mode (__word__))); ...@@ -34,7 +34,7 @@ typedef int word_type __attribute__ ((mode (__word__)));
#define C3B(a,b,c) a##b##c #define C3B(a,b,c) a##b##c
#define C3(a,b,c) C3B(a,b,c) #define C3(a,b,c) C3B(a,b,c)
#if 0 #ifdef __RL78_G10__
#define UINT_TYPE uint32_type #define UINT_TYPE uint32_type
#define SINT_TYPE sint32_type #define SINT_TYPE sint32_type
......
...@@ -30,12 +30,25 @@ typedef unsigned int uint08_type __attribute__ ((mode (QI))); ...@@ -30,12 +30,25 @@ typedef unsigned int uint08_type __attribute__ ((mode (QI)));
#define C3B(a,b,c) a##b##c #define C3B(a,b,c) a##b##c
#define C3(a,b,c) C3B(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 UINT_TYPE uint16_type
#define BITS_MINUS_1 15 #define BITS_MINUS_1 15
#define NAME_MODE hi #define NAME_MODE hi
/*#include "rl78-mul.h"*/ #include "rl78-mul.h"
#endif
#undef UINT_TYPE #undef UINT_TYPE
#undef BITS_MINUS_1 #undef BITS_MINUS_1
......
...@@ -20,22 +20,7 @@ ...@@ -20,22 +20,7 @@
; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see ; see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
; <http://www.gnu.org/licenses/>. ; <http://www.gnu.org/licenses/>.
r8 = 0xffef0 #include "vregs.h"
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
.text .text
.global ___lshrsi3 .global ___lshrsi3
......
...@@ -22,35 +22,12 @@ ...@@ -22,35 +22,12 @@
;; 32x32=32 multiply ;; 32x32=32 multiply
; real #include "vregs.h"
; GAS defines r0..r7 as aliases for real registers; we want the saddr
; forms here. ; the G10 only has one register bank, so cannot use these optimized
r_0 = 0xffef8 ; versions. Use the C version instead.
r_1 = 0xffef9
r_2 = 0xffefa #ifndef __RL78_G10__
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
;---------------------------------------------------------------------- ;----------------------------------------------------------------------
...@@ -221,3 +198,5 @@ ___mulhi3: ...@@ -221,3 +198,5 @@ ___mulhi3:
.Lmul_hi_done: .Lmul_hi_done:
ret ret
#endif
...@@ -32,9 +32,7 @@ ...@@ -32,9 +32,7 @@
*/ */
r8 = 0xffef0 #include "vregs.h"
r10 = 0xffef2
r14 = 0xffef6
.data .data
.p2align 1 .p2align 1
......
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