Commit ad0e4f77 by Tom Wood

(type attributes): Delete unused mbit and mfp types.

	(ffsi2 insn): Define.
	(negdf2 and absdf2 insns): Improve.

From-SVN: r1307
parent f5902869
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
(define_expand "m88k_sccs_id" (define_expand "m88k_sccs_id"
[(match_operand:SI 0 "" "")] [(match_operand:SI 0 "" "")]
"" ""
"{ static char sccs_id[] = \"@(#)m88k.md 2.1.11.6 29 May 1992 10:55:49\"; "{ static char sccs_id[] = \"@(#)m88k.md 2.2.3.6 27 Jun 1992 06:29:32\";
FAIL; }") FAIL; }")
;; Attribute specifications ;; Attribute specifications
...@@ -45,31 +45,31 @@ ...@@ -45,31 +45,31 @@
; spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv, ; FPU add instructions ; spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv, ; FPU add instructions
; spmul,dpmul,imul, ; FPU multiply instructions ; spmul,dpmul,imul, ; FPU multiply instructions
; arith,bit,mov ; integer unit instructions ; arith,bit,mov ; integer unit instructions
; marith,mbit,mfp,weird" ; multi-word instructions ; marith,weird" ; multi-word instructions
; Classification of each insn. Some insns of TYPE_BRANCH are multi-word. ; Classification of each insn. Some insns of TYPE_BRANCH are multi-word.
(define_attr "type" (define_attr "type"
"branch,jump,call,load,store,loada,spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv,spmul,dpmul,imul,arith,bit,mov,marith,mbit,mfp,weird" "branch,jump,call,load,store,loada,spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv,spmul,dpmul,imul,arith,bit,mov,marith,weird"
(const_string "arith")) (const_string "arith"))
; Convenience attributes. ; Convenience attributes.
(define_attr "unit" "bit,memory,multiply,divide,fpadd,other" (define_attr "unit" "bit,memory,multiply,divide,fpadd,other"
(cond [(eq_attr "type" "bit,mbit") (const_string "bit") (cond [(eq_attr "type" "bit") (const_string "bit")
(eq_attr "type" "load,store") (const_string "memory") (eq_attr "type" "load,store") (const_string "memory")
(eq_attr "type" "spmul,dpmul,imul") (const_string "multiply") (eq_attr "type" "spmul,dpmul,imul") (const_string "multiply")
(eq_attr "type" "spdiv,dpdiv,idiv") (const_string "divide") (eq_attr "type" "spdiv,dpdiv,idiv") (const_string "divide")
(eq_attr "type" "spadd,dpadd,spcmp,dpcmp,mfp") (const_string "fpadd")] (eq_attr "type" "spadd,dpadd,spcmp,dpcmp") (const_string "fpadd")]
(const_string "other"))) (const_string "other")))
(define_attr "fpu" "yes,no" (define_attr "fpu" "yes,no"
(if_then_else (if_then_else
(eq_attr "type" "spmul,dpmul,imul,spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv,mfp") (eq_attr "type" "spmul,dpmul,imul,spadd,dpadd,spcmp,dpcmp,spdiv,dpdiv,idiv")
(const_string "yes") (const_string "no"))) (const_string "yes") (const_string "no")))
; Length in # of instructions of each insn. The values are not exact, but ; Length in # of instructions of each insn. The values are not exact, but
; are safe. ; are safe.
(define_attr "length" "" (define_attr "length" ""
(cond [(eq_attr "type" "marith,mbit,mfp") (cond [(eq_attr "type" "marith")
(const_int 2)] (const_int 2)]
(const_int 1))) (const_int 1)))
...@@ -88,7 +88,7 @@ ...@@ -88,7 +88,7 @@
(define_delay (eq_attr "type" "branch,jump") (define_delay (eq_attr "type" "branch,jump")
[(and [(and
(and (and
(eq_attr "type" "!branch,jump,call,marith,mbit,mfp,weird") ; required. (eq_attr "type" "!branch,jump,call,marith,weird") ; required.
(eq_attr "type" "!load")) ; issue as-soon-as-possible. (eq_attr "type" "!load")) ; issue as-soon-as-possible.
(eq_attr "fpu" "no")) ; issue as-soon-as-possible. (eq_attr "fpu" "no")) ; issue as-soon-as-possible.
(eq_attr "type" "!call,branch,jump") (nil)]) ; @@ was (const_int 1) (eq_attr "type" "!call,branch,jump") (nil)]) ; @@ was (const_int 1)
...@@ -97,7 +97,7 @@ ...@@ -97,7 +97,7 @@
; a call. (@@ Support for this case is expected in reorg.c soon.) ; a call. (@@ Support for this case is expected in reorg.c soon.)
(define_delay (eq_attr "type" "call") (define_delay (eq_attr "type" "call")
[(eq_attr "type" "!branch,call,marith,mbit,mfp,weird") ; required. [(eq_attr "type" "!branch,call,marith,weird") ; required.
(nil) (nil)]) (nil) (nil)])
; An abstract block diagram of the function units for the m88100. ; An abstract block diagram of the function units for the m88100.
...@@ -145,13 +145,13 @@ ...@@ -145,13 +145,13 @@
; Describing the alu is currently not useful. ; Describing the alu is currently not useful.
;(define_function_unit "alu" 1 0 (eq_attr "type" ;(define_function_unit "alu" 1 0 (eq_attr "type"
; "!store,marith,mbit,mfp,weird") 1 0) ; "!store,marith,weird") 1 0)
;(define_function_unit "alu" 1 0 (eq_attr "type" "marith,mbit,weird") 2 0) ;(define_function_unit "alu" 1 0 (eq_attr "type" "marith,weird") 2 0)
(define_function_unit "alu" 1 0 (define_function_unit "alu" 1 0
(and (eq_attr "type" "loada,arith,bit,mov") (eq_attr "cpu" "!m88100")) 2 0) (and (eq_attr "type" "loada,arith,bit,mov") (eq_attr "cpu" "!m88100")) 2 0)
(define_function_unit "alu" 1 0 (define_function_unit "alu" 1 0
(and (eq_attr "type" "marith,mbit,weird") (eq_attr "cpu" "!m88100")) 4 0) (and (eq_attr "type" "marith,weird") (eq_attr "cpu" "!m88100")) 4 0)
(define_function_unit "memory" 1 3 (define_function_unit "memory" 1 3
(and (eq_attr "type" "load") (eq_attr "cpu" "m88100")) 3 2) (and (eq_attr "type" "load") (eq_attr "cpu" "m88100")) 3 2)
...@@ -168,12 +168,12 @@ ...@@ -168,12 +168,12 @@
(define_function_unit "fpmul" 1 4 (define_function_unit "fpmul" 1 4
(and (eq_attr "type" "spmul") (eq_attr "cpu" "m88100")) 4 2) ; 6-8 (and (eq_attr "type" "spmul") (eq_attr "cpu" "m88100")) 4 2) ; 6-8
(define_function_unit "fpmul" 1 4 (define_function_unit "fpmul" 1 4
(and (eq_attr "type" "dpmul,mfp") (eq_attr "cpu" "m88100")) 7 2) ; 9-10 (and (eq_attr "type" "dpmul") (eq_attr "cpu" "m88100")) 7 2) ; 9-10
(define_function_unit "fpmul" 1 4 (define_function_unit "fpmul" 1 4
(and (eq_attr "type" "imul") (eq_attr "cpu" "m88100")) 3 2) ; 4 (and (eq_attr "type" "imul") (eq_attr "cpu" "m88100")) 3 2) ; 4
(define_function_unit "fpmul" 1 4 (define_function_unit "fpmul" 1 4
(and (eq_attr "type" "imul,spmul,dpmul,mfp") (and (eq_attr "type" "imul,spmul,dpmul")
(eq_attr "cpu" "!m88100")) 6 2) ; 3 (eq_attr "cpu" "!m88100")) 6 2) ; 3
(define_function_unit "fpadd" 1 3 (define_function_unit "fpadd" 1 3
...@@ -2764,6 +2764,24 @@ ...@@ -2764,6 +2764,24 @@
"rot %0,%1,%2" "rot %0,%1,%2"
[(set_attr "type" "bit")]) [(set_attr "type" "bit")])
;; find first set.
;; The ff1 instruction searches from the most significant bit while ffs
;; searches from the least significant bit. The bit index and treatment of
;; zero also differ. This amazing sequence was discovered using the GNU
;; Superoptimizer.
(define_insn "ffssi2"
[(set (match_operand:SI 0 "register_operand" "=r,&r")
(ffs:SI (match_operand:SI 1 "register_operand" "0,r")))
(clobber (match_scratch:SI 2 "=r,X"))]
""
"@
subu.co %2,%#r0,%1\;and %2,%2,%1\;addu.ci %2,%2,%2\;ff1 %0,%2
subu.co %0,%#r0,%1\;and %0,%0,%1\;addu.ci %0,%0,%0\;ff1 %0,%0"
[(set_attr "type" "marith")
(set_attr "length" "4")])
;; Bit field instructions. ;; Bit field instructions.
(define_insn "" (define_insn ""
...@@ -2883,18 +2901,14 @@ ...@@ -2883,18 +2901,14 @@
fsub.ssd %0,%#x0,%1" fsub.ssd %0,%#x0,%1"
[(set_attr "type" "dpadd")]) [(set_attr "type" "dpadd")])
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "+r")
(neg:DF (match_dup 0)))]
""
"xor.u %0,%0,0x8000")
(define_insn "negdf2" (define_insn "negdf2"
[(set (match_operand:DF 0 "register_operand" "=&r") [(set (match_operand:DF 0 "register_operand" "=&r,r")
(neg:DF (match_operand:DF 1 "register_operand" "r")))] (neg:DF (match_operand:DF 1 "register_operand" "r,0")))]
"" ""
"xor.u %0,%1,0x8000\;or %d0,%#r0,%d1" "@
[(set_attr "type" "marith")]) xor.u %0,%1,0x8000\;or %d0,%#r0,%d1
xor.u %0,%0,0x8000"
[(set_attr "type" "marith,arith")])
(define_insn "negsf2" (define_insn "negsf2"
[(set (match_operand:SF 0 "register_operand" "=r") [(set (match_operand:SF 0 "register_operand" "=r")
...@@ -2905,18 +2919,14 @@ ...@@ -2905,18 +2919,14 @@
;; absolute value insns for floating-point (integer abs can be done using the ;; absolute value insns for floating-point (integer abs can be done using the
;; machine-independent sequence). ;; machine-independent sequence).
(define_insn ""
[(set (match_operand:DF 0 "register_operand" "+r")
(abs:DF (match_dup 0)))]
""
"and.u %0,%0,0x7fff")
(define_insn "absdf2" (define_insn "absdf2"
[(set (match_operand:DF 0 "register_operand" "=&r") [(set (match_operand:DF 0 "register_operand" "=&r,r")
(abs:DF (match_operand:DF 1 "register_operand" "r")))] (abs:DF (match_operand:DF 1 "register_operand" "r,0")))]
"" ""
"and.u %0,%1,0x7fff\;or %d0,%#r0,%d1" "@
[(set_attr "type" "marith")]) and.u %0,%1,0x7fff\;or %d0,%#r0,%d1
and.u %0,%0,0x7fff"
[(set_attr "type" "marith,arith")])
(define_insn "abssf2" (define_insn "abssf2"
[(set (match_operand:SF 0 "register_operand" "=r") [(set (match_operand:SF 0 "register_operand" "=r")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment