aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/config/i386/i386-expand.c265
1 files changed, 96 insertions, 169 deletions
diff --git a/gcc/config/i386/i386-expand.c b/gcc/config/i386/i386-expand.c
index 0318f12..c740d6e 100644
--- a/gcc/config/i386/i386-expand.c
+++ b/gcc/config/i386/i386-expand.c
@@ -6211,8 +6211,7 @@ ix86_expand_v1ti_to_ti (rtx x)
rtx result = gen_reg_rtx (TImode);
if (TARGET_SSE2)
{
- rtx temp = gen_reg_rtx (V2DImode);
- emit_move_insn (temp, gen_lowpart (V2DImode, x));
+ rtx temp = force_reg (V2DImode, gen_lowpart (V2DImode, x));
rtx lo = gen_lowpart (DImode, result);
emit_insn (gen_vec_extractv2didi (lo, temp, const0_rtx));
rtx hi = gen_highpart (DImode, result);
@@ -6227,18 +6226,16 @@ ix86_expand_v1ti_to_ti (rtx x)
static rtx
ix86_expand_ti_to_v1ti (rtx x)
{
- rtx result = gen_reg_rtx (V1TImode);
if (TARGET_SSE2)
{
rtx lo = gen_lowpart (DImode, x);
rtx hi = gen_highpart (DImode, x);
rtx tmp = gen_reg_rtx (V2DImode);
emit_insn (gen_vec_concatv2di (tmp, lo, hi));
- emit_move_insn (result, gen_lowpart (V1TImode, tmp));
+ return force_reg (V1TImode, gen_lowpart (V1TImode, tmp));
}
- else
- emit_move_insn (result, gen_lowpart (V1TImode, x));
- return result;
+
+ return force_reg (V1TImode, gen_lowpart (V1TImode, x));
}
/* Expand V1TI mode shift (of rtx_code CODE) by constant. */
@@ -6285,8 +6282,7 @@ ix86_expand_v1ti_shift (enum rtx_code code, rtx operands[])
emit_insn (gen_sse2_lshrv1ti3 (tmp1, op1, GEN_INT (64)));
/* tmp2 is operands[1] shifted by 64, in V2DImode. */
- rtx tmp2 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp2, gen_lowpart (V2DImode, tmp1));
+ rtx tmp2 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp1));
/* tmp3 will be the V2DImode result. */
rtx tmp3 = gen_reg_rtx (V2DImode);
@@ -6301,8 +6297,7 @@ ix86_expand_v1ti_shift (enum rtx_code code, rtx operands[])
else
{
/* tmp4 is operands[1], in V2DImode. */
- rtx tmp4 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, op1));
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, op1));
rtx tmp5 = gen_reg_rtx (V2DImode);
if (code == ASHIFT)
@@ -6320,8 +6315,7 @@ ix86_expand_v1ti_shift (enum rtx_code code, rtx operands[])
}
/* Convert the result back to V1TImode and store in operands[0]. */
- rtx tmp7 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp7, gen_lowpart (V1TImode, tmp3));
+ rtx tmp7 = force_reg (V1TImode, gen_lowpart (V1TImode, tmp3));
emit_move_insn (operands[0], tmp7);
}
@@ -6356,19 +6350,15 @@ ix86_expand_v1ti_rotate (enum rtx_code code, rtx operands[])
if ((bits & 31) == 0)
{
- rtx tmp1 = gen_reg_rtx (V4SImode);
rtx tmp2 = gen_reg_rtx (V4SImode);
- rtx tmp3 = gen_reg_rtx (V1TImode);
-
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
if (bits == 32)
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0x93)));
else if (bits == 64)
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0x4e)));
else
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0x39)));
- emit_move_insn (tmp3, gen_lowpart (V1TImode, tmp2));
- emit_move_insn (operands[0], tmp3);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp2));
return;
}
@@ -6385,8 +6375,7 @@ ix86_expand_v1ti_rotate (enum rtx_code code, rtx operands[])
return;
}
- rtx op1_v4si = gen_reg_rtx (V4SImode);
- emit_move_insn (op1_v4si, gen_lowpart (V4SImode, op1));
+ rtx op1_v4si = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx lobits;
rtx hibits;
@@ -6423,13 +6412,12 @@ ix86_expand_v1ti_rotate (enum rtx_code code, rtx operands[])
rtx tmp1 = gen_reg_rtx (V4SImode);
rtx tmp2 = gen_reg_rtx (V4SImode);
rtx tmp3 = gen_reg_rtx (V4SImode);
- rtx tmp4 = gen_reg_rtx (V1TImode);
emit_insn (gen_ashlv4si3 (tmp1, lobits, GEN_INT (bits & 31)));
emit_insn (gen_lshrv4si3 (tmp2, hibits, GEN_INT (32 - (bits & 31))));
emit_insn (gen_iorv4si3 (tmp3, tmp1, tmp2));
- emit_move_insn (tmp4, gen_lowpart (V1TImode, tmp3));
- emit_move_insn (operands[0], tmp4);
+
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp3));
}
/* Expand V1TI mode ashiftrt by constant. */
@@ -6459,67 +6447,72 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
if (bits == 127)
{
/* Two operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg(V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
emit_insn (gen_ashrv4si3 (tmp3, tmp2, GEN_INT (31)));
- rtx tmp4 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp4, gen_lowpart (V1TImode, tmp3));
- emit_move_insn (operands[0], tmp4);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp3));
return;
}
if (bits == 64)
{
/* Three operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg(V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
emit_insn (gen_ashrv4si3 (tmp3, tmp2, GEN_INT (31)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
- rtx tmp5 = gen_reg_rtx (V2DImode);
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp1));
+ rtx tmp5 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp3));
rtx tmp6 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, tmp1));
- emit_move_insn (tmp5, gen_lowpart (V2DImode, tmp3));
emit_insn (gen_vec_interleave_highv2di (tmp6, tmp4, tmp5));
- rtx tmp7 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp7, gen_lowpart (V1TImode, tmp6));
- emit_move_insn (operands[0], tmp7);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp6));
return;
}
if (bits == 96)
{
/* Three operations. */
- rtx tmp3 = gen_reg_rtx (V2DImode);
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg(V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (31)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
+ rtx tmp3 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp1));
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp2));
rtx tmp5 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp3, gen_lowpart (V2DImode, tmp1));
- emit_move_insn (tmp4, gen_lowpart (V2DImode, tmp2));
emit_insn (gen_vec_interleave_highv2di (tmp5, tmp3, tmp4));
- rtx tmp6 = gen_reg_rtx (V4SImode);
+ rtx tmp6 = force_reg(V4SImode, gen_lowpart (V4SImode, tmp5));
rtx tmp7 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp6, gen_lowpart (V4SImode, tmp5));
emit_insn (gen_sse2_pshufd (tmp7, tmp6, GEN_INT (0xfd)));
- rtx tmp8 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp8, gen_lowpart (V1TImode, tmp7));
- emit_move_insn (operands[0], tmp8);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp7));
+ return;
+ }
+
+ if (bits >= 111)
+ {
+ /* Three operations. */
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
+ rtx tmp2 = gen_reg_rtx (V4SImode);
+ emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (bits - 96)));
+
+ rtx tmp3 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp2));
+ rtx tmp4 = gen_reg_rtx (V8HImode);
+ emit_insn (gen_sse2_pshufhw (tmp4, tmp3, GEN_INT (0xfe)));
+
+ rtx tmp5 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp4));
+ rtx tmp6 = gen_reg_rtx (V4SImode);
+ emit_insn (gen_sse2_pshufd (tmp6, tmp5, GEN_INT (0xfe)));
+
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp6));
return;
}
@@ -6528,9 +6521,8 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
/* Three operations. */
if (bits == 32)
{
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (31)));
rtx tmp3 = gen_reg_rtx (V1TImode);
@@ -6538,29 +6530,22 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
if (TARGET_AVX2)
{
- rtx tmp4 = gen_reg_rtx (V4SImode);
+ rtx tmp4 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp3));
rtx tmp5 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp4, gen_lowpart (V4SImode, tmp3));
emit_insn (gen_avx2_pblenddv4si (tmp5, tmp2, tmp4,
GEN_INT (7)));
- rtx tmp6 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp6, gen_lowpart (V1TImode, tmp5));
- emit_move_insn (operands[0], tmp6);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp5));
}
else
{
- rtx tmp4 = gen_reg_rtx (V8HImode);
- rtx tmp5 = gen_reg_rtx (V8HImode);
+ rtx tmp4 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp2));
+ rtx tmp5 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp3));
rtx tmp6 = gen_reg_rtx (V8HImode);
- emit_move_insn (tmp4, gen_lowpart (V8HImode, tmp2));
- emit_move_insn (tmp5, gen_lowpart (V8HImode, tmp3));
emit_insn (gen_sse4_1_pblendw (tmp6, tmp4, tmp5,
GEN_INT (0x3f)));
- rtx tmp7 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp7, gen_lowpart (V1TImode, tmp6));
- emit_move_insn (operands[0], tmp7);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp6));
}
return;
}
@@ -6568,9 +6553,8 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
/* Three operations. */
if (bits == 8 || bits == 16 || bits == 24)
{
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (bits)));
rtx tmp3 = gen_reg_rtx (V1TImode);
@@ -6578,29 +6562,22 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
if (TARGET_AVX2)
{
- rtx tmp4 = gen_reg_rtx (V4SImode);
+ rtx tmp4 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp3));
rtx tmp5 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp4, gen_lowpart (V4SImode, tmp3));
emit_insn (gen_avx2_pblenddv4si (tmp5, tmp2, tmp4,
GEN_INT (7)));
- rtx tmp6 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp6, gen_lowpart (V1TImode, tmp5));
- emit_move_insn (operands[0], tmp6);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp5));
}
else
{
- rtx tmp4 = gen_reg_rtx (V8HImode);
- rtx tmp5 = gen_reg_rtx (V8HImode);
+ rtx tmp4 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp2));
+ rtx tmp5 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp3));
rtx tmp6 = gen_reg_rtx (V8HImode);
- emit_move_insn (tmp4, gen_lowpart (V8HImode, tmp2));
- emit_move_insn (tmp5, gen_lowpart (V8HImode, tmp3));
emit_insn (gen_sse4_1_pblendw (tmp6, tmp4, tmp5,
GEN_INT (0x3f)));
- rtx tmp7 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp7, gen_lowpart (V1TImode, tmp6));
- emit_move_insn (operands[0], tmp7);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp6));
}
return;
}
@@ -6609,38 +6586,31 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
if (bits > 96)
{
/* Four operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (bits - 96)));
rtx tmp3 = gen_reg_rtx (V4SImode);
emit_insn (gen_ashrv4si3 (tmp3, tmp1, GEN_INT (31)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
- rtx tmp5 = gen_reg_rtx (V2DImode);
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp2));
+ rtx tmp5 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp3));
rtx tmp6 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, tmp2));
- emit_move_insn (tmp5, gen_lowpart (V2DImode, tmp3));
emit_insn (gen_vec_interleave_highv2di (tmp6, tmp4, tmp5));
- rtx tmp7 = gen_reg_rtx (V4SImode);
+ rtx tmp7 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp6));
rtx tmp8 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp7, gen_lowpart (V4SImode, tmp6));
emit_insn (gen_sse2_pshufd (tmp8, tmp7, GEN_INT (0xfd)));
- rtx tmp9 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp9, gen_lowpart (V1TImode, tmp8));
- emit_move_insn (operands[0], tmp9);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp8));
return;
}
if (TARGET_SSE4_1 && (bits == 48 || bits == 80))
{
/* Four operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
@@ -6649,26 +6619,21 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp4 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp4, op1, GEN_INT (bits)));
- rtx tmp5 = gen_reg_rtx (V8HImode);
- rtx tmp6 = gen_reg_rtx (V8HImode);
+ rtx tmp5 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp3));
+ rtx tmp6 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp4));
rtx tmp7 = gen_reg_rtx (V8HImode);
- emit_move_insn (tmp5, gen_lowpart (V8HImode, tmp3));
- emit_move_insn (tmp6, gen_lowpart (V8HImode, tmp4));
emit_insn (gen_sse4_1_pblendw (tmp7, tmp5, tmp6,
GEN_INT (bits == 48 ? 0x1f : 0x07)));
- rtx tmp8 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp8, gen_lowpart (V1TImode, tmp7));
- emit_move_insn (operands[0], tmp8);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp7));
return;
}
if ((bits & 7) == 0)
{
/* Five operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
@@ -6677,93 +6642,75 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp4 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp4, op1, GEN_INT (bits)));
- rtx tmp5 = gen_reg_rtx (V1TImode);
+ rtx tmp5 = force_reg (V1TImode, gen_lowpart (V1TImode, tmp3));
rtx tmp6 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp5, gen_lowpart (V1TImode, tmp3));
emit_insn (gen_sse2_ashlv1ti3 (tmp6, tmp5, GEN_INT (128 - bits)));
- rtx tmp7 = gen_reg_rtx (V2DImode);
- rtx tmp8 = gen_reg_rtx (V2DImode);
+ rtx tmp7 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp4));
+ rtx tmp8 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp6));
rtx tmp9 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp7, gen_lowpart (V2DImode, tmp4));
- emit_move_insn (tmp8, gen_lowpart (V2DImode, tmp6));
emit_insn (gen_iorv2di3 (tmp9, tmp7, tmp8));
- rtx tmp10 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp10, gen_lowpart (V1TImode, tmp9));
- emit_move_insn (operands[0], tmp10);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp9));
return;
}
if (TARGET_AVX2 && bits < 32)
{
/* Six operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (bits)));
rtx tmp3 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp3, op1, GEN_INT (64)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, op1));
rtx tmp5 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, op1));
emit_insn (gen_lshrv2di3 (tmp5, tmp4, GEN_INT (bits)));
- rtx tmp6 = gen_reg_rtx (V2DImode);
+ rtx tmp6 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp3));
rtx tmp7 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp6, gen_lowpart (V2DImode, tmp3));
emit_insn (gen_ashlv2di3 (tmp7, tmp6, GEN_INT (64 - bits)));
rtx tmp8 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp8, tmp5, tmp7));
- rtx tmp9 = gen_reg_rtx (V4SImode);
+ rtx tmp9 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp8));
rtx tmp10 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp9, gen_lowpart (V4SImode, tmp8));
emit_insn (gen_avx2_pblenddv4si (tmp10, tmp2, tmp9, GEN_INT (7)));
- rtx tmp11 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp11, gen_lowpart (V1TImode, tmp10));
- emit_move_insn (operands[0], tmp11);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp10));
return;
}
if (TARGET_SSE4_1 && bits < 15)
{
/* Six operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_ashrv4si3 (tmp2, tmp1, GEN_INT (bits)));
rtx tmp3 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp3, op1, GEN_INT (64)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, op1));
rtx tmp5 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, op1));
emit_insn (gen_lshrv2di3 (tmp5, tmp4, GEN_INT (bits)));
- rtx tmp6 = gen_reg_rtx (V2DImode);
+ rtx tmp6 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp3));
rtx tmp7 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp6, gen_lowpart (V2DImode, tmp3));
emit_insn (gen_ashlv2di3 (tmp7, tmp6, GEN_INT (64 - bits)));
rtx tmp8 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp8, tmp5, tmp7));
- rtx tmp9 = gen_reg_rtx (V8HImode);
- rtx tmp10 = gen_reg_rtx (V8HImode);
+ rtx tmp9 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp2));
+ rtx tmp10 = force_reg (V8HImode, gen_lowpart (V8HImode, tmp8));
rtx tmp11 = gen_reg_rtx (V8HImode);
- emit_move_insn (tmp9, gen_lowpart (V8HImode, tmp2));
- emit_move_insn (tmp10, gen_lowpart (V8HImode, tmp8));
emit_insn (gen_sse4_1_pblendw (tmp11, tmp9, tmp10, GEN_INT (0x3f)));
- rtx tmp12 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp12, gen_lowpart (V1TImode, tmp11));
- emit_move_insn (operands[0], tmp12);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp11));
return;
}
@@ -6773,14 +6720,12 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp1 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp1, op1, GEN_INT (64)));
- rtx tmp2 = gen_reg_rtx (V2DImode);
+ rtx tmp2 = force_reg (V2DImode, gen_lowpart (V2DImode, op1));
rtx tmp3 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp2, gen_lowpart (V2DImode, op1));
emit_insn (gen_lshrv2di3 (tmp3, tmp2, GEN_INT (1)));
- rtx tmp4 = gen_reg_rtx (V2DImode);
+ rtx tmp4 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp1));
rtx tmp5 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp4, gen_lowpart (V2DImode, tmp1));
emit_insn (gen_ashlv2di3 (tmp5, tmp4, GEN_INT (63)));
rtx tmp6 = gen_reg_rtx (V2DImode);
@@ -6789,31 +6734,26 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp7 = gen_reg_rtx (V2DImode);
emit_insn (gen_lshrv2di3 (tmp7, tmp2, GEN_INT (63)));
- rtx tmp8 = gen_reg_rtx (V4SImode);
+ rtx tmp8 = force_reg (V4SImode, gen_lowpart (V4SImode, tmp7));
rtx tmp9 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp8, gen_lowpart (V4SImode, tmp7));
emit_insn (gen_sse2_pshufd (tmp9, tmp8, GEN_INT (0xbf)));
- rtx tmp10 = gen_reg_rtx (V2DImode);
+ rtx tmp10 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp9));
rtx tmp11 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp10, gen_lowpart (V2DImode, tmp9));
emit_insn (gen_ashlv2di3 (tmp11, tmp10, GEN_INT (31)));
rtx tmp12 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp12, tmp6, tmp11));
- rtx tmp13 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp13, gen_lowpart (V1TImode, tmp12));
- emit_move_insn (operands[0], tmp13);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp12));
return;
}
if (bits > 64)
{
/* Eight operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
@@ -6822,39 +6762,32 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp4 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp4, op1, GEN_INT (64)));
- rtx tmp5 = gen_reg_rtx (V2DImode);
+ rtx tmp5 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp4));
rtx tmp6 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp5, gen_lowpart (V2DImode, tmp4));
emit_insn (gen_lshrv2di3 (tmp6, tmp5, GEN_INT (bits - 64)));
- rtx tmp7 = gen_reg_rtx (V1TImode);
+ rtx tmp7 = force_reg (V1TImode, gen_lowpart (V1TImode, tmp3));
rtx tmp8 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp7, gen_lowpart (V1TImode, tmp3));
emit_insn (gen_sse2_ashlv1ti3 (tmp8, tmp7, GEN_INT (64)));
- rtx tmp9 = gen_reg_rtx (V2DImode);
+ rtx tmp9 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp3));
rtx tmp10 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp9, gen_lowpart (V2DImode, tmp3));
emit_insn (gen_ashlv2di3 (tmp10, tmp9, GEN_INT (128 - bits)));
- rtx tmp11 = gen_reg_rtx (V2DImode);
+ rtx tmp11 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp8));
rtx tmp12 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp11, gen_lowpart (V2DImode, tmp8));
emit_insn (gen_iorv2di3 (tmp12, tmp10, tmp11));
rtx tmp13 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp13, tmp6, tmp12));
- rtx tmp14 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp14, gen_lowpart (V1TImode, tmp13));
- emit_move_insn (operands[0], tmp14);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp13));
}
else
{
/* Nine operations. */
- rtx tmp1 = gen_reg_rtx (V4SImode);
+ rtx tmp1 = force_reg (V4SImode, gen_lowpart (V4SImode, op1));
rtx tmp2 = gen_reg_rtx (V4SImode);
- emit_move_insn (tmp1, gen_lowpart (V4SImode, op1));
emit_insn (gen_sse2_pshufd (tmp2, tmp1, GEN_INT (0xff)));
rtx tmp3 = gen_reg_rtx (V4SImode);
@@ -6863,35 +6796,29 @@ ix86_expand_v1ti_ashiftrt (rtx operands[])
rtx tmp4 = gen_reg_rtx (V1TImode);
emit_insn (gen_sse2_lshrv1ti3 (tmp4, op1, GEN_INT (64)));
- rtx tmp5 = gen_reg_rtx (V2DImode);
+ rtx tmp5 = force_reg (V2DImode, gen_lowpart (V2DImode, op1));
rtx tmp6 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp5, gen_lowpart (V2DImode, op1));
emit_insn (gen_lshrv2di3 (tmp6, tmp5, GEN_INT (bits)));
- rtx tmp7 = gen_reg_rtx (V2DImode);
+ rtx tmp7 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp4));
rtx tmp8 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp7, gen_lowpart (V2DImode, tmp4));
emit_insn (gen_ashlv2di3 (tmp8, tmp7, GEN_INT (64 - bits)));
rtx tmp9 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp9, tmp6, tmp8));
- rtx tmp10 = gen_reg_rtx (V1TImode);
+ rtx tmp10 = force_reg (V1TImode, gen_lowpart (V1TImode, tmp3));
rtx tmp11 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp10, gen_lowpart (V1TImode, tmp3));
emit_insn (gen_sse2_ashlv1ti3 (tmp11, tmp10, GEN_INT (64)));
- rtx tmp12 = gen_reg_rtx (V2DImode);
+ rtx tmp12 = force_reg (V2DImode, gen_lowpart (V2DImode, tmp11));
rtx tmp13 = gen_reg_rtx (V2DImode);
- emit_move_insn (tmp12, gen_lowpart (V2DImode, tmp11));
emit_insn (gen_ashlv2di3 (tmp13, tmp12, GEN_INT (64 - bits)));
rtx tmp14 = gen_reg_rtx (V2DImode);
emit_insn (gen_iorv2di3 (tmp14, tmp9, tmp13));
- rtx tmp15 = gen_reg_rtx (V1TImode);
- emit_move_insn (tmp15, gen_lowpart (V1TImode, tmp14));
- emit_move_insn (operands[0], tmp15);
+ emit_move_insn (operands[0], gen_lowpart (V1TImode, tmp14));
}
}