diff --git a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
index a595c1e275..012af69d3d 100644
--- a/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
+++ b/pcsx2/windows/VCprojects/pcsx2_2008.vcproj
@@ -2854,7 +2854,11 @@
>
+
+
+
+
tempdump", filename );
system( command );
@@ -635,8 +635,6 @@ static void recShutdown()
safe_free(psxRecLUT);
safe_free( s_pInstCache );
s_nInstCacheSize = 0;
-
- x86Shutdown();
}
#pragma warning(disable:4731) // frame pointer register 'ebp' modified by inline assembly code
@@ -722,7 +720,7 @@ __declspec(naked) void psxDispatcher()
__asm
{
shl eax,4
- pop ecx // x86Ptr to mod
+ pop ecx // x86Ptr[0] to mod
mov edx, eax
sub edx, ecx
sub edx, 4
@@ -900,14 +898,14 @@ void psxRecClearMem(BASEBLOCK* p)
assert( p->GetFnptr() != 0 );
assert( p->startpc );
- x86Ptr = (u8*)p->GetFnptr();
+ x86Ptr[0] = (u8*)p->GetFnptr();
// there is a small problem: mem can be ored with 0xa<<28 or 0x8<<28, and don't know which
MOV32ItoR(EDX, p->startpc);
- assert( (uptr)x86Ptr <= 0xffffffff );
- PUSH32I((uptr)x86Ptr);
- JMP32((uptr)psxDispatcherClear - ( (uptr)x86Ptr + 5 ));
- assert( x86Ptr == (u8*)p->GetFnptr() + IOP_MIN_BLOCK_BYTES );
+ assert( (uptr)x86Ptr[0] <= 0xffffffff );
+ PUSH32I((uptr)x86Ptr[0]);
+ JMP32((uptr)psxDispatcherClear - ( (uptr)x86Ptr[0] + 5 ));
+ assert( x86Ptr[0] == (u8*)p->GetFnptr() + IOP_MIN_BLOCK_BYTES );
pstart = PSX_GETBLOCK(p->startpc);
pexblock = PSX_GETBLOCKEX(pstart);
@@ -954,7 +952,7 @@ void psxSetBranchReg(u32 reg)
_psxFlushCall(FLUSH_EVERYTHING);
iPsxBranchTest(0xffffffff, 1);
- JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 5 ));
+ JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
}
void psxSetBranchImm( u32 imm )
@@ -969,8 +967,8 @@ void psxSetBranchImm( u32 imm )
iPsxBranchTest(imm, imm <= psxpc);
MOV32ItoR(EDX, 0);
- ptr = (u32*)(x86Ptr-4);
- *ptr = (uptr)JMP32((uptr)psxDispatcher - ( (uptr)x86Ptr + 5 ));
+ ptr = (u32*)(x86Ptr[0]-4);
+ *ptr = (uptr)JMP32((uptr)psxDispatcher - ( (uptr)x86Ptr[0] + 5 ));
}
//fixme : this is all a huge hack, we base the counter advancements on the average an opcode should take (wtf?)
@@ -1011,7 +1009,7 @@ static void iPsxBranchTest(u32 newpc, u32 cpuBranch)
if( newpc != 0xffffffff )
{
CMP32ItoM((uptr)&psxRegs.pc, newpc);
- JNE32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 6 ));
+ JNE32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 6 ));
}
// Skip branch jump target here:
@@ -1047,7 +1045,7 @@ void rpsxSYSCALL()
ADD32ItoM((uptr)&psxRegs.cycle, psxScaleBlockCycles() );
SUB32ItoM((uptr)&psxCycleEE, psxScaleBlockCycles()*8 );
- JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 5 ));
+ JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
// jump target for skipping blockCycle updates
x86SetJ8(j8Ptr[0]);
@@ -1067,7 +1065,7 @@ void rpsxBREAK()
j8Ptr[0] = JE8(0);
ADD32ItoM((uptr)&psxRegs.cycle, psxScaleBlockCycles() );
SUB32ItoM((uptr)&psxCycleEE, psxScaleBlockCycles()*8 );
- JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 5 ));
+ JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
x86SetJ8(j8Ptr[0]);
//if (!psxbranch) psxbranch = 2;
@@ -1103,22 +1101,22 @@ void psxRecompileNextInstruction(int delayslot)
// if( pexblock->pOldFnptr ) {
// // code already in place, so jump to it and exit recomp
-// JMP32((uptr)pexblock->pOldFnptr - ((uptr)x86Ptr + 5));
+// JMP32((uptr)pexblock->pOldFnptr - ((uptr)x86Ptr[0] + 5));
// branch = 3;
// return;
// }
- JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr + 5));
+ JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr[0] + 5));
psxbranch = 3;
return;
}
else {
if( !(delayslot && pblock->startpc == psxpc) ) {
- u8* oldX86 = x86Ptr;
+ u8* oldX86 = x86Ptr[0];
//__Log("clear block %x\n", pblock->startpc);
psxRecClearMem(pblock);
- x86Ptr = oldX86;
+ x86Ptr[0] = oldX86;
if( delayslot )
SysPrintf("delay slot %x\n", psxpc);
}
@@ -1289,12 +1287,12 @@ void psxRecRecompile(u32 startpc)
x86SetPtr( recPtr );
x86Align(16);
- recPtr = x86Ptr;
+ recPtr = x86Ptr[0];
psxbranch = 0;
s_pCurBlock->startpc = startpc;
- s_pCurBlock->SetFnptr( (uptr)x86Ptr );
+ s_pCurBlock->SetFnptr( (uptr)x86Ptr[0] );
s_psxBlockCycles = 0;
// reset recomp state variables
@@ -1440,7 +1438,7 @@ StartRecomp:
iPsxBranchTest(0xffffffff, 1);
- JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 5 ));
+ JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
}
else {
assert( psxbranch != 3 );
@@ -1456,7 +1454,7 @@ StartRecomp:
assert( psxpc == s_nEndBlock );
_psxFlushCall(FLUSH_EVERYTHING);
MOV32ItoM((uptr)&psxRegs.pc, psxpc);
- JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr + 5));
+ JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr[0] + 5));
psxbranch = 3;
}
else if( !psxbranch ) {
@@ -1466,14 +1464,14 @@ StartRecomp:
_psxFlushCall(FLUSH_EVERYTHING);
ptr = JMP32(0);
- //JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr + 5 ));
+ //JMP32((uptr)psxDispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
}
}
- assert( x86Ptr >= (u8*)s_pCurBlock->GetFnptr() + IOP_MIN_BLOCK_BYTES );
- assert( x86Ptr < recMem+RECMEM_SIZE );
+ assert( x86Ptr[0] >= (u8*)s_pCurBlock->GetFnptr() + IOP_MIN_BLOCK_BYTES );
+ assert( x86Ptr[0] < recMem+RECMEM_SIZE );
- recPtr = x86Ptr;
+ recPtr = x86Ptr[0];
assert( (g_psxHasConstReg&g_psxFlushedConstReg) == g_psxHasConstReg );
diff --git a/pcsx2/x86/iR3000Atables.cpp b/pcsx2/x86/iR3000Atables.cpp
index d971bffe6a..fb859660bc 100644
--- a/pcsx2/x86/iR3000Atables.cpp
+++ b/pcsx2/x86/iR3000Atables.cpp
@@ -1259,7 +1259,7 @@ void rpsxJALR()
static void* s_pbranchjmp;
static u32 s_do32 = 0;
-#define JUMPVALID(pjmp) (( x86Ptr - (u8*)pjmp ) <= 0x80)
+#define JUMPVALID(pjmp) (( x86Ptr[0] - (u8*)pjmp ) <= 0x80)
void rpsxSetBranchEQ(int info, int process)
{
@@ -1306,7 +1306,7 @@ void rpsxBEQ_process(int info, int process)
else
{
_psxFlushAllUnused();
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
s_do32 = 0;
psxSaveBranchState();
@@ -1319,7 +1319,7 @@ void rpsxBEQ_process(int info, int process)
x86SetJ8A( (u8*)s_pbranchjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
s_do32 = 1;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
@@ -1370,7 +1370,7 @@ void rpsxBNE_process(int info, int process)
}
_psxFlushAllUnused();
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
s_do32 = 0;
rpsxSetBranchEQ(info, process);
@@ -1382,7 +1382,7 @@ void rpsxBNE_process(int info, int process)
x86SetJ8A( (u8*)s_pbranchjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
s_do32 = 1;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
@@ -1424,7 +1424,7 @@ void rpsxBLTZ()
}
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JL8(0);
psxSaveBranchState();
@@ -1436,7 +1436,7 @@ void rpsxBLTZ()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
@@ -1471,7 +1471,7 @@ void rpsxBGEZ()
}
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JGE8(0);
psxSaveBranchState();
@@ -1483,7 +1483,7 @@ void rpsxBGEZ()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
@@ -1525,7 +1525,7 @@ void rpsxBLTZAL()
}
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JL8(0);
psxSaveBranchState();
@@ -1539,7 +1539,7 @@ void rpsxBLTZAL()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
@@ -1578,7 +1578,7 @@ void rpsxBGEZAL()
}
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JGE8(0);
MOV32ItoM((uptr)&psxRegs.GPR.r[31], psxpc+4);
@@ -1592,7 +1592,7 @@ void rpsxBGEZAL()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
@@ -1632,7 +1632,7 @@ void rpsxBLEZ()
_clearNeededX86regs();
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JLE8(0);
psxSaveBranchState();
@@ -1643,7 +1643,7 @@ void rpsxBLEZ()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
@@ -1680,7 +1680,7 @@ void rpsxBGTZ()
_clearNeededX86regs();
CMP32ItoM((uptr)&psxRegs.GPR.r[_Rs_], 0);
- u8* prevx86 = x86Ptr;
+ u8* prevx86 = x86Ptr[0];
u8* pjmp = JG8(0);
psxSaveBranchState();
@@ -1691,7 +1691,7 @@ void rpsxBGTZ()
x86SetJ8A( pjmp );
}
else {
- x86Ptr = prevx86;
+ x86Ptr[0] = prevx86;
psxpc -= 4;
psxRegs.code = iopMemRead32( psxpc - 4 );
psxLoadBranchState();
diff --git a/pcsx2/x86/iR5900CoissuedLoadStore.cpp b/pcsx2/x86/iR5900CoissuedLoadStore.cpp
index 84caeb20c2..13ffe2e86a 100644
--- a/pcsx2/x86/iR5900CoissuedLoadStore.cpp
+++ b/pcsx2/x86/iR5900CoissuedLoadStore.cpp
@@ -1569,7 +1569,7 @@ void recLQC2_co( void )
dohw = recSetMemLocation(_Rs_, _Imm_, mmregs, 2, 0);
- rawreadptr = x86Ptr;
+ rawreadptr = x86Ptr[0];
if( mmreg1 >= 0 ) SSEX_MOVDQARmtoROffset(mmreg1, ECX, PS2MEM_BASE_+s_nAddMemOffset);
if( mmreg2 >= 0 ) SSEX_MOVDQARmtoROffset(mmreg2, ECX, PS2MEM_BASE_+s_nAddMemOffset+_Imm_co_-_Imm_);
@@ -1579,7 +1579,7 @@ void recLQC2_co( void )
// check if writing to VUs
CMP32ItoR(ECX, 0x11000000);
- JAE8(rawreadptr - (x86Ptr+2));
+ JAE8(rawreadptr - (x86Ptr[0]+2));
MOV32RtoM((u32)&s_tempaddr, ECX);
@@ -1634,7 +1634,7 @@ void recSQC2_co( void )
dohw = recSetMemLocation(_Rs_, _Imm_, mmregs, 2, 0);
- rawreadptr = x86Ptr;
+ rawreadptr = x86Ptr[0];
if( mmreg1 >= 0 ) {
SSEX_MOVDQARtoRmOffset(ECX, mmreg1, PS2MEM_BASE_+s_nAddMemOffset);
@@ -1705,7 +1705,7 @@ void recSQC2_co( void )
// check if writing to VUs
CMP32ItoR(ECX, 0x11000000);
- JAE8(rawreadptr - (x86Ptr+2));
+ JAE8(rawreadptr - (x86Ptr[0]+2));
// some type of hardware write
if( mmreg1 >= 0) {
diff --git a/pcsx2/x86/iVUzerorec.cpp b/pcsx2/x86/iVUzerorec.cpp
index 179dca1db8..87fc5d260f 100644
--- a/pcsx2/x86/iVUzerorec.cpp
+++ b/pcsx2/x86/iVUzerorec.cpp
@@ -846,7 +846,7 @@ static VuFunctionHeader* SuperVURecompileProgram(u32 startpc, int vuindex)
SuperVURecompile();
- s_recVUPtr = x86Ptr;
+ s_recVUPtr = x86Ptr[0];
// set the function's range
VuFunctionHeader::RANGE r;
@@ -1883,7 +1883,7 @@ void VuBaseBlock::AssignVFRegs()
if( i == XMMREGS ) return; // nothing changed
}
- u8* oldX86 = x86Ptr;
+ u8* oldX86 = x86Ptr[0];
FORIT(itinst, insts) {
@@ -2072,7 +2072,7 @@ void VuBaseBlock::AssignVFRegs()
}
}
- assert( x86Ptr == oldX86 );
+ assert( x86Ptr[0] == oldX86 );
u32 analyzechildren = !(type&BLOCKTYPE_ANALYZED);
type |= BLOCKTYPE_ANALYZED;
@@ -2460,7 +2460,7 @@ static void SuperVURecompile()
AND32ItoM( (uptr)&VU->vifRegs->stat, ~0x4 );
MOV32ItoM((uptr)&VU->VI[REG_TPC], pchild->endpc);
- JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr + 5 ));
+ JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr[0] + 5 ));
}
// only other case is when there are two branches
else assert( (*itblock)->insts.back().regs[0].pipe == VUPIPE_BRANCH );
@@ -2600,11 +2600,11 @@ void SuperVUTestVU0Condition(u32 incstack)
ADD32ItoR(ESP, incstack);
//CALLFunc((u32)timeout);
- JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr + 5 ));
+ JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr[0] + 5 ));
x86SetJ8(ptr);
}
- else JAE32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr + 6 ) );
+ else JAE32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr[0] + 6 ) );
}
void VuBaseBlock::Recompile()
@@ -2612,7 +2612,7 @@ void VuBaseBlock::Recompile()
if( type & BLOCKTYPE_ANALYZED ) return;
x86Align(16);
- pcode = x86Ptr;
+ pcode = x86Ptr[0];
#ifdef _DEBUG
MOV32ItoM((uptr)&s_vufnheader, s_pFnHeader->startpc);
@@ -2720,7 +2720,7 @@ void VuBaseBlock::Recompile()
AND32ItoM( (uptr)&VU0.VI[ REG_VPU_STAT ].UL, s_vu?~0x100:~0x001 ); // E flag
AND32ItoM( (uptr)&VU->vifRegs->stat, ~0x4 );
if( !branch ) MOV32ItoM((uptr)&VU->VI[REG_TPC], endpc);
- JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr + 5 ));
+ JMP32( (uptr)SuperVUEndProgram - ( (uptr)x86Ptr[0] + 5 ));
}
else {
@@ -2862,7 +2862,7 @@ void VuBaseBlock::Recompile()
}
}
- pendcode = x86Ptr;
+ pendcode = x86Ptr[0];
type |= BLOCKTYPE_ANALYZED;
LISTBLOCKS::iterator itchild;
@@ -3543,7 +3543,7 @@ void recVUMI_BranchHandle()
if( (s_pCurBlock->type & BLOCKTYPE_HASEOP) || s_vu == 0 || SUPERVU_CHECKCONDITION)
MOV32ItoM(SuperVUGetVIAddr(REG_TPC, 0), bpc);
MOV32ItoR(s_JumpX86, 0);
- s_pCurBlock->pChildJumps[curjump] = (u32*)x86Ptr-1;
+ s_pCurBlock->pChildJumps[curjump] = (u32*)x86Ptr[0]-1;
if( !(s_pCurInst->type & INST_BRANCH_DELAY) ) {
j8Ptr[1] = JMP8(0);
@@ -3552,7 +3552,7 @@ void recVUMI_BranchHandle()
if( (s_pCurBlock->type & BLOCKTYPE_HASEOP) || s_vu == 0 || SUPERVU_CHECKCONDITION )
MOV32ItoM(SuperVUGetVIAddr(REG_TPC, 0), pc+8);
MOV32ItoR(s_JumpX86, 0);
- s_pCurBlock->pChildJumps[curjump+1] = (u32*)x86Ptr-1;
+ s_pCurBlock->pChildJumps[curjump+1] = (u32*)x86Ptr[0]-1;
x86SetJ8( j8Ptr[ 1 ] );
}
@@ -3789,7 +3789,7 @@ void recVUMI_B( VURegs* vuu, s32 info )
if( s_pCurBlock->blocks.size() > 1 ) {
s_JumpX86 = _allocX86reg(-1, X86TYPE_VUJUMP, 0, MODE_WRITE);
MOV32ItoR(s_JumpX86, 0);
- s_pCurBlock->pChildJumps[(s_pCurInst->type & INST_BRANCH_DELAY)?1:0] = (u32*)x86Ptr-1;
+ s_pCurBlock->pChildJumps[(s_pCurInst->type & INST_BRANCH_DELAY)?1:0] = (u32*)x86Ptr[0]-1;
s_UnconditionalDelay = 1;
}
@@ -3815,7 +3815,7 @@ void recVUMI_BAL( VURegs* vuu, s32 info )
if( s_pCurBlock->blocks.size() > 1 ) {
s_JumpX86 = _allocX86reg(-1, X86TYPE_VUJUMP, 0, MODE_WRITE);
MOV32ItoR(s_JumpX86, 0);
- s_pCurBlock->pChildJumps[(s_pCurInst->type & INST_BRANCH_DELAY)?1:0] = (u32*)x86Ptr-1;
+ s_pCurBlock->pChildJumps[(s_pCurInst->type & INST_BRANCH_DELAY)?1:0] = (u32*)x86Ptr[0]-1;
s_UnconditionalDelay = 1;
}
diff --git a/pcsx2/x86/ix86-32/iR5900-32.cpp b/pcsx2/x86/ix86-32/iR5900-32.cpp
index 94d0a64eca..e8d81f1e73 100644
--- a/pcsx2/x86/ix86-32/iR5900-32.cpp
+++ b/pcsx2/x86/ix86-32/iR5900-32.cpp
@@ -141,7 +141,7 @@ static void iDumpBlock( int startpc, u8 * ptr )
fflush( stdout );
// f = fopen( "dump1", "wb" );
-// fwrite( ptr, 1, (u32)x86Ptr - (u32)ptr, f );
+// fwrite( ptr, 1, (u32)x86Ptr[0] - (u32)ptr, f );
// fclose( f );
//
// sprintf( command, "objdump -D --target=binary --architecture=i386 dump1 > %s", filename );
@@ -585,8 +585,8 @@ void recResetEE( void )
// so a fix will have to wait until later. -_- (air)
//x86SetPtr(recMem+REC_CACHEMEM);
- //dyna_block_discard_recmem=(u8*)x86Ptr;
- //JMP32( (uptr)&dyna_block_discard - ( (u32)x86Ptr + 5 ));
+ //dyna_block_discard_recmem=(u8*)x86Ptr[0];
+ //JMP32( (uptr)&dyna_block_discard - ( (u32)x86Ptr[0] + 5 ));
x86SetPtr(recMem);
@@ -613,8 +613,6 @@ static void recShutdown( void )
safe_free( s_pInstCache );
s_nInstCacheSize = 0;
-
- x86Shutdown();
}
// Ignored by Linux
@@ -675,7 +673,7 @@ static __naked void Dispatcher()
// Modify the prev block's jump address, and jump to the new block:
__asm {
shl eax, 4
- pop ecx // x86Ptr to mod
+ pop ecx // x86Ptr[0] to mod
mov edx, eax
sub edx, ecx
sub edx, 4
@@ -686,7 +684,7 @@ static __naked void Dispatcher()
}
// edx - baseblock->startpc
-// stack - x86Ptr
+// stack - x86Ptr[0]
static __naked void DispatcherClear()
{
// EDX contains the current pc
@@ -869,7 +867,7 @@ void recSYSCALL( void ) {
CMP32ItoM((uptr)&cpuRegs.pc, pc);
j8Ptr[0] = JE8(0);
ADD32ItoM((uptr)&cpuRegs.cycle, eeScaleBlockCycles());
- JMP32((uptr)DispatcherReg - ( (uptr)x86Ptr + 5 ));
+ JMP32((uptr)DispatcherReg - ( (uptr)x86Ptr[0] + 5 ));
x86SetJ8(j8Ptr[0]);
//branch = 2;
}
@@ -933,13 +931,13 @@ void recClearMem(BASEBLOCK* p)
assert( p->GetFnptr() != 0 );
assert( p->startpc );
- x86Ptr = (u8*)p->GetFnptr();
+ x86Ptr[0] = (u8*)p->GetFnptr();
// there is a small problem: mem can be ored with 0xa<<28 or 0x8<<28, and don't know which
MOV32ItoR(EDX, p->startpc);
- PUSH32I((u32)x86Ptr); // will be replaced by JMP32
- JMP32((u32)DispatcherClear - ( (u32)x86Ptr + 5 ));
- assert( x86Ptr == (u8*)p->GetFnptr() + EE_MIN_BLOCK_BYTES );
+ PUSH32I((u32)x86Ptr[0]); // will be replaced by JMP32
+ JMP32((u32)DispatcherClear - ( (u32)x86Ptr[0] + 5 ));
+ assert( x86Ptr[0] == (u8*)p->GetFnptr() + EE_MIN_BLOCK_BYTES );
pstart = PC_GETBLOCK(p->startpc);
pexblock = PC_GETBLOCKEX(pstart);
@@ -1231,7 +1229,7 @@ static void iBranchTest(u32 newpc, bool noDispatch)
// to; creating a static link of blocks that doesn't require the overhead
// of a dispatcher.
MOV32ItoR(EDX, 0);
- ptr = (u32*)(x86Ptr-4);
+ ptr = (u32*)(x86Ptr[0]-4);
}
// Check the Event scheduler if our "cycle target" has been reached.
@@ -1245,12 +1243,12 @@ static void iBranchTest(u32 newpc, bool noDispatch)
if( newpc != 0xffffffff )
{
// This is the jump instruction which gets modified by Dispatcher.
- *ptr = (u32)JS32((u32)Dispatcher - ( (u32)x86Ptr + 6 ));
+ *ptr = (u32)JS32((u32)Dispatcher - ( (u32)x86Ptr[0] + 6 ));
}
else if( !noDispatch )
{
// This instruction is a dynamic link, so it's never modified.
- JS32((uptr)DispatcherReg - ( (uptr)x86Ptr + 6 ));
+ JS32((uptr)DispatcherReg - ( (uptr)x86Ptr[0] + 6 ));
}
RET2();
@@ -1313,22 +1311,22 @@ void recompileNextInstruction(int delayslot)
// if( pexblock->pOldFnptr ) {
// // code already in place, so jump to it and exit recomp
-// JMP32((u32)pexblock->pOldFnptr - ((u32)x86Ptr + 5));
+// JMP32((u32)pexblock->pOldFnptr - ((u32)x86Ptr[0] + 5));
// branch = 3;
// return;
// }
- JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr + 5));
+ JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr[0] + 5));
branch = 3;
return;
}
else {
if( !(delayslot && pblock->startpc == pc) ) {
- u8* oldX86 = x86Ptr;
+ u8* oldX86 = x86Ptr[0];
//__Log("clear block %x\n", pblock->startpc);
recClearMem(pblock);
- x86Ptr = oldX86;
+ x86Ptr[0] = oldX86;
if( delayslot )
Console::Notice("delay slot %x", params pc);
}
@@ -1576,8 +1574,8 @@ void recRecompile( const u32 startpc )
x86SetPtr( recPtr );
x86Align(16);
- recPtr = x86Ptr;
- s_pCurBlock->SetFnptr( (uptr)x86Ptr );
+ recPtr = x86Ptr[0];
+ s_pCurBlock->SetFnptr( (uptr)x86Ptr[0] );
s_pCurBlock->startpc = startpc;
branch = 0;
@@ -1906,7 +1904,7 @@ StartRecomp:
{
//MOV32ItoR(EAX,*pageVer);
//CMP32MtoR(EAX,(uptr)pageVer);
- //JNE32(((u32)dyna_block_discard_recmem)- ( (u32)x86Ptr + 6 ));
+ //JNE32(((u32)dyna_block_discard_recmem)- ( (u32)x86Ptr[0] + 6 ));
mmap_MarkCountedRamPage(PSM(inpage_ptr),inpage_ptr&~0xFFF);
}
@@ -1918,7 +1916,7 @@ StartRecomp:
{
// was dyna_block_discard_recmem. See note in recResetEE for details.
CMP32ItoM((uptr)PSM(lpc),*(u32*)PSM(lpc));
- JNE32(((u32)&dyna_block_discard)- ( (u32)x86Ptr + 6 ));
+ JNE32(((u32)&dyna_block_discard)- ( (u32)x86Ptr[0] + 6 ));
stg-=4;
lpc+=4;
@@ -1997,7 +1995,7 @@ StartRecomp:
assert( pc == s_nEndBlock );
iFlushCall(FLUSH_EVERYTHING);
MOV32ItoM((uptr)&cpuRegs.pc, pc);
- JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr + 5));
+ JMP32((uptr)pblock->GetFnptr() - ((uptr)x86Ptr[0] + 5));
branch = 3;
}
else if( !branch ) {
@@ -2010,12 +2008,12 @@ StartRecomp:
}
}
- assert( x86Ptr >= (u8*)s_pCurBlock->GetFnptr() + EE_MIN_BLOCK_BYTES );
- assert( x86Ptr < recMem+REC_CACHEMEM );
+ assert( x86Ptr[0] >= (u8*)s_pCurBlock->GetFnptr() + EE_MIN_BLOCK_BYTES );
+ assert( x86Ptr[0] < recMem+REC_CACHEMEM );
assert( recStackPtr < recStack+RECSTACK_SIZE );
assert( x86FpuState == 0 );
- recPtr = x86Ptr;
+ recPtr = x86Ptr[0];
assert( (g_cpuHasConstReg&g_cpuFlushedConstReg) == g_cpuHasConstReg );
diff --git a/pcsx2/x86/ix86-32/iR5900LoadStore.cpp b/pcsx2/x86/ix86-32/iR5900LoadStore.cpp
index 9ee0ea9fd4..49a85cd32e 100644
--- a/pcsx2/x86/ix86-32/iR5900LoadStore.cpp
+++ b/pcsx2/x86/ix86-32/iR5900LoadStore.cpp
@@ -1933,7 +1933,7 @@ void recLQC2( void )
dohw = recSetMemLocation(_Rs_, _Imm_, mmregs, 2, 0);
if( _Ft_ ) {
- u8* rawreadptr = x86Ptr;
+ u8* rawreadptr = x86Ptr[0];
if( mmreg >= 0 ) {
SSEX_MOVDQARmtoROffset(mmreg, ECX, PS2MEM_BASE_+s_nAddMemOffset);
@@ -1948,7 +1948,7 @@ void recLQC2( void )
// check if writing to VUs
CMP32ItoR(ECX, 0x11000000);
- JAE8(rawreadptr - (x86Ptr+2));
+ JAE8(rawreadptr - (x86Ptr[0]+2));
PUSH32I( (int)&VU0.VF[_Ft_].UD[0] );
CALLFunc( (int)recMemRead128 );
@@ -2002,7 +2002,7 @@ void recSQC2( void )
mmregs = _eePrepareReg(_Rs_);
dohw = recSetMemLocation(_Rs_, _Imm_, mmregs, 2, 0);
- rawreadptr = x86Ptr;
+ rawreadptr = x86Ptr[0];
if( (mmreg = _checkXMMreg(XMMTYPE_VFREG, _Ft_, MODE_READ)) >= 0) {
SSEX_MOVDQARtoRmOffset(ECX, mmreg, PS2MEM_BASE_+s_nAddMemOffset);
@@ -2042,7 +2042,7 @@ void recSQC2( void )
// check if writing to VUs
CMP32ItoR(ECX, 0x11000000);
- JAE8(rawreadptr - (x86Ptr+2));
+ JAE8(rawreadptr - (x86Ptr[0]+2));
// some type of hardware write
if( (mmreg = _checkXMMreg(XMMTYPE_VFREG, _Ft_, MODE_READ)) >= 0) {
diff --git a/pcsx2/x86/ix86/ix86.cpp b/pcsx2/x86/ix86/ix86.cpp
index 66930d5bab..1b586e2976 100644
--- a/pcsx2/x86/ix86/ix86.cpp
+++ b/pcsx2/x86/ix86/ix86.cpp
@@ -17,3344 +17,25 @@
*/
/*
* ix86 core v0.6.2
- * Authors: linuzappz
- * alexey silinov
- * goldfinger
- * zerofrog(@gmail.com)
+ * Authors: linuzappz
+ * alexey silinov
+ * goldfinger
+ * zerofrog(@gmail.com)
+ * cottonvibes(@gmail.com)
*/
+#pragma once
#include "PrecompiledHeader.h"
#include "System.h"
-
#include "ix86.h"
-#define SWAP(x, y) { *(u32*)&y ^= *(u32*)&x; *(u32*)&x ^= *(u32*)&y; *(u32*)&y ^= *(u32*)&x; }
-
-u8 *x86Ptr;
+u8 *x86Ptr[3]; // 3 rec instances (can be increased if needed)
+ // <0> = Main Instance, <1> = VU0 Instance, <2> = VU1 Instance
u8 *j8Ptr[32];
u32 *j32Ptr[32];
-extern void SysPrintf(const char *fmt, ...);
+PCSX2_ALIGNED16(unsigned int p[4]);
+PCSX2_ALIGNED16(unsigned int p2[4]);
+PCSX2_ALIGNED16(float f[4]);
-__forceinline void WriteRmOffset(x86IntRegType to, s32 offset)
-{
- if( (to&7) == ESP ) {
- if( offset == 0 ) {
- ModRM( 0, 0, 4 );
- SibSB( 0, ESP, 4 );
- }
- else if( offset < 128 && offset >= -128 ) {
- ModRM( 1, 0, 4 );
- SibSB( 0, ESP, 4 );
- write8(offset);
- }
- else {
- ModRM( 2, 0, 4 );
- SibSB( 0, ESP, 4 );
- write32(offset);
- }
- }
- else {
- if( offset == 0 ) {
- ModRM( 0, 0, to );
- }
- else if( offset < 128 && offset >= -128 ) {
- ModRM( 1, 0, to );
- write8(offset);
- }
- else {
- ModRM( 2, 0, to );
- write32(offset);
- }
- }
-}
-
-__forceinline void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset)
-{
- if ((from&7) == ESP) {
- if( offset == 0 ) {
- ModRM( 0, to, 0x4 );
- SibSB( 0, 0x4, 0x4 );
- }
- else if( offset < 128 && offset >= -128 ) {
- ModRM( 1, to, 0x4 );
- SibSB( 0, 0x4, 0x4 );
- write8(offset);
- }
- else {
- ModRM( 2, to, 0x4 );
- SibSB( 0, 0x4, 0x4 );
- write32(offset);
- }
- }
- else {
- if( offset == 0 ) {
- ModRM( 0, to, from );
- }
- else if( offset < 128 && offset >= -128 ) {
- ModRM( 1, to, from );
- write8(offset);
- }
- else {
- ModRM( 2, to, from );
- write32(offset);
- }
- }
-}
-
-// This function is just for rec debugging purposes
-__forceinline void CheckX86Ptr( void )
-{
-}
-
-__forceinline void write64( u64 val )
-{
-#ifdef _DEBUG
- CheckX86Ptr( );
-#endif
-
- *(u64*)x86Ptr = val;
- x86Ptr += 8;
-}
-
-__forceinline void ModRM( s32 mod, s32 reg, s32 rm )
-{
- write8( ( mod << 6 ) | ( (reg & 7) << 3 ) | ( rm & 7 ) );
-}
-
-__forceinline void SibSB( s32 ss, s32 index, s32 base )
-{
- write8( ( ss << 6 ) | ( (index & 7) << 3 ) | ( base & 7 ) );
-}
-
-__forceinline void SET8R( int cc, int to )
-{
- RexB(0, to);
- write8( 0x0F );
- write8( cc );
- write8( 0xC0 | ( to ) );
-}
-
-__forceinline u8* J8Rel( int cc, int to )
-{
- write8( cc );
- write8( to );
- return (u8*)(x86Ptr - 1);
-}
-
-__forceinline u16* J16Rel( int cc, u32 to )
-{
- write16( 0x0F66 );
- write8( cc );
- write16( to );
- return (u16*)( x86Ptr - 2 );
-}
-
-__forceinline u32* J32Rel( int cc, u32 to )
-{
- write8( 0x0F );
- write8( cc );
- write32( to );
- return (u32*)( x86Ptr - 4 );
-}
-
-__forceinline void CMOV32RtoR( int cc, int to, int from )
-{
- RexRB(0,to, from);
- write8( 0x0F );
- write8( cc );
- ModRM( 3, to, from );
-}
-
-__forceinline void CMOV32MtoR( int cc, int to, uptr from )
-{
- RexR(0, to);
- write8( 0x0F );
- write8( cc );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-////////////////////////////////////////////////////
-__forceinline void x86SetPtr( u8* ptr )
-{
- x86Ptr = ptr;
-}
-
-////////////////////////////////////////////////////
-__forceinline void x86Shutdown( void )
-{
-}
-
-////////////////////////////////////////////////////
-__forceinline void x86SetJ8( u8* j8 )
-{
- u32 jump = ( x86Ptr - j8 ) - 1;
-
- if ( jump > 0x7f ) {
- Console::Error( "j8 greater than 0x7f!!" );
- assert(0);
- }
- *j8 = (u8)jump;
-}
-
-__forceinline void x86SetJ8A( u8* j8 )
-{
- u32 jump = ( x86Ptr - j8 ) - 1;
-
- if ( jump > 0x7f ) {
- Console::Error( "j8 greater than 0x7f!!" );
- assert(0);
- }
-
- if( ((uptr)x86Ptr&0xf) > 4 ) {
-
- uptr newjump = jump + 16-((uptr)x86Ptr&0xf);
-
- if( newjump <= 0x7f ) {
- jump = newjump;
- while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90;
- }
- }
- *j8 = (u8)jump;
-}
-
-__forceinline void x86SetJ16( u16 *j16 )
-{
- // doesn't work
- u32 jump = ( x86Ptr - (u8*)j16 ) - 2;
-
- if ( jump > 0x7fff ) {
- Console::Error( "j16 greater than 0x7fff!!" );
- assert(0);
- }
- *j16 = (u16)jump;
-}
-
-__forceinline void x86SetJ16A( u16 *j16 )
-{
- if( ((uptr)x86Ptr&0xf) > 4 ) {
- while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90;
- }
- x86SetJ16(j16);
-}
-
-////////////////////////////////////////////////////
-__forceinline void x86SetJ32( u32* j32 )
-{
- *j32 = ( x86Ptr - (u8*)j32 ) - 4;
-}
-
-__forceinline void x86SetJ32A( u32* j32 )
-{
- while((uptr)x86Ptr&0xf) *x86Ptr++ = 0x90;
- x86SetJ32(j32);
-}
-
-////////////////////////////////////////////////////
-__forceinline void x86Align( int bytes )
-{
- // fordward align
- x86Ptr = (u8*)( ( (uptr)x86Ptr + bytes - 1) & ~( bytes - 1 ) );
-}
-
-////////////////////////////////////////////////////
-// Generates executable code to align to the given alignment (could be useful for the second leg
-// of if/else conditionals, which usually fall through a jump target label).
-void x86AlignExecutable( int align )
-{
- uptr newx86 = ( (uptr)x86Ptr + align - 1) & ~( align - 1 );
- uptr bytes = ( newx86 - (uptr)x86Ptr );
-
- switch( bytes )
- {
- case 0: break;
-
- case 1: NOP(); break;
- case 2: MOV32RtoR( ESI, ESI ); break;
- case 3: write8(0x08D); write8(0x024); write8(0x024); break;
- case 5: NOP(); // falls through to 4...
- case 4: write8(0x08D); write8(0x064); write8(0x024); write8(0); break;
- case 6: write8(0x08D); write8(0x0B6); write32(0); break;
- case 8: NOP(); // falls through to 7...
- case 7: write8(0x08D); write8(0x034); write8(0x035); write32(0); break;
-
- default:
- {
- // for larger alignments, just use a JMP...
- u8* aligned_target = JMP8(0);
- x86Ptr = (u8*)newx86;
- x86SetJ8( aligned_target );
- }
- }
-
- jASSUME( x86Ptr == (u8*)newx86 );
-}
-
-/********************/
-/* IX86 intructions */
-/********************/
-
-__forceinline void STC( void )
-{
- write8( 0xF9 );
-}
-
-__forceinline void CLC( void )
-{
- write8( 0xF8 );
-}
-
-// NOP 1-byte
-__forceinline void NOP( void )
-{
- write8(0x90);
-}
-
-
-////////////////////////////////////
-// mov instructions /
-////////////////////////////////////
-
-/* mov r64 to r64 */
-__forceinline void MOV64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x89 );
- ModRM( 3, from, to );
-}
-
-/* mov r64 to m64 */
-__forceinline void MOV64RtoM( uptr to, x86IntRegType from )
-{
- RexR(1, from);
- write8( 0x89 );
- ModRM( 0, from, DISP32 );
- write32( (u32)MEMADDR(to, 4) );
-}
-
-/* mov m64 to r64 */
-__forceinline void MOV64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x8B );
- ModRM( 0, to, DISP32 );
- write32( (u32)MEMADDR(from, 4) );
-}
-
-/* mov imm32 to m64 */
-__forceinline void MOV64I32toM(uptr to, u32 from )
-{
- Rex(1, 0, 0, 0);
- write8( 0xC7 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-// mov imm64 to r64
-__forceinline void MOV64ItoR( x86IntRegType to, u64 from)
-{
- RexB(1, to);
- write8( 0xB8 | (to & 0x7) );
- write64( from );
-}
-
-/* mov imm32 to r64 */
-__forceinline void MOV64I32toR( x86IntRegType to, s32 from )
-{
- RexB(1, to);
- write8( 0xC7 );
- ModRM( 0, 0, to );
- write32( from );
-}
-
-// mov imm64 to [r64+off]
-__forceinline void MOV64ItoRmOffset( x86IntRegType to, u32 from, int offset)
-{
- RexB(1,to);
- write8( 0xC7 );
- WriteRmOffset(to, offset);
- write32(from);
-}
-
-// mov [r64+offset] to r64
-__forceinline void MOV64RmOffsettoR( x86IntRegType to, x86IntRegType from, int offset )
-{
- RexRB(1, to, from);
- write8( 0x8B );
- WriteRmOffsetFrom(to, from, offset);
-}
-
-/* mov [r64][r64*scale] to r64 */
-__forceinline void MOV64RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
- RexRXB(1, to, from2, from);
- write8( 0x8B );
- ModRM( 0, to, 0x4 );
- SibSB(scale, from2, from );
-}
-
-/* mov r64 to [r64+offset] */
-__forceinline void MOV64RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset )
-{
- RexRB(1,from,to);
- write8( 0x89 );
- WriteRmOffsetFrom(from, to, offset);
-}
-
-/* mov r64 to [r64][r64*scale] */
-__forceinline void MOV64RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
- RexRXB(1, to, from2, from);
- write8( 0x89 );
- ModRM( 0, to, 0x4 );
- SibSB(scale, from2, from );
-}
-
-
-/* mov r32 to r32 */
-__forceinline void MOV32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0, from, to);
- write8( 0x89 );
- ModRM( 3, from, to );
-}
-
-/* mov r32 to m32 */
-void MOV32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0, from);
- write8( 0x89 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* mov m32 to r32 */
-__forceinline void MOV32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0, to);
- write8( 0x8B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* mov [r32] to r32 */
-__forceinline void MOV32RmtoR( x86IntRegType to, x86IntRegType from ) {
- RexRB(0, to, from);
- write8(0x8B);
- WriteRmOffsetFrom(to, from, 0);
-}
-
-__forceinline void MOV32RmtoROffset( x86IntRegType to, x86IntRegType from, int offset ) {
- RexRB(0, to, from);
- write8( 0x8B );
- WriteRmOffsetFrom(to, from, offset);
-}
-
-/* mov [r32+r32*scale] to r32 */
-__forceinline void MOV32RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
- RexRXB(0,to,from2,from);
- write8( 0x8B );
- ModRM( 0, to, 0x4 );
- SibSB(scale, from2, from );
-}
-
-// mov r32 to [r32<> 3);
- if ( to == EAX) {
- write8( 0x05 );
- } else {
- write8( 0x81 );
- ModRM( 3, 0, to );
- }
- write32( from );
-}
-
-/* add m64 to r64 */
-__forceinline void ADD64MtoR( x86IntRegType to, uptr from )
-{
- Rex(1, to >> 3, 0, 0);
- write8( 0x03 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* add r64 to r64 */
-__forceinline void ADD64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x01 );
- ModRM( 3, from, to );
-}
-
-/* add imm32 to EAX */
-void ADD32ItoEAX( u32 from )
-{
- write8( 0x05 );
- write32( from );
-}
-
-/* add imm32 to r32 */
-__forceinline void ADD32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0, to);
- if(from < 0x80)
- {
- write8( 0x83 );
- ModRM( 3, 0, to );
- write8( from );
- }
- else
- {
- if ( to == EAX ) {
- ADD32ItoEAX(from);
- }
- else {
- write8( 0x81 );
- ModRM( 3, 0, to );
- write32( from );
- }
- }
-}
-
-/* add imm32 to m32 */
-__forceinline void ADD32ItoM( uptr to, u32 from )
-{
- /*if(from < 0x80) // crashes games in 64bit build; TODO: figure out why.
- {
- write8( 0x83 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 8) );
- write8( from );
- }
- else*/
- {
- write8( 0x81 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
- }
-}
-
-// add imm32 to [r32+off]
-__forceinline void ADD32ItoRmOffset( x86IntRegType to, u32 from, s32 offset)
-{
- RexB(0,to);
- if(from < 0x80)
- {
- write8( 0x83 );
- WriteRmOffset(to,offset);
- write8(from);
- }
- else
- {
- write8( 0x81 );
- WriteRmOffset(to,offset);
- write32(from);
- }
-}
-
-/* add r32 to r32 */
-__forceinline void ADD32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0, from, to);
- write8( 0x01 );
- ModRM( 3, from, to );
-}
-
-/* add r32 to m32 */
-__forceinline void ADD32RtoM(uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x01 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* add m32 to r32 */
-__forceinline void ADD32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x03 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// add r16 to r16
-__forceinline void ADD16RtoR( x86IntRegType to , x86IntRegType from )
-{
- write8(0x66);
- RexRB(0,to,from);
- write8( 0x03 );
- ModRM( 3, to, from );
-}
-
-/* add imm16 to r16 */
-__forceinline void ADD16ItoR( x86IntRegType to, u16 from )
-{
- write8( 0x66 );
- RexB(0,to);
-
- if ( to == EAX)
- {
- write8( 0x05 );
- write16( from );
- }
- else if(from < 0x80)
- {
- write8( 0x83 );
- ModRM( 3, 0, to );
- write8((u8)from );
- }
- else
- {
- write8( 0x81 );
- ModRM( 3, 0, to );
- write16( from );
- }
-}
-
-/* add imm16 to m16 */
-__forceinline void ADD16ItoM( uptr to, u16 from )
-{
- write8( 0x66 );
- if(from < 0x80)
- {
- write8( 0x83 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 6) );
- write8((u8)from );
- }
- else
- {
- write8( 0x81 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 6) );
- write16( from );
- }
-}
-
-/* add r16 to m16 */
-__forceinline void ADD16RtoM(uptr to, x86IntRegType from )
-{
- write8( 0x66 );
- RexR(0,from);
- write8( 0x01 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* add m16 to r16 */
-__forceinline void ADD16MtoR( x86IntRegType to, uptr from )
-{
- write8( 0x66 );
- RexR(0,to);
- write8( 0x03 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// add m8 to r8
-__forceinline void ADD8MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x02 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* adc imm32 to r32 */
-__forceinline void ADC32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x15 );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 2, to );
- }
- write32( from );
-}
-
-/* adc imm32 to m32 */
-__forceinline void ADC32ItoM( uptr to, u32 from )
-{
- write8( 0x81 );
- ModRM( 0, 2, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* adc r32 to r32 */
-__forceinline void ADC32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x11 );
- ModRM( 3, from, to );
-}
-
-/* adc m32 to r32 */
-__forceinline void ADC32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x13 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// adc r32 to m32
-__forceinline void ADC32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x11 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* inc r32 */
-__forceinline void INC32R( x86IntRegType to )
-{
- write8( 0x40 + to );
-}
-
-/* inc m32 */
-__forceinline void INC32M( u32 to )
-{
- write8( 0xFF );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* inc r16 */
-__forceinline void INC16R( x86IntRegType to )
-{
- write8( 0x66 );
- write8( 0x40 + to );
-}
-
-/* inc m16 */
-__forceinline void INC16M( u32 to )
-{
- write8( 0x66 );
- write8( 0xFF );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-
-/* sub imm32 to r64 */
-__forceinline void SUB64ItoR( x86IntRegType to, u32 from )
-{
- RexB(1, to);
- if ( to == EAX ) {
- write8( 0x2D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 5, to );
- }
- write32( from );
-}
-
-/* sub r64 to r64 */
-__forceinline void SUB64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x29 );
- ModRM( 3, from, to );
-}
-
-/* sub m64 to r64 */
-__forceinline void SUB64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x2B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* sub imm32 to r32 */
-__forceinline void SUB32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x2D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 5, to );
- }
- write32( from );
-}
-
-/* sub imm32 to m32 */
-__forceinline void SUB32ItoM( uptr to, u32 from )
-{
- write8( 0x81 );
- ModRM( 0, 5, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* sub r32 to r32 */
-__forceinline void SUB32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0, from, to);
- write8( 0x29 );
- ModRM( 3, from, to );
-}
-
-/* sub m32 to r32 */
-__forceinline void SUB32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x2B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// sub r32 to m32
-__forceinline void SUB32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x29 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-// sub r16 to r16
-__forceinline void SUB16RtoR( x86IntRegType to, u16 from )
-{
- write8(0x66);
- RexRB(0,to,from);
- write8( 0x2b );
- ModRM( 3, to, from );
-}
-
-/* sub imm16 to r16 */
-__forceinline void SUB16ItoR( x86IntRegType to, u16 from ) {
- write8( 0x66 );
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x2D );
- } else {
- write8( 0x81 );
- ModRM( 3, 5, to );
- }
- write16( from );
-}
-
-/* sub imm16 to m16 */
-__forceinline void SUB16ItoM( uptr to, u16 from ) {
- write8( 0x66 );
- write8( 0x81 );
- ModRM( 0, 5, DISP32 );
- write32( MEMADDR(to, 6) );
- write16( from );
-}
-
-/* sub m16 to r16 */
-__forceinline void SUB16MtoR( x86IntRegType to, uptr from ) {
- write8( 0x66 );
- RexR(0,to);
- write8( 0x2B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* sbb r64 to r64 */
-__forceinline void SBB64RtoR( x86IntRegType to, x86IntRegType from ) {
- RexRB(1, from,to);
- write8( 0x19 );
- ModRM( 3, from, to );
-}
-
-/* sbb imm32 to r32 */
-__forceinline void SBB32ItoR( x86IntRegType to, u32 from ) {
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x1D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 3, to );
- }
- write32( from );
-}
-
-/* sbb imm32 to m32 */
-__forceinline void SBB32ItoM( uptr to, u32 from ) {
- write8( 0x81 );
- ModRM( 0, 3, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* sbb r32 to r32 */
-__forceinline void SBB32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x19 );
- ModRM( 3, from, to );
-}
-
-/* sbb m32 to r32 */
-__forceinline void SBB32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x1B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* sbb r32 to m32 */
-__forceinline void SBB32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x19 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* dec r32 */
-__forceinline void DEC32R( x86IntRegType to )
-{
- write8( 0x48 + to );
-}
-
-/* dec m32 */
-__forceinline void DEC32M( u32 to )
-{
- write8( 0xFF );
- ModRM( 0, 1, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* dec r16 */
-__forceinline void DEC16R( x86IntRegType to )
-{
- write8( 0x66 );
- write8( 0x48 + to );
-}
-
-/* dec m16 */
-__forceinline void DEC16M( u32 to )
-{
- write8( 0x66 );
- write8( 0xFF );
- ModRM( 0, 1, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* mul eax by r32 to edx:eax */
-__forceinline void MUL32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 4, from );
-}
-
-/* imul eax by r32 to edx:eax */
-__forceinline void IMUL32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 5, from );
-}
-
-/* mul eax by m32 to edx:eax */
-__forceinline void MUL32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 4, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* imul eax by m32 to edx:eax */
-__forceinline void IMUL32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 5, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* imul r32 by r32 to r32 */
-__forceinline void IMUL32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,to,from);
- write16( 0xAF0F );
- ModRM( 3, to, from );
-}
-
-/* div eax by r32 to edx:eax */
-__forceinline void DIV32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 6, from );
-}
-
-/* idiv eax by r32 to edx:eax */
-__forceinline void IDIV32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 7, from );
-}
-
-/* div eax by m32 to edx:eax */
-__forceinline void DIV32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 6, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* idiv eax by m32 to edx:eax */
-__forceinline void IDIV32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 7, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-////////////////////////////////////
-// shifting instructions /
-////////////////////////////////////
-
-/* shl imm8 to r64 */
-__forceinline void SHL64ItoR( x86IntRegType to, u8 from )
-{
- RexB(1, to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 3, 4, to );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 4, to );
- write8( from );
-}
-
-/* shl cl to r64 */
-__forceinline void SHL64CLtoR( x86IntRegType to )
-{
- RexB(1, to);
- write8( 0xD3 );
- ModRM( 3, 4, to );
-}
-
-/* shr imm8 to r64 */
-__forceinline void SHR64ItoR( x86IntRegType to, u8 from )
-{
- RexB(1,to);
- if ( from == 1 ) {
- write8( 0xD1 );
- ModRM( 3, 5, to );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 5, to );
- write8( from );
-}
-
-/* shr cl to r64 */
-__forceinline void SHR64CLtoR( x86IntRegType to )
-{
- RexB(1, to);
- write8( 0xD3 );
- ModRM( 3, 5, to );
-}
-
-/* shl imm8 to r32 */
-__forceinline void SHL32ItoR( x86IntRegType to, u8 from )
-{
- RexB(0, to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- write8( 0xE0 | (to & 0x7) );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 4, to );
- write8( from );
-}
-
-/* shl imm8 to m32 */
-__forceinline void SHL32ItoM( uptr to, u8 from )
-{
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 0, 4, DISP32 );
- write32( MEMADDR(to, 4) );
- }
- else
- {
- write8( 0xC1 );
- ModRM( 0, 4, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
- }
-}
-
-/* shl cl to r32 */
-__forceinline void SHL32CLtoR( x86IntRegType to )
-{
- RexB(0,to);
- write8( 0xD3 );
- ModRM( 3, 4, to );
-}
-
-// shl imm8 to r16
-__forceinline void SHL16ItoR( x86IntRegType to, u8 from )
-{
- write8(0x66);
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- write8( 0xE0 | (to & 0x7) );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 4, to );
- write8( from );
-}
-
-// shl imm8 to r8
-__forceinline void SHL8ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD0 );
- write8( 0xE0 | (to & 0x7) );
- return;
- }
- write8( 0xC0 );
- ModRM( 3, 4, to );
- write8( from );
-}
-
-/* shr imm8 to r32 */
-__forceinline void SHR32ItoR( x86IntRegType to, u8 from ) {
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- write8( 0xE8 | (to & 0x7) );
- }
- else
- {
- write8( 0xC1 );
- ModRM( 3, 5, to );
- write8( from );
- }
-}
-
-/* shr imm8 to m32 */
-__forceinline void SHR32ItoM( uptr to, u8 from )
-{
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 0, 5, DISP32 );
- write32( MEMADDR(to, 4) );
- }
- else
- {
- write8( 0xC1 );
- ModRM( 0, 5, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
- }
-}
-
-/* shr cl to r32 */
-__forceinline void SHR32CLtoR( x86IntRegType to )
-{
- RexB(0,to);
- write8( 0xD3 );
- ModRM( 3, 5, to );
-}
-
-// shr imm8 to r16
-__forceinline void SHR16ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 3, 5, to );
- }
- else
- {
- write8( 0xC1 );
- ModRM( 3, 5, to );
- write8( from );
- }
-}
-
-// shr imm8 to r8
-__forceinline void SHR8ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD0 );
- write8( 0xE8 | (to & 0x7) );
- }
- else
- {
- write8( 0xC0 );
- ModRM( 3, 5, to );
- write8( from );
- }
-}
-
-/* sar imm8 to r64 */
-__forceinline void SAR64ItoR( x86IntRegType to, u8 from )
-{
- RexB(1,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 3, 7, to );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 7, to );
- write8( from );
-}
-
-/* sar cl to r64 */
-__forceinline void SAR64CLtoR( x86IntRegType to )
-{
- RexB(1, to);
- write8( 0xD3 );
- ModRM( 3, 7, to );
-}
-
-/* sar imm8 to r32 */
-__forceinline void SAR32ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 3, 7, to );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 7, to );
- write8( from );
-}
-
-/* sar imm8 to m32 */
-__forceinline void SAR32ItoM( uptr to, u8 from )
-{
- write8( 0xC1 );
- ModRM( 0, 7, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-/* sar cl to r32 */
-__forceinline void SAR32CLtoR( x86IntRegType to )
-{
- RexB(0,to);
- write8( 0xD3 );
- ModRM( 3, 7, to );
-}
-
-// sar imm8 to r16
-__forceinline void SAR16ItoR( x86IntRegType to, u8 from )
-{
- write8(0x66);
- RexB(0,to);
- if ( from == 1 )
- {
- write8( 0xD1 );
- ModRM( 3, 7, to );
- return;
- }
- write8( 0xC1 );
- ModRM( 3, 7, to );
- write8( from );
-}
-
-__forceinline void ROR32ItoR( x86IntRegType to,u8 from )
-{
- RexB(0,to);
- if ( from == 1 ) {
- write8( 0xd1 );
- write8( 0xc8 | to );
- }
- else
- {
- write8( 0xc1 );
- write8( 0xc8 | to );
- write8( from );
- }
-}
-
-__forceinline void RCR32ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 ) {
- write8( 0xd1 );
- ModRM(3, 3, to);
- }
- else
- {
- write8( 0xc1 );
- ModRM(3, 3, to);
- write8( from );
- }
-}
-
-__forceinline void RCR32ItoM( uptr to, u8 from )
-{
- RexB(0,to);
- if ( from == 1 ) {
- write8( 0xd1 );
- ModRM( 0, 3, DISP32 );
- write32( MEMADDR(to, 8) );
- }
- else
- {
- write8( 0xc1 );
- ModRM( 0, 3, DISP32 );
- write32( MEMADDR(to, 8) );
- write8( from );
- }
-}
-
-// shld imm8 to r32
-__forceinline void SHLD32ItoR( x86IntRegType to, x86IntRegType from, u8 shift )
-{
- RexRB(0,from,to);
- write8( 0x0F );
- write8( 0xA4 );
- ModRM( 3, from, to );
- write8( shift );
-}
-
-// shrd imm8 to r32
-__forceinline void SHRD32ItoR( x86IntRegType to, x86IntRegType from, u8 shift )
-{
- RexRB(0,from,to);
- write8( 0x0F );
- write8( 0xAC );
- ModRM( 3, from, to );
- write8( shift );
-}
-
-////////////////////////////////////
-// logical instructions /
-////////////////////////////////////
-
-/* or imm32 to r32 */
-__forceinline void OR64ItoR( x86IntRegType to, u32 from )
-{
- RexB(1, to);
- if ( to == EAX ) {
- write8( 0x0D );
- } else {
- write8( 0x81 );
- ModRM( 3, 1, to );
- }
- write32( from );
-}
-
-/* or m64 to r64 */
-__forceinline void OR64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x0B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* or r64 to r64 */
-__forceinline void OR64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x09 );
- ModRM( 3, from, to );
-}
-
-// or r32 to m64
-__forceinline void OR64RtoM(uptr to, x86IntRegType from )
-{
- RexR(1,from);
- write8( 0x09 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* or imm32 to r32 */
-__forceinline void OR32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x0D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 1, to );
- }
- write32( from );
-}
-
-/* or imm32 to m32 */
-__forceinline void OR32ItoM(uptr to, u32 from )
-{
- write8( 0x81 );
- ModRM( 0, 1, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* or r32 to r32 */
-__forceinline void OR32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x09 );
- ModRM( 3, from, to );
-}
-
-/* or r32 to m32 */
-__forceinline void OR32RtoM(uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x09 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* or m32 to r32 */
-__forceinline void OR32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x0B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// or r16 to r16
-__forceinline void OR16RtoR( x86IntRegType to, x86IntRegType from )
-{
- write8(0x66);
- RexRB(0,from,to);
- write8( 0x09 );
- ModRM( 3, from, to );
-}
-
-// or imm16 to r16
-__forceinline void OR16ItoR( x86IntRegType to, u16 from )
-{
- write8(0x66);
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x0D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 1, to );
- }
- write16( from );
-}
-
-// or imm16 to m316
-__forceinline void OR16ItoM( uptr to, u16 from )
-{
- write8(0x66);
- write8( 0x81 );
- ModRM( 0, 1, DISP32 );
- write32( MEMADDR(to, 6) );
- write16( from );
-}
-
-/* or m16 to r16 */
-__forceinline void OR16MtoR( x86IntRegType to, uptr from )
-{
- write8(0x66);
- RexR(0,to);
- write8( 0x0B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// or r16 to m16
-__forceinline void OR16RtoM( uptr to, x86IntRegType from )
-{
- write8(0x66);
- RexR(0,from);
- write8( 0x09 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-// or r8 to r8
-__forceinline void OR8RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x08 );
- ModRM( 3, from, to );
-}
-
-// or r8 to m8
-__forceinline void OR8RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x08 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-// or imm8 to m8
-__forceinline void OR8ItoM( uptr to, u8 from )
-{
- write8( 0x80 );
- ModRM( 0, 1, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-// or m8 to r8
-__forceinline void OR8MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x0A );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* xor imm32 to r64 */
-__forceinline void XOR64ItoR( x86IntRegType to, u32 from )
-{
- RexB(1,to);
- if ( to == EAX ) {
- write8( 0x35 );
- } else {
- write8( 0x81 );
- ModRM( 3, 6, to );
- }
- write32( from );
-}
-
-/* xor r64 to r64 */
-__forceinline void XOR64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x31 );
- ModRM( 3, from, to );
-}
-
-/* xor m64 to r64 */
-__forceinline void XOR64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x33 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* xor r64 to m64 */
-__forceinline void XOR64RtoM( uptr to, x86IntRegType from )
-{
- RexR(1,from);
- write8( 0x31 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* xor imm32 to r32 */
-__forceinline void XOR32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x35 );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 6, to );
- }
- write32( from );
-}
-
-/* xor imm32 to m32 */
-__forceinline void XOR32ItoM( uptr to, u32 from )
-{
- write8( 0x81 );
- ModRM( 0, 6, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* xor r32 to r32 */
-__forceinline void XOR32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x31 );
- ModRM( 3, from, to );
-}
-
-/* xor r16 to r16 */
-__forceinline void XOR16RtoR( x86IntRegType to, x86IntRegType from )
-{
- write8( 0x66 );
- RexRB(0,from,to);
- write8( 0x31 );
- ModRM( 3, from, to );
-}
-
-/* xor r32 to m32 */
-__forceinline void XOR32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x31 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* xor m32 to r32 */
-__forceinline void XOR32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x33 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// xor imm16 to r16
-__forceinline void XOR16ItoR( x86IntRegType to, u16 from )
-{
- write8(0x66);
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x35 );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 6, to );
- }
- write16( from );
-}
-
-// xor r16 to m16
-__forceinline void XOR16RtoM( uptr to, x86IntRegType from )
-{
- write8(0x66);
- RexR(0,from);
- write8( 0x31 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* and imm32 to r64 */
-__forceinline void AND64I32toR( x86IntRegType to, u32 from )
-{
- RexB(1, to);
- if ( to == EAX ) {
- write8( 0x25 );
- } else {
- write8( 0x81 );
- ModRM( 3, 0x4, to );
- }
- write32( from );
-}
-
-/* and m64 to r64 */
-__forceinline void AND64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x23 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* and r64 to m64 */
-__forceinline void AND64RtoM( uptr to, x86IntRegType from )
-{
- RexR(1, from);
- write8( 0x21 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* and r64 to r64 */
-__forceinline void AND64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1, from, to);
- write8( 0x21 );
- ModRM( 3, from, to );
-}
-
-/* and imm32 to m64 */
-__forceinline void AND64I32toM( uptr to, u32 from )
-{
- Rex(1,0,0,0);
- write8( 0x81 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* and imm32 to r32 */
-__forceinline void AND32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if(from < 0x80)
- {
- AND32I8toR(to, (u8)from);
- }
- else
- {
- if ( to == EAX ) {
- write8( 0x25 );
- } else {
- write8( 0x81 );
- ModRM( 3, 0x4, to );
- }
- write32( from );
- }
-}
-
-/* and sign ext imm8 to r32 */
-__forceinline void AND32I8toR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- write8( 0x83 );
- ModRM( 3, 0x4, to );
- write8( from );
-}
-
-/* and imm32 to m32 */
-__forceinline void AND32ItoM( uptr to, u32 from )
-{
- if(from < 0x80)
- {
- AND32I8toM(to, (u8)from);
- }
- else
- {
- write8( 0x81 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
- }
-}
-
-
-/* and sign ext imm8 to m32 */
-__forceinline void AND32I8toM( uptr to, u8 from )
-{
- write8( 0x83 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-/* and r32 to r32 */
-__forceinline void AND32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x21 );
- ModRM( 3, from, to );
-}
-
-/* and r32 to m32 */
-__forceinline void AND32RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x21 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* and m32 to r32 */
-__forceinline void AND32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x23 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// and r16 to r16
-__forceinline void AND16RtoR( x86IntRegType to, x86IntRegType from )
-{
- write8(0x66);
- RexRB(0,to,from);
- write8( 0x23 );
- ModRM( 3, to, from );
-}
-
-/* and imm16 to r16 */
-__forceinline void AND16ItoR( x86IntRegType to, u16 from )
-{
- write8(0x66);
- RexB(0,to);
-
- if ( to == EAX ) {
- write8( 0x25 );
- write16( from );
- }
- else if ( from < 0x80 ) {
- write8( 0x83 );
- ModRM( 3, 0x4, to );
- write8((u8)from );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 0x4, to );
- write16( from );
- }
-}
-
-/* and imm16 to m16 */
-__forceinline void AND16ItoM( uptr to, u16 from )
-{
- write8(0x66);
- if ( from < 0x80 ) {
- write8( 0x83 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 6) );
- write8((u8)from );
- }
- else
- {
- write8( 0x81 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 6) );
- write16( from );
-
- }
-}
-
-/* and r16 to m16 */
-__forceinline void AND16RtoM( uptr to, x86IntRegType from )
-{
- write8( 0x66 );
- RexR(0,from);
- write8( 0x21 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* and m16 to r16 */
-__forceinline void AND16MtoR( x86IntRegType to, uptr from )
-{
- write8( 0x66 );
- RexR(0,to);
- write8( 0x23 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4));
-}
-
-/* and imm8 to r8 */
-__forceinline void AND8ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x24 );
- } else {
- write8( 0x80 );
- ModRM( 3, 0x4, to );
- }
- write8( from );
-}
-
-/* and imm8 to m8 */
-__forceinline void AND8ItoM( uptr to, u8 from )
-{
- write8( 0x80 );
- ModRM( 0, 0x4, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-// and r8 to r8
-__forceinline void AND8RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,to,from);
- write8( 0x22 );
- ModRM( 3, to, from );
-}
-
-/* and r8 to m8 */
-__forceinline void AND8RtoM( uptr to, x86IntRegType from )
-{
- RexR(0,from);
- write8( 0x20 );
- ModRM( 0, from, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-/* and m8 to r8 */
-__forceinline void AND8MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x22 );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4));
-}
-
-/* not r64 */
-__forceinline void NOT64R( x86IntRegType from )
-{
- RexB(1, from);
- write8( 0xF7 );
- ModRM( 3, 2, from );
-}
-
-/* not r32 */
-__forceinline void NOT32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 2, from );
-}
-
-// not m32
-__forceinline void NOT32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 2, DISP32 );
- write32( MEMADDR(from, 4));
-}
-
-/* neg r64 */
-__forceinline void NEG64R( x86IntRegType from )
-{
- RexB(1, from);
- write8( 0xF7 );
- ModRM( 3, 3, from );
-}
-
-/* neg r32 */
-__forceinline void NEG32R( x86IntRegType from )
-{
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 3, from );
-}
-
-__forceinline void NEG32M( u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 3, DISP32 );
- write32( MEMADDR(from, 4));
-}
-
-/* neg r16 */
-__forceinline void NEG16R( x86IntRegType from )
-{
- write8( 0x66 );
- RexB(0,from);
- write8( 0xF7 );
- ModRM( 3, 3, from );
-}
-
-////////////////////////////////////
-// jump instructions /
-////////////////////////////////////
-
-__forceinline u8* JMP( uptr to ) {
- uptr jump = ( x86Ptr - (u8*)to ) - 1;
-
- if ( jump > 0x7f ) {
- assert( to <= 0xffffffff );
- return (u8*)JMP32( to );
- }
- else {
- return (u8*)JMP8( to );
- }
-}
-
-/* jmp rel8 */
-__forceinline u8* JMP8( u8 to )
-{
- write8( 0xEB );
- write8( to );
- return x86Ptr - 1;
-}
-
-/* jmp rel32 */
-__forceinline u32* JMP32( uptr to )
-{
- assert( (sptr)to <= 0x7fffffff && (sptr)to >= -0x7fffffff );
- write8( 0xE9 );
- write32( to );
- return (u32*)(x86Ptr - 4 );
-}
-
-/* jmp r32/r64 */
-__forceinline void JMPR( x86IntRegType to )
-{
- RexB(0, to);
- write8( 0xFF );
- ModRM( 3, 4, to );
-}
-
-// jmp m32
-__forceinline void JMP32M( uptr to )
-{
- write8( 0xFF );
- ModRM( 0, 4, DISP32 );
- write32( MEMADDR(to, 4));
-}
-
-/* jp rel8 */
-__forceinline u8* JP8( u8 to ) {
- return J8Rel( 0x7A, to );
-}
-
-/* jnp rel8 */
-__forceinline u8* JNP8( u8 to ) {
- return J8Rel( 0x7B, to );
-}
-
-/* je rel8 */
-__forceinline u8* JE8( u8 to ) {
- return J8Rel( 0x74, to );
-}
-
-/* jz rel8 */
-__forceinline u8* JZ8( u8 to )
-{
- return J8Rel( 0x74, to );
-}
-
-/* js rel8 */
-__forceinline u8* JS8( u8 to )
-{
- return J8Rel( 0x78, to );
-}
-
-/* jns rel8 */
-__forceinline u8* JNS8( u8 to )
-{
- return J8Rel( 0x79, to );
-}
-
-/* jg rel8 */
-__forceinline u8* JG8( u8 to )
-{
- return J8Rel( 0x7F, to );
-}
-
-/* jge rel8 */
-__forceinline u8* JGE8( u8 to )
-{
- return J8Rel( 0x7D, to );
-}
-
-/* jl rel8 */
-__forceinline u8* JL8( u8 to )
-{
- return J8Rel( 0x7C, to );
-}
-
-/* ja rel8 */
-__forceinline u8* JA8( u8 to )
-{
- return J8Rel( 0x77, to );
-}
-
-__forceinline u8* JAE8( u8 to )
-{
- return J8Rel( 0x73, to );
-}
-
-/* jb rel8 */
-__forceinline u8* JB8( u8 to )
-{
- return J8Rel( 0x72, to );
-}
-
-/* jbe rel8 */
-__forceinline u8* JBE8( u8 to )
-{
- return J8Rel( 0x76, to );
-}
-
-/* jle rel8 */
-__forceinline u8* JLE8( u8 to )
-{
- return J8Rel( 0x7E, to );
-}
-
-/* jne rel8 */
-__forceinline u8* JNE8( u8 to )
-{
- return J8Rel( 0x75, to );
-}
-
-/* jnz rel8 */
-__forceinline u8* JNZ8( u8 to )
-{
- return J8Rel( 0x75, to );
-}
-
-/* jng rel8 */
-__forceinline u8* JNG8( u8 to )
-{
- return J8Rel( 0x7E, to );
-}
-
-/* jnge rel8 */
-__forceinline u8* JNGE8( u8 to )
-{
- return J8Rel( 0x7C, to );
-}
-
-/* jnl rel8 */
-__forceinline u8* JNL8( u8 to )
-{
- return J8Rel( 0x7D, to );
-}
-
-/* jnle rel8 */
-__forceinline u8* JNLE8( u8 to )
-{
- return J8Rel( 0x7F, to );
-}
-
-/* jo rel8 */
-__forceinline u8* JO8( u8 to )
-{
- return J8Rel( 0x70, to );
-}
-
-/* jno rel8 */
-__forceinline u8* JNO8( u8 to )
-{
- return J8Rel( 0x71, to );
-}
-/* Untested and slower, use 32bit versions instead
-// ja rel16
-__forceinline u16* JA16( u16 to )
-{
- return J16Rel( 0x87, to );
-}
-
-// jb rel16
-__forceinline u16* JB16( u16 to )
-{
- return J16Rel( 0x82, to );
-}
-
-// je rel16
-__forceinline u16* JE16( u16 to )
-{
- return J16Rel( 0x84, to );
-}
-
-// jz rel16
-__forceinline u16* JZ16( u16 to )
-{
- return J16Rel( 0x84, to );
-}
-*/
-// jb rel32
-__forceinline u32* JB32( u32 to )
-{
- return J32Rel( 0x82, to );
-}
-
-/* je rel32 */
-__forceinline u32* JE32( u32 to )
-{
- return J32Rel( 0x84, to );
-}
-
-/* jz rel32 */
-__forceinline u32* JZ32( u32 to )
-{
- return J32Rel( 0x84, to );
-}
-
-/* js rel32 */
-__forceinline u32* JS32( u32 to )
-{
- return J32Rel( 0x88, to );
-}
-
-/* jns rel32 */
-__forceinline u32* JNS32( u32 to )
-{
- return J32Rel( 0x89, to );
-}
-
-/* jg rel32 */
-__forceinline u32* JG32( u32 to )
-{
- return J32Rel( 0x8F, to );
-}
-
-/* jge rel32 */
-__forceinline u32* JGE32( u32 to )
-{
- return J32Rel( 0x8D, to );
-}
-
-/* jl rel32 */
-__forceinline u32* JL32( u32 to )
-{
- return J32Rel( 0x8C, to );
-}
-
-/* jle rel32 */
-__forceinline u32* JLE32( u32 to )
-{
- return J32Rel( 0x8E, to );
-}
-
-/* ja rel32 */
-__forceinline u32* JA32( u32 to )
-{
- return J32Rel( 0x87, to );
-}
-
-/* jae rel32 */
-__forceinline u32* JAE32( u32 to )
-{
- return J32Rel( 0x83, to );
-}
-
-/* jne rel32 */
-__forceinline u32* JNE32( u32 to )
-{
- return J32Rel( 0x85, to );
-}
-
-/* jnz rel32 */
-__forceinline u32* JNZ32( u32 to )
-{
- return J32Rel( 0x85, to );
-}
-
-/* jng rel32 */
-__forceinline u32* JNG32( u32 to )
-{
- return J32Rel( 0x8E, to );
-}
-
-/* jnge rel32 */
-__forceinline u32* JNGE32( u32 to )
-{
- return J32Rel( 0x8C, to );
-}
-
-/* jnl rel32 */
-__forceinline u32* JNL32( u32 to )
-{
- return J32Rel( 0x8D, to );
-}
-
-/* jnle rel32 */
-__forceinline u32* JNLE32( u32 to )
-{
- return J32Rel( 0x8F, to );
-}
-
-/* jo rel32 */
-__forceinline u32* JO32( u32 to )
-{
- return J32Rel( 0x80, to );
-}
-
-/* jno rel32 */
-__forceinline u32* JNO32( u32 to )
-{
- return J32Rel( 0x81, to );
-}
-
-
-
-/* call func */
-__forceinline void CALLFunc( uptr func )
-{
- func -= ( (uptr)x86Ptr + 5 );
- assert( (sptr)func <= 0x7fffffff && (sptr)func >= -0x7fffffff );
- CALL32(func);
-}
-
-/* call rel32 */
-__forceinline void CALL32( u32 to )
-{
- write8( 0xE8 );
- write32( to );
-}
-
-/* call r32 */
-__forceinline void CALL32R( x86IntRegType to )
-{
- write8( 0xFF );
- ModRM( 3, 2, to );
-}
-
-/* call r64 */
-__forceinline void CALL64R( x86IntRegType to )
-{
- RexB(0, to);
- write8( 0xFF );
- ModRM( 3, 2, to );
-}
-
-/* call m32 */
-__forceinline void CALL32M( u32 to )
-{
- write8( 0xFF );
- ModRM( 0, 2, DISP32 );
- write32( MEMADDR(to, 4) );
-}
-
-////////////////////////////////////
-// misc instructions /
-////////////////////////////////////
-
-/* cmp imm32 to r64 */
-__forceinline void CMP64I32toR( x86IntRegType to, u32 from )
-{
- RexB(1, to);
- if ( to == EAX ) {
- write8( 0x3D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 7, to );
- }
- write32( from );
-}
-
-/* cmp m64 to r64 */
-__forceinline void CMP64MtoR( x86IntRegType to, uptr from )
-{
- RexR(1, to);
- write8( 0x3B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// cmp r64 to r64
-__forceinline void CMP64RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(1,from,to);
- write8( 0x39 );
- ModRM( 3, from, to );
-}
-
-/* cmp imm32 to r32 */
-__forceinline void CMP32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX ) {
- write8( 0x3D );
- }
- else {
- write8( 0x81 );
- ModRM( 3, 7, to );
- }
- write32( from );
-}
-
-/* cmp imm32 to m32 */
-__forceinline void CMP32ItoM( uptr to, u32 from )
-{
- write8( 0x81 );
- ModRM( 0, 7, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* cmp r32 to r32 */
-__forceinline void CMP32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x39 );
- ModRM( 3, from, to );
-}
-
-/* cmp m32 to r32 */
-__forceinline void CMP32MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x3B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// cmp imm8 to [r32]
-__forceinline void CMP32I8toRm( x86IntRegType to, u8 from)
-{
- RexB(0,to);
- write8( 0x83 );
- ModRM( 0, 7, to );
- write8(from);
-}
-
-// cmp imm32 to [r32+off]
-__forceinline void CMP32I8toRmOffset8( x86IntRegType to, u8 from, u8 off)
-{
- RexB(0,to);
- write8( 0x83 );
- ModRM( 1, 7, to );
- write8(off);
- write8(from);
-}
-
-// cmp imm8 to [r32]
-__forceinline void CMP32I8toM( uptr to, u8 from)
-{
- write8( 0x83 );
- ModRM( 0, 7, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-/* cmp imm16 to r16 */
-__forceinline void CMP16ItoR( x86IntRegType to, u16 from )
-{
- write8( 0x66 );
- RexB(0,to);
- if ( to == EAX )
- {
- write8( 0x3D );
- }
- else
- {
- write8( 0x81 );
- ModRM( 3, 7, to );
- }
- write16( from );
-}
-
-/* cmp imm16 to m16 */
-__forceinline void CMP16ItoM( uptr to, u16 from )
-{
- write8( 0x66 );
- write8( 0x81 );
- ModRM( 0, 7, DISP32 );
- write32( MEMADDR(to, 6) );
- write16( from );
-}
-
-/* cmp r16 to r16 */
-__forceinline void CMP16RtoR( x86IntRegType to, x86IntRegType from )
-{
- write8( 0x66 );
- RexRB(0,from,to);
- write8( 0x39 );
- ModRM( 3, from, to );
-}
-
-/* cmp m16 to r16 */
-__forceinline void CMP16MtoR( x86IntRegType to, uptr from )
-{
- write8( 0x66 );
- RexR(0,to);
- write8( 0x3B );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-// cmp imm8 to r8
-__forceinline void CMP8ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( to == EAX )
- {
- write8( 0x3C );
- }
- else
- {
- write8( 0x80 );
- ModRM( 3, 7, to );
- }
- write8( from );
-}
-
-// cmp m8 to r8
-__forceinline void CMP8MtoR( x86IntRegType to, uptr from )
-{
- RexR(0,to);
- write8( 0x3A );
- ModRM( 0, to, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* test imm32 to r32 */
-__forceinline void TEST32ItoR( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- if ( to == EAX )
- {
- write8( 0xA9 );
- }
- else
- {
- write8( 0xF7 );
- ModRM( 3, 0, to );
- }
- write32( from );
-}
-
-__forceinline void TEST32ItoM( uptr to, u32 from )
-{
- write8( 0xF7 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 8) );
- write32( from );
-}
-
-/* test r32 to r32 */
-__forceinline void TEST32RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0,from,to);
- write8( 0x85 );
- ModRM( 3, from, to );
-}
-
-// test imm32 to [r32]
-__forceinline void TEST32ItoRm( x86IntRegType to, u32 from )
-{
- RexB(0,to);
- write8( 0xF7 );
- ModRM( 0, 0, to );
- write32(from);
-}
-
-// test imm16 to r16
-__forceinline void TEST16ItoR( x86IntRegType to, u16 from )
-{
- write8(0x66);
- RexB(0,to);
- if ( to == EAX )
- {
- write8( 0xA9 );
- }
- else
- {
- write8( 0xF7 );
- ModRM( 3, 0, to );
- }
- write16( from );
-}
-
-// test r16 to r16
-__forceinline void TEST16RtoR( x86IntRegType to, x86IntRegType from )
-{
- write8(0x66);
- RexRB(0,from,to);
- write8( 0x85 );
- ModRM( 3, from, to );
-}
-
-// test r8 to r8
-__forceinline void TEST8RtoR( x86IntRegType to, x86IntRegType from )
-{
- RexRB(0, from, to);
- write8( 0x84 );
- ModRM( 3, from, to );
-}
-
-
-// test imm8 to r8
-__forceinline void TEST8ItoR( x86IntRegType to, u8 from )
-{
- RexB(0,to);
- if ( to == EAX )
- {
- write8( 0xA8 );
- }
- else
- {
- write8( 0xF6 );
- ModRM( 3, 0, to );
- }
- write8( from );
-}
-
-// test imm8 to r8
-__forceinline void TEST8ItoM( uptr to, u8 from )
-{
- write8( 0xF6 );
- ModRM( 0, 0, DISP32 );
- write32( MEMADDR(to, 5) );
- write8( from );
-}
-
-/* sets r8 */
-__forceinline void SETS8R( x86IntRegType to )
-{
- SET8R( 0x98, to );
-}
-
-/* setl r8 */
-__forceinline void SETL8R( x86IntRegType to )
-{
- SET8R( 0x9C, to );
-}
-
-// setge r8
-__forceinline void SETGE8R( x86IntRegType to ) { SET8R(0x9d, to); }
-// setg r8
-__forceinline void SETG8R( x86IntRegType to ) { SET8R(0x9f, to); }
-// seta r8
-__forceinline void SETA8R( x86IntRegType to ) { SET8R(0x97, to); }
-// setae r8
-__forceinline void SETAE8R( x86IntRegType to ) { SET8R(0x99, to); }
-/* setb r8 */
-__forceinline void SETB8R( x86IntRegType to ) { SET8R( 0x92, to ); }
-/* setb r8 */
-__forceinline void SETNZ8R( x86IntRegType to ) { SET8R( 0x95, to ); }
-// setz r8
-__forceinline void SETZ8R( x86IntRegType to ) { SET8R(0x94, to); }
-// sete r8
-__forceinline void SETE8R( x86IntRegType to ) { SET8R(0x94, to); }
-
-/* push imm32 */
-__forceinline void PUSH32I( u32 from )
-{;
- write8( 0x68 );
- write32( from );
-}
-
-/* push r32 */
-__forceinline void PUSH32R( x86IntRegType from ) { write8( 0x50 | from ); }
-
-/* push m32 */
-__forceinline void PUSH32M( u32 from )
-{
- write8( 0xFF );
- ModRM( 0, 6, DISP32 );
- write32( MEMADDR(from, 4) );
-}
-
-/* pop r32 */
-__forceinline void POP32R( x86IntRegType from ) { write8( 0x58 | from ); }
-
-/* pushad */
-__forceinline void PUSHA32( void ) { write8( 0x60 ); }
-
-/* popad */
-__forceinline void POPA32( void ) { write8( 0x61 ); }
-
-__forceinline void PUSHR(x86IntRegType from) { PUSH32R(from); }
-__forceinline void POPR(x86IntRegType from) { POP32R(from); }
-
-
-/* pushfd */
-__forceinline void PUSHFD( void ) { write8( 0x9C ); }
-/* popfd */
-__forceinline void POPFD( void ) { write8( 0x9D ); }
-
-__forceinline void RET( void ) { write8( 0xC3 ); }
-__forceinline void RET2( void ) { write16( 0xc3f3 ); }
-
-__forceinline void CBW( void ) { write16( 0x9866 ); }
-__forceinline void CWD( void ) { write8( 0x98 ); }
-__forceinline void CDQ( void ) { write8( 0x99 ); }
-__forceinline void CWDE() { write8(0x98); }
-
-__forceinline void LAHF() { write8(0x9f); }
-__forceinline void SAHF() { write8(0x9e); }
-
-__forceinline void BT32ItoR( x86IntRegType to, u8 from )
-{
- write16( 0xBA0F );
- ModRM(3, 4, to);
- write8( from );
-}
-
-__forceinline void BTR32ItoR( x86IntRegType to, u8 from )
-{
- write16( 0xBA0F );
- ModRM(3, 6, to);
- write8( from );
-}
-
-__forceinline void BSRRtoR(x86IntRegType to, x86IntRegType from)
-{
- write16( 0xBD0F );
- ModRM( 3, from, to );
-}
-
-__forceinline void BSWAP32R( x86IntRegType to )
-{
- write8( 0x0F );
- write8( 0xC8 + to );
-}
-
-// to = from + offset
-__forceinline void LEA16RtoR(x86IntRegType to, x86IntRegType from, u16 offset)
-{
- write8(0x66);
- LEA32RtoR(to, from, offset);
-}
-
-__forceinline void LEA32RtoR(x86IntRegType to, x86IntRegType from, u32 offset)
-{
- RexRB(0,to,from);
- write8(0x8d);
-
- if( (from&7) == ESP ) {
- if( offset == 0 ) {
- ModRM(1, to, from);
- write8(0x24);
- }
- else if( offset < 128 ) {
- ModRM(1, to, from);
- write8(0x24);
- write8(offset);
- }
- else {
- ModRM(2, to, from);
- write8(0x24);
- write32(offset);
- }
- }
- else {
- if( offset == 0 && from != EBP && from!=ESP ) {
- ModRM(0, to, from);
- }
- else if( offset < 128 ) {
- ModRM(1, to, from);
- write8(offset);
- }
- else {
- ModRM(2, to, from);
- write32(offset);
- }
- }
-}
-
-// to = from0 + from1
-__forceinline void LEA16RRtoR(x86IntRegType to, x86IntRegType from0, x86IntRegType from1)
-{
- write8(0x66);
- LEA32RRtoR(to, from0, from1);
-}
-
-__forceinline void LEA32RRtoR(x86IntRegType to, x86IntRegType from0, x86IntRegType from1)
-{
- RexRXB(0, to, from0, from1);
- write8(0x8d);
-
- if( (from1&7) == EBP ) {
- ModRM(1, to, 4);
- ModRM(0, from0, from1);
- write8(0);
- }
- else {
- ModRM(0, to, 4);
- ModRM(0, from0, from1);
- }
-}
-
-// to = from << scale (max is 3)
-__forceinline void LEA16RStoR(x86IntRegType to, x86IntRegType from, u32 scale)
-{
- write8(0x66);
- LEA32RStoR(to, from, scale);
-}
-
-// Don't inline recursive functions
-void LEA32RStoR(x86IntRegType to, x86IntRegType from, u32 scale)
-{
- if( to == from ) {
- SHL32ItoR(to, scale);
- return;
- }
-
- if( from != ESP ) {
- RexRXB(0,to,from,0);
- write8(0x8d);
- ModRM(0, to, 4);
- ModRM(scale, from, 5);
- write32(0);
- }
- else {
- assert( to != ESP );
- MOV32RtoR(to, from);
- LEA32RStoR(to, to, scale);
- }
-}
\ No newline at end of file
+XMMSSEType g_xmmtypes[XMMREGS] = { XMMT_INT };
diff --git a/pcsx2/x86/ix86/ix86.h b/pcsx2/x86/ix86/ix86.h
index adb672cfd7..eaa568ba74 100644
--- a/pcsx2/x86/ix86/ix86.h
+++ b/pcsx2/x86/ix86/ix86.h
@@ -21,13 +21,26 @@
* alexey silinov
* goldfinger
* shadow < shadow@pcsx2.net >
+ * cottonvibes(@gmail.com)
*/
-#ifndef __IX86_H__
-#define __IX86_H__
-
+#pragma once
+#include "PrecompiledHeader.h"
#include "PS2Etypes.h" // Basic types header
+//------------------------------------------------------------------
+// Helper Macros
+//------------------------------------------------------------------
+#define emitterT template inline /*__forceinline*/
+
+#define MEMADDR(addr, oplen) (addr)
+
+#define Rex(w,r,x,b) assert(0);
+#define RexR(w, reg) if( w||(reg)>=8 ) assert(0);
+#define RexB(w, base) if( w||(base)>=8 ) assert(0);
+#define RexRB(w, reg, base) if( w||(reg) >= 8 || (base)>=8 ) assert(0);
+#define RexRXB(w, reg, index, base) if( w||(reg) >= 8 || (index) >= 8 || (base) >= 8 ) assert(0);
+
#define XMMREGS 8
#define X86REGS 8
@@ -158,1598 +171,81 @@ struct CPUINFO{
};
extern CPUINFO cpuinfo;
+//------------------------------------------------------------------
-extern u8 *x86Ptr;
+//------------------------------------------------------------------
+// write functions
+//------------------------------------------------------------------
+extern u8 *x86Ptr[3];
extern u8 *j8Ptr[32];
extern u32 *j32Ptr[32];
-#define MEMADDR(addr, oplen) (addr)
+emitterT void write8(u8 val ) {
+ *x86Ptr[I] = (u8)val;
+ x86Ptr[I]++;
+}
-#define Rex(w,r,x,b) assert(0);
-#define RexR(w, reg) if( w||(reg)>=8 ) assert(0);
-#define RexB(w, base) if( w||(base)>=8 ) assert(0);
-#define RexRB(w, reg, base) if( w||(reg) >= 8 || (base)>=8 ) assert(0);
-#define RexRXB(w, reg, index, base) if( w||(reg) >= 8 || (index) >= 8 || (base) >= 8 ) assert(0);
+emitterT void write16(u16 val ) {
+ *(u16*)x86Ptr[I] = (u16)val;
+ x86Ptr[I] += 2;
+}
-extern __forceinline void write8( u8 val );
-extern __forceinline void write16( u16 val );
-extern __forceinline void write32( u32 val );
-extern void write64( u64 val );
+emitterT void write24(u32 val ) {
+ *(u8*)x86Ptr[I] = (u8)(val & 0xff);
+ x86Ptr[I]++;
+ *(u8*)x86Ptr[I] = (u8)((val >> 8) & 0xff);
+ x86Ptr[I]++;
+ *(u8*)x86Ptr[I] = (u8)((val >> 16) & 0xff);
+ x86Ptr[I]++;
+}
+emitterT void write32(u32 val ) {
+ *(u32*)x86Ptr[I] = val;
+ x86Ptr[I] += 4;
+}
-extern void x86SetPtr( u8 *ptr );
-extern void x86Shutdown( void );
-
-extern void x86SetJ8( u8 *j8 );
-extern void x86SetJ8A( u8 *j8 );
-extern void x86SetJ16( u16 *j16 );
-extern void x86SetJ16A( u16 *j16 );
-extern void x86SetJ32( u32 *j32 );
-extern void x86SetJ32A( u32 *j32 );
-
-extern void x86Align( int bytes );
-extern void x86AlignExecutable( int align );
-
-u64 GetCPUTick( void );
-
-// General Helper functions
-extern void ModRM( int mod, int reg, int rm );
-extern void SibSB( int ss, int index, int base );
-extern void SET8R( int cc, int to );
-extern u8* J8Rel( int cc, int to );
-extern u32* J32Rel( int cc, u32 to );
-extern void CMOV32RtoR( int cc, int to, int from );
-extern void CMOV32MtoR( int cc, int to, uptr from );
-
-//******************
-// IX86 intructions
-//******************
-
-//
-// * scale values:
-// * 0 - *1
-// * 1 - *2
-// * 2 - *4
-// * 3 - *8
-//
-
-extern void STC( void );
-extern void CLC( void );
-extern void NOP( void );
-
-////////////////////////////////////
-// mov instructions //
-////////////////////////////////////
-
-// mov r64 to r64
-extern void MOV64RtoR( x86IntRegType to, x86IntRegType from );
-// mov r64 to m64
-extern void MOV64RtoM( uptr to, x86IntRegType from );
-// mov m64 to r64
-extern void MOV64MtoR( x86IntRegType to, uptr from );
-// mov sign ext imm32 to m64
-extern void MOV64I32toM( uptr to, u32 from );
-// mov sign ext imm32 to r64
-extern void MOV64I32toR( x86IntRegType to, s32 from);
-// mov imm64 to r64
-extern void MOV64ItoR( x86IntRegType to, u64 from);
-// mov imm64 to [r64+off]
-extern void MOV64ItoRmOffset( x86IntRegType to, u32 from, int offset);
-// mov [r64+offset] to r64
-extern void MOV64RmOffsettoR( x86IntRegType to, x86IntRegType from, int offset );
-// mov [r64][r64*scale] to r64
-extern void MOV64RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale);
-// mov r64 to [r64+offset]
-extern void MOV64RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset );
-// mov r64 to [r64][r64*scale]
-extern void MOV64RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale);
-
-// mov r32 to r32
-extern void MOV32RtoR( x86IntRegType to, x86IntRegType from );
-// mov r32 to m32
-extern void MOV32RtoM( uptr to, x86IntRegType from );
-// mov m32 to r32
-extern void MOV32MtoR( x86IntRegType to, uptr from );
-// mov [r32] to r32
-extern void MOV32RmtoR( x86IntRegType to, x86IntRegType from );
-extern void MOV32RmtoROffset( x86IntRegType to, x86IntRegType from, int offset );
-// mov [r32][r32< subtract ST(0) from ST(1), store in ST(1) and POP stack
-extern void FSUBP( void );
-// fmul ST(src) to fpu reg stack ST(0)
-extern void FMUL32Rto0( x86IntRegType src );
-// fmul ST(0) to fpu reg stack ST(src)
-extern void FMUL320toR( x86IntRegType src );
-// fdiv ST(src) to fpu reg stack ST(0)
-extern void FDIV32Rto0( x86IntRegType src );
-// fdiv ST(0) to fpu reg stack ST(src)
-extern void FDIV320toR( x86IntRegType src );
-// fdiv ST(0) to fpu reg stack ST(src), pop stack, store in ST(src)
-extern void FDIV320toRP( x86IntRegType src );
-
-// fadd m32 to fpu reg stack
-extern void FADD32( u32 from );
-// fsub m32 to fpu reg stack
-extern void FSUB32( u32 from );
-// fmul m32 to fpu reg stack
-extern void FMUL32( u32 from );
-// fdiv m32 to fpu reg stack
-extern void FDIV32( u32 from );
-// fcomi st, st( i)
-extern void FCOMI( x86IntRegType src );
-// fcomip st, st( i)
-extern void FCOMIP( x86IntRegType src );
-// fucomi st, st( i)
-extern void FUCOMI( x86IntRegType src );
-// fucomip st, st( i)
-extern void FUCOMIP( x86IntRegType src );
-// fcom m32 to fpu reg stack
-extern void FCOM32( u32 from );
-// fabs fpu reg stack
-extern void FABS( void );
-// fsqrt fpu reg stack
-extern void FSQRT( void );
-// ftan fpu reg stack
-extern void FPATAN( void );
-// fsin fpu reg stack
-extern void FSIN( void );
-// fchs fpu reg stack
-extern void FCHS( void );
-
-// fcmovb fpu reg to fpu reg stack
-extern void FCMOVB32( x86IntRegType from );
-// fcmove fpu reg to fpu reg stack
-extern void FCMOVE32( x86IntRegType from );
-// fcmovbe fpu reg to fpu reg stack
-extern void FCMOVBE32( x86IntRegType from );
-// fcmovu fpu reg to fpu reg stack
-extern void FCMOVU32( x86IntRegType from );
-// fcmovnb fpu reg to fpu reg stack
-extern void FCMOVNB32( x86IntRegType from );
-// fcmovne fpu reg to fpu reg stack
-extern void FCMOVNE32( x86IntRegType from );
-// fcmovnbe fpu reg to fpu reg stack
-extern void FCMOVNBE32( x86IntRegType from );
-// fcmovnu fpu reg to fpu reg stack
-extern void FCMOVNU32( x86IntRegType from );
-extern void FCOMP32( u32 from );
-extern void FNSTSWtoAX( void );
-
#define MMXONLY(code) code
-
-//******************
-// MMX instructions
-//******************
-
-// r64 = mm
-
-// movq m64 to r64
-extern void MOVQMtoR( x86MMXRegType to, uptr from );
-// movq r64 to m64
-extern void MOVQRtoM( uptr to, x86MMXRegType from );
-
-// pand r64 to r64
-extern void PANDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PANDNRtoR( x86MMXRegType to, x86MMXRegType from );
-// pand m64 to r64 ;
-extern void PANDMtoR( x86MMXRegType to, uptr from );
-// pandn r64 to r64
-extern void PANDNRtoR( x86MMXRegType to, x86MMXRegType from );
-// pandn r64 to r64
-extern void PANDNMtoR( x86MMXRegType to, uptr from );
-// por r64 to r64
-extern void PORRtoR( x86MMXRegType to, x86MMXRegType from );
-// por m64 to r64
-extern void PORMtoR( x86MMXRegType to, uptr from );
-// pxor r64 to r64
-extern void PXORRtoR( x86MMXRegType to, x86MMXRegType from );
-// pxor m64 to r64
-extern void PXORMtoR( x86MMXRegType to, uptr from );
-
-// psllq r64 to r64
-extern void PSLLQRtoR( x86MMXRegType to, x86MMXRegType from );
-// psllq m64 to r64
-extern void PSLLQMtoR( x86MMXRegType to, uptr from );
-// psllq imm8 to r64
-extern void PSLLQItoR( x86MMXRegType to, u8 from );
-// psrlq r64 to r64
-extern void PSRLQRtoR( x86MMXRegType to, x86MMXRegType from );
-// psrlq m64 to r64
-extern void PSRLQMtoR( x86MMXRegType to, uptr from );
-// psrlq imm8 to r64
-extern void PSRLQItoR( x86MMXRegType to, u8 from );
-
-// paddusb r64 to r64
-extern void PADDUSBRtoR( x86MMXRegType to, x86MMXRegType from );
-// paddusb m64 to r64
-extern void PADDUSBMtoR( x86MMXRegType to, uptr from );
-// paddusw r64 to r64
-extern void PADDUSWRtoR( x86MMXRegType to, x86MMXRegType from );
-// paddusw m64 to r64
-extern void PADDUSWMtoR( x86MMXRegType to, uptr from );
-
-// paddb r64 to r64
-extern void PADDBRtoR( x86MMXRegType to, x86MMXRegType from );
-// paddb m64 to r64
-extern void PADDBMtoR( x86MMXRegType to, uptr from );
-// paddw r64 to r64
-extern void PADDWRtoR( x86MMXRegType to, x86MMXRegType from );
-// paddw m64 to r64
-extern void PADDWMtoR( x86MMXRegType to, uptr from );
-// paddd r64 to r64
-extern void PADDDRtoR( x86MMXRegType to, x86MMXRegType from );
-// paddd m64 to r64
-extern void PADDDMtoR( x86MMXRegType to, uptr from );
-extern void PADDSBRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PADDSWRtoR( x86MMXRegType to, x86MMXRegType from );
-
-// paddq m64 to r64 (sse2 only?)
-extern void PADDQMtoR( x86MMXRegType to, uptr from );
-// paddq r64 to r64 (sse2 only?)
-extern void PADDQRtoR( x86MMXRegType to, x86MMXRegType from );
-
-extern void PSUBSBRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSUBSWRtoR( x86MMXRegType to, x86MMXRegType from );
-
-extern void PSUBBRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSUBWRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSUBDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSUBDMtoR( x86MMXRegType to, uptr from );
-
-// psubq m64 to r64 (sse2 only?)
-extern void PSUBQMtoR( x86MMXRegType to, uptr from );
-// psubq r64 to r64 (sse2 only?)
-extern void PSUBQRtoR( x86MMXRegType to, x86MMXRegType from );
-
-// pmuludq m64 to r64 (sse2 only?)
-extern void PMULUDQMtoR( x86MMXRegType to, uptr from );
-// pmuludq r64 to r64 (sse2 only?)
-extern void PMULUDQRtoR( x86MMXRegType to, x86MMXRegType from );
-
-extern void PCMPEQBRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPEQWRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPEQDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPEQDMtoR( x86MMXRegType to, uptr from );
-extern void PCMPGTBRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPGTWRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPGTDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PCMPGTDMtoR( x86MMXRegType to, uptr from );
-extern void PSRLWItoR( x86MMXRegType to, u8 from );
-extern void PSRLDItoR( x86MMXRegType to, u8 from );
-extern void PSRLDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSLLWItoR( x86MMXRegType to, u8 from );
-extern void PSLLDItoR( x86MMXRegType to, u8 from );
-extern void PSLLDRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PSRAWItoR( x86MMXRegType to, u8 from );
-extern void PSRADItoR( x86MMXRegType to, u8 from );
-extern void PSRADRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PUNPCKLDQRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PUNPCKLDQMtoR( x86MMXRegType to, uptr from );
-extern void PUNPCKHDQRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void PUNPCKHDQMtoR( x86MMXRegType to, uptr from );
-extern void MOVQ64ItoR( x86MMXRegType reg, u64 i ); //Prototype.Todo add all consts to end of block.not after jr $+8
-extern void MOVQRtoR( x86MMXRegType to, x86MMXRegType from );
-extern void MOVQRmtoROffset( x86MMXRegType to, x86IntRegType from, u32 offset );
-extern void MOVQRtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset );
-extern void MOVDMtoMMX( x86MMXRegType to, uptr from );
-extern void MOVDMMXtoM( uptr to, x86MMXRegType from );
-extern void MOVD32RtoMMX( x86MMXRegType to, x86IntRegType from );
-extern void MOVD32RmtoMMX( x86MMXRegType to, x86IntRegType from );
-extern void MOVD32RmOffsettoMMX( x86MMXRegType to, x86IntRegType from, u32 offset );
-extern void MOVD32MMXtoR( x86IntRegType to, x86MMXRegType from );
-extern void MOVD32MMXtoRm( x86IntRegType to, x86MMXRegType from );
-extern void MOVD32MMXtoRmOffset( x86IntRegType to, x86MMXRegType from, u32 offset );
-extern void PINSRWRtoMMX( x86MMXRegType to, x86SSERegType from, u8 imm8 );
-extern void PSHUFWRtoR(x86MMXRegType to, x86MMXRegType from, u8 imm8);
-extern void PSHUFWMtoR(x86MMXRegType to, uptr from, u8 imm8);
-extern void MASKMOVQRtoR(x86MMXRegType to, x86MMXRegType from);
-
-// emms
-extern void EMMS( void );
-
-//**********************************************************************************/
-//PACKSSWB,PACKSSDW: Pack Saturate Signed Word 64bits
-//**********************************************************************************
-extern void PACKSSWBMMXtoMMX(x86MMXRegType to, x86MMXRegType from);
-extern void PACKSSDWMMXtoMMX(x86MMXRegType to, x86MMXRegType from);
-
-extern void PMOVMSKBMMXtoR(x86IntRegType to, x86MMXRegType from);
-
-extern void SSE2_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from);
-extern void SSE2_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from);
-
-//*********************
-// SSE instructions *
-//*********************
-extern void SSE_MOVAPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MOVAPS_XMM_to_M128( uptr to, x86SSERegType from );
-extern void SSE_MOVAPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE_MOVUPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MOVUPS_XMM_to_M128( uptr to, x86SSERegType from );
-
-extern void SSE_MOVSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MOVSS_XMM_to_M32( u32 to, x86SSERegType from );
-extern void SSE_MOVSS_XMM_to_Rm( x86IntRegType to, x86SSERegType from );
-extern void SSE_MOVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MOVSS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVSS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSE2_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE2_MOVQ_M64_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_MOVQ_XMM_to_M64( u32 to, x86SSERegType from );
-
-extern void SSE_MASKMOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE_MOVLPS_M64_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MOVLPS_XMM_to_M64( u32 to, x86SSERegType from );
-extern void SSE_MOVLPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVLPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSE_MOVHPS_M64_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MOVHPS_XMM_to_M64( u32 to, x86SSERegType from );
-extern void SSE_MOVHPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVHPS_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSE_MOVLHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MOVLPSRmtoR( x86SSERegType to, x86IntRegType from );
-extern void SSE_MOVLPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVLPSRtoRm( x86SSERegType to, x86IntRegType from );
-extern void SSE_MOVLPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset );
-
-extern void SSE_MOVAPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale );
-extern void SSE_MOVAPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale );
-extern void SSE_MOVAPSRtoRmOffset( x86IntRegType to, x86SSERegType from, int offset );
-extern void SSE_MOVAPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVUPSRmStoR( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale );
-extern void SSE_MOVUPSRtoRmS( x86SSERegType to, x86IntRegType from, x86IntRegType from2, int scale );
-extern void SSE_MOVUPSRtoRm( x86IntRegType to, x86IntRegType from );
-extern void SSE_MOVUPSRmtoR( x86IntRegType to, x86IntRegType from );
-
-extern void SSE_MOVUPSRmtoROffset( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE_MOVUPSRtoRmOffset( x86SSERegType to, x86IntRegType from, int offset );
-
-extern void SSE2_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset );
-extern void SSE2_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset );
-
-extern void SSE_RCPPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_RCPPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_RCPSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_RCPSS_M32_to_XMM( x86SSERegType to, uptr from );
-
-extern void SSE_ORPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_ORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_XORPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_XORPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_ANDPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_ANDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_ANDNPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_ANDNPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_ADDPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_ADDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_ADDSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_ADDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_SUBPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_SUBPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_SUBSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_SUBSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MULPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MULPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MULSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MULSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPEQSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPEQSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPLTSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPLESS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPUNORDSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPUNORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNESS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNLTSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNLTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNLESS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNLESS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPORDSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPORDSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE_UCOMISS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_UCOMISS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE_PMAXSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from );
-extern void SSE_PMINSW_MM_to_MM( x86MMXRegType to, x86MMXRegType from );
-extern void SSE_CVTPI2PS_MM_to_XMM( x86SSERegType to, x86MMXRegType from );
-extern void SSE_CVTPS2PI_M64_to_MM( x86MMXRegType to, uptr from );
-extern void SSE_CVTPS2PI_XMM_to_MM( x86MMXRegType to, x86SSERegType from );
-
-extern void SSE_CVTPI2PS_M64_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CVTTSS2SI_M32_to_R32(x86IntRegType to, uptr from);
-extern void SSE_CVTTSS2SI_XMM_to_R32(x86IntRegType to, x86SSERegType from);
-extern void SSE_CVTSI2SS_M32_to_XMM(x86SSERegType to, uptr from);
-extern void SSE_CVTSI2SS_R_to_XMM(x86SSERegType to, x86IntRegType from);
-
-extern void SSE2_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_CVTDQ2PS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_CVTPS2DQ_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_CVTTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSE2_MAXPD_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_MAXPD_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MAXPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MAXPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MAXSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MAXSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_MINPD_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_MINPD_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MINPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MINPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_MINSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_MINSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_RSQRTPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_RSQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_RSQRTSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_RSQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_SQRTPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_SQRTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_SQRTSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_SQRTSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_UNPCKLPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_UNPCKLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_UNPCKHPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_UNPCKHPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_SHUFPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE_SHUFPS_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 );
-extern void SSE_SHUFPS_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset, u8 imm8 );
-extern void SSE_CMPEQPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPEQPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPLTPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPLEPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPUNORDPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPUNORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNEPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNLTPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNLTPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPNLEPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPNLEPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_CMPORDPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_CMPORDPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_DIVPS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_DIVPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE_DIVSS_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE_DIVSS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-// VectorPath
-extern void SSE2_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE2_PSHUFD_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 );
-
-extern void SSE2_PSHUFLW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE2_PSHUFLW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 );
-extern void SSE2_PSHUFHW_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE2_PSHUFHW_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 );
-
-extern void SSE2_SHUFPD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE2_SHUFPD_M128_to_XMM( x86SSERegType to, uptr from, u8 imm8 );
-
-extern void SSE_STMXCSR( uptr from );
-extern void SSE_LDMXCSR( uptr from );
-
-
-//*********************
-// SSE 2 Instructions*
-//*********************
-extern void SSE2_MOVDQA_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from);
-extern void SSE2_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from);
-
-extern void SSE2_MOVDQU_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from);
-extern void SSE2_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from);
-
-extern void SSE2_PSRLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSRLW_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSRLW_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSRLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSRLD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSRLD_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSRLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSRLQ_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSRLQ_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSRLDQ_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSRAW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSRAW_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSRAW_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSRAD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSRAD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSRAD_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSLLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSLLW_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSLLW_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSLLD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSLLD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSLLD_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSLLQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PSLLQ_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PSLLQ_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PSLLDQ_I8_to_XMM(x86SSERegType to, u8 imm8);
-extern void SSE2_PMAXSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PMAXSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PMAXUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PMAXUB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PMINSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PMINSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PMINUB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PMINUB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PADDSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDSB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PADDSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PSUBSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBSB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PSUBSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PSUBUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBUSB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PSUBUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBUSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PAND_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PANDN_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PXOR_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PADDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDW_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PADDUSB_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDUSB_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PADDUSW_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDUSW_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_PADDB_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDB_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PADDD_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDD_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PADDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PADDQ_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PMADDWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-
-//**********************************************************************************/
-//PACKSSWB,PACKSSDW: Pack Saturate Signed Word
-//**********************************************************************************
-extern void SSE2_PACKSSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PACKSSWB_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PACKSSDW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PACKSSDW_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PACKUSWB_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PACKUSWB_M128_to_XMM(x86SSERegType to, uptr from);
-
-//**********************************************************************************/
-//PUNPCKHWD: Unpack 16bit high
-//**********************************************************************************
-extern void SSE2_PUNPCKLBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKLBW_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PUNPCKHBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKHBW_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PUNPCKLWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKLWD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PUNPCKHWD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKHWD_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PUNPCKLQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKLQDQ_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PUNPCKHQDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PUNPCKHQDQ_M128_to_XMM(x86SSERegType to, uptr from);
-
-// mult by half words
-extern void SSE2_PMULLW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PMULLW_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE2_PMULHW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PMULHW_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE2_PMULUDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE2_PMULUDQ_M128_to_XMM(x86SSERegType to, uptr from);
-
-
-//**********************************************************************************/
-//PMOVMSKB: Create 16bit mask from signs of 8bit integers
-//**********************************************************************************
-extern void SSE2_PMOVMSKB_XMM_to_R32(x86IntRegType to, x86SSERegType from);
-
-extern void SSE_MOVMSKPS_XMM_to_R32(x86IntRegType to, x86SSERegType from);
-extern void SSE2_MOVMSKPD_XMM_to_R32(x86IntRegType to, x86SSERegType from);
-
-//**********************************************************************************/
-//PEXTRW,PINSRW: Packed Extract/Insert Word *
-//**********************************************************************************
-extern void SSE_PEXTRW_XMM_to_R32(x86IntRegType to, x86SSERegType from, u8 imm8 );
-extern void SSE_PINSRW_R32_to_XMM(x86SSERegType from, x86IntRegType to, u8 imm8 );
-
-
-//**********************************************************************************/
-//PSUBx: Subtract Packed Integers *
-//**********************************************************************************
-extern void SSE2_PSUBB_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBB_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PSUBW_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBW_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PSUBD_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBD_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PSUBQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PSUBQ_M128_to_XMM(x86SSERegType to, uptr from );
-///////////////////////////////////////////////////////////////////////////////////////
-//**********************************************************************************/
-//PCMPxx: Compare Packed Integers *
-//**********************************************************************************
-extern void SSE2_PCMPGTB_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPGTB_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PCMPGTW_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPGTW_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PCMPGTD_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPGTD_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PCMPEQB_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPEQB_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PCMPEQW_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPEQW_M128_to_XMM(x86SSERegType to, uptr from );
-extern void SSE2_PCMPEQD_XMM_to_XMM(x86SSERegType to, x86SSERegType from );
-extern void SSE2_PCMPEQD_M128_to_XMM(x86SSERegType to, uptr from );
-//**********************************************************************************/
-//MOVD: Move Dword(32bit) to /from XMM reg *
-//**********************************************************************************
-extern void SSE2_MOVD_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from );
-extern void SSE2_MOVD_Rm_to_XMM( x86SSERegType to, x86IntRegType from );
-extern void SSE2_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE2_MOVD_XMM_to_M32( u32 to, x86SSERegType from );
-extern void SSE2_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from );
-extern void SSE2_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from );
-extern void SSE2_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSE2_MOVQ_XMM_to_R( x86IntRegType to, x86SSERegType from );
-extern void SSE2_MOVQ_R_to_XMM( x86SSERegType to, x86IntRegType from );
-
-//**********************************************************************************/
-//POR : SSE Bitwise OR *
-//**********************************************************************************
-extern void SSE2_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2_POR_M128_to_XMM( x86SSERegType to, uptr from );
-
-extern void SSE3_HADDPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE3_HADDPS_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSE3_MOVSLDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE3_MOVSLDUP_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE3_MOVSHDUP_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE3_MOVSHDUP_M128_to_XMM(x86SSERegType to, uptr from);
-
-// SSSE3
-
-extern void SSSE3_PABSB_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSSE3_PABSW_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSSE3_PABSD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSSE3_PALIGNR_XMM_to_XMM(x86SSERegType to, x86SSERegType from, u8 imm8);
-
-// SSE4.1
-
-#ifndef _MM_MK_INSERTPS_NDX
#define _MM_MK_INSERTPS_NDX(srcField, dstField, zeroMask) (((srcField)<<6) | ((dstField)<<4) | (zeroMask))
-#endif
+extern void SysPrintf(const char *fmt, ...);
-extern void SSE4_DPPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from, u8 imm8);
-extern void SSE4_DPPS_M128_to_XMM(x86SSERegType to, uptr from, u8 imm8);
-extern void SSE4_INSERTPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from, u8 imm8);
-extern void SSE4_EXTRACTPS_XMM_to_R32(x86IntRegType to, x86SSERegType from, u8 imm8);
-extern void SSE4_BLENDPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from, u8 imm8);
-extern void SSE4_BLENDVPS_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_BLENDVPS_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE4_PMOVSXDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_PINSRD_R32_to_XMM(x86SSERegType to, x86IntRegType from, u8 imm8);
-extern void SSE4_PMAXSD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_PMINSD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_PMAXUD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_PMINUD_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSE4_PMAXSD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE4_PMINSD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE4_PMAXUD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE4_PMINUD_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSE4_PMULDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-
-//*********************
-// SSE-X - uses both SSE,SSE2 code and tries to keep consistensies between the data
-// Uses g_xmmtypes to infer the correct type.
-//*********************
-extern void SSEX_MOVDQA_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_MOVDQA_XMM_to_M128( uptr to, x86SSERegType from );
-extern void SSEX_MOVDQA_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSEX_MOVDQARmtoROffset( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSEX_MOVDQARtoRmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSEX_MOVDQU_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_MOVDQU_XMM_to_M128( uptr to, x86SSERegType from );
-extern void SSEX_MOVDQU_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSEX_MOVD_M32_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_MOVD_XMM_to_M32( u32 to, x86SSERegType from );
-extern void SSEX_MOVD_XMM_to_Rm( x86IntRegType to, x86SSERegType from );
-extern void SSEX_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSEX_MOVD_XMM_to_RmOffset( x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSEX_POR_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_POR_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSEX_PXOR_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_PXOR_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSEX_PAND_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_PAND_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSEX_PANDN_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSEX_PANDN_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-extern void SSEX_PUNPCKLDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSEX_PUNPCKLDQ_M128_to_XMM(x86SSERegType to, uptr from);
-extern void SSEX_PUNPCKHDQ_XMM_to_XMM(x86SSERegType to, x86SSERegType from);
-extern void SSEX_PUNPCKHDQ_M128_to_XMM(x86SSERegType to, uptr from);
-
-extern void SSEX_MOVHLPS_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-
-//*********************
-// 3DNOW instructions *
-//*********************
-extern void FEMMS( void );
-extern void PFCMPEQMtoR( x86IntRegType to, uptr from );
-extern void PFCMPGTMtoR( x86IntRegType to, uptr from );
-extern void PFCMPGEMtoR( x86IntRegType to, uptr from );
-extern void PFADDMtoR( x86IntRegType to, uptr from );
-extern void PFADDRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFSUBMtoR( x86IntRegType to, uptr from );
-extern void PFSUBRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFMULMtoR( x86IntRegType to, uptr from );
-extern void PFMULRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFRCPMtoR( x86IntRegType to, uptr from );
-extern void PFRCPRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFRCPIT1RtoR( x86IntRegType to, x86IntRegType from );
-extern void PFRCPIT2RtoR( x86IntRegType to, x86IntRegType from );
-extern void PFRSQRTRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFRSQIT1RtoR( x86IntRegType to, x86IntRegType from );
-extern void PF2IDMtoR( x86IntRegType to, uptr from );
-extern void PI2FDMtoR( x86IntRegType to, uptr from );
-extern void PI2FDRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFMAXMtoR( x86IntRegType to, uptr from );
-extern void PFMAXRtoR( x86IntRegType to, x86IntRegType from );
-extern void PFMINMtoR( x86IntRegType to, uptr from );
-extern void PFMINRtoR( x86IntRegType to, x86IntRegType from );
-
-extern void SSE2EMU_MOVSD_XMM_to_XMM( x86SSERegType to, x86SSERegType from);
-extern void SSE2EMU_MOVQ_M64_to_XMM( x86SSERegType to, uptr from);
-extern void SSE2EMU_MOVQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from);
-extern void SSE2EMU_MOVD_RmOffset_to_XMM( x86SSERegType to, x86IntRegType from, int offset );
-extern void SSE2EMU_MOVD_XMM_to_RmOffset(x86IntRegType to, x86SSERegType from, int offset );
-
-extern void SSE2EMU_MOVDQ2Q_XMM_to_MM( x86MMXRegType to, x86SSERegType from);
-extern void SSE2EMU_MOVQ2DQ_MM_to_XMM( x86SSERegType to, x86MMXRegType from);
-
-/* SSE2 emulated functions for SSE CPU's by kekko*/
-
-extern void SSE2EMU_PSHUFD_XMM_to_XMM( x86SSERegType to, x86SSERegType from, u8 imm8 );
-extern void SSE2EMU_MOVD_XMM_to_R( x86IntRegType to, x86SSERegType from );
-extern void SSE2EMU_CVTPS2DQ_XMM_to_XMM( x86SSERegType to, x86SSERegType from );
-extern void SSE2EMU_CVTDQ2PS_M128_to_XMM( x86SSERegType to, uptr from );
-extern void SSE2EMU_MOVD_XMM_to_M32( u32 to, x86SSERegType from );
-extern void SSE2EMU_MOVD_R_to_XMM( x86SSERegType to, x86IntRegType from );
-
-////////////////////////////////////////////////////
-#ifdef _DEBUG
-#define WRITECHECK() CheckX86Ptr()
-#else
-#define WRITECHECK()
-#endif
-
-__forceinline void write8(u8 val ) {
- *x86Ptr = (u8)val;
- x86Ptr++;
-}
-
-__forceinline void write16(u16 val )
-{
- *(u16*)x86Ptr = (u16)val;
- x86Ptr += 2;
-}
-
-__forceinline void write24(u32 val )
-{
- *(u8*)x86Ptr = (u8)(val & 0xff);
- x86Ptr++;
- *(u8*)x86Ptr = (u8)((val >> 8) & 0xff);
- x86Ptr++;
- *(u8*)x86Ptr = (u8)((val >> 16) & 0xff);
- x86Ptr++;
-}
-
-__forceinline void write32(u32 val )
-{
- *(u32*)x86Ptr = val;
- x86Ptr += 4;
-}
-
-#endif // __IX86_H__
\ No newline at end of file
+#include "ix86_macros.h"
+#include "ix86.inl"
+#include "ix86_3dnow.inl"
+#include "ix86_fpu.inl"
+#include "ix86_mmx.inl"
+#include "ix86_sse.inl"
diff --git a/pcsx2/x86/ix86/ix86.inl b/pcsx2/x86/ix86/ix86.inl
new file mode 100644
index 0000000000..f09cb3b1bb
--- /dev/null
+++ b/pcsx2/x86/ix86/ix86.inl
@@ -0,0 +1,3336 @@
+/* Pcsx2 - Pc Ps2 Emulator
+* Copyright (C) 2002-2009 Pcsx2 Team
+*
+* This program is free software; you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation; either version 2 of the License, or
+* (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
+*/
+/*
+* ix86 core v0.6.2
+* Authors: linuzappz
+* alexey silinov
+* goldfinger
+* zerofrog(@gmail.com)
+* cottonvibes(@gmail.com)
+*/
+
+#pragma once
+
+//------------------------------------------------------------------
+// ix86 instructions
+//------------------------------------------------------------------
+
+emitterT void WriteRmOffset(x86IntRegType to, s32 offset)
+{
+ if( (to&7) == ESP ) {
+ if( offset == 0 ) {
+ ModRM( 0, 0, 4 );
+ SibSB( 0, ESP, 4 );
+ }
+ else if( offset < 128 && offset >= -128 ) {
+ ModRM( 1, 0, 4 );
+ SibSB( 0, ESP, 4 );
+ write8(offset);
+ }
+ else {
+ ModRM( 2, 0, 4 );
+ SibSB( 0, ESP, 4 );
+ write32(offset);
+ }
+ }
+ else {
+ if( offset == 0 ) {
+ ModRM( 0, 0, to );
+ }
+ else if( offset < 128 && offset >= -128 ) {
+ ModRM( 1, 0, to );
+ write8(offset);
+ }
+ else {
+ ModRM( 2, 0, to );
+ write32(offset);
+ }
+ }
+}
+
+emitterT void WriteRmOffsetFrom(x86IntRegType to, x86IntRegType from, int offset)
+{
+ if ((from&7) == ESP) {
+ if( offset == 0 ) {
+ ModRM( 0, to, 0x4 );
+ SibSB( 0, 0x4, 0x4 );
+ }
+ else if( offset < 128 && offset >= -128 ) {
+ ModRM( 1, to, 0x4 );
+ SibSB( 0, 0x4, 0x4 );
+ write8(offset);
+ }
+ else {
+ ModRM( 2, to, 0x4 );
+ SibSB( 0, 0x4, 0x4 );
+ write32(offset);
+ }
+ }
+ else {
+ if( offset == 0 ) {
+ ModRM( 0, to, from );
+ }
+ else if( offset < 128 && offset >= -128 ) {
+ ModRM( 1, to, from );
+ write8(offset);
+ }
+ else {
+ ModRM( 2, to, from );
+ write32(offset);
+ }
+ }
+}
+
+emitterT void ModRM( s32 mod, s32 reg, s32 rm )
+{
+ write8( ( mod << 6 ) | ( (reg & 7) << 3 ) | ( rm & 7 ) );
+}
+
+emitterT void SibSB( s32 ss, s32 index, s32 base )
+{
+ write8( ( ss << 6 ) | ( (index & 7) << 3 ) | ( base & 7 ) );
+}
+
+emitterT void SET8R( int cc, int to )
+{
+ RexB(0, to);
+ write8( 0x0F );
+ write8( cc );
+ write8( 0xC0 | ( to ) );
+}
+
+emitterT u8* J8Rel( int cc, int to )
+{
+ write8( cc );
+ write8( to );
+ return (u8*)(x86Ptr[I] - 1);
+}
+
+emitterT u16* J16Rel( int cc, u32 to )
+{
+ write16( 0x0F66 );
+ write8( cc );
+ write16( to );
+ return (u16*)( x86Ptr[I] - 2 );
+}
+
+emitterT u32* J32Rel( int cc, u32 to )
+{
+ write8( 0x0F );
+ write8( cc );
+ write32( to );
+ return (u32*)( x86Ptr[I] - 4 );
+}
+
+emitterT void CMOV32RtoR( int cc, int to, int from )
+{
+ RexRB(0, to, from);
+ write8( 0x0F );
+ write8( cc );
+ ModRM( 3, to, from );
+}
+
+emitterT void CMOV32MtoR( int cc, int to, uptr from )
+{
+ RexR(0, to);
+ write8( 0x0F );
+ write8( cc );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+////////////////////////////////////////////////////
+emitterT void ex86SetPtr( u8* ptr )
+{
+ x86Ptr[I] = ptr;
+}
+
+////////////////////////////////////////////////////
+emitterT void ex86SetJ8( u8* j8 )
+{
+ u32 jump = ( x86Ptr[I] - j8 ) - 1;
+
+ if ( jump > 0x7f ) {
+ Console::Error( "j8 greater than 0x7f!!" );
+ assert(0);
+ }
+ *j8 = (u8)jump;
+}
+
+emitterT void ex86SetJ8A( u8* j8 )
+{
+ u32 jump = ( x86Ptr[I] - j8 ) - 1;
+
+ if ( jump > 0x7f ) {
+ Console::Error( "j8 greater than 0x7f!!" );
+ assert(0);
+ }
+
+ if( ((uptr)x86Ptr[I]&0xf) > 4 ) {
+
+ uptr newjump = jump + 16-((uptr)x86Ptr[I]&0xf);
+
+ if( newjump <= 0x7f ) {
+ jump = newjump;
+ while((uptr)x86Ptr[I]&0xf) *x86Ptr[I]++ = 0x90;
+ }
+ }
+ *j8 = (u8)jump;
+}
+
+emitterT void ex86SetJ16( u16 *j16 )
+{
+ // doesn't work
+ u32 jump = ( x86Ptr[I] - (u8*)j16 ) - 2;
+
+ if ( jump > 0x7fff ) {
+ Console::Error( "j16 greater than 0x7fff!!" );
+ assert(0);
+ }
+ *j16 = (u16)jump;
+}
+
+emitterT void ex86SetJ16A( u16 *j16 )
+{
+ if( ((uptr)x86Ptr[I]&0xf) > 4 ) {
+ while((uptr)x86Ptr[I]&0xf) *x86Ptr[I]++ = 0x90;
+ }
+ ex86SetJ16(j16);
+}
+
+////////////////////////////////////////////////////
+emitterT void ex86SetJ32( u32* j32 )
+{
+ *j32 = ( x86Ptr[I] - (u8*)j32 ) - 4;
+}
+
+emitterT void ex86SetJ32A( u32* j32 )
+{
+ while((uptr)x86Ptr[I]&0xf) *x86Ptr[I]++ = 0x90;
+ ex86SetJ32(j32);
+}
+
+////////////////////////////////////////////////////
+emitterT void ex86Align( int bytes )
+{
+ // forward align
+ x86Ptr[I] = (u8*)( ( (uptr)x86Ptr[I] + bytes - 1) & ~( bytes - 1 ) );
+}
+
+////////////////////////////////////////////////////
+// Generates executable code to align to the given alignment (could be useful for the second leg
+// of if/else conditionals, which usually fall through a jump target label).
+emitterT void ex86AlignExecutable( int align )
+{
+ uptr newx86 = ( (uptr)x86Ptr[I] + align - 1) & ~( align - 1 );
+ uptr bytes = ( newx86 - (uptr)x86Ptr[I] );
+
+ switch( bytes )
+ {
+ case 0: break;
+
+ case 1: eeNOP(); break;
+ case 2: eMOV32RtoR( ESI, ESI ); break;
+ case 3: write8(0x08D); write8(0x024); write8(0x024); break;
+ case 5: eNOP(); // falls through to 4...
+ case 4: write8(0x08D); write8(0x064); write8(0x024); write8(0); break;
+ case 6: write8(0x08D); write8(0x0B6); write32(0); break;
+ case 8: eNOP(); // falls through to 7...
+ case 7: write8(0x08D); write8(0x034); write8(0x035); write32(0); break;
+
+ default:
+ {
+ // for larger alignments, just use a JMP...
+ u8* aligned_target = eJMP8(0);
+ x86Ptr[I] = (u8*)newx86;
+ ex86SetJ8( aligned_target );
+ }
+ }
+
+ jASSUME( x86Ptr[0] == (u8*)newx86 );
+}
+
+/********************/
+/* IX86 intructions */
+/********************/
+
+emitterT void eSTC( void )
+{
+ write8( 0xF9 );
+}
+
+emitterT void eCLC( void )
+{
+ write8( 0xF8 );
+}
+
+// NOP 1-byte
+emitterT void eNOP( void )
+{
+ write8(0x90);
+}
+
+
+////////////////////////////////////
+// mov instructions /
+////////////////////////////////////
+
+/* mov r64 to r64 */
+emitterT void eMOV64RtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(1, from, to);
+ write8( 0x89 );
+ ModRM( 3, from, to );
+}
+
+/* mov r64 to m64 */
+emitterT void eMOV64RtoM( uptr to, x86IntRegType from )
+{
+ RexR(1, from);
+ write8( 0x89 );
+ ModRM( 0, from, DISP32 );
+ write32( (u32)MEMADDR(to, 4) );
+}
+
+/* mov m64 to r64 */
+emitterT void eMOV64MtoR( x86IntRegType to, uptr from )
+{
+ RexR(1, to);
+ write8( 0x8B );
+ ModRM( 0, to, DISP32 );
+ write32( (u32)MEMADDR(from, 4) );
+}
+
+/* mov imm32 to m64 */
+emitterT void eMOV64I32toM(uptr to, u32 from )
+{
+ Rex(1, 0, 0, 0);
+ write8( 0xC7 );
+ ModRM( 0, 0, DISP32 );
+ write32( MEMADDR(to, 8) );
+ write32( from );
+}
+
+// mov imm64 to r64
+emitterT void eMOV64ItoR( x86IntRegType to, u64 from)
+{
+ RexB(1, to);
+ write8( 0xB8 | (to & 0x7) );
+ write64( from );
+}
+
+/* mov imm32 to r64 */
+emitterT void eMOV64I32toR( x86IntRegType to, s32 from )
+{
+ RexB(1, to);
+ write8( 0xC7 );
+ ModRM( 0, 0, to );
+ write32( from );
+}
+
+// mov imm64 to [r64+off]
+emitterT void eMOV64ItoRmOffset( x86IntRegType to, u32 from, int offset)
+{
+ RexB(1,to);
+ write8( 0xC7 );
+ WriteRmOffset(to, offset);
+ write32(from);
+}
+
+// mov [r64+offset] to r64
+emitterT void eMOV64RmOffsettoR( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(1, to, from);
+ write8( 0x8B );
+ WriteRmOffsetFrom(to, from, offset);
+}
+
+/* mov [r64][r64*scale] to r64 */
+emitterT void eMOV64RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
+ RexRXB(1, to, from2, from);
+ write8( 0x8B );
+ ModRM( 0, to, 0x4 );
+ SibSB(scale, from2, from );
+}
+
+/* mov r64 to [r64+offset] */
+emitterT void eMOV64RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(1,from,to);
+ write8( 0x89 );
+ WriteRmOffsetFrom(from, to, offset);
+}
+
+/* mov r64 to [r64][r64*scale] */
+emitterT void eMOV64RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
+ RexRXB(1, to, from2, from);
+ write8( 0x89 );
+ ModRM( 0, to, 0x4 );
+ SibSB(scale, from2, from );
+}
+
+
+/* mov r32 to r32 */
+emitterT void eMOV32RtoR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0, from, to);
+ write8( 0x89 );
+ ModRM( 3, from, to );
+}
+
+/* mov r32 to m32 */
+emitterT void eMOV32RtoM( uptr to, x86IntRegType from )
+{
+ RexR(0, from);
+ write8( 0x89 );
+ ModRM( 0, from, DISP32 );
+ write32( MEMADDR(to, 4) );
+}
+
+/* mov m32 to r32 */
+emitterT void eMOV32MtoR( x86IntRegType to, uptr from )
+{
+ RexR(0, to);
+ write8( 0x8B );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* mov [r32] to r32 */
+emitterT void eMOV32RmtoR( x86IntRegType to, x86IntRegType from ) {
+ RexRB(0, to, from);
+ write8(0x8B);
+ WriteRmOffsetFrom(to, from, 0);
+}
+
+emitterT void eMOV32RmtoROffset( x86IntRegType to, x86IntRegType from, int offset ) {
+ RexRB(0, to, from);
+ write8( 0x8B );
+ WriteRmOffsetFrom(to, from, offset);
+}
+
+/* mov [r32+r32*scale] to r32 */
+emitterT void eMOV32RmStoR( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
+ RexRXB(0,to,from2,from);
+ write8( 0x8B );
+ ModRM( 0, to, 0x4 );
+ SibSB(scale, from2, from );
+}
+
+// mov r32 to [r32<( 0x8B );
+ ModRM( 0, to, 0x4 );
+ ModRM( scale, from1, 5);
+ write32(from2);
+}
+
+/* mov r32 to [r32] */
+emitterT void eMOV32RtoRm( x86IntRegType to, x86IntRegType from ) {
+ RexRB(0, from, to);
+ if ((to&7) == ESP) {
+ write8( 0x89 );
+ ModRM( 0, from, 0x4 );
+ SibSB( 0, 0x4, 0x4 );
+ }
+ else {
+ write8( 0x89 );
+ ModRM( 0, from, to );
+ }
+}
+
+/* mov r32 to [r32][r32*scale] */
+emitterT void eMOV32RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
+ RexRXB(0, to, from2, from);
+ write8( 0x89 );
+ ModRM( 0, to, 0x4 );
+ SibSB(scale, from2, from );
+}
+
+/* mov imm32 to r32 */
+emitterT void eMOV32ItoR( x86IntRegType to, u32 from )
+{
+ RexB(0, to);
+ write8( 0xB8 | (to & 0x7) );
+ write32( from );
+}
+
+/* mov imm32 to m32 */
+emitterT void eMOV32ItoM(uptr to, u32 from )
+{
+ write8( 0xC7 );
+ ModRM( 0, 0, DISP32 );
+ write32( MEMADDR(to, 8) );
+ write32( from );
+}
+
+// mov imm32 to [r32+off]
+emitterT void eMOV32ItoRmOffset( x86IntRegType to, u32 from, int offset)
+{
+ RexB(0,to);
+ write8( 0xC7 );
+ WriteRmOffset(to, offset);
+ write32(from);
+}
+
+// mov r32 to [r32+off]
+emitterT void eMOV32RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset)
+{
+ RexRB(0,from,to);
+ write8( 0x89 );
+ WriteRmOffsetFrom(from, to, offset);
+}
+
+/* mov r16 to m16 */
+emitterT void eMOV16RtoM(uptr to, x86IntRegType from )
+{
+ write8( 0x66 );
+ RexR(0,from);
+ write8( 0x89 );
+ ModRM( 0, from, DISP32 );
+ write32( MEMADDR(to, 4) );
+}
+
+/* mov m16 to r16 */
+emitterT void eMOV16MtoR( x86IntRegType to, uptr from )
+{
+ write8( 0x66 );
+ RexR(0,to);
+ write8( 0x8B );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+emitterT void eMOV16RmtoR( x86IntRegType to, x86IntRegType from)
+{
+ write8( 0x66 );
+ RexRB(0,to,from);
+ write8( 0x8B );
+ WriteRmOffsetFrom(to, from, 0);
+}
+
+emitterT void eMOV16RmtoROffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ write8( 0x66 );
+ RexRB(0,to,from);
+ write8( 0x8B );
+ WriteRmOffsetFrom(to, from, offset);
+}
+
+emitterT void eMOV16RmSOffsettoR( x86IntRegType to, x86IntRegType from1, u32 from2, int scale )
+{
+ write8(0x66);
+ RexRXB(0,to,from1,0);
+ write8( 0x8B );
+ ModRM( 0, to, SIB );
+ SibSB( scale, from1, SIBDISP);
+ write32(from2);
+}
+
+emitterT void eMOV16RtoRm(x86IntRegType to, x86IntRegType from)
+{
+ write8( 0x66 );
+ RexRB(0,from,to);
+ write8( 0x89 );
+ ModRM( 0, from, to );
+}
+
+/* mov imm16 to m16 */
+emitterT void eMOV16ItoM( uptr to, u16 from )
+{
+ write8( 0x66 );
+ write8( 0xC7 );
+ ModRM( 0, 0, DISP32 );
+ write32( MEMADDR(to, 6) );
+ write16( from );
+}
+
+/* mov r16 to [r32][r32*scale] */
+emitterT void eMOV16RtoRmS( x86IntRegType to, x86IntRegType from, x86IntRegType from2, int scale) {
+ write8( 0x66 );
+ RexRXB(0,to,from2,from);
+ write8( 0x89 );
+ ModRM( 0, to, 0x4 );
+ SibSB(scale, from2, from );
+}
+
+emitterT void eMOV16ItoR( x86IntRegType to, u16 from )
+{
+ RexB(0, to);
+ write16( 0xB866 | ((to & 0x7)<<8) );
+ write16( from );
+}
+
+// mov imm16 to [r16+off]
+emitterT void eMOV16ItoRmOffset( x86IntRegType to, u16 from, u32 offset)
+{
+ write8(0x66);
+ RexB(0,to);
+ write8( 0xC7 );
+ WriteRmOffset(to, offset);
+ write16(from);
+}
+
+// mov r16 to [r16+off]
+emitterT void eMOV16RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset)
+{
+ write8(0x66);
+ RexRB(0,from,to);
+ write8( 0x89 );
+ WriteRmOffsetFrom(from, to, offset);
+}
+
+/* mov r8 to m8 */
+emitterT void eMOV8RtoM( uptr to, x86IntRegType from )
+{
+ RexR(0,from);
+ write8( 0x88 );
+ ModRM( 0, from, DISP32 );
+ write32( MEMADDR(to, 4) );
+}
+
+/* mov m8 to r8 */
+emitterT void eMOV8MtoR( x86IntRegType to, uptr from )
+{
+ RexR(0,to);
+ write8( 0x8A );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* mov [r32] to r8 */
+emitterT void eMOV8RmtoR(x86IntRegType to, x86IntRegType from)
+{
+ RexRB(0,to,from);
+ write8( 0x8A );
+ WriteRmOffsetFrom(to, from, 0);
+}
+
+emitterT void eMOV8RmtoROffset(x86IntRegType to, x86IntRegType from, int offset)
+{
+ RexRB(0,to,from);
+ write8( 0x8A );
+ WriteRmOffsetFrom(to, from, offset);
+}
+
+emitterT void eMOV8RmSOffsettoR( x86IntRegType to, x86IntRegType from1, u32 from2, int scale )
+{
+ RexRXB(0,to,from1,0);
+ write8( 0x8A );
+ ModRM( 0, to, SIB );
+ SibSB( scale, from1, SIBDISP);
+ write32(from2);
+}
+
+emitterT void eMOV8RtoRm(x86IntRegType to, x86IntRegType from)
+{
+ RexRB(0,from,to);
+ write8( 0x88 );
+ WriteRmOffsetFrom(from, to, 0);
+}
+
+/* mov imm8 to m8 */
+emitterT void eMOV8ItoM( uptr to, u8 from )
+{
+ write8( 0xC6 );
+ ModRM( 0, 0, DISP32 );
+ write32( MEMADDR(to, 5) );
+ write8( from );
+}
+
+// mov imm8 to r8
+emitterT void eMOV8ItoR( x86IntRegType to, u8 from )
+{
+ RexB(0, to);
+ write8( 0xB0 | (to & 0x7) );
+ write8( from );
+}
+
+// mov imm8 to [r8+off]
+emitterT void eMOV8ItoRmOffset( x86IntRegType to, u8 from, int offset)
+{
+ assert( to != ESP );
+ RexB(0,to);
+ write8( 0xC6 );
+ WriteRmOffset(to,offset);
+ write8(from);
+}
+
+// mov r8 to [r8+off]
+emitterT void eMOV8RtoRmOffset( x86IntRegType to, x86IntRegType from, int offset)
+{
+ assert( to != ESP );
+ RexRB(0,from,to);
+ write8( 0x88 );
+ WriteRmOffsetFrom(from,to,offset);
+}
+
+/* movsx r8 to r32 */
+emitterT void eMOVSX32R8toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xBE0F );
+ ModRM( 3, to, from );
+}
+
+emitterT void eMOVSX32Rm8toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xBE0F );
+ ModRM( 0, to, from );
+}
+
+emitterT void eMOVSX32Rm8toROffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(0,to,from);
+ write16( 0xBE0F );
+ WriteRmOffsetFrom(to,from,offset);
+}
+
+/* movsx m8 to r32 */
+emitterT void eMOVSX32M8toR( x86IntRegType to, u32 from )
+{
+ RexR(0,to);
+ write16( 0xBE0F );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* movsx r16 to r32 */
+emitterT void eMOVSX32R16toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xBF0F );
+ ModRM( 3, to, from );
+}
+
+emitterT void eMOVSX32Rm16toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xBF0F );
+ ModRM( 0, to, from );
+}
+
+emitterT void eMOVSX32Rm16toROffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(0,to,from);
+ write16( 0xBF0F );
+ WriteRmOffsetFrom(to,from,offset);
+}
+
+/* movsx m16 to r32 */
+emitterT void eMOVSX32M16toR( x86IntRegType to, u32 from )
+{
+ RexR(0,to);
+ write16( 0xBF0F );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* movzx r8 to r32 */
+emitterT void eMOVZX32R8toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xB60F );
+ ModRM( 3, to, from );
+}
+
+emitterT void eMOVZX32Rm8toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xB60F );
+ ModRM( 0, to, from );
+}
+
+emitterT void eMOVZX32Rm8toROffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(0,to,from);
+ write16( 0xB60F );
+ WriteRmOffsetFrom(to,from,offset);
+}
+
+/* movzx m8 to r32 */
+emitterT void eMOVZX32M8toR( x86IntRegType to, u32 from )
+{
+ RexR(0,to);
+ write16( 0xB60F );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* movzx r16 to r32 */
+emitterT void eMOVZX32R16toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xB70F );
+ ModRM( 3, to, from );
+}
+
+emitterT void eMOVZX32Rm16toR( x86IntRegType to, x86IntRegType from )
+{
+ RexRB(0,to,from);
+ write16( 0xB70F );
+ ModRM( 0, to, from );
+}
+
+emitterT void eMOVZX32Rm16toROffset( x86IntRegType to, x86IntRegType from, int offset )
+{
+ RexRB(0,to,from);
+ write16( 0xB70F );
+ WriteRmOffsetFrom(to,from,offset);
+}
+
+/* movzx m16 to r32 */
+emitterT void eMOVZX32M16toR( x86IntRegType to, u32 from )
+{
+ RexR(0,to);
+ write16( 0xB70F );
+ ModRM( 0, to, DISP32 );
+ write32( MEMADDR(from, 4) );
+}
+
+/* cmovbe r32 to r32 */
+emitterT void eCMOVBE32RtoR( x86IntRegType to, x86IntRegType from )
+{
+ CMOV32RtoR( 0x46, to, from );
+}
+
+/* cmovbe m32 to r32*/
+emitterT void eCMOVBE32MtoR( x86IntRegType to, uptr from )
+{
+ CMOV32MtoR( 0x46, to, from );
+}
+
+/* cmovb r32 to r32 */
+emitterT void eCMOVB32RtoR( x86IntRegType to, x86IntRegType from )
+{
+ CMOV32RtoR( 0x42, to, from );
+}
+
+/* cmovb m32 to r32*/
+emitterT void eCMOVB32MtoR( x86IntRegType to, uptr from )
+{
+ CMOV32MtoR( 0x42, to, from );
+}
+
+/* cmovae r32 to r32 */
+emitterT void eCMOVAE32RtoR( x86IntRegType to, x86IntRegType from )
+{
+ CMOV32RtoR( 0x43, to, from );
+}
+
+/* cmovae m32 to r32*/
+emitterT void eCMOVAE32MtoR( x86IntRegType to, uptr from )
+{
+ CMOV32MtoR( 0x43, to, from );
+}
+
+/* cmova r32 to r32 */
+emitterT void eCMOVA32RtoR( x86IntRegType to, x86IntRegType from )
+{
+ CMOV32RtoR