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

commit d45a856584f830d70936911ddc85dc23ee873217
Author: Michael Meissner <[email protected]>
Date:   Thu Oct 23 19:30:45 2025 -0400

    Add conversions between _Float16 and float/double.
    
    2025-10-23  Michael Meissner  <[email protected]>
    
    gcc/
    
            * config/rs6000/float16.md (FP16_HW): New mode iterator.
            (extendhf<mode>2): Add support converting between HFmode and
            SFmode/DFmoded if we are on power9 or later.
            (trunc<mode>hf2): Likewise.
            * config/rs6000/rs6000.h (TARGET_FLOAT16_HW): New macro.
            (FP16_HW_SCALAR_MODE_P): Likewise.

Diff:
---
 gcc/config/rs6000/float16.md | 22 ++++++++++++++++++++++
 gcc/config/rs6000/rs6000.h   |  8 ++++++++
 2 files changed, 30 insertions(+)

diff --git a/gcc/config/rs6000/float16.md b/gcc/config/rs6000/float16.md
index d186d8e7d601..31e2e43134c9 100644
--- a/gcc/config/rs6000/float16.md
+++ b/gcc/config/rs6000/float16.md
@@ -25,6 +25,10 @@
 (define_mode_iterator FP16 [(BF "TARGET_BFLOAT16")
                            (HF "TARGET_FLOAT16")])
 
+;; Mode iterator for 16-bit floating point modes on machines with
+;; hardware support both as a scalar and as a vector.
+(define_mode_iterator FP16_HW [(HF "TARGET_FLOAT16_HW")])
+
 ;; Mode attribute giving the vector mode for a 16-bit floating point
 ;; scalar in both upper and lower case.
 (define_mode_attr FP16_VECTOR8 [(BF "V8BF")
@@ -122,3 +126,21 @@
 }
   [(set_attr "type" "veclogical,vecperm")
    (set_attr "prefixed" "*,yes")])
+
+;; 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_FLOAT16_HW"
+  "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_FLOAT16_HW"
+  "xscvdphp %x0,%x1"
+  [(set_attr "type" "fpsimple")])
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index 0249219bbbc9..eb60573ae4bd 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -343,11 +343,19 @@ extern const char *host_detect_local_cpu (int argc, const 
char **argv);
    || ((MODE) == TDmode)                                               \
    || (!TARGET_FLOAT128_TYPE && FLOAT128_IEEE_P (MODE)))
 
+/* Do we have conversion support in hardware for the 16-bit floating point?  */
+#define TARGET_FLOAT16_HW      (TARGET_FLOAT16 && TARGET_POWER9)
+
 /* Is this a valid 16-bit scalar floating point mode?  */
 #define FP16_SCALAR_MODE_P(MODE)                                       \
   (((MODE) == HFmode && TARGET_FLOAT16)                                        
\
    || ((MODE) == BFmode && TARGET_BFLOAT16))
 
+/* Is this a valid 16-bit scalar floating point mode that has hardware
+   conversions?  */
+#define FP16_HW_SCALAR_MODE_P(MODE)                                    \
+  ((MODE) == HFmode && TARGET_FLOAT16_HW)
+
 /* Is this a valid 16-bit vector floating point mode?  */
 #define FP16_VECTOR_MODE_P(MODE)                                       \
   (((MODE) == V8HFmode && TARGET_FLOAT16)                              \

Reply via email to