Eliminated test386 multiplication differences, now on to division differences
This commit is contained in:
parent
682f930fdd
commit
05c261f849
4 changed files with 438 additions and 450 deletions
|
|
@ -20518,42 +20518,42 @@ IMUL32D EAX=7FFFFFFE EDX=80000000 PS=0801 EAX=7F111112 EDX=80000000 PS=0801
|
|||
IMUL32D EAX=7FFFFFFE EDX=80000001 PS=0801 EAX=7F111112 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFE EDX=FFFFFFFE PS=0801 EAX=7F111112 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFE EDX=FFFFFFFF PS=0801 EAX=7F111112 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888888 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888888 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888888 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000003F PS=0801 EAX=7F888888 EDX=0000003F PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000040 PS=0801 EAX=7F888888 EDX=00000040 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000041 PS=0801 EAX=7F888888 EDX=00000041 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000007E PS=0801 EAX=7F888888 EDX=0000007E PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000007F PS=0801 EAX=7F888888 EDX=0000007F PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000080 PS=0801 EAX=7F888888 EDX=00000080 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000081 PS=0801 EAX=7F888888 EDX=00000081 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=000000FE PS=0801 EAX=7F888888 EDX=000000FE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=000000FF PS=0801 EAX=7F888888 EDX=000000FF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888888 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888888 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888888 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00003FFF PS=0801 EAX=7F888888 EDX=00003FFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00004000 PS=0801 EAX=7F888888 EDX=00004000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00004001 PS=0801 EAX=7F888888 EDX=00004001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00007FFE PS=0801 EAX=7F888888 EDX=00007FFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00007FFF PS=0801 EAX=7F888888 EDX=00007FFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00008000 PS=0801 EAX=7F888888 EDX=00008000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00008001 PS=0801 EAX=7F888888 EDX=00008001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000FFFE PS=0801 EAX=7F888888 EDX=0000FFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000FFFF PS=0801 EAX=7F888888 EDX=0000FFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888888 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888888 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888888 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=3FFFFFFF PS=0801 EAX=7F888888 EDX=3FFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=40000000 PS=0801 EAX=7F888888 EDX=40000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=40000001 PS=0801 EAX=7F888888 EDX=40000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=7FFFFFFE PS=0801 EAX=7F888888 EDX=7FFFFFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=7FFFFFFF PS=0801 EAX=7F888888 EDX=7FFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=80000000 PS=0801 EAX=7F888888 EDX=80000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=80000001 PS=0801 EAX=7F888888 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=FFFFFFFE PS=0801 EAX=7F888888 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=FFFFFFFF PS=0801 EAX=7F888888 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888889 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888889 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888889 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000003F PS=0801 EAX=7F888889 EDX=0000003F PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000040 PS=0801 EAX=7F888889 EDX=00000040 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000041 PS=0801 EAX=7F888889 EDX=00000041 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000007E PS=0801 EAX=7F888889 EDX=0000007E PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000007F PS=0801 EAX=7F888889 EDX=0000007F PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000080 PS=0801 EAX=7F888889 EDX=00000080 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000081 PS=0801 EAX=7F888889 EDX=00000081 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=000000FE PS=0801 EAX=7F888889 EDX=000000FE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=000000FF PS=0801 EAX=7F888889 EDX=000000FF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888889 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888889 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888889 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00003FFF PS=0801 EAX=7F888889 EDX=00003FFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00004000 PS=0801 EAX=7F888889 EDX=00004000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00004001 PS=0801 EAX=7F888889 EDX=00004001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00007FFE PS=0801 EAX=7F888889 EDX=00007FFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00007FFF PS=0801 EAX=7F888889 EDX=00007FFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00008000 PS=0801 EAX=7F888889 EDX=00008000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00008001 PS=0801 EAX=7F888889 EDX=00008001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000FFFE PS=0801 EAX=7F888889 EDX=0000FFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=0000FFFF PS=0801 EAX=7F888889 EDX=0000FFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000000 PS=0801 EAX=7F888889 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000001 PS=0801 EAX=7F888889 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=00000002 PS=0801 EAX=7F888889 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=3FFFFFFF PS=0801 EAX=7F888889 EDX=3FFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=40000000 PS=0801 EAX=7F888889 EDX=40000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=40000001 PS=0801 EAX=7F888889 EDX=40000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=7FFFFFFE PS=0801 EAX=7F888889 EDX=7FFFFFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=7FFFFFFF PS=0801 EAX=7F888889 EDX=7FFFFFFF PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=80000000 PS=0801 EAX=7F888889 EDX=80000000 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=80000001 PS=0801 EAX=7F888889 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=FFFFFFFE PS=0801 EAX=7F888889 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=7FFFFFFF EDX=FFFFFFFF PS=0801 EAX=7F888889 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=80000000 EDX=00000000 PS=0801 EAX=80000000 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000000 EDX=00000001 PS=0801 EAX=80000000 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000000 EDX=00000002 PS=0801 EAX=80000000 EDX=00000002 PS=0801
|
||||
|
|
@ -20590,42 +20590,42 @@ IMUL32D EAX=80000000 EDX=80000000 PS=0801 EAX=80000000 EDX=80000000 PS=0801
|
|||
IMUL32D EAX=80000000 EDX=80000001 PS=0801 EAX=80000000 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=80000000 EDX=FFFFFFFE PS=0801 EAX=80000000 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=80000000 EDX=FFFFFFFF PS=0801 EAX=80000000 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777778 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777778 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777778 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000003F PS=0801 EAX=80777778 EDX=0000003F PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000040 PS=0801 EAX=80777778 EDX=00000040 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000041 PS=0801 EAX=80777778 EDX=00000041 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000007E PS=0801 EAX=80777778 EDX=0000007E PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000007F PS=0801 EAX=80777778 EDX=0000007F PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000080 PS=0801 EAX=80777778 EDX=00000080 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000081 PS=0801 EAX=80777778 EDX=00000081 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=000000FE PS=0801 EAX=80777778 EDX=000000FE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=000000FF PS=0801 EAX=80777778 EDX=000000FF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777778 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777778 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777778 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00003FFF PS=0801 EAX=80777778 EDX=00003FFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00004000 PS=0801 EAX=80777778 EDX=00004000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00004001 PS=0801 EAX=80777778 EDX=00004001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00007FFE PS=0801 EAX=80777778 EDX=00007FFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00007FFF PS=0801 EAX=80777778 EDX=00007FFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00008000 PS=0801 EAX=80777778 EDX=00008000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00008001 PS=0801 EAX=80777778 EDX=00008001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000FFFE PS=0801 EAX=80777778 EDX=0000FFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000FFFF PS=0801 EAX=80777778 EDX=0000FFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777778 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777778 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777778 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=3FFFFFFF PS=0801 EAX=80777778 EDX=3FFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=40000000 PS=0801 EAX=80777778 EDX=40000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=40000001 PS=0801 EAX=80777778 EDX=40000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=7FFFFFFE PS=0801 EAX=80777778 EDX=7FFFFFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=7FFFFFFF PS=0801 EAX=80777778 EDX=7FFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=80000000 PS=0801 EAX=80777778 EDX=80000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=80000001 PS=0801 EAX=80777778 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=FFFFFFFE PS=0801 EAX=80777778 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=FFFFFFFF PS=0801 EAX=80777778 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777777 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777777 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777777 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000003F PS=0801 EAX=80777777 EDX=0000003F PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000040 PS=0801 EAX=80777777 EDX=00000040 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000041 PS=0801 EAX=80777777 EDX=00000041 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000007E PS=0801 EAX=80777777 EDX=0000007E PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000007F PS=0801 EAX=80777777 EDX=0000007F PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000080 PS=0801 EAX=80777777 EDX=00000080 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000081 PS=0801 EAX=80777777 EDX=00000081 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=000000FE PS=0801 EAX=80777777 EDX=000000FE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=000000FF PS=0801 EAX=80777777 EDX=000000FF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777777 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777777 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777777 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00003FFF PS=0801 EAX=80777777 EDX=00003FFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00004000 PS=0801 EAX=80777777 EDX=00004000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00004001 PS=0801 EAX=80777777 EDX=00004001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00007FFE PS=0801 EAX=80777777 EDX=00007FFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00007FFF PS=0801 EAX=80777777 EDX=00007FFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00008000 PS=0801 EAX=80777777 EDX=00008000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00008001 PS=0801 EAX=80777777 EDX=00008001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000FFFE PS=0801 EAX=80777777 EDX=0000FFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=0000FFFF PS=0801 EAX=80777777 EDX=0000FFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000000 PS=0801 EAX=80777777 EDX=00000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000001 PS=0801 EAX=80777777 EDX=00000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=00000002 PS=0801 EAX=80777777 EDX=00000002 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=3FFFFFFF PS=0801 EAX=80777777 EDX=3FFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=40000000 PS=0801 EAX=80777777 EDX=40000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=40000001 PS=0801 EAX=80777777 EDX=40000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=7FFFFFFE PS=0801 EAX=80777777 EDX=7FFFFFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=7FFFFFFF PS=0801 EAX=80777777 EDX=7FFFFFFF PS=0801
|
||||
IMUL32D EAX=80000001 EDX=80000000 PS=0801 EAX=80777777 EDX=80000000 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=80000001 PS=0801 EAX=80777777 EDX=80000001 PS=0801
|
||||
IMUL32D EAX=80000001 EDX=FFFFFFFE PS=0801 EAX=80777777 EDX=FFFFFFFE PS=0801
|
||||
IMUL32D EAX=80000001 EDX=FFFFFFFF PS=0801 EAX=80777777 EDX=FFFFFFFF PS=0801
|
||||
IMUL32D EAX=FFFFFFFE EDX=00000000 PS=0801 EAX=FF111112 EDX=00000000 PS=0000
|
||||
IMUL32D EAX=FFFFFFFE EDX=00000001 PS=0000 EAX=FF111112 EDX=00000001 PS=0000
|
||||
IMUL32D EAX=FFFFFFFE EDX=00000002 PS=0000 EAX=FF111112 EDX=00000002 PS=0000
|
||||
|
|
|
|||
|
|
@ -1104,6 +1104,69 @@ X86.fnIMUL8 = function(dst, src)
|
|||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMULn(dst, src)
|
||||
*
|
||||
* 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
|
||||
*
|
||||
* "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
|
||||
* unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
|
||||
*
|
||||
* However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
|
||||
*
|
||||
* (80186/80188 and up)
|
||||
*
|
||||
* @this {X86CPU}
|
||||
* @param {number} dst (not used)
|
||||
* @param {number} src
|
||||
* @return {number}
|
||||
*/
|
||||
X86.fnIMULn = function(dst, src)
|
||||
{
|
||||
var result;
|
||||
dst = this.getIPWord();
|
||||
|
||||
if (this.sizeData == 2) {
|
||||
result = X86.fnIMULrw.call(this, dst, src);
|
||||
} else {
|
||||
result = X86.fnIMULrd.call(this, dst, src);
|
||||
}
|
||||
|
||||
/*
|
||||
* NOTE: The above functions already accounted for 80386 cycle counts, so we are simply accounting for the
|
||||
* increased time on an 80286; the 80186/80188 have even larger values, but we'll worry about that another day.
|
||||
*/
|
||||
if (this.model < X86.MODEL_80386) this.nStepCycles -= 12;
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMUL32(dst, src)
|
||||
*
|
||||
* This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as signed.
|
||||
*
|
||||
* @this {X86CPU}
|
||||
* @param {number} dst (any 32-bit number, treated as signed)
|
||||
* @param {number} src (any 32-bit number, treated as signed)
|
||||
*/
|
||||
X86.fnIMUL32 = function(dst, src)
|
||||
{
|
||||
var fNeg = false;
|
||||
if (src < 0) {
|
||||
src = -src|0;
|
||||
fNeg = !fNeg;
|
||||
}
|
||||
if (dst < 0) {
|
||||
dst = -dst|0;
|
||||
fNeg = !fNeg;
|
||||
}
|
||||
X86.fnMUL32.call(this, dst, src);
|
||||
if (fNeg) {
|
||||
this.regMDLo = (~this.regMDLo + 1)|0;
|
||||
this.regMDHi = (~this.regMDHi + (this.regMDLo? 0 : 1))|0;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMULb(dst, src)
|
||||
*
|
||||
|
|
@ -1140,81 +1203,6 @@ X86.fnIMULb = function(dst, src)
|
|||
return dst;
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMULn(dst, src)
|
||||
*
|
||||
* 80286_and_80287_Programmers_Reference_Manual_1987.pdf, p.B-44 (p.254) notes that:
|
||||
*
|
||||
* "The low 16 bits of the product of a 16-bit signed multiply are the same as those of an
|
||||
* unsigned multiply. The three operand IMUL instruction can be used for unsigned operands as well."
|
||||
*
|
||||
* However, we still sign-extend the operands before multiplying, making it easier to range-check the result.
|
||||
*
|
||||
* (80186/80188 and up)
|
||||
*
|
||||
* @this {X86CPU}
|
||||
* @param {number} dst (not used)
|
||||
* @param {number} src
|
||||
* @return {number}
|
||||
*/
|
||||
X86.fnIMULn = function(dst, src)
|
||||
{
|
||||
var fOverflow, result;
|
||||
dst = this.getIPWord();
|
||||
|
||||
if (this.sizeData == 2) {
|
||||
result = (((src << 16) >> 16) * ((dst << 16) >> 16))|0;
|
||||
fOverflow = (result > 32767 || result < -32768);
|
||||
} else {
|
||||
result = (src * dst);
|
||||
fOverflow = (result > 2147483647 || result < -2147483648);
|
||||
this.assert(fOverflow == (result != (result|0)));
|
||||
}
|
||||
|
||||
if (fOverflow) {
|
||||
this.setCF(); this.setOF();
|
||||
} else {
|
||||
this.clearCF(); this.clearOF();
|
||||
}
|
||||
|
||||
result &= this.maskData;
|
||||
|
||||
/*
|
||||
* NOTE: These are the cycle counts for the 80286; the 80186/80188 have slightly different values (ranges):
|
||||
* 22-25 and 29-32 instead of 21 and 24, respectively. However, accurate cycle counts for the 80186/80188 is
|
||||
* not super-critical. TODO: Fix this someday.
|
||||
*/
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 21 : 24);
|
||||
return result;
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMUL32(dst, src)
|
||||
*
|
||||
* This sets regMDHi:regMDLo to the 64-bit result of dst * src, both of which are treated as signed.
|
||||
*
|
||||
* @this {X86CPU}
|
||||
* @param {number} dst (any 32-bit number, treated as signed)
|
||||
* @param {number} src (any 32-bit number, treated as signed)
|
||||
*/
|
||||
X86.fnIMUL32 = function(dst, src)
|
||||
{
|
||||
var fNeg = false;
|
||||
if (src < 0) {
|
||||
src = -src|0;
|
||||
fNeg = !fNeg;
|
||||
}
|
||||
if (dst < 0) {
|
||||
dst = -dst|0;
|
||||
fNeg = !fNeg;
|
||||
}
|
||||
X86.fnMUL32.call(this, dst, src);
|
||||
if (fNeg) {
|
||||
this.regMDLo = (~this.regMDLo + 1)|0;
|
||||
this.regMDHi = (~this.regMDHi + (this.regMDLo? 0 : 1))|0;
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* fnIMULw(dst, src)
|
||||
*
|
||||
|
|
@ -1233,7 +1221,7 @@ X86.fnIMUL32 = function(dst, src)
|
|||
* @this {X86CPU}
|
||||
* @param {number} dst
|
||||
* @param {number} src (null; AX or EAX is the implied src)
|
||||
* @return {number} (we return dst unchanged, since it's actually DX:AX that's modified)
|
||||
* @return {number} (we return dst unchanged, since it's actually DX:AX or EDX:EAX that's modified)
|
||||
*/
|
||||
X86.fnIMULw = function(dst, src)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -41,7 +41,7 @@ if (NODE) {
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opGRP6 = function GRP6()
|
||||
X86.opGRP6 = function()
|
||||
{
|
||||
var bModRM = this.getIPByte();
|
||||
if ((bModRM & 0x38) < 0x10) { // possible reg values: 0x00, 0x08, 0x10, 0x18, 0x20, 0x28, 0x30, 0x38
|
||||
|
|
@ -55,7 +55,7 @@ X86.opGRP6 = function GRP6()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opGRP7 = function GRP7()
|
||||
X86.opGRP7 = function()
|
||||
{
|
||||
var bModRM = this.getIPByte();
|
||||
if (!(bModRM & 0x10)) {
|
||||
|
|
@ -71,7 +71,7 @@ X86.opGRP7 = function GRP7()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLAR = function LAR()
|
||||
X86.opLAR = function()
|
||||
{
|
||||
/*
|
||||
* TODO: Consider swapping out this function whenever setProtMode() changes the mode to real-mode or V86-mode.
|
||||
|
|
@ -90,7 +90,7 @@ X86.opLAR = function LAR()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLSL = function LSL()
|
||||
X86.opLSL = function()
|
||||
{
|
||||
/*
|
||||
* TODO: Consider swapping out this function whenever setProtMode() changes the mode to real-mode or V86-mode.
|
||||
|
|
@ -143,7 +143,7 @@ X86.opLSL = function LSL()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLOADALL286 = function LOADALL286()
|
||||
X86.opLOADALL286 = function()
|
||||
{
|
||||
if (this.nCPL) {
|
||||
/*
|
||||
|
|
@ -199,7 +199,7 @@ X86.opLOADALL286 = function LOADALL286()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opCLTS = function CLTS()
|
||||
X86.opCLTS = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -295,7 +295,7 @@ X86.opCLTS = function CLTS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLOADALL386 = function LOADALL386()
|
||||
X86.opLOADALL386 = function()
|
||||
{
|
||||
if (this.nCPL) {
|
||||
/*
|
||||
|
|
@ -331,7 +331,7 @@ X86.opLOADALL386 = function LOADALL386()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVrc = function MOVrc()
|
||||
X86.opMOVrc = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -380,7 +380,7 @@ X86.opMOVrc = function MOVrc()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVrd = function MOVrd()
|
||||
X86.opMOVrd = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -429,7 +429,7 @@ X86.opMOVrd = function MOVrd()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVcr = function MOVcr()
|
||||
X86.opMOVcr = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -478,7 +478,7 @@ X86.opMOVcr = function MOVcr()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVdr = function MOVdr()
|
||||
X86.opMOVdr = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -523,7 +523,7 @@ X86.opMOVdr = function MOVdr()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVrt = function MOVrt()
|
||||
X86.opMOVrt = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -561,7 +561,7 @@ X86.opMOVrt = function MOVrt()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVtr = function MOVtr()
|
||||
X86.opMOVtr = function()
|
||||
{
|
||||
/*
|
||||
* NOTE: The following code shouldn't need to also test X86.PS.VM, because V86-mode is CPL 3.
|
||||
|
|
@ -618,7 +618,7 @@ X86.opMOVtr = function MOVtr()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJOw = function JOw()
|
||||
X86.opJOw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getOF()) {
|
||||
|
|
@ -636,7 +636,7 @@ X86.opJOw = function JOw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNOw = function JNOw()
|
||||
X86.opJNOw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getOF()) {
|
||||
|
|
@ -654,7 +654,7 @@ X86.opJNOw = function JNOw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJCw = function JCw()
|
||||
X86.opJCw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getCF()) {
|
||||
|
|
@ -672,7 +672,7 @@ X86.opJCw = function JCw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNCw = function JNCw()
|
||||
X86.opJNCw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getCF()) {
|
||||
|
|
@ -690,7 +690,7 @@ X86.opJNCw = function JNCw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJZw = function JZw()
|
||||
X86.opJZw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getZF()) {
|
||||
|
|
@ -708,7 +708,7 @@ X86.opJZw = function JZw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNZw = function JNZw()
|
||||
X86.opJNZw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getZF()) {
|
||||
|
|
@ -726,7 +726,7 @@ X86.opJNZw = function JNZw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJBEw = function JBEw()
|
||||
X86.opJBEw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getCF() || this.getZF()) {
|
||||
|
|
@ -744,7 +744,7 @@ X86.opJBEw = function JBEw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNBEw = function JNBEw()
|
||||
X86.opJNBEw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getCF() && !this.getZF()) {
|
||||
|
|
@ -762,7 +762,7 @@ X86.opJNBEw = function JNBEw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJSw = function JSw()
|
||||
X86.opJSw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getSF()) {
|
||||
|
|
@ -780,7 +780,7 @@ X86.opJSw = function JSw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNSw = function JNSw()
|
||||
X86.opJNSw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getSF()) {
|
||||
|
|
@ -798,7 +798,7 @@ X86.opJNSw = function JNSw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJPw = function JPw()
|
||||
X86.opJPw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getPF()) {
|
||||
|
|
@ -816,7 +816,7 @@ X86.opJPw = function JPw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNPw = function JNPw()
|
||||
X86.opJNPw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getPF()) {
|
||||
|
|
@ -834,7 +834,7 @@ X86.opJNPw = function JNPw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJLw = function JLw()
|
||||
X86.opJLw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getSF() != !this.getOF()) {
|
||||
|
|
@ -852,7 +852,7 @@ X86.opJLw = function JLw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNLw = function JNLw()
|
||||
X86.opJNLw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getSF() == !this.getOF()) {
|
||||
|
|
@ -870,7 +870,7 @@ X86.opJNLw = function JNLw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJLEw = function JLEw()
|
||||
X86.opJLEw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (this.getZF() || !this.getSF() != !this.getOF()) {
|
||||
|
|
@ -888,7 +888,7 @@ X86.opJLEw = function JLEw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opJNLEw = function JNLEw()
|
||||
X86.opJNLEw = function()
|
||||
{
|
||||
var disp = this.getIPWord();
|
||||
if (!this.getZF() && !this.getSF() == !this.getOF()) {
|
||||
|
|
@ -906,7 +906,7 @@ X86.opJNLEw = function JNLEw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETO = function SETO()
|
||||
X86.opSETO = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETO);
|
||||
};
|
||||
|
|
@ -918,7 +918,7 @@ X86.opSETO = function SETO()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNO = function SETNO()
|
||||
X86.opSETNO = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETO);
|
||||
};
|
||||
|
|
@ -930,7 +930,7 @@ X86.opSETNO = function SETNO()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETC = function SETC()
|
||||
X86.opSETC = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETC);
|
||||
};
|
||||
|
|
@ -942,7 +942,7 @@ X86.opSETC = function SETC()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNC = function SETNC()
|
||||
X86.opSETNC = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNC);
|
||||
};
|
||||
|
|
@ -954,7 +954,7 @@ X86.opSETNC = function SETNC()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETZ = function SETZ()
|
||||
X86.opSETZ = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETZ);
|
||||
};
|
||||
|
|
@ -966,7 +966,7 @@ X86.opSETZ = function SETZ()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNZ = function SETNZ()
|
||||
X86.opSETNZ = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNZ);
|
||||
};
|
||||
|
|
@ -978,7 +978,7 @@ X86.opSETNZ = function SETNZ()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETBE = function SETBE()
|
||||
X86.opSETBE = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETBE);
|
||||
};
|
||||
|
|
@ -990,7 +990,7 @@ X86.opSETBE = function SETBE()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNBE = function SETNBE()
|
||||
X86.opSETNBE = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNBE);
|
||||
};
|
||||
|
|
@ -1002,7 +1002,7 @@ X86.opSETNBE = function SETNBE()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETS = function SETS()
|
||||
X86.opSETS = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETS);
|
||||
};
|
||||
|
|
@ -1014,7 +1014,7 @@ X86.opSETS = function SETS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNS = function SETNS()
|
||||
X86.opSETNS = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNS);
|
||||
};
|
||||
|
|
@ -1026,7 +1026,7 @@ X86.opSETNS = function SETNS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETP = function SETP()
|
||||
X86.opSETP = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETP);
|
||||
};
|
||||
|
|
@ -1038,7 +1038,7 @@ X86.opSETP = function SETP()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNP = function SETNP()
|
||||
X86.opSETNP = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNP);
|
||||
};
|
||||
|
|
@ -1050,7 +1050,7 @@ X86.opSETNP = function SETNP()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETL = function SETL()
|
||||
X86.opSETL = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETL);
|
||||
};
|
||||
|
|
@ -1062,7 +1062,7 @@ X86.opSETL = function SETL()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNL = function SETNL()
|
||||
X86.opSETNL = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNL);
|
||||
};
|
||||
|
|
@ -1074,7 +1074,7 @@ X86.opSETNL = function SETNL()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETLE = function SETLE()
|
||||
X86.opSETLE = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETLE);
|
||||
};
|
||||
|
|
@ -1086,7 +1086,7 @@ X86.opSETLE = function SETLE()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSETNLE = function SETNLE()
|
||||
X86.opSETNLE = function()
|
||||
{
|
||||
X86.fnSETcc.call(this, X86.fnSETNLE);
|
||||
};
|
||||
|
|
@ -1098,7 +1098,7 @@ X86.opSETNLE = function SETNLE()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opPUSHFS = function PUSHFS()
|
||||
X86.opPUSHFS = function()
|
||||
{
|
||||
/*
|
||||
* TODO: Reportedly, when the OPERAND size is 32 bits, the 80386 will decrement the stack pointer by 4,
|
||||
|
|
@ -1116,7 +1116,7 @@ X86.opPUSHFS = function PUSHFS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opPOPFS = function POPFS()
|
||||
X86.opPOPFS = function()
|
||||
{
|
||||
/*
|
||||
* Any operation that modifies the stack before loading a new segment must snapshot regLSP first.
|
||||
|
|
@ -1134,7 +1134,7 @@ X86.opPOPFS = function POPFS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBT = function BT()
|
||||
X86.opBT = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTMem);
|
||||
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= 6;
|
||||
|
|
@ -1147,7 +1147,7 @@ X86.opBT = function BT()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSHLDn = function SHLDn()
|
||||
X86.opSHLDn = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, this.sizeData == 2? X86.fnSHLDwi : X86.fnSHLDdi);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 7);
|
||||
|
|
@ -1160,7 +1160,7 @@ X86.opSHLDn = function SHLDn()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSHLDcl = function SHLDcl()
|
||||
X86.opSHLDcl = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, this.sizeData == 2? X86.fnSHLDwCL : X86.fnSHLDdCL);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 7);
|
||||
|
|
@ -1173,7 +1173,7 @@ X86.opSHLDcl = function SHLDcl()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opXBTS = function XBTS()
|
||||
X86.opXBTS = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnXBTS);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 6 : 13);
|
||||
|
|
@ -1186,7 +1186,7 @@ X86.opXBTS = function XBTS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opIBTS = function IBTS()
|
||||
X86.opIBTS = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnIBTS);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 12 : 19);
|
||||
|
|
@ -1199,7 +1199,7 @@ X86.opIBTS = function IBTS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opPUSHGS = function PUSHGS()
|
||||
X86.opPUSHGS = function()
|
||||
{
|
||||
/*
|
||||
* TODO: Reportedly, when the OPERAND size is 32 bits, the 80386 will decrement the stack pointer by 4,
|
||||
|
|
@ -1217,7 +1217,7 @@ X86.opPUSHGS = function PUSHGS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opPOPGS = function POPGS()
|
||||
X86.opPOPGS = function()
|
||||
{
|
||||
/*
|
||||
* Any operation that modifies the stack before loading a new segment must snapshot regLSP first.
|
||||
|
|
@ -1235,7 +1235,7 @@ X86.opPOPGS = function POPGS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBTS = function BTS()
|
||||
X86.opBTS = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTSMem);
|
||||
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= 5;
|
||||
|
|
@ -1248,7 +1248,7 @@ X86.opBTS = function BTS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSHRDn = function SHRDn()
|
||||
X86.opSHRDn = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, this.sizeData == 2? X86.fnSHRDwi : X86.fnSHRDdi);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 7);
|
||||
|
|
@ -1261,7 +1261,7 @@ X86.opSHRDn = function SHRDn()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opSHRDcl = function SHRDcl()
|
||||
X86.opSHRDcl = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, this.sizeData == 2? X86.fnSHRDwCL : X86.fnSHRDdCL);
|
||||
this.nStepCycles -= (this.regEA === X86.ADDR_INVALID? 3 : 7);
|
||||
|
|
@ -1274,7 +1274,7 @@ X86.opSHRDcl = function SHRDcl()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opIMUL = function IMUL()
|
||||
X86.opIMUL = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, this.sizeData == 2? X86.fnIMULrw : X86.fnIMULrd);
|
||||
};
|
||||
|
|
@ -1288,7 +1288,7 @@ X86.opIMUL = function IMUL()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLSS = function LSS()
|
||||
X86.opLSS = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLSS);
|
||||
};
|
||||
|
|
@ -1300,7 +1300,7 @@ X86.opLSS = function LSS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBTR = function BTR()
|
||||
X86.opBTR = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTRMem);
|
||||
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= 5;
|
||||
|
|
@ -1315,7 +1315,7 @@ X86.opBTR = function BTR()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLFS = function LFS()
|
||||
X86.opLFS = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLFS);
|
||||
};
|
||||
|
|
@ -1329,7 +1329,7 @@ X86.opLFS = function LFS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opLGS = function LGS()
|
||||
X86.opLGS = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnLGS);
|
||||
};
|
||||
|
|
@ -1341,7 +1341,7 @@ X86.opLGS = function LGS()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVZXb = function MOVZXb()
|
||||
X86.opMOVZXb = function()
|
||||
{
|
||||
/*
|
||||
* The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
|
||||
|
|
@ -1413,7 +1413,7 @@ X86.opMOVZXb = function MOVZXb()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVZXw = function MOVZXw()
|
||||
X86.opMOVZXw = function()
|
||||
{
|
||||
var bModRM = this.getIPByte();
|
||||
this.setDataSize(2);
|
||||
|
|
@ -1452,7 +1452,7 @@ X86.opMOVZXw = function MOVZXw()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opGRP8 = function GRP8()
|
||||
X86.opGRP8 = function()
|
||||
{
|
||||
this.aOpModGrpWord[this.getIPByte()].call(this, X86.aOpGrp8, this.getIPByte);
|
||||
};
|
||||
|
|
@ -1464,7 +1464,7 @@ X86.opGRP8 = function GRP8()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBTC = function BTC()
|
||||
X86.opBTC = function()
|
||||
{
|
||||
this.aOpModMemWord[this.getIPByte()].call(this, X86.fnBTCMem);
|
||||
if (this.regEA !== X86.ADDR_INVALID) this.nStepCycles -= 5;
|
||||
|
|
@ -1477,7 +1477,7 @@ X86.opBTC = function BTC()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBSF = function BSF()
|
||||
X86.opBSF = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSF);
|
||||
};
|
||||
|
|
@ -1489,7 +1489,7 @@ X86.opBSF = function BSF()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opBSR = function BSR()
|
||||
X86.opBSR = function()
|
||||
{
|
||||
this.aOpModRegWord[this.getIPByte()].call(this, X86.fnBSR);
|
||||
};
|
||||
|
|
@ -1501,7 +1501,7 @@ X86.opBSR = function BSR()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVSXb = function MOVSXb()
|
||||
X86.opMOVSXb = function()
|
||||
{
|
||||
/*
|
||||
* The ModRegByte handlers update the registers in the 1st column, but we need to update those in the 2nd column.
|
||||
|
|
@ -1573,7 +1573,7 @@ X86.opMOVSXb = function MOVSXb()
|
|||
*
|
||||
* @this {X86CPU}
|
||||
*/
|
||||
X86.opMOVSXw = function MOVSXw()
|
||||
X86.opMOVSXw = function()
|
||||
{
|
||||
var bModRM = this.getIPByte();
|
||||
this.setDataSize(2);
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
Loading…
Reference in a new issue