-
Notifications
You must be signed in to change notification settings - Fork 752
/
Copy pathJ9RecognizedCallTransformer.hpp
112 lines (105 loc) · 4.21 KB
/
J9RecognizedCallTransformer.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
/*******************************************************************************
* Copyright (c) 2017, 2019 IBM Corp. and others
*
* This program and the accompanying materials are made available under
* the terms of the Eclipse Public License 2.0 which accompanies this
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
* or the Apache License, Version 2.0 which accompanies this distribution and
* is available at https://www.apache.org/licenses/LICENSE-2.0.
*
* This Source Code may also be made available under the following
* Secondary Licenses when the conditions for such availability set
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
* General Public License, version 2 with the GNU Classpath
* Exception [1] and GNU General Public License, version 2 with the
* OpenJDK Assembly Exception [2].
*
* [1] https://www.gnu.org/software/classpath/license.html
* [2] http://openjdk.java.net/legal/assembly-exception.html
*
* 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
*******************************************************************************/
#ifndef J9RECOGNIZEDCALLTRANSFORMER_INCL
#define J9RECOGNIZEDCALLTRANSFORMER_INCL
#include "optimizer/OMRRecognizedCallTransformer.hpp"
#include "compile/SymbolReferenceTable.hpp"
namespace J9
{
class RecognizedCallTransformer : public OMR::RecognizedCallTransformer
{
public:
RecognizedCallTransformer(TR::OptimizationManager* manager)
: OMR::RecognizedCallTransformer(manager)
{}
protected:
virtual bool isInlineable(TR::TreeTop* treetop);
virtual void transform(TR::TreeTop* treetop);
private:
void processIntrinsicFunction(TR::TreeTop* treetop, TR::Node* node, TR::ILOpCodes opcode);
/** \brief
* Transforms java/lang/Class.IsAssignableFrom(Ljava/lang/Class;)Z into a JIT helper call TR_checkAssignable with equivalent
* semantics.
*
* \param treetop
* The treetop which anchors the call node.
*
* \param node
* The call node representing a call to java/lang/Class.IsAssignableFrom(Ljava/lang/Class;)Z which has the following shape:
*
* \code
* icall <java/lang/Class.IsAssignableFrom(Ljava/lang/Class;)Z>
* <cast class object>
* <class object to be checked>
* \endcode
*/
void process_java_lang_Class_IsAssignableFrom(TR::TreeTop* treetop, TR::Node* node);
/** \brief
* Transforms java/lang/StringUTF16.toBytes([CII)[B into a fast allocate and arraycopy sequence with equivalent
* semantics.
*
* \param treetop
* The treetop which anchors the call node.
*
* \param node
* The call node representing a call to java/lang/StringUTF16.toBytes([CII)[B which has the following shape:
*
* \code
* acall <java/lang/StringUTF16.toBytes([CII)[B>
* <value>
* <off>
* <len>
* \endcode
*/
void process_java_lang_StringUTF16_toBytes(TR::TreeTop* treetop, TR::Node* node);
/** \brief
* Transforms java/lang/StrictMath.sqrt(D)D and java/lang/Math.sqrt(D)D into a CodeGen inlined function with equivalent semantics.
*
* \param treetop
* The treetop which anchors the call node.
*
* \param node
* The call node representing a call to java/lang/StrictMath.sqrt(D)D which has the following shape:
*
* \code
* dcall java/lang/StrictMath.sqrt(D)D or java/lang/Math.sqrt(D)D
* <jclass>
* <value>
* \endcode
*/
void process_java_lang_StrictMath_and_Math_sqrt(TR::TreeTop* treetop, TR::Node* node);
/** \brief
* Transforms certain Unsafe atomic helpers into a CodeGen inlined helper with equivalent semantics.
*
* \param treetop
* The treetop which anchors the call node.
*
* \param helper
* The CodeGen inlined helper being transformed into
*
* \param needsNullCheck
* Flag indicating if null check is needed on the first argument of the unsafe call
*/
void processUnsafeAtomicCall(TR::TreeTop* treetop, TR::SymbolReferenceTable::CommonNonhelperSymbol helper, bool needsNullCheck = false);
};
}
#endif