Rust reorders method params in machine code?
I have a function that I marked #inline(never). I ran cargo build --release and objdump -d [binary name]. What I see is that my 3d parameter (hi) is in register x4 for some reason. I'd expect it to be in x2. What could be the reason?
My cargo.toml:
[profile.release]
debug = true
opt-level = 3
lto = true
codegen-units = 1
Rust method:
#[inline(never)]
pub fn scale_backward(&mut self,
mf: &[u8],
mut hi: usize/*exclusive*/,
curr_stack_depth: i32,
group_coeff: u32) {
if group_coeff == 1 {
return;
}
let mut depth = curr_stack_depth;
while hi > 0 && depth <= curr_stack_depth {
hi -= 1;
match mf[hi] {
OP => depth += 1,
CP => depth -= 1,
_ => {}
}
self.coeffs[hi] *= group_coeff;
}
}
The resulting ARMv8:
0000000100001314 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE>:
100001314: a9bf7bfd stp x29, x30, [sp, #-16]!
100001318: 910003fd mov x29, sp
10000131c: 710004df cmp w6, #1
100001320: 540002c0 b.eq 0x100001378 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x64>
100001324: b40002a4 cbz x4, 0x100001378 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x64>
100001328: d1000489 sub x9, x4, #1
10000132c: aa0903e8 mov x8, x9
100001330: aa0503ea mov x10, x5
100001334: eb03013f cmp x9, x3
100001338: 540002c2 b.hs 0x100001390 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x7c>
10000133c: 3868684b ldrb w11, [x2, x8]
100001340: 5100054c sub w12, w10, #1
100001344: 7100a57f cmp w11, #41
100001348: 1a8a018c csel w12, w12, w10, eq
10000134c: 7100a17f cmp w11, #40
100001350: 1a8a158a csinc w10, w12, w10, ne
100001354: eb01013f cmp x9, x1
100001358: 54000142 b.hs 0x100001380 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x6c>
10000135c: b868780b ldr w11, [x0, x8, lsl #2]
100001360: 1b067d6b mul w11, w11, w6
100001364: b828780b str w11, [x0, x8, lsl #2]
100001368: f1000508 subs x8, x8, #1
10000136c: 54000063 b.lo 0x100001378 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x64>
100001370: 6b05015f cmp w10, w5
100001374: 54fffe0d b.le 0x100001334 <__ZN9chemikaze9mf_parser8MfParser14scale_backward17h0caa2aac2770e48dE+0x20>
100001378: a8c17bfd ldp x29, x30, [sp], #16; RETURN
10000137c: d65f03c0 ret
100001380: f0000202 adrp x2, 0x100044000 <__ZN9chemikaze4main17h5cffd0ce469b6f0dE+0xe8>
100001384: 9105a042 add x2, x2, #360
100001388: aa0803e0 mov x0, x8
10000138c: 9400c79a bl 0x1000331f4 <__ZN4core9panicking18panic_bounds_check17h0b28316d3be9e695E>
100001390: f0000202 adrp x2, 0x100044000 <__ZN9chemikaze4main17h5cffd0ce469b6f0dE+0xf8>
100001394: 91054042 add x2, x2, #336
100001398: aa0803e0 mov x0, x8
10000139c: aa0303e1 mov x1, x3
1000013a0: 9400c795 bl 0x1000331f4 <__ZN4core9panicking18panic_bounds_check17h0b28316d3be9e695E>