IMUL Rb {Rb/Ms} B/w 011010s1 MdRegR/m {disp} {disp} data {data}
For constants, use the following 32bit MASM code:
mMulC MACRO pDest, pSrc, pConst IF pConst EQ 2 FIDNI pDest, pSrc shl pDest, 1 ELSE lea pDest, [pSrc*2] ENDIF ELSEIF pConst EQ 3 lea pDest, [pSrc*2+pSrc] ELSEIF pConst EQ 4 ;SHL pDest, 2 ;lea is faster lea pDest, [pSrc*4] ELSEIF pConst EQ 5 lea pDest, [pSrc*4+pSrc] ELSEIF pConst EQ 6 lea pDest, [pSrc*2+pSrc] ;Src x3 shl pDest, 1 ;(Src X3) x2 ELSEIF pConst EQ 7 IFIDNI pDest, pSrc ;if I can't get back to pSrc after ;overwriteing pDest (i.e. pDest is pSrc imul pdest, pSrc, pConst ELSE ;Thanks Tim Roberts, timr@probo.com lea pDest, [pSrc*8] sub pDest, pSrc ENDIF ELSEIF pConst EQ 8 lea pDest, [pSrc*8] ELSEIF pConst EQ 9 lea pDest, [pSrc*8+pSrc] ELSEIF pConst EQ 10 lea pDest, [pSrc*4+pSrc] ;Src x5 shl pDest, 1 ;(Src X5) x2 ELSEIF pConst EQ 11 IFIDNI pDest, pSrc imul pdest, pSrc, pConst ELSE lea pDest, [pSrc*4+pSrc] ;Src x5 shl pDest, 1 ;(Src X5) x2 add pDest, pSrc ;((Src x5) x2) + Src ENDIF ELSEIF pConst EQ 12 lea pDest, [pSrc*2+pSrc] ;Src x3 lea pDest, [pDest*4] ;(Src x3) x4 ELSEIF pConst EQ 13 IFIDNI pDest, pSrc imul pdest, pSrc, pConst ELSE ;Thanks Tim Roberts, timr@probo.com lea pDest, [pSrc*4+pSrc] ; src x 5 lea pDest, [pSrc*8+pDest] ; src x 13 ENDIF ELSEIF pConst EQ 15 lea pDest, [pSrc*4+pSrc] ;Src x5 lea pDest, [pDest*2+pDest] ;(Src x5) x3 ELSEIF pConst EQ 16 IFIDNI pDest, pSrc shl pDest, 2 ELSE lea pDest, [pSrc*8] ;Src x8 shl pDest, 1 ;(Src X8) x2 ENDIF ELSEIF pConst EQ 17 IFIDNI pDest, pSrc imul pdest, pSrc, pConst ELSE ;Thanks Tim Roberts, timr@probo.com lea pDest, [pSrc*8] lea pDest, [pDest*2+pSrc] ENDIF ELSEIF pConst EQ 18 lea pDest, [pSrc*8+pSrc] shl pDest, 1 ;(Src X9) x2 ELSEIF pConst EQ 19 IFIDNI pDest, pSrc imul pdest, pSrc, pConst ELSE lea pDest, [pSrc*8] ;Src x8 shl pDest, 1 ;(Src X8) x2 add pDest, pSrc ;((Src x8) x2) + Src ENDIF ELSEIF pConst EQ 20 lea pDest, [pSrc*4+pSrc] ;Src x5 lea pDest, [pDest*4] ;(Src x5) x4 ELSEIF pConst EQ 24 lea pDest, [pSrc*2+pSrc] ;Src x3 lea pDest, [pDest*8] ;(Src x3) x8 ELSEIF pConst EQ 25 lea pDest, [pSrc*4+pSrc] ;Src x5 lea pDest, [pDest*4+pDest];(Src x5) x5 ELSEIF pConst EQ 30 lea pDest, [pSrc*4+pSrc] ;Src x5 shl pDest, 1 ;(Src X5) x2 lea pDest, [pDest*2+pDest] ;((Src x5) x2) x3 ELSE imul pdest, pSrc, pConst ENDIF ENDM
Note: On the Pentium II's imul may actually be as fast or faster! This macro is good for older chips.