File gcc-amdfam10-suse-20.patch of Package gcc41

Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in.orig	2009-11-20 13:41:52.000000000 +0100
+++ gcc/Makefile.in	2009-11-20 13:42:55.000000000 +0100
@@ -1975,7 +1975,7 @@ tree-data-ref.o: tree-data-ref.c $(CONFI
    $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
    $(TREE_DATA_REF_H) $(SCEV_H) tree-pass.h tree-chrec.h
 tree-vect-analyze.o: tree-vect-analyze.c $(CONFIG_H) $(SYSTEM_H) coretypes.h \
-   $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(BASIC_BLOCK_H) \
+   $(TM_H) $(GGC_H) $(OPTABS_H) $(TREE_H) $(TARGET_H) $(BASIC_BLOCK_H) \
    $(DIAGNOSTIC_H) $(TREE_FLOW_H) $(TREE_DUMP_H) $(TIMEVAR_H) $(CFGLOOP_H) \
    tree-vectorizer.h $(TREE_DATA_REF_H) $(SCEV_H) $(EXPR_H) tree-chrec.h
 tree-vect-transform.o: tree-vect-transform.c $(CONFIG_H) $(SYSTEM_H) \
Index: gcc/target-def.h
===================================================================
--- gcc/target-def.h.orig	2006-01-14 12:51:33.000000000 +0100
+++ gcc/target-def.h	2009-11-20 13:42:55.000000000 +0100
@@ -352,6 +352,10 @@ Foundation, 51 Franklin Street, Fifth Fl
 #define TARGET_VECTOR_MODE_SUPPORTED_P hook_bool_mode_false
 #endif
 
+#ifndef TARGET_VECTOR_MISALIGN_SUPPORTED_P
+#define TARGET_VECTOR_MISALIGN_SUPPORTED_P hook_bool_mode_false
+#endif
+
 #ifndef TARGET_VECTOR_OPAQUE_P
 #define TARGET_VECTOR_OPAQUE_P hook_bool_tree_false
 #endif
@@ -587,6 +591,7 @@ Foundation, 51 Franklin Street, Fifth Fl
   TARGET_VALID_POINTER_MODE,                    \
   TARGET_SCALAR_MODE_SUPPORTED_P,		\
   TARGET_VECTOR_MODE_SUPPORTED_P,               \
+  TARGET_VECTOR_MISALIGN_SUPPORTED_P,		\
   TARGET_VECTOR_OPAQUE_P,			\
   TARGET_RTX_COSTS,				\
   TARGET_ADDRESS_COST,				\
Index: gcc/target.h
===================================================================
--- gcc/target.h.orig	2006-01-14 12:51:33.000000000 +0100
+++ gcc/target.h	2009-11-20 13:42:55.000000000 +0100
@@ -440,6 +440,9 @@ struct gcc_target
      for further details.  */
   bool (* vector_mode_supported_p) (enum machine_mode mode);
 
+  /* True if misaligned load-execute vector operations are allowed. */
+  bool (* vector_misalign_supported_p) (enum machine_mode mode);
+
   /* True if a vector is opaque.  */
   bool (* vector_opaque_p) (tree);
 
Index: gcc/tree-vect-analyze.c
===================================================================
--- gcc/tree-vect-analyze.c.orig	2006-10-20 11:04:53.000000000 +0200
+++ gcc/tree-vect-analyze.c	2009-11-20 13:42:55.000000000 +0100
@@ -25,6 +25,7 @@ Software Foundation, 51 Franklin Street,
 #include "tm.h"
 #include "ggc.h"
 #include "tree.h"
+#include "target.h"
 #include "basic-block.h"
 #include "diagnostic.h"
 #include "tree-flow.h"
@@ -709,7 +710,7 @@ vect_compute_data_ref_alignment (struct
   tree stmt = DR_STMT (dr);
   stmt_vec_info stmt_info = vinfo_for_stmt (stmt);  
   tree ref = DR_REF (dr);
-  tree vectype;
+  tree vectype = STMT_VINFO_VECTYPE (stmt_info);
   tree base, base_addr;
   bool base_aligned;
   tree misalign;
@@ -718,6 +719,13 @@ vect_compute_data_ref_alignment (struct
   if (vect_print_dump_info (REPORT_DETAILS))
     fprintf (vect_dump, "vect_compute_data_ref_alignment:");
 
+  /* Check if target cares about alignment at all. */
+  if (targetm.vector_misalign_supported_p ((int) TYPE_MODE (vectype)))
+    {
+      DR_MISALIGNMENT (dr) = 0;
+      return true;
+    }
+
   /* Initialize misalignment to unknown.  */
   DR_MISALIGNMENT (dr) = -1;
 
@@ -725,7 +733,6 @@ vect_compute_data_ref_alignment (struct
   aligned_to = DR_ALIGNED_TO (dr);
   base_addr = DR_BASE_ADDRESS (dr);
   base = build_fold_indirect_ref (base_addr);
-  vectype = STMT_VINFO_VECTYPE (stmt_info);
   alignment = ssize_int (TYPE_ALIGN (vectype)/BITS_PER_UNIT);
 
   if ((aligned_to && tree_int_cst_compare (aligned_to, alignment) < 0)
Index: gcc/tree-vect-transform.c
===================================================================
--- gcc/tree-vect-transform.c.orig	2006-10-09 12:05:44.000000000 +0200
+++ gcc/tree-vect-transform.c	2009-11-20 13:42:55.000000000 +0100
@@ -1693,7 +1693,12 @@ vectorizable_load (tree stmt, block_stmt
 
       vec_dest = vect_create_destination_var (scalar_dest, vectype);
       data_ref = vect_create_data_ref_ptr (stmt, bsi, NULL_TREE, &dummy, false);
-      if (aligned_access_p (dr))
+      /* If misaligned load-execute is supported,
+         treat it as aligned when the target supports it. */
+      if ((targetm.vector_misalign_supported_p ((int) TYPE_MODE (vectype))
+           && alignment_support_cheme == dr_aligned)
+          || (!targetm.vector_misalign_supported_p ((int) TYPE_MODE (vectype))
+              && aligned_access_p (dr)))
         data_ref = build_fold_indirect_ref (data_ref);
       else
 	{
Index: gcc/tree-vectorizer.c
===================================================================
--- gcc/tree-vectorizer.c.orig	2005-11-06 20:01:06.000000000 +0100
+++ gcc/tree-vectorizer.c	2009-11-20 13:42:55.000000000 +0100
@@ -1577,20 +1577,25 @@ vect_supportable_dr_alignment (struct da
   tree vectype = STMT_VINFO_VECTYPE (vinfo_for_stmt (DR_STMT (dr)));
   enum machine_mode mode = (int) TYPE_MODE (vectype);
 
+  /* Definitely aligned access.  */
   if (aligned_access_p (dr))
     return dr_aligned;
 
   /* Possibly unaligned access.  */
-  
   if (DR_IS_READ (dr))
     {
+      /* Check if target cares about alignment at all. */
+      if (targetm.vector_misalign_supported_p (mode))
+        return dr_unaligned_supported;
+
+      /* Check if target can do software pipeline. */
       if (vec_realign_load_optab->handlers[mode].insn_code != CODE_FOR_nothing
 	  && (!targetm.vectorize.builtin_mask_for_load
 	      || targetm.vectorize.builtin_mask_for_load ()))
 	return dr_unaligned_software_pipeline;
 
+      /* If can't software pipeline the loads, check for misaligned loads. */
       if (movmisalign_optab->handlers[mode].insn_code != CODE_FOR_nothing)
-	/* Can't software pipeline the loads, but can at least do them.  */
 	return dr_unaligned_supported;
     }
 
Index: gcc/config/i386/crtmisalignsse.c
===================================================================
--- /dev/null	1970-01-01 00:00:00.000000000 +0000
+++ gcc/config/i386/crtmisalignsse.c	2009-11-20 13:42:55.000000000 +0100
@@ -0,0 +1,147 @@
+/*
+ * Copyright (C) 2006 Free Software Foundation, Inc.
+ *
+ * This file is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation; either version 2, or (at your option) any
+ * later version.
+ *
+ * In addition to the permissions in the GNU General Public License, the
+ * Free Software Foundation gives you unlimited permission to link the
+ * compiled version of this file with other programs, and to distribute
+ * those programs without any restriction coming from the use of this
+ * file.  (The General Public License restrictions do apply in other
+ * respects; for example, they cover modification of the file, and
+ * distribution when not linked into another program.)
+ *
+ * This file is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; see the file COPYING.  If not, write to
+ * the Free Software Foundation, 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ *    As a special exception, if you link this library with files
+ *    compiled with GCC to produce an executable, this does not cause
+ *    the resulting executable to be covered by the GNU General Public License.
+ *    This exception does not however invalidate any other reasons why
+ *    the executable file might be covered by the GNU General Public License.
+ */
+
+#define CPUID_LARGEST_FN  (0x00000000)	/* Vendor ID and largest supported basic function. */
+#define CPUID_ID          (0x00000001)	/* Family, model and stepping. */
+#define CPUID_LARGEST_EX  (0x80000000)	/* Largest supported extended function. */
+#define CPUID_EX_FEATURES (0x80000001)	/* Extended features. */
+
+#define CPUID_SSEMISALIGN (1 << 7)	/* Misaliged SSE support. */
+
+#define CPUID_AMD0        (0x68747541)	/* Auth */
+#define CPUID_AMD1        (0x69746E65)	/* enti */
+#define CPUID_AMD2        (0x444D4163)	/* cAMD */
+
+#define CPUID_FAMILY_EX       (20)	/* Extended CPU family. */
+#define CPUID_FAMILY_EX_MASK  (255)
+#define CPUID_FAMILY          (8)	/* CPU family. */
+#define CPUID_FAMILY_MASK     (15)
+#define CPUID_MODEL_EX        (16)	/* Extended CPU model. */
+#define CPUID_MODEL_EX_MASK   (15)
+#define CPUID_MODEL           (4)	/* CPU model. */
+#define CPUID_MODEL_MASK      (15)
+#define CPUID_STEP            (0)	/* CPU stepping. */
+#define CPUID_STEP_MASK       (15)
+
+#define FAMILY_AMD_GH     (0x10)	/* GH */
+#define MODEL_AMD_GH_A    (0)		/* GH rev. A */
+
+#define MXCSR_MM_A (1 << 16)	/* Misaligned SSE mask (GH rev. A). */
+#define MXCSR_MM   (1 << 17)	/* Misaligned SSE mask. */
+
+#define FLAG_ID (1 << 21)	/* CPUID support. */
+
+#include <sys/types.h>
+#include <stdint.h>
+
+#define CPUID(a) 				/* Execute CPUID. */	\
+     __asm __volatile ("xchgl %%ebx, %1;"	/* Save %ebx. */	\
+                       "cpuid;"						\
+                       "xchgl %%ebx, %1;"	/* Restore %ebx. */	\
+                       : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx)	\
+                       : "a" (a));
+
+static void __attribute__ ((constructor))
+check_misalign_sse (void)
+{
+  uint32_t eax, ebx, ecx, edx;
+  uint32_t cpuid [3], family, model, step;
+
+#ifndef __x86_64__
+  /* All 64-bit targets support CPUID;
+    only check explicitly for 32-bit ones. */
+
+  /* Check if we can use CPUID. */
+  __asm __volatile ("pushf;"		/* Save flags. */
+                    "mov (%%esp), %0;"		/* Copy flags into register. */
+                    "mov %0, %1;"	/* Save'em. */
+                    "xor %2, %0;"	/* Flip ID bit. */
+                    "push %0;"	/* Try modified flags. */
+                    "popf;"
+                    "pushf;"		/* Read flags into register again. */
+                    "pop %0;"
+                    "popf;"		/* Restore flags. */
+                    : "=&r" (eax), "=&r" (ebx)
+                    : "i" (FLAG_ID)
+                    : "memory");
+
+  /* Check if flipping ID bit stuck. */
+  if (((eax ^ ebx) & FLAG_ID) == 0)
+    return;
+#endif
+
+  /* Get the highest supported basic function.  */
+  CPUID (CPUID_LARGEST_FN);
+
+  /* Check if basic functions used below are supported. */
+  if (eax < CPUID_ID)
+    return;
+
+  cpuid[0] = ebx;
+  cpuid[1] = edx;
+  cpuid[2] = ecx;
+
+  /* Get the highest supported extended function (saving vendor string).  */
+  CPUID (CPUID_LARGEST_EX);
+
+  /* Check if basic functions used below are supported. */
+  if (eax < CPUID_EX_FEATURES)
+    return;
+
+  /* Get the extended features.  */
+  CPUID (CPUID_EX_FEATURES);
+
+  /* Check if misaligned SSE is supported. */
+  if ((ecx & CPUID_SSEMISALIGN) == 0)
+    return;
+
+  /* Get the CPU ID.  */
+  CPUID (CPUID_ID);
+
+  family = ((eax >> CPUID_FAMILY_EX) & CPUID_FAMILY_EX_MASK) /* calculate family */
+         + ((eax >> CPUID_FAMILY) & CPUID_FAMILY_MASK);
+  model  = (((eax >> CPUID_MODEL_EX) & CPUID_MODEL_EX_MASK) << CPUID_MODEL) /* calculate model */
+         + ((eax >> CPUID_MODEL) & CPUID_MODEL_MASK);
+  step   = ((eax >> CPUID_STEP) & CPUID_STEP_MASK); /* calculate stepping */
+
+  /* Enable misaligned SSE. */
+  uint32_t mxcsr = __builtin_ia32_stmxcsr ();
+
+  if (   cpuid [0] == CPUID_AMD0 && cpuid [1] == CPUID_AMD1 && cpuid [2] == CPUID_AMD2 \
+      && family == FAMILY_AMD_GH && model == MODEL_AMD_GH_A)
+    mxcsr |= MXCSR_MM_A; /* AMD GH rev. A */
+  else
+    mxcsr |= MXCSR_MM; /* Others */
+
+  __builtin_ia32_ldmxcsr (mxcsr);
+}
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c.orig	2009-11-20 13:42:55.000000000 +0100
+++ gcc/config/i386/i386.c	2009-11-20 13:42:55.000000000 +0100
@@ -1219,6 +1219,7 @@ static void ix86_setup_incoming_varargs
 					 tree, int *, int);
 static tree ix86_gimplify_va_arg (tree, tree, tree *, tree *);
 static bool ix86_vector_mode_supported_p (enum machine_mode);
+static bool ix86_vector_misalign_supported_p (enum machine_mode);
 
 static int ix86_address_cost (rtx);
 static bool ix86_cannot_force_const_mem (rtx);
@@ -1446,6 +1447,9 @@ static void x86_64_elf_select_section (t
 #undef TARGET_VECTOR_MODE_SUPPORTED_P
 #define TARGET_VECTOR_MODE_SUPPORTED_P ix86_vector_mode_supported_p
 
+#undef TARGET_VECTOR_MISALIGN_SUPPORTED_P
+#define TARGET_VECTOR_MISALIGN_SUPPORTED_P ix86_vector_misalign_supported_p
+
 #ifdef HAVE_AS_TLS
 #undef TARGET_ASM_OUTPUT_DWARF_DTPREL
 #define TARGET_ASM_OUTPUT_DWARF_DTPREL i386_output_dwarf_dtprel
@@ -1500,8 +1504,8 @@ ix86_handle_option (size_t code, const c
     case OPT_msse:
       if (!value)
 	{
-	  target_flags &= ~(MASK_SSE2 | MASK_SSE3 | MASK_SSE4A);
-	  target_flags_explicit |= MASK_SSE2 | MASK_SSE3 | MASK_SSE4A;
+	  target_flags &= ~(MASK_SSE2 | MASK_SSE3 | MASK_SSE4A | MASK_SSE_MISALIGN);
+	  target_flags_explicit |= MASK_SSE2 | MASK_SSE3 | MASK_SSE4A | MASK_SSE_MISALIGN;
 	}
       return true;
 
@@ -1589,7 +1593,8 @@ override_options (void)
 	  PTA_SSSE3 = 256,
 	  PTA_POPCNT= 512,
 	  PTA_ABM = 1024,
-	  PTA_SSE4A = 2048
+	  PTA_SSE4A = 2048,
+          PTA_SSE_MISALIGN = 4096
 	} flags;
     }
   const processor_alias_table[] =
@@ -1643,8 +1648,8 @@ override_options (void)
       {"generic32", PROCESSOR_GENERIC32, 0 /* flags are only used for -march switch.  */ },
       {"generic64", PROCESSOR_GENERIC64, PTA_64BIT /* flags are only used for -march switch.  */ },
       {"amdfam10", PROCESSOR_AMDFAM10, PTA_MMX | PTA_PREFETCH_SSE | PTA_3DNOW | PTA_64BIT
-				         | PTA_3DNOW_A | PTA_SSE | PTA_SSE2| PTA_SSE3 | PTA_POPCNT
-                                         | PTA_ABM | PTA_SSE4A},
+				         | PTA_3DNOW_A | PTA_SSE | PTA_SSE2| PTA_SSE3 | PTA_SSE4A
+                                         | PTA_POPCNT | PTA_ABM},
     };
 
   int const pta_size = ARRAY_SIZE (processor_alias_table);
@@ -1799,6 +1804,9 @@ override_options (void)
 	if (processor_alias_table[i].flags & PTA_SSE4A
 	    && !(target_flags_explicit & MASK_SSE4A))
 	  target_flags |= MASK_SSE4A;
+	if (processor_alias_table[i].flags & PTA_SSE_MISALIGN
+	    && !(target_flags_explicit & MASK_SSE_MISALIGN))
+	  target_flags |= MASK_SSE_MISALIGN;
 	if (TARGET_64BIT && !(processor_alias_table[i].flags & PTA_64BIT))
 	  error ("CPU you selected does not support x86-64 "
 		 "instruction set");
@@ -18837,6 +18845,17 @@ ix86_vector_mode_supported_p (enum machi
     return true;
   if (TARGET_3DNOW && VALID_MMX_REG_MODE_3DNOW (mode))
     return true;
+
+  return false;
+}
+
+/* Implements target hook vector_mode_misalign_p.  */
+static bool
+ix86_vector_misalign_supported_p (enum machine_mode mode)
+{
+  if (TARGET_SSE_MISALIGN && ix86_vector_mode_supported_p (mode))
+    return true;
+
   return false;
 }
 
Index: gcc/config/i386/i386.opt
===================================================================
--- gcc/config/i386/i386.opt.orig	2009-11-20 13:42:41.000000000 +0100
+++ gcc/config/i386/i386.opt	2009-11-20 13:42:55.000000000 +0100
@@ -205,6 +205,10 @@ msse4a
 Target Report Mask(SSE4A)
 Support new AMDFAM10 SSE4A built-in functions and code generation
 
+mssemisalign
+Target Report Mask(SSE_MISALIGN)
+Support misaligned memory in vector operations.
+
 mpopcnt
 Target Report Mask(POPCNT)
 Support new AMDFAM10 Advanced Bit Manipulation (ABM) popcount built-in functions and code generation
Index: gcc/config/i386/linux.h
===================================================================
--- gcc/config/i386/linux.h.orig	2009-11-20 13:40:58.000000000 +0100
+++ gcc/config/i386/linux.h	2009-11-20 13:42:55.000000000 +0100
@@ -130,6 +130,7 @@ Boston, MA 02110-1301, USA.  */
 #undef  ENDFILE_SPEC
 #define ENDFILE_SPEC \
   "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+   %{mssemisalign:crtmisalignsse.o%s} \
    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
 
 /* A C statement (sans semicolon) to output to the stdio stream
Index: gcc/config/i386/linux64.h
===================================================================
--- gcc/config/i386/linux64.h.orig	2005-10-28 16:17:15.000000000 +0200
+++ gcc/config/i386/linux64.h	2009-11-20 13:42:55.000000000 +0100
@@ -68,6 +68,7 @@ Boston, MA 02110-1301, USA.  */
 #undef  ENDFILE_SPEC
 #define ENDFILE_SPEC \
   "%{ffast-math|funsafe-math-optimizations:crtfastmath.o%s} \
+   %{mssemisalign:crtmisalignsse.o%s} \
    %{shared|pie:crtendS.o%s;:crtend.o%s} crtn.o%s"
 
 #define MULTILIB_DEFAULTS { "m64" }
Index: gcc/config/i386/sse.md
===================================================================
--- gcc/config/i386/sse.md.orig	2009-11-20 13:42:50.000000000 +0100
+++ gcc/config/i386/sse.md	2009-11-20 13:42:55.000000000 +0100
@@ -70,11 +70,23 @@
       else
 	return "pxor\t%0, %0";
     case 1:
+      if (get_attr_mode (insn) == MODE_V4SF)
+	return TARGET_SSE_MISALIGN && MEM_P (operands[1])
+               ? "movups\t{%1, %0|%0, %1}"
+               : "movaps\t{%1, %0|%0, %1}";
+      else
+	return TARGET_SSE_MISALIGN && MEM_P (operands[1])
+               ? "movdqu\t{%1, %0|%0, %1}"
+               : "movdqa\t{%1, %0|%0, %1}";
     case 2:
       if (get_attr_mode (insn) == MODE_V4SF)
-	return "movaps\t{%1, %0|%0, %1}";
+	return TARGET_SSE_MISALIGN
+               ? "movups\t{%1, %0|%0, %1}"
+               : "movaps\t{%1, %0|%0, %1}";
       else
-	return "movdqa\t{%1, %0|%0, %1}";
+	return TARGET_SSE_MISALIGN
+               ? "movdqu\t{%1, %0|%0, %1}"
+               : "movdqa\t{%1, %0|%0, %1}";
     default:
       gcc_unreachable ();
     }
@@ -83,7 +95,6 @@
    (set (attr "mode")
 	(cond [(eq (symbol_ref "TARGET_SSE2") (const_int 0))
 		 (const_string "V4SF")
-
 	       (eq_attr "alternative" "0,1")
 		 (if_then_else
 		   (ne (symbol_ref "optimize_size")
@@ -156,11 +167,23 @@
       else
 	return "xorpd\t%0, %0";
     case 1:
+      if (get_attr_mode (insn) == MODE_V4SF)
+	return TARGET_SSE_MISALIGN && MEM_P (operands[1])
+               ? "movups\t{%1, %0|%0, %1}"
+               : "movaps\t{%1, %0|%0, %1}";
+      else
+	return TARGET_SSE_MISALIGN && MEM_P (operands[1])
+               ? "movupd\t{%1, %0|%0, %1}"
+               : "movapd\t{%1, %0|%0, %1}";
     case 2:
       if (get_attr_mode (insn) == MODE_V4SF)
-	return "movaps\t{%1, %0|%0, %1}";
+	return TARGET_SSE_MISALIGN
+               ? "movups\t{%1, %0|%0, %1}"
+               : "movaps\t{%1, %0|%0, %1}";
       else
-	return "movapd\t{%1, %0|%0, %1}";
+	return TARGET_SSE_MISALIGN
+               ? "movupd\t{%1, %0|%0, %1}"
+               : "movapd\t{%1, %0|%0, %1}";
     default:
       gcc_unreachable ();
     }
Index: gcc/config/i386/t-crtfm
===================================================================
--- gcc/config/i386/t-crtfm.orig	2005-10-28 16:17:15.000000000 +0200
+++ gcc/config/i386/t-crtfm	2009-11-20 13:42:55.000000000 +0100
@@ -1,6 +1,11 @@
-EXTRA_PARTS += crtfastmath.o
+EXTRA_PARTS += crtfastmath.o crtmisalignsse.o
 
 $(T)crtfastmath.o: $(srcdir)/config/i386/crtfastmath.c $(GCC_PASSES)
 	$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -msse -c \
 		$(srcdir)/config/i386/crtfastmath.c \
 		-o $(T)crtfastmath$(objext)
+
+$(T)crtmisalignsse.o: $(srcdir)/config/i386/crtmisalignsse.c $(GCC_PASSES) stmp-int-hdrs
+	$(GCC_FOR_TARGET) $(LIBGCC2_CFLAGS) -msse -c \
+		$(srcdir)/config/i386/crtmisalignsse.c \
+		-o $(T)crtmisalignsse$(objext)
Index: gcc/config/i386/t-linux64
===================================================================
--- gcc/config/i386/t-linux64.orig	2005-10-28 16:17:15.000000000 +0200
+++ gcc/config/i386/t-linux64	2009-11-20 13:42:55.000000000 +0100
@@ -12,7 +12,7 @@ LIBGCC = stmp-multilib
 INSTALL_LIBGCC = install-multilib
 
 EXTRA_MULTILIB_PARTS=crtbegin.o crtend.o crtbeginS.o crtendS.o \
-		     crtbeginT.o crtfastmath.o
+		     crtbeginT.o crtfastmath.o crtmisalignsse.o
 
 # The pushl in CTOR initialization interferes with frame pointer elimination.
 # crtend*.o cannot be compiled without -fno-asynchronous-unwind-tables,
Index: gcc/doc/invoke.texi
===================================================================
--- gcc/doc/invoke.texi.orig	2009-11-20 13:42:41.000000000 +0100
+++ gcc/doc/invoke.texi	2009-11-20 13:42:55.000000000 +0100
@@ -525,7 +525,7 @@ Objective-C and Objective-C++ Dialects}.
 -mmmx  -msse  -msse2 -msse3 -mssse3 -msse4a -m3dnow -mpopcnt -mabm @gol
 -mthreads  -mno-align-stringops  -minline-all-stringops @gol
 -mpush-args  -maccumulate-outgoing-args  -m128bit-long-double @gol
--m96bit-long-double  -mregparm=@var{num}  -msseregparm @gol
+-m96bit-long-double  -mregparm=@var{num}  -msseregparm  -mssemisalign @gol
 -momit-leaf-frame-pointer  -mno-red-zone -mno-tls-direct-seg-refs @gol
 -mcmodel=@var{code-model} @gol
 -m32  -m64 -mlarge-data-threshold=@var{num}}
@@ -9319,6 +9319,14 @@ function by using the function attribute
 modules with the same value, including any libraries.  This includes
 the system libraries and startup modules.
 
+@item -mssemisalign
+@opindex mssemisalign
+Allow the vectorizer to use operands in memory even if not
+guaranteed to be aligned.
+
+@strong{Warning:} if you use this switch then the resulting modules
+must be run only on processors which support this feature.
+
 @item -mpreferred-stack-boundary=@var{num}
 @opindex mpreferred-stack-boundary
 Attempt to keep the stack boundary aligned to a 2 raised to @var{num}
openSUSE Build Service is sponsored by