Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/compiler/z/codegen/J9Linkage.cpp
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
#include "codegen/Linkage.hpp"
24
#include "codegen/Linkage_inlines.hpp"
25
#include "codegen/S390GenerateInstructions.hpp"
26
#include "compile/Compilation.hpp"
27
#include "il/ParameterSymbol.hpp"
28
29
TR::Instruction *
30
J9::Z::Linkage::loadUpArguments(TR::Instruction * cursor)
31
{
32
TR::Compilation *comp = self()->comp();
33
TR::RealRegister * stackPtr = self()->getStackPointerRealRegister();
34
TR::ResolvedMethodSymbol * bodySymbol = comp->getJittedMethodSymbol();
35
ListIterator<TR::ParameterSymbol> paramIterator(&(bodySymbol->getParameterList()));
36
TR::ParameterSymbol * paramCursor = paramIterator.getFirst();
37
TR::Node * firstNode = comp->getStartTree()->getNode();
38
int32_t numIntArgs = 0, numFloatArgs = 0;
39
uint32_t binLocalRegs = 0x1<<14; // Binary pattern representing reg14 as free for local alloc
40
41
bool isRecompilable = false;
42
if (comp->getRecompilationInfo() && comp->getRecompilationInfo()->couldBeCompiledAgain())
43
{
44
isRecompilable = true;
45
}
46
47
while ((paramCursor != NULL) && ((numIntArgs < self()->getNumIntegerArgumentRegisters()) || (numFloatArgs < self()->getNumFloatArgumentRegisters())))
48
{
49
TR::RealRegister * argRegister;
50
int32_t offset = paramCursor->getParameterOffset();
51
52
// If FSD, the JIT will conservatively store all parameters to stack later in saveArguments.
53
// Hence, we need to load the value into a parameter register for I2J transitions.
54
bool hasToLoadFromStack = paramCursor->isReferencedParameter() || paramCursor->isParmHasToBeOnStack() || comp->getOption(TR_FullSpeedDebug);
55
56
switch (paramCursor->getDataType())
57
{
58
case TR::Int8:
59
case TR::Int16:
60
case TR::Int32:
61
if (hasToLoadFromStack && numIntArgs < self()->getNumIntegerArgumentRegisters())
62
{
63
argRegister = self()->getRealRegister(self()->getIntegerArgumentRegister(numIntArgs));
64
TR::MemoryReference* memRef = generateS390MemoryReference(stackPtr, offset, self()->cg());
65
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::L, firstNode, argRegister,
66
memRef, cursor);
67
cursor->setBinLocalFreeRegs(binLocalRegs);
68
}
69
numIntArgs++;
70
break;
71
case TR::Address:
72
if ((hasToLoadFromStack || isRecompilable) &&
73
numIntArgs < self()->getNumIntegerArgumentRegisters())
74
{
75
argRegister = self()->getRealRegister(self()->getIntegerArgumentRegister(numIntArgs));
76
TR::MemoryReference* memRef = generateS390MemoryReference(stackPtr, offset, self()->cg());
77
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::getLoadOpCode(), firstNode, argRegister,
78
memRef, cursor);
79
cursor->setBinLocalFreeRegs(binLocalRegs);
80
}
81
numIntArgs++;
82
break;
83
case TR::Int64:
84
if (hasToLoadFromStack && numIntArgs < self()->getNumIntegerArgumentRegisters())
85
{
86
argRegister = self()->getRealRegister(self()->getIntegerArgumentRegister(numIntArgs));
87
TR::MemoryReference* memRef = generateS390MemoryReference(stackPtr, offset, self()->cg());
88
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::getLoadOpCode(), firstNode, argRegister,
89
memRef, cursor);
90
cursor->setBinLocalFreeRegs(binLocalRegs);
91
if (comp->target().is32Bit() && numIntArgs < self()->getNumIntegerArgumentRegisters() - 1)
92
{
93
argRegister = self()->getRealRegister(self()->getIntegerArgumentRegister(numIntArgs + 1));
94
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::L, firstNode, argRegister,
95
generateS390MemoryReference(stackPtr, offset + 4, self()->cg()), cursor);
96
cursor->setBinLocalFreeRegs(binLocalRegs);
97
}
98
}
99
numIntArgs += (comp->target().is64Bit()) ? 1 : 2;
100
break;
101
case TR::Float:
102
if (hasToLoadFromStack && numFloatArgs < self()->getNumFloatArgumentRegisters())
103
{
104
argRegister = self()->getRealRegister(self()->getFloatArgumentRegister(numFloatArgs));
105
TR::MemoryReference* memRef = generateS390MemoryReference(stackPtr, offset, self()->cg());
106
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::LE, firstNode, argRegister,
107
memRef, cursor);
108
cursor->setBinLocalFreeRegs(binLocalRegs);
109
}
110
numFloatArgs++;
111
break;
112
case TR::Double:
113
if (hasToLoadFromStack && numFloatArgs < self()->getNumFloatArgumentRegisters())
114
{
115
argRegister = self()->getRealRegister(self()->getFloatArgumentRegister(numFloatArgs));
116
TR::MemoryReference* memRef = generateS390MemoryReference(stackPtr, offset, self()->cg());
117
cursor = generateRXInstruction(self()->cg(), TR::InstOpCode::LD, firstNode, argRegister,
118
memRef, cursor);
119
cursor->setBinLocalFreeRegs(binLocalRegs);
120
}
121
numFloatArgs++;
122
break;
123
}
124
paramCursor = paramIterator.getNext();
125
}
126
return cursor;
127
}
128
129