Make compiler generate "inc [foo]"/"dec [foo]" opcodes instead of "add [foo], 1"/"sub [foo], 1" when using "foo += 1"/"foo -= 1".
This is more an LLVM thing than a rustc thing. This is such an obvious thing that I'd assume that LLVM has a reason to not use inc. E.g.
It seems that because add updates all flags but inc only updates some flags (notably, it does not change the carry flag), inc introduces a "partial flags update stall" which is not present with add or lea.
This means that add can run at 4/clock and inc at 1/clock on many recentish x86 CPUs.
Indeed LLVM seems to emit inc at opt-level=0 and changes it to add 1 at opt-level=1 and above!
I translated
#![no_main]
#[no_mangle]
unsafe extern fn main() {
static mut A: u8 = 0;
A += 1;
}
to asm in rust playground and it generated add 1
According to my new info, "add [{mem}], {imm}" on Pentium is 3 tacts, which is adequate to 3 tacts of "inc [{mem}]". I understood this tread is unneccessary. Thank y'all for replying.
Erm... admins?... Can someone close this thread, please?