Commit f13eae6a by H.J. Lu Committed by H.J. Lu

i386.c (construct_container): Rewrite processing BLKmode with X86_64_SSE_CLASS.

2009-02-12  H.J. Lu  <hongjiu.lu@intel.com>

	* config/i386/i386.c (construct_container): Rewrite processing
	BLKmode with X86_64_SSE_CLASS.

From-SVN: r144128
parent 552af634
2009-02-12 H.J. Lu <hongjiu.lu@intel.com>
* config/i386/i386.c (construct_container): Rewrite processing
BLKmode with X86_64_SSE_CLASS.
2009-02-12 Paolo Bonzini <bonzini@gnu.org> 2009-02-12 Paolo Bonzini <bonzini@gnu.org>
PR target/39152 PR target/39152
......
...@@ -5315,6 +5315,8 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode, ...@@ -5315,6 +5315,8 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
/* Otherwise figure out the entries of the PARALLEL. */ /* Otherwise figure out the entries of the PARALLEL. */
for (i = 0; i < n; i++) for (i = 0; i < n; i++)
{ {
int pos;
switch (regclass[i]) switch (regclass[i])
{ {
case X86_64_NO_CLASS: case X86_64_NO_CLASS:
...@@ -5351,24 +5353,36 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode, ...@@ -5351,24 +5353,36 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
sse_regno++; sse_regno++;
break; break;
case X86_64_SSE_CLASS: case X86_64_SSE_CLASS:
if (i < n - 1 && regclass[i + 1] == X86_64_SSEUP_CLASS) pos = i;
switch (n)
{ {
if (regclass[i + 2] == X86_64_SSEUP_CLASS case 1:
|| regclass[i + 3] == X86_64_SSEUP_CLASS) tmpmode = DImode;
tmpmode = OImode; break;
case 2:
if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
{
tmpmode = TImode;
i++;
}
else else
tmpmode = TImode; tmpmode = DImode;
break;
case 4:
gcc_assert (i == 0
&& regclass[1] == X86_64_SSEUP_CLASS
&& regclass[2] == X86_64_SSEUP_CLASS
&& regclass[3] == X86_64_SSEUP_CLASS);
tmpmode = OImode;
i += 3;
break;
default:
gcc_unreachable ();
} }
else
tmpmode = DImode;
exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode, exp [nexps++] = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (tmpmode, gen_rtx_REG (tmpmode,
SSE_REGNO (sse_regno)), SSE_REGNO (sse_regno)),
GEN_INT (i*8)); GEN_INT (pos*8));
if (tmpmode == OImode)
i += 3;
else if (tmpmode == TImode)
i++;
sse_regno++; sse_regno++;
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment