Exemple #1
0
// TODO: Try to combine the 2 layoutParm functions.
int32_t
TR::AMD64SystemLinkage::layoutParm(
      TR::ParameterSymbol *parmSymbol,
      int32_t &dataCursor,
      uint16_t &intReg,
      uint16_t &floatReg,
      TR::parmLayoutResult &layoutResult)
   {
   //AMD64 SysV ABI:  if the size of an object is larger than four eightbytes, or it contains unaligned fields, it has class MEMORY.
   if (parmSymbol->getSize() > 4*AMD64_STACK_SLOT_SIZE) goto LAYOUT_ON_STACK;

   if (layoutTypeInRegs(parmSymbol->getDataType(), intReg, floatReg, layoutResult))
      {
      layoutResult.abstract |= TR::parmLayoutResult::IN_LINKAGE_REG;

      if (parmSymbol->getSize() > GPR_REG_WIDTH)
         layoutResult.abstract |= TR::parmLayoutResult::IN_LINKAGE_REG_PAIR;

      if (comp()->getOption(TR_TraceCG))
         traceMsg(comp(), "layout param symbol %p in register\n", parmSymbol);

      if (!getProperties().getCallerFrameAllocatesSpaceForLinkageRegisters())
         return 0;
      }

LAYOUT_ON_STACK:
   layoutResult.abstract |= TR::parmLayoutResult::ON_STACK;
   int32_t align = layoutTypeOnStack(parmSymbol->getDataType(), dataCursor, layoutResult);
   if (comp()->getOption(TR_TraceCG))
      traceMsg(comp(), "layout param symbol %p on stack\n", parmSymbol);
   return align;
   }
Exemple #2
0
int32_t
TR::IA32SystemLinkage::layoutParm(TR::ParameterSymbol *parmSymbol, int32_t &dataCursor, uint16_t &intReg, uint16_t &floatReg, TR::parmLayoutResult &layoutResult)
   {
   layoutResult.abstract |= TR::parmLayoutResult::ON_STACK;
   int32_t align = layoutTypeOnStack(parmSymbol->getDataType(), dataCursor, layoutResult);
   if (comp()->getOption(TR_TraceCG))
      traceMsg(comp(), "layout param symbol %p on stack\n", parmSymbol);
   return align;
   }