crx.md: Make doloop_end pattern usage controllable via mloop-nesting=<max-nesting>...
authorPaul Woegerer <paul.woegerer@nsc.com>
Fri, 26 Aug 2005 08:20:55 +0000 (08:20 +0000)
committerPaul Woegerer <woepaul@gcc.gnu.org>
Fri, 26 Aug 2005 08:20:55 +0000 (08:20 +0000)
* config/crx/crx.md: Make doloop_end pattern usage controllable
via mloop-nesting=<max-nesting> command line switch. Make sure
the combiner cannot use doloop_end_<mode> in an illegal way.
* config/crx/crx.c: Use regs up to r6 for argument passing.
Refine crx_address_cost (non cst4 displacements are expensive).
* config/crx/crx.opt: Add switch for mloop-nesting=.

From-SVN: r103518

gcc/ChangeLog
gcc/config/crx/crx.c
gcc/config/crx/crx.md
gcc/config/crx/crx.opt

index 837d6e7fc8e5f484869d5b436931f3bbff72cb5a..5ed3aca1cc762e19bec66c1b9cd39beb26a2edf3 100644 (file)
@@ -1,3 +1,12 @@
+2005-08-26  Paul Woegerer  <paul.woegerer@nsc.com>
+
+       * config/crx/crx.md: Make doloop_end pattern usage controllable
+       via mloop-nesting=<max-nesting> command line switch. Make sure
+       the combiner cannot use doloop_end_<mode> in an illegal way.
+       * config/crx/crx.c: Use regs up to r6 for argument passing.
+       Refine crx_address_cost (non cst4 displacements are expensive).
+       * config/crx/crx.opt: Add switch for mloop-nesting=.
+
 2005-08-26  Adrian Straetling  <straetling@de.ibm.com>
 
        * config/s390/s390.md: ("movstr", "*movstr"): Add patterns.
index 6008f8dbd4a9899d1ccd824d6c5c8e8f2d9b2fe2..b73cde84ec0a1a5801a7e7f70cd4d06b7afe7ca4 100644 (file)
@@ -54,7 +54,7 @@
 /*****************************************************************************/
 
 /* Maximum number of register used for passing parameters.  */
-#define MAX_REG_FOR_PASSING_ARGS 5
+#define MAX_REG_FOR_PASSING_ARGS 6
 
 /* Minimum number register used for passing parameters.  */
 #define MIN_REG_FOR_PASSING_ARGS 2
@@ -827,6 +827,15 @@ crx_address_cost (rtx addr)
   if (address.index && address.scale == 1)
     cost+=5;
 
+  if (address.disp && !INT_CST4 (INTVAL (address.disp)))
+    cost+=2;
+
+  if (TARGET_DEBUG_ADDR)
+    {
+      fprintf (stderr, "\n======\nTARGET_ADDRESS_COST = %d\n", cost);
+      debug_rtx (addr);
+    }
+  
   return cost;
 }
 
index a5e03446c3885851c7b42cb15af8fdf870d4c126..bb052d206d00310b3ec6248505da830391aa30d9 100644 (file)
@@ -31,7 +31,7 @@
   ]
 )
 
-(define_attr "length" "" ( const_int 6 ) )
+(define_attr "length" "" ( const_int 6 ))
 
 (define_asm_attributes
   [(set_attr "length" "6")]
                 (match_operand:DI 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "addd\\t%L2, %L1\;addcd\\t%H2, %H1"
+  "addd\t%L2, %L1\;addcd\t%H2, %H1"
   [(set_attr "length" "4,12")]
 )
 
                    (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "add<tIsa>\\t%2, %0"
+  "add<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                  (match_operand:DI 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "subd\\t%L2, %L1\;subcd\\t%H2, %H1"
+  "subd\t%L2, %L1\;subcd\t%H2, %H1"
   [(set_attr "length" "4,12")]
 )
 
                     (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "sub<tIsa>\\t%2, %0"
+  "sub<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                    (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "mul<tIsa>\\t%2, %0"
+  "mul<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                 (sz_xtnd:DI (match_operand:SI 2 "register_operand" "r"))))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "mull<sPat>d\\t%2, %1"
+  "mull<sPat>d\t%2, %1"
   [(set_attr "length" "4")]
 )
 
                 (sz_xtnd:SI (match_operand:HI 2 "register_operand" "r"))))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "mul<sPat>wd\\t%2, %0"
+  "mul<sPat>wd\t%2, %0"
   [(set_attr "length" "4")]
 )
 
                 (sz_xtnd:HI (match_operand:QI 2 "register_operand" "r"))))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "mul<sPat>bw\\t%2, %0"
+  "mul<sPat>bw\t%2, %0"
   [(set_attr "length" "4")]
 )
 
                   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "and<tIsa>\\t%2, %0"
+  "and<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "or<tIsa>\\t%2, %0"
+  "or<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                   (match_operand:CRXIM 2 "nonmemory_operand" "r,i")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "xor<tIsa>\\t%2, %0"
+  "xor<tIsa>\t%2, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
        (sz_xtnd:SI (match_operand:HI 1 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "<szIsa>extwd\\t%1, %0"
+  "<szIsa>extwd\t%1, %0"
   [(set_attr "length" "4")]
 )
 
        (sz_xtnd:SI (match_operand:QI 1 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "<szIsa>extbd\\t%1, %0"
+  "<szIsa>extbd\t%1, %0"
   [(set_attr "length" "4")]
 )
 
        (sz_xtnd:HI (match_operand:QI 1 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "<szIsa>extbw\\t%1, %0"
+  "<szIsa>extbw\t%1, %0"
   [(set_attr "length" "4")]
 )
 
        (neg:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "neg<tIsa>\\t%1, %0"
+  "neg<tIsa>\t%1, %0"
   [(set_attr "length" "4")]
 )
 
        (abs:CRXIM (match_operand:CRXIM 1 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "abs<tIsa>\\t%1, %0"
+  "abs<tIsa>\t%1, %0"
   [(set_attr "length" "4")]
 )
 
        (mima_oprnd:CRXIM (match_operand:CRXIM 1 "register_operand"  "%0")
                          (match_operand:CRXIM 2 "register_operand"  "r")))]
   ""
-  "<mimaIsa><tIsa>\\t%2, %0"
+  "<mimaIsa><tIsa>\t%2, %0"
   [(set_attr "length" "4")]
 )
 
        (not:CRXIM (match_operand:CRXIM 1 "register_operand" "0")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "xor<tIsa>\\t$-1, %0"
+  "xor<tIsa>\t$-1, %0"
   [(set_attr "length" "2")]
 )
 
    (clobber (reg:CC CC_REGNUM))]
   ""
   "@
-  rotl<tIsa>\\t%2, %0
-  rot<tIsa>\\t%2, %0"
+  rotl<tIsa>\t%2, %0
+  rot<tIsa>\t%2, %0"
   [(set_attr "length" "4,<lImmRotl>")]
 )
 
                        (match_operand:CRXIM 2 "register_operand" "r")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "rotr<tIsa>\\t%2, %0"
+  "rotr<tIsa>\t%2, %0"
   [(set_attr "length" "4")]
 )
 
                        (match_operand:QI 2 "nonmemory_operand" "r,<IJK>")))
    (clobber (reg:CC CC_REGNUM))]
   ""
-  "s<shIsa><tIsa>\\t%2, %0"
+  "s<shIsa><tIsa>\t%2, %0"
   [(set_attr "length" "2,2")]
 )
 
        (match_operand:SISFM 1 "nonmemory_operand" "r, <iF>, k, r"))]
   ""
   "@
-  movd\\t%1, %0
-  movd\\t%1, %0
-  mfpr\\t%1, %0
-  mtpr\\t%1, %0"
+  movd\t%1, %0
+  movd\t%1, %0
+  mfpr\t%1, %0
+  mtpr\t%1, %0"
   [(set_attr "length" "2,6,4,4")]
 )
 
   [(set (match_operand:SHORT 0 "register_operand" "=r, r")
        (match_operand:SHORT 1 "nonmemory_operand" "r, i"))]
   ""
-  "mov<tIsa>\\t%1, %0"
+  "mov<tIsa>\t%1, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
   [(set (match_operand:CRXMM 0 "register_operand" "=r")
        (match_operand:CRXMM 1 "memory_operand" "m"))]
   ""
-  "load<tIsa>\\t%1, %0"
+  "load<tIsa>\t%1, %0"
   [(set_attr "length" "6")]
 )
 
   [(set (match_operand:CRXMM 0 "store_operand" "=m, m")
        (match_operand:CRXMM 1 "reg_or_u4bits_operand" "r, <JG>"))]
   ""
-  "stor<tIsa>\\t%1, %0"
+  "stor<tIsa>\t%1, %0"
   [(set_attr "length" "6")]
 )
 
                      (label_ref (match_operand 3 "" ""))
                      (pc)))]
   ""
-  "cmpb%d0<tIsa>\\t%2, %1, %l3"
+  "cmpb%d0<tIsa>\t%2, %1, %l3"
   [(set_attr "length" "6")]
 )
 
        (compare:CC (match_operand:CRXIM 0 "register_operand" "r,r")
                    (match_operand:CRXIM 1 "nonmemory_operand" "r,i")))]
   ""
-  "cmp<tIsa>\\t%1, %0"
+  "cmp<tIsa>\t%1, %0"
   [(set_attr "length" "2,<lImmArith>")]
 )
 
                      (label_ref (match_operand 1 ""))
                      (pc)))]
   ""
-  "b%d0\\t%l1"
+  "b%d0\t%l1"
   [(set_attr "length" "6")]
 )
 
        (match_operator:SI 1 "comparison_operator"
          [(reg:CC CC_REGNUM) (const_int 0)]))]
   ""
-  "s%d1\\t%0"
+  "s%d1\t%0"
   [(set_attr "length" "2")]
 )
 
      (return)])
   ]
   "reload_completed"
-  "jump\\tra"
+  "jump\tra"
   [(set_attr "length" "2")]
 )
 
        (match_operand:SI 0 "reg_or_sym_operand" "r,i"))]
   ""
   "@
-  jump\\t%0
-  br\\t%a0"
+  jump\t%0
+  br\t%a0"
   [(set_attr "length" "2,6")]
 )
 
   [(set (pc)
        (match_operand 0 "immediate_operand" "i"))]
   ""
-  "br\\t%c0"
+  "br\t%c0"
   [(set_attr "length" "6")]
 )
 
   [(set (pc)
        (label_ref (match_operand 0 "" "")))]
   ""
-  "br\\t%l0"
+  "br\t%l0"
   [(set_attr "length" "6")]
 )
 
      (return)])
   ]
   "reload_completed"
-  "popret\\tra"
+  "popret\tra"
   [(set_attr "length" "2")]
 )
 
        (match_operand:SI 0 "register_operand" "r"))
        (use (label_ref:SI (match_operand 1 "" "" )))]
   ""
-  "jump\\t%0"
+  "jump\t%0"
   [(set_attr "length" "2")]
 )
 
         (match_operand 1 "" ""))
    (clobber (match_operand:SI 2 "register_operand" "+r"))]
   ""
-  "bal\\tra, %a0"
+  "bal\tra, %a0"
   [(set_attr "length" "6")]
 )
 
         (match_operand 1 "" ""))
    (clobber (match_operand:SI 2 "register_operand" "+r"))]
   ""
-  "jal\\t%0"
+  "jal\t%0"
   [(set_attr "length" "2")]
 )
 
         (match_operand 2 "" ""))
    (clobber (match_operand:SI 3 "register_operand" "+r"))]
   ""
-  "jalid\\t%0, %1"
+  "jalid\t%0, %1"
   [(set_attr "length" "4")]
 )
 
              (match_operand 2 "" "")))
    (clobber (match_operand:SI 3 "register_operand" "+r"))]
   ""
-  "bal\\tra, %a1"
+  "bal\tra, %a1"
   [(set_attr "length" "6")]
 )
 
              (match_operand 2 "" "")))
    (clobber (match_operand:SI 3 "register_operand" "+r"))]
   ""
-  "jal\\t%1"
+  "jal\t%1"
   [(set_attr "length" "2")]
 )
 
              (match_operand 3 "" "")))
    (clobber (match_operand:SI 4 "register_operand" "+r"))]
   ""
-  "jalid\\t%0, %1"
+  "jalid\t%0, %1"
   [(set_attr "length" "4")]
 )
 
          (match_dup 0)))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_MAC"
-  "mac<sPat>d\\t%2, %1"
+  "mac<sPat>d\t%2, %1"
   [(set_attr "length" "4")]
 )
 
          (match_dup 0)))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_MAC"
-  "mac<sPat>w\\t%2, %1"
+  "mac<sPat>w\t%2, %1"
   [(set_attr "length" "4")]
 )
 
          (match_dup 0)))
    (clobber (reg:CC CC_REGNUM))]
   "TARGET_MAC"
-  "mac<sPat>b\\t%2, %1"
+  "mac<sPat>b\t%2, %1"
   [(set_attr "length" "4")]
 )
 
    (use (match_operand 4 "" ""))]       ; label
   ""
   {
+    if (INTVAL (operands[3]) > crx_loop_nesting)
+      FAIL;
     switch (GET_MODE (operands[0]))
       {
       case SImode:
-       emit_jump_insn (gen_doloop_end_si (operands[4], operands[0], operands[0]));
+       emit_jump_insn (gen_doloop_end_si (operands[4], operands[0]));
        break;
       case HImode:
-       emit_jump_insn (gen_doloop_end_hi (operands[4], operands[0], operands[0]));
+       emit_jump_insn (gen_doloop_end_hi (operands[4], operands[0]));
        break;
       case QImode:
-       emit_jump_insn (gen_doloop_end_qi (operands[4], operands[0], operands[0]));
+       emit_jump_insn (gen_doloop_end_qi (operands[4], operands[0]));
        break;
       default:
        FAIL;
   }
 )
 
+;   CRX dbnz[bwd] used explicitly (see above) but also by the combiner.
+
 (define_insn "doloop_end_<mode>"
   [(set (pc)
-       (if_then_else (ne (match_operand:CRXIM 1 "register_operand" "r,m")
+       (if_then_else (ne (match_operand:CRXIM 1 "register_operand" "+r,!m")
                          (const_int 1))
                      (label_ref (match_operand 0 "" ""))
                      (pc)))
-   (set (match_operand:CRXIM 2 "register_operand" "=r,m") (plus:CRXIM (match_dup 1) (const_int -1)))
-   (clobber (match_scratch:CRXIM 3 "=X,r"))
+   (set (match_dup 1) (plus:CRXIM (match_dup 1) (const_int -1)))
+   (clobber (match_scratch:CRXIM 2 "=X,r"))
    (clobber (reg:CC CC_REGNUM))]
   ""
   "@
-  dbnz<tIsa>\\t%1, %l0
-  load<tIsa>\\t%1, %3\;add<tIsa>\\t$-1, %3\;stor<tIsa>\\t%3, %1\;bne\\t%l0"
+  dbnz<tIsa>\t%1, %l0
+  load<tIsa>\t%1, %2\;add<tIsa>\t$-1, %2\;stor<tIsa>\t%2, %1\;bne\t%l0"
   [(set_attr "length" "6, 12")]
 )
index bbca45f760fe348cd21af300e9f37034322f5fc5..c8208f1acd55a9974e3a94f7f8e822b5709d91e2 100644 (file)
@@ -27,5 +27,9 @@ mno-push-args
 Target Report RejectNegative Mask(NO_PUSH_ARGS)
 Do not use push to store function arguments
 
+mloop-nesting=
+Common RejectNegative Joined UInteger Var(crx_loop_nesting) Init(12)
+Restrict doloop to the given nesting level
+
 mdebug-addr
 Target RejectNegative Var(TARGET_DEBUG_ADDR) Undocumented