// if not mmx, then xmm int eeProcessHILO(int reg, int mode, int mmx) { // Fixme: MMX problem int usemmx = 0/*mmx && _hasFreeMMXreg()*/; if( (usemmx || _hasFreeXMMreg()) || !(g_pCurInstInfo->regs[reg]&EEINST_LASTUSE) ) { //if( usemmx ) return _allocMMXreg(-1, MMX_GPR+reg, mode); return _allocGPRtoXMMreg(-1, reg, mode); } return -1; }
int _signExtendXMMtoM(u32 to, x86SSERegType from, int candestroy) { int t0reg; g_xmmtypes[from] = XMMT_INT; if( candestroy ) { if( g_xmmtypes[from] == XMMT_FPS ) SSE_MOVSS_XMM_to_M32(to, from); else SSE2_MOVD_XMM_to_M32(to, from); SSE2_PSRAD_I8_to_XMM(from, 31); SSE2_MOVD_XMM_to_M32(to+4, from); return 1; } else { // can't destroy and type is int pxAssert( g_xmmtypes[from] == XMMT_INT ); if( _hasFreeXMMreg() ) { xmmregs[from].needed = 1; t0reg = _allocTempXMMreg(XMMT_INT, -1); SSEX_MOVDQA_XMM_to_XMM(t0reg, from); SSE2_PSRAD_I8_to_XMM(from, 31); SSE2_MOVD_XMM_to_M32(to, t0reg); SSE2_MOVD_XMM_to_M32(to+4, from); // swap xmm regs.. don't ask xmmregs[t0reg] = xmmregs[from]; xmmregs[from].inuse = 0; } else { SSE2_MOVD_XMM_to_M32(to+4, from); SSE2_MOVD_XMM_to_M32(to, from); SAR32ItoM(to+4, 31); } return 0; } pxAssume( false ); }