Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/p/codegen/J9TreeEvaluator.hpp
6004 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2020 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* 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-exception
21
*******************************************************************************/
22
23
#ifndef J9_PPC_TREE_EVALUATOR_INCL
24
#define J9_PPC_TREE_EVALUATOR_INCL
25
26
/*
27
* The following #define and typedef must appear before any #includes in this file
28
*/
29
#ifndef J9_TREE_EVALUATOR_CONNECTOR
30
#define J9_TREE_EVALUATOR_CONNECTOR
31
namespace J9 { namespace Power { class TreeEvaluator; } }
32
namespace J9 { typedef J9::Power::TreeEvaluator TreeEvaluatorConnector; }
33
#else
34
#error J9::Power::TreeEvaluator expected to be a primary connector, but a J9 connector is already defined
35
#endif
36
37
38
#include "compiler/codegen/J9TreeEvaluator.hpp" // include parent
39
#include "codegen/Snippet.hpp"
40
41
namespace J9
42
{
43
44
namespace Power
45
{
46
47
class OMR_EXTENSIBLE TreeEvaluator: public J9::TreeEvaluator
48
{
49
public:
50
51
static TR::Register *fwrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
52
static TR::Register *fwrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
53
static TR::Register *awrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
54
static TR::Register *awrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
55
static TR::Register *dwrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
56
static TR::Register *dwrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
57
static TR::Register *monentEvaluator(TR::Node *node, TR::CodeGenerator *cg);
58
static TR::Register *monexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);
59
static TR::Register *asynccheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);
60
static TR::Register *instanceofEvaluator(TR::Node *node, TR::CodeGenerator *cg);
61
static TR::Register *checkcastEvaluator(TR::Node *node, TR::CodeGenerator *cg);
62
static TR::Register *checkcastAndNULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
63
static TR::Register *newObjectEvaluator(TR::Node *node, TR::CodeGenerator *cg);
64
static TR::Register *newArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
65
static TR::Register *anewArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
66
static TR::Register *multianewArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
67
static TR::Register *arraylengthEvaluator(TR::Node *node, TR::CodeGenerator *cg);
68
static TR::Register *DIVCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
69
static TR::Register *BNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
70
static TR::Register *ArrayCopyBNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
71
static TR::Register *BNDCHKwithSpineCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
72
static TR::Register *ArrayStoreCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
73
static TR::Register *ArrayCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
74
static TR::Register *conditionalHelperEvaluator(TR::Node *node, TR::CodeGenerator *cg);
75
static TR::Register *flushEvaluator(TR::Node *node, TR::CodeGenerator *cg);
76
static TR::Register *directCallEvaluator(TR::Node *node, TR::CodeGenerator *cg);
77
78
static TR::Register *VMcheckcastEvaluator2(TR::Node *node, TR::CodeGenerator *cg);
79
static TR::Register *VMcheckcastEvaluator(TR::Node *node, TR::CodeGenerator *cg);
80
static TR::Register *VMinstanceOfEvaluator2(TR::Node *node, TR::CodeGenerator *cg);
81
static TR::Register *VMinstanceOfEvaluator(TR::Node *node, TR::CodeGenerator *cg);
82
static TR::Register *tstartEvaluator(TR::Node *node, TR::CodeGenerator *cg);
83
static TR::Register *tfinishEvaluator(TR::Node *node, TR::CodeGenerator *cg);
84
static TR::Register *tabortEvaluator(TR::Node *node, TR::CodeGenerator *cg);
85
static TR::Register *arraycopyEvaluator(TR::Node *node, TR::CodeGenerator *cg);
86
static TR::Register *irdbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
87
static TR::Register *irdbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
88
static TR::Register *ardbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
89
static TR::Register *ardbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
90
91
static void generateCheckForValueMonitorEnterOrExit(TR::Node *node, TR::LabelSymbol *helperCallLabel, TR::Register *objReg, TR::Register *objectClassReg, TR::Register *temp1Reg, TR::Register *temp2Reg, TR::Register *condReg, TR::CodeGenerator *cg, int32_t classFlag);
92
static void restoreTOCRegister(TR::Node *node, TR::CodeGenerator *cg, TR::RegisterDependencyConditions *dependencies);
93
static void buildArgsProcessFEDependencies(TR::Node *node, TR::CodeGenerator *cg, TR::RegisterDependencyConditions *dependencies);
94
static TR::Register *retrieveTOCRegister(TR::Node *node, TR::CodeGenerator *cg, TR::RegisterDependencyConditions *dependencies);
95
static TR::Register *VMifInstanceOfEvaluator(TR::Node *node, TR::CodeGenerator *cg);
96
static TR::Register *ifInstanceOfEvaluator(TR::Node *node, TR::CodeGenerator *cg);
97
static void genArrayCopyWithArrayStoreCHK(TR::Node *node, TR::CodeGenerator *cg);
98
static void genWrtbarForArrayCopy(TR::Node *node, TR::Register *srcObjReg, TR::Register *dstObjReg, TR::CodeGenerator *cg);
99
static TR::Instruction *generateVFTMaskInstruction(TR::CodeGenerator *cg, TR::Node *node, TR::Register *dstReg, TR::Register *srcReg, TR::Instruction *preced=0);
100
static TR::Instruction *generateVFTMaskInstruction(TR::CodeGenerator *cg, TR::Node *node, TR::Register *reg, TR::Instruction *preced=0);
101
static TR::Register *VMgenCoreInstanceofEvaluator(TR::Node * node, TR::CodeGenerator * cg, bool isVMifInstanceOf, int32_t depIndex, int32_t numDep, TR::Node *depNode, bool needResult, bool needHelperCall, bool testEqualClass, bool testCache, bool testCastClassIsSuper, TR::LabelSymbol *doneLabel, TR::LabelSymbol *res0Label, TR::LabelSymbol *res1Label, bool branchOn1);
102
static TR::Register *VMmonentEvaluator(TR::Node *node, TR::CodeGenerator *cg);
103
static TR::Register *VMmonexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);
104
static TR::Register *VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg);
105
static TR::Register *VMarrayCheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);
106
107
/*
108
* Generate instructions for static/instance field access report.
109
* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.
110
*/
111
static void generateTestAndReportFieldWatchInstructions(TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *valueReg, TR::Register *dataSnippetRegister);
112
/*
113
* Generates instructions to fill in the J9JITWatchedStaticFieldData.fieldAddress, J9JITWatchedStaticFieldData.fieldClass for static fields,
114
* and J9JITWatchedInstanceFieldData.offset for instance fields at runtime. Used for fieldwatch support.
115
* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.
116
*/
117
static void generateFillInDataBlockSequenceForUnresolvedField (TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *dataSnippetRegister);
118
static TR::Snippet * getFieldWatchInstanceSnippet(TR::CodeGenerator *cg, TR::Node *node, J9Method *m, UDATA loc, UDATA os);
119
static TR::Snippet * getFieldWatchStaticSnippet(TR::CodeGenerator *cg, TR::Node *node, J9Method *m, UDATA loc, void *fieldAddress, J9Class *fieldClass);
120
121
static TR::Register *NULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
122
static TR::Register *resolveAndNULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
123
static TR::Register *evaluateNULLCHKWithPossibleResolve(TR::Node *node, bool needResolution, TR::CodeGenerator *cg);
124
};
125
}
126
127
}
128
129
#endif
130
131