[3/5] Support IEEE 128-bit overload comparison built-in functions.

Message ID YuIVo7MN5hmUzlOr@toto.the-meissners.org
State New
Headers
Series IEEE 128-bit built-in overload support. |

Commit Message

Michael Meissner July 28, 2022, 4:50 a.m. UTC
  PATCH 3/5] Support IEEE 128-bit overload comparison built-in functions.

This patch adds support for overloading the IEEE 128-bit comparison
built-in functions bewteeen KFmode and TFmode arguments.

I have tested these patches on a power10 that is running Fedora 36, which
defaults to using long doubles that are IEEE 128-bit.  I have built two
parallel GCC compilers, one that defaults to using IEEE 128-bit long doubles
and one that defaults to using IBM 128-bit long doubles.

I have compared the test results to the original compiler results, comparing a
modified GCC to the original compiler using an IEEE 128-bit long double
default, and also comparing a modified GCC to the original compiler using an
IBM 128-bit long double default.  In both cases, the results are the same.

I have also compared the compilers with the future patch in progress that does
switch the internal type handling.  Once those patches are installed, the
overload mechanism will insure the correct built-in is used.

Can I install this patch to the trunk, assuming I have installed the first two
patches in the series?

2022-07-27   Michael Meissner  <meissner@linux.ibm.com>

gcc/

	* config/rs6000/rs6000-builtins.def
	(__builtin_vsx_scalar_cmp_exp_qp_eq_kf): Rename KFmode comparison
	built-in functions to have a KF suffix to allow overloading.
	(__builtin_vsx_scalar_cmp_exp_qp_gt_kf): Likewise.
	(__builtin_vsx_scalar_cmp_exp_qp_lt_kf): Likewise.
	(__builtin_vsx_scalar_cmp_exp_qp_unordered_kf): Likewise.
	(__builtin_vsx_scalar_cmp_exp_qp_eq_tf): Add TFmode comparison
	built-in functions.
	(__builtin_vsx_scalar_cmp_exp_qp_gt_tf): Likewise.
	(__builtin_vsx_scalar_cmp_exp_qp_lt_tf): Likewise.
	(__builtin_vsx_scalar_cmp_exp_qp_unordered_tf): Likewise.
	* config/rs6000/rs6000-overload.def
	(__builtin_vec_scalar_cmp_exp_eq): Add TFmode overloaded
	functions.
	(__builtin_vec_scalar_cmp_exp_gt): Likewise.
	(__builtin_vec_scalar_cmp_exp_lt): Likewise.
	(__builtin_vec_scalar_cmp_exp_unordered): Likewise.
---
 gcc/config/rs6000/rs6000-builtins.def | 32 ++++++++++++++++++++-------
 gcc/config/rs6000/rs6000-overload.def | 16 ++++++++++----
 2 files changed, 36 insertions(+), 12 deletions(-)
  

Patch

diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def
index d72ff8cb7fe..23fc4a5f108 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -2880,18 +2880,18 @@ 
   fpmath _Float128 __builtin_mulf128_round_to_odd_kf (_Float128, _Float128);
     MULF128_ODD_KF mulkf3_odd {}
 
-  const signed int __builtin_vsx_scalar_cmp_exp_qp_eq (_Float128, _Float128);
-    VSCEQPEQ xscmpexpqp_eq_kf {}
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_eq_kf (_Float128, _Float128);
+    VSCEQPEQ_KF xscmpexpqp_eq_kf {}
 
-  const signed int __builtin_vsx_scalar_cmp_exp_qp_gt (_Float128, _Float128);
-    VSCEQPGT xscmpexpqp_gt_kf {}
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_gt_kf (_Float128, _Float128);
+    VSCEQPGT_KF xscmpexpqp_gt_kf {}
 
-  const signed int __builtin_vsx_scalar_cmp_exp_qp_lt (_Float128, _Float128);
-    VSCEQPLT xscmpexpqp_lt_kf {}
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_lt_kf (_Float128, _Float128);
+    VSCEQPLT_KF xscmpexpqp_lt_kf {}
 
   const signed int \
-      __builtin_vsx_scalar_cmp_exp_qp_unordered (_Float128, _Float128);
-    VSCEQPUO xscmpexpqp_unordered_kf {}
+      __builtin_vsx_scalar_cmp_exp_qp_unordered_kf (_Float128, _Float128);
+    VSCEQPUO_KF xscmpexpqp_unordered_kf {}
 
   fpmath _Float128 __builtin_sqrtf128_round_to_odd_kf (_Float128);
     SQRTF128_ODD_KF sqrtkf2_odd {}
@@ -2942,6 +2942,22 @@ 
 							long double);
     MULF128_ODD_TF multf3_odd {ieeeld}
 
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_eq_tf (long double, \
+							  long double);
+    VSCEQPEQ_TF xscmpexpqp_eq_tf {ieeeld}
+
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_gt_tf (long double, \
+							  long double);
+    VSCEQPGT_TF xscmpexpqp_gt_kf {ieeeld}
+
+  const signed int __builtin_vsx_scalar_cmp_exp_qp_lt_tf (long double, \
+							  long double);
+    VSCEQPLT_TF xscmpexpqp_lt_tf {ieeeld}
+
+  const signed int \
+      __builtin_vsx_scalar_cmp_exp_qp_unordered_tf (long double, long double);
+    VSCEQPUO_TF xscmpexpqp_unordered_tf {ieeeld}
+
   fpmath long double __builtin_sqrtf128_round_to_odd_tf (long double);
     SQRTF128_ODD_TF sqrttf2_odd {ieeeld}
 
diff --git a/gcc/config/rs6000/rs6000-overload.def b/gcc/config/rs6000/rs6000-overload.def
index f406a16a882..511a3821d5b 100644
--- a/gcc/config/rs6000/rs6000-overload.def
+++ b/gcc/config/rs6000/rs6000-overload.def
@@ -4474,25 +4474,33 @@ 
   signed int __builtin_vec_scalar_cmp_exp_eq (double, double);
     VSCEDPEQ
   signed int __builtin_vec_scalar_cmp_exp_eq (_Float128, _Float128);
-    VSCEQPEQ
+    VSCEQPEQ_KF
+  signed int __builtin_vec_scalar_cmp_exp_eq (long double, long double);
+    VSCEQPEQ_TF
 
 [VEC_VSCEGT, scalar_cmp_exp_gt, __builtin_vec_scalar_cmp_exp_gt]
   signed int __builtin_vec_scalar_cmp_exp_gt (double, double);
     VSCEDPGT
   signed int __builtin_vec_scalar_cmp_exp_gt (_Float128, _Float128);
-    VSCEQPGT
+    VSCEQPGT_KF
+  signed int __builtin_vec_scalar_cmp_exp_gt (long double, long double);
+    VSCEQPGT_TF
 
 [VEC_VSCELT, scalar_cmp_exp_lt, __builtin_vec_scalar_cmp_exp_lt]
   signed int __builtin_vec_scalar_cmp_exp_lt (double, double);
     VSCEDPLT
   signed int __builtin_vec_scalar_cmp_exp_lt (_Float128, _Float128);
-    VSCEQPLT
+    VSCEQPLT_KF
+  signed int __builtin_vec_scalar_cmp_exp_lt (long double, long double);
+    VSCEQPLT_TF
 
 [VEC_VSCEUO, scalar_cmp_exp_unordered, __builtin_vec_scalar_cmp_exp_unordered]
   signed int __builtin_vec_scalar_cmp_exp_unordered (double, double);
     VSCEDPUO
   signed int __builtin_vec_scalar_cmp_exp_unordered (_Float128, _Float128);
-    VSCEQPUO
+    VSCEQPUO_KF
+  signed int __builtin_vec_scalar_cmp_exp_unordered (long double, long double);
+    VSCEQPUO_TF
 
 [VEC_VSEE, scalar_extract_exp, __builtin_vec_scalar_extract_exp]
   unsigned int __builtin_vec_scalar_extract_exp (double);