static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_mask_add_ss(__m128 __W, __mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_add_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, __W);
}
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_maskz_add_ss(__mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_add_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, _mm_setzero_ps());
}
#define _mm_add_round_ss(A, B, R) \
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_mask_add_sd(__m128d __W, __mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_add_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, __W);
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_maskz_add_sd(__mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_add_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, _mm_setzero_pd());
}
#define _mm_add_round_sd(A, B, R) \
(__m128d)__builtin_ia32_addsd_round_mask((__v2df)(__m128d)(A), \
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_mask_sub_ss(__m128 __W, __mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_sub_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, __W);
}
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_maskz_sub_ss(__mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_sub_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, _mm_setzero_ps());
}
#define _mm_sub_round_ss(A, B, R) \
(__m128)__builtin_ia32_subss_round_mask((__v4sf)(__m128)(A), \
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_mask_sub_sd(__m128d __W, __mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_sub_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, __W);
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_maskz_sub_sd(__mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_sub_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, _mm_setzero_pd());
}
#define _mm_sub_round_sd(A, B, R) \
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_mask_mul_ss(__m128 __W, __mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_mul_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, __W);
}
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_maskz_mul_ss(__mmask8 __U,__m128 __A, __m128 __B) {
__A = _mm_mul_ss(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectss_128(__U, __A, _mm_setzero_ps());
}
#define _mm_mul_round_ss(A, B, R) \
(__m128)__builtin_ia32_mulss_round_mask((__v4sf)(__m128)(A), \
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_mask_mul_sd(__m128d __W, __mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_mul_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : __W[0];
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, __W);
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_maskz_mul_sd(__mmask8 __U,__m128d __A, __m128d __B) {
__A = _mm_mul_sd(__A, __B);
- __A[0] = (__U & 1) ? __A[0] : 0;
- return __A;
+ return __builtin_ia32_selectsd_128(__U, __A, _mm_setzero_pd());
}
#define _mm_mul_round_sd(A, B, R) \
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_mask_div_ss(__m128 __W, __mmask8 __U,__m128 __A, __m128 __B) {
- return (__m128) __builtin_ia32_divss_round_mask ((__v4sf) __A,
- (__v4sf) __B,
- (__v4sf) __W,
- (__mmask8) __U,
- _MM_FROUND_CUR_DIRECTION);
+ __A = _mm_div_ss(__A, __B);
+ return __builtin_ia32_selectss_128(__U, __A, __W);
}
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_maskz_div_ss(__mmask8 __U,__m128 __A, __m128 __B) {
- return (__m128) __builtin_ia32_divss_round_mask ((__v4sf) __A,
- (__v4sf) __B,
- (__v4sf) _mm_setzero_ps (),
- (__mmask8) __U,
- _MM_FROUND_CUR_DIRECTION);
+ __A = _mm_div_ss(__A, __B);
+ return __builtin_ia32_selectss_128(__U, __A, _mm_setzero_ps());
}
#define _mm_div_round_ss(A, B, R) \
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_mask_div_sd(__m128d __W, __mmask8 __U,__m128d __A, __m128d __B) {
- return (__m128d) __builtin_ia32_divsd_round_mask ((__v2df) __A,
- (__v2df) __B,
- (__v2df) __W,
- (__mmask8) __U,
- _MM_FROUND_CUR_DIRECTION);
+ __A = _mm_div_sd(__A, __B);
+ return __builtin_ia32_selectsd_128(__U, __A, __W);
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_maskz_div_sd(__mmask8 __U,__m128d __A, __m128d __B) {
- return (__m128d) __builtin_ia32_divsd_round_mask ((__v2df) __A,
- (__v2df) __B,
- (__v2df) _mm_setzero_pd (),
- (__mmask8) __U,
- _MM_FROUND_CUR_DIRECTION);
+ __A = _mm_div_sd(__A, __B);
+ return __builtin_ia32_selectsd_128(__U, __A, _mm_setzero_pd());
}
#define _mm_div_round_sd(A, B, R) \
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_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;
+ return __builtin_ia32_selectss_128(__U, _mm_move_ss(__A, __B), __W);
}
static __inline__ __m128 __DEFAULT_FN_ATTRS128
_mm_maskz_move_ss (__mmask8 __U, __m128 __A, __m128 __B)
{
- __m128 res = __A;
- res[0] = (__U & 1) ? __B[0] : 0;
- return res;
+ return __builtin_ia32_selectss_128(__U, _mm_move_ss(__A, __B),
+ _mm_setzero_ps());
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_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;
+ return __builtin_ia32_selectsd_128(__U, _mm_move_sd(__A, __B), __W);
}
static __inline__ __m128d __DEFAULT_FN_ATTRS128
_mm_maskz_move_sd (__mmask8 __U, __m128d __A, __m128d __B)
{
- __m128d res = __A;
- res[0] = (__U & 1) ? __B[0] : 0;
- return res;
+ return __builtin_ia32_selectsd_128(__U, _mm_move_sd(__A, __B),
+ _mm_setzero_pd());
}
static __inline__ void __DEFAULT_FN_ATTRS128
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fadd float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> %{{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_mask_add_ss(__W,__U,__A,__B);
}
__m128 test_mm_maskz_add_ss(__mmask8 __U, __m128 __A, __m128 __B) {
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fadd float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> %{{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_maskz_add_ss(__U,__A,__B);
}
__m128d test_mm_add_round_sd(__m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fadd double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_mask_add_sd(__W,__U,__A,__B);
}
__m128d test_mm_maskz_add_sd(__mmask8 __U, __m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fadd double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_maskz_add_sd(__U,__A,__B);
}
__m512d test_mm512_sub_round_pd(__m512d __A, __m512d __B) {
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fsub float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_mask_sub_ss(__W,__U,__A,__B);
}
__m128 test_mm_maskz_sub_ss(__mmask8 __U, __m128 __A, __m128 __B) {
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fsub float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_maskz_sub_ss(__U,__A,__B);
}
__m128d test_mm_sub_round_sd(__m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fsub double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_mask_sub_sd(__W,__U,__A,__B);
}
__m128d test_mm_maskz_sub_sd(__mmask8 __U, __m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fsub double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_maskz_sub_sd(__U,__A,__B);
}
__m512d test_mm512_mul_round_pd(__m512d __A, __m512d __B) {
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fmul float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_mask_mul_ss(__W,__U,__A,__B);
}
__m128 test_mm_maskz_mul_ss(__mmask8 __U, __m128 __A, __m128 __B) {
// CHECK: extractelement <4 x float> %{{.*}}, i32 0
// CHECK: fmul float %{{.*}}, %{{.*}}
// CHECK: insertelement <4 x float> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
+ // CHECK-NEXT: insertelement <4 x float> %{{.*}}, float %{{.*}}, i64 0
return _mm_maskz_mul_ss(__U,__A,__B);
}
__m128d test_mm_mul_round_sd(__m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fmul double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_mask_mul_sd(__W,__U,__A,__B);
}
__m128d test_mm_maskz_mul_sd(__mmask8 __U, __m128d __A, __m128d __B) {
// CHECK: extractelement <2 x double> %{{.*}}, i32 0
// CHECK: fmul double %{{.*}}, %{{.*}}
// CHECK: insertelement <2 x double> {{.*}}, i32 0
- // CHECK: and i32 {{.*}}, 1
- // CHECK: icmp ne i32 %{{.*}}, 0
- // CHECK: br {{.*}}, {{.*}}, {{.*}}
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
+ // CHECK-NEXT: insertelement <2 x double> %{{.*}}, double %{{.*}}, i64 0
return _mm_maskz_mul_sd(__U,__A,__B);
}
__m512d test_mm512_div_round_pd(__m512d __A, __m512d __B) {
}
__m128 test_mm_mask_div_ss(__m128 __W, __mmask8 __U, __m128 __A, __m128 __B) {
// CHECK-LABEL: @test_mm_mask_div_ss
+ // CHECK: extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: fdiv float %{{.*}}, %{{.*}}
+ // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
// CHECK: extractelement <4 x float> %{{.*}}, i64 0
// CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
- // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
- // CHECK-NEXT: fdiv float %{{.*}}, %{{.*}}
// CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
// CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
// CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
}
__m128 test_mm_maskz_div_ss(__mmask8 __U, __m128 __A, __m128 __B) {
// CHECK-LABEL: @test_mm_maskz_div_ss
+ // CHECK: extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: fdiv float %{{.*}}, %{{.*}}
+ // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
// CHECK: extractelement <4 x float> %{{.*}}, i64 0
// CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
- // CHECK-NEXT: extractelement <4 x float> %{{.*}}, i64 0
- // CHECK-NEXT: fdiv float %{{.*}}, %{{.*}}
// CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
// CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
// CHECK-NEXT: select i1 %{{.*}}, float %{{.*}}, float %{{.*}}
}
__m128d test_mm_mask_div_sd(__m128d __W, __mmask8 __U, __m128d __A, __m128d __B) {
// CHECK-LABEL: @test_mm_mask_div_sd
+ // CHECK: extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: fdiv double %{{.*}}, %{{.*}}
+ // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
// CHECK: extractelement <2 x double> %{{.*}}, i64 0
// CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
- // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
- // CHECK-NEXT: fdiv double %{{.*}}, %{{.*}}
// CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
// CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
// CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
}
__m128d test_mm_maskz_div_sd(__mmask8 __U, __m128d __A, __m128d __B) {
// CHECK-LABEL: @test_mm_maskz_div_sd
+ // CHECK: extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: fdiv double %{{.*}}, %{{.*}}
+ // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
// CHECK: extractelement <2 x double> %{{.*}}, i64 0
// CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
- // CHECK-NEXT: extractelement <2 x double> %{{.*}}, i64 0
- // CHECK-NEXT: fdiv double %{{.*}}, %{{.*}}
// CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
// CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
// CHECK-NEXT: select i1 %{{.*}}, double %{{.*}}, double %{{.*}}
__m128 test_mm_mask_move_ss (__m128 __W, __mmask8 __U, __m128 __A, __m128 __B)
{
// CHECK-LABEL: @test_mm_mask_move_ss
- // CHECK: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: phi float [ %{{.*}}, %{{.*}} ], [ %{{.*}}, %{{.*}} ]
- // CHECK: insertelement <4 x float> %{{.*}}, float %cond.i, i32 0
+ // CHECK: [[EXT:%.*]] = extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: insertelement <4 x float> %{{.*}}, float [[EXT]], i32 0
+ // CHECK: [[A:%.*]] = extractelement <4 x float> [[VEC:%.*]], i64 0
+ // CHECK-NEXT: [[B:%.*]] = extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: [[SEL:%.*]] = select i1 %{{.*}}, float [[A]], float [[B]]
+ // CHECK-NEXT: insertelement <4 x float> [[VEC]], float [[SEL]], i64 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: extractelement <4 x float> %{{.*}}, i32 0
- // CHECK: phi float [ %{{.*}}, %{{.*}} ], [ 0.000000e+00, %{{.*}} ]
- // CHECK: insertelement <4 x float> %{{.*}}, float %{{.*}}, i32 0
+ // CHECK: [[EXT:%.*]] = extractelement <4 x float> %{{.*}}, i32 0
+ // CHECK: insertelement <4 x float> %{{.*}}, float [[EXT]], i32 0
+ // CHECK: [[A:%.*]] = extractelement <4 x float> [[VEC:%.*]], i64 0
+ // CHECK-NEXT: [[B:%.*]] = extractelement <4 x float> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: [[SEL:%.*]] = select i1 %{{.*}}, float [[A]], float [[B]]
+ // CHECK-NEXT: insertelement <4 x float> [[VEC]], float [[SEL]], i64 0
return _mm_maskz_move_ss (__U, __A, __B);
}
__m128d test_mm_mask_move_sd (__m128d __W, __mmask8 __U, __m128d __A, __m128d __B)
{
// CHECK-LABEL: @test_mm_mask_move_sd
- // CHECK: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: phi double [ %{{.*}}, %{{.*}} ], [ %{{.*}}, %{{.*}} ]
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: [[EXT:%.*]] = extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: insertelement <2 x double> %{{.*}}, double [[EXT]], i32 0
+ // CHECK: [[A:%.*]] = extractelement <2 x double> [[VEC:%.*]], i64 0
+ // CHECK-NEXT: [[B:%.*]] = extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: [[SEL:%.*]] = select i1 %{{.*}}, double [[A]], double [[B]]
+ // CHECK-NEXT: insertelement <2 x double> [[VEC]], double [[SEL]], i64 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: extractelement <2 x double> %{{.*}}, i32 0
- // CHECK: phi double [ %{{.*}}, %{{.*}} ], [ 0.000000e+00, %{{.*}} ]
- // CHECK: insertelement <2 x double> %{{.*}}, double %{{.*}}, i32 0
+ // CHECK: [[EXT:%.*]] = extractelement <2 x double> %{{.*}}, i32 0
+ // CHECK: insertelement <2 x double> %{{.*}}, double [[EXT]], i32 0
+ // CHECK: [[A:%.*]] = extractelement <2 x double> [[VEC:%.*]], i64 0
+ // CHECK-NEXT: [[B:%.*]] = extractelement <2 x double> %{{.*}}, i64 0
+ // CHECK-NEXT: bitcast i8 %{{.*}} to <8 x i1>
+ // CHECK-NEXT: extractelement <8 x i1> %{{.*}}, i64 0
+ // CHECK-NEXT: [[SEL:%.*]] = select i1 %13, double [[A]], double [[B]]
+ // CHECK-NEXT: insertelement <2 x double> [[VEC]], double [[SEL]], i64 0
return _mm_maskz_move_sd (__U, __A, __B);
}