summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitry Andric <dimitry@andric.com>2019-05-06 17:58:03 +0000
committerDimitry Andric <dimitry@andric.com>2019-05-06 17:58:03 +0000
commit181aff63fb148f46946becbbc64ace638291e902 (patch)
tree559ff865f3f6dbc3815c08db47880289ae692113
parentcf9e7a282b74cd12cd266ab11291a58fdc871976 (diff)
downloadbcm5719-llvm-181aff63fb148f46946becbbc64ace638291e902.tar.gz
bcm5719-llvm-181aff63fb148f46946becbbc64ace638291e902.zip
Add non-SSE wrapper for __kmp_{load,store}_mxcsr
Summary: To be able to successfully build OpenMP on FreeBSD/i386, which still uses i486 as its default processor, I had to provide wrappers for the `__kmp_load_mxcsr` and `__kmp_store_mxcsr` functions. If the compiler signals that SSE is not available, loading and storing mxcsr does not make sense anway, so in that case the inline functions are empty. This gives the minimum amount of code churn. See also https://svnweb.freebsd.org/changeset/base/345283 Reviewers: emaste, jlpeyton, Hahnfeld Reviewed By: jlpeyton Subscribers: hfinkel, krytarowski, jdoerfert, openmp-commits, llvm-commits Tags: #openmp Differential Revision: https://reviews.llvm.org/D60916 llvm-svn: 360062
-rw-r--r--openmp/runtime/src/kmp.h12
1 files changed, 9 insertions, 3 deletions
diff --git a/openmp/runtime/src/kmp.h b/openmp/runtime/src/kmp.h
index b9a9599177a..72245389653 100644
--- a/openmp/runtime/src/kmp.h
+++ b/openmp/runtime/src/kmp.h
@@ -1243,16 +1243,22 @@ static inline void __kmp_clear_x87_fpu_status_word() {
__asm__ __volatile__("fnclex");
#endif // KMP_MIC
}
+#if __SSE__
+static inline void __kmp_load_mxcsr(const kmp_uint32 *p) { _mm_setcsr(*p); }
+static inline void __kmp_store_mxcsr(kmp_uint32 *p) { *p = _mm_getcsr(); }
+#else
+static inline void __kmp_load_mxcsr(const kmp_uint32 *p) {}
+static inline void __kmp_store_mxcsr(kmp_uint32 *p) { *p = 0; }
+#endif
#else
// Windows still has these as external functions in assembly file
extern void __kmp_x86_cpuid(int mode, int mode2, struct kmp_cpuid *p);
extern void __kmp_load_x87_fpu_control_word(const kmp_int16 *p);
extern void __kmp_store_x87_fpu_control_word(kmp_int16 *p);
extern void __kmp_clear_x87_fpu_status_word();
-#endif // KMP_OS_UNIX
-
-#define __kmp_load_mxcsr(p) _mm_setcsr(*(p))
+static inline void __kmp_load_mxcsr(const kmp_uint32 *p) { _mm_setcsr(*p); }
static inline void __kmp_store_mxcsr(kmp_uint32 *p) { *p = _mm_getcsr(); }
+#endif // KMP_OS_UNIX
#define KMP_X86_MXCSR_MASK 0xffffffc0 /* ignore status flags (6 lsb) */
OpenPOWER on IntegriCloud