diff --git a/runtime/compiler/z/codegen/J9CodeGenerator.cpp b/runtime/compiler/z/codegen/J9CodeGenerator.cpp index ca878950dbd..45ccb78938c 100644 --- a/runtime/compiler/z/codegen/J9CodeGenerator.cpp +++ b/runtime/compiler/z/codegen/J9CodeGenerator.cpp @@ -4043,6 +4043,14 @@ J9::Z::CodeGenerator::inlineDirectCall( return resultReg != NULL; } break; + case TR::java_lang_Thread_onSpinWait: + static char *disableOSW = feGetEnv("TR_noPauseOnSpinWait"); + if (!disableOSW) + { + resultReg = TR::TreeEvaluator::inlineOnSpinWait(node, cg); + return true; + } + break; default: break; diff --git a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp index 3976af7e72c..12c4d00e47a 100644 --- a/runtime/compiler/z/codegen/J9TreeEvaluator.cpp +++ b/runtime/compiler/z/codegen/J9TreeEvaluator.cpp @@ -14665,3 +14665,18 @@ J9::Z::TreeEvaluator::inlineIntegerStringSize(TR::Node* node, TR::CodeGenerator* return node->setRegister(lengthReg); } + +TR::Register* +J9::Z::TreeEvaluator::inlineOnSpinWait(TR::Node *node, TR::CodeGenerator *cg) + { + TR::Instruction* cursor = new (cg->trHeapMemory()) TR::S390NOPInstruction(TR::InstOpCode::NOP, 2, node, cg); + + TR::Compilation *comp = cg->comp(); + static const bool printIt = feGetEnv("TR_showPauseOnSpinWait") != NULL; + if (printIt && comp->getOption(TR_TraceCG)) + { + traceMsg(comp, "Insert NOP for onSpinWait : node=%p, %s\n", node, comp->signature()); + } + + return NULL; + } \ No newline at end of file diff --git a/runtime/compiler/z/codegen/J9TreeEvaluator.hpp b/runtime/compiler/z/codegen/J9TreeEvaluator.hpp index 7744037efb0..44060b0bba0 100644 --- a/runtime/compiler/z/codegen/J9TreeEvaluator.hpp +++ b/runtime/compiler/z/codegen/J9TreeEvaluator.hpp @@ -141,6 +141,17 @@ class OMR_EXTENSIBLE TreeEvaluator: public J9::TreeEvaluator static TR::Register* inlineUTF16BEEncode (TR::Node *node, TR::CodeGenerator *cg); static TR::Register *inlineCRC32CUpdateBytes(TR::Node *node, TR::CodeGenerator *cg, bool isDirectBuffer); + /** + * \brief + * Accelerate inlining onSpinWait() method. + * + * \param node the method call node. + * \param cg the code generator. + * + * \return NULL + */ + static TR::Register *inlineOnSpinWait(TR::Node *node, TR::CodeGenerator *cg); + static TR::Register *zdloadEvaluator(TR::Node *node, TR::CodeGenerator *cg); static TR::Register *zdloadiEvaluator(TR::Node *node, TR::CodeGenerator *cg); static TR::Register *zdstoreEvaluator(TR::Node *node, TR::CodeGenerator *cg);