From 1e7dd4a0348c5985df1a3e9765fc49da19663527 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Fri, 2 Feb 2024 08:26:22 +0100 Subject: 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). --- 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(-) create mode 100644 gas/testsuite/gas/i386/noopt.d create mode 100644 gas/testsuite/gas/i386/noopt.s (limited to 'gas') diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c index 2e578e2..e091b86 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 063a9e7..3d2d28f 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 46689a8..2584c69 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 0000000..940780f --- /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 0000000..a93c87c --- /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 3a6fa06..9426098 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 badb895..b809b9f 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 -- cgit v1.1