Ejemplo n.º 1
0
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);
   }
Ejemplo n.º 2
0
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);
   }
Ejemplo n.º 3
0
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);
   }