[binutils-gdb] x86: actually implement .noopt
Jan Beulich
jbeulich@sourceware.org
Fri Feb 2 07:27:30 GMT 2024
https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1e7dd4a0348c5985df1a3e9765fc49da19663527
commit 1e7dd4a0348c5985df1a3e9765fc49da19663527
Author: Jan Beulich <jbeulich@suse.com>
Date: Fri Feb 2 08:26:22 2024 +0100
x86: actually implement .noopt
For quite some time we've had support for -O command line options. With
that ignoring at least .noopt isn't really a good idea.
Re-purpose the optimize-3 test for testing this directive's effect as
well.
As to the doc addition - this uses the same text as is there for the
{nooptimize} pseudo-prefix, despite me not being convinced of the "size"
part being fully accurate there (and hence also here).
Diff:
---
gas/config/tc-i386.c | 15 ++++++++++++-
gas/doc/c-i386.texi | 4 ++++
gas/testsuite/gas/i386/i386.exp | 1 +
gas/testsuite/gas/i386/noopt.d | 4 ++++
gas/testsuite/gas/i386/noopt.s | 2 ++
gas/testsuite/gas/i386/optimize-3.d | 2 +-
gas/testsuite/gas/i386/optimize-3.s | 42 ++++++++++++++++++++++---------------
7 files changed, 51 insertions(+), 19 deletions(-)
diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
index 2e578e2b0d7..e091b864e03 100644
--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -140,6 +140,7 @@ arch_entry;
static void update_code_flag (int, int);
static void s_insn (int);
+static void s_noopt (int);
static void set_code_flag (int);
static void set_16bit_gcc_code_flag (int);
static void set_intel_syntax (int);
@@ -1232,7 +1233,7 @@ const pseudo_typeS md_pseudo_table[] =
{"value", cons, 2},
{"slong", signed_cons, 4},
{"insn", s_insn, 0},
- {"noopt", s_ignore, 0},
+ {"noopt", s_noopt, 0},
{"optim", s_ignore, 0},
{"code16gcc", set_16bit_gcc_code_flag, CODE_16BIT},
{"code16", set_code_flag, CODE_16BIT},
@@ -4999,6 +5000,18 @@ optimize_encoding (void)
}
}
+static void
+s_noopt (int dummy ATTRIBUTE_UNUSED)
+{
+ if (!is_it_end_of_statement ())
+ as_warn (_("`.noopt' arguments ignored"));
+
+ optimize = 0;
+ optimize_for_space = 0;
+
+ ignore_rest_of_line ();
+}
+
/* Return non-zero for load instruction. */
static int
diff --git a/gas/doc/c-i386.texi b/gas/doc/c-i386.texi
index 063a9e7e9dc..3d2d28feff0 100644
--- a/gas/doc/c-i386.texi
+++ b/gas/doc/c-i386.texi
@@ -763,6 +763,10 @@ be suffixed by @code{@{:d@var{n}@}} to specify the size (in bytes).
This can be combined with an embedded broadcast specifier:
@samp{8(%eax)@{1to8:d8@}}.
+@cindex @code{noopt} directive
+@item .noopt
+Disable instruction size optimization.
+
@c FIXME: Document other x86 specific directives ? Eg: .code16gcc,
@end table
diff --git a/gas/testsuite/gas/i386/i386.exp b/gas/testsuite/gas/i386/i386.exp
index 46689a80fcf..2584c69bddc 100644
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -615,6 +615,7 @@ if [gas_32_check] then {
run_list_test "optimize-6a" "-I${srcdir}/$subdir -march=+noavx -al"
run_dump_test "optimize-6b"
run_list_test "optimize-7" "-I${srcdir}/$subdir -march=+noavx2 -al"
+ run_dump_test "noopt"
run_dump_test "lea-optimize"
run_dump_test "lea16-optimize"
run_dump_test "lea16-optimize2"
diff --git a/gas/testsuite/gas/i386/noopt.d b/gas/testsuite/gas/i386/noopt.d
new file mode 100644
index 00000000000..940780f44b8
--- /dev/null
+++ b/gas/testsuite/gas/i386/noopt.d
@@ -0,0 +1,4 @@
+#as: -Os -I${srcdir}/$subdir
+#objdump: -drw
+#name: .noopt directive
+#dump: optimize-3.d
diff --git a/gas/testsuite/gas/i386/noopt.s b/gas/testsuite/gas/i386/noopt.s
new file mode 100644
index 00000000000..a93c87c8496
--- /dev/null
+++ b/gas/testsuite/gas/i386/noopt.s
@@ -0,0 +1,2 @@
+ .noopt
+ .include "optimize-3.s"
diff --git a/gas/testsuite/gas/i386/optimize-3.d b/gas/testsuite/gas/i386/optimize-3.d
index 3a6fa062161..94260983754 100644
--- a/gas/testsuite/gas/i386/optimize-3.d
+++ b/gas/testsuite/gas/i386/optimize-3.d
@@ -1,4 +1,4 @@
-#as: -Os
+#as: -Os --defsym USE_PREFIX=1
#objdump: -drw
#name: optimized encoding 3 with -Os
diff --git a/gas/testsuite/gas/i386/optimize-3.s b/gas/testsuite/gas/i386/optimize-3.s
index badb8954603..b809b9ffa00 100644
--- a/gas/testsuite/gas/i386/optimize-3.s
+++ b/gas/testsuite/gas/i386/optimize-3.s
@@ -1,24 +1,32 @@
# Check instructions with optimized encoding
+ .macro noopt insn:vararg
+ .ifdef USE_PREFIX
+ {nooptimize} \insn
+ .else
+ \insn
+ .endif
+ .endm
+
.text
_start:
- {nooptimize} testl $0x7f, %eax
+ noopt testl $0x7f, %eax
- {nooptimize} lock xchg %ecx, (%edx)
- {nooptimize} lock xchg (%ecx), %edx
+ noopt lock xchg %ecx, (%edx)
+ noopt lock xchg (%ecx), %edx
- {nooptimize} vmovdqa32 %ymm1, %ymm2
- {nooptimize} vmovdqa64 %ymm1, %ymm2
- {nooptimize} vmovdqu8 %xmm1, %xmm2
- {nooptimize} vmovdqu16 %xmm1, %xmm2
- {nooptimize} vmovdqu32 %xmm1, %xmm2
- {nooptimize} vmovdqu64 %xmm1, %xmm2
+ noopt vmovdqa32 %ymm1, %ymm2
+ noopt vmovdqa64 %ymm1, %ymm2
+ noopt vmovdqu8 %xmm1, %xmm2
+ noopt vmovdqu16 %xmm1, %xmm2
+ noopt vmovdqu32 %xmm1, %xmm2
+ noopt vmovdqu64 %xmm1, %xmm2
- {nooptimize} vpandd %xmm2, %xmm3, %xmm4
- {nooptimize} vpandq %ymm2, %ymm3, %ymm4
- {nooptimize} vpandnd %ymm2, %ymm3, %ymm4
- {nooptimize} vpandnq %xmm2, %xmm3, %xmm4
- {nooptimize} vpord %xmm2, %xmm3, %xmm4
- {nooptimize} vporq %ymm2, %ymm3, %ymm4
- {nooptimize} vpxord %ymm2, %ymm3, %ymm4
- {nooptimize} vpxorq %xmm2, %xmm3, %xmm4
+ noopt vpandd %xmm2, %xmm3, %xmm4
+ noopt vpandq %ymm2, %ymm3, %ymm4
+ noopt vpandnd %ymm2, %ymm3, %ymm4
+ noopt vpandnq %xmm2, %xmm3, %xmm4
+ noopt vpord %xmm2, %xmm3, %xmm4
+ noopt vporq %ymm2, %ymm3, %ymm4
+ noopt vpxord %ymm2, %ymm3, %ymm4
+ noopt vpxorq %xmm2, %xmm3, %xmm4
More information about the Binutils-cvs
mailing list