From 2d303b6121e318e30572dd1134ddb0cf12bd0776 Mon Sep 17 00:00:00 2001 From: iximeow Date: Sat, 16 Dec 2023 14:47:02 -0800 Subject: fix incorrect register selection for `vpmovm2*` with `rex.b` set --- test/long_mode/mod.rs | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'test/long_mode') diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs index 6b04be2..c7a4788 100644 --- a/test/long_mode/mod.rs +++ b/test/long_mode/mod.rs @@ -1465,6 +1465,12 @@ fn evex() { test_display(&[0x62, 0xf2, 0x7d, 0x48, 0x2a, 0x44, 0x40, 0x01], "vmovntdqa zmm0, zmmword [rax + rax * 2 + 0x40]"); test_display(&[0x62, 0xf2, 0x7d, 0x08, 0x2a, 0x44, 0x40, 0x01], "vmovntdqa xmm0, xmmword [rax + rax * 2 + 0x10]"); test_invalid(&[0x62, 0xf2, 0x7d, 0x1d, 0x66, 0x50, 0x01, 0x11]); + + // vpmovm2b (and larger forms). for some reason the source operand is a mask register but uses + // modrm bits as a register selector. out-of-range `k` seem to just get masked down.. + test_display(&[0x62, 0xd2, 0x7e, 0x08, 0x28, 0xc2], "vpmovm2b xmm0, k2"); + test_display(&[0x62, 0xf2, 0x7e, 0x08, 0x28, 0xc1], "vpmovm2b xmm0, k1"); + test_display(&[0x62, 0x12, 0x7d, 0x06, 0xa0, 0x04, 0x2f], "vpscatterdd dword [r15 + xmm29 * 1], k6, xmm8"); test_display(&[0x62, 0x12, 0x7d, 0x06, 0xa0, 0x14, 0x0f], "vpscatterdd dword [r15 + xmm25 * 1], k6, xmm10"); test_display(&[0x62, 0x12, 0x7d, 0x26, 0xa0, 0x14, 0x0f], "vpscatterdd dword [r15 + ymm25 * 1], k6, ymm10"); -- cgit v1.1