(extendsfdf2): SFmode and DFmode register format identical so use define_expand...
(extendsfdf2): SFmode and DFmode register format identical so use define_expand with paradoxical subreg no-op and accompanying new define_split. From-SVN: r8586
This commit is contained in:
parent
8ca00751f7
commit
5c30aff875
@ -2500,6 +2500,10 @@
|
|||||||
;; The only conversions we will do will be when storing to memory. In that
|
;; The only conversions we will do will be when storing to memory. In that
|
||||||
;; case, we will use the "frsp" instruction before storing.
|
;; case, we will use the "frsp" instruction before storing.
|
||||||
;;
|
;;
|
||||||
|
;; SFmode values are stored in DFmode registers with the same format as
|
||||||
|
;; DFmode values, so float_extend is a no-op: treat as paradoxical subreg
|
||||||
|
;; using define_expand and define_split if made by combine.
|
||||||
|
;;
|
||||||
;; Note that when we store into a single-precision memory location, we need to
|
;; Note that when we store into a single-precision memory location, we need to
|
||||||
;; use the frsp insn first. If the register being stored isn't dead, we
|
;; use the frsp insn first. If the register being stored isn't dead, we
|
||||||
;; need a scratch register for the frsp. But this is difficult when the store
|
;; need a scratch register for the frsp. But this is difficult when the store
|
||||||
@ -2507,18 +2511,26 @@
|
|||||||
;; this case, we just lose precision that we would have otherwise gotten but
|
;; this case, we just lose precision that we would have otherwise gotten but
|
||||||
;; is not guaranteed. Perhaps this should be tightened up at some point.
|
;; is not guaranteed. Perhaps this should be tightened up at some point.
|
||||||
|
|
||||||
(define_insn "extendsfdf2"
|
(define_expand "extendsfdf2"
|
||||||
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
|
[(set (match_operand:DF 0 "gpc_reg_operand" "=f")
|
||||||
(float_extend:DF (match_operand:SF 1 "gpc_reg_operand" "f")))]
|
(match_operand:SF 1 "gpc_reg_operand" "f"))]
|
||||||
""
|
""
|
||||||
"*
|
"
|
||||||
{
|
{
|
||||||
if (REGNO (operands[0]) == REGNO (operands[1]))
|
if (GET_CODE (operands[1]) == SUBREG)
|
||||||
return \"\";
|
operands[1] = force_reg (SFmode, operands[1]);
|
||||||
else
|
operands[1] = gen_rtx (SUBREG, DFmode, operands[1], 0);
|
||||||
return \"fmr %0,%1\";
|
}")
|
||||||
}"
|
|
||||||
[(set_attr "type" "fp")])
|
(define_split
|
||||||
|
[(set (match_operand:DF 0 "gpc_reg_operand" "")
|
||||||
|
(float_extend:DF (match_operand:SF 1 "gpc_reg_operand" "")))]
|
||||||
|
"GET_CODE (operands[1]) != SUBREG"
|
||||||
|
[(set (match_dup 0) (match_dup 1))]
|
||||||
|
"
|
||||||
|
{
|
||||||
|
operands[1] = gen_rtx (SUBREG, DFmode, operands[1], 0);
|
||||||
|
}")
|
||||||
|
|
||||||
(define_insn "truncdfsf2"
|
(define_insn "truncdfsf2"
|
||||||
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
|
[(set (match_operand:SF 0 "gpc_reg_operand" "=f")
|
||||||
|
Loading…
Reference in New Issue
Block a user