as: i386-Notes
9.15.17 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'.