aboutsummaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authoriximeow <me@iximeow.net>2023-12-16 15:24:26 -0800
committeriximeow <me@iximeow.net>2023-12-16 15:24:26 -0800
commit2db223a16d1559c152170fe2a602c827a5a95fb3 (patch)
tree140e01f696a180b874c0705cb8c60a236ba9458c /test
parentd7d84b3be6c929ee9d1b425a82b7121936a7cd34 (diff)
fix incorrect register selection for `vpbroadcastm{b2q,w2d}` with `rex.b` set
Diffstat (limited to 'test')
-rw-r--r--test/long_mode/mod.rs2
-rw-r--r--test/protected_mode/mod.rs3
-rw-r--r--test/real_mode/mod.rs3
3 files changed, 6 insertions, 2 deletions
diff --git a/test/long_mode/mod.rs b/test/long_mode/mod.rs
index b087d74..c0ec1a5 100644
--- a/test/long_mode/mod.rs
+++ b/test/long_mode/mod.rs
@@ -1466,6 +1466,8 @@ fn evex() {
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]);
+ // vpbroadcastmw2d. similar to `vpmovm2*`, out-of-range `k` are just masked down.
+ test_display(&[0x62, 0xd2, 0x7e, 0x28, 0x3a, 0xca], "vpbroadcastmw2d ymm1, k2");
// 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");
diff --git a/test/protected_mode/mod.rs b/test/protected_mode/mod.rs
index 88d6c49..fd77b5e 100644
--- a/test/protected_mode/mod.rs
+++ b/test/protected_mode/mod.rs
@@ -1332,11 +1332,12 @@ fn test_misc() {
#[test]
fn evex() {
+ // vpbroadcastmw2d. similar to `vpmovm2*`, out-of-range `k` are just masked down.
+ test_display(&[0x62, 0xd2, 0x7e, 0x28, 0x3a, 0xca], "vpbroadcastmw2d ymm1, k2");
// 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");
-
// vpmovb2m (and larger forms). out-of-range `k` are invalid in 64-bit mode, are part of the
// `bound` instruction for 32- and 16-bit modes.
test_display(&[0x62, 0x72, 0x7e /* , 0x28, 0x29, 0xfd */], "bound esi, qword [edx + 0x7e]");
diff --git a/test/real_mode/mod.rs b/test/real_mode/mod.rs
index b422887..bc045d8 100644
--- a/test/real_mode/mod.rs
+++ b/test/real_mode/mod.rs
@@ -18401,11 +18401,12 @@ fn test_invalid_sequences() {
test_invalid(&[0xf3, 0xf2, 0x0f, 0xae, 0x8f, 0x54, 0x3c, 0x58, 0xb7]);
test_invalid(&[0xff, 0xd8]);
+ // vpbroadcastmw2d. similar to `vpmovm2*`, out-of-range `k` are just masked down.
+ test_display(&[0x62, 0xd2, 0x7e, 0x28, 0x3a, 0xca], "vpbroadcastmw2d ymm1, k2");
// 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");
-
// vpmovb2m (and larger forms). out-of-range `k` are invalid in 64-bit mode, are part of the
// `bound` instruction for 32- and 16-bit modes.
test_display(&[0x62, 0x72, 0x7e /* , 0x28, 0x29, 0xfd */], "bound si, dword [bp + si * 1 + 0x7e]");