diff --git a/include/clang/Basic/BuiltinsX86.def b/include/clang/Basic/BuiltinsX86.def index aed206f4a52567ec55ef2cf5a5dcf720fb267e85..aaf279f3713f01c263f5ab8e64c4a6c7eb5218cb 100644 --- a/include/clang/Basic/BuiltinsX86.def +++ b/include/clang/Basic/BuiltinsX86.def @@ -656,6 +656,12 @@ BUILTIN(__builtin_ia32_wrfsbase64, "vULLi", "") BUILTIN(__builtin_ia32_wrgsbase32, "vUi", "") BUILTIN(__builtin_ia32_wrgsbase64, "vULLi", "") +// FXSR +BUILTIN(__builtin_ia32_fxrstor, "vv*", "") +BUILTIN(__builtin_ia32_fxrstor64, "vv*", "") +BUILTIN(__builtin_ia32_fxsave, "vv*", "") +BUILTIN(__builtin_ia32_fxsave64, "vv*", "") + // ADX BUILTIN(__builtin_ia32_addcarryx_u32, "UcUcUiUiUi*", "") BUILTIN(__builtin_ia32_addcarryx_u64, "UcUcULLiULLiULLi*", "") diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt index 7e95113564c8078e2e0d26769bc8764cf28f131c..87afc60de99601fde726bc6f8ef0810246d97229 100644 --- a/lib/Headers/CMakeLists.txt +++ b/lib/Headers/CMakeLists.txt @@ -22,6 +22,7 @@ set(files float.h fma4intrin.h fmaintrin.h + fxsrintrin.h htmintrin.h htmxlintrin.h ia32intrin.h diff --git a/lib/Headers/Intrin.h b/lib/Headers/Intrin.h index dd04e06ad8bc272fdf2b73c3835bf2179fcd2c5a..9f7c76268e9aa0517b38f100d93887745d8d8d01 100644 --- a/lib/Headers/Intrin.h +++ b/lib/Headers/Intrin.h @@ -180,8 +180,6 @@ unsigned long __cdecl _byteswap_ulong(unsigned long); unsigned short __cdecl _byteswap_ushort(unsigned short); void __cdecl _disable(void); void __cdecl _enable(void); -void __cdecl _fxrstor(void const *); -void __cdecl _fxsave(void *); long _InterlockedAddLargeStatistic(__int64 volatile *_Addend, long _Value); static __inline__ long _InterlockedAnd(long volatile *_Value, long _Mask); @@ -358,8 +356,6 @@ unsigned char _bittestandreset64(__int64 *, __int64); static __inline__ unsigned char _bittestandset64(__int64 *, __int64); unsigned __int64 __cdecl _byteswap_uint64(unsigned __int64); -void __cdecl _fxrstor64(void const *); -void __cdecl _fxsave64(void *); long _InterlockedAnd_np(long volatile *_Value, long _Mask); short _InterlockedAnd16_np(short volatile *_Value, short _Mask); __int64 _InterlockedAnd64_np(__int64 volatile *_Value, __int64 _Mask); diff --git a/lib/Headers/fxsrintrin.h b/lib/Headers/fxsrintrin.h new file mode 100644 index 0000000000000000000000000000000000000000..d7fd39bd6b65f2ee1a9814fb6609865aa2dfb29c --- /dev/null +++ b/lib/Headers/fxsrintrin.h @@ -0,0 +1,53 @@ +/*===---- fxsrintrin.h - FXSR intrinsic ------------------------------------=== + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + *===-----------------------------------------------------------------------=== + */ + +#ifndef __IMMINTRIN_H +#error "Never use <fxsrintrin.h> directly; include <immintrin.h> instead." +#endif + +#ifndef __FXSRINTRIN_H +#define __FXSRINTRIN_H + +#define DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__)) + +static __inline__ void DEFAULT_FN_ATTRS +_fxsave(void *__p) { + return __builtin_ia32_fxsave(__p); +} + +static __inline__ void DEFAULT_FN_ATTRS +_fxsave64(void *__p) { + return __builtin_ia32_fxsave64(__p); +} + +static __inline__ void DEFAULT_FN_ATTRS +_fxrstor(void *__p) { + return __builtin_ia32_fxrstor(__p); +} + +static __inline__ void DEFAULT_FN_ATTRS +_fxrstor64(void *__p) { + return __builtin_ia32_fxrstor64(__p); +} + +#endif diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index 4d2638a11e250340363a35a16350d2904e461b84..604bc8ca5b393906950b1c41a4b9e7dccd70ff60 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -142,6 +142,8 @@ _writegsbase_u64(unsigned long long __V) #include <shaintrin.h> +#include <fxsrintrin.h> + /* Some intrinsics inside adxintrin.h are available only on processors with ADX, * whereas others are also available at all times. */ #include <adxintrin.h> diff --git a/test/CodeGen/builtins-x86.c b/test/CodeGen/builtins-x86.c index 8a5b5a272d4c71d4941512cf8442f2e01d75daa6..a239889e2b494ae2d1c83561803d30d71b17c2d0 100644 --- a/test/CodeGen/builtins-x86.c +++ b/test/CodeGen/builtins-x86.c @@ -260,6 +260,10 @@ void f0() { (void) __builtin_ia32_ldmxcsr(tmp_Ui); tmp_Ui = __builtin_ia32_stmxcsr(); + (void)__builtin_ia32_fxsave(tmp_vp); + (void)__builtin_ia32_fxsave64(tmp_vp); + (void)__builtin_ia32_fxrstor(tmp_vp); + (void)__builtin_ia32_fxrstor64(tmp_vp); tmp_V4f = __builtin_ia32_cvtpi2ps(tmp_V4f, tmp_V2i); tmp_V2i = __builtin_ia32_cvtps2pi(tmp_V4f); tmp_i = __builtin_ia32_cvtss2si(tmp_V4f);