diff options
-rw-r--r-- | clang/lib/Headers/f16cintrin.h | 19 | ||||
-rw-r--r-- | clang/test/CodeGen/f16c-builtins.c | 12 |
2 files changed, 28 insertions, 3 deletions
diff --git a/clang/lib/Headers/f16cintrin.h b/clang/lib/Headers/f16cintrin.h index c655d98ee9a..0ed966abbce 100644 --- a/clang/lib/Headers/f16cintrin.h +++ b/clang/lib/Headers/f16cintrin.h @@ -29,10 +29,23 @@ #define __F16CINTRIN_H /* Define the default attributes for the functions in this file. */ -#define __DEFAULT_FN_ATTRS __attribute__((__always_inline__, __nodebug__, __target__("f16c"))) +#define __DEFAULT_FN_ATTRS \ + __attribute__((__always_inline__, __nodebug__, __target__("f16c"))) -#define _mm_cvtps_ph(a, imm) __extension__ ({ \ - (__m128i)__builtin_ia32_vcvtps2ph((__v4sf)(__m128)(a), (imm)); }) +static __inline float __DEFAULT_FN_ATTRS +_cvtsh_ss(unsigned short a) +{ + __v8hi v = {(short)a, 0, 0, 0, 0, 0, 0, 0}; + __v4sf r = __builtin_ia32_vcvtph2ps(v); + return r[0]; +} + +#define _cvtss_sh(a, imm) \ + ((unsigned short)(((__v8hi)__builtin_ia32_vcvtps2ph((__v4sf){a, 0, 0, 0}, \ + (imm)))[0])) + +#define _mm_cvtps_ph(a, imm) \ + ((__m128i)__builtin_ia32_vcvtps2ph((__v4sf)(__m128)(a), (imm))) static __inline __m128 __DEFAULT_FN_ATTRS _mm_cvtph_ps(__m128i __a) diff --git a/clang/test/CodeGen/f16c-builtins.c b/clang/test/CodeGen/f16c-builtins.c index f9cfa0d8fb3..b0f660ab0a8 100644 --- a/clang/test/CodeGen/f16c-builtins.c +++ b/clang/test/CodeGen/f16c-builtins.c @@ -5,6 +5,18 @@ #include <x86intrin.h> +float test_cvtsh_ss(unsigned short a) { + // CHECK-LABEL: test_cvtsh_ss + // CHECK: @llvm.x86.vcvtph2ps.128 + return _cvtsh_ss(a); +} + +unsigned short test_cvtss_sh(float a) { + // CHECK-LABEL: test_cvtss_sh + // CHECK: @llvm.x86.vcvtps2ph.128 + return _cvtss_sh(a, 0); +} + __m128 test_mm_cvtph_ps(__m128i a) { // CHECK-LABEL: test_mm_cvtph_ps // CHECK: @llvm.x86.vcvtph2ps.128 |