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’.