This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH, committed] PowerPC long double trunctfdf2 cleanup (PR target/19019)


	Because GCC AIX-style 128 bit long double ensures that the most
significant doubleword is properly rounded, trunctfdf2 can use the
doubleword without addition.  This also preserves -0.0.

David


	PR target/19019
	* config/rs6000/rs6000.md (truntfdf2): Change to define_expand.
	(trunctfdf2_internal1): New.
	(trunctfdf2_internal2): Renamed from trunctfdf2.

Index: rs6000.md
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.md,v
retrieving revision 1.347
diff -c -p -r1.347 rs6000.md
*** rs6000.md	13 Feb 2005 21:31:30 -0000	1.347
--- rs6000.md	14 Feb 2005 20:07:11 -0000
***************
*** 8325,8338 ****
    DONE;
  })
  
! (define_insn "trunctfdf2"
    [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
  	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))]
    "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
     && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
    "fadd %0,%1,%L1"
!   [(set_attr "type" "fp")
!    (set_attr "length" "4")])
  
  (define_insn_and_split "trunctfsf2"
    [(set (match_operand:SF 0 "gpc_reg_operand" "=f")
--- 8325,8360 ----
    DONE;
  })
  
! (define_expand "trunctfdf2"
    [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
  	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))]
    "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN)
     && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+ "")
+ 
+ (define_insn_and_split "trunctfdf2_internal1"
+   [(set (match_operand:DF 0 "gpc_reg_operand" "=f,?f")
+ 	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "0,f")))]
+   "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && !TARGET_XL_COMPAT
+    && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
+   "@
+    #
+    fmr %0,%1"
+   "&& reload_completed && REGNO (operands[0]) == REGNO (operands[1])"
+   [(const_int 0)]
+ {
+   emit_note (NOTE_INSN_DELETED);
+   DONE;
+ }
+   [(set_attr "type" "fp")])
+ 
+ (define_insn "trunctfdf2_internal2"
+   [(set (match_operand:DF 0 "gpc_reg_operand" "=f")
+ 	(float_truncate:DF (match_operand:TF 1 "gpc_reg_operand" "f")))]
+   "(DEFAULT_ABI == ABI_AIX || DEFAULT_ABI == ABI_DARWIN) && TARGET_XL_COMPAT
+    && TARGET_HARD_FLOAT && TARGET_FPRS && TARGET_LONG_DOUBLE_128"
    "fadd %0,%1,%L1"
!   [(set_attr "type" "fp")])
  
  (define_insn_and_split "trunctfsf2"
    [(set (match_operand:SF 0 "gpc_reg_operand" "=f")


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]