aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJim Wilson <wilson@gcc.gnu.org>1993-01-14 11:20:51 -0800
committerJim Wilson <wilson@gcc.gnu.org>1993-01-14 11:20:51 -0800
commit114b9aa4cd7daae9c8cfba2feb1011b39e4c6aea (patch)
tree16383dcc2352196fbb6f33df883067832076eea6
parent228b4037f0d7b13bccfc2e4620bed6ac51f6cca9 (diff)
downloadgcc-114b9aa4cd7daae9c8cfba2feb1011b39e4c6aea.zip
gcc-114b9aa4cd7daae9c8cfba2feb1011b39e4c6aea.tar.gz
gcc-114b9aa4cd7daae9c8cfba2feb1011b39e4c6aea.tar.bz2
Document sparclite integer multiply cycle times.
(movdf, !TARGET_FPU): Remove tests for floating point registers. (divsi3, udivsi3): Correct length attribute. (ffssi2): Define for sparclite. From-SVN: r3235
-rw-r--r--gcc/config/sparc/sparc.md36
1 files changed, 25 insertions, 11 deletions
diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md
index bef4808..9b2ea3e 100644
--- a/gcc/config/sparc/sparc.md
+++ b/gcc/config/sparc/sparc.md
@@ -136,6 +136,9 @@
;; (Noted only for documentation; units that take one cycle do not need to
;; be specified.)
+;; On the sparclite, integer multiply takes 1, 3, or 5 cycles depending on
+;; the inputs.
+
;; (define_function_unit "alu" 1 0
;; (eq_attr "type" "unary,binary,move,address") 1 0)
@@ -1215,13 +1218,8 @@
"! TARGET_FPU
&& (register_operand (operands[0], DFmode)
|| register_operand (operands[1], DFmode))"
- "*
-{
- if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]))
- return output_fp_move_double (operands);
- return output_move_double (operands);
-}"
- [(set_attr "type" "fpstore,fpload,move,store,load")
+ "* return output_move_double (operands);"
+ [(set_attr "type" "store,load,move,store,load")
(set_attr "length" "1,1,2,3,3")])
(define_insn ""
@@ -1837,7 +1835,7 @@
(clobber (match_scratch:SI 3 "=&r"))]
"TARGET_V8"
"sra %1,31,%3\;wr %%g0,%3,%%y\;nop\;nop\;nop\;sdiv %1,%2,%0"
- [(set_attr "length" "3")])
+ [(set_attr "length" "6")])
;; It is not known whether this will match.
@@ -1851,7 +1849,7 @@
(clobber (match_scratch:SI 3 "=&r"))]
"TARGET_V8"
"sra %1,31,%3\;wr %%g0,%3,%%y\;nop\;nop\;nop\;sdivcc %1,%2,%0"
- [(set_attr "length" "3")])
+ [(set_attr "length" "6")])
(define_insn "udivsi3"
[(set (match_operand:SI 0 "register_operand" "=r")
@@ -1859,7 +1857,7 @@
(match_operand:SI 2 "arith_operand" "rI")))]
"TARGET_V8"
"wr %%g0,%%g0,%%y\;nop\;nop\;nop\;udiv %1,%2,%0"
- [(set_attr "length" "2")])
+ [(set_attr "length" "5")])
;; It is not known whether this will match.
@@ -1872,7 +1870,7 @@
(const_int 0)))]
"TARGET_V8"
"wr %%g0,%%g0,%%y\;nop\;nop\;nop\;udivcc %1,%2,%0"
- [(set_attr "length" "2")])
+ [(set_attr "length" "5")])
;;- and instructions
;; We define DImode `and` so with DImode `not` we can get
@@ -2791,6 +2789,22 @@
[(set_attr "type" "misc")
(set_attr "length" "2")])
+;; find first set.
+
+;; The scan instruction searches from the most significant bit while ffs
+;; searches from the least significant bit. The bit index and treatment of
+;; zero also differ. It takes at least 7 instructions to get the proper
+;; result. Here is an obvious 8 instruction seequence.
+
+(define_insn "ffssi2"
+ [(set (match_operand:SI 0 "register_operand" "=&r")
+ (ffs:SI (match_operand:SI 1 "register_operand" "r")))
+ (clobber (match_scratch:SI 2 "=&r"))]
+ "TARGET_SPARCLITE"
+ "sub %%g0,%1,%0\;and %0,%1,%0\;scan %0,0,%0\;mov 32,%2\;sub %2,%0,%0\;sra %0,31,%2\;and %2,31,%2\;add %2,%0,%0"
+ [(set_attr "type" "multi")
+ (set_attr "length" "8")])
+
;; Split up troublesome insns for better scheduling. */
;; The following patterns are straightforward. They can be applied