aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>2015-07-28 08:09:09 +0000
committerNick Clifton <nickc@gcc.gnu.org>2015-07-28 08:09:09 +0000
commitf87a37c6893dc51f4c3e6fbddfcf453bd83c9215 (patch)
tree7542dd69542b0124435500e55ad966b7d4c39a2e /gcc
parent12efb1d75f459d7c69bfaededd398f9724ee67bb (diff)
downloadgcc-f87a37c6893dc51f4c3e6fbddfcf453bd83c9215.zip
gcc-f87a37c6893dc51f4c3e6fbddfcf453bd83c9215.tar.gz
gcc-f87a37c6893dc51f4c3e6fbddfcf453bd83c9215.tar.bz2
rl78.c (rl78_addsi3_internal): New function.
* config/rl78/rl78.c (rl78_addsi3_internal): New function. Optimizes the case where -mes0 is active and a constant symbolic address is used. * config/rl78/rl78-protos.h: Prototype the new function. * config/rl78/rl78.md (addsi3_internal_real): Call new function. From-SVN: r226306
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog8
-rw-r--r--gcc/config/rl78/rl78-protos.h1
-rw-r--r--gcc/config/rl78/rl78.c30
-rw-r--r--gcc/config/rl78/rl78.md5
4 files changed, 40 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3457af8..bbee98a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,11 @@
+2015-07-28 Nick Clifton <nickc@redhat.com>
+
+ * config/rl78/rl78.c (rl78_addsi3_internal): New function.
+ Optimizes the case where -mes0 is active and a constant symbolic
+ address is used.
+ * config/rl78/rl78-protos.h: Prototype the new function.
+ * config/rl78/rl78.md (addsi3_internal_real): Call new function.
+
2015-07-28 Tom de Vries <tom@codesourcery.com>
* tree-parloops.c (reduc_stmt_res): New function.
diff --git a/gcc/config/rl78/rl78-protos.h b/gcc/config/rl78/rl78-protos.h
index 0e77b8d..614bf63 100644
--- a/gcc/config/rl78/rl78-protos.h
+++ b/gcc/config/rl78/rl78-protos.h
@@ -18,6 +18,7 @@
along with GCC; see the file COPYING3. If not see
<http://www.gnu.org/licenses/>. */
+const char * rl78_addsi3_internal (rtx *, unsigned int);
void rl78_emit_eh_epilogue (rtx);
void rl78_expand_compare (rtx *);
void rl78_expand_movsi (rtx *);
diff --git a/gcc/config/rl78/rl78.c b/gcc/config/rl78/rl78.c
index 2bbfb2e..7069530 100644
--- a/gcc/config/rl78/rl78.c
+++ b/gcc/config/rl78/rl78.c
@@ -357,6 +357,9 @@ rl78_option_override (void)
if (TARGET_ES0
&& strcmp (lang_hooks.name, "GNU C")
+ && strcmp (lang_hooks.name, "GNU C11")
+ && strcmp (lang_hooks.name, "GNU C89")
+ && strcmp (lang_hooks.name, "GNU C99")
/* Compiling with -flto results in a language of GNU GIMPLE being used... */
&& strcmp (lang_hooks.name, "GNU GIMPLE"))
/* Address spaces are currently only supported by C. */
@@ -4638,6 +4641,33 @@ rl78_flags_already_set (rtx op, rtx operand)
return res;
}
+
+const char *
+rl78_addsi3_internal (rtx * operands, unsigned int alternative)
+{
+ /* If we are adding in a constant symbolic address when -mes0
+ is active then we know that the address must be <64K and
+ that it is invalid to access anything above 64K relative to
+ this address. So we can skip adding in the high bytes. */
+ if (TARGET_ES0
+ && GET_CODE (operands[2]) == SYMBOL_REF
+ && TREE_CODE (SYMBOL_REF_DECL (operands[2])) == VAR_DECL
+ && TREE_READONLY (SYMBOL_REF_DECL (operands[2]))
+ && ! TREE_SIDE_EFFECTS (SYMBOL_REF_DECL (operands[2])))
+ return "movw ax, %h1\n\taddw ax, %h2\n\tmovw %h0, ax";
+
+ switch (alternative)
+ {
+ case 0:
+ case 1:
+ return "movw ax, %h1\n\taddw ax, %h2\n\tmovw %h0, ax\n\tmovw ax, %H1\n\tsknc\n\tincw ax\n\taddw ax, %H2\n\tmovw %H0, ax";
+ case 2:
+ return "movw ax, %h1\n\taddw ax,%h2\n\tmovw bc, ax\n\tmovw ax, %H1\n\tsknc\n\tincw ax\n\taddw ax, %H2\n\tmovw %H0, ax\n\tmovw ax, bc\n\tmovw %h0, ax";
+ default:
+ gcc_unreachable ();
+ }
+}
+
#undef TARGET_PREFERRED_RELOAD_CLASS
#define TARGET_PREFERRED_RELOAD_CLASS rl78_preferred_reload_class
diff --git a/gcc/config/rl78/rl78.md b/gcc/config/rl78/rl78.md
index 2ea788e..735c19f 100644
--- a/gcc/config/rl78/rl78.md
+++ b/gcc/config/rl78/rl78.md
@@ -243,10 +243,7 @@
(clobber (reg:HI BC_REG))
]
"rl78_real_insns_ok ()"
- "@
- movw ax,%h1 \;addw ax,%h2 \;movw %h0, ax \;movw ax,%H1 \;sknc \;incw ax \;addw ax,%H2 \;movw %H0,ax
- movw ax,%h1 \;addw ax,%h2 \;movw %h0, ax \;movw ax,%H1 \;sknc \;incw ax \;addw ax,%H2 \;movw %H0,ax
- movw ax,%h1 \;addw ax,%h2 \;movw bc, ax \;movw ax,%H1 \;sknc \;incw ax \;addw ax,%H2 \;movw %H0,ax \;movw ax,bc \;movw %h0, ax"
+ { return rl78_addsi3_internal (operands, which_alternative); }
[(set_attr "valloc" "macax")]
)