pa.md (non-[cf]branch define_delay): Use a single delay description for the delay...
authorJeff Law <law@gcc.gnu.org>
Fri, 11 Sep 1992 16:39:13 +0000 (10:39 -0600)
committerJeff Law <law@gcc.gnu.org>
Fri, 11 Sep 1992 16:39:13 +0000 (10:39 -0600)
* pa.md (non-[cf]branch define_delay): Use a single delay description
for the delay slots in "branch", "call", and "milli" insns.
(fbranch define_delay): fbranches have a single delay slot which
may be nullified when the branch is taken (regardless of direction
or distance to the target.)
(in_branch_delay attribute): Disallow fbranch insns explicitly.
(floating point branches): Use "fbranch" attribute for these insns.
Update output template to properly handle nullification.

From-SVN: r2107

gcc/config/pa/pa.md

index d74186aa9568b36f2669c04170b88766cc81bc2f..dc0d70040778c343cfaab08e2273d4ffc013b7b4 100644 (file)
@@ -30,7 +30,7 @@
 ;; type "binary" insns have two input operands (1,2) and one output (0)
 
 (define_attr "type"
-  "move,unary,binary,compare,load,store,branch,cbranch,call,dyncall,fpload,fpstore,fpalu,fpcc,fpmul,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,multi,misc,milli"
+  "move,unary,binary,compare,load,store,branch,cbranch,fbranch,call,dyncall,fpload,fpstore,fpalu,fpcc,fpmul,fpdivsgl,fpdivdbl,fpsqrtsgl,fpsqrtdbl,multi,misc,milli"
   (const_string "binary"))
 
 ;; Length (in # of insns).
 
 ;; Attributes for instruction and branch scheduling
 
-(define_delay (eq_attr "type" "call")
-  [(eq_attr "in_branch_delay" "true") (nil) (nil)])
-
 (define_attr "in_branch_delay" "false,true"
-  (if_then_else (and (eq_attr "type" "!branch,cbranch,call,dyncall,multi,milli")
+  (if_then_else (and (eq_attr "type" "!branch,cbranch,fbranch,call,dyncall,multi,milli")
                     (eq_attr "length" "1"))
                (const_string "true")
                (const_string "false")))
 
-(define_delay (eq_attr "type" "branch")
+;; Unconditional branch, call, and millicode call delay slot description.
+(define_delay (eq_attr "type" "branch,call,milli")
   [(eq_attr "in_branch_delay" "true") (nil) (nil)])
 
-(define_delay (eq_attr "type" "cbranch")
-  [(eq_attr "in_branch_delay" "true") (nil) (nil)])
+;; Floating point conditional branch delay slot description.
+(define_delay (eq_attr "type" "fbranch")
+  [(eq_attr "in_branch_delay" "true") 
+   (eq_attr "in_branch_delay" "true") 
+   (nil)])
 
-(define_delay (eq_attr "type" "milli")
+;; Integer conditional branch delay slot description.
+(define_delay (eq_attr "type" "cbranch")
   [(eq_attr "in_branch_delay" "true") (nil) (nil)])
 
 ;; Function units of the HPPA. The following data is for the "Snake"
                           (label_ref (match_operand 0 "" ""))
                           (pc)))]
   ""
-  "ftest\;bl%* %0,0"
-  [(set_attr "type" "cbranch")
+  "*
+{
+  if (INSN_ANNULLED_BRANCH_P (insn))
+    return \"ftest\;bl,n %0,0\";
+  else
+    return \"ftest\;bl%* %0,0\";
+}"
+  [(set_attr "type" "fbranch")
    (set_attr "length" "2")])
 
 (define_insn ""
                           (pc)
                           (label_ref (match_operand 0 "" ""))))]
   ""
-  "ftest\;add,tr 0,0,0\;bl%* %0,0"
-  [(set_attr "type" "cbranch")
+  "*
+{
+  if (INSN_ANNULLED_BRANCH_P (insn))
+    return \"ftest\;add,tr 0,0,0\;bl,n %0,0\";
+  else
+    return \"ftest\;add,tr 0,0,0\;bl%* %0,0\";
+}"
+  [(set_attr "type" "fbranch")
    (set_attr "length" "3")])
 
 ;; Move instructions