Index: lib/Headers/avx512fintrin.h =================================================================== --- lib/Headers/avx512fintrin.h +++ lib/Headers/avx512fintrin.h @@ -7965,6 +7965,30 @@ (__mmask16) __U); } +static __inline__ __m512d __DEFAULT_FN_ATTRS +_mm512_castpd128_pd512 (__m128d __A) +{ + return __builtin_shufflevector( __A, __A, 0, 1, -1, -1, -1, -1, -1, -1); +} + +static __inline__ __m512 __DEFAULT_FN_ATTRS +_mm512_castps128_ps512 (__m128 __A) +{ + return __builtin_shufflevector( __A, __A, 0, 1, 2, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1); +} + +static __inline__ __m512i __DEFAULT_FN_ATTRS +_mm512_castsi128_si512 (__m128i __A) +{ + return __builtin_shufflevector( __A, __A, 0, 1, -1, -1, -1, -1, -1, -1); +} + +static __inline__ __m512i __DEFAULT_FN_ATTRS +_mm512_castsi256_si512 (__m256i __A) +{ + return __builtin_shufflevector( __A, __A, 0, 1, 2, 3, -1, -1, -1, -1); +} + #undef __DEFAULT_FN_ATTRS Index: test/CodeGen/avx512f-builtins.c =================================================================== --- test/CodeGen/avx512f-builtins.c +++ test/CodeGen/avx512f-builtins.c @@ -5528,3 +5528,28 @@ // CHECK: @llvm.x86.avx512.mask.mova.ps.512 return _mm512_maskz_mov_ps(__U, __A); } + +__m512d test_mm512_castpd128_pd512(__m128d __A) { + // CHECK-LABEL: @test_mm512_castpd128_pd512 + // CHECK: shufflevector <2 x double> %1, <2 x double> %2, <8 x i32> + return _mm512_castpd128_pd512(__A); +} + +__m512 test_mm512_castps128_ps512(__m128 __A) { + // CHECK-LABEL: @test_mm512_castps128_ps512 + // CHECK: shufflevector <4 x float> %1, <4 x float> %2, <16 x i32> + return _mm512_castps128_ps512(__A); +} + +__m512i test_mm512_castsi128_si512(__m128i __A) { + // CHECK-LABEL: @test_mm512_castsi128_si512 + // CHECK: shufflevector <2 x i64> %1, <2 x i64> %2, <8 x i32> + return _mm512_castsi128_si512(__A); +} + +__m512i test_mm512_castsi256_si512(__m256i __A) { + // CHECK-LABEL: @test_mm512_castsi256_si512 + // CHECK: shufflevector <4 x i64> %1, <4 x i64> %2, <8 x i32> + return _mm512_castsi256_si512(__A); +} +