[02/11] x86: i386_generate_nops() may not derive decisions from global variables

Message ID 85a2958d-3a80-7bbc-ffa3-4078f34eeef2@suse.com
State New
Headers
Series x86: NOP emission adjustments |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_binutils_check--master-aarch64 success Testing passed
linaro-tcwg-bot/tcwg_binutils_check--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-arm success Testing passed
linaro-tcwg-bot/tcwg_binutils_build--master-aarch64 success Testing passed

Commit Message

Jan Beulich Sept. 27, 2023, 3:48 p.m. UTC
  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.
  

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -1434,7 +1434,7 @@  i386_generate_nops (fragS *fragP, char *
      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 *
       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
--- a/gas/testsuite/gas/i386/i386.exp
+++ b/gas/testsuite/gas/i386/i386.exp
@@ -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"
--- /dev/null
+++ b/gas/testsuite/gas/i386/nops-10.d
@@ -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
--- /dev/null
+++ b/gas/testsuite/gas/i386/nops-10.s
@@ -0,0 +1,6 @@ 
+	.text
+default:
+	movsbl %al,%esi
+	.p2align 4
+
+	.code16
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-nops-6.d
@@ -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
--- /dev/null
+++ b/gas/testsuite/gas/i386/x86-64-nops-6.s
@@ -0,0 +1,7 @@ 
+	.text
+default:
+	movsbl %al,%esi
+	.p2align 4
+
+	.code32
+	.arch generic32
--- a/gas/testsuite/gas/i386/x86-64.exp
+++ b/gas/testsuite/gas/i386/x86-64.exp
@@ -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"