Why does .NET Native compile loop in reverse order?
inc
might be slower than add
because of the partial flag update. Moreover add
affects the zero flag so you don't need to use another cmp
instruction. Just jump directly.
This is one famous type of loop optimization
reversal: Loop reversal reverses the order in which values are assigned to the index variable. This is a subtle optimization which can help eliminate dependencies and thus enable other optimizations. Also, certain architectures utilize looping constructs at Assembly language level that count in a single direction only (e.g. decrement-jump-if-not-zero (DJNZ)).
- Is it faster to count down than it is to count up?
- GCC Loop optimization
You can see the result for other compilers here.
Your conclusion is correct: inverted cycle will target 0
(cycle will ends when register value reach 0
), so that Add
will set zero flag used in conditional branch.
This way you don't need dedicated Cmp
which leads to: 1) size optimization 2) it's also faster (conclusion from compiler programmers decision and another answer).
That's pretty common assembler trick to write loop targeting 0
. I am surprised you understand assembler, but don't know (asking) about it.