Node: i386-Notes, Previous: i386-Bugs, Up: i386-Dependent

### Notes

There is some trickery concerning the `mul` and `imul` instructions that deserves mention. The 16-, 32-, 64- and 128-bit expanding multiplies (base opcode `0xf6`; extension 4 for `mul` and 5 for `imul`) can be output only in the one operand form. Thus, `imul %ebx, %eax` does not select the expanding multiply; the expanding multiply would clobber the `%edx` register, and this would confuse `gcc` output. Use `imul %ebx` to get the 64-bit product in `%edx:%eax`.

We have added a two operand form of `imul` when the first operand is an immediate mode expression and the second operand is a register. This is just a shorthand, so that, multiplying `%eax` by 69, for example, can be done with `imul $69, %eax` rather than `imul $69, %eax, %eax`.