mmix.md: Update FIXME to not mention define_constants.
authorHans-Peter Nilsson <hp@bitrange.com>
Tue, 1 Jan 2002 20:52:28 +0000 (20:52 +0000)
committerHans-Peter Nilsson <hp@gcc.gnu.org>
Tue, 1 Jan 2002 20:52:28 +0000 (20:52 +0000)
* config/mmix/mmix.md: Update FIXME to not mention
define_constants.
(MMIX_rJ_REGNUM): New define_constants constant.
("movqi", "movsi", "movdi", "*movdicc_real_foldable",
"*movdicc_real"): Adjust contraints formatting.
("*bCC_foldable"): Add %+ for P in output format and delete FIXME
for branch prediction.
("*bCC", "*bCC_inverted_foldable", "*bCC_inverted"): Add %+ in
output template.
("*call_real", "*call_value_real", "nonlocal_goto_receiver",
"*nonlocal_goto_receiver_expanded"): Use MMIX_rJ_REGNUM instead of
number.  Delete related FIXMEs.
* config/mmix/mmix.h (MMIX_INCOMING_RETURN_ADDRESS_REGNUM): Change
from number to MMIX_rJ_REGNUM.
(TARGET_MASK_BRANCH_PREDICT): New.
(TARGET_DEFAULT): Change to TARGET_MASK_BRANCH_PREDICT.
(TARGET_SWITCHES): Update comment.  Correct -mno-toplevel-symbols
value.  Add -mbranch-predict and -mno-branch-predict.
(TARGET_VERSION): Drop date.
(ADDITIONAL_REGISTER_NAMES): Use MMIX_rJ_REGNUM, not number.
* config/mmix/mmix.c (mmix_encode_section_info): Correct condition
for finding out global symbols.
(mmix_asm_output_labelref): Revert condition for global symbol.
(mmix_print_operand): <case '+'>: Emit P for a likely branch.
(mmix_print_operand_punct_valid_p): A '+' is valid.

From-SVN: r48448

gcc/ChangeLog
gcc/config/mmix/mmix.c
gcc/config/mmix/mmix.h
gcc/config/mmix/mmix.md

index 7502386aa0c2992ed7a909d5a26ef63bbb3fe191..2f80992680143e3b1211b510cfb9eb5e181d4326 100644 (file)
@@ -1,3 +1,31 @@
+2002-01-01  Hans-Peter Nilsson  <hp@bitrange.com>
+
+       * config/mmix/mmix.md: Update FIXME to not mention
+       define_constants.
+       (MMIX_rJ_REGNUM): New define_constants constant.
+       ("movqi", "movsi", "movdi", "*movdicc_real_foldable",
+       "*movdicc_real"): Adjust contraints formatting.
+       ("*bCC_foldable"): Add %+ for P in output format and delete FIXME
+       for branch prediction.
+       ("*bCC", "*bCC_inverted_foldable", "*bCC_inverted"): Add %+ in
+       output template.
+       ("*call_real", "*call_value_real", "nonlocal_goto_receiver",
+       "*nonlocal_goto_receiver_expanded"): Use MMIX_rJ_REGNUM instead of
+       number.  Delete related FIXMEs.
+       * config/mmix/mmix.h (MMIX_INCOMING_RETURN_ADDRESS_REGNUM): Change
+       from number to MMIX_rJ_REGNUM.
+       (TARGET_MASK_BRANCH_PREDICT): New.
+       (TARGET_DEFAULT): Change to TARGET_MASK_BRANCH_PREDICT.
+       (TARGET_SWITCHES): Update comment.  Correct -mno-toplevel-symbols
+       value.  Add -mbranch-predict and -mno-branch-predict.
+       (TARGET_VERSION): Drop date.
+       (ADDITIONAL_REGISTER_NAMES): Use MMIX_rJ_REGNUM, not number.
+       * config/mmix/mmix.c (mmix_encode_section_info): Correct condition
+       for finding out global symbols.
+       (mmix_asm_output_labelref): Revert condition for global symbol.
+       (mmix_print_operand): <case '+'>: Emit P for a likely branch.
+       (mmix_print_operand_punct_valid_p): A '+' is valid.
+
 2001-12-31  Richard Henderson  <rth@redhat.com>
 
        * config/ia64/ia64.c (mark_reg_gr_used_mask): Mind HARD_REGNO_NREGS.
index 5227270e448774dded632d8de53ee73527c22d4e..e60a690107e9b75b03640a5780f07f422540e928 100644 (file)
@@ -1683,10 +1683,8 @@ mmix_encode_section_info (decl)
 {
   /* Test for an external declaration, and do nothing if it is one.  */
   if ((TREE_CODE (decl) == VAR_DECL
-       && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))
-       && ! TREE_STATIC (decl))
-      || (TREE_CODE (decl) == FUNCTION_DECL
-         && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl))))
+       && (DECL_EXTERNAL (decl) || TREE_PUBLIC (decl)))
+      || (TREE_CODE (decl) == FUNCTION_DECL && TREE_PUBLIC (decl)))
     ;
   else if (DECL_P (decl))
     {
@@ -1697,8 +1695,8 @@ mmix_encode_section_info (decl)
         Note that this does not work for data that is declared extern and
         later defined as static.  If there's code in between, that code
         will refer to the extern declaration.  And vice versa.  Until we
-        can get rid of mmixal, we have to assume that code is well-behaved
-        or come up with a contorted scheme to work around bad code.  */
+        can get rid of mmixal, we have to assume that code is
+        well-behaved.  */
 
       const char *str = XSTR (XEXP (DECL_RTL (decl), 0), 0);
       int len = strlen (str);
@@ -2043,11 +2041,11 @@ mmix_asm_output_labelref (stream, name)
      FILE *stream;
      const char *name;
 {
-  int is_extern = 0;
+  int is_extern = 1;
 
   for (; (*name == '@' || *name == '*'); name++)
     if (*name == '@')
-      is_extern = 1;
+      is_extern = 0;
 
   asm_fprintf (stream, "%s%U%s",
               is_extern && TARGET_TOPLEVEL_SYMBOLS ? ":" : "",
@@ -2112,6 +2110,16 @@ mmix_print_operand (stream, x, code)
     {
       /* Unrelated codes are in alphabetic order.  */
 
+    case '+':
+      /* For conditional branches, output "P" for a probable branch.  */
+      if (TARGET_BRANCH_PREDICT)
+       {
+         x = find_reg_note (current_output_insn, REG_BR_PROB, 0);
+         if (x && INTVAL (XEXP (x, 0)) > REG_BR_PROB_BASE / 2)
+           putc ('P', stream);
+       }
+      return;
+
     case 'B':
       if (GET_CODE (x) != CONST_INT)
        fatal_insn ("MMIX Internal: Expected a CONST_INT, not this", x);
@@ -2319,8 +2327,8 @@ int
 mmix_print_operand_punct_valid_p (code)
      int code ATTRIBUTE_UNUSED;
 {
-  /* None at the moment.  */
-  return 0;
+  /* A '+' is used for branch prediction, similar to other ports.  */
+  return code == '+';
 }
 
 /* PRINT_OPERAND_ADDRESS.  */
index 1c552d7f8cdfcb83b636fc994b2682f38cf33c92..b709d2d575138aff8079db57bcb680be3458bad9 100644 (file)
@@ -45,7 +45,7 @@ Boston, MA 02111-1307, USA.  */
 #define MMIX_FRAME_POINTER_REGNUM 253
 #define MMIX_STACK_POINTER_REGNUM 254
 #define MMIX_LAST_GENERAL_REGISTER 255
-#define MMIX_INCOMING_RETURN_ADDRESS_REGNUM 259
+#define MMIX_INCOMING_RETURN_ADDRESS_REGNUM MMIX_rJ_REGNUM
 #define MMIX_HIMULT_REGNUM 258
 #define MMIX_REMAINDER_REGNUM 260
 #define MMIX_ARG_POINTER_REGNUM 261
@@ -156,6 +156,7 @@ extern int target_flags;
 #define TARGET_MASK_ZERO_EXTEND 8
 #define TARGET_MASK_KNUTH_DIVISION 16
 #define TARGET_MASK_TOPLEVEL_SYMBOLS 32
+#define TARGET_MASK_BRANCH_PREDICT 64
 
 /* FIXME: Get rid of this one.  */
 #define TARGET_LIBFUNC (target_flags & TARGET_MASK_LIBFUNCS)
@@ -164,11 +165,11 @@ extern int target_flags;
 #define TARGET_ZERO_EXTEND (target_flags & TARGET_MASK_ZERO_EXTEND)
 #define TARGET_KNUTH_DIVISION (target_flags & TARGET_MASK_KNUTH_DIVISION)
 #define TARGET_TOPLEVEL_SYMBOLS (target_flags & TARGET_MASK_TOPLEVEL_SYMBOLS)
+#define TARGET_BRANCH_PREDICT (target_flags & TARGET_MASK_BRANCH_PREDICT)
 
-#define TARGET_DEFAULT 0
+#define TARGET_DEFAULT TARGET_MASK_BRANCH_PREDICT
 
-/* FIXME: Provide a way to *load* the epsilon register.
-   Kill some of these; preferrably the -mint=* ones.  */
+/* FIXME: Provide a way to *load* the epsilon register.  */
 #define TARGET_SWITCHES                                                        \
  {{"libfuncs",         TARGET_MASK_LIBFUNCS,                           \
    N_("For intrinsics library: pass all parameters in registers")},    \
@@ -189,15 +190,19 @@ extern int target_flags;
   {"no-knuthdiv",      -TARGET_MASK_KNUTH_DIVISION, ""},               \
   {"toplevel-symbols", TARGET_MASK_TOPLEVEL_SYMBOLS,                   \
    N_("Prepend global symbols with \":\" (for use with PREFIX)")},     \
-  {"no-toplevel-symbols", 0,                                           \
+  {"no-toplevel-symbols", -TARGET_MASK_TOPLEVEL_SYMBOLS,               \
    N_("Do not provide a default start-address 0x100 of the program")}, \
   {"elf", 0,                                                           \
    N_("Link to emit program in ELF format (rather than mmo)")},                \
+  {"branch-predict",   TARGET_MASK_BRANCH_PREDICT,                     \
+   N_("Use P-mnemonics for branches statically predicted as taken")},  \
+  {"no-branch-predict",        -TARGET_MASK_BRANCH_PREDICT,                    \
+   N_("Don't use P-mnemonics for branches")},                          \
   {"",                 TARGET_DEFAULT, ""}}
 
 /* Unfortunately, this must not reference anything in "mmix.c".  */
 #define TARGET_VERSION \
-  fprintf (stderr, " (MMIX) 2001-09-01")
+  fprintf (stderr, " (MMIX)")
 
 #define OVERRIDE_OPTIONS mmix_override_options ()
 
@@ -1074,7 +1079,7 @@ const_section ()                                          \
 
 #define ADDITIONAL_REGISTER_NAMES                      \
  {{"sp", 254}, {":sp", 254}, {"rD", 256}, {"rE", 257}, \
-  {"rH", 258}, {"rJ", 259}}
+  {"rH", 258}, {"rJ", MMIX_rJ_REGNUM}}
 
 #define PRINT_OPERAND(STREAM, X, CODE) \
  mmix_print_operand (STREAM, X, CODE)
index cdc43cd1c8b5a63cf85c6b09cfb0479c9d002113..3998bf4edbf8ea3595ac379abe5806780d552063 100644 (file)
 
 ;; FIXME:s
 ;; - Use new formats; e.g. '{' not '"*{'.
-;; - define_constants.
+
+(define_constants
+  [(MMIX_rJ_REGNUM 259)]
+)
 
 ;; FIXME: Can we remove the reg-to-reg for smaller modes?  Shouldn't they
 ;; be synthesized ok?
 (define_insn "movqi"
-  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r ,r ,x ,r,r,m,??r")
-       (match_operand:QI 1 "general_operand"       "r,LS,K,rI ,x,m,r,n"))]
+  [(set (match_operand:QI 0 "nonimmediate_operand" "=r,r ,r,x ,r,r,m,??r")
+       (match_operand:QI 1 "general_operand"       "r,LS,K,rI,x,m,r,n"))]
   ""
   "@
    SET %0,%1
@@ -70,7 +73,7 @@
 
 ;; gcc.c-torture/compile/920428-2.c fails if there's no "n".
 (define_insn "movsi"
-  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r ,r ,x,r,r,m,??r")
+  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,r ,r,x,r,r,m,??r")
        (match_operand:SI 1 "general_operand"       "r,LS,K,r,x,m,r,n"))]
   ""
   "@
@@ -85,7 +88,7 @@
 
 ;; We assume all "s" are addresses.  Does that hold?
 (define_insn "movdi"
-  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r ,r ,x,r,m ,r,m,r,??r")
+  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,r ,r,x,r,m,r,m,r,??r")
        (match_operand:DI 1 "general_operand"       "r,LS,K,r,x,I,m,r,s,n"))]
   ""
   "@
@@ -692,8 +695,8 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
         (match_operator 2 "mmix_foldable_comparison_operator"
                         [(match_operand 3 "register_operand" "r,r,r,r")
                          (const_int 0)])
-        (match_operand:DI 1 "mmix_reg_or_8bit_operand" "rI, 0  ,rI,GM")
-        (match_operand:DI 4 "mmix_reg_or_8bit_operand" "0  ,rI,GM ,rI")))]
+        (match_operand:DI 1 "mmix_reg_or_8bit_operand" "rI,0 ,rI,GM")
+        (match_operand:DI 4 "mmix_reg_or_8bit_operand" "0 ,rI,GM,rI")))]
   ""
   "@
    CS%d2 %0,%3,%1
@@ -703,14 +706,14 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
 
 (define_insn "*movdicc_real"
   [(set
-    (match_operand:DI 0 "register_operand"        "=r  ,r ,r  ,r")
+    (match_operand:DI 0 "register_operand"        "=r ,r ,r ,r")
     (if_then_else:DI
      (match_operator
       2 "mmix_comparison_operator"
-      [(match_operand 3 "mmix_reg_cc_operand"      "r  ,r ,r  ,r")
+      [(match_operand 3 "mmix_reg_cc_operand"      "r ,r ,r ,r")
       (const_int 0)])
-     (match_operand:DI 1 "mmix_reg_or_8bit_operand" "rI, 0 ,rI, GM")
-     (match_operand:DI 4 "mmix_reg_or_8bit_operand" "0 ,rI,GM ,rI")))]
+     (match_operand:DI 1 "mmix_reg_or_8bit_operand" "rI,0 ,rI,GM")
+     (match_operand:DI 4 "mmix_reg_or_8bit_operand" "0 ,rI,GM,rI")))]
   ""
   "@
    CS%d2 %0,%3,%1
@@ -925,8 +928,6 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
 ;; FIXME: we can emit an unordered-or-*not*-equal compare in one insn, but
 ;; there's no RTL code for it.  Maybe revisit in future.
 
-;; FIXME: Non/probable branches? Check for REG_BR_PROB note on the jump
-;; insn and emit 'P' where suitable *and measure*.
 ;; FIXME: Odd/Even matchers?
 (define_insn "*bCC_foldable"
   [(set (pc)
@@ -937,7 +938,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
         (label_ref (match_operand 0 "" ""))
         (pc)))]
   ""
-  "B%d1 %2,%0")
+  "%+B%d1 %2,%0")
 
 (define_insn "*bCC"
   [(set (pc)
@@ -948,7 +949,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
         (label_ref (match_operand 0 "" ""))
         (pc)))]
   ""
-  "B%d1 %2,%0")
+  "%+B%d1 %2,%0")
 
 (define_insn "*bCC_inverted_foldable"
   [(set (pc)
@@ -960,7 +961,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
                      (label_ref (match_operand 0 "" ""))))]
 ;; REVERSIBLE_CC_MODE is checked by mmix_foldable_comparison_operator.
   ""
-  "B%D1 %2,%0")
+  "%+B%D1 %2,%0")
 
 (define_insn "*bCC_inverted"
   [(set (pc)
@@ -971,7 +972,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
         (pc)
         (label_ref (match_operand 0 "" ""))))]
   "REVERSIBLE_CC_MODE (GET_MODE (operands[2]))"
-  "B%D1 %2,%0")
+  "%+B%D1 %2,%0")
 \f
 (define_expand "call"
   [(parallel [(call (match_operand:QI 0 "memory_operand" "")
@@ -1044,8 +1045,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
          (match_operand:DI 0 "mmix_symbolic_or_address_operand" "s,rU"))
         (match_operand 1 "" ""))
    (use (match_operand 2 "" ""))
-   ;; 259 is rJ (We can't use the symbolic name here.  FIXME: Yes we can.)
-   (clobber (reg:DI 259))]
+   (clobber (reg:DI MMIX_rJ_REGNUM))]
   ""
   "@
    PUSHJ $%p2,%0
@@ -1057,8 +1057,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
               (match_operand:DI 1 "mmix_symbolic_or_address_operand" "s,rU"))
              (match_operand 2 "" "")))
   (use (match_operand 3 "" ""))
-  ;; 259 is rJ (We can't use the symbolic name here.  FIXME: Yes we can.)
-  (clobber (reg:DI 259))]
+  (clobber (reg:DI MMIX_rJ_REGNUM))]
   ""
   "@
    PUSHJ $%p3,%1
@@ -1103,8 +1102,8 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
 (define_expand "nonlocal_goto_receiver"
   [(parallel [(unspec_volatile [(match_dup 0)] 1)
              (clobber (scratch:DI))
-             (clobber (reg:DI 259))])
-   (set (reg:DI 259) (match_dup 1))]
+             (clobber (reg:DI MMIX_rJ_REGNUM))])
+   (set (reg:DI MMIX_rJ_REGNUM) (match_dup 1))]
   ""
   "
 {
@@ -1126,7 +1125,7 @@ DIVU %1,%1,%2\;GET %0,:rR\;NEGU %2,0,%0\;CSNN %0,$255,%2")
 (define_insn "*nonlocal_goto_receiver_expanded"
   [(unspec_volatile [(match_operand:DI 0 "address_operand" "p")] 1)
    (clobber (match_scratch:DI 1 "=&r"))
-   (clobber (reg:DI 259))]
+   (clobber (reg:DI MMIX_rJ_REGNUM))]
   ""
   "GETA $255,0f\;PUT rJ,$255\;LDOU $255,%a0\n\
 0: GET %1,rO\;CMPU %1,%1,$255\;BNP %1,1f\;POP 0,0\n1:")