aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Beulich <jbeulich@suse.com>2024-09-11 13:52:42 +0200
committerJan Beulich <jbeulich@suse.com>2024-09-11 13:52:42 +0200
commit6170a088a60e159f2ab8ac1ae1edab7d04e079ec (patch)
treeeb144bc4faaf8672408ec72241b36d3ae78f4a7d
parentb7ee8ec914c612587b080e9ad416315307f094fd (diff)
downloadgdb-6170a088a60e159f2ab8ac1ae1edab7d04e079ec.zip
gdb-6170a088a60e159f2ab8ac1ae1edab7d04e079ec.tar.gz
gdb-6170a088a60e159f2ab8ac1ae1edab7d04e079ec.tar.bz2
x86/APX: correct disassembly for EVEX.B4
EVEX.B4 is used only for GPR (or addressing of memory) operands. SIMD registers encoded via ModR/M.rm (when ModR/M.mod == 3) have their top bit in EVEX.X3. Supposedly (doc version 004) EVEX.B4 is ignored when unused, hence also don't flag such encodings as invalid.
-rw-r--r--opcodes/i386-dis.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c
index 26d667a..e2c7b1b 100644
--- a/opcodes/i386-dis.c
+++ b/opcodes/i386-dis.c
@@ -13012,14 +13012,15 @@ OP_EX (instr_info *ins, int bytemode, int sizeflag)
USED_REX (REX_B);
if (ins->rex & REX_B)
reg += 8;
- if (ins->rex2 & REX_B)
- reg += 16;
if (ins->vex.evex)
{
USED_REX (REX_X);
if ((ins->rex & REX_X))
reg += 16;
+ ins->rex2_used &= ~REX_B;
}
+ else if (ins->rex2 & REX_B)
+ reg += 16;
if ((sizeflag & SUFFIX_ALWAYS)
&& (bytemode == x_swap_mode