[gcc(refs/users/meissner/heads/work221-float)] Update conversions between _Float16 and various floating point types.

Michael Meissner meissner@gcc.gnu.org
Tue Sep 9 03:30:25 GMT 2025


https://gcc.gnu.org/g:fde5b8c4c9fb16fb9aab1c9aff6e2beab61e24a3

commit fde5b8c4c9fb16fb9aab1c9aff6e2beab61e24a3
Author: Michael Meissner <meissner@linux.ibm.com>
Date:   Mon Sep 8 23:30:04 2025 -0400

    Update conversions between _Float16 and various floating point types.
    
    2025-09-08  Michael Meissner  <meissner@linux.ibm.com>
    
    gcc/
    
            * config/rs6000/rs6000.md (HF_CONVERT): New mode iterator.
            (extendhf<mode>2): Move from vsx.md, add conversion to/from decimal
            types.
            (trunc<mode>2): Likewise.
            * config/rs6000/vsx.md (extendhf<mode>2): Move to vsx.md.
            (trunc<mode>hf2): Likewise.

Diff:
---
 gcc/config/rs6000/rs6000.md | 49 +++++++++++++++++++++++++++++++++++++
 gcc/config/rs6000/vsx.md    | 59 ---------------------------------------------
 2 files changed, 49 insertions(+), 59 deletions(-)

diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
index 7ba2088884d5..a81758e62a02 100644
--- a/gcc/config/rs6000/rs6000.md
+++ b/gcc/config/rs6000/rs6000.md
@@ -858,6 +858,10 @@
 				     (SF "TARGET_P8_VECTOR")
 				     (DI "TARGET_POWERPC64")])
 
+;; Mode iterator for floating point modes other than SF/DFmode that we
+;; convert to/from _Float16 (HFmode) via DFmode.
+(define_mode_iterator HF_CONVERT [TF KF IF SD DD TD])
+
 (include "darwin.md")
 
 ;; Start with fixed-point load and store insns.  Here we put only the more
@@ -5850,6 +5854,51 @@
   "xxsel %x0,%x4,%x3,%x1"
   [(set_attr "type" "vecmove")])
 
+
+;; Convert IEEE 16-bit floating point to/from other floating point modes.
+
+(define_insn "extendhf<mode>2"
+  [(set (match_operand:SFDF 0 "vsx_register_operand" "=wa")
+	(float_extend:SFDF
+	 (match_operand:HF 1 "vsx_register_operand" "wa")))]
+  "TARGET_IEEE16"
+  "xscvhpdp %x0,%x1"
+  [(set_attr "type" "fpsimple")])
+
+(define_insn "trunc<mode>hf2"
+  [(set (match_operand:HF 0 "vsx_register_operand" "=wa")
+	(float_truncate:HF
+	 (match_operand:SFDF 1 "vsx_register_operand" "wa")))]
+  "TARGET_IEEE16"
+  "xscvdphp %x0,%1"
+  [(set_attr "type" "fpsimple")])
+
+;; Use DFmode to convert to/from HFmode for floating point types other
+;; than SF/DFmode.
+(define_expand "extendhf<mode>2"
+  [(set (match_operand:HF_CONVERT 0 "vsx_register_operand" "=wa")
+	(float_extend:HF_CONVERT
+	 (match_operand:HF 1 "vsx_register_operand" "wa")))]
+  "TARGET_IEEE16"
+{
+  rtx df_tmp = gen_reg_rtx (DFmode);
+  convert_move (df_tmp, operands[1], 0);
+  convert_move (operands[0], df_tmp, 0);
+  DONE;
+})
+
+(define_expand "trunc<mode>hf2"
+  [(set (match_operand:HF 0 "vsx_register_operand" "=wa")
+	(float_truncate:HF
+	 (match_operand:HF_CONVERT 1 "vsx_register_operand" "wa")))]
+  "TARGET_IEEE16"
+{
+  rtx df_tmp = gen_reg_rtx (DFmode);
+  convert_move (df_tmp, operands[1], 0);
+  convert_move (operands[0], df_tmp, 0);
+  DONE;
+})
+
 
 ;; Conversions to and from floating-point.
 
diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md
index 3e429bdb1765..09b4d53813ba 100644
--- a/gcc/config/rs6000/vsx.md
+++ b/gcc/config/rs6000/vsx.md
@@ -3155,65 +3155,6 @@
   "xvrdpiz %x0,%x1"
   [(set_attr "type" "vecdouble")])
 
-
-;; Convert IEEE 16-bit floating point to/from binary floating point modes.
-
-(define_insn "extendhf<mode>2"
-  [(set (match_operand:SFDF 0 "vsx_register_operand" "=wa")
-	(float_extend:SFDF
-	 (match_operand:HF 1 "vsx_register_operand" "wa")))]
-  "TARGET_IEEE16"
-  "xscvhpdp %x0,%x1"
-  [(set_attr "type" "fpsimple")])
-
-(define_insn_and_split "extendhf<mode>2"
-  [(set (match_operand:FLOAT128 0 "vsx_register_operand" "=wa")
-	(float_extend:FLOAT128
-	 (match_operand:HF 1 "vsx_register_operand" "wa")))
-   (clobber (match_scratch:DF 2 "=wa"))]
-  "TARGET_IEEE16
-   && (FLOAT128_IBM_P (<MODE>mode) || FLOAT128_IEEE_P (<MODE>mode))"
-  "#"
-  "&& 1"
-  [(set (match_dup 2)
-	(float_extend:DF (match_dup 1)))
-   (set (match_dup 0)
-	(float_extend:FLOAT128 (match_dup 2)))]
-{
-  if (GET_CODE (operands[2]) == SCRATCH)
-    operands[2] = gen_reg_rtx (DFmode);
-}
-  [(set_attr "type" "fpsimple")
-   (set_attr "length" "8")])
-
-(define_insn "trunc<mode>hf2"
-  [(set (match_operand:HF 0 "vsx_register_operand" "=wa")
-	(float_truncate:HF
-	 (match_operand:SFDF 1 "vsx_register_operand" "wa")))]
-  "TARGET_IEEE16"
-  "xscvdphp %x0,%1"
-  [(set_attr "type" "fpsimple")])
-
-(define_insn_and_split "trunc<mode>hf2"
-  [(set (match_operand:HF 0 "vsx_register_operand" "=wa")
-	(float_truncate:HF
-	 (match_operand:FLOAT128 1 "vsx_register_operand" "wa")))
-   (clobber (match_scratch:DF 2 "=wa"))]
-  "TARGET_IEEE16
-   && (FLOAT128_IBM_P (<MODE>mode) || FLOAT128_IEEE_P (<MODE>mode))"
-  "#"
-  "&& 1"
-  [(set (match_dup 2)
-	(float_truncate:DF (match_dup 1)))
-   (set (match_dup 0)
-	(float_truncate:HF (match_dup 2)))]
-{
-  if (GET_CODE (operands[2]) == SCRATCH)
-    operands[2] = gen_reg_rtx (DFmode);
-}
-  [(set_attr "type" "fpsimple")
-   (set_attr "length" "8")])
-
 
 ;; Permute operations


More information about the Gcc-cvs mailing list