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