* config/i386/i386.c (construct_container): Rewrite processing
BLKmode with X86_64_SSE_CLASS.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@144128
138bc75d-0d04-0410-961f-
82ee72b054a4
+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>
PR target/39152
/* Otherwise figure out the entries of the PARALLEL. */
for (i = 0; i < n; i++)
{
+ int pos;
+
switch (regclass[i])
{
case X86_64_NO_CLASS:
sse_regno++;
break;
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
- || regclass[i + 3] == X86_64_SSEUP_CLASS)
- tmpmode = OImode;
+ case 1:
+ tmpmode = DImode;
+ break;
+ case 2:
+ if (i == 0 && regclass[1] == X86_64_SSEUP_CLASS)
+ {
+ tmpmode = TImode;
+ i++;
+ }
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,
gen_rtx_REG (tmpmode,
SSE_REGNO (sse_regno)),
- GEN_INT (i*8));
- if (tmpmode == OImode)
- i += 3;
- else if (tmpmode == TImode)
- i++;
+ GEN_INT (pos*8));
sse_regno++;
break;
default: