VirtualBox

Changeset 37002 in vbox


Ignore:
Timestamp:
May 8, 2011 5:01:56 PM (14 years ago)
Author:
vboxsync
Message:

IEM: Cleaning up and 'microcode' testcase - work in progress...

Location:
trunk/src/VBox/VMM
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r36860 r37002  
    114114
    115115/**
    116  * Function table for a binary operator providing implementation based on
    117  * operand size.
    118  */
    119 typedef struct IEMOPBINSIZES
    120 {
    121     PFNIEMAIMPLBINU8  pfnNormalU8,    pfnLockedU8;
    122     PFNIEMAIMPLBINU16 pfnNormalU16,   pfnLockedU16;
    123     PFNIEMAIMPLBINU32 pfnNormalU32,   pfnLockedU32;
    124     PFNIEMAIMPLBINU64 pfnNormalU64,   pfnLockedU64;
    125 } IEMOPBINSIZES;
    126 /** Pointer to a binary operator function table. */
    127 typedef IEMOPBINSIZES const *PCIEMOPBINSIZES;
    128 
    129 
    130 /**
    131  * Function table for a unary operator providing implementation based on
    132  * operand size.
    133  */
    134 typedef struct IEMOPUNARYSIZES
    135 {
    136     PFNIEMAIMPLUNARYU8  pfnNormalU8,    pfnLockedU8;
    137     PFNIEMAIMPLUNARYU16 pfnNormalU16,   pfnLockedU16;
    138     PFNIEMAIMPLUNARYU32 pfnNormalU32,   pfnLockedU32;
    139     PFNIEMAIMPLUNARYU64 pfnNormalU64,   pfnLockedU64;
    140 } IEMOPUNARYSIZES;
    141 /** Pointer to a unary operator function table. */
    142 typedef IEMOPUNARYSIZES const *PCIEMOPUNARYSIZES;
    143 
    144 
    145 /**
    146  * Function table for a shift operator providing implementation based on
    147  * operand size.
    148  */
    149 typedef struct IEMOPSHIFTSIZES
    150 {
    151     PFNIEMAIMPLSHIFTU8  pfnNormalU8;
    152     PFNIEMAIMPLSHIFTU16 pfnNormalU16;
    153     PFNIEMAIMPLSHIFTU32 pfnNormalU32;
    154     PFNIEMAIMPLSHIFTU64 pfnNormalU64;
    155 } IEMOPSHIFTSIZES;
    156 /** Pointer to a shift operator function table. */
    157 typedef IEMOPSHIFTSIZES const *PCIEMOPSHIFTSIZES;
    158 
    159 
    160 /**
    161  * Function table for a multiplication or division operation.
    162  */
    163 typedef struct IEMOPMULDIVSIZES
    164 {
    165     PFNIEMAIMPLMULDIVU8  pfnU8;
    166     PFNIEMAIMPLMULDIVU16 pfnU16;
    167     PFNIEMAIMPLMULDIVU32 pfnU32;
    168     PFNIEMAIMPLMULDIVU64 pfnU64;
    169 } IEMOPMULDIVSIZES;
    170 /** Pointer to a multiplication or division operation function table. */
    171 typedef IEMOPMULDIVSIZES const *PCIEMOPMULDIVSIZES;
    172 
    173 
    174 /**
    175  * Function table for a double precision shift operator providing implementation
    176  * based on operand size.
    177  */
    178 typedef struct IEMOPSHIFTDBLSIZES
    179 {
    180     PFNIEMAIMPLSHIFTDBLU16 pfnNormalU16;
    181     PFNIEMAIMPLSHIFTDBLU32 pfnNormalU32;
    182     PFNIEMAIMPLSHIFTDBLU64 pfnNormalU64;
    183 } IEMOPSHIFTDBLSIZES;
    184 /** Pointer to a double precision shift function table. */
    185 typedef IEMOPSHIFTDBLSIZES const *PCIEMOPSHIFTDBLSIZES;
    186 
    187 
    188 /**
    189116 * Selector descriptor table entry as fetched by iemMemFetchSelDesc.
    190117 */
     
    10861013
    10871014/**
     1015 * Fetches the next signed word from the opcode stream.
     1016 *
     1017 * @returns Strict VBox status code.
     1018 * @param   pIemCpu             The IEM state.
     1019 * @param   pi16                Where to return the signed word.
     1020 */
     1021DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS16(PIEMCPU pIemCpu, int16_t *pi16)
     1022{
     1023    return iemOpcodeGetNextU16(pIemCpu, (uint16_t *)pi16);
     1024}
     1025
     1026/**
     1027 * Fetches the next signed word from the opcode stream, returning automatically
     1028 * on failure.
     1029 *
     1030 * @param   pi16                Where to return the signed word.
     1031 * @remark Implicitly references pIemCpu.
     1032 */
     1033#define IEM_OPCODE_GET_NEXT_S16(a_pi16) \
     1034    do \
     1035    { \
     1036        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS16(pIemCpu, (a_pi16)); \
     1037        if (rcStrict2 != VINF_SUCCESS) \
     1038            return rcStrict2; \
     1039    } while (0)
     1040
     1041
     1042/**
    10881043 * Fetches the next opcode dword.
    10891044 *
     
    11161071    { \
    11171072        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextU32((a_pIemCpu), (a_pu32)); \
     1073        if (rcStrict2 != VINF_SUCCESS) \
     1074            return rcStrict2; \
     1075    } while (0)
     1076
     1077
     1078/**
     1079 * Fetches the next signed double word from the opcode stream.
     1080 *
     1081 * @returns Strict VBox status code.
     1082 * @param   pIemCpu             The IEM state.
     1083 * @param   pi32                Where to return the signed double word.
     1084 */
     1085DECLINLINE(VBOXSTRICTRC) iemOpcodeGetNextS32(PIEMCPU pIemCpu, int32_t *pi32)
     1086{
     1087    return iemOpcodeGetNextU32(pIemCpu, (uint32_t *)pi32);
     1088}
     1089
     1090/**
     1091 * Fetches the next signed double word from the opcode stream, returning
     1092 * automatically on failure.
     1093 *
     1094 * @param   pi32                Where to return the signed double word.
     1095 * @remark Implicitly references pIemCpu.
     1096 */
     1097#define IEM_OPCODE_GET_NEXT_S32(a_pi32) \
     1098    do \
     1099    { \
     1100        VBOXSTRICTRC rcStrict2 = iemOpcodeGetNextS32(pIemCpu, (a_pi32)); \
    11181101        if (rcStrict2 != VINF_SUCCESS) \
    11191102            return rcStrict2; \
  • trunk/src/VBox/VMM/VMMAll/IEMAllInstructions.cpp.h

    r36860 r37002  
    1515 * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
    1616 */
     17
     18
     19/*******************************************************************************
     20*   Global Variables                                                           *
     21*******************************************************************************/
     22extern const PFNIEMOP g_apfnOneByteMap[256]; /* not static since we need to forward declare it. */
    1723
    1824
     
    14441450    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    14451451    {
    1446         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1452        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    14471453        IEMOP_HLP_NO_LOCK_PREFIX();
    14481454
    14491455        IEM_MC_BEGIN(0, 0);
    14501456        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    1451             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1457            IEM_MC_REL_JMP_S16(i16Imm);
    14521458        } IEM_MC_ELSE() {
    14531459            IEM_MC_ADVANCE_RIP();
     
    14571463    else
    14581464    {
    1459         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1465        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    14601466        IEMOP_HLP_NO_LOCK_PREFIX();
    14611467
    14621468        IEM_MC_BEGIN(0, 0);
    14631469        IEM_MC_IF_EFL_BIT_SET(X86_EFL_OF) {
    1464             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1470            IEM_MC_REL_JMP_S32(i32Imm);
    14651471        } IEM_MC_ELSE() {
    14661472            IEM_MC_ADVANCE_RIP();
     
    14791485    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    14801486    {
    1481         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1487        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    14821488        IEMOP_HLP_NO_LOCK_PREFIX();
    14831489
     
    14861492            IEM_MC_ADVANCE_RIP();
    14871493        } IEM_MC_ELSE() {
    1488             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1494            IEM_MC_REL_JMP_S16(i16Imm);
    14891495        } IEM_MC_ENDIF();
    14901496        IEM_MC_END();
     
    14921498    else
    14931499    {
    1494         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1500        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    14951501        IEMOP_HLP_NO_LOCK_PREFIX();
    14961502
     
    14991505            IEM_MC_ADVANCE_RIP();
    15001506        } IEM_MC_ELSE() {
    1501             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1507            IEM_MC_REL_JMP_S32(i32Imm);
    15021508        } IEM_MC_ENDIF();
    15031509        IEM_MC_END();
     
    15141520    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    15151521    {
    1516         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1522        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    15171523        IEMOP_HLP_NO_LOCK_PREFIX();
    15181524
    15191525        IEM_MC_BEGIN(0, 0);
    15201526        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    1521             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1527            IEM_MC_REL_JMP_S16(i16Imm);
    15221528        } IEM_MC_ELSE() {
    15231529            IEM_MC_ADVANCE_RIP();
     
    15271533    else
    15281534    {
    1529         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1535        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    15301536        IEMOP_HLP_NO_LOCK_PREFIX();
    15311537
    15321538        IEM_MC_BEGIN(0, 0);
    15331539        IEM_MC_IF_EFL_BIT_SET(X86_EFL_CF) {
    1534             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1540            IEM_MC_REL_JMP_S32(i32Imm);
    15351541        } IEM_MC_ELSE() {
    15361542            IEM_MC_ADVANCE_RIP();
     
    15491555    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    15501556    {
    1551         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1557        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    15521558        IEMOP_HLP_NO_LOCK_PREFIX();
    15531559
     
    15561562            IEM_MC_ADVANCE_RIP();
    15571563        } IEM_MC_ELSE() {
    1558             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1564            IEM_MC_REL_JMP_S16(i16Imm);
    15591565        } IEM_MC_ENDIF();
    15601566        IEM_MC_END();
     
    15621568    else
    15631569    {
    1564         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1570        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    15651571        IEMOP_HLP_NO_LOCK_PREFIX();
    15661572
     
    15691575            IEM_MC_ADVANCE_RIP();
    15701576        } IEM_MC_ELSE() {
    1571             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1577            IEM_MC_REL_JMP_S32(i32Imm);
    15721578        } IEM_MC_ENDIF();
    15731579        IEM_MC_END();
     
    15841590    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    15851591    {
    1586         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1592        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    15871593        IEMOP_HLP_NO_LOCK_PREFIX();
    15881594
    15891595        IEM_MC_BEGIN(0, 0);
    15901596        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    1591             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1597            IEM_MC_REL_JMP_S16(i16Imm);
    15921598        } IEM_MC_ELSE() {
    15931599            IEM_MC_ADVANCE_RIP();
     
    15971603    else
    15981604    {
    1599         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1605        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    16001606        IEMOP_HLP_NO_LOCK_PREFIX();
    16011607
    16021608        IEM_MC_BEGIN(0, 0);
    16031609        IEM_MC_IF_EFL_BIT_SET(X86_EFL_ZF) {
    1604             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1610            IEM_MC_REL_JMP_S32(i32Imm);
    16051611        } IEM_MC_ELSE() {
    16061612            IEM_MC_ADVANCE_RIP();
     
    16191625    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    16201626    {
    1621         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1627        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    16221628        IEMOP_HLP_NO_LOCK_PREFIX();
    16231629
     
    16261632            IEM_MC_ADVANCE_RIP();
    16271633        } IEM_MC_ELSE() {
    1628             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1634            IEM_MC_REL_JMP_S16(i16Imm);
    16291635        } IEM_MC_ENDIF();
    16301636        IEM_MC_END();
     
    16321638    else
    16331639    {
    1634         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1640        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    16351641        IEMOP_HLP_NO_LOCK_PREFIX();
    16361642
     
    16391645            IEM_MC_ADVANCE_RIP();
    16401646        } IEM_MC_ELSE() {
    1641             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1647            IEM_MC_REL_JMP_S32(i32Imm);
    16421648        } IEM_MC_ENDIF();
    16431649        IEM_MC_END();
     
    16541660    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    16551661    {
    1656         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1662        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    16571663        IEMOP_HLP_NO_LOCK_PREFIX();
    16581664
    16591665        IEM_MC_BEGIN(0, 0);
    16601666        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    1661             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1667            IEM_MC_REL_JMP_S16(i16Imm);
    16621668        } IEM_MC_ELSE() {
    16631669            IEM_MC_ADVANCE_RIP();
     
    16671673    else
    16681674    {
    1669         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1675        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    16701676        IEMOP_HLP_NO_LOCK_PREFIX();
    16711677
    16721678        IEM_MC_BEGIN(0, 0);
    16731679        IEM_MC_IF_EFL_ANY_BITS_SET(X86_EFL_CF | X86_EFL_ZF) {
    1674             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1680            IEM_MC_REL_JMP_S32(i32Imm);
    16751681        } IEM_MC_ELSE() {
    16761682            IEM_MC_ADVANCE_RIP();
     
    16891695    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    16901696    {
    1691         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1697        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    16921698        IEMOP_HLP_NO_LOCK_PREFIX();
    16931699
     
    16961702            IEM_MC_ADVANCE_RIP();
    16971703        } IEM_MC_ELSE() {
    1698             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1704            IEM_MC_REL_JMP_S16(i16Imm);
    16991705        } IEM_MC_ENDIF();
    17001706        IEM_MC_END();
     
    17021708    else
    17031709    {
    1704         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1710        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    17051711        IEMOP_HLP_NO_LOCK_PREFIX();
    17061712
     
    17091715            IEM_MC_ADVANCE_RIP();
    17101716        } IEM_MC_ELSE() {
    1711             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1717            IEM_MC_REL_JMP_S32(i32Imm);
    17121718        } IEM_MC_ENDIF();
    17131719        IEM_MC_END();
     
    17241730    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    17251731    {
    1726         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1732        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    17271733        IEMOP_HLP_NO_LOCK_PREFIX();
    17281734
    17291735        IEM_MC_BEGIN(0, 0);
    17301736        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    1731             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1737            IEM_MC_REL_JMP_S16(i16Imm);
    17321738        } IEM_MC_ELSE() {
    17331739            IEM_MC_ADVANCE_RIP();
     
    17371743    else
    17381744    {
    1739         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1745        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    17401746        IEMOP_HLP_NO_LOCK_PREFIX();
    17411747
    17421748        IEM_MC_BEGIN(0, 0);
    17431749        IEM_MC_IF_EFL_BIT_SET(X86_EFL_SF) {
    1744             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1750            IEM_MC_REL_JMP_S32(i32Imm);
    17451751        } IEM_MC_ELSE() {
    17461752            IEM_MC_ADVANCE_RIP();
     
    17591765    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    17601766    {
    1761         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1767        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    17621768        IEMOP_HLP_NO_LOCK_PREFIX();
    17631769
     
    17661772            IEM_MC_ADVANCE_RIP();
    17671773        } IEM_MC_ELSE() {
    1768             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1774            IEM_MC_REL_JMP_S16(i16Imm);
    17691775        } IEM_MC_ENDIF();
    17701776        IEM_MC_END();
     
    17721778    else
    17731779    {
    1774         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1780        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    17751781        IEMOP_HLP_NO_LOCK_PREFIX();
    17761782
     
    17791785            IEM_MC_ADVANCE_RIP();
    17801786        } IEM_MC_ELSE() {
    1781             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1787            IEM_MC_REL_JMP_S32(i32Imm);
    17821788        } IEM_MC_ENDIF();
    17831789        IEM_MC_END();
     
    17941800    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    17951801    {
    1796         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1802        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    17971803        IEMOP_HLP_NO_LOCK_PREFIX();
    17981804
    17991805        IEM_MC_BEGIN(0, 0);
    18001806        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    1801             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1807            IEM_MC_REL_JMP_S16(i16Imm);
    18021808        } IEM_MC_ELSE() {
    18031809            IEM_MC_ADVANCE_RIP();
     
    18071813    else
    18081814    {
    1809         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1815        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    18101816        IEMOP_HLP_NO_LOCK_PREFIX();
    18111817
    18121818        IEM_MC_BEGIN(0, 0);
    18131819        IEM_MC_IF_EFL_BIT_SET(X86_EFL_PF) {
    1814             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1820            IEM_MC_REL_JMP_S32(i32Imm);
    18151821        } IEM_MC_ELSE() {
    18161822            IEM_MC_ADVANCE_RIP();
     
    18291835    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    18301836    {
    1831         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1837        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    18321838        IEMOP_HLP_NO_LOCK_PREFIX();
    18331839
     
    18361842            IEM_MC_ADVANCE_RIP();
    18371843        } IEM_MC_ELSE() {
    1838             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1844            IEM_MC_REL_JMP_S16(i16Imm);
    18391845        } IEM_MC_ENDIF();
    18401846        IEM_MC_END();
     
    18421848    else
    18431849    {
    1844         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1850        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    18451851        IEMOP_HLP_NO_LOCK_PREFIX();
    18461852
     
    18491855            IEM_MC_ADVANCE_RIP();
    18501856        } IEM_MC_ELSE() {
    1851             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1857            IEM_MC_REL_JMP_S32(i32Imm);
    18521858        } IEM_MC_ENDIF();
    18531859        IEM_MC_END();
     
    18641870    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    18651871    {
    1866         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1872        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    18671873        IEMOP_HLP_NO_LOCK_PREFIX();
    18681874
    18691875        IEM_MC_BEGIN(0, 0);
    18701876        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    1871             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1877            IEM_MC_REL_JMP_S16(i16Imm);
    18721878        } IEM_MC_ELSE() {
    18731879            IEM_MC_ADVANCE_RIP();
     
    18771883    else
    18781884    {
    1879         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1885        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    18801886        IEMOP_HLP_NO_LOCK_PREFIX();
    18811887
    18821888        IEM_MC_BEGIN(0, 0);
    18831889        IEM_MC_IF_EFL_BITS_NE(X86_EFL_SF, X86_EFL_OF) {
    1884             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1890            IEM_MC_REL_JMP_S32(i32Imm);
    18851891        } IEM_MC_ELSE() {
    18861892            IEM_MC_ADVANCE_RIP();
     
    18991905    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    19001906    {
    1901         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1907        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    19021908        IEMOP_HLP_NO_LOCK_PREFIX();
    19031909
     
    19061912            IEM_MC_ADVANCE_RIP();
    19071913        } IEM_MC_ELSE() {
    1908             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1914            IEM_MC_REL_JMP_S16(i16Imm);
    19091915        } IEM_MC_ENDIF();
    19101916        IEM_MC_END();
     
    19121918    else
    19131919    {
    1914         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1920        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    19151921        IEMOP_HLP_NO_LOCK_PREFIX();
    19161922
     
    19191925            IEM_MC_ADVANCE_RIP();
    19201926        } IEM_MC_ELSE() {
    1921             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1927            IEM_MC_REL_JMP_S32(i32Imm);
    19221928        } IEM_MC_ENDIF();
    19231929        IEM_MC_END();
     
    19341940    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    19351941    {
    1936         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1942        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    19371943        IEMOP_HLP_NO_LOCK_PREFIX();
    19381944
    19391945        IEM_MC_BEGIN(0, 0);
    19401946        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    1941             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1947            IEM_MC_REL_JMP_S16(i16Imm);
    19421948        } IEM_MC_ELSE() {
    19431949            IEM_MC_ADVANCE_RIP();
     
    19471953    else
    19481954    {
    1949         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1955        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    19501956        IEMOP_HLP_NO_LOCK_PREFIX();
    19511957
    19521958        IEM_MC_BEGIN(0, 0);
    19531959        IEM_MC_IF_EFL_BIT_SET_OR_BITS_NE(X86_EFL_ZF, X86_EFL_SF, X86_EFL_OF) {
    1954             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1960            IEM_MC_REL_JMP_S32(i32Imm);
    19551961        } IEM_MC_ELSE() {
    19561962            IEM_MC_ADVANCE_RIP();
     
    19691975    if (pIemCpu->enmEffOpSize == IEMMODE_16BIT)
    19701976    {
    1971         uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     1977        int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    19721978        IEMOP_HLP_NO_LOCK_PREFIX();
    19731979
     
    19761982            IEM_MC_ADVANCE_RIP();
    19771983        } IEM_MC_ELSE() {
    1978             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     1984            IEM_MC_REL_JMP_S16(i16Imm);
    19791985        } IEM_MC_ENDIF();
    19801986        IEM_MC_END();
     
    19821988    else
    19831989    {
    1984         uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     1990        int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    19851991        IEMOP_HLP_NO_LOCK_PREFIX();
    19861992
     
    19891995            IEM_MC_ADVANCE_RIP();
    19901996        } IEM_MC_ELSE() {
    1991             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     1997            IEM_MC_REL_JMP_S32(i32Imm);
    19921998        } IEM_MC_ENDIF();
    19931999        IEM_MC_END();
     
    72787284    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE(); /* The common code does this differently. */
    72797285
     7286#ifndef TST_IEM_CHECK_MC
    72807287    /* Calc effective address with modified ESP. */
    72817288    uint8_t const   offOpcodeSaved = pIemCpu->offOpcode;
     
    73407347    }
    73417348    return rcStrict;
     7349
     7350#else
     7351    return VERR_NOT_IMPLEMENTED;
     7352#endif
    73427353}
    73437354
     
    1009310104        case IEMMODE_16BIT:
    1009410105        {
    10095             uint16_t u16Imm; IEM_OPCODE_GET_NEXT_U16(pIemCpu, &u16Imm);
     10106            int16_t i16Imm; IEM_OPCODE_GET_NEXT_S16(&i16Imm);
    1009610107            IEM_MC_BEGIN(0, 0);
    10097             IEM_MC_REL_JMP_S16((int16_t)u16Imm);
     10108            IEM_MC_REL_JMP_S16(i16Imm);
    1009810109            IEM_MC_END();
    1009910110            return VINF_SUCCESS;
     
    1010310114        case IEMMODE_32BIT:
    1010410115        {
    10105             uint32_t u32Imm; IEM_OPCODE_GET_NEXT_U32(pIemCpu, &u32Imm);
     10116            int32_t i32Imm; IEM_OPCODE_GET_NEXT_S32(&i32Imm);
    1010610117            IEM_MC_BEGIN(0, 0);
    10107             IEM_MC_REL_JMP_S32((int32_t)u32Imm);
     10118            IEM_MC_REL_JMP_S32(i32Imm);
    1010810119            IEM_MC_END();
    1010910120            return VINF_SUCCESS;
     
    1014010151{
    1014110152    IEMOP_MNEMONIC("jmp Jb");
    10142     uint8_t u8Imm; IEM_OPCODE_GET_NEXT_BYTE(pIemCpu, &u8Imm);
     10153    int8_t i8Imm; IEM_OPCODE_GET_NEXT_S8(pIemCpu, &i8Imm);
    1014310154    IEMOP_HLP_NO_LOCK_PREFIX();
    1014410155    IEMOP_HLP_DEFAULT_64BIT_OP_SIZE();
    1014510156
    1014610157    IEM_MC_BEGIN(0, 0);
    10147     IEM_MC_REL_JMP_S8((int8_t)u8Imm);
     10158    IEM_MC_REL_JMP_S8(i8Imm);
    1014810159    IEM_MC_END();
    1014910160    return VINF_SUCCESS;
  • trunk/src/VBox/VMM/include/IEMInternal.h

    r36857 r37002  
    643643
    644644
     645/** @name Function tables.
     646 * @{
     647 */
     648
     649/**
     650 * Function table for a binary operator providing implementation based on
     651 * operand size.
     652 */
     653typedef struct IEMOPBINSIZES
     654{
     655    PFNIEMAIMPLBINU8  pfnNormalU8,    pfnLockedU8;
     656    PFNIEMAIMPLBINU16 pfnNormalU16,   pfnLockedU16;
     657    PFNIEMAIMPLBINU32 pfnNormalU32,   pfnLockedU32;
     658    PFNIEMAIMPLBINU64 pfnNormalU64,   pfnLockedU64;
     659} IEMOPBINSIZES;
     660/** Pointer to a binary operator function table. */
     661typedef IEMOPBINSIZES const *PCIEMOPBINSIZES;
     662
     663
     664/**
     665 * Function table for a unary operator providing implementation based on
     666 * operand size.
     667 */
     668typedef struct IEMOPUNARYSIZES
     669{
     670    PFNIEMAIMPLUNARYU8  pfnNormalU8,    pfnLockedU8;
     671    PFNIEMAIMPLUNARYU16 pfnNormalU16,   pfnLockedU16;
     672    PFNIEMAIMPLUNARYU32 pfnNormalU32,   pfnLockedU32;
     673    PFNIEMAIMPLUNARYU64 pfnNormalU64,   pfnLockedU64;
     674} IEMOPUNARYSIZES;
     675/** Pointer to a unary operator function table. */
     676typedef IEMOPUNARYSIZES const *PCIEMOPUNARYSIZES;
     677
     678
     679/**
     680 * Function table for a shift operator providing implementation based on
     681 * operand size.
     682 */
     683typedef struct IEMOPSHIFTSIZES
     684{
     685    PFNIEMAIMPLSHIFTU8  pfnNormalU8;
     686    PFNIEMAIMPLSHIFTU16 pfnNormalU16;
     687    PFNIEMAIMPLSHIFTU32 pfnNormalU32;
     688    PFNIEMAIMPLSHIFTU64 pfnNormalU64;
     689} IEMOPSHIFTSIZES;
     690/** Pointer to a shift operator function table. */
     691typedef IEMOPSHIFTSIZES const *PCIEMOPSHIFTSIZES;
     692
     693
     694/**
     695 * Function table for a multiplication or division operation.
     696 */
     697typedef struct IEMOPMULDIVSIZES
     698{
     699    PFNIEMAIMPLMULDIVU8  pfnU8;
     700    PFNIEMAIMPLMULDIVU16 pfnU16;
     701    PFNIEMAIMPLMULDIVU32 pfnU32;
     702    PFNIEMAIMPLMULDIVU64 pfnU64;
     703} IEMOPMULDIVSIZES;
     704/** Pointer to a multiplication or division operation function table. */
     705typedef IEMOPMULDIVSIZES const *PCIEMOPMULDIVSIZES;
     706
     707
     708/**
     709 * Function table for a double precision shift operator providing implementation
     710 * based on operand size.
     711 */
     712typedef struct IEMOPSHIFTDBLSIZES
     713{
     714    PFNIEMAIMPLSHIFTDBLU16 pfnNormalU16;
     715    PFNIEMAIMPLSHIFTDBLU32 pfnNormalU32;
     716    PFNIEMAIMPLSHIFTDBLU64 pfnNormalU64;
     717} IEMOPSHIFTDBLSIZES;
     718/** Pointer to a double precision shift function table. */
     719typedef IEMOPSHIFTDBLSIZES const *PCIEMOPSHIFTDBLSIZES;
     720
     721
     722/** @} */
     723
     724
    645725/** @name C instruction implementations for anything slightly complicated.
    646726 * @{ */
  • trunk/src/VBox/VMM/testcase/Makefile.kmk

    r36864 r37002  
    3737  PROGRAMS  += \
    3838        tstCFGM \
     39        tstCompiler \
    3940        tstCompressionBenchmark \
     41        tstIEMCheckMc \
     42        tstMMHyperHeap \
    4043        tstSSM \
    41         tstMMHyperHeap \
    42         tstVMREQ \
    43         tstCompiler \
    4444        tstVMMR0CallHost-1 \
    45         tstVMMR0CallHost-2
     45        tstVMMR0CallHost-2 \
     46        tstVMREQ
    4647  ifn1of ($(KBUILD_TARGET).$(KBUILD_TARGET_ARCH), solaris.x86 solaris.amd64 win.amd64 ) ## TODO: Fix the code.
    4748   PROGRAMS  +=  tstX86-1
     
    190191tstGlobalConfig_SOURCES = tstGlobalConfig.cpp
    191192tstGlobalConfig_LIBS    = $(LIB_RUNTIME)
     193
     194tstIEMCheckMc_TEMPLATE  = VBOXR3TSTEXE
     195tstIEMCheckMc_SOURCES   = tstIEMCheckMc.cpp
     196tstIEMCheckMc_LIBS      = $(LIB_RUNTIME)
    192197
    193198tstMMHyperHeap_TEMPLATE = VBOXR3TSTEXE
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette