[1/2] x86-64: extend expected-size check in check_qword_reg()

Message ID 35582f50-382d-5be1-ce93-764c4708fdc0@suse.com
State Accepted
Headers
Series x86: suffix / operands consistency checking |

Checks

Context Check Description
snail/binutils-gdb-check success Github commit url

Commit Message

Jan Beulich Nov. 6, 2023, 12:13 p.m. UTC
  Due to a missing check "crc32q %al, %rax" was wrongly translated to the
encoding of "crc32q %rax, %rax", rather than being rejected as invalid.
(The mnemonic suffix describes the source operand, not the destination
one.)

Note that check_{word,long}_reg() do not (currently) appear to require
similar amending, as there are no insn templates permitting an L or W
suffix and having an operand which allows for Reg8 and Reg64, but
neither Reg16 nor Reg32.
  

Patch

--- a/gas/config/tc-i386.c
+++ b/gas/config/tc-i386.c
@@ -8160,7 +8160,8 @@  check_qword_reg (void)
 	     && (i.tm.operand_types[op].bitfield.class == Reg
 		 || i.tm.operand_types[op].bitfield.instance == Accum)
 	     && (i.tm.operand_types[op].bitfield.word
-		 || i.tm.operand_types[op].bitfield.dword))
+		 || i.tm.operand_types[op].bitfield.dword
+		 || i.tm.operand_types[op].bitfield.qword))
       {
 	as_bad (_("`%s%s' not allowed with `%s%c'"),
 		register_prefix,
--- a/gas/testsuite/gas/i386/x86-64-inval-crc32.l
+++ b/gas/testsuite/gas/i386/x86-64-inval-crc32.l
@@ -15,8 +15,8 @@ 
 .*:19: Error: .*
 .*:20: Error: .*
 .*:21: Error: .*
-.*:24: Error: .*
-.*:25: Error: .*
+.*:22: Error: .*
+.*:23: Error: .*
 .*:26: Error: .*
 .*:27: Error: .*
 .*:28: Error: .*
@@ -26,6 +26,8 @@ 
 .*:32: Error: .*
 .*:33: Error: .*
 .*:34: Error: .*
+.*:35: Error: .*
+.*:36: Error: .*
 GAS LISTING .*
 
 
@@ -52,20 +54,22 @@  GAS LISTING .*
 [ 	]*17[ 	]+crc32  %eax, %rax
 [ 	]*18[ 	]+crc32l  %rax, %eax
 [ 	]*19[ 	]+crc32l  %eax, %rax
-[ 	]*20[ 	]+crc32q  %eax, %rax
-[ 	]*21[ 	]+crc32q  %rax, %eax
-[ 	]*22[ 	]+
-[ 	]*23[ 	]+\.intel_syntax noprefix
-[ 	]*24[ 	]+crc32  al,byte ptr \[rsi\]
-[ 	]*25[ 	]+crc32  ax, word ptr \[rsi\]
-[ 	]*26[ 	]+crc32  rax,word ptr \[rsi\]
-[ 	]*27[ 	]+crc32  rax,dword ptr \[rsi\]
-[ 	]*28[ 	]+crc32  al,\[rsi\]
-[ 	]*29[ 	]+crc32  ax,\[rsi\]
-[ 	]*30[ 	]+crc32  eax,\[rsi\]
-[ 	]*31[ 	]+crc32  rax,\[rsi\]
-[ 	]*32[ 	]+crc32  al,al
-[ 	]*33[ 	]+crc32  ax, ax
-[ 	]*34[ 	]+crc32  rax,eax
-[ 	]*35[ 	]*
+[ 	]*[0-9]+[ 	]+crc32q  %al, %rax
+[ 	]*[0-9]+[ 	]+crc32q  %ax, %rax
+[ 	]*[0-9]+[ 	]+crc32q  %eax, %rax
+[ 	]*[0-9]+[ 	]+crc32q  %rax, %eax
+[ 	]*[0-9]+[ 	]+
+[ 	]*[0-9]+[ 	]+\.intel_syntax noprefix
+[ 	]*[0-9]+[ 	]+crc32  al,byte ptr \[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  ax, word ptr \[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  rax,word ptr \[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  rax,dword ptr \[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  al,\[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  ax,\[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  eax,\[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  rax,\[rsi\]
+[ 	]*[0-9]+[ 	]+crc32  al,al
+[ 	]*[0-9]+[ 	]+crc32  ax, ax
+[ 	]*[0-9]+[ 	]+crc32  rax,eax
+[ 	]*[0-9]+[ 	]*
 #pass
--- a/gas/testsuite/gas/i386/x86-64-inval-crc32.s
+++ b/gas/testsuite/gas/i386/x86-64-inval-crc32.s
@@ -17,6 +17,8 @@  crc32  %rax, %eax
 crc32  %eax, %rax
 crc32l  %rax, %eax
 crc32l  %eax, %rax
+crc32q  %al, %rax
+crc32q  %ax, %rax
 crc32q  %eax, %rax
 crc32q  %rax, %eax