uint32_t TR::X86FPConvertToIntSnippet::getLength(int32_t estimatedSnippetStart) { uint32_t length = 11; TR::Machine * machine = cg()->machine(); if (toRealRegister(_convertInstruction->getTargetRegister())->getRegisterNumber() != TR::RealRegister::eax) { // MOV R, eax // XCHG R, eax // length += 3; } if (_convertInstruction->getIA32RegMemInstruction()) { // FST [esp], st0 length += 3; } else { // MOVSS [esp], R length += 5; } return length + estimateRestartJumpLength(estimatedSnippetStart + length); }
uint32_t TR::AMD64FPConversionSnippet::getLength(int32_t estimatedSnippetStart) { // *this swipeable for debugging purposes uint32_t length = 11; TR::Machine *machine = cg()->machine(); if (toRealRegister(_convertInstruction->getTargetRegister())->getRegisterNumber() != TR::RealRegister::eax) { // MOV R, rax // XCHG R, rax // // 3 instruction/modRM bytes + 2 REX prefixes // length += (3 + 2); } TR::X86RegRegInstruction *instr = _convertInstruction->getIA32RegRegInstruction(); TR_ASSERT(instr != NULL, "f2i conversion instruction must be either L4RegMem or CVTTSS2SIRegReg\n"); TR::RealRegister *sourceRegister = toRealRegister(instr->getSourceRegister()); if (sourceRegister->getRegisterNumber() != TR::RealRegister::xmm0) { length += sizeof(pushBinary) + sizeof(popBinary) // push and pop + 4 + (sourceRegister->rexBits(TR::RealRegister::REX_B, false)? 1 : 0) // MOVSD xmm0, source ; } return length + estimateRestartJumpLength(estimatedSnippetStart + length); }
uint32_t TR::X86FPConvertToLongSnippet::getLength(int32_t estimatedSnippetStart) { uint32_t length = 5; analyseLongConversion(); // Mask off the FXCH flag. // uint8_t action = _registerActions[ _action & 0x7f ]; if (_action & kNeedFXCH) { // symmetric FXCHs // length += 4; } if (action & kPreserveEAX) { // PUSH eax 1 // POP eax 1 // length += 2; } if (action & kPreserveEDX) { // PUSH edx 1 // POP edx 1 // length += 2; } if (action & kMOVLow) { length += 2; } if (action & kMOVHigh) { length += 2; } if (action & kXCHG) { length++; } return length + estimateRestartJumpLength(estimatedSnippetStart + length); }