[gcc(refs/users/meissner/heads/work228-float)] Add conversions between _Float16 and float/double.
Michael Meissner
meissner@gcc.gnu.org
Fri Nov 14 02:00:47 GMT 2025
https://gcc.gnu.org/g:d8828ac06283080fa010ed6e1b379082984921ad
commit d8828ac06283080fa010ed6e1b379082984921ad
Author: Michael Meissner <meissner@linux.ibm.com>
Date: Thu Nov 13 20:52:15 2025 -0500
Add conversions between _Float16 and float/double.
This patch adds support to generate xscvhpdp and xscvdphp on Power9 systems and
later, to convert between _Float16 and float scalar values.
2025-11-13 Michael Meissner <meissner@linux.ibm.com>
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-c.cc (rs6000_target_modify_macros): Define
__FLOAT16_HW__ if we have hardware support for _Float16.
* config/rs6000/rs6000.cc (rs6000_init_hard_regno_mode_ok): Mark that we
use VSX arithmetic support for V8HFmode if we are a power9 or later.
Diff:
---
gcc/config/rs6000/float16.md | 22 ++++++++++++++++++++++
gcc/config/rs6000/rs6000-c.cc | 3 +++
gcc/config/rs6000/rs6000.cc | 3 +++
3 files changed, 28 insertions(+)
diff --git a/gcc/config/rs6000/float16.md b/gcc/config/rs6000/float16.md
index 1e6339754b2d..579703517d56 100644
--- a/gcc/config/rs6000/float16.md
+++ b/gcc/config/rs6000/float16.md
@@ -26,6 +26,10 @@
(define_mode_iterator VS_FP16 [BF HF V8BF V8HF])
(define_mode_iterator VFP16 [V8BF V8HF])
+;; 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")
@@ -157,3 +161,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-c.cc b/gcc/config/rs6000/rs6000-c.cc
index 70e6c6ebdc93..31a166a1c0ff 100644
--- a/gcc/config/rs6000/rs6000-c.cc
+++ b/gcc/config/rs6000/rs6000-c.cc
@@ -588,6 +588,9 @@ rs6000_target_modify_macros (bool define_p, HOST_WIDE_INT flags)
{
rs6000_define_or_undefine_macro (define_p, "__FLOAT16__");
rs6000_define_or_undefine_macro (define_p, "__BFLOAT16__");
+
+ if ((flags & OPTION_MASK_P9_VECTOR) != 0)
+ rs6000_define_or_undefine_macro (define_p, "__FLOAT16_HW__");
}
/* Tell the user if we are targeting CELL. */
if (rs6000_cpu == PROCESSOR_CELL)
diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc
index 4c0797f0a0c2..dee4f9b188dd 100644
--- a/gcc/config/rs6000/rs6000.cc
+++ b/gcc/config/rs6000/rs6000.cc
@@ -3009,6 +3009,9 @@ rs6000_init_hard_regno_mode_ok (bool global_init_p)
rs6000_vector_mem[BFmode] = VECTOR_VSX;
rs6000_vector_align[HFmode] = 16;
rs6000_vector_align[BFmode] = 16;
+
+ if (TARGET_P9_VECTOR)
+ rs6000_vector_unit[V8HFmode] = VECTOR_VSX;
}
/* DFmode, see if we want to use the VSX unit. Memory is handled
More information about the Gcc-cvs
mailing list