Commit 994cf173 by Alan Modra

re PR rtl-optimization/16356 (Failure to use count register (branch on count register))

	PR rtl-optimization/16356
	* config/rs6000/rs6000.md (floatdisf2_internal2): Rewrite with
	separate output register and one less jump.  Enable for powerpc64.
	(floatdisf2): Adjust for above.

From-SVN: r91324
parent 9dad6498
No preview for this file type
...@@ -5402,16 +5402,18 @@ ...@@ -5402,16 +5402,18 @@
(define_expand "floatdisf2" (define_expand "floatdisf2"
[(set (match_operand:SF 0 "gpc_reg_operand" "") [(set (match_operand:SF 0 "gpc_reg_operand" "")
(float:SF (match_operand:DI 1 "gpc_reg_operand" "")))] (float:SF (match_operand:DI 1 "gpc_reg_operand" "")))]
"TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_FPRS" "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
" "
{ {
rtx val = operands[1];
if (!flag_unsafe_math_optimizations) if (!flag_unsafe_math_optimizations)
{ {
rtx label = gen_label_rtx (); rtx label = gen_label_rtx ();
emit_insn (gen_floatdisf2_internal2 (operands[1], label)); val = gen_reg_rtx (DImode);
emit_insn (gen_floatdisf2_internal2 (val, operands[1], label));
emit_label (label); emit_label (label);
} }
emit_insn (gen_floatdisf2_internal1 (operands[0], operands[1])); emit_insn (gen_floatdisf2_internal1 (operands[0], val));
DONE; DONE;
}") }")
...@@ -5436,30 +5438,31 @@ ...@@ -5436,30 +5438,31 @@
;; by a bit that won't be lost at that stage, but is below the SFmode ;; by a bit that won't be lost at that stage, but is below the SFmode
;; rounding position. ;; rounding position.
(define_expand "floatdisf2_internal2" (define_expand "floatdisf2_internal2"
[(parallel [(set (match_dup 4) [(set (match_dup 3) (ashiftrt:DI (match_operand:DI 1 "" "")
(compare:CC (and:DI (match_operand:DI 0 "" "") (const_int 53)))
(const_int 2047)) (parallel [(set (match_operand:DI 0 "" "") (and:DI (match_dup 1)
(const_int 0))) (const_int 2047)))
(set (match_dup 2) (and:DI (match_dup 0) (const_int 2047))) (clobber (scratch:CC))])
(clobber (match_scratch:CC 7 ""))]) (set (match_dup 3) (plus:DI (match_dup 3)
(set (match_dup 3) (ashiftrt:DI (match_dup 0) (const_int 53))) (const_int 1)))
(set (match_dup 3) (plus:DI (match_dup 3) (const_int 1))) (set (match_dup 0) (plus:DI (match_dup 0)
(set (pc) (if_then_else (eq (match_dup 4) (const_int 0)) (const_int 2047)))
(label_ref (match_operand:DI 1 "" "")) (set (match_dup 4) (compare:CCUNS (match_dup 3)
(pc))) (const_int 3)))
(set (match_dup 5) (compare:CCUNS (match_dup 3) (const_int 2))) (set (match_dup 0) (ior:DI (match_dup 0)
(set (pc) (if_then_else (ltu (match_dup 5) (const_int 0)) (match_dup 1)))
(label_ref (match_dup 1)) (parallel [(set (match_dup 0) (and:DI (match_dup 0)
(const_int -2048)))
(clobber (scratch:CC))])
(set (pc) (if_then_else (geu (match_dup 4) (const_int 0))
(label_ref (match_operand:DI 2 "" ""))
(pc))) (pc)))
(set (match_dup 0) (xor:DI (match_dup 0) (match_dup 2))) (set (match_dup 0) (match_dup 1))]
(set (match_dup 0) (ior:DI (match_dup 0) (const_int 2048)))] "TARGET_POWERPC64 && TARGET_HARD_FLOAT && TARGET_FPRS"
"TARGET_64BIT && TARGET_HARD_FLOAT && TARGET_FPRS"
" "
{ {
operands[2] = gen_reg_rtx (DImode);
operands[3] = gen_reg_rtx (DImode); operands[3] = gen_reg_rtx (DImode);
operands[4] = gen_reg_rtx (CCmode); operands[4] = gen_reg_rtx (CCUNSmode);
operands[5] = gen_reg_rtx (CCUNSmode);
}") }")
;; Define the DImode operations that can be done in a small number ;; Define the DImode operations that can be done in a small number
......
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