Try compiling with -O0
(On MSVC) /O0 is the same as /Od and results in the same assembler output shown above right down to the annotation: ; Function compile flags: /Odtp.
that usually forces auto variables to stack
On (Windows) X64, the ABI designates that the first 4 args are passed in registers and the others on the stack.
But that requires that there would be arguments passed. Whilst == is implemented as a (kind of) function call in Perl; it is not in C -- on any platform/compiler I am aware of.
Even the integer C interpreter I had back in the day loaded one value into a register and the did a cmp reg, mem; instruction.
may load small constants like so: pushq $18; popq %rdi.
I'm not familiar with those style of opcodes -- they don't appear in my Intel manuals -- but assuming the 'q' in pushq/popq stands for quad (in 64-bit mode that's the only push/pop available), and this is a "small constant"; why does it store that small constant in a 64-bit memory location, then move it into a 64-bit register by moving it through another 64-bit memory location (on the stack) first?
Why not use (in Intel Asm syntax) mov rdi, $18; (register to memory 64-bit move)?
Or better yet, mov reg8/16/32/64, imm8/16/32/64;?
Ie. store the small constant directly in the opcode itself; per this from the listing above: sub eax, 1;
(Note:I've never used Intel's compiler.)
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
|