I am working on a very low level part of the application in which performance is critical.
While investigating the generated assembly, I noticed the following instruction:
lea eax,[edx*8+8]
I am used to seeing additions when using memory references (e.g. [edx+4]), but this is the first time I see a multiplication.
- Does this mean that the x86 processor can perform simple multiplications in the lea instruction?
- Does this multiplication have an impact on the number of cycles needed to execute the instruction?
- Is the multiplication limited to powers of 2 (I would assume this is the case)?
Thanks in advance.
To expand on my comment and to answer the rest of the question…
Yes, it’s limited to powers of two. (2, 4, and 8 specifically) So no multiplier is needed since it’s just a shift. The point of it is to quickly generate an address from an index variable and a pointer – where the datatype is a simple 2, 4, or 8 byte word. (Though it’s often abused for other uses as well.)
As for the number of cycles that are needed: According to Agner Fog’s tables it looks like the
leainstruction is constant on some machines and variable on others.On Sandy Bridge there’s a 2-cycle penalty if it’s “complex or rip relative”. But it doesn’t say what “complex” means… So we can only guess unless you do a benchmark.