Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/x/codegen/J9TreeEvaluator.hpp
6004 views
1
/*******************************************************************************
2
* Copyright (c) 2000, 2021 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_X86_TREE_EVALUATOR_INCL
24
#define J9_X86_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 X86 { class TreeEvaluator; } }
32
namespace J9 { typedef J9::X86::TreeEvaluator TreeEvaluatorConnector; }
33
#endif
34
35
#include "codegen/Snippet.hpp"
36
#include "compiler/codegen/J9TreeEvaluator.hpp" // include parent
37
38
namespace J9
39
{
40
41
namespace X86
42
{
43
44
class OMR_EXTENSIBLE TreeEvaluator: public J9::TreeEvaluator
45
{
46
public:
47
48
static TR::Register *writeBarrierEvaluator(TR::Node *node, TR::CodeGenerator *cg);
49
static TR::Register *monentEvaluator(TR::Node *node, TR::CodeGenerator *cg);
50
static TR::Register *monexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);
51
static TR::Register *asynccheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);
52
static TR::Register *newEvaluator(TR::Node *node, TR::CodeGenerator *cg);
53
static TR::Register *multianewArrayEvaluator(TR::Node *node, TR::CodeGenerator *cg);
54
static TR::Register *arraycopyEvaluator(TR::Node *node, TR::CodeGenerator *cg);
55
static TR::Register *arraylengthEvaluator(TR::Node *node, TR::CodeGenerator *cg);
56
static TR::Register *exceptionRangeFenceEvaluator(TR::Node *node, TR::CodeGenerator *cg);
57
static TR::Register *NULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
58
static TR::Register *ZEROCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
59
static TR::Register *resolveAndNULLCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
60
static TR::Register *evaluateNULLCHKWithPossibleResolve(TR::Node *node, bool needResolution, TR::CodeGenerator *cg);
61
static TR::Register *DIVCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
62
static TR::Register *BNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
63
static TR::Register *ArrayCopyBNDCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
64
static TR::Register *BNDCHKwithSpineCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
65
static TR::Register *ArrayStoreCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
66
static TR::Register *ArrayCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
67
static TR::Register *barrierFenceEvaluator(TR::Node *node, TR::CodeGenerator *cg);
68
static TR::Register *atccheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);
69
static TR::Register *ScopeCHKEvaluator(TR::Node *node, TR::CodeGenerator *cg);
70
static TR::Register *readbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
71
static TR::Register *integerHighestOneBit(TR::Node *node, TR::CodeGenerator *cg);
72
static TR::Register *integerLowestOneBit(TR::Node *node, TR::CodeGenerator *cg);
73
static TR::Register *integerNumberOfLeadingZeros(TR::Node *node, TR::CodeGenerator *cg);
74
static TR::Register *integerNumberOfTrailingZeros(TR::Node *node, TR::CodeGenerator *cg);
75
static TR::Register *integerBitCount(TR::Node *node, TR::CodeGenerator *cg);
76
static TR::Register *longHighestOneBit(TR::Node *node, TR::CodeGenerator *cg);
77
static TR::Register *longLowestOneBit(TR::Node *node, TR::CodeGenerator *cg);
78
static TR::Register *longNumberOfLeadingZeros(TR::Node *node, TR::CodeGenerator *cg);
79
static TR::Register *longNumberOfTrailingZeros(TR::Node *node, TR::CodeGenerator *cg);
80
static TR::Register *longBitCount(TR::Node *node, TR::CodeGenerator *cg);
81
static TR::Register *tstartEvaluator(TR::Node *node, TR::CodeGenerator *cg);
82
static TR::Register *tfinishEvaluator(TR::Node *node, TR::CodeGenerator *cg);
83
static TR::Register *tabortEvaluator(TR::Node *node, TR::CodeGenerator *cg);
84
static void generateVFTMaskInstruction(TR::Node *node, TR::Register *reg, TR::CodeGenerator *cg);
85
static bool VMinlineCallEvaluator(TR::Node *node, bool isIndirect, TR::CodeGenerator *cg);
86
static TR::Register *VMmonentEvaluator(TR::Node *node, TR::CodeGenerator *cg);
87
static TR::Register *VMmonexitEvaluator(TR::Node *node, TR::CodeGenerator *cg);
88
static TR::Register *VMnewEvaluator(TR::Node *node, TR::CodeGenerator *cg);
89
static TR::Register *VMarrayCheckEvaluator(TR::Node *node, TR::CodeGenerator *cg);
90
static TR::Register *checkcastinstanceofEvaluator(TR::Node *node, TR::CodeGenerator *cg);
91
static void asyncGCMapCheckPatching(TR::Node *node, TR::CodeGenerator *cg, TR::LabelSymbol *snippetLabel);
92
static 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);
93
94
/*
95
* \brief
96
* Generates the sequence to handle cases where the monitor object
97
* is value type or value based class type
98
*
99
* \param node
100
* the monitor enter/exit node
101
*
102
* \param snippetLabel
103
* the label for OOL code calling VM monitor enter/exit helpers
104
*
105
* \details
106
* Call the VM helper if it's detected at runtime that the monitor object
107
* is value type or value based class type.
108
* The VM helper throws appropriate IllegalMonitorStateException for value type
109
* and VirtualMachineError for value based class type.
110
*
111
* \note
112
* This method only handles the cases where, at compile time, it's unknown whether the
113
* object is reference type or value type or value based class type.
114
*/
115
static void generateCheckForValueMonitorEnterOrExit(TR::Node *node, int32_t classFlag, TR::LabelSymbol *snippetLabel, TR::CodeGenerator *cg);
116
static void transactionalMemoryJITMonitorEntry(TR::Node *node, TR::CodeGenerator *cg, TR::LabelSymbol *startLabel, TR::LabelSymbol *snippetLabel, TR::LabelSymbol *JITMonitorEnterSnippetLabel, TR::Register *objectReg, int lwoffset);
117
static void generateValueTracingCode(TR::Node *node, TR::Register *vmThreadReg, TR::Register *scratchReg, TR::Register *valueRegHigh, TR::Register *valueRegLow, TR::CodeGenerator *cg);
118
static void generateValueTracingCode(TR::Node *node, TR::Register *vmThreadReg, TR::Register *scratchReg, TR::Register *valueReg, TR::CodeGenerator *cg);
119
static bool monEntryExitHelper(bool entry, TR::Node* node, bool reservingLock, bool normalLockPreservingReservation, TR_RuntimeHelper &helper, TR::CodeGenerator* cg);
120
static void VMarrayStoreCHKEvaluator(TR::Node *, TR::Node *, TR::Node *, TR_X86ScratchRegisterManager *, TR::LabelSymbol *, TR::Instruction *, TR::CodeGenerator *cg);
121
static 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);
122
static void VMwrtbarWithoutStoreEvaluator(TR::Node *node, TR::Node *destOwningObject, TR::Node *sourceObject, TR::Register *srcReg, TR_X86ScratchRegisterManager *scratchRegisterManager, TR::CodeGenerator *cg);
123
static void VMwrtbarWithStoreEvaluator(TR::Node *node, TR::MemoryReference *storeMR, TR_X86ScratchRegisterManager *, TR::Node *destinationChild, TR::Node *sourceChild, bool isIndirect, TR::CodeGenerator *cg, bool nullAdjusted = false);
124
125
/*
126
* Generate instructions for static/instance field access report.
127
* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.
128
*/
129
static void generateTestAndReportFieldWatchInstructions(TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *valueReg, TR::Register *dataSnippetRegister);
130
131
/*
132
* Generates instructions to fill in the J9JITWatchedStaticFieldData.fieldAddress, J9JITWatchedStaticFieldData.fieldClass for static fields,
133
* and J9JITWatchedInstanceFieldData.offset for instance fields at runtime. Used for fieldwatch support.
134
* @param dataSnippetRegister: Optional, can be used to pass the address of the snippet inside the register.
135
*/
136
static void generateFillInDataBlockSequenceForUnresolvedField (TR::CodeGenerator *cg, TR::Node *node, TR::Snippet *dataSnippet, bool isWrite, TR::Register *sideEffectRegister, TR::Register *dataSnippetRegister);
137
static TR::Register *directCallEvaluator(TR::Node *node, TR::CodeGenerator *cg);
138
static TR::Register *encodeUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);
139
static TR::Register *compressStringEvaluator(TR::Node *node, TR::CodeGenerator *cg, bool japaneseMethod);
140
static TR::Register *compressStringNoCheckEvaluator(TR::Node *node, TR::CodeGenerator *cg, bool japaneseMethod);
141
static TR::Register *andORStringEvaluator(TR::Node *node, TR::CodeGenerator *cg);
142
static TR::Register *toUpperIntrinsicUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);
143
static TR::Register *toLowerIntrinsicUTF16Evaluator(TR::Node *node, TR::CodeGenerator *cg);
144
static TR::Register *toUpperIntrinsicLatin1Evaluator(TR::Node *node, TR::CodeGenerator *cg);
145
static TR::Register *toLowerIntrinsicLatin1Evaluator(TR::Node *node, TR::CodeGenerator *cg);
146
147
static TR::Register *irdbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
148
static TR::Register *irdbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
149
static TR::Register *ardbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
150
static TR::Register *ardbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
151
152
static TR::Register *fwrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
153
static TR::Register *fwrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
154
static TR::Register *awrtbarEvaluator(TR::Node *node, TR::CodeGenerator *cg);
155
static TR::Register *awrtbariEvaluator(TR::Node *node, TR::CodeGenerator *cg);
156
static TR::Register *inlineStringLatin1Inflate(TR::Node *node, TR::CodeGenerator *cg);
157
static TR::Register *generateConcurrentScavengeSequence(TR::Node *node, TR::CodeGenerator *cg);
158
static TR::Register *fpConvertToLong(TR::Node *node, TR::SymbolReference *helperSymRef, TR::CodeGenerator *cg);
159
static TR::Register *f2iEvaluator(TR::Node *node, TR::CodeGenerator *cg);
160
static TR::Register *f2lEvaluator(TR::Node *node, TR::CodeGenerator *cg);
161
static TR::Register *d2lEvaluator(TR::Node *node, TR::CodeGenerator *cg);
162
class CaseConversionManager;
163
static TR::Register *stringCaseConversionHelper(TR::Node *node, TR::CodeGenerator *cg, CaseConversionManager& manager);
164
165
private:
166
static TR::Register* performHeapLoadWithReadBarrier(TR::Node* node, TR::CodeGenerator* cg);
167
};
168
169
}
170
171
}
172
173
#endif
174
175