From NASM manual:
B.4.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 B.4.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 B.4.239) for a 3DNow! version of this instruction.
When I try to use pmulhrwc, pmulhriw, or pmulhrwa, fasm says "illegal instruction".
pmulhuw assembles fine though.