https://gcc.gnu.org/g:25949bd183e0157fe3547cb4f7f00f2889a7d749

commit 25949bd183e0157fe3547cb4f7f00f2889a7d749
Author: Michael Meissner <[email protected]>
Date:   Wed Oct 22 22:00:13 2025 -0400

    Add scalar _Float16 converts.
    
    2025-10-22  Michael Meissner  <[email protected]>
    
    gcc/
    
            * config/rs6000/float16.md (FP16_HW): New mode iterator.
            (VFP16_HW): Likewise.
            (fp16_float_convert): Likewise.
            (extendhf<mode>2): Add support converting between HFmode and other
            floating point scalars if we are on power9 or later.
            (trunc<mode>hf2): Likewise.
            (extend<FP16_HW:mode><fp16_float_convert:mode>): Likewise.
            (trunc<fp16_float_convert:mode><FP16_HW:mode>2): Likewise.
            (float<GPR:mode><FP16_HW:mode>2): Add support converting between 
HFmode
            to and from integers.
            (floatuns<GPR:mode><FP16_HW:mode>2): Likewise.
            (fix_trunc<FP16_HW:mode><GPR:mode>2): Likewise.
            (fixuns_trunc<FP16_HW:mode><GPR:mode>2): Likewise.

Diff:
---
 gcc/config/rs6000/float16.md | 21 ++++++++++++++++++---
 gcc/config/rs6000/rs6000.h   |  8 ++++++++
 2 files changed, 26 insertions(+), 3 deletions(-)

diff --git a/gcc/config/rs6000/float16.md b/gcc/config/rs6000/float16.md
index a8161028c6fe..7a59f250f777 100644
--- a/gcc/config/rs6000/float16.md
+++ b/gcc/config/rs6000/float16.md
@@ -25,9 +25,6 @@
 (define_mode_iterator FP16 [(BF "TARGET_BFLOAT16")
                            (HF "TARGET_FLOAT16")])
 
-(define_mode_iterator VFP16 [(V8BF "TARGET_BFLOAT16")
-                            (V8HF "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")
@@ -125,3 +122,21 @@
 }
   [(set_attr "type" "veclogical,vecperm")
    (set_attr "prefixed" "*,yes")])
+
+;; Convert IEEE 16-bit floating point to/from SFmode and DFmode.
+
+(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