// ------------------------------------------------------------------------ // Writes a jump at the current x86Ptr, which targets a pre-established target address. // (usually a backwards jump) // // slideForward - used internally by xSmartJump to indicate that the jump target is going // to slide forward in the event of an 8 bit displacement. // __emitinline void xJccKnownTarget(JccComparisonType comparison, const void *target, bool slideForward) { // Calculate the potential j8 displacement first, assuming an instruction length of 2: sptr displacement8 = (sptr)target - (sptr)(xGetPtr() + 2); const int slideVal = slideForward ? ((comparison == Jcc_Unconditional) ? 3 : 4) : 0; displacement8 -= slideVal; if (slideForward) { pxAssertDev(displacement8 >= 0, "Used slideForward on a backward jump; nothing to slide!"); } if (is_s8(displacement8)) xJcc8(comparison, displacement8); else { // Perform a 32 bit jump instead. :( s32 *bah = xJcc32(comparison); sptr distance = (sptr)target - (sptr)xGetPtr(); #ifdef __x86_64__ // This assert won't physically happen on x86 targets pxAssertDev(distance >= -0x80000000LL && distance < 0x80000000LL, "Jump target is too far away, needs an indirect register"); #endif *bah = (s32)distance; } }
// ------------------------------------------------------------------------ // Writes a jump at the current x86Ptr, which targets a pre-established target address. // (usually a backwards jump) // // slideForward - used internally by xSmartJump to indicate that the jump target is going // to slide forward in the event of an 8 bit displacement. // __emitinline void xJccKnownTarget( JccComparisonType comparison, const void* target, bool slideForward ) { // Calculate the potential j8 displacement first, assuming an instruction length of 2: sptr displacement8 = (sptr)target - (sptr)(xGetPtr() + 2); const int slideVal = slideForward ? ((comparison == Jcc_Unconditional) ? 3 : 4) : 0; displacement8 -= slideVal; if( slideForward ) { pxAssertDev( displacement8 >= 0, "Used slideForward on a backward jump; nothing to slide!" ); } if( is_s8( displacement8 ) ) xJcc8( comparison, displacement8 ); else { // Perform a 32 bit jump instead. :( s32* bah = xJcc32( comparison ); *bah = (s32)target - (s32)xGetPtr(); } }