aboutsummaryrefslogtreecommitdiff
path: root/tests/armv8/a64.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/armv8/a64.rs')
-rw-r--r--tests/armv8/a64.rs73
1 files changed, 73 insertions, 0 deletions
diff --git a/tests/armv8/a64.rs b/tests/armv8/a64.rs
index ae0f108..81d4a2e 100644
--- a/tests/armv8/a64.rs
+++ b/tests/armv8/a64.rs
@@ -83,6 +83,21 @@ fn test_barrier() {
test_display([0xbf, 0x3f, 0x03, 0xd5], "dmb sy");
// only with FEAT_SB
test_display([0xff, 0x30, 0x03, 0xd5], "sb");
+
+ test_display([0x9f, 0x34, 0x03, 0xd5], "pssbb");
+
+ // when printing the instruction the third operand defaults to xzr if omitted, so yax probably
+ // could/should omit it. but it's not *wrong*..
+ test_display([0x00, 0x10, 0xdf, 0x9a], "irg x0, x0, xzr");
+ test_display([0x90, 0x10, 0xdf, 0x9a], "irg x16, x4, xzr");
+ test_display([0x90, 0x10, 0xcf, 0x9a], "irg x16, x4, x15");
+
+ test_display([0x00, 0x10, 0x60, 0xd9], "ldg x0, [x0, #0x10]");
+ test_display([0x90, 0x10, 0x60, 0xd9], "ldg x16, [x4, #0x10]");
+ test_display([0x90, 0x90, 0x60, 0xd9], "ldg x16, [x4, #0x90]");
+ // the immediate offfset in tag instructions is a signed offset in the range of -4096 to 4096.
+ // yax decodes it as signed in this range, capstone does not.
+ test_display([0x90, 0x90, 0x7f, 0xd9], "ldg x16, [x4, #-0x70]");
}
#[test]
@@ -4832,6 +4847,45 @@ fn test_pac() {
([0x00, 0x04, 0xf0, 0xf8], "ldrab x0, [x0, #-0x800]"),
([0x00, 0x14, 0x20, 0xf8], "ldraa x0, [x0, #0x8]"),
([0x00, 0x04, 0xa4, 0xf8], "ldrab x0, [x0, #0x200]"),
+
+ ([0x3f, 0x23, 0x03, 0xd5], "paciasp"),
+ ([0x1f, 0x23, 0x03, 0xd5], "paciaz"),
+ ([0x1f, 0x21, 0x03, 0xd5], "pacia1716"),
+ ([0x7f, 0x23, 0x03, 0xd5], "pacibsp"),
+ ([0x5f, 0x23, 0x03, 0xd5], "pacibz"),
+ ([0x5f, 0x21, 0x03, 0xd5], "pacib1716"),
+
+ ([0xbf, 0x23, 0x03, 0xd5], "autiasp"),
+ ([0x9f, 0x23, 0x03, 0xd5], "autiaz"),
+ ([0x9f, 0x21, 0x03, 0xd5], "autia1716"),
+ ([0xff, 0x23, 0x03, 0xd5], "autibsp"),
+ ([0xdf, 0x23, 0x03, 0xd5], "autibz"),
+ ([0xdf, 0x21, 0x03, 0xd5], "autib1716"),
+
+ ([0xfe, 0x83, 0xc1, 0xda], "pacnbiasppc"),
+ ([0xfe, 0x87, 0xc1, 0xda], "pacnbibsppc"),
+ ([0xfe, 0x8b, 0xc1, 0xda], "pacia171615"),
+ ([0xfe, 0x8f, 0xc1, 0xda], "pacib171615"),
+ ([0x7e, 0x92, 0xc1, 0xda], "autiasppcr x19"),
+ ([0x7e, 0x96, 0xc1, 0xda], "autibsppcr x19"),
+ ([0xfe, 0xa3, 0xc1, 0xda], "paciasppc"),
+ ([0xfe, 0xa7, 0xc1, 0xda], "pacibsppc"),
+ ([0xfe, 0xbb, 0xc1, 0xda], "autia171615"),
+ ([0xfe, 0xbf, 0xc1, 0xda], "autib171615"),
+
+ ([0xff, 0x24, 0x03, 0xd5], "pacm"),
+ ([0xff, 0x20, 0x03, 0xd5], "xpaclri"),
+ ([0x1f, 0x00, 0x00, 0x55], "retaasppc $-0x3fffc"),
+ ([0x1f, 0x00, 0x20, 0x55], "retabsppc $-0x3fffc"),
+ ([0xff, 0xff, 0x1f, 0x55], "retaasppc $+0x0"),
+ ([0xff, 0xff, 0x3f, 0x55], "retabsppc $+0x0"),
+ ([0xf0, 0x0b, 0x5f, 0xd6], "retaasppcr x16"),
+ ([0xf0, 0x0f, 0x5f, 0xd6], "retabsppcr x16"),
+
+ ([0x1f, 0x00, 0x80, 0xf3], "autiasppc $-0x3fffc"),
+ ([0x1f, 0x00, 0xa0, 0xf3], "autibsppc $-0x3fffc"),
+ ([0xff, 0xff, 0x9f, 0xf3], "autiasppc $+0x0"),
+ ([0xff, 0xff, 0xbf, 0xf3], "autibsppc $+0x0"),
];
let errs = run_tests(TESTS);
@@ -4987,3 +5041,22 @@ fn test_bitfield() {
assert!(errs.is_empty());
}
+
+#[test]
+fn test_tags() {
+ const TESTS: &[([u8; 4], &'static str)] = &[
+ ([0x00, 0x10, 0x60, 0xd9], "ldg x0, [x0, #0x10]"),
+ ([0x00, 0x20, 0x60, 0xd9], "ldg x0, [x0, #0x20]"),
+ ([0x00, 0x21, 0x60, 0xd9], "ldg x0, [x8, #0x20]"),
+ ([0x03, 0x21, 0x60, 0xd9], "ldg x3, [x8, #0x20]"),
+ ([0x03, 0x21, 0x7f, 0xd9], "ldg x3, [x8, #-0xe0]"),
+ ];
+
+ let errs = run_tests(TESTS);
+
+ for err in errs.iter() {
+ println!("{}", err);
+ }
+
+ assert!(errs.is_empty());
+}