Rust reorders method params in machine code?
09:34 23 Dec 2025

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>
assembly rust armv8