You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.8 KiB
50 lines
1.8 KiB
From b13a91507798183556d7e1891fe3d4cd3a947aa6 Mon Sep 17 00:00:00 2001 |
|
From: Stefan Liebler <stli@linux.vnet.ibm.com> |
|
Date: Thu, 8 Oct 2015 10:48:13 +0200 |
|
Subject: [PATCH 09/30] S390: Ifunc resolver macro for vector instructions. |
|
|
|
upstream-commit-id: fd484e057dd4d2813182df08584a4c48d6f1dd7a |
|
https://www.sourceware.org/ml/libc-alpha/2015-07/msg00076.html |
|
|
|
This patch introduces a s390 specific ifunc resolver macro for 32/64bit, |
|
which chooses <func>_vx with vector instructions if HWCAP_S390_VX flag |
|
in hwcaps is set or <func>_c if not. |
|
|
|
ChangeLog: |
|
|
|
* sysdeps/s390/multiarch/ifunc-resolve.h (s390_vx_libc_ifunc, |
|
s390_vx_libc_ifunc2): New macro function. |
|
--- |
|
sysdeps/s390/multiarch/ifunc-resolve.h | 19 +++++++++++++++++++ |
|
1 file changed, 19 insertions(+) |
|
|
|
diff --git a/sysdeps/s390/multiarch/ifunc-resolve.h b/sysdeps/s390/multiarch/ifunc-resolve.h |
|
index 491df68..e9fd90e 100644 |
|
--- a/sysdeps/s390/multiarch/ifunc-resolve.h |
|
+++ b/sysdeps/s390/multiarch/ifunc-resolve.h |
|
@@ -73,3 +73,22 @@ |
|
else \ |
|
return &__##FUNC##_default; \ |
|
} |
|
+ |
|
+#define s390_vx_libc_ifunc(FUNC) \ |
|
+ s390_vx_libc_ifunc2(FUNC, FUNC) |
|
+ |
|
+#define s390_vx_libc_ifunc2(RESOLVERFUNC, FUNC) \ |
|
+ /* Make the declarations of the optimized functions hidden in order |
|
+ to prevent GOT slots being generated for them. */ \ |
|
+ extern __typeof (FUNC) RESOLVERFUNC##_vx attribute_hidden; \ |
|
+ extern __typeof (FUNC) RESOLVERFUNC##_c attribute_hidden; \ |
|
+ extern void *__resolve_##RESOLVERFUNC (unsigned long int) __asm__ (#FUNC); \ |
|
+ \ |
|
+ void *__resolve_##RESOLVERFUNC (unsigned long int dl_hwcap) \ |
|
+ { \ |
|
+ if (dl_hwcap & HWCAP_S390_VX) \ |
|
+ return &RESOLVERFUNC##_vx; \ |
|
+ else \ |
|
+ return &RESOLVERFUNC##_c; \ |
|
+ } \ |
|
+ __asm__ (".type " #FUNC ", %gnu_indirect_function"); |
|
-- |
|
2.3.0 |
|
|
|
|