Path: blob/master/runtime/compiler/x/codegen/J9TreeEvaluator.hpp
6004 views
/*******************************************************************************1* Copyright (c) 2000, 2021 IBM Corp. and others2*3* This program and the accompanying materials are made available under4* the terms of the Eclipse Public License 2.0 which accompanies this5* distribution and is available at https://www.eclipse.org/legal/epl-2.0/6* or the Apache License, Version 2.0 which accompanies this distribution and7* is available at https://www.apache.org/licenses/LICENSE-2.0.8*9* This Source Code may also be made available under the following10* Secondary Licenses when the conditions for such availability set11* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU12* General Public License, version 2 with the GNU Classpath13* Exception [1] and GNU General Public License, version 2 with the14* OpenJDK Assembly Exception [2].15*16* [1] https://www.gnu.org/software/classpath/license.html17* [2] http://openjdk.java.net/legal/assembly-exception.html18*19* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception20*******************************************************************************/2122#ifndef J9_X86_TREE_EVALUATOR_INCL23#define J9_X86_TREE_EVALUATOR_INCL2425/*26* The following #define and typedef must appear before any #includes in this file27*/28#ifndef J9_TREE_EVALUATOR_CONNECTOR29#define J9_TREE_EVALUATOR_CONNECTOR30namespace J9 { namespace X86 { class TreeEvaluator; } }31namespace J9 { typedef J9::X86::TreeEvaluator TreeEvaluatorConnector; }32#endif3334#include "codegen/Snippet.hpp"35#include "compiler/codegen/J9TreeEvaluator.hpp" // include parent3637namespace J938{3940namespace X8641{4243class OMR_EXTENSIBLE TreeEvaluator: public J9::TreeEvaluator44{45public:4647static TR::Register *writeBarrierEvaluator(TR::Node *node, TR::CodeGenerator *cg);48static TR::Register *monentEvaluator(TR::Node *node, TR::CodeGenerator *cg);49static TR::Register *monexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);50static TR::Register *asynccheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);51static TR::Register *newEvaluator(TR::Node *node, TR::CodeGenerator *cg);52static TR::Register *multianewArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);53static TR::Register *arraycopyEvaluator(TR::Node *node, TR::CodeGenerator *cg);54static TR::Register *arraylengthEvaluator(TR::Node *node, TR::CodeGenerator *cg);55static TR::Register *exceptionRangeFenceEvaluator(TR::Node *node, TR::CodeGenerator *cg);56static TR::Register *NULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);57static TR::Register *ZEROCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);58static TR::Register *resolveAndNULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);59static TR::Register *evaluateNULLCHKWithPossibleResolve(TR::Node *node, bool needResolution, TR::CodeGenerator *cg);60static TR::Register *DIVCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);61static TR::Register *BNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);62static TR::Register *ArrayCopyBNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);63static TR::Register *BNDCHKwithSpineCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);64static TR::Register *ArrayStoreCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);65static TR::Register *ArrayCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);66static TR::Register *barrierFenceEvaluator(TR::Node *node, TR::CodeGenerator *cg);67static TR::Register *atccheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);68static TR::Register *ScopeCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);69static TR::Register *readbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);70static TR::Register *integerHighestOneBit(TR::Node *node, TR::CodeGenerator *cg);71static TR::Register *integerLowestOneBit(TR::Node *node, TR::CodeGenerator *cg);72static TR::Register *integerNumberOfLeadingZeros(TR::Node *node, TR::CodeGenerator *cg);73static TR::Register *integerNumberOfTrailingZeros(TR::Node *node, TR::CodeGenerator *cg);74static TR::Register *integerBitCount(TR::Node *node, TR::CodeGenerator *cg);75static TR::Register *longHighestOneBit(TR::Node *node, TR::CodeGenerator *cg);76static TR::Register *longLowestOneBit(TR::Node *node, TR::CodeGenerator *cg);77static TR::Register *longNumberOfLeadingZeros(TR::Node *node, TR::CodeGenerator *cg);78static TR::Register *longNumberOfTrailingZeros(TR::Node *node, TR::CodeGenerator *cg);79static TR::Register *longBitCount(TR::Node *node, TR::CodeGenerator *cg);80static TR::Register *tstartEvaluator(TR::Node *node, TR::CodeGenerator *cg);81static TR::Register *tfinishEvaluator(TR::Node *node, TR::CodeGenerator *cg);82static TR::Register *tabortEvaluator(TR::Node *node, TR::CodeGenerator *cg);83static void generateVFTMaskInstruction(TR::Node *node, TR::Register *reg, TR::CodeGenerator *cg);84static bool VMinlineCallEvaluator(TR::Node *node, bool isIndirect, TR::CodeGenerator *cg);85static TR::Register *VMmonentEvaluator(TR::Node *node, TR::CodeGenerator *cg);86static TR::Register *VMmonexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);87static TR::Register *VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg);88static TR::Register *VMarrayCheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);89static TR::Register *checkcastinstanceofEvaluator(TR::Node *node, TR::CodeGenerator *cg);90static void asyncGCMapCheckPatching(TR::Node *node, TR::CodeGenerator *cg, TR::LabelSymbol *snippetLabel);91static void inlineRecursiveMonitor(TR::Node *node, TR::CodeGenerator *cg, TR::LabelSymbol *startLabel, TR::LabelSymbol *snippetLabel, TR::LabelSymbol *JITMonitorEnterSnippetLabel, TR::Register *objectReg, int lwoffset, TR::LabelSymbol *snippetRestartLabel, bool reservingLock);9293/*94* \brief95* Generates the sequence to handle cases where the monitor object96* is value type or value based class type97*98* \param node99* the monitor enter/exit node100*101* \param snippetLabel102* the label for OOL code calling VM monitor enter/exit helpers103*104* \details105* Call the VM helper if it's detected at runtime that the monitor object106* is value type or value based class type.107* The VM helper throws appropriate IllegalMonitorStateException for value type108* and VirtualMachineError for value based class type.109*110* \note111* This method only handles the cases where, at compile time, it's unknown whether the112* object is reference type or value type or value based class type.113*/114static void generateCheckForValueMonitorEnterOrExit(TR::Node *node, int32_t classFlag, TR::LabelSymbol *snippetLabel, TR::CodeGenerator *cg);115static void transactionalMemoryJITMonitorEntry(TR::Node *node, TR::CodeGenerator *cg, TR::LabelSymbol *startLabel, TR::LabelSymbol *snippetLabel, TR::LabelSymbol *JITMonitorEnterSnippetLabel, TR::Register *objectReg, int lwoffset);116static void generateValueTracingCode(TR::Node *node, TR::Register *vmThreadReg, TR::Register *scratchReg, TR::Register *valueRegHigh, TR::Register *valueRegLow, TR::CodeGenerator *cg);117static void generateValueTracingCode(TR::Node *node, TR::Register *vmThreadReg, TR::Register *scratchReg, TR::Register *valueReg, TR::CodeGenerator *cg);118static bool monEntryExitHelper(bool entry, TR::Node* node, bool reservingLock, bool normalLockPreservingReservation, TR_RuntimeHelper &helper, TR::CodeGenerator* cg);119static void VMarrayStoreCHKEvaluator(TR::Node *, TR::Node *, TR::Node *, TR_X86ScratchRegisterManager *, TR::LabelSymbol *, TR::Instruction *, TR::CodeGenerator *cg);120static void VMwrtbarRealTimeWithoutStoreEvaluator(TR::Node *node, TR::MemoryReference *storeMRForRealTime, TR::Register *stoerAddressRegForRealTime, TR::Node *destOwningObject, TR::Node *sourceObject, TR::Register *srcReg, TR_X86ScratchRegisterManager *scratchRegisterManager, TR::CodeGenerator *cg);121static void VMwrtbarWithoutStoreEvaluator(TR::Node *node, TR::Node *destOwningObject, TR::Node *sourceObject, TR::Register *srcReg, TR_X86ScratchRegisterManager *scratchRegisterManager, TR::CodeGenerator *cg);122static void VMwrtbarWithStoreEvaluator(TR::Node *node, TR::MemoryReference *storeMR, TR_X86ScratchRegisterManager *, TR::Node *destinationChild, TR::Node *sourceChild, bool isIndirect, TR::CodeGenerator *cg, bool nullAdjusted = false);123124/*125* Generate instructions for static/instance field access report.126* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.127*/128static void generateTestAndReportFieldWatchInstructions(TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *valueReg, TR::Register *dataSnippetRegister);129130/*131* Generates instructions to fill in the J9JITWatchedStaticFieldData.fieldAddress, J9JITWatchedStaticFieldData.fieldClass for static fields,132* and J9JITWatchedInstanceFieldData.offset for instance fields at runtime. Used for fieldwatch support.133* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.134*/135static void generateFillInDataBlockSequenceForUnresolvedField (TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *dataSnippetRegister);136static TR::Register *directCallEvaluator(TR::Node *node, TR::CodeGenerator *cg);137static TR::Register *encodeUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);138static TR::Register *compressStringEvaluator(TR::Node *node, TR::CodeGenerator *cg, bool japaneseMethod);139static TR::Register *compressStringNoCheckEvaluator(TR::Node *node, TR::CodeGenerator *cg, bool japaneseMethod);140static TR::Register *andORStringEvaluator(TR::Node *node, TR::CodeGenerator *cg);141static TR::Register *toUpperIntrinsicUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);142static TR::Register *toLowerIntrinsicUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);143static TR::Register *toUpperIntrinsicLatin1Evaluator(TR::Node *node, TR::CodeGenerator *cg);144static TR::Register *toLowerIntrinsicLatin1Evaluator(TR::Node *node, TR::CodeGenerator *cg);145146static TR::Register *irdbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);147static TR::Register *irdbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);148static TR::Register *ardbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);149static TR::Register *ardbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);150151static TR::Register *fwrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);152static TR::Register *fwrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);153static TR::Register *awrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);154static TR::Register *awrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);155static TR::Register *inlineStringLatin1Inflate(TR::Node *node, TR::CodeGenerator *cg);156static TR::Register *generateConcurrentScavengeSequence(TR::Node *node, TR::CodeGenerator *cg);157static TR::Register *fpConvertToLong(TR::Node *node, TR::SymbolReference *helperSymRef, TR::CodeGenerator *cg);158static TR::Register *f2iEvaluator(TR::Node *node, TR::CodeGenerator *cg);159static TR::Register *f2lEvaluator(TR::Node *node, TR::CodeGenerator *cg);160static TR::Register *d2lEvaluator(TR::Node *node, TR::CodeGenerator *cg);161class CaseConversionManager;162static TR::Register *stringCaseConversionHelper(TR::Node *node, TR::CodeGenerator *cg, CaseConversionManager& manager);163164private:165static TR::Register* performHeapLoadWithReadBarrier(TR::Node* node, TR::CodeGenerator* cg);166};167168}169170}171172#endif173174175