Commit d742ff4b by Richard Earnshaw Committed by Richard Earnshaw

re PR target/58361 (Wrong floating point code generated for ARM target)

	PR target/58361
	* arm/vfp.md (combine_vcvt_f32_<FCVTI32typename>): Fix pattern to
	support conditional execution.
	(combine_vcvt_f64_<FCVTI32typename>): Likewise.

From-SVN: r202475
parent 1329f0c4
2013-09-10 Richard Earnshaw <rearnsha@arm.com>
PR target/58361
* arm/vfp.md (combine_vcvt_f32_<FCVTI32typename>): Fix pattern to
support conditional execution.
(combine_vcvt_f64_<FCVTI32typename>): Likewise.
2013-09-10 Vladimir Makarov <vmakarov@redhat.com> 2013-09-10 Vladimir Makarov <vmakarov@redhat.com>
* lra.c (lra): Clear lra_optional_reload_pseudos before every * lra.c (lra): Clear lra_optional_reload_pseudos before every
......
...@@ -1217,19 +1217,20 @@ ...@@ -1217,19 +1217,20 @@
(set_attr "type" "fcmpd")] (set_attr "type" "fcmpd")]
) )
;; Fixed point to floating point conversions. ;; Fixed point to floating point conversions.
(define_code_iterator FCVT [unsigned_float float]) (define_code_iterator FCVT [unsigned_float float])
(define_code_attr FCVTI32typename [(unsigned_float "u32") (float "s32")]) (define_code_attr FCVTI32typename [(unsigned_float "u32") (float "s32")])
(define_insn "*combine_vcvt_f32_<FCVTI32typename>" (define_insn "*combine_vcvt_f32_<FCVTI32typename>"
[(set (match_operand:SF 0 "s_register_operand" "=t") [(set (match_operand:SF 0 "s_register_operand" "=t")
(mult:SF (FCVT:SF (match_operand:SI 1 "s_register_operand" "0")) (mult:SF (FCVT:SF (match_operand:SI 1 "s_register_operand" "0"))
(match_operand 2 (match_operand 2
"const_double_vcvt_power_of_two_reciprocal" "Dt")))] "const_double_vcvt_power_of_two_reciprocal" "Dt")))]
"TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math" "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math"
"vcvt.f32.<FCVTI32typename>\\t%0, %1, %v2" "vcvt%?.f32.<FCVTI32typename>\\t%0, %1, %v2"
[(set_attr "predicable" "no") [(set_attr "predicable" "yes")
(set_attr "type" "f_cvti2f")] (set_attr "predicable_short_it" "no")
(set_attr "type" "f_cvti2f")]
) )
;; Not the ideal way of implementing this. Ideally we would be able to split ;; Not the ideal way of implementing this. Ideally we would be able to split
...@@ -1237,17 +1238,19 @@ ...@@ -1237,17 +1238,19 @@
(define_insn "*combine_vcvt_f64_<FCVTI32typename>" (define_insn "*combine_vcvt_f64_<FCVTI32typename>"
[(set (match_operand:DF 0 "s_register_operand" "=x,x,w") [(set (match_operand:DF 0 "s_register_operand" "=x,x,w")
(mult:DF (FCVT:DF (match_operand:SI 1 "s_register_operand" "r,t,r")) (mult:DF (FCVT:DF (match_operand:SI 1 "s_register_operand" "r,t,r"))
(match_operand 2 (match_operand 2
"const_double_vcvt_power_of_two_reciprocal" "Dt,Dt,Dt")))] "const_double_vcvt_power_of_two_reciprocal" "Dt,Dt,Dt")))]
"TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math
&& !TARGET_VFP_SINGLE" && !TARGET_VFP_SINGLE"
"@ "@
vmov.f32\\t%0, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2
vmov.f32\\t%0, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2 vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2
vmov.f64\\t%P0, %1, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2" vmov%?.f64\\t%P0, %1, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2"
[(set_attr "predicable" "no") [(set_attr "predicable" "yes")
(set_attr "type" "f_cvti2f") (set_attr "ce_count" "2")
(set_attr "length" "8")] (set_attr "predicable_short_it" "no")
(set_attr "type" "f_cvti2f")
(set_attr "length" "8")]
) )
;; Store multiple insn used in function prologue. ;; Store multiple insn used in function prologue.
......
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