Index: lib/Headers/avx512fintrin.h =================================================================== --- lib/Headers/avx512fintrin.h +++ lib/Headers/avx512fintrin.h @@ -4558,6 +4558,30 @@ return *(__m512i *) __P; } +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_mask_load_ss (__m128 __W, __mmask8 __U, const float* __A) +{ + return (__U & 1) ? _mm_load_ss(__A) : (__m128) { __W[0], 0, 0, 0}; +} + +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_maskz_load_ss (__mmask8 __U, const float* __A) +{ + return (__U & 1) ? _mm_load_ss(__A) : (__m128) { 0, 0, 0, 0}; +} + +static __inline__ __m128d __DEFAULT_FN_ATTRS +_mm_mask_load_sd (__m128d __W, __mmask8 __U, const double* __A) +{ + return (__U & 1) ? _mm_load_sd(__A) :(__m128d) { __W[0], 0}; +} + +static __inline__ __m128d __DEFAULT_FN_ATTRS +_mm_maskz_load_sd (__mmask8 __U, const double* __A) +{ + return (__U & 1) ? _mm_load_sd(__A) :(__m128d) { 0, 0}; +} + /* SIMD store ops */ static __inline void __DEFAULT_FN_ATTRS @@ -4649,6 +4673,20 @@ *(__m512i *) __P = __A; } +static __inline__ void __DEFAULT_FN_ATTRS +_mm_mask_store_ss (float * __W, __mmask8 __U, __m128 __A) +{ + if(__U & 1) + _mm_store_ss(__W, __A); +} + +static __inline__ void __DEFAULT_FN_ATTRS +_mm_mask_store_sd (double * __W, __mmask8 __U, __m128d __A) +{ + if(__U & 1) + _mm_store_sd(__W, __A); +} + /* Mask ops */ static __inline __mmask16 __DEFAULT_FN_ATTRS @@ -9293,6 +9331,39 @@ (__v16sf) _mm512_setzero_ps ()); } +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_mask_move_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128 __B) +{ + return (__m128) _mm_move_ss( __A, __builtin_ia32_selectps_128 ((__mmask8) __U, + (__v4sf) __B, + (__v4sf) __W)); +} + +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_maskz_move_ss (__mmask8 __U, __m128 __A, __m128 __B) +{ + return (__m128) _mm_move_ss( __A, __builtin_ia32_selectps_128 ((__mmask8) __U, + (__v4sf) __B, + (__v4sf) _mm_setzero_si128())); +} + +static __inline__ __m128d __DEFAULT_FN_ATTRS +_mm_mask_move_sd (__m128d __W, __mmask8 __U, __m128d __A, __m128d __B) +{ + return (__m128d) _mm_move_sd( __A, __builtin_ia32_selectpd_128 ((__mmask8) __U, + (__v2df) __B, + (__v2df) __W)); +} + +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_maskz_move_sd (__mmask8 __U, __m128d __A, __m128d __B) +{ + return (__m128d) _mm_move_sd(__A, __builtin_ia32_selectpd_128 ((__mmask8) __U, + (__v2df) __B, + (__v2df) _mm_setzero_pd ())); +} + + static __inline__ void __DEFAULT_FN_ATTRS _mm512_mask_compressstoreu_pd (void *__P, __mmask8 __U, __m512d __A) { Index: test/CodeGen/avx512f-builtins.c =================================================================== --- test/CodeGen/avx512f-builtins.c +++ test/CodeGen/avx512f-builtins.c @@ -241,6 +241,21 @@ _mm512_mask_store_pd(p, m, a); } +void test_mm_mask_store_ss (float * __W, __mmask8 __U, __m128 __A) +{ + // CHECK-LABEL: @test_mm_mask_store_ss + // CHECK: store float {{.*}}, float* {{.*}} + return _mm_mask_store_ss (__W, __U, __A); +} + +void test_mm_mask_store_sd (double * __W, __mmask8 __U, __m128d __A) +{ + // CHECK-LABEL: @test_mm_mask_store_sd + // CHECK: store double {{.*}}, double* {{.*}} + return _mm_mask_store_sd ( __W, __U, __A); +} + + void test_mm512_mask_storeu_epi32(void *__P, __mmask16 __U, __m512i __A) { // CHECK-LABEL: @test_mm512_mask_storeu_epi32 // CHECK: @llvm.masked.store.v16i32.p0v16i32(<16 x i32> %{{.*}}, <16 x i32>* %{{.*}}, i32 1, <16 x i1> %{{.*}}) @@ -371,6 +386,38 @@ return _mm512_maskz_load_pd(__U, __P); } +__m128 test_mm_mask_load_ss (__m128 __W, __mmask8 __U, float const* __A) +{ + // CHECK-LABEL: @test_mm_mask_load_ss + // CHECK: select <4 x i1> {{.*}}, <4 x float> {{.*}}, <4 x float> {{.*}} + // CHECK: load <4 x float>, <4 x float>* {{.*}} + return _mm_mask_load_ss ( __W, __U, __A); +} + +__m128 test_mm_maskz_load_ss (__mmask8 __U, float const* __A) +{ + // CHECK-LABEL: @test_mm_maskz_load_ss + // CHECK: select <4 x i1> {{.*}}, <4 x float> {{.*}}, <4 x float> {{.*}} + // CHECK: load <4 x float>, <4 x float>* {{.*}} + return _mm_maskz_load_ss (__U, __A); +} + +__m128d test_mm_mask_load_sd (__m128 __W, __mmask8 __U, double const* __A) +{ + // CHECK-LABEL: @test_mm_mask_load_sd + // CHECK: select <2 x i1>{{.*}}, <2 x double>{{.*}}, <2 x double>{{.*}} + // CHECK: load <2 x double>, <2 x double>* {{.*}} + return _mm_mask_load_sd ( __W, __U, __A); +} + +__m128d test_mm_maskz_load_sd (__mmask8 __U, double const* __A) +{ + // CHECK-LABEL: @test_mm_maskz_load_sd + // CHECK: select <2 x i1> {{.*}}, <2 x double> {{.*}}, <2 x double> {{.*}} + // CHECK: load <2 x double>, <2 x double>* {{.*}} + return _mm_maskz_load_sd (__U, __A); +} + __m512d test_mm512_set1_pd(double d) { // CHECK-LABEL: @test_mm512_set1_pd @@ -6199,6 +6246,38 @@ return _mm512_maskz_mov_ps(__U, __A); } +__m128 test_mm_mask_move_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128 __B) +{ + // CHECK-LABEL: @test_mm_mask_move_ss + // CHECK: select <4 x i1>{{.*}}, <4 x float> {{.*}}, <4 x float>{{.*}} + // CHECK: load <4 x float>, <4 x float>* {{.*}} + return _mm_mask_move_ss ( __W, __U, __A, __B); +} + +__m128 test_mm_maskz_move_ss (__mmask8 __U, __m128 __A, __m128 __B) +{ + // CHECK-LABEL: @test_mm_maskz_move_ss + // CHECK: select <4 x i1>{{.*}}, <4 x float> {{.*}}, <4 x float>{{.*}} + // CHECK: load <4 x float>, <4 x float>* {{.*}} + return _mm_maskz_move_ss (__U, __A, __B); +} + +__m128d test_mm_mask_move_sd (__m128 __W, __mmask8 __U, __m128d __A, __m128d __B) +{ + // CHECK-LABEL: @test_mm_mask_move_sd + // CHECK: select <2 x i1>{{.*}}, <2 x double>{{.*}}, <2 x double>{{.*}} + // CHECK: load <2 x double>, <2 x double>* {{.*}} + return _mm_mask_move_sd ( __W, __U, __A, __B); +} + +__m128d test_mm_maskz_move_sd (__mmask8 __U, __m128d __A, __m128d __B) +{ + // CHECK-LABEL: @test_mm_maskz_move_sd + // CHECK: select <2 x i1> {{.*}}, <2 x double> {{.*}}, <2 x double> {{.*}} + // CHECK: load <2 x double>, <2 x double>* {{.*}} + return _mm_maskz_move_sd (__U, __A, __B); +} + void test_mm512_mask_compressstoreu_pd(void *__P, __mmask8 __U, __m512d __A) { // CHECK-LABEL: @test_mm512_mask_compressstoreu_pd // CHECK: @llvm.x86.avx512.mask.compress.store.pd.512