diff options
| author | Hans Kratz <hans@appfour.com> | 2021-09-09 00:41:31 +0200 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-09-08 23:41:31 +0100 | 
| commit | 5cd68501712289f7d15d786c4f3f08498b0d64c7 (patch) | |
| tree | 23fcc2487911d71caac24b9f36a8978ef40bcab0 /library/stdarch/crates | |
| parent | 00f611f3055f8d6aa425e747938440d43072bcc5 (diff) | |
| download | rust-5cd68501712289f7d15d786c4f3f08498b0d64c7.tar.gz rust-5cd68501712289f7d15d786c4f3f08498b0d64c7.zip | |
Normalize [us]shll.* ..., #0 aarch64 disassembly to the preferred [us]xtl.* (#1213)
Diffstat (limited to 'library/stdarch/crates')
| -rw-r--r-- | library/stdarch/crates/stdarch-test/src/disassembly.rs | 25 | 
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 { | 
