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) +{ + __m128 res=__A; + res[0] = (__U&1)? __B[0]:__W[0]; + return res; +} + +static __inline__ __m128 __DEFAULT_FN_ATTRS +_mm_maskz_move_ss (__mmask8 __U, __m128 __A, __m128 __B) +{ + __m128 res=__A; + res[0] = (__U&1)? __B[0]:0; + return res; +} + +static __inline__ __m128d __DEFAULT_FN_ATTRS +_mm_mask_move_sd (__m128d __W, __mmask8 __U, __m128d __A, __m128d __B) +{ + __m128d res=__A; + res[0] = (__U&1)? __B[0]:__W[0]; + return res; +} + +static __inline__ __m128d __DEFAULT_FN_ATTRS +_mm_maskz_move_sd (__mmask8 __U, __m128d __A, __m128d __B) +{ + __m128d res=__A; + res[0] = (__U&1)? __B[0]:0; + return res; +} + + 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,20 @@ _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 +385,46 @@ 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:cond.true.i + // CHECK: store <4 x float> {{.*}}, <4 x float>* {{.*}} + // CHECK:cond.false.i + // CHECK: store <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:cond.true.i + // CHECK: store <4 x float> {{.*}}, <4 x float>* {{.*}} + // CHECK:cond.false.i + // CHECK: store <4 x float> zeroinitializer, <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:cond.true.i + // CHECK: store <2 x double> {{.*}}, <2 x double>* {{.*}} + // CHECK:cond.false.i + // CHECK: store <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:cond.true.i + // CHECK: store <2 x double> {{.*}}, <2 x double>* {{.*}} + // CHECK:cond.false.i + // CHECK: store <2 x double> zeroinitializer, <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 +6253,54 @@ 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: cond.true.i + // CHECK: %6 = load <4 x float>, <4 x float>* %__B.addr.i, align 16 + // CHECK: cond.false.i + // CHECK: %7 = load <4 x float>, <4 x float>* %__W.addr.i, align 16 + // CHECK: %8 = load <4 x float>, <4 x float>* %res.i, align 16 + // CHECK: %vecins.i = insertelement <4 x float> %8, float %cond.i, i32 0 + 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: cond.true.i + // CHECK: %5 = load <4 x float>, <4 x float>* %__B.addr.i + // CHECK: cond.false.i + // CHECK: br label %_mm_maskz_move_ss.exit + // CHECK: %6 = load <4 x float>, <4 x float>* %res.i, align 16 + // CHECK: %vecins.i = insertelement <4 x float> %6, float %cond.i, i32 0 + 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: cond.true.i + // CHECK: %7 = load <2 x double>, <2 x double>* %__B.addr.i, align 16 + // CHECK: cond.false.i + // CHECK: %8 = load <2 x double>, <2 x double>* %__W.addr.i, align 16 + // CHECK: %9 = load <2 x double>, <2 x double>* %res.i, align 16 + // CHECK: %vecins.i = insertelement <2 x double> %9, double %cond.i, i32 0 + 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: cond.true.i + // CHECK: %5 = load <2 x double>, <2 x double>* %__B.addr.i, align 16 + // CHECK: cond.false.i + // CHECK: br label %_mm_maskz_move_sd.exit + // CHECK: %6 = load <2 x double>, <2 x double>* %res.i, align 16 + // CHECK: %vecins.i = insertelement <2 x double> %6, double %cond.i, i32 0 + 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