From 58464d6fa1bf6dcdf4c663639c43cc16a0cfb7f0 Mon Sep 17 00:00:00 2001 From: Alexis Engelke Date: Mon, 9 Nov 2020 09:43:21 +0100 Subject: [PATCH] decode: Fix ignoring VEX.B in 32-bit mode --- decode.c | 2 +- tests/test_decode.c | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/decode.c b/decode.c index 5113a2b..5ec7af1 100644 --- a/decode.c +++ b/decode.c @@ -139,7 +139,7 @@ decode_prefixes(const uint8_t* buffer, int len, DecodeMode mode, { prefixes |= byte & 0x40 ? 0 : PREFIX_REXX; // SDM Vol 2A 2-15 (Dec. 2016): Ignored in 32-bit mode - prefixes |= mode == DECODE_64 || (byte & 0x20) ? 0 : PREFIX_REXB; + prefixes |= mode != DECODE_64 || (byte & 0x20) ? 0 : PREFIX_REXB; *out_opcode_escape = (byte & 0x1f); // Load third byte of VEX prefix diff --git a/tests/test_decode.c b/tests/test_decode.c index 93ed295..a2ad132 100644 --- a/tests/test_decode.c +++ b/tests/test_decode.c @@ -248,6 +248,8 @@ main(int argc, char** argv) TEST("\xf3\x0f\x7e\x5c\x24\x08", "[SSE_MOVQ reg16:r3 mem8:r4+0x8]"); TEST32("\xc4\xe1\x00\x58\xc1", "[VADDPS reg16:r0 reg16:r7 reg16:r1]"); // MSB in vvvv ignored TEST64("\xc4\xe1\x00\x58\xc1", "[VADDPS reg16:r0 reg16:r15 reg16:r1]"); + TEST32("\xc4\xc1\x78\x58\xc0", "[VADDPS reg16:r0 reg16:r0 reg16:r0]"); // VEX.B ignored in 32-bit + TEST64("\xc4\xc1\x78\x58\xc0", "[VADDPS reg16:r0 reg16:r0 reg16:r8]"); TEST("\xc5\xf9\x6e\xc8", "[VMOVD reg4:r1 reg4:r0]"); TEST64("\xc4\xe1\xf9\x6e\xc8", "[VMOVQ reg8:r1 reg8:r0]"); TEST32("\xc4\xe1\xf9\x6e\xc8", "[VMOVD reg4:r1 reg4:r0]");