x86: i386_generate_nops() may not derive decisions from global variables
authorJan Beulich <jbeulich@suse.com>
Mon, 23 Oct 2023 08:29:54 +0000 (10:29 +0200)
committerJan Beulich <jbeulich@suse.com>
Mon, 23 Oct 2023 08:29:54 +0000 (10:29 +0200)
What matters is what was in effect at the time the original directive
was issued. Later changes to global state (bitness or ISA) must not
affect what code is generated.

gas/config/tc-i386.c
gas/testsuite/gas/i386/i386.exp
gas/testsuite/gas/i386/nops-10.d [new file with mode: 0644]
gas/testsuite/gas/i386/nops-10.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nops-6.d [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64-nops-6.s [new file with mode: 0644]
gas/testsuite/gas/i386/x86-64.exp

index d54e9dfdbd69d38d18c08f2f66447c8243cd9691..d7eea9d33d41f0b30c26a32609d853caf05018e5 100644 (file)
@@ -1434,7 +1434,7 @@ i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
      When -march= or .arch is used, we can't use anything beyond
      cpu_arch_isa_flags.   */
 
-  if (flag_code == CODE_16BIT)
+  if (fragP->tc_frag_data.code == CODE_16BIT)
     {
       patt = f16_patt;
       max_single_nop_size = sizeof (f16_patt) / sizeof (f16_patt[0]);
@@ -1446,7 +1446,7 @@ i386_generate_nops (fragS *fragP, char *where, offsetT count, int limit)
       if (fragP->tc_frag_data.isa == PROCESSOR_UNKNOWN)
        {
          /* PROCESSOR_UNKNOWN means that all ISAs may be used.  */
-         switch (cpu_arch_tune)
+         switch (fragP->tc_frag_data.tune)
            {
            case PROCESSOR_UNKNOWN:
              /* We use cpu_arch_isa_flags to check if we SHOULD
index ee74bcd4615e1acfee47ea1a8a266698075216b6..1072c07e4c7865f55800b8f250c3dbd5ef38604e 100644 (file)
@@ -148,6 +148,7 @@ if [gas_32_check] then {
     run_dump_test "nops-7"
     run_dump_test "nops-8"
     run_dump_test "nops-9"
+    run_dump_test "nops-10"
     run_dump_test "noreg16"
     run_list_test "noreg16"
     run_dump_test "noreg16-data32"
diff --git a/gas/testsuite/gas/i386/nops-10.d b/gas/testsuite/gas/i386/nops-10.d
new file mode 100644 (file)
index 0000000..b464275
--- /dev/null
@@ -0,0 +1,13 @@
+#objdump: -drw
+#name: nops 10
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <default>:
+[      ]*[a-f0-9]+:    0f be f0                movsbl %al,%esi
+[      ]*[a-f0-9]+:    8d b4 26 00 00 00 00    lea    0x0\(%esi,%eiz,1\),%esi
+[      ]*[a-f0-9]+:    8d b6 00 00 00 00       lea    0x0\(%esi\),%esi
+#pass
diff --git a/gas/testsuite/gas/i386/nops-10.s b/gas/testsuite/gas/i386/nops-10.s
new file mode 100644 (file)
index 0000000..35a300a
--- /dev/null
@@ -0,0 +1,6 @@
+       .text
+default:
+       movsbl %al,%esi
+       .p2align 4
+
+       .code16
diff --git a/gas/testsuite/gas/i386/x86-64-nops-6.d b/gas/testsuite/gas/i386/x86-64-nops-6.d
new file mode 100644 (file)
index 0000000..e962350
--- /dev/null
@@ -0,0 +1,13 @@
+#objdump: -drw
+#name: x86-64 nops 6
+
+.*: +file format .*
+
+
+Disassembly of section .text:
+
+0+ <default>:
+[      ]*[a-f0-9]+:    0f be f0                movsbl %al,%esi
+[      ]*[a-f0-9]+:    66 66 2e 0f 1f 84 00 00 00 00 00        data16 cs nopw (0x)?0\(%rax,%rax,1\)
+[      ]*[a-f0-9]+:    66 90                   xchg   %ax,%ax
+#pass
diff --git a/gas/testsuite/gas/i386/x86-64-nops-6.s b/gas/testsuite/gas/i386/x86-64-nops-6.s
new file mode 100644 (file)
index 0000000..b6dc7ad
--- /dev/null
@@ -0,0 +1,7 @@
+       .text
+default:
+       movsbl %al,%esi
+       .p2align 4
+
+       .code32
+       .arch generic32
index 52711cdcf6f2b4794479c468b5dec3c4e00a141c..3d521f66e351b4949f34eef44f25fbce515534fd 100644 (file)
@@ -116,6 +116,7 @@ run_dump_test "x86-64-nops-4-core2"
 run_dump_test "x86-64-nops-4-k8"
 run_dump_test "x86-64-nops-5"
 run_dump_test "x86-64-nops-5-k8"
+run_dump_test "x86-64-nops-6"
 run_dump_test "x86-64-nops-7"
 run_dump_test "x86-64-sysenter"
 run_dump_test "x86-64-sysenter-intel"