Switch to 16-bit offsets for moxie ldo/sto instructions
authorAnthony Green <green@moxielogic.com>
Sat, 27 Dec 2014 15:53:46 +0000 (15:53 +0000)
committerAnthony Green <green@gcc.gnu.org>
Sat, 27 Dec 2014 15:53:46 +0000 (15:53 +0000)
From-SVN: r219080

gcc/ChangeLog
gcc/config/moxie/constraints.md
gcc/config/moxie/moxie-protos.h
gcc/config/moxie/moxie.c
gcc/config/moxie/moxie.h
gcc/config/moxie/moxie.md
gcc/config/moxie/predicates.md

index e4309cfba80872309970b1bb413281bcd2a604e7..432706107efbba72298481a37b083b226ae249f8 100644 (file)
@@ -1,3 +1,19 @@
+2014-12-27  Anthony Green  <green@moxielogic.com>
+
+       * 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  <hubicka@ucw.cz>
 
        * ipa-inline.c (max_count_real, max_relbenefit_real,
index dcca9d6e14d73fa8c3c8de3d97c810ba2e41c63e..d4c8ba0890968fbd2001338690ccf94dd36b105f 100644 (file)
@@ -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."
index 2b2a697001370244c8821124ad25f99ec72a9367..c1ec1f659840b7e430a915a581bc5898b5b59105 100644 (file)
@@ -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);
index 1165e9ab50ef685c85e20ac6a85fc123321f6d53..e6768e4258c6902e985de890fc3193dd39e803ab 100644 (file)
@@ -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.  */
index 3a01dbab46d6f7ec54af8f41421ecf7292ad63a4..1dd25799ec44b5fc91eafcfc2b27ba0406e64600 100644 (file)
@@ -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;                                   \
       }                                                        \
index fd8abc3469a277ef46c0147e2da1e6de20ce6509..32108ff41c893e08a7929a5bb29e6b145790cfa2 100644 (file)
    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")
    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" "")
    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
index 7cb312b7e53bec615e6431681c541e89447235c2..2f9467c455f963712bdf1bb761b876f53869eddf 100644 (file)
@@ -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);