JitBuilder::CodeCacheManager::CodeCacheManager(TR::RawAllocator rawAllocator) : OMR::CodeCacheManagerConnector(rawAllocator) { TR_ASSERT_FATAL(!_codeCacheManager, "CodeCacheManager already instantiated. " "Cannot create multiple instances"); _codeCacheManager = self(); }
/** \brief * Gets the number of locked registers of a specific register kind. * * \param kind * The register kind to count. * * \return * The number of registers of the respective kind that are in the locked state. */ int16_t getNumberOfLockedRegisters(TR_RegisterKinds kind) { switch (kind) { case TR_GPR: TR_ASSERT(numLockedGPRs >= 0, "Expecting number of locked registers to be >= 0"); return numLockedGPRs; case TR_HPR: TR_ASSERT(numLockedHPRs >= 0, "Expecting number of locked registers to be >= 0"); return numLockedHPRs; case TR_FPR: TR_ASSERT(numLockedFPRs >= 0, "Expecting number of locked registers to be >= 0"); return numLockedFPRs; case TR_VRF: TR_ASSERT(numLockedVRFs >= 0, "Expecting number of locked registers to be >= 0"); return numLockedVRFs; default: TR_ASSERT_FATAL(false, "Unknown register kind"); return -1; } }
uint8_t *TR::X86FPConversionSnippet::emitCallToConversionHelper(uint8_t *buffer) { intptrj_t callInstructionAddress = (intptrj_t)buffer; intptrj_t nextInstructionAddress = callInstructionAddress+5; *buffer++ = 0xe8; // CallImm4 intptrj_t helperAddress = (intptrj_t)getHelperSymRef()->getMethodAddress(); if (cg()->directCallRequiresTrampoline(helperAddress, callInstructionAddress)) { helperAddress = TR::CodeCacheManager::instance()->findHelperTrampoline(getHelperSymRef()->getReferenceNumber(), (void *)buffer); TR_ASSERT_FATAL(TR::Compiler->target.cpu.isTargetWithinRIPRange(helperAddress, nextInstructionAddress), "Local helper trampoline must be reachable directly"); } *(int32_t *)buffer = (int32_t)(helperAddress - nextInstructionAddress); cg()->addProjectSpecializedRelocation(buffer, (uint8_t *)getHelperSymRef(), NULL, TR_HelperAddress, __FILE__, __LINE__, getNode()); buffer += 4; gcMap().registerStackMap(buffer, cg()); return buffer; }
uint8_t *TR::PPCHelperCallSnippet::genHelperCall(uint8_t *buffer) { intptrj_t helperAddress = (intptrj_t)getDestination()->getSymbol()->castToMethodSymbol()->getMethodAddress(); if (cg()->directCallRequiresTrampoline(helperAddress, (intptrj_t)buffer)) { helperAddress = TR::CodeCacheManager::instance()->findHelperTrampoline(getDestination()->getReferenceNumber(), (void *)buffer); TR_ASSERT_FATAL(TR::Compiler->target.cpu.isTargetWithinIFormBranchRange(helperAddress, (intptrj_t)buffer), "Helper address is out of range"); } intptrj_t distance = helperAddress - (intptrj_t)buffer; // b|bl distance *(int32_t *)buffer = 0x48000000 | (distance & 0x03fffffc); if (_restartLabel != NULL) { *(int32_t *)buffer |= 0x00000001; } cg()->addProjectSpecializedRelocation(buffer,(uint8_t *)getDestination(), NULL, TR_HelperAddress, __FILE__, __LINE__, getNode()); buffer += 4; gcMap().registerStackMap(buffer, cg()); if (_restartLabel != NULL) { int32_t returnDistance = _restartLabel->getCodeLocation() - buffer; *(int32_t *)buffer = 0x48000000 | (returnDistance & 0x03fffffc); buffer += 4; } return buffer; }
TR::Register *TR::ARM64SystemLinkage::buildDirectDispatch(TR::Node *callNode) { TR::SymbolReference *callSymRef = callNode->getSymbolReference(); const TR::ARM64LinkageProperties &pp = getProperties(); TR::RealRegister *sp = cg()->machine()->getRealRegister(pp.getStackPointerRegister()); TR::RegisterDependencyConditions *dependencies = new (trHeapMemory()) TR::RegisterDependencyConditions( pp.getNumberOfDependencyGPRegisters(), pp.getNumberOfDependencyGPRegisters(), trMemory()); int32_t totalSize = buildArgs(callNode, dependencies); if (totalSize > 0) { if (constantIsUnsignedImm12(totalSize)) { generateTrg1Src1ImmInstruction(cg(), TR::InstOpCode::subimmx, callNode, sp, sp, totalSize); } else { TR_ASSERT_FATAL(false, "Too many arguments."); } } TR::MethodSymbol *callSymbol = callSymRef->getSymbol()->castToMethodSymbol(); generateImmSymInstruction(cg(), TR::InstOpCode::bl, callNode, (uintptr_t)callSymbol->getMethodAddress(), dependencies, callSymRef ? callSymRef : callNode->getSymbolReference(), NULL); cg()->machine()->setLinkRegisterKilled(true); if (totalSize > 0) { if (constantIsUnsignedImm12(totalSize)) { generateTrg1Src1ImmInstruction(cg(), TR::InstOpCode::addimmx, callNode, sp, sp, totalSize); } else { TR_ASSERT_FATAL(false, "Too many arguments."); } } TR::Register *retReg; switch(callNode->getOpCodeValue()) { case TR::icall: case TR::iucall: retReg = dependencies->searchPostConditionRegister( pp.getIntegerReturnRegister()); break; case TR::lcall: case TR::lucall: case TR::acall: retReg = dependencies->searchPostConditionRegister( pp.getLongReturnRegister()); break; case TR::fcall: case TR::dcall: retReg = dependencies->searchPostConditionRegister( pp.getFloatReturnRegister()); break; case TR::call: retReg = NULL; break; default: retReg = NULL; TR_ASSERT(false, "Unsupported direct call Opcode."); } callNode->setRegister(retReg); return retReg; }
void OMR::Z::Register::setIs64BitReg(bool b) { TR_ASSERT_FATAL(self()->getKind() == TR_GPR, "Setting is64BitReg flag on a non-GPR register [%p]", self()); _flags.set(Is64Bit, b); }