NASM 2.05 based x86 Instruction Reference[ch262]
A.5.238 PMULHRWC, PMULHRIW: Multiply Packed 16-bit Integers With Rounding, and Store High Word PMULHRWC mm1,mm2/m64 ; 0F 59 /r [CYRIX,MMX] PMULHRIW mm1,mm2/m64 ; 0F 5D /r [CYRIX,MMX] These instructions take two packed 16-bit integer inputs, multiply the values in the inputs, round on bit 15 of each result, then store bits 15-30 of each result to the corresponding position of the destination register. - For PMULHRWC, the destination is the first source operand. - For PMULHRIW, the destination is an implied register (worked out as described for PADDSIW (section A.5.200)). The operation of this instruction is: dst[0-15] := (src1[0-15] *src2[0-15] + 0x00004000)[15-30] dst[16-31] := (src1[16-31]*src2[16-31] + 0x00004000)[15-30] dst[32-47] := (src1[32-47]*src2[32-47] + 0x00004000)[15-30] dst[48-63] := (src1[48-63]*src2[48-63] + 0x00004000)[15-30] See also PMULHRWA (section A.5.239) for a 3DNow! version of this instruction.