Commit 1573b933 by Jakub Jelinek Committed by Jakub Jelinek

sparc.md (movtf_insn_sp32, [...]): Accept loading 0.0 into GENERAL_REGS.

	* config/sparc/sparc.md (movtf_insn_sp32, movtf_insn_vis_sp32,
	movtf_no_e_insn_sp32, movtf_insn_hq_sp64, movtf_insn_hq_vis_sp64,
	movtf_no_e_insn_sp64): Accept loading 0.0 into GENERAL_REGS.
	(movtf_insn_sp64, movtf_insn_vis_sp64): Likewise.
	Accept storing GENERAL_REGS into offsetable memory.
	* config/sparc/sparc.h (PREFERRED_RELOAD_CLASS): Don't allow
	building a TFmode constant other than 0.0L into GENERAL_REGS.

From-SVN: r32972
parent 0ea6d60c
2000-04-06 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.md (movtf_insn_sp32, movtf_insn_vis_sp32,
movtf_no_e_insn_sp32, movtf_insn_hq_sp64, movtf_insn_hq_vis_sp64,
movtf_no_e_insn_sp64): Accept loading 0.0 into GENERAL_REGS.
(movtf_insn_sp64, movtf_insn_vis_sp64): Likewise.
Accept storing GENERAL_REGS into offsetable memory.
* config/sparc/sparc.h (PREFERRED_RELOAD_CLASS): Don't allow
building a TFmode constant other than 0.0L into GENERAL_REGS.
2000-04-06 Clinton Popetz <cpopetz@cygnus.com> 2000-04-06 Clinton Popetz <cpopetz@cygnus.com>
* regrename.c (regrename_optimize): Handle no REG_ALLOC_ORDER. * regrename.c (regrename_optimize): Handle no REG_ALLOC_ORDER.
......
...@@ -1454,6 +1454,8 @@ extern char leaf_reg_remap[]; ...@@ -1454,6 +1454,8 @@ extern char leaf_reg_remap[];
/* - We can't load constants into FP registers. /* - We can't load constants into FP registers.
- We can't load FP constants into integer registers when soft-float, - We can't load FP constants into integer registers when soft-float,
because there is no soft-float pattern with a r/F constraint. because there is no soft-float pattern with a r/F constraint.
- We can't load FP constants into integer registers for TFmode unless
it is 0.0L, because there is no movtf pattern with a r/F constraint.
- Try and reload integer constants (symbolic or otherwise) back into - Try and reload integer constants (symbolic or otherwise) back into
registers directly, rather than having them dumped to memory. */ registers directly, rather than having them dumped to memory. */
...@@ -1461,7 +1463,9 @@ extern char leaf_reg_remap[]; ...@@ -1461,7 +1463,9 @@ extern char leaf_reg_remap[];
(CONSTANT_P (X) \ (CONSTANT_P (X) \
? ((FP_REG_CLASS_P (CLASS) \ ? ((FP_REG_CLASS_P (CLASS) \
|| (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \ || (GET_MODE_CLASS (GET_MODE (X)) == MODE_FLOAT \
&& ! TARGET_FPU)) \ && ! TARGET_FPU) \
|| (GET_MODE (X) == TFmode \
&& ! fp_zero_operand (X, TFmode))) \
? NO_REGS \ ? NO_REGS \
: (!FP_REG_CLASS_P (CLASS) \ : (!FP_REG_CLASS_P (CLASS) \
&& GET_MODE_CLASS (GET_MODE (X)) == MODE_INT) \ && GET_MODE_CLASS (GET_MODE (X)) == MODE_INT) \
......
...@@ -3705,8 +3705,8 @@ ...@@ -3705,8 +3705,8 @@
;; Be careful, fmovq and {st,ld}{x,q} do not exist when !arch64 so ;; Be careful, fmovq and {st,ld}{x,q} do not exist when !arch64 so
;; we must split them all. :-( ;; we must split them all. :-(
(define_insn "*movtf_insn_sp32" (define_insn "*movtf_insn_sp32"
[(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,U,o,r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,U,r")
(match_operand:TF 1 "input_operand" "oe,Ge,o,U,ro,r"))] (match_operand:TF 1 "input_operand" "oe,GeUr,o,roG"))]
"TARGET_FPU "TARGET_FPU
&& ! TARGET_VIS && ! TARGET_VIS
&& ! TARGET_ARCH64 && ! TARGET_ARCH64
...@@ -3717,8 +3717,8 @@ ...@@ -3717,8 +3717,8 @@
[(set_attr "length" "4")]) [(set_attr "length" "4")])
(define_insn "*movtf_insn_vis_sp32" (define_insn "*movtf_insn_vis_sp32"
[(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,U,o,r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,U,r")
(match_operand:TF 1 "input_operand" "Goe,Ge,o,U,ro,r"))] (match_operand:TF 1 "input_operand" "Goe,GeUr,o,roG"))]
"TARGET_FPU "TARGET_FPU
&& TARGET_VIS && TARGET_VIS
&& ! TARGET_ARCH64 && ! TARGET_ARCH64
...@@ -3734,7 +3734,7 @@ ...@@ -3734,7 +3734,7 @@
(define_insn "*movtf_no_e_insn_sp32" (define_insn "*movtf_no_e_insn_sp32"
[(set (match_operand:TF 0 "nonimmediate_operand" "=o,U,o,r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=o,U,o,r,o")
(match_operand:TF 1 "input_operand" "G,o,U,ro,r"))] (match_operand:TF 1 "input_operand" "G,o,U,roG,r"))]
"! TARGET_FPU "! TARGET_FPU
&& ! TARGET_ARCH64 && ! TARGET_ARCH64
&& (register_operand (operands[0], TFmode) && (register_operand (operands[0], TFmode)
...@@ -3746,8 +3746,8 @@ ...@@ -3746,8 +3746,8 @@
;; Now handle the float reg cases directly when arch64, ;; Now handle the float reg cases directly when arch64,
;; hard_quad, and proper reg number alignment are all true. ;; hard_quad, and proper reg number alignment are all true.
(define_insn "*movtf_insn_hq_sp64" (define_insn "*movtf_insn_hq_sp64"
[(set (match_operand:TF 0 "nonimmediate_operand" "=e,e,m,o,r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,e,m,o,r")
(match_operand:TF 1 "input_operand" "e,m,e,G,ro,r"))] (match_operand:TF 1 "input_operand" "e,m,e,Gr,roG"))]
"TARGET_FPU "TARGET_FPU
&& ! TARGET_VIS && ! TARGET_VIS
&& TARGET_ARCH64 && TARGET_ARCH64
...@@ -3760,14 +3760,13 @@ ...@@ -3760,14 +3760,13 @@
ldq\\t%1, %0 ldq\\t%1, %0
stq\\t%1, %0 stq\\t%1, %0
# #
#
#" #"
[(set_attr "type" "fpmove,fpload,fpstore,*,*,*") [(set_attr "type" "fpmove,fpload,fpstore,*,*")
(set_attr "length" "1,1,1,2,2,2")]) (set_attr "length" "1,1,1,2,2")])
(define_insn "*movtf_insn_hq_vis_sp64" (define_insn "*movtf_insn_hq_vis_sp64"
[(set (match_operand:TF 0 "nonimmediate_operand" "=e,e,m,eo,r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,e,m,eo,r,o")
(match_operand:TF 1 "input_operand" "e,m,e,G,ro,r"))] (match_operand:TF 1 "input_operand" "e,m,e,G,roG,r"))]
"TARGET_FPU "TARGET_FPU
&& TARGET_VIS && TARGET_VIS
&& TARGET_ARCH64 && TARGET_ARCH64
...@@ -3788,8 +3787,8 @@ ...@@ -3788,8 +3787,8 @@
;; Now we allow the integer register cases even when ;; Now we allow the integer register cases even when
;; only arch64 is true. ;; only arch64 is true.
(define_insn "*movtf_insn_sp64" (define_insn "*movtf_insn_sp64"
[(set (match_operand:TF 0 "nonimmediate_operand" "=o,e,r") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,r")
(match_operand:TF 1 "input_operand" "Ge,oe,or"))] (match_operand:TF 1 "input_operand" "oe,Ger,orG"))]
"TARGET_FPU "TARGET_FPU
&& ! TARGET_VIS && ! TARGET_VIS
&& TARGET_ARCH64 && TARGET_ARCH64
...@@ -3801,8 +3800,8 @@ ...@@ -3801,8 +3800,8 @@
[(set_attr "length" "2")]) [(set_attr "length" "2")])
(define_insn "*movtf_insn_vis_sp64" (define_insn "*movtf_insn_vis_sp64"
[(set (match_operand:TF 0 "nonimmediate_operand" "=eo,e,r") [(set (match_operand:TF 0 "nonimmediate_operand" "=e,o,r")
(match_operand:TF 1 "input_operand" "Ge,o,or"))] (match_operand:TF 1 "input_operand" "Goe,Ger,orG"))]
"TARGET_FPU "TARGET_FPU
&& TARGET_VIS && TARGET_VIS
&& TARGET_ARCH64 && TARGET_ARCH64
...@@ -3815,7 +3814,7 @@ ...@@ -3815,7 +3814,7 @@
(define_insn "*movtf_no_e_insn_sp64" (define_insn "*movtf_no_e_insn_sp64"
[(set (match_operand:TF 0 "nonimmediate_operand" "=r,o") [(set (match_operand:TF 0 "nonimmediate_operand" "=r,o")
(match_operand:TF 1 "input_operand" "or,rG"))] (match_operand:TF 1 "input_operand" "orG,rG"))]
"! TARGET_FPU "! TARGET_FPU
&& TARGET_ARCH64 && TARGET_ARCH64
&& (register_operand (operands[0], TFmode) && (register_operand (operands[0], TFmode)
......
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