This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Add -march=CPU[,+EXTENSION...] to x86 assembler


I am checking this patch to add -march=CPU[,+EXTENSION...] to x86
assembler with testcases. You can use it to specify a target
processor with extensions.


H.J.
----
gas/

2008-01-22  H.J. Lu  <hongjiu.lu@intel.com>

	* config/tc-i386.c (XXX_PREFIX): Moved from tc-i386.h.
	(XXX_MNEM_SUFFIX): Likewise.
	(END_OF_INSN): Likewise.
	(templates): Likewise.
	(modrm_byte): Likewise.
	(rex_byte): Likewise.
	(DREX_XXX): Likewise.
	(drex_byte): Likewise.
	(sib_byte): Likewise.
	(processor_type): Likewise.
	(arch_entry): Likewise.
	(cpu_sub_arch_name): Remove const.
	(cpu_arch): Add .vmx and .smx.
	(set_cpu_arch): Append cpu_sub_arch_name.
	(md_parse_option): Support -march=CPU[,+EXTENSION...].
	(md_show_usage): Updated.

	* config/tc-i386.h (XXX_PREFIX): Moved to c-i386.c.
	(XXX_MNEM_SUFFIX): Likewise.
	(END_OF_INSN): Likewise.
	(templates): Likewise.
	(modrm_byte): Likewise.
	(rex_byte): Likewise.
	(DREX_XXX): Likewise.
	(drex_byte): Likewise.
	(sib_byte): Likewise.
	(processor_type): Likewise.
	(arch_entry): Likewise.

	* doc/as.texinfo: Update i386 -march option.

	* doc/c-i386.texi: Update -march= for ISA.

gas/testsuite/

2008-01-22  H.J. Lu  <hongjiu.lu@intel.com>

	* gas/i386/arch-10-1.l: New.
	* gas/i386/arch-10-1.s: Likewise.
	* gas/i386/arch-10-2.l: Likewise.
	* gas/i386/arch-10-2.s: Likewise.
	* gas/i386/arch-10-3.l: Likewise.
	* gas/i386/arch-10-3.s: Likewise.
	* gas/i386/arch-10-4.l: Likewise.
	* gas/i386/arch-10-4.s: Likewise.
	* gas/i386/arch-10.d: Likewise.
	* gas/i386/arch-10.s: Likewise.

	* gas/i386/i386.exp: Run arch-10, arch-10-1, arch-10-2,
	arch-10-3 and arch-10-4.

	* gas/i386/nops-2.s: Use movsbl instead of cmove.
	* gas/i386/nops-2-i386.d: Updated.
	* gas/i386/nops-2-merom.d: Likewise.
	* gas/i386/nops-2.d: Likewise.
	* gas/i386/x86-64-nops-2.d: Likewise.

opcodes/

2008-01-22  H.J. Lu  <hongjiu.lu@intel.com>

	* i386-gen.c (cpu_flag_init): Add CPU_VMX_FLAGS and
	CPU_SMX_FLAGS.
	* i386-init.h: Regenerated.

--- binutils/gas/config/tc-i386.c.arch	2008-01-21 16:52:44.000000000 -0800
+++ binutils/gas/config/tc-i386.c	2008-01-22 10:46:24.000000000 -0800
@@ -55,6 +55,128 @@
 #endif
 #endif
 
+/* Prefixes will be emitted in the order defined below.
+   WAIT_PREFIX must be the first prefix since FWAIT is really is an
+   instruction, and so must come before any prefixes.
+   The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
+   LOCKREP_PREFIX.  */
+#define WAIT_PREFIX	0
+#define SEG_PREFIX	1
+#define ADDR_PREFIX	2
+#define DATA_PREFIX	3
+#define LOCKREP_PREFIX	4
+#define REX_PREFIX	5       /* must come last.  */
+#define MAX_PREFIXES	6	/* max prefixes per opcode */
+
+/* we define the syntax here (modulo base,index,scale syntax) */
+#define REGISTER_PREFIX '%'
+#define IMMEDIATE_PREFIX '$'
+#define ABSOLUTE_PREFIX '*'
+
+/* these are the instruction mnemonic suffixes in AT&T syntax or
+   memory operand size in Intel syntax.  */
+#define WORD_MNEM_SUFFIX  'w'
+#define BYTE_MNEM_SUFFIX  'b'
+#define SHORT_MNEM_SUFFIX 's'
+#define LONG_MNEM_SUFFIX  'l'
+#define QWORD_MNEM_SUFFIX  'q'
+#define XMMWORD_MNEM_SUFFIX  'x'
+/* Intel Syntax.  Use a non-ascii letter since since it never appears
+   in instructions.  */
+#define LONG_DOUBLE_MNEM_SUFFIX '\1'
+
+#define END_OF_INSN '\0'
+
+/*
+  'templates' is for grouping together 'template' structures for opcodes
+  of the same name.  This is only used for storing the insns in the grand
+  ole hash table of insns.
+  The templates themselves start at START and range up to (but not including)
+  END.
+  */
+typedef struct
+{
+  const template *start;
+  const template *end;
+}
+templates;
+
+/* 386 operand encoding bytes:  see 386 book for details of this.  */
+typedef struct
+{
+  unsigned int regmem;	/* codes register or memory operand */
+  unsigned int reg;	/* codes register operand (or extended opcode) */
+  unsigned int mode;	/* how to interpret regmem & reg */
+}
+modrm_byte;
+
+/* x86-64 extension prefix.  */
+typedef int rex_byte;
+
+/* The SSE5 instructions have a two bit instruction modifier (OC) that 
+   is stored in two separate bytes in the instruction.  Pick apart OC 
+   into the 2 separate bits for instruction.  */
+#define DREX_OC0(x)	(((x) & 1) != 0)
+#define DREX_OC1(x)	(((x) & 2) != 0)
+
+#define DREX_OC0_MASK	(1 << 3)	/* set OC0 in byte 4 */
+#define DREX_OC1_MASK	(1 << 2)	/* set OC1 in byte 3 */
+
+/* OC mappings */
+#define DREX_XMEM_X1_X2_X2 0	/* 4 op insn, dest = src3, src1 = reg/mem */
+#define DREX_X1_XMEM_X2_X2 1	/* 4 op insn, dest = src3, src2 = reg/mem */
+#define DREX_X1_XMEM_X2_X1 2	/* 4 op insn, dest = src1, src2 = reg/mem */
+#define DREX_X1_X2_XMEM_X1 3	/* 4 op insn, dest = src1, src3 = reg/mem */
+
+#define DREX_XMEM_X1_X2	   0	/* 3 op insn, src1 = reg/mem */
+#define DREX_X1_XMEM_X2	   1	/* 3 op insn, src1 = reg/mem */
+
+/* Information needed to create the DREX byte in SSE5 instructions.  */
+typedef struct
+{
+  unsigned int reg;		/* register */
+  unsigned int rex;		/* REX flags */
+  unsigned int modrm_reg;	/* which arg goes in the modrm.reg field */
+  unsigned int modrm_regmem;	/* which arg goes in the modrm.regmem field */
+} drex_byte;
+
+/* 386 opcode byte to code indirect addressing.  */
+typedef struct
+{
+  unsigned base;
+  unsigned index;
+  unsigned scale;
+}
+sib_byte;
+
+enum processor_type
+{
+  PROCESSOR_UNKNOWN,
+  PROCESSOR_I386,
+  PROCESSOR_I486,
+  PROCESSOR_PENTIUM,
+  PROCESSOR_PENTIUMPRO,
+  PROCESSOR_PENTIUM4,
+  PROCESSOR_NOCONA,
+  PROCESSOR_CORE,
+  PROCESSOR_CORE2,
+  PROCESSOR_K6,
+  PROCESSOR_ATHLON,
+  PROCESSOR_K8,
+  PROCESSOR_GENERIC32,
+  PROCESSOR_GENERIC64,
+  PROCESSOR_AMDFAM10
+};
+
+/* x86 arch names, types and features */
+typedef struct
+{
+  const char *name;		/* arch name */
+  enum processor_type type;	/* arch type */
+  i386_cpu_flags flags;		/* cpu feature flags */
+}
+arch_entry;
+
 static void set_code_flag (int);
 static void set_16bit_gcc_code_flag (int);
 static void set_intel_syntax (int);
@@ -313,7 +435,7 @@ static int quiet_warnings = 0;
 
 /* CPU name.  */
 static const char *cpu_arch_name = NULL;
-static const char *cpu_sub_arch_name = NULL;
+static char *cpu_sub_arch_name = NULL;
 
 /* CPU feature flags.  */
 static i386_cpu_flags cpu_arch_flags = CPU_UNKNOWN_FLAGS;
@@ -427,92 +549,96 @@ const relax_typeS md_relax_table[] =
 
 static const arch_entry cpu_arch[] =
 {
-  {"generic32", PROCESSOR_GENERIC32,
-   CPU_GENERIC32_FLAGS },
-  {"generic64", PROCESSOR_GENERIC64,
-   CPU_GENERIC64_FLAGS },
-  {"i8086", PROCESSOR_UNKNOWN,
-   CPU_NONE_FLAGS },
-  {"i186", PROCESSOR_UNKNOWN,
-   CPU_I186_FLAGS },
-  {"i286", PROCESSOR_UNKNOWN,
-   CPU_I286_FLAGS },
-  {"i386", PROCESSOR_I386,
-   CPU_I386_FLAGS },
-  {"i486", PROCESSOR_I486,
-   CPU_I486_FLAGS },
-  {"i586", PROCESSOR_PENTIUM,
-   CPU_I586_FLAGS },
-  {"i686", PROCESSOR_PENTIUMPRO,
-   CPU_I686_FLAGS },
-  {"pentium", PROCESSOR_PENTIUM,
-   CPU_I586_FLAGS },
-  {"pentiumpro",PROCESSOR_PENTIUMPRO,
-   CPU_I686_FLAGS },
-  {"pentiumii",	PROCESSOR_PENTIUMPRO,
-   CPU_P2_FLAGS },
-  {"pentiumiii",PROCESSOR_PENTIUMPRO,
-   CPU_P3_FLAGS },
-  {"pentium4", PROCESSOR_PENTIUM4,
-   CPU_P4_FLAGS },
-  {"prescott", PROCESSOR_NOCONA,
-   CPU_CORE_FLAGS },
-  {"nocona", PROCESSOR_NOCONA,
-   CPU_NOCONA_FLAGS },
-  {"yonah", PROCESSOR_CORE,
-   CPU_CORE_FLAGS },
-  {"core", PROCESSOR_CORE,
-   CPU_CORE_FLAGS },
-  {"merom", PROCESSOR_CORE2,
-   CPU_CORE2_FLAGS },
-  {"core2", PROCESSOR_CORE2,
-   CPU_CORE2_FLAGS },
-  {"k6", PROCESSOR_K6,
-   CPU_K6_FLAGS },
-  {"k6_2", PROCESSOR_K6,
-   CPU_K6_2_FLAGS },
-  {"athlon", PROCESSOR_ATHLON,
-   CPU_ATHLON_FLAGS },
-  {"sledgehammer", PROCESSOR_K8,
-   CPU_K8_FLAGS },
-  {"opteron", PROCESSOR_K8,
-   CPU_K8_FLAGS },
-  {"k8", PROCESSOR_K8,
-   CPU_K8_FLAGS },
-  {"amdfam10", PROCESSOR_AMDFAM10,
-   CPU_AMDFAM10_FLAGS },
-  {".mmx", PROCESSOR_UNKNOWN,
-   CPU_MMX_FLAGS },
-  {".sse", PROCESSOR_UNKNOWN,
-   CPU_SSE_FLAGS },
-  {".sse2", PROCESSOR_UNKNOWN,
-   CPU_SSE2_FLAGS },
-  {".sse3", PROCESSOR_UNKNOWN,
-   CPU_SSE3_FLAGS },
-  {".ssse3", PROCESSOR_UNKNOWN,
-   CPU_SSSE3_FLAGS },
-  {".sse4.1", PROCESSOR_UNKNOWN,
-   CPU_SSE4_1_FLAGS },
-  {".sse4.2", PROCESSOR_UNKNOWN,
-   CPU_SSE4_2_FLAGS },
-  {".sse4", PROCESSOR_UNKNOWN,
-   CPU_SSE4_2_FLAGS },
-  {".3dnow", PROCESSOR_UNKNOWN,
-   CPU_3DNOW_FLAGS },
-  {".3dnowa", PROCESSOR_UNKNOWN,
-   CPU_3DNOWA_FLAGS },
-  {".padlock", PROCESSOR_UNKNOWN,
-   CPU_PADLOCK_FLAGS },
-  {".pacifica", PROCESSOR_UNKNOWN,
-   CPU_SVME_FLAGS },
-  {".svme", PROCESSOR_UNKNOWN,
-   CPU_SVME_FLAGS },
-  {".sse4a", PROCESSOR_UNKNOWN,
-   CPU_SSE4A_FLAGS },
-  {".abm", PROCESSOR_UNKNOWN,
-   CPU_ABM_FLAGS },
-  {".sse5", PROCESSOR_UNKNOWN,
-   CPU_SSE5_FLAGS },
+  { "generic32", PROCESSOR_GENERIC32,
+    CPU_GENERIC32_FLAGS },
+  { "generic64", PROCESSOR_GENERIC64,
+    CPU_GENERIC64_FLAGS },
+  { "i8086", PROCESSOR_UNKNOWN,
+    CPU_NONE_FLAGS },
+  { "i186", PROCESSOR_UNKNOWN,
+    CPU_I186_FLAGS },
+  { "i286", PROCESSOR_UNKNOWN,
+    CPU_I286_FLAGS },
+  { "i386", PROCESSOR_I386,
+    CPU_I386_FLAGS },
+  { "i486", PROCESSOR_I486,
+    CPU_I486_FLAGS },
+  { "i586", PROCESSOR_PENTIUM,
+    CPU_I586_FLAGS },
+  { "i686", PROCESSOR_PENTIUMPRO,
+    CPU_I686_FLAGS },
+  { "pentium", PROCESSOR_PENTIUM,
+    CPU_I586_FLAGS },
+  { "pentiumpro", PROCESSOR_PENTIUMPRO,
+    CPU_I686_FLAGS },
+  { "pentiumii", PROCESSOR_PENTIUMPRO,
+    CPU_P2_FLAGS },
+  { "pentiumiii",PROCESSOR_PENTIUMPRO,
+    CPU_P3_FLAGS },
+  { "pentium4", PROCESSOR_PENTIUM4,
+    CPU_P4_FLAGS },
+  { "prescott", PROCESSOR_NOCONA,
+    CPU_CORE_FLAGS },
+  { "nocona", PROCESSOR_NOCONA,
+    CPU_NOCONA_FLAGS },
+  { "yonah", PROCESSOR_CORE,
+    CPU_CORE_FLAGS },
+  { "core", PROCESSOR_CORE,
+    CPU_CORE_FLAGS },
+  { "merom", PROCESSOR_CORE2,
+    CPU_CORE2_FLAGS },
+  { "core2", PROCESSOR_CORE2,
+    CPU_CORE2_FLAGS },
+  { "k6", PROCESSOR_K6,
+    CPU_K6_FLAGS },
+  { "k6_2", PROCESSOR_K6,
+    CPU_K6_2_FLAGS },
+  { "athlon", PROCESSOR_ATHLON,
+    CPU_ATHLON_FLAGS },
+  { "sledgehammer", PROCESSOR_K8,
+    CPU_K8_FLAGS },
+  { "opteron", PROCESSOR_K8,
+    CPU_K8_FLAGS },
+  { "k8", PROCESSOR_K8,
+    CPU_K8_FLAGS },
+  { "amdfam10", PROCESSOR_AMDFAM10,
+    CPU_AMDFAM10_FLAGS },
+  { ".mmx", PROCESSOR_UNKNOWN,
+    CPU_MMX_FLAGS },
+  { ".sse", PROCESSOR_UNKNOWN,
+    CPU_SSE_FLAGS },
+  { ".sse2", PROCESSOR_UNKNOWN,
+    CPU_SSE2_FLAGS },
+  { ".sse3", PROCESSOR_UNKNOWN,
+    CPU_SSE3_FLAGS },
+  { ".ssse3", PROCESSOR_UNKNOWN,
+    CPU_SSSE3_FLAGS },
+  { ".sse4.1", PROCESSOR_UNKNOWN,
+    CPU_SSE4_1_FLAGS },
+  { ".sse4.2", PROCESSOR_UNKNOWN,
+    CPU_SSE4_2_FLAGS },
+  { ".sse4", PROCESSOR_UNKNOWN,
+    CPU_SSE4_2_FLAGS },
+  { ".vmx", PROCESSOR_UNKNOWN,
+    CPU_VMX_FLAGS },
+  { ".smx", PROCESSOR_UNKNOWN,
+    CPU_SMX_FLAGS },
+  { ".3dnow", PROCESSOR_UNKNOWN,
+    CPU_3DNOW_FLAGS },
+  { ".3dnowa", PROCESSOR_UNKNOWN,
+    CPU_3DNOWA_FLAGS },
+  { ".padlock", PROCESSOR_UNKNOWN,
+    CPU_PADLOCK_FLAGS },
+  { ".pacifica", PROCESSOR_UNKNOWN,
+    CPU_SVME_FLAGS },
+  { ".svme", PROCESSOR_UNKNOWN,
+    CPU_SVME_FLAGS },
+  { ".sse4a", PROCESSOR_UNKNOWN,
+    CPU_SSE4A_FLAGS },
+  { ".abm", PROCESSOR_UNKNOWN,
+    CPU_ABM_FLAGS },
+  { ".sse5", PROCESSOR_UNKNOWN,
+    CPU_SSE5_FLAGS },
 };
 
 const pseudo_typeS md_pseudo_table[] =
@@ -1653,7 +1779,16 @@ set_cpu_arch (int dummy ATTRIBUTE_UNUSED
 				    cpu_arch[i].flags);
 	      if (!UINTS_EQUAL (flags, cpu_arch_flags))
 		{
-		  cpu_sub_arch_name = cpu_arch[i].name;
+		  if (cpu_sub_arch_name)
+		    {
+		      char *name = cpu_sub_arch_name;
+		      cpu_sub_arch_name = concat (name,
+						  cpu_arch[i].name,
+						  NULL);
+		      free (name);
+		    }
+		  else
+		    cpu_sub_arch_name = xstrdup (cpu_arch[i].name);
 		  cpu_arch_flags = flags;
 		}
 	      *input_line_pointer = e;
@@ -7049,6 +7184,7 @@ int
 md_parse_option (int c, char *arg)
 {
   unsigned int i;
+  char *arch, *next;
 
   switch (c)
     {
@@ -7124,24 +7260,62 @@ md_parse_option (int c, char *arg)
       break;
 
     case OPTION_MARCH:
-      if (*arg == '.')
-	as_fatal (_("Invalid -march= option: `%s'"), arg);
-      for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
+      arch = xstrdup (arg);
+      do
 	{
-	  if (strcmp (arg, cpu_arch [i].name) == 0)
+	  if (*arch == '.')
+	    as_fatal (_("Invalid -march= option: `%s'"), arg);
+	  next = strchr (arch, '+');
+	  if (next)
+	    *next++ = '\0';
+	  for (i = 0; i < ARRAY_SIZE (cpu_arch); i++)
 	    {
-	      cpu_arch_isa = cpu_arch[i].type;
-	      cpu_arch_isa_flags = cpu_arch[i].flags;
-	      if (!cpu_arch_tune_set)
+	      if (strcmp (arch, cpu_arch [i].name) == 0)
 		{
-		  cpu_arch_tune = cpu_arch_isa;
-		  cpu_arch_tune_flags = cpu_arch_isa_flags;
+		  /* Processor.  */
+		  cpu_arch_name = cpu_arch[i].name;
+		  cpu_sub_arch_name = NULL;
+		  cpu_arch_flags = cpu_arch[i].flags;
+		  cpu_arch_isa = cpu_arch[i].type;
+		  cpu_arch_isa_flags = cpu_arch[i].flags;
+		  if (!cpu_arch_tune_set)
+		    {
+		      cpu_arch_tune = cpu_arch_isa;
+		      cpu_arch_tune_flags = cpu_arch_isa_flags;
+		    }
+		  break;
+		}
+	      else if (*cpu_arch [i].name == '.'
+		       && strcmp (arch, cpu_arch [i].name + 1) == 0)
+		{
+		  /* ISA entension.  */
+		  i386_cpu_flags flags;
+		  flags = cpu_flags_or (cpu_arch_flags,
+					cpu_arch[i].flags);
+		  if (!UINTS_EQUAL (flags, cpu_arch_flags))
+		    {
+		      if (cpu_sub_arch_name)
+			{
+			  char *name = cpu_sub_arch_name;
+			  cpu_sub_arch_name = concat (name,
+						      cpu_arch[i].name,
+						      NULL);
+			  free (name);
+			}
+		      else
+			cpu_sub_arch_name = xstrdup (cpu_arch[i].name);
+		      cpu_arch_flags = flags;
+		    }
+		  break;
 		}
-	      break;
 	    }
+
+	  if (i >= ARRAY_SIZE (cpu_arch))
+	    as_fatal (_("Invalid -march= option: `%s'"), arg);
+
+	  arch = next;
 	}
-      if (i >= ARRAY_SIZE (cpu_arch))
-	as_fatal (_("Invalid -march= option: `%s'"), arg);
+      while (next != NULL );
       break;
 
     case OPTION_MTUNE:
@@ -7226,7 +7400,16 @@ md_show_usage (stream)
   --divide                ignored\n"));
 #endif
   fprintf (stream, _("\
-  -march=CPU/-mtune=CPU   generate code/optimize for CPU, where CPU is one of:\n\
+  -march=CPU[,+EXTENSION...]\n\
+                          generate code for CPU and EXTENSION, CPU is one of:\n\
+                           i386, i486, pentium, pentiumpro, pentium4, nocona,\n\
+                           core, core2, k6, athlon, k8, generic32, generic64\n\
+			  EXTENSION is combination of:\n\
+			   mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, sse4,\n\
+			   vmx, smx, 3dnow, 3dnowa, sse4a, sse5, svme, abm,\n\
+			   padlock\n"));
+  fprintf (stream, _("\
+  -mtune=CPU              optimize for CPU, where CPU is one of:\n\
                            i386, i486, pentium, pentiumpro, pentium4, nocona,\n\
                            core, core2, k6, athlon, k8, generic32, generic64\n"));
   fprintf (stream, _("\
--- binutils/gas/config/tc-i386.h.arch	2008-01-04 12:53:58.000000000 -0800
+++ binutils/gas/config/tc-i386.h	2008-01-22 08:46:18.000000000 -0800
@@ -98,128 +98,6 @@ extern const char extra_symbol_chars[];
 extern const char *i386_comment_chars;
 #define tc_comment_chars i386_comment_chars
 
-/* Prefixes will be emitted in the order defined below.
-   WAIT_PREFIX must be the first prefix since FWAIT is really is an
-   instruction, and so must come before any prefixes.
-   The preferred prefix order is SEG_PREFIX, ADDR_PREFIX, DATA_PREFIX,
-   LOCKREP_PREFIX.  */
-#define WAIT_PREFIX	0
-#define SEG_PREFIX	1
-#define ADDR_PREFIX	2
-#define DATA_PREFIX	3
-#define LOCKREP_PREFIX	4
-#define REX_PREFIX	5       /* must come last.  */
-#define MAX_PREFIXES	6	/* max prefixes per opcode */
-
-/* we define the syntax here (modulo base,index,scale syntax) */
-#define REGISTER_PREFIX '%'
-#define IMMEDIATE_PREFIX '$'
-#define ABSOLUTE_PREFIX '*'
-
-/* these are the instruction mnemonic suffixes in AT&T syntax or
-   memory operand size in Intel syntax.  */
-#define WORD_MNEM_SUFFIX  'w'
-#define BYTE_MNEM_SUFFIX  'b'
-#define SHORT_MNEM_SUFFIX 's'
-#define LONG_MNEM_SUFFIX  'l'
-#define QWORD_MNEM_SUFFIX  'q'
-#define XMMWORD_MNEM_SUFFIX  'x'
-/* Intel Syntax.  Use a non-ascii letter since since it never appears
-   in instructions.  */
-#define LONG_DOUBLE_MNEM_SUFFIX '\1'
-
-#define END_OF_INSN '\0'
-
-/*
-  'templates' is for grouping together 'template' structures for opcodes
-  of the same name.  This is only used for storing the insns in the grand
-  ole hash table of insns.
-  The templates themselves start at START and range up to (but not including)
-  END.
-  */
-typedef struct
-{
-  const template *start;
-  const template *end;
-}
-templates;
-
-/* 386 operand encoding bytes:  see 386 book for details of this.  */
-typedef struct
-{
-  unsigned int regmem;	/* codes register or memory operand */
-  unsigned int reg;	/* codes register operand (or extended opcode) */
-  unsigned int mode;	/* how to interpret regmem & reg */
-}
-modrm_byte;
-
-/* x86-64 extension prefix.  */
-typedef int rex_byte;
-
-/* The SSE5 instructions have a two bit instruction modifier (OC) that 
-   is stored in two separate bytes in the instruction.  Pick apart OC 
-   into the 2 separate bits for instruction.  */
-#define DREX_OC0(x)	(((x) & 1) != 0)
-#define DREX_OC1(x)	(((x) & 2) != 0)
-
-#define DREX_OC0_MASK	(1 << 3)	/* set OC0 in byte 4 */
-#define DREX_OC1_MASK	(1 << 2)	/* set OC1 in byte 3 */
-
-/* OC mappings */
-#define DREX_XMEM_X1_X2_X2 0	/* 4 op insn, dest = src3, src1 = reg/mem */
-#define DREX_X1_XMEM_X2_X2 1	/* 4 op insn, dest = src3, src2 = reg/mem */
-#define DREX_X1_XMEM_X2_X1 2	/* 4 op insn, dest = src1, src2 = reg/mem */
-#define DREX_X1_X2_XMEM_X1 3	/* 4 op insn, dest = src1, src3 = reg/mem */
-
-#define DREX_XMEM_X1_X2	   0	/* 3 op insn, src1 = reg/mem */
-#define DREX_X1_XMEM_X2	   1	/* 3 op insn, src1 = reg/mem */
-
-/* Information needed to create the DREX byte in SSE5 instructions.  */
-typedef struct
-{
-  unsigned int reg;		/* register */
-  unsigned int rex;		/* REX flags */
-  unsigned int modrm_reg;	/* which arg goes in the modrm.reg field */
-  unsigned int modrm_regmem;	/* which arg goes in the modrm.regmem field */
-} drex_byte;
-
-/* 386 opcode byte to code indirect addressing.  */
-typedef struct
-{
-  unsigned base;
-  unsigned index;
-  unsigned scale;
-}
-sib_byte;
-
-enum processor_type
-{
-  PROCESSOR_UNKNOWN,
-  PROCESSOR_I386,
-  PROCESSOR_I486,
-  PROCESSOR_PENTIUM,
-  PROCESSOR_PENTIUMPRO,
-  PROCESSOR_PENTIUM4,
-  PROCESSOR_NOCONA,
-  PROCESSOR_CORE,
-  PROCESSOR_CORE2,
-  PROCESSOR_K6,
-  PROCESSOR_ATHLON,
-  PROCESSOR_K8,
-  PROCESSOR_GENERIC32,
-  PROCESSOR_GENERIC64,
-  PROCESSOR_AMDFAM10
-};
-
-/* x86 arch names, types and features */
-typedef struct
-{
-  const char *name;		/* arch name */
-  enum processor_type type;	/* arch type */
-  i386_cpu_flags flags;		/* cpu feature flags */
-}
-arch_entry;
-
 /* The name of the global offset table generated by the compiler. Allow
    this to be overridden if need be.  */
 #ifndef GLOBAL_OFFSET_TABLE_NAME
--- binutils/gas/doc/as.texinfo.arch	2007-11-28 23:35:52.000000000 -0800
+++ binutils/gas/doc/as.texinfo	2008-01-22 11:03:03.000000000 -0800
@@ -302,7 +302,7 @@ gcc(1), ld(1), and the Info entries for 
 
 @emph{Target i386 options:}
    [@b{--32}|@b{--64}] [@b{-n}]
-   [@b{-march}=@var{CPU}] [@b{-mtune}=@var{CPU}] 
+   [@b{-march}=@var{CPU}[+@var{EXTENSION}@dots{}]] [@b{-mtune}=@var{CPU}] 
 @end ifset
 @ifset I960
 
--- binutils/gas/doc/c-i386.texi.arch	2008-01-08 10:38:09.000000000 -0800
+++ binutils/gas/doc/c-i386.texi	2008-01-22 11:07:38.000000000 -0800
@@ -78,9 +78,11 @@ affect using @samp{#} for starting a com
 
 @cindex @samp{-march=} option, i386
 @cindex @samp{-march=} option, x86-64
-@item -march=@var{CPU}
-This option specifies an instruction set architecture for generating
-instructions.  The following architectures are recognized:
+@item -march=@var{CPU}[+@var{EXTENSION}@dots{}]
+This option specifies the target processor.  The assembler will
+issue an error message if an attempt is made to assemble an instruction
+which will not execute on the target processor.  The following
+processor names are recognized: 
 @code{i8086},
 @code{i186},
 @code{i286},
@@ -106,7 +108,29 @@ instructions.  The following architectur
 @code{generic32} and
 @code{generic64}.
 
-This option only affects instructions generated by the assembler. The
+In addition to the basic instruction set, the assembler can be told to 
+accept various extension mnemonics.  For example,
+@code{-march=i686+sse4+vmx} extends @var{i686} with @var{sse4} and
+@var{vmx}.  The following extensions are currently supported:
+@code{mmx},
+@code{sse},
+@code{sse2},
+@code{sse3},
+@code{ssse3},
+@code{sse4.1},
+@code{sse4.2},
+@code{sse4},
+@code{vmx},
+@code{smx},
+@code{3dnow},
+@code{3dnowa},
+@code{sse4a},
+@code{sse5},
+@code{svme},
+@code{abm} and
+@code{padlock}.
+
+When the @code{.arch} directive is used with @option{-march}, the
 @code{.arch} directive will take precedent.
 
 @cindex @samp{-mtune=} option, i386
@@ -117,7 +141,8 @@ conjunction with the @option{-march} opt
 of the processor specified by the @option{-march} option will be
 generated.
 
-Valid @var{CPU} values are identical to @option{-march=@var{CPU}}.
+Valid @var{CPU} values are identical to the processor list of
+@option{-march=@var{CPU}}.
 
 @cindex @samp{-mmnemonic=} option, i386
 @cindex @samp{-mmnemonic=} option, x86-64
--- binutils/gas/testsuite/gas/i386/arch-10-1.l.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-1.l	2008-01-22 10:17:04.000000000 -0800
@@ -0,0 +1,58 @@
+.*: Assembler messages:
+.*:4: Error: .*
+.*:6: Error: .*
+.*:8: Error: .*
+.*:10: Error: .*
+.*:12: Error: .*
+.*:14: Error: .*
+.*:16: Error: .*
+.*:18: Error: .*
+.*:20: Error: .*
+.*:22: Error: .*
+.*:24: Error: .*
+.*:26: Error: .*
+.*:28: Error: .*
+.*:30: Error: .*
+.*:32: Error: .*
+.*:34: Error: .*
+.*:36: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\.include "arch-10\.s"
+[ 	]*1[ 	]+\# Test -march=
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\# cmov feature 
+[ 	]*4[ 	]+cmove	%eax,%ebx
+[ 	]*5[ 	]+\# MMX
+[ 	]*6[ 	]+paddb %mm4,%mm3
+[ 	]*7[ 	]+\# SSE
+[ 	]*8[ 	]+addss %xmm4,%xmm3
+[ 	]*9[ 	]+\# SSE2
+[ 	]*10[ 	]+addsd %xmm4,%xmm3
+[ 	]*11[ 	]+\# SSE3
+[ 	]*12[ 	]+addsubpd %xmm4,%xmm3
+[ 	]*13[ 	]+\# SSSE3
+[ 	]*14[ 	]+phaddw %xmm4,%xmm3
+[ 	]*15[ 	]+\# SSE4\.1
+[ 	]*16[ 	]+phminposuw  %xmm1,%xmm3
+[ 	]*17[ 	]+\# SSE4\.2
+[ 	]*18[ 	]+crc32   %ecx,%ebx
+[ 	]*19[ 	]+\# VMX
+[ 	]*20[ 	]+vmxoff
+[ 	]*21[ 	]+\# SMX
+[ 	]*22[ 	]+getsec
+[ 	]*23[ 	]+\# 3DNow
+[ 	]*24[ 	]+pmulhrw %mm4,%mm3
+[ 	]*25[ 	]+\# 3DNow Extensions
+[ 	]*26[ 	]+pswapd %mm4,%mm3
+[ 	]*27[ 	]+\# SSE4a
+[ 	]*28[ 	]+insertq %xmm2,%xmm1
+[ 	]*29[ 	]+\# SVME
+[ 	]*30[ 	]+vmload
+[ 	]*31[ 	]+\# ABM
+[ 	]*32[ 	]+lzcnt %ecx,%ebx
+[ 	]*33[ 	]+\# SSE5
+[ 	]*34[ 	]+frczss          %xmm2, %xmm1
+[ 	]*35[ 	]+\# PadLock
+[ 	]*36[ 	]+xstorerng
--- binutils/gas/testsuite/gas/i386/arch-10-1.s.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-1.s	2008-01-22 09:35:21.000000000 -0800
@@ -0,0 +1 @@
+.include "arch-10.s"
--- binutils/gas/testsuite/gas/i386/arch-10-2.l.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-2.l	2008-01-22 10:16:05.000000000 -0800
@@ -0,0 +1,57 @@
+.*: Assembler messages:
+.*:6: Error: .*
+.*:8: Error: .*
+.*:10: Error: .*
+.*:12: Error: .*
+.*:14: Error: .*
+.*:16: Error: .*
+.*:18: Error: .*
+.*:20: Error: .*
+.*:22: Error: .*
+.*:24: Error: .*
+.*:26: Error: .*
+.*:28: Error: .*
+.*:30: Error: .*
+.*:32: Error: .*
+.*:34: Error: .*
+.*:36: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\.include "arch-10\.s"
+[ 	]*1[ 	]+\# Test -march=
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\# cmov feature 
+[ 	]*4[ 	]+\?\?\?\? 0F44D8   	cmove	%eax,%ebx
+[ 	]*5[ 	]+\# MMX
+[ 	]*6[ 	]+paddb %mm4,%mm3
+[ 	]*7[ 	]+\# SSE
+[ 	]*8[ 	]+addss %xmm4,%xmm3
+[ 	]*9[ 	]+\# SSE2
+[ 	]*10[ 	]+addsd %xmm4,%xmm3
+[ 	]*11[ 	]+\# SSE3
+[ 	]*12[ 	]+addsubpd %xmm4,%xmm3
+[ 	]*13[ 	]+\# SSSE3
+[ 	]*14[ 	]+phaddw %xmm4,%xmm3
+[ 	]*15[ 	]+\# SSE4\.1
+[ 	]*16[ 	]+phminposuw  %xmm1,%xmm3
+[ 	]*17[ 	]+\# SSE4\.2
+[ 	]*18[ 	]+crc32   %ecx,%ebx
+[ 	]*19[ 	]+\# VMX
+[ 	]*20[ 	]+vmxoff
+[ 	]*21[ 	]+\# SMX
+[ 	]*22[ 	]+getsec
+[ 	]*23[ 	]+\# 3DNow
+[ 	]*24[ 	]+pmulhrw %mm4,%mm3
+[ 	]*25[ 	]+\# 3DNow Extensions
+[ 	]*26[ 	]+pswapd %mm4,%mm3
+[ 	]*27[ 	]+\# SSE4a
+[ 	]*28[ 	]+insertq %xmm2,%xmm1
+[ 	]*29[ 	]+\# SVME
+[ 	]*30[ 	]+vmload
+[ 	]*31[ 	]+\# ABM
+[ 	]*32[ 	]+lzcnt %ecx,%ebx
+[ 	]*33[ 	]+\# SSE5
+[ 	]*34[ 	]+frczss          %xmm2, %xmm1
+[ 	]*35[ 	]+\# PadLock
+[ 	]*36[ 	]+xstorerng
--- binutils/gas/testsuite/gas/i386/arch-10-2.s.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-2.s	2008-01-22 09:40:56.000000000 -0800
@@ -0,0 +1 @@
+.include "arch-10.s"
--- binutils/gas/testsuite/gas/i386/arch-10-3.l.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-3.l	2008-01-22 10:13:53.000000000 -0800
@@ -0,0 +1,53 @@
+.*: Assembler messages:
+.*:20: Error: .*
+.*:22: Error: .*
+.*:24: Error: .*
+.*:26: Error: .*
+.*:28: Error: .*
+.*:30: Error: .*
+.*:32: Error: .*
+.*:34: Error: .*
+.*:36: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\.include "arch-10\.s"
+[ 	]*1[ 	]+\# Test -march=
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\# cmov feature 
+[ 	]*4[ 	]+\?\?\?\? 0F44D8   	cmove	%eax,%ebx
+[ 	]*5[ 	]+\# MMX
+[ 	]*6[ 	]+\?\?\?\? 0FFCDC   	paddb %mm4,%mm3
+[ 	]*7[ 	]+\# SSE
+[ 	]*8[ 	]+\?\?\?\? F30F58DC 	addss %xmm4,%xmm3
+[ 	]*9[ 	]+\# SSE2
+[ 	]*10[ 	]+\?\?\?\? F20F58DC 	addsd %xmm4,%xmm3
+[ 	]*11[ 	]+\# SSE3
+[ 	]*12[ 	]+\?\?\?\? 660FD0DC 	addsubpd %xmm4,%xmm3
+[ 	]*13[ 	]+\# SSSE3
+[ 	]*14[ 	]+\?\?\?\? 660F3801 	phaddw %xmm4,%xmm3
+[ 	]*14[ 	]+DC
+[ 	]*15[ 	]+\# SSE4\.1
+[ 	]*16[ 	]+\?\?\?\? 660F3841 	phminposuw  %xmm1,%xmm3
+[ 	]*16[ 	]+D9
+[ 	]*17[ 	]+\# SSE4\.2
+[ 	]*18[ 	]+\?\?\?\? F20F38F1 	crc32   %ecx,%ebx
+[ 	]*18[ 	]+D9
+[ 	]*19[ 	]+\# VMX
+[ 	]*20[ 	]+vmxoff
+[ 	]*21[ 	]+\# SMX
+[ 	]*22[ 	]+getsec
+[ 	]*23[ 	]+\# 3DNow
+[ 	]*24[ 	]+pmulhrw %mm4,%mm3
+[ 	]*25[ 	]+\# 3DNow Extensions
+[ 	]*26[ 	]+pswapd %mm4,%mm3
+[ 	]*27[ 	]+\# SSE4a
+[ 	]*28[ 	]+insertq %xmm2,%xmm1
+[ 	]*29[ 	]+\# SVME
+[ 	]*30[ 	]+vmload
+[ 	]*31[ 	]+\# ABM
+[ 	]*32[ 	]+lzcnt %ecx,%ebx
+[ 	]*33[ 	]+\# SSE5
+[ 	]*34[ 	]+frczss          %xmm2, %xmm1
+[ 	]*35[ 	]+\# PadLock
+[ 	]*36[ 	]+xstorerng
--- binutils/gas/testsuite/gas/i386/arch-10-3.s.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-3.s	2008-01-22 09:47:13.000000000 -0800
@@ -0,0 +1 @@
+.include "arch-10.s"
--- binutils/gas/testsuite/gas/i386/arch-10-4.l.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-4.l	2008-01-22 10:14:45.000000000 -0800
@@ -0,0 +1,51 @@
+.*: Assembler messages:
+.*:24: Error: .*
+.*:26: Error: .*
+.*:28: Error: .*
+.*:30: Error: .*
+.*:32: Error: .*
+.*:34: Error: .*
+.*:36: Error: .*
+GAS LISTING .*
+
+
+[ 	]*1[ 	]+\.include "arch-10\.s"
+[ 	]*1[ 	]+\# Test -march=
+[ 	]*2[ 	]+\.text
+[ 	]*3[ 	]+\# cmov feature 
+[ 	]*4[ 	]+\?\?\?\? 0F44D8   	cmove	%eax,%ebx
+[ 	]*5[ 	]+\# MMX
+[ 	]*6[ 	]+\?\?\?\? 0FFCDC   	paddb %mm4,%mm3
+[ 	]*7[ 	]+\# SSE
+[ 	]*8[ 	]+\?\?\?\? F30F58DC 	addss %xmm4,%xmm3
+[ 	]*9[ 	]+\# SSE2
+[ 	]*10[ 	]+\?\?\?\? F20F58DC 	addsd %xmm4,%xmm3
+[ 	]*11[ 	]+\# SSE3
+[ 	]*12[ 	]+\?\?\?\? 660FD0DC 	addsubpd %xmm4,%xmm3
+[ 	]*13[ 	]+\# SSSE3
+[ 	]*14[ 	]+\?\?\?\? 660F3801 	phaddw %xmm4,%xmm3
+[ 	]*14[ 	]+DC
+[ 	]*15[ 	]+\# SSE4\.1
+[ 	]*16[ 	]+\?\?\?\? 660F3841 	phminposuw  %xmm1,%xmm3
+[ 	]*16[ 	]+D9
+[ 	]*17[ 	]+\# SSE4\.2
+[ 	]*18[ 	]+\?\?\?\? F20F38F1 	crc32   %ecx,%ebx
+[ 	]*18[ 	]+D9
+[ 	]*19[ 	]+\# VMX
+[ 	]*20[ 	]+\?\?\?\? 0F01C4   	vmxoff
+[ 	]*21[ 	]+\# SMX
+[ 	]*22[ 	]+\?\?\?\? 0F37     	getsec
+[ 	]*23[ 	]+\# 3DNow
+[ 	]*24[ 	]+pmulhrw %mm4,%mm3
+[ 	]*25[ 	]+\# 3DNow Extensions
+[ 	]*26[ 	]+pswapd %mm4,%mm3
+[ 	]*27[ 	]+\# SSE4a
+[ 	]*28[ 	]+insertq %xmm2,%xmm1
+[ 	]*29[ 	]+\# SVME
+[ 	]*30[ 	]+vmload
+[ 	]*31[ 	]+\# ABM
+[ 	]*32[ 	]+lzcnt %ecx,%ebx
+[ 	]*33[ 	]+\# SSE5
+[ 	]*34[ 	]+frczss          %xmm2, %xmm1
+[ 	]*35[ 	]+\# PadLock
+[ 	]*36[ 	]+xstorerng
--- binutils/gas/testsuite/gas/i386/arch-10-4.s.arch	2008-01-22 10:17:32.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10-4.s	2008-01-22 10:00:01.000000000 -0800
@@ -0,0 +1 @@
+.include "arch-10.s"
--- binutils/gas/testsuite/gas/i386/arch-10.d.arch	2008-01-22 08:46:18.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10.d	2008-01-22 10:45:42.000000000 -0800
@@ -0,0 +1,27 @@
+#as: -march=i686+sse4+vmx+smx+sse5+3dnowa+svme+padlock
+#objdump: -dw
+#name: i386 arch 10
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <.text>:
+[ 	]*[a-f0-9]+:	0f 44 d8             	cmove  %eax,%ebx
+[ 	]*[a-f0-9]+:	0f fc dc             	paddb  %mm4,%mm3
+[ 	]*[a-f0-9]+:	f3 0f 58 dc          	addss  %xmm4,%xmm3
+[ 	]*[a-f0-9]+:	f2 0f 58 dc          	addsd  %xmm4,%xmm3
+[ 	]*[a-f0-9]+:	66 0f d0 dc          	addsubpd %xmm4,%xmm3
+[ 	]*[a-f0-9]+:	66 0f 38 01 dc       	phaddw %xmm4,%xmm3
+[ 	]*[a-f0-9]+:	66 0f 38 41 d9       	phminposuw %xmm1,%xmm3
+[ 	]*[a-f0-9]+:	f2 0f 38 f1 d9       	crc32l %ecx,%ebx
+[ 	]*[a-f0-9]+:	0f 01 c4             	vmxoff 
+[ 	]*[a-f0-9]+:	0f 37                	getsec 
+[ 	]*[a-f0-9]+:	0f 0f dc b7          	pmulhrw %mm4,%mm3
+[ 	]*[a-f0-9]+:	0f 0f dc bb          	pswapd %mm4,%mm3
+[ 	]*[a-f0-9]+:	f2 0f 79 ca          	insertq %xmm2,%xmm1
+[ 	]*[a-f0-9]+:	0f 01 da             	vmload 
+[ 	]*[a-f0-9]+:	f3 0f bd d9          	lzcnt  %ecx,%ebx
+[ 	]*[a-f0-9]+:	0f 7a 12 ca          	frczss %xmm2,%xmm1
+[ 	]*[a-f0-9]+:	0f a7 c0             	xstore-rng 
+#pass
--- binutils/gas/testsuite/gas/i386/arch-10.s.arch	2008-01-22 08:46:18.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/arch-10.s	2008-01-22 10:06:48.000000000 -0800
@@ -0,0 +1,36 @@
+# Test -march=
+	.text
+# cmov feature 
+cmove	%eax,%ebx
+# MMX
+paddb %mm4,%mm3
+# SSE
+addss %xmm4,%xmm3
+# SSE2
+addsd %xmm4,%xmm3
+# SSE3
+addsubpd %xmm4,%xmm3
+# SSSE3
+phaddw %xmm4,%xmm3
+# SSE4.1
+phminposuw  %xmm1,%xmm3
+# SSE4.2
+crc32   %ecx,%ebx
+# VMX
+vmxoff
+# SMX
+getsec
+# 3DNow
+pmulhrw %mm4,%mm3
+# 3DNow Extensions
+pswapd %mm4,%mm3
+# SSE4a
+insertq %xmm2,%xmm1
+# SVME
+vmload
+# ABM
+lzcnt %ecx,%ebx
+# SSE5
+frczss          %xmm2, %xmm1
+# PadLock
+xstorerng
--- binutils/gas/testsuite/gas/i386/i386.exp.arch	2008-01-04 10:03:20.000000000 -0800
+++ binutils/gas/testsuite/gas/i386/i386.exp	2008-01-22 10:45:20.000000000 -0800
@@ -107,6 +107,11 @@ if [expr ([istarget "i*86-*-*"] ||  [ist
     run_dump_test "arch-7"
     run_dump_test "arch-8"
     run_dump_test "arch-9"
+    run_dump_test "arch-10"
+    run_list_test "arch-10-1" "-march=generic32 -I${srcdir}/$subdir -al"
+    run_list_test "arch-10-2" "-march=i686 -I${srcdir}/$subdir -al"
+    run_list_test "arch-10-3" "-march=i686+sse4.2 -I${srcdir}/$subdir -al"
+    run_list_test "arch-10-4" "-march=i686+sse4+vmx+smx -I${srcdir}/$subdir -al"
 
     # These tests require support for 8 and 16 bit relocs,
     # so we only run them for ELF and COFF targets.
--- binutils/gas/testsuite/gas/i386/nops-2-i386.d.arch	2007-09-20 10:38:49.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/nops-2-i386.d	2008-01-22 08:46:18.000000000 -0800
@@ -8,7 +8,7 @@
 Disassembly of section .text:
 
 0+ <nop>:
-[	 ]*0:[	 ]+0f 44 c0[	 ]+cmove[ 	]+%eax,%eax
+[	 ]*0:[	 ]+0f be f0[	 ]+movsbl[ 	]+%al,%esi
 [	 ]*3:[	 ]+8d b6 00 00 00 00[	 ]+lea[ 	]+0x0\(%esi\),%esi
 [	 ]*9:[	 ]+8d bc 27 00 00 00 00[	 ]+lea[ 	]+0x0\(%edi,%eiz,1\),%edi
 
--- binutils/gas/testsuite/gas/i386/nops-2-merom.d.arch	2007-09-20 10:38:49.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/nops-2-merom.d	2008-01-22 08:46:18.000000000 -0800
@@ -8,7 +8,7 @@
 Disassembly of section .text:
 
 0+ <nop>:
-[	 ]*0:[	 ]+0f 44 c0[	 ]+cmove[ 	]+%eax,%eax
+[	 ]*0:[	 ]+0f be f0[	 ]+movsbl[ 	]+%al,%esi
 [	 ]*3:[	 ]+8d b6 00 00 00 00[	 ]+lea[ 	]+0x0\(%esi\),%esi
 [	 ]*9:[	 ]+8d bc 27 00 00 00 00[	 ]+lea[ 	]+0x0\(%edi,%eiz,1\),%edi
 
--- binutils/gas/testsuite/gas/i386/nops-2.d.arch	2007-09-20 10:38:49.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/nops-2.d	2008-01-22 08:46:18.000000000 -0800
@@ -7,7 +7,7 @@
 Disassembly of section .text:
 
 0+ <nop>:
-[	 ]*0:[	 ]+0f 44 c0[	 ]+cmove[ 	]+%eax,%eax
+[	 ]*0:[	 ]+0f be f0[	 ]+movsbl[ 	]+%al,%esi
 [	 ]*3:[	 ]+8d b6 00 00 00 00[	 ]+lea[ 	]+0x0\(%esi\),%esi
 [	 ]*9:[	 ]+8d bc 27 00 00 00 00[	 ]+lea[ 	]+0x0\(%edi,%eiz,1\),%edi
 
--- binutils/gas/testsuite/gas/i386/nops-2.s.arch	2006-06-23 14:47:36.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/nops-2.s	2008-01-22 08:46:18.000000000 -0800
@@ -1,6 +1,6 @@
 	.text
 nop:
-	cmove	%eax,%eax
+	movsbl %al,%esi
 	.p2align 4
 
 nop15:
--- binutils/gas/testsuite/gas/i386/x86-64-nops-2.d.arch	2007-07-23 13:03:23.000000000 -0700
+++ binutils/gas/testsuite/gas/i386/x86-64-nops-2.d	2008-01-22 08:46:18.000000000 -0800
@@ -7,7 +7,7 @@
 Disassembly of section .text:
 
 0+ <nop>:
-[ 	]*[a-f0-9]+:	0f 44 c0             	cmove  %eax,%eax
+[ 	]*[a-f0-9]+:	0f be f0             	movsbl %al,%esi
 [ 	]*[a-f0-9]+:	66 66 66 66 2e 0f 1f 84 00 00 00 00 00 	nopw   %cs:0x0\(%rax,%rax,1\)
 
 0+10 <nop15>:
--- binutils/opcodes/i386-gen.c.arch	2008-01-15 07:14:58.000000000 -0800
+++ binutils/opcodes/i386-gen.c	2008-01-22 08:55:16.000000000 -0800
@@ -96,6 +96,10 @@ static initializer cpu_flag_init [] =
     "CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1" },
   { "CPU_SSE4_2_FLAGS",
     "CpuMMX|CpuMMX2|CpuSSE|CpuSSE2|CpuSSE3|CpuSSSE3|CpuSSE4_1|CpuSSE4_2" },
+  { "CPU_VMX_FLAGS",
+    "CpuVMX" },
+  { "CPU_SMX_FLAGS",
+    "CpuSMX" },
   { "CPU_3DNOW_FLAGS",
     "CpuMMX|Cpu3dnow" },
   { "CPU_3DNOWA_FLAGS",
--- binutils/opcodes/i386-init.h.arch	2008-01-15 07:14:58.000000000 -0800
+++ binutils/opcodes/i386-init.h	2008-01-22 08:55:55.000000000 -0800
@@ -130,6 +130,14 @@
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0,  \
       1, 0, 0, 1, 1, 0, 0, 0, 0, 0 } }
 
+#define CPU_VMX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0,  \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
+#define CPU_SMX_FLAGS \
+  { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1,  \
+      0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
+
 #define CPU_3DNOW_FLAGS \
   { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0,  \
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]