about summary refs log tree commit diff
path: root/library/stdarch/crates/stdarch-test
diff options
context:
space:
mode:
authorHans Kratz <hans@appfour.com>2021-09-09 00:41:31 +0200
committerGitHub <noreply@github.com>2021-09-08 23:41:31 +0100
commit5cd68501712289f7d15d786c4f3f08498b0d64c7 (patch)
tree23fcc2487911d71caac24b9f36a8978ef40bcab0 /library/stdarch/crates/stdarch-test
parent00f611f3055f8d6aa425e747938440d43072bcc5 (diff)
downloadrust-5cd68501712289f7d15d786c4f3f08498b0d64c7.tar.gz
rust-5cd68501712289f7d15d786c4f3f08498b0d64c7.zip
Normalize [us]shll.* ..., #0 aarch64 disassembly to the preferred [us]xtl.* (#1213)
Diffstat (limited to 'library/stdarch/crates/stdarch-test')
-rw-r--r--library/stdarch/crates/stdarch-test/src/disassembly.rs25
1 files changed, 24 insertions, 1 deletions
diff --git a/library/stdarch/crates/stdarch-test/src/disassembly.rs b/library/stdarch/crates/stdarch-test/src/disassembly.rs
index 29e09ae6d7a..3ace6b20e10 100644
--- a/library/stdarch/crates/stdarch-test/src/disassembly.rs
+++ b/library/stdarch/crates/stdarch-test/src/disassembly.rs
@@ -125,7 +125,7 @@ fn parse(output: &str) -> HashSet<Function> {
                 cached_header = None;
                 break;
             }
-            let parts = if cfg!(target_env = "msvc") {
+            let mut parts = if cfg!(target_env = "msvc") {
                 // Each line looks like:
                 //
                 // >  $addr: ab cd ef     $instr..
@@ -152,6 +152,29 @@ fn parse(output: &str) -> HashSet<Function> {
                     .map(std::string::ToString::to_string)
                     .collect::<Vec<String>>()
             };
+
+            if cfg!(target_arch = "aarch64") {
+                // Normalize [us]shll.* ..., #0 instructions to the preferred form: [us]xtl.* ...
+                // as LLVM objdump does not do that.
+                // See https://developer.arm.com/documentation/ddi0602/latest/SIMD-FP-Instructions/UXTL--UXTL2--Unsigned-extend-Long--an-alias-of-USHLL--USHLL2-
+                // and https://developer.arm.com/documentation/ddi0602/latest/SIMD-FP-Instructions/SXTL--SXTL2--Signed-extend-Long--an-alias-of-SSHLL--SSHLL2-
+                // for details.
+                match (parts.first(), parts.last()) {
+                    (Some(instr), Some(last_arg))
+                        if (instr.starts_with("ushll.") || instr.starts_with("sshll."))
+                            && last_arg == "#0" =>
+                    {
+                        assert_eq!(parts.len(), 4);
+                        let mut new_parts = Vec::with_capacity(3);
+                        let new_instr = format!("{}{}{}", &instr[..1], "xtl", &instr[5..]);
+                        new_parts.push(new_instr);
+                        new_parts.push(parts[1].clone());
+                        new_parts.push(parts[2][0..parts[2].len() - 1].to_owned()); // strip trailing comma
+                        parts = new_parts;
+                    }
+                    _ => {}
+                };
+            }
             instructions.push(parts.join(" "));
         }
         let function = Function {