aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorH.J. Lu <hongjiu.lu@intel.com>2009-02-12 14:42:20 +0000
committerH.J. Lu <hjl@gcc.gnu.org>2009-02-12 06:42:20 -0800
commitf13eae6a01621a23b36bac6a3cec53bb217ba1e4 (patch)
treeab586725508103cf36781be4d8890e787384e791 /gcc
parent552af6341205ea47b9a70cfbf9157764c3975807 (diff)
downloadgcc-f13eae6a01621a23b36bac6a3cec53bb217ba1e4.zip
gcc-f13eae6a01621a23b36bac6a3cec53bb217ba1e4.tar.gz
gcc-f13eae6a01621a23b36bac6a3cec53bb217ba1e4.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/config/i386/i386.c38
2 files changed, 31 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6efef4c..4a8c282 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index 3e02102..709d7d3 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -5315,6 +5315,8 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
/* Otherwise figure out the entries of the PARALLEL. */
for (i = 0; i < n; i++)
{
+ int pos;
+
switch (regclass[i])
{
case X86_64_NO_CLASS:
@@ -5351,24 +5353,36 @@ construct_container (enum machine_mode mode, enum machine_mode orig_mode,
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: