From: Stefan Schulze Frielinghaus <stefa...@linux.ibm.com>

gcc/ChangeLog:

        * config/s390/s390-builtins.def (B_VXE3): Define.
        (B_ARCH15): Define.
        * config/s390/s390-c.cc (s390_resolve_overloaded_builtin):
        Consistency checks for VXE3.
        * config/s390/s390.cc (s390_expand_builtin): Consistency checks
        for VXE3.

gcc/testsuite/ChangeLog:

        * lib/target-supports.exp: VXE3 effective target check.
---
 gcc/config/s390/s390-builtins.def     |  2 ++
 gcc/config/s390/s390-c.cc             | 14 ++++++++++++++
 gcc/config/s390/s390.cc               |  6 ++++++
 gcc/testsuite/lib/target-supports.exp | 16 ++++++++++++++++
 4 files changed, 38 insertions(+)

diff --git a/gcc/config/s390/s390-builtins.def 
b/gcc/config/s390/s390-builtins.def
index 8186fad19f7..1700016fe4c 100644
--- a/gcc/config/s390/s390-builtins.def
+++ b/gcc/config/s390/s390-builtins.def
@@ -300,6 +300,8 @@
 #define B_VXE2  (1 << 4)  /* Builtins requiring the z15 vector extensions.  */
 #define B_DEP   (1 << 5)  /* Builtin has been deprecated and a warning should 
be issued.  */
 #define B_NNPA  (1 << 6)  /* Builtins requiring the NNPA Facility.  */
+#define B_VXE3  (1 << 7)  /* Builtins requiring the arch15 vector extensions.  
*/
+#define B_ARCH15 (1 << 8) /* Builtins requiring arch15.  */
 
 /* B_DEF defines a standard (not overloaded) builtin
    B_DEF (<builtin name>, <RTL expander name>, <function attributes>, <builtin 
flags>, <operand flags, see above>, <fntype>)
diff --git a/gcc/config/s390/s390-c.cc b/gcc/config/s390/s390-c.cc
index 27e18f0b475..bda60ef8670 100644
--- a/gcc/config/s390/s390-c.cc
+++ b/gcc/config/s390/s390-c.cc
@@ -958,6 +958,12 @@ s390_resolve_overloaded_builtin (location_t loc, tree 
ob_fndecl,
       return error_mark_node;
     }
 
+  if (!TARGET_VXE3 && (ob_flags & B_VXE3))
+    {
+      error_at (loc, "%qF requires arch15 or higher", ob_fndecl);
+      return error_mark_node;
+    }
+
   ob_fcode -= S390_BUILTIN_MAX;
 
   for (b_arg_chain = TYPE_ARG_TYPES (TREE_TYPE (ob_fndecl));
@@ -1045,6 +1051,14 @@ s390_resolve_overloaded_builtin (location_t loc, tree 
ob_fndecl,
       return error_mark_node;
     }
 
+  if (!TARGET_VXE3
+      && bflags_overloaded_builtin_var[last_match_index] & B_VXE3)
+    {
+      error_at (loc, "%qs matching variant requires arch15 or higher",
+               IDENTIFIER_POINTER (DECL_NAME (ob_fndecl)));
+      return error_mark_node;
+    }
+
   if (bflags_overloaded_builtin_var[last_match_index] & B_DEP)
     warning_at (loc, 0, "%qs matching variant is deprecated",
                IDENTIFIER_POINTER (DECL_NAME (ob_fndecl)));
diff --git a/gcc/config/s390/s390.cc b/gcc/config/s390/s390.cc
index f5053781ffd..f3b0061ac38 100644
--- a/gcc/config/s390/s390.cc
+++ b/gcc/config/s390/s390.cc
@@ -913,6 +913,12 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget 
ATTRIBUTE_UNUSED,
          error ("Builtin %qF requires z15 or higher", fndecl);
          return const0_rtx;
        }
+
+      if ((bflags & B_VXE3) && !TARGET_VXE3)
+       {
+         error ("Builtin %qF requires arch15 or higher", fndecl);
+         return const0_rtx;
+       }
     }
   if (fcode >= S390_OVERLOADED_BUILTIN_VAR_OFFSET
       && fcode < S390_ALL_BUILTIN_MAX)
diff --git a/gcc/testsuite/lib/target-supports.exp 
b/gcc/testsuite/lib/target-supports.exp
index 939ef3a4119..ca85a47c9ed 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -12959,6 +12959,22 @@ proc check_effective_target_s390_vxe2 { } {
     } "-march=arch13 -mzarch" ]
 }
 
+# Same as above but for the arch15 vector enhancement facility. Test
+# is performed with the vector divide instruction.
+proc check_effective_target_s390_vxe3 { } {
+    if ![istarget s390*-*-*] then {
+       return 0;
+    }
+
+    return [check_runtime s390_check_vxe3 {
+       int main (void)
+       {
+           asm ("vd %%v24, %%v26, %%v28, 2, 0" : : : "v24", "v26", "v28");
+           return 0;
+       }
+    } "-march=arch15 -mzarch" ]
+}
+
 # Same as above but for the arch14 NNPA facility.
 proc check_effective_target_s390_nnpa { } {
     if ![istarget s390*-*-*] then {
-- 
2.47.0

Reply via email to