From 982213b5ffeccdee4cb755d55009cc30aabd6016 Mon Sep 17 00:00:00 2001 From: Anthony Green Date: Sat, 27 Dec 2014 15:53:46 +0000 Subject: [PATCH] Switch to 16-bit offsets for moxie ldo/sto instructions From-SVN: r219080 --- gcc/ChangeLog | 16 ++++++++++++++++ gcc/config/moxie/constraints.md | 2 +- gcc/config/moxie/moxie-protos.h | 1 + gcc/config/moxie/moxie.c | 21 +++++++++++++++++++-- gcc/config/moxie/moxie.h | 5 +++-- gcc/config/moxie/moxie.md | 6 +++--- gcc/config/moxie/predicates.md | 2 +- 7 files changed, 44 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e4309cfba80..432706107ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,19 @@ +2014-12-27 Anthony Green + + * config/moxie/moxie-protos.h (moxie_offset_address_p): Define. + * config/moxie/constraints.md (B): Replace inline test with call + to moxie_offset_address_p. + * config/moxie/moxie.h (GO_IF_LEGITIMATE_ADDRESS): Limit offset + addressing to 16-bit offsets. + * config/moxie/moxie.c (moxie_asm_trampoline_template): Remove + nop, which is no longer needed for aligned write to trampoline. + (moxie_trampoline_init): Adjust for smaller trampoline. + (moxie_offset_address_p): New function. + * config/moxie/moxie.md (*movsi, *movhi, *movqi): Adjust length + attr for shorter ldo/sto instructions. + * config/moxie/predicates.md: Only allow REG+CONST_INT for offset + load/stores. + 2014-12-27 Jan hubicka * ipa-inline.c (max_count_real, max_relbenefit_real, diff --git a/gcc/config/moxie/constraints.md b/gcc/config/moxie/constraints.md index dcca9d6e14d..d4c8ba08909 100644 --- a/gcc/config/moxie/constraints.md +++ b/gcc/config/moxie/constraints.md @@ -32,7 +32,7 @@ (define_constraint "B" "An offset address." (and (match_code "mem") - (match_test "GET_CODE (XEXP (op, 0)) == PLUS"))) + (match_test "moxie_offset_address_p (op)"))) (define_constraint "W" "A register indirect memory operand." diff --git a/gcc/config/moxie/moxie-protos.h b/gcc/config/moxie/moxie-protos.h index 2b2a6970013..c1ec1f65984 100644 --- a/gcc/config/moxie/moxie-protos.h +++ b/gcc/config/moxie/moxie-protos.h @@ -22,3 +22,4 @@ extern void moxie_expand_epilogue (void); extern int moxie_initial_elimination_offset (int, int); extern void moxie_print_operand (FILE *, rtx, int); extern void moxie_print_operand_address (FILE *, rtx); +extern bool moxie_offset_address_p (rtx); diff --git a/gcc/config/moxie/moxie.c b/gcc/config/moxie/moxie.c index 1165e9ab50e..e6768e4258c 100644 --- a/gcc/config/moxie/moxie.c +++ b/gcc/config/moxie/moxie.c @@ -555,7 +555,6 @@ moxie_asm_trampoline_template (FILE *f) fprintf (f, "\tldi.l $r0, 0x0\n"); fprintf (f, "\tsto.l 0x8($fp), $r0\n"); fprintf (f, "\tpop $sp, $r0\n"); - fprintf (f, "\tnop\n"); fprintf (f, "\tjmpa 0x0\n"); } @@ -571,10 +570,28 @@ moxie_trampoline_init (rtx m_tramp, tree fndecl, rtx chain_value) mem = adjust_address (m_tramp, SImode, 4); emit_move_insn (mem, chain_value); - mem = adjust_address (m_tramp, SImode, 20); + mem = adjust_address (m_tramp, SImode, 16); emit_move_insn (mem, fnaddr); } +/* Return true for memory offset addresses between -32768 and 32767. */ +bool +moxie_offset_address_p (rtx x) +{ + x = XEXP (x, 0); + + if (GET_CODE (x) == PLUS) + { + x = XEXP (x, 1); + if (GET_CODE (x) == CONST_INT) + { + unsigned int v = INTVAL (x) & 0xFFFF8000; + return (v == 0xFFFF8000 || v == 0x00000000); + } + } + return 0; +} + /* The Global `targetm' Variable. */ /* Initialize the GCC target structure. */ diff --git a/gcc/config/moxie/moxie.h b/gcc/config/moxie/moxie.h index 3a01dbab46d..1dd25799ec4 100644 --- a/gcc/config/moxie/moxie.h +++ b/gcc/config/moxie/moxie.h @@ -362,7 +362,7 @@ enum reg_class #define FUNCTION_PROFILER(FILE,LABELNO) (abort (), 0) /* Trampolines for Nested Functions. */ -#define TRAMPOLINE_SIZE (2 + 6 + 6 + 2 + 2 + 6) +#define TRAMPOLINE_SIZE (2 + 6 + 4 + 2 + 6) /* Alignment required for trampolines, in bits. */ #define TRAMPOLINE_ALIGNMENT 32 @@ -462,7 +462,8 @@ enum reg_class op1 = XEXP(X,0); \ op2 = XEXP(X,1); \ if (GET_CODE(op1) == REG \ - && CONSTANT_ADDRESS_P(op2) \ + && GET_CODE(op2) == CONST_INT \ + && IN_RANGE (INTVAL (op2), -32768, 32767) \ && REGNO_OK_FOR_BASE_P(REGNO(op1))) \ goto LABEL; \ } \ diff --git a/gcc/config/moxie/moxie.md b/gcc/config/moxie/moxie.md index fd8abc3469a..32108ff41c8 100644 --- a/gcc/config/moxie/moxie.md +++ b/gcc/config/moxie/moxie.md @@ -266,7 +266,7 @@ lda.l %0, %1 sto.l %0, %1 ldo.l %0, %1" - [(set_attr "length" "2,2,6,2,6,2,6,6,6")]) + [(set_attr "length" "2,2,6,2,6,2,6,4,4")]) (define_insn_and_split "zero_extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") @@ -344,7 +344,7 @@ lda.b %0, %1 sto.b %0, %1 ldo.b %0, %1" - [(set_attr "length" "2,2,6,2,6,2,6,6,6")]) + [(set_attr "length" "2,2,6,2,6,2,6,4,4")]) (define_expand "movhi" [(set (match_operand:HI 0 "general_operand" "") @@ -372,7 +372,7 @@ lda.s %0, %1 sto.s %0, %1 ldo.s %0, %1" - [(set_attr "length" "2,2,6,2,6,2,6,6,6")]) + [(set_attr "length" "2,2,6,2,6,2,6,4,4")]) ;; ------------------------------------------------------------------------- ;; Compare instructions diff --git a/gcc/config/moxie/predicates.md b/gcc/config/moxie/predicates.md index 7cb312b7e53..2f9467c455f 100644 --- a/gcc/config/moxie/predicates.md +++ b/gcc/config/moxie/predicates.md @@ -34,7 +34,7 @@ if (MEM_P (op) && GET_CODE (XEXP (op, 0)) == PLUS && GET_CODE (XEXP (XEXP (op, 0), 0)) == REG - && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST) + && GET_CODE (XEXP (XEXP (op, 0), 1)) == CONST_INT) return 1; return general_operand (op, mode); -- 2.30.2