diff options
Diffstat (limited to 'lib/Headers')
-rw-r--r-- | lib/Headers/CMakeLists.txt | 4 | ||||
-rw-r--r-- | lib/Headers/__wmmintrin_aes.h | 67 | ||||
-rw-r--r-- | lib/Headers/__wmmintrin_pclmul.h | 34 | ||||
-rw-r--r-- | lib/Headers/altivec.h | 26 | ||||
-rw-r--r-- | lib/Headers/bmi2intrin.h | 19 | ||||
-rw-r--r-- | lib/Headers/cpuid.h | 2 | ||||
-rw-r--r-- | lib/Headers/f16cintrin.h | 58 | ||||
-rw-r--r-- | lib/Headers/immintrin.h | 4 | ||||
-rw-r--r-- | lib/Headers/module.map | 37 | ||||
-rw-r--r-- | lib/Headers/rtmintrin.h | 49 | ||||
-rw-r--r-- | lib/Headers/unwind.h | 2 | ||||
-rw-r--r-- | lib/Headers/wmmintrin.h | 41 | ||||
-rw-r--r-- | lib/Headers/x86intrin.h | 4 | ||||
-rw-r--r-- | lib/Headers/xmmintrin.h | 9 |
14 files changed, 299 insertions, 57 deletions
diff --git a/lib/Headers/CMakeLists.txt b/lib/Headers/CMakeLists.txt index 6e9cc68540b6..25e4d903bb78 100644 --- a/lib/Headers/CMakeLists.txt +++ b/lib/Headers/CMakeLists.txt @@ -6,6 +6,7 @@ set(files bmiintrin.h bmi2intrin.h emmintrin.h + f16cintrin.h float.h fma4intrin.h fmaintrin.h @@ -19,6 +20,7 @@ set(files nmmintrin.h pmmintrin.h popcntintrin.h + rtmintrin.h smmintrin.h stdalign.h stdarg.h @@ -29,6 +31,8 @@ set(files tmmintrin.h varargs.h wmmintrin.h + __wmmintrin_aes.h + __wmmintrin_pclmul.h x86intrin.h xmmintrin.h xopintrin.h diff --git a/lib/Headers/__wmmintrin_aes.h b/lib/Headers/__wmmintrin_aes.h new file mode 100644 index 000000000000..2bfa027e07b1 --- /dev/null +++ b/lib/Headers/__wmmintrin_aes.h @@ -0,0 +1,67 @@ +/*===---- __wmmintrin_aes.h - AES intrinsics -------------------------------=== + * + * 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 _WMMINTRIN_AES_H +#define _WMMINTRIN_AES_H + +#include <emmintrin.h> + +#if !defined (__AES__) +# error "AES instructions not enabled" +#else + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_aesenc_si128(__m128i __V, __m128i __R) +{ + return (__m128i)__builtin_ia32_aesenc128(__V, __R); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_aesenclast_si128(__m128i __V, __m128i __R) +{ + return (__m128i)__builtin_ia32_aesenclast128(__V, __R); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_aesdec_si128(__m128i __V, __m128i __R) +{ + return (__m128i)__builtin_ia32_aesdec128(__V, __R); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_aesdeclast_si128(__m128i __V, __m128i __R) +{ + return (__m128i)__builtin_ia32_aesdeclast128(__V, __R); +} + +static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) +_mm_aesimc_si128(__m128i __V) +{ + return (__m128i)__builtin_ia32_aesimc128(__V); +} + +#define _mm_aeskeygenassist_si128(C, R) \ + __builtin_ia32_aeskeygenassist128((C), (R)) + +#endif + +#endif /* _WMMINTRIN_AES_H */ diff --git a/lib/Headers/__wmmintrin_pclmul.h b/lib/Headers/__wmmintrin_pclmul.h new file mode 100644 index 000000000000..8d1f1b7c0868 --- /dev/null +++ b/lib/Headers/__wmmintrin_pclmul.h @@ -0,0 +1,34 @@ +/*===---- __wmmintrin_pclmul.h - AES intrinsics ----------------------------=== + * + * 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 _WMMINTRIN_PCLMUL_H +#define _WMMINTRIN_PCLMUL_H + +#if !defined (__PCLMUL__) +# error "PCLMUL instruction is not enabled" +#else +#define _mm_clmulepi64_si128(__X, __Y, __I) \ + ((__m128i)__builtin_ia32_pclmulqdq128((__v2di)(__m128i)(__X), \ + (__v2di)(__m128i)(__Y), (char)(__I))) +#endif + +#endif /* _WMMINTRIN_PCLMUL_H */ diff --git a/lib/Headers/altivec.h b/lib/Headers/altivec.h index a225378c3062..2bf53fb43b9b 100644 --- a/lib/Headers/altivec.h +++ b/lib/Headers/altivec.h @@ -4363,14 +4363,14 @@ vec_perm(vector float a, vector float b, vector unsigned char c) /* vec_vperm */ -vector signed char __ATTRS_o_ai +static vector signed char __ATTRS_o_ai vec_vperm(vector signed char a, vector signed char b, vector unsigned char c) { return (vector signed char) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector unsigned char __ATTRS_o_ai +static vector unsigned char __ATTRS_o_ai vec_vperm(vector unsigned char a, vector unsigned char b, vector unsigned char c) @@ -4379,21 +4379,21 @@ vec_vperm(vector unsigned char a, __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector bool char __ATTRS_o_ai +static vector bool char __ATTRS_o_ai vec_vperm(vector bool char a, vector bool char b, vector unsigned char c) { return (vector bool char) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector short __ATTRS_o_ai +static vector short __ATTRS_o_ai vec_vperm(vector short a, vector short b, vector unsigned char c) { return (vector short) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector unsigned short __ATTRS_o_ai +static vector unsigned short __ATTRS_o_ai vec_vperm(vector unsigned short a, vector unsigned short b, vector unsigned char c) @@ -4402,41 +4402,41 @@ vec_vperm(vector unsigned short a, __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector bool short __ATTRS_o_ai +static vector bool short __ATTRS_o_ai vec_vperm(vector bool short a, vector bool short b, vector unsigned char c) { return (vector bool short) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector pixel __ATTRS_o_ai +static vector pixel __ATTRS_o_ai vec_vperm(vector pixel a, vector pixel b, vector unsigned char c) { return (vector pixel) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector int __ATTRS_o_ai +static vector int __ATTRS_o_ai vec_vperm(vector int a, vector int b, vector unsigned char c) { return (vector int)__builtin_altivec_vperm_4si(a, b, c); } -vector unsigned int __ATTRS_o_ai +static vector unsigned int __ATTRS_o_ai vec_vperm(vector unsigned int a, vector unsigned int b, vector unsigned char c) { return (vector unsigned int) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector bool int __ATTRS_o_ai +static vector bool int __ATTRS_o_ai vec_vperm(vector bool int a, vector bool int b, vector unsigned char c) { return (vector bool int) __builtin_altivec_vperm_4si((vector int)a, (vector int)b, c); } -vector float __ATTRS_o_ai +static vector float __ATTRS_o_ai vec_vperm(vector float a, vector float b, vector unsigned char c) { return (vector float) @@ -4445,7 +4445,7 @@ vec_vperm(vector float a, vector float b, vector unsigned char c) /* vec_re */ -vector float __attribute__((__always_inline__)) +static vector float __attribute__((__always_inline__)) vec_re(vector float a) { return __builtin_altivec_vrefp(a); @@ -4453,7 +4453,7 @@ vec_re(vector float a) /* vec_vrefp */ -vector float __attribute__((__always_inline__)) +static vector float __attribute__((__always_inline__)) vec_vrefp(vector float a) { return __builtin_altivec_vrefp(a); diff --git a/lib/Headers/bmi2intrin.h b/lib/Headers/bmi2intrin.h index c60b0c439315..a05cfad3d027 100644 --- a/lib/Headers/bmi2intrin.h +++ b/lib/Headers/bmi2intrin.h @@ -70,6 +70,25 @@ _pext_u64(unsigned long long __X, unsigned long long __Y) return __builtin_ia32_pext_di(__X, __Y); } +static __inline__ unsigned long long __attribute__((__always_inline__, __nodebug__)) +_mulx_u64 (unsigned long long __X, unsigned long long __Y, + unsigned long long *__P) +{ + unsigned __int128 __res = (unsigned __int128) __X * __Y; + *__P = (unsigned long long) (__res >> 64); + return (unsigned long long) __res; +} + +#else /* !__x86_64__ */ + +static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__)) +_mulx_u32 (unsigned int __X, unsigned int __Y, unsigned int *__P) +{ + unsigned long long __res = (unsigned long long) __X * __Y; + *__P = (unsigned int) (__res >> 32); + return (unsigned int) __res; +} + #endif /* !__x86_64__ */ #endif /* __BMI2INTRIN_H */ diff --git a/lib/Headers/cpuid.h b/lib/Headers/cpuid.h index 05c293f6bd96..33df7c2d19f0 100644 --- a/lib/Headers/cpuid.h +++ b/lib/Headers/cpuid.h @@ -28,6 +28,6 @@ static inline int __get_cpuid (unsigned int level, unsigned int *eax, unsigned int *ebx, unsigned int *ecx, unsigned int *edx) { - asm("cpuid" : "=a"(*eax), "=b" (*ebx), "=c"(*ecx), "=d"(*edx) : "0"(level)); + __asm("cpuid" : "=a"(*eax), "=b" (*ebx), "=c"(*ecx), "=d"(*edx) : "0"(level)); return 1; } diff --git a/lib/Headers/f16cintrin.h b/lib/Headers/f16cintrin.h new file mode 100644 index 000000000000..2c96952446d6 --- /dev/null +++ b/lib/Headers/f16cintrin.h @@ -0,0 +1,58 @@ +/*===---- f16cintrin.h - F16C intrinsics ---------------------------------=== + * + * 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. + * + *===-----------------------------------------------------------------------=== + */ + +#if !defined __X86INTRIN_H && !defined __IMMINTRIN_H +#error "Never use <f16cintrin.h> directly; include <x86intrin.h> instead." +#endif + +#ifndef __F16C__ +# error "F16C instruction is not enabled" +#endif /* __F16C__ */ + +#ifndef __F16CINTRIN_H +#define __F16CINTRIN_H + +typedef float __v8sf __attribute__ ((__vector_size__ (32))); +typedef float __m256 __attribute__ ((__vector_size__ (32))); + +#define _mm_cvtps_ph(a, imm) __extension__ ({ \ + __m128 __a = (a); \ + (__m128i)__builtin_ia32_vcvtps2ph((__v4sf)__a, (imm)); }) + +#define _mm256_cvtps_ph(a, imm) __extension__ ({ \ + __m256 __a = (a); \ + (__m128i)__builtin_ia32_vcvtps2ph256((__v8sf)__a, (imm)); }) + +static __inline __m128 __attribute__((__always_inline__, __nodebug__)) +_mm_cvtph_ps(__m128i a) +{ + return (__m128)__builtin_ia32_vcvtph2ps((__v8hi)a); +} + +static __inline __m256 __attribute__((__always_inline__, __nodebug__)) +_mm256_cvtph_ps(__m128i a) +{ + return (__m256)__builtin_ia32_vcvtph2ps256((__v8hi)a); +} + +#endif /* __F16CINTRIN_H */ diff --git a/lib/Headers/immintrin.h b/lib/Headers/immintrin.h index 15b65f3fd8c6..cd733bfc71d3 100644 --- a/lib/Headers/immintrin.h +++ b/lib/Headers/immintrin.h @@ -98,4 +98,8 @@ _rdrand64_step(unsigned long long *__p) #endif #endif /* __RDRND__ */ +#ifdef __RTM__ +#include <rtmintrin.h> +#endif + #endif /* __IMMINTRIN_H */ diff --git a/lib/Headers/module.map b/lib/Headers/module.map index 418ba5009094..b24bccc12056 100644 --- a/lib/Headers/module.map +++ b/lib/Headers/module.map @@ -25,6 +25,11 @@ module _Builtin_intrinsics [system] { header "mmintrin.h" } + explicit module f16c { + requires f16c + header "f16cintrin.h" + } + explicit module sse { requires sse export mmx @@ -62,6 +67,12 @@ module _Builtin_intrinsics [system] { header "nmmintrin.h" } + explicit module sse4a { + requires sse4a + export sse3 + header "ammintrin.h" + } + explicit module avx { requires avx export sse4_2 @@ -84,6 +95,11 @@ module _Builtin_intrinsics [system] { header "bmi2intrin.h" } + explicit module fma { + requires fma + header "fmaintrin.h" + } + explicit module fma4 { requires fma4 export sse3 @@ -104,5 +120,26 @@ module _Builtin_intrinsics [system] { requires mm3dnow header "mm3dnow.h" } + + explicit module xop { + requires xop + export fma4 + header "xopintrin.h" + } + + explicit module aes_pclmul { + requires aes, pclmul + header "wmmintrin.h" + } + + explicit module aes { + requires aes + header "__wmmintrin_aes.h" + } + + explicit module pclmul { + requires pclmul + header "__wmmintrin_pclmul.h" + } } } diff --git a/lib/Headers/rtmintrin.h b/lib/Headers/rtmintrin.h new file mode 100644 index 000000000000..bdc2b994264f --- /dev/null +++ b/lib/Headers/rtmintrin.h @@ -0,0 +1,49 @@ +/*===---- rtmintrin.h - RTM intrinsics -------------------------------------=== + * + * 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 <rtmintrin.h> directly; include <immintrin.h> instead." +#endif + +#define _XBEGIN_STARTED (~0u) +#define _XABORT_EXPLICIT (1 << 0) +#define _XABORT_RETRY (1 << 1) +#define _XABORT_CONFLICT (1 << 2) +#define _XABORT_CAPACITY (1 << 3) +#define _XABORT_DEBUG (1 << 4) +#define _XABORT_NESTED (1 << 5) +#define _XABORT_CODE(x) (((x) >> 24) & 0xFF) + +static __inline__ unsigned int __attribute__((__always_inline__, __nodebug__)) +_xbegin(void) +{ + return __builtin_ia32_xbegin(); +} + +static __inline__ void __attribute__((__always_inline__, __nodebug__)) +_xend(void) +{ + __builtin_ia32_xend(); +} + +#define _xabort(imm) __builtin_ia32_xabort((imm)) diff --git a/lib/Headers/unwind.h b/lib/Headers/unwind.h index a0659203b15c..6520b8316f3d 100644 --- a/lib/Headers/unwind.h +++ b/lib/Headers/unwind.h @@ -100,7 +100,7 @@ typedef enum { _UVRSR_FAILED = 2 } _Unwind_VRS_Result; -_Unwind_VRS_Result _Unwind_VRS_Get(_Unwind_Context *context, +_Unwind_VRS_Result _Unwind_VRS_Get(struct _Unwind_Context *context, _Unwind_VRS_RegClass regclass, uint32_t regno, _Unwind_VRS_DataRepresentation representation, diff --git a/lib/Headers/wmmintrin.h b/lib/Headers/wmmintrin.h index dca896fd65d8..369e3c208e53 100644 --- a/lib/Headers/wmmintrin.h +++ b/lib/Headers/wmmintrin.h @@ -31,48 +31,11 @@ #else #ifdef __AES__ - -static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) -_mm_aesenc_si128(__m128i __V, __m128i __R) -{ - return (__m128i)__builtin_ia32_aesenc128(__V, __R); -} - -static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) -_mm_aesenclast_si128(__m128i __V, __m128i __R) -{ - return (__m128i)__builtin_ia32_aesenclast128(__V, __R); -} - -static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) -_mm_aesdec_si128(__m128i __V, __m128i __R) -{ - return (__m128i)__builtin_ia32_aesdec128(__V, __R); -} - -static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) -_mm_aesdeclast_si128(__m128i __V, __m128i __R) -{ - return (__m128i)__builtin_ia32_aesdeclast128(__V, __R); -} - -static __inline__ __m128i __attribute__((__always_inline__, __nodebug__)) -_mm_aesimc_si128(__m128i __V) -{ - return (__m128i)__builtin_ia32_aesimc128(__V); -} - -#define _mm_aeskeygenassist_si128(C, R) \ - __builtin_ia32_aeskeygenassist128((C), (R)) - +#include <__wmmintrin_aes.h> #endif /* __AES__ */ #ifdef __PCLMUL__ - -#define _mm_clmulepi64_si128(__X, __Y, __I) \ - ((__m128i)__builtin_ia32_pclmulqdq128((__v2di)(__m128i)(__X), \ - (__v2di)(__m128i)(__Y), (char)(__I))) - +#include <__wmmintrin_pclmul.h> #endif /* __PCLMUL__ */ #endif /* __AES__ || __PCLMUL__ */ diff --git a/lib/Headers/x86intrin.h b/lib/Headers/x86intrin.h index 556cd011f05d..68ce106be308 100644 --- a/lib/Headers/x86intrin.h +++ b/lib/Headers/x86intrin.h @@ -58,6 +58,10 @@ #include <xopintrin.h> #endif +#ifdef __F16C__ +#include <f16cintrin.h> +#endif + // FIXME: LWP #endif /* __X86INTRIN_H */ diff --git a/lib/Headers/xmmintrin.h b/lib/Headers/xmmintrin.h index e616157b047c..e2480ec7a0e3 100644 --- a/lib/Headers/xmmintrin.h +++ b/lib/Headers/xmmintrin.h @@ -95,7 +95,8 @@ _mm_div_ps(__m128 a, __m128 b) static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) _mm_sqrt_ss(__m128 a) { - return __builtin_ia32_sqrtss(a); + __m128 c = __builtin_ia32_sqrtss(a); + return (__m128) { c[0], a[1], a[2], a[3] }; } static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) @@ -107,7 +108,8 @@ _mm_sqrt_ps(__m128 a) static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) _mm_rcp_ss(__m128 a) { - return __builtin_ia32_rcpss(a); + __m128 c = __builtin_ia32_rcpss(a); + return (__m128) { c[0], a[1], a[2], a[3] }; } static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) @@ -119,7 +121,8 @@ _mm_rcp_ps(__m128 a) static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) _mm_rsqrt_ss(__m128 a) { - return __builtin_ia32_rsqrtss(a); + __m128 c = __builtin_ia32_rsqrtss(a); + return (__m128) { c[0], a[1], a[2], a[3] }; } static __inline__ __m128 __attribute__((__always_inline__, __nodebug__)) |