diff options
author | iximeow <me@iximeow.net> | 2023-12-16 14:47:02 -0800 |
---|---|---|
committer | iximeow <me@iximeow.net> | 2023-12-16 14:47:02 -0800 |
commit | 2d303b6121e318e30572dd1134ddb0cf12bd0776 (patch) | |
tree | 568f60640a00fd707d690b875fdb9ca7bf5b125f /test/protected_mode | |
parent | 4d2e196e616162726c6211abc46c043078425322 (diff) |
fix incorrect register selection for `vpmovm2*` with `rex.b` set
Diffstat (limited to 'test/protected_mode')
-rw-r--r-- | test/protected_mode/mod.rs | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/test/protected_mode/mod.rs b/test/protected_mode/mod.rs index 752c9df..e843c7a 100644 --- a/test/protected_mode/mod.rs +++ b/test/protected_mode/mod.rs @@ -1332,6 +1332,11 @@ fn test_misc() { #[test] fn evex() { + // 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, 0xf2, 0x7d, 0x48, 0x2a, 0x44, 0x40, 0x01], "vmovntdqa zmm0, zmmword [eax + eax * 2 + 0x40]"); test_display(&[0x62, 0xf2, 0x7d, 0x08, 0x2a, 0x44, 0x40, 0x01], "vmovntdqa xmm0, xmmword [eax + eax * 2 + 0x10]"); } |