What is the difference between the enter and
push ebp
mov ebp, esp
sub esp, imm
instructions? Is there a performance difference? If so, which is faster and why do compilers always use the latter?
Similarly with the leave and
mov esp, ebp
pop ebp
instructions.
There is a performance difference, especially for
enter. On modern processors this decodes to some 10 to 20 µops, while the three instruction sequence is about 4 to 6, depending on the architecture. For details consult Agner Fog’s instruction tables.Additionally the
enterinstruction usually has a quite high latency, for example 8 clocks on a core2, compared to the 3 clocks dependency chain of the three instruction sequence.Furthermore the three instruction sequence may be spread out by the compiler for scheduling purposes, depending on the surrounding code of course, to allow more parallel execution of instructions.