[llvm] 91a55cf - [X86][MC] Not decode 0xf3 as rep prefix if it's right before REX2

Shengchen Kan via llvm-commits llvm-commits at lists.llvm.org
Thu Jun 13 08:27:03 PDT 2024


Author: Shengchen Kan
Date: 2024-06-13T23:26:33+08:00
New Revision: 91a55cf5adbe37d33dc7b3b90de4bbb0b90761a1

URL: https://github.com/llvm/llvm-project/commit/91a55cf5adbe37d33dc7b3b90de4bbb0b90761a1
DIFF: https://github.com/llvm/llvm-project/commit/91a55cf5adbe37d33dc7b3b90de4bbb0b90761a1.diff

LOG: [X86][MC] Not decode 0xf3 as rep prefix if it's right before REX2

This fixes https://github.com/llvm/llvm-project/issues/95412

Added: 
    

Modified: 
    llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
    llvm/test/MC/Disassembler/X86/apx/rex2-format.txt

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
index 0ff440bdbe0de..6272e2d270f25 100644
--- a/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
+++ b/llvm/lib/Target/X86/Disassembler/X86Disassembler.cpp
@@ -284,7 +284,10 @@ static int readPrefixes(struct InternalInstruction *insn) {
       //      it's not mandatory prefix
       //  3. if (nextByte >= 0x40 && nextByte <= 0x4f) it's REX and we need
       //     0x0f exactly after it to be mandatory prefix
-      if (isREX(insn, nextByte) || nextByte == 0x0f || nextByte == 0x66)
+      //  4. if (nextByte == 0xd5) it's REX2 and we need
+      //     0x0f exactly after it to be mandatory prefix
+      if (isREX(insn, nextByte) || isREX2(insn, nextByte) || nextByte == 0x0f ||
+          nextByte == 0x66)
         // The last of 0xf2 /0xf3 is mandatory prefix
         insn->mandatoryPrefix = byte;
       insn->repeatPrefix = byte;

diff  --git a/llvm/test/MC/Disassembler/X86/apx/rex2-format.txt b/llvm/test/MC/Disassembler/X86/apx/rex2-format.txt
index 7412e234bff36..93cc71ac0a620 100644
--- a/llvm/test/MC/Disassembler/X86/apx/rex2-format.txt
+++ b/llvm/test/MC/Disassembler/X86/apx/rex2-format.txt
@@ -21,10 +21,10 @@
 # INTEL: movsxd	r17, r16d
 0xd5,0x58,0x63,0xc8
 
-# ATT: rep
-# ATT-SAME:   popcntl %r16d, %r17d
-# INTEL: rep
-# INTEL-SAME: popcnt r17d, r16d
+# ATT-NOT: rep
+# ATT:   popcntl %r16d, %r17d
+# INTEL-NOT: rep
+# INTEL: popcnt r17d, r16d
 0xf3,0xd5,0xd0,0xb8,0xc8
 
 ## MRMSrcRegCC


        


More information about the llvm-commits mailing list