gas/
authorH.J. Lu <hjl.tools@gmail.com>
Thu, 10 Apr 2008 17:53:40 +0000 (17:53 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Thu, 10 Apr 2008 17:53:40 +0000 (17:53 +0000)
2008-04-10  H.J. Lu  <hongjiu.lu@intel.com>

* NEWS: Mention -msse-check=[none|error|warning].

* config/tc-i386.c (sse_check): New.
(OPTION_MSSE_CHECK): Likewise.
(md_assemble): Check SSE instructions if needed.
(md_longopts): Add -msse-check.
(md_parse_option): Handle OPTION_MSSE_CHECK.
(md_show_usage): Show -msse-check=[none|error|warning].

* doc/c-i386.texi: Document -msse-check=[none|error|warning].

gas/testsuite/

2008-04-10  H.J. Lu  <hongjiu.lu@intel.com>

* gas/i386/i386.exp: Run sse-check, sse-check-warn,
sse-check-error, x86-64-sse-check, x86-64-sse-check-warn and
x86-64-sse-check-error.

* gas/i386/sse-check.d: New.
* gas/i386/sse-check.s: Likewise.
* gas/i386/sse-check-error.l: Likewise.
* gas/i386/sse-check-error.s: Likewise.
* gas/i386/sse-check-warn.d: Likewise.
* gas/i386/sse-check-warn.e: Likewise.
* gas/i386/x86-64-sse-check.d: Likewise.
* gas/i386/x86-64-sse-check-error.l: Likewise.
* gas/i386/x86-64-sse-check-error.s: Likewise.
* gas/i386/x86-64-sse-check-warn.d: Likewise.

16 files changed:
gas/ChangeLog
gas/NEWS
gas/config/tc-i386.c
gas/doc/c-i386.texi
gas/testsuite/ChangeLog
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/sse-check-error.l [new file with mode: 0644]
gas/testsuite/gas/i386/sse-check-error.s [new file with mode: 0644]
gas/testsuite/gas/i386/sse-check-warn.d [new file with mode: 0644]
gas/testsuite/gas/i386/sse-check-warn.e [new file with mode: 0644]
gas/testsuite/gas/i386/sse-check.d [new file with mode: 0644]
gas/testsuite/gas/i386/sse-check.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-sse-check-error.l [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-sse-check-error.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-sse-check-warn.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-sse-check.d [new file with mode: 0644]

index c25d7a3c54771f637587954ed634ffca527d28b9..f0bb52b0491237fb44d60647c815f990d40b834c 100644 (file)
@@ -1,3 +1,16 @@
+2008-04-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * NEWS: Mention -msse-check=[none|error|warning].
+
+       * config/tc-i386.c (sse_check): New.
+       (OPTION_MSSE_CHECK): Likewise.
+       (md_assemble): Check SSE instructions if needed.
+       (md_longopts): Add -msse-check.
+       (md_parse_option): Handle OPTION_MSSE_CHECK.
+       (md_show_usage): Show -msse-check=[none|error|warning].
+
+       * doc/c-i386.texi: Document -msse-check=[none|error|warning].
+
 2008-04-10  Santiago Urueña  <suruena@gmail.com>
 
        * listing.c: Add -ag listing flag to show general information in
index f6cd969ac07539827d75bbf0b177965d6d62af48..eefe9068b36a7ca3f6ec9973a4f5398ce5c81b01 100644 (file)
--- a/gas/NEWS
+++ b/gas/NEWS
@@ -1,4 +1,7 @@
 -*- text -*-
+* New command line option, -msse-check=[none|error|warning], for x86
+  targets.
+
 * New sub-option added to the assembler's -a command line switch to
   generate a listing output.  The 'g' sub-option will insert into the listing
   various information about the assembly, such as assembler version, the
index f6b3909cb3977fbe71c3e0fe9c6af9cf25f0d3cb..2a5e79c0e63f9ac45690b18345c4c3490ce95d12 100644 (file)
@@ -434,6 +434,14 @@ static int allow_naked_reg = 0;
 /* 1 if pseudo index register, eiz/riz, is allowed .  */
 static int allow_index_reg = 0;
 
+static enum
+  {
+    sse_check_none = 0,
+    sse_check_warning,
+    sse_check_error
+  }
+sse_check;
+
 /* Register prefix used for error message.  */
 static const char *register_prefix = "%";
 
@@ -2661,6 +2669,19 @@ md_assemble (char *line)
   if (!match_template ())
     return;
 
+  if (sse_check != sse_check_none
+      && (i.tm.cpu_flags.bitfield.cpusse
+         || i.tm.cpu_flags.bitfield.cpusse2
+         || i.tm.cpu_flags.bitfield.cpusse3
+         || i.tm.cpu_flags.bitfield.cpussse3
+         || i.tm.cpu_flags.bitfield.cpusse4_1
+         || i.tm.cpu_flags.bitfield.cpusse4_2))
+    {
+      (sse_check == sse_check_warning
+       ? as_warn
+       : as_bad) (_("SSE instruction `%s' is used"), i.tm.name);
+    }
+
   /* Zap movzx and movsx suffix.  The suffix has been set from
      "word ptr" or "byte ptr" on the source operand in Intel syntax
      or extracted from mnemonic in AT&T syntax.  But we'll use
@@ -7798,6 +7819,7 @@ const char *md_shortopts = "qn";
 #define OPTION_MNAKED_REG (OPTION_MD_BASE + 8)
 #define OPTION_MOLD_GCC (OPTION_MD_BASE + 9)
 #define OPTION_MSSE2AVX (OPTION_MD_BASE + 10)
+#define OPTION_MSSE_CHECK (OPTION_MD_BASE + 11)
 
 struct option md_longopts[] =
 {
@@ -7814,6 +7836,7 @@ struct option md_longopts[] =
   {"mnaked-reg", no_argument, NULL, OPTION_MNAKED_REG},
   {"mold-gcc", no_argument, NULL, OPTION_MOLD_GCC},
   {"msse2avx", no_argument, NULL, OPTION_MSSE2AVX},
+  {"msse-check", required_argument, NULL, OPTION_MSSE_CHECK},
   {NULL, no_argument, NULL, 0}
 };
 size_t md_longopts_size = sizeof (md_longopts);
@@ -8007,6 +8030,17 @@ md_parse_option (int c, char *arg)
       sse2avx = 1;
       break;
 
+    case OPTION_MSSE_CHECK:
+      if (strcasecmp (arg, "error") == 0)
+       sse_check = sse_check_error;
+      else if (strcasecmp (arg, "warning") == 0)
+       sse_check = sse_check_warning;
+      else if (strcasecmp (arg, "none") == 0)
+       sse_check = sse_check_none;
+      else
+       as_fatal (_("Invalid -msse-check= option: `%s'"), arg);
+      break;
+
     default:
       return 0;
     }
@@ -8061,6 +8095,9 @@ md_show_usage (stream)
   fprintf (stream, _("\
   -msse2avx               encode SSE instructions with VEX prefix\n"));
   fprintf (stream, _("\
+  -msse-check=[none|error|warning]\n\
+                          check SSE instructions\n"));
+  fprintf (stream, _("\
   -mmnemonic=[att|intel]  use AT&T/Intel mnemonic\n"));
   fprintf (stream, _("\
   -msyntax=[att|intel]    use AT&T/Intel syntax\n"));
index 3e148a2571bb374a46bb9fb7c9b34ed8dba61043..1fd3476c16119b968c817af220333066bf94c535 100644 (file)
@@ -155,6 +155,18 @@ Valid @var{CPU} values are identical to the processor list of
 This option specifies that the assembler should encode SSE instructions
 with VEX prefix.
 
+@cindex @samp{-msse-check=} option, i386
+@cindex @samp{-msse-check=} option, x86-64
+@item -msse-check=@var{none}
+@item -msse-check=@var{warning}
+@item -msse-check=@var{error}
+These options control if the assembler should check SSE intructions.
+@option{-msse-check=@var{none}} will make the assembler not to check SSE
+instructions,  which is the default.  @option{-msse-check=@var{warning}}
+will make the assembler issue a warning for any SSE intruction.
+@option{-msse-check=@var{error}} will make the assembler issue an error
+for any SSE intruction.
+
 @cindex @samp{-mmnemonic=} option, i386
 @cindex @samp{-mmnemonic=} option, x86-64
 @item -mmnemonic=@var{att}
index bc3110324df35771558bbd004400c03ec9f47af3..152e4f57953f1c41fb01be4eed2bb5ce843779a2 100644 (file)
@@ -1,3 +1,20 @@
+2008-04-10  H.J. Lu  <hongjiu.lu@intel.com>
+
+       * gas/i386/i386.exp: Run sse-check, sse-check-warn,
+       sse-check-error, x86-64-sse-check, x86-64-sse-check-warn and
+       x86-64-sse-check-error.
+
+       * gas/i386/sse-check.d: New.
+       * gas/i386/sse-check.s: Likewise.
+       * gas/i386/sse-check-error.l: Likewise.
+       * gas/i386/sse-check-error.s: Likewise.
+       * gas/i386/sse-check-warn.d: Likewise.
+       * gas/i386/sse-check-warn.e: Likewise.
+       * gas/i386/x86-64-sse-check.d: Likewise.
+       * gas/i386/x86-64-sse-check-error.l: Likewise.
+       * gas/i386/x86-64-sse-check-error.s: Likewise.
+       * gas/i386/x86-64-sse-check-warn.d: Likewise.
+
 2008-04-10  Santiago Urueña  <suruena@gmail.com>
 
        * gas/all/gas.exp: Check the performance of the -ag command line
index 4111fe594fe1e39eea39f9791ea263ae9d0511e9..18d6a7d123a405288a46e4bc592ce45492a2f47e 100644 (file)
@@ -124,6 +124,9 @@ if [expr ([istarget "i*86-*-*"] ||  [istarget "x86_64-*-*"]) && [gas_32_check]]
     run_dump_test "avx-intel"
     run_dump_test "sse2avx"
     run_list_test "inval-avx" "-al"
+    run_dump_test "sse-check"
+    run_dump_test "sse-check-warn"
+    run_list_test "sse-check-error" "-msse-check=error -I${srcdir}/$subdir -al"
 
     # These tests require support for 8 and 16 bit relocs,
     # so we only run them for ELF and COFF targets.
@@ -250,6 +253,9 @@ if [expr ([istarget "i*86-*-*"] || [istarget "x86_64-*-*"]) && [gas_64_check]] t
     run_dump_test "x86-64-avx-intel"
     run_dump_test "x86-64-sse2avx"
     run_list_test "x86-64-inval-avx" "-al"
+    run_dump_test "x86-64-sse-check"
+    run_dump_test "x86-64-sse-check-warn"
+    run_list_test "x86-64-sse-check-error" "-msse-check=error -I${srcdir}/$subdir -al"
 
     if { ![istarget "*-*-aix*"]
       && ![istarget "*-*-beos*"]
diff --git a/gas/testsuite/gas/i386/sse-check-error.l b/gas/testsuite/gas/i386/sse-check-error.l
new file mode 100644 (file)
index 0000000..bd1c4f6
--- /dev/null
@@ -0,0 +1,40 @@
+.*: Assembler messages:
+.*:7: Error: .*
+.*:10: Error: .*
+.*:13: Error: .*
+.*:16: Error: .*
+.*:19: Error: .*
+.*:20: Error: .*
+GAS LISTING .*
+
+
+[      ]*1[    ]+\.include "sse-check\.s"
+[      ]*1[    ]+\# Check SSE instructions
+[      ]*2[    ]+
+[      ]*3[    ]+\.text
+[      ]*4[    ]+_start:
+[      ]*5[    ]+
+[      ]*6[    ]+\# SSE instruction
+[      ]*7[    ]+\?\?\?\? 0F58CA               addps %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addps' is used
+[      ]*8[    ]+
+[      ]*9[    ]+\# SSE2 instruction
+[      ]*10[   ]+\?\?\?\? 660F58CA             addpd %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addpd' is used
+[      ]*11[   ]+
+[      ]*12[   ]+\# SSE3 instruction
+[      ]*13[   ]+\?\?\?\? 660FD0CA             addsubpd %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addsubpd' is used
+[      ]*14[   ]+
+[      ]*15[   ]+\# SSSE3 instruction
+[      ]*16[   ]+\?\?\?\? 660F3801             phaddw %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `phaddw' is used
+[      ]*16[   ]+CA
+[      ]*17[   ]+
+[      ]*18[   ]+\# SSE4 instructions
+[      ]*19[   ]+\?\?\?\? 660F3815             blendvpd %xmm0,%xmm1,%xmm0
+\*\*\*\*  Error:SSE instruction `blendvpd' is used
+[      ]*19[   ]+C1
+[      ]*20[   ]+\?\?\?\? 660F3837             pcmpgtq %xmm1,%xmm0
+\*\*\*\*  Error:SSE instruction `pcmpgtq' is used
+[      ]*20[   ]+C1
diff --git a/gas/testsuite/gas/i386/sse-check-error.s b/gas/testsuite/gas/i386/sse-check-error.s
new file mode 100644 (file)
index 0000000..450ff1f
--- /dev/null
@@ -0,0 +1 @@
+.include "sse-check.s"
diff --git a/gas/testsuite/gas/i386/sse-check-warn.d b/gas/testsuite/gas/i386/sse-check-warn.d
new file mode 100644 (file)
index 0000000..0b96b15
--- /dev/null
@@ -0,0 +1,18 @@
+#source: sse-check.s
+#as: -msse-check=warning
+#stderr: sse-check-warn.e
+#objdump: -dw
+#name: i386 SSE check (warning)
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    0f 58 ca                addps  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 58 ca             addpd  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f d0 ca             addsubpd %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 01 ca          phaddw %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 15 c1          blendvpd %xmm0,%xmm1,%xmm0
+[      ]*[a-f0-9]+:    66 0f 38 37 c1          pcmpgtq %xmm1,%xmm0
+#pass
diff --git a/gas/testsuite/gas/i386/sse-check-warn.e b/gas/testsuite/gas/i386/sse-check-warn.e
new file mode 100644 (file)
index 0000000..26b2001
--- /dev/null
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:7: Warning: SSE instruction `addps' is used
+.*:10: Warning: SSE instruction `addpd' is used
+.*:13: Warning: SSE instruction `addsubpd' is used
+.*:16: Warning: SSE instruction `phaddw' is used
+.*:19: Warning: SSE instruction `blendvpd' is used
+.*:20: Warning: SSE instruction `pcmpgtq' is used
diff --git a/gas/testsuite/gas/i386/sse-check.d b/gas/testsuite/gas/i386/sse-check.d
new file mode 100644 (file)
index 0000000..9329638
--- /dev/null
@@ -0,0 +1,16 @@
+#as: -msse-check=none
+#objdump: -dw
+#name: i386 SSE check (none)
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    0f 58 ca                addps  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 58 ca             addpd  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f d0 ca             addsubpd %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 01 ca          phaddw %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 15 c1          blendvpd %xmm0,%xmm1,%xmm0
+[      ]*[a-f0-9]+:    66 0f 38 37 c1          pcmpgtq %xmm1,%xmm0
+#pass
diff --git a/gas/testsuite/gas/i386/sse-check.s b/gas/testsuite/gas/i386/sse-check.s
new file mode 100644 (file)
index 0000000..7e5d208
--- /dev/null
@@ -0,0 +1,20 @@
+# Check SSE instructions
+
+       .text
+_start:
+
+# SSE instruction
+       addps %xmm2,%xmm1
+
+# SSE2 instruction
+       addpd %xmm2,%xmm1
+
+# SSE3 instruction
+       addsubpd %xmm2,%xmm1
+
+# SSSE3 instruction
+       phaddw %xmm2,%xmm1
+
+# SSE4 instructions
+       blendvpd %xmm0,%xmm1,%xmm0
+       pcmpgtq %xmm1,%xmm0
diff --git a/gas/testsuite/gas/i386/x86-64-sse-check-error.l b/gas/testsuite/gas/i386/x86-64-sse-check-error.l
new file mode 100644 (file)
index 0000000..bd1c4f6
--- /dev/null
@@ -0,0 +1,40 @@
+.*: Assembler messages:
+.*:7: Error: .*
+.*:10: Error: .*
+.*:13: Error: .*
+.*:16: Error: .*
+.*:19: Error: .*
+.*:20: Error: .*
+GAS LISTING .*
+
+
+[      ]*1[    ]+\.include "sse-check\.s"
+[      ]*1[    ]+\# Check SSE instructions
+[      ]*2[    ]+
+[      ]*3[    ]+\.text
+[      ]*4[    ]+_start:
+[      ]*5[    ]+
+[      ]*6[    ]+\# SSE instruction
+[      ]*7[    ]+\?\?\?\? 0F58CA               addps %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addps' is used
+[      ]*8[    ]+
+[      ]*9[    ]+\# SSE2 instruction
+[      ]*10[   ]+\?\?\?\? 660F58CA             addpd %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addpd' is used
+[      ]*11[   ]+
+[      ]*12[   ]+\# SSE3 instruction
+[      ]*13[   ]+\?\?\?\? 660FD0CA             addsubpd %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `addsubpd' is used
+[      ]*14[   ]+
+[      ]*15[   ]+\# SSSE3 instruction
+[      ]*16[   ]+\?\?\?\? 660F3801             phaddw %xmm2,%xmm1
+\*\*\*\*  Error:SSE instruction `phaddw' is used
+[      ]*16[   ]+CA
+[      ]*17[   ]+
+[      ]*18[   ]+\# SSE4 instructions
+[      ]*19[   ]+\?\?\?\? 660F3815             blendvpd %xmm0,%xmm1,%xmm0
+\*\*\*\*  Error:SSE instruction `blendvpd' is used
+[      ]*19[   ]+C1
+[      ]*20[   ]+\?\?\?\? 660F3837             pcmpgtq %xmm1,%xmm0
+\*\*\*\*  Error:SSE instruction `pcmpgtq' is used
+[      ]*20[   ]+C1
diff --git a/gas/testsuite/gas/i386/x86-64-sse-check-error.s b/gas/testsuite/gas/i386/x86-64-sse-check-error.s
new file mode 100644 (file)
index 0000000..450ff1f
--- /dev/null
@@ -0,0 +1 @@
+.include "sse-check.s"
diff --git a/gas/testsuite/gas/i386/x86-64-sse-check-warn.d b/gas/testsuite/gas/i386/x86-64-sse-check-warn.d
new file mode 100644 (file)
index 0000000..691185c
--- /dev/null
@@ -0,0 +1,18 @@
+#source: sse-check.s
+#as: -msse-check=warning
+#stderr: sse-check-warn.e
+#objdump: -dw
+#name: x86-64 SSE check (warning)
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    0f 58 ca                addps  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 58 ca             addpd  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f d0 ca             addsubpd %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 01 ca          phaddw %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 15 c1          blendvpd %xmm0,%xmm1,%xmm0
+[      ]*[a-f0-9]+:    66 0f 38 37 c1          pcmpgtq %xmm1,%xmm0
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-sse-check.d b/gas/testsuite/gas/i386/x86-64-sse-check.d
new file mode 100644 (file)
index 0000000..9ca0c79
--- /dev/null
@@ -0,0 +1,17 @@
+#source: sse-check.s
+#as: -msse-check=none
+#objdump: -dw
+#name: x86-64 SSE check (none)
+
+.*:     file format .*
+
+Disassembly of section .text:
+
+0+ <_start>:
+[      ]*[a-f0-9]+:    0f 58 ca                addps  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 58 ca             addpd  %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f d0 ca             addsubpd %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 01 ca          phaddw %xmm2,%xmm1
+[      ]*[a-f0-9]+:    66 0f 38 15 c1          blendvpd %xmm0,%xmm1,%xmm0
+[      ]*[a-f0-9]+:    66 0f 38 37 c1          pcmpgtq %xmm1,%xmm0
+#pass