@@ -44720,6 +44720,8 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
44720
44720
{ gen_vec_set_lo_v4df, gen_vec_set_hi_v4df }
44721
44721
};
44722
44722
int i, j, n;
44723
+ machine_mode mmode = VOIDmode;
44724
+ rtx (*gen_blendm) (rtx, rtx, rtx, rtx);
44723
44725
44724
44726
switch (mode)
44725
44727
{
@@ -44936,75 +44938,64 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
44936
44938
case V8DFmode:
44937
44939
if (TARGET_AVX512F)
44938
44940
{
44939
- tmp = gen_reg_rtx (mode);
44940
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44941
- emit_insn (gen_avx512f_blendmv8df (target, tmp, target,
44942
- force_reg (QImode, GEN_INT (1 << elt))));
44943
- return;
44941
+ mmode = QImode;
44942
+ gen_blendm = gen_avx512f_blendmv8df;
44944
44943
}
44945
- else
44946
- break;
44944
+ break;
44945
+
44947
44946
case V8DImode:
44948
44947
if (TARGET_AVX512F)
44949
44948
{
44950
- tmp = gen_reg_rtx (mode);
44951
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44952
- emit_insn (gen_avx512f_blendmv8di (target, tmp, target,
44953
- force_reg (QImode, GEN_INT (1 << elt))));
44954
- return;
44949
+ mmode = QImode;
44950
+ gen_blendm = gen_avx512f_blendmv8di;
44955
44951
}
44956
- else
44957
- break;
44952
+ break;
44953
+
44958
44954
case V16SFmode:
44959
44955
if (TARGET_AVX512F)
44960
44956
{
44961
- tmp = gen_reg_rtx (mode);
44962
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44963
- emit_insn (gen_avx512f_blendmv16sf (target, tmp, target,
44964
- force_reg (HImode, GEN_INT (1 << elt))));
44965
- return;
44957
+ mmode = HImode;
44958
+ gen_blendm = gen_avx512f_blendmv16sf;
44966
44959
}
44967
- else
44968
- break;
44960
+ break;
44961
+
44969
44962
case V16SImode:
44970
44963
if (TARGET_AVX512F)
44971
44964
{
44972
- tmp = gen_reg_rtx (mode);
44973
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44974
- emit_insn (gen_avx512f_blendmv16si (target, tmp, target,
44975
- force_reg (HImode, GEN_INT (1 << elt))));
44976
- return;
44965
+ mmode = HImode;
44966
+ gen_blendm = gen_avx512f_blendmv16si;
44977
44967
}
44978
- else
44979
- break;
44968
+ break;
44969
+
44980
44970
case V32HImode:
44981
44971
if (TARGET_AVX512F && TARGET_AVX512BW)
44982
44972
{
44983
- tmp = gen_reg_rtx (mode);
44984
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44985
- emit_insn (gen_avx512bw_blendmv32hi (target, tmp, target,
44986
- force_reg (SImode, GEN_INT (1 << elt))));
44987
- return;
44973
+ mmode = SImode;
44974
+ gen_blendm = gen_avx512bw_blendmv32hi;
44988
44975
}
44989
- else
44990
- break;
44976
+ break;
44977
+
44991
44978
case V64QImode:
44992
44979
if (TARGET_AVX512F && TARGET_AVX512BW)
44993
44980
{
44994
- tmp = gen_reg_rtx (mode);
44995
- emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44996
- emit_insn (gen_avx512bw_blendmv64qi (target, tmp, target,
44997
- force_reg (DImode, GEN_INT (1 << elt))));
44998
- return;
44981
+ mmode = DImode;
44982
+ gen_blendm = gen_avx512bw_blendmv64qi;
44999
44983
}
45000
- else
45001
- break;
44984
+ break;
45002
44985
45003
44986
default:
45004
44987
break;
45005
44988
}
45006
44989
45007
- if (use_vec_merge)
44990
+ if (mmode != VOIDmode)
44991
+ {
44992
+ tmp = gen_reg_rtx (mode);
44993
+ emit_insn (gen_rtx_SET (tmp, gen_rtx_VEC_DUPLICATE (mode, val)));
44994
+ emit_insn (gen_blendm (target, tmp, target,
44995
+ force_reg (mmode,
44996
+ gen_int_mode (1 << elt, mmode))));
44997
+ }
44998
+ else if (use_vec_merge)
45008
44999
{
45009
45000
tmp = gen_rtx_VEC_DUPLICATE (mode, val);
45010
45001
tmp = gen_rtx_VEC_MERGE (mode, tmp, target, GEN_INT (1 << elt));
0 commit comments