blob: 2c16a453fa79ea309af28bcda438c581a44e017d [file] [log] [blame]
oliver@apple.comb9009142013-07-25 03:58:26 +00001/*
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +00002 * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
oliver@apple.comb9009142013-07-25 03:58:26 +00003 *
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
6 * are met:
7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 *
13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#include "config.h"
ossy@webkit.orgbeb0de42014-02-17 19:00:03 +000027#include "DFGOSRExitCompilerCommon.h"
oliver@apple.comb9009142013-07-25 03:58:26 +000028
29#if ENABLE(DFG_JIT)
30
fpizlo@apple.comb426f862014-02-10 02:51:13 +000031#include "DFGJITCode.h"
oliver@apple.comb9009142013-07-25 03:58:26 +000032#include "DFGOperations.h"
msaboff@apple.com95894332014-01-29 19:18:54 +000033#include "JIT.h"
oliver@apple.comb9009142013-07-25 03:58:26 +000034#include "JSCJSValueInlines.h"
fpizlo@apple.comfb7eff22014-02-11 01:45:50 +000035#include "JSCInlines.h"
oliver@apple.comb9009142013-07-25 03:58:26 +000036
37namespace JSC { namespace DFG {
38
oliver@apple.comea771492013-07-25 03:58:38 +000039void handleExitCounts(CCallHelpers& jit, const OSRExitBase& exit)
oliver@apple.comb9009142013-07-25 03:58:26 +000040{
41 jit.add32(AssemblyHelpers::TrustedImm32(1), AssemblyHelpers::AbsoluteAddress(&exit.m_count));
42
43 jit.move(AssemblyHelpers::TrustedImmPtr(jit.codeBlock()), GPRInfo::regT0);
44
45 AssemblyHelpers::Jump tooFewFails;
46
47 jit.load32(AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfOSRExitCounter()), GPRInfo::regT2);
48 jit.add32(AssemblyHelpers::TrustedImm32(1), GPRInfo::regT2);
49 jit.store32(GPRInfo::regT2, AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfOSRExitCounter()));
oliver@apple.comd2a16382013-07-25 04:04:18 +000050
oliver@apple.comb9009142013-07-25 03:58:26 +000051 jit.move(AssemblyHelpers::TrustedImmPtr(jit.baselineCodeBlock()), GPRInfo::regT0);
oliver@apple.comd2a16382013-07-25 04:04:18 +000052 AssemblyHelpers::Jump reoptimizeNow = jit.branch32(
53 AssemblyHelpers::GreaterThanOrEqual,
54 AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfJITExecuteCounter()),
55 AssemblyHelpers::TrustedImm32(0));
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +000056
57 // We want to figure out if there's a possibility that we're in a loop. For the outermost
58 // code block in the inline stack, we handle this appropriately by having the loop OSR trigger
59 // check the exit count of the replacement of the CodeBlock from which we are OSRing. The
60 // problem is the inlined functions, which might also have loops, but whose baseline versions
61 // don't know where to look for the exit count. Figure out if those loops are severe enough
62 // that we had tried to OSR enter. If so, then we should use the loop reoptimization trigger.
63 // Otherwise, we should use the normal reoptimization trigger.
64
65 AssemblyHelpers::JumpList loopThreshold;
66
67 for (InlineCallFrame* inlineCallFrame = exit.m_codeOrigin.inlineCallFrame; inlineCallFrame; inlineCallFrame = inlineCallFrame->caller.inlineCallFrame) {
68 loopThreshold.append(
69 jit.branchTest8(
70 AssemblyHelpers::NonZero,
71 AssemblyHelpers::AbsoluteAddress(
72 inlineCallFrame->executable->addressOfDidTryToEnterInLoop())));
73 }
74
75 jit.move(
76 AssemblyHelpers::TrustedImm32(jit.codeBlock()->exitCountThresholdForReoptimization()),
77 GPRInfo::regT1);
78
79 if (!loopThreshold.empty()) {
80 AssemblyHelpers::Jump done = jit.jump();
81
82 loopThreshold.link(&jit);
83 jit.move(
84 AssemblyHelpers::TrustedImm32(
85 jit.codeBlock()->exitCountThresholdForReoptimizationFromLoop()),
86 GPRInfo::regT1);
oliver@apple.comd2a16382013-07-25 04:04:18 +000087
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +000088 done.link(&jit);
89 }
90
91 tooFewFails = jit.branch32(AssemblyHelpers::BelowOrEqual, GPRInfo::regT2, GPRInfo::regT1);
oliver@apple.comb9009142013-07-25 03:58:26 +000092
oliver@apple.comd2a16382013-07-25 04:04:18 +000093 reoptimizeNow.link(&jit);
94
oliver@apple.comb9009142013-07-25 03:58:26 +000095 // Reoptimize as soon as possible.
96#if !NUMBER_OF_ARGUMENT_REGISTERS
97 jit.poke(GPRInfo::regT0);
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +000098 jit.poke(AssemblyHelpers::TrustedImmPtr(&exit), 1);
oliver@apple.comb9009142013-07-25 03:58:26 +000099#else
100 jit.move(GPRInfo::regT0, GPRInfo::argumentGPR0);
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000101 jit.move(AssemblyHelpers::TrustedImmPtr(&exit), GPRInfo::argumentGPR1);
oliver@apple.comb9009142013-07-25 03:58:26 +0000102#endif
fpizlo@apple.com2c4a7e92014-08-06 05:27:46 +0000103 jit.move(AssemblyHelpers::TrustedImmPtr(bitwise_cast<void*>(triggerReoptimizationNow)), GPRInfo::nonArgGPR0);
104 jit.call(GPRInfo::nonArgGPR0);
oliver@apple.comb9009142013-07-25 03:58:26 +0000105 AssemblyHelpers::Jump doneAdjusting = jit.jump();
106
107 tooFewFails.link(&jit);
108
109 // Adjust the execution counter such that the target is to only optimize after a while.
110 int32_t activeThreshold =
fpizlo@apple.come5b68642013-08-29 20:27:15 +0000111 jit.baselineCodeBlock()->adjustedCounterValue(
112 Options::thresholdForOptimizeAfterLongWarmUp());
fpizlo@apple.com86e3d392014-04-18 23:20:00 +0000113 int32_t targetValue = applyMemoryUsageHeuristicsAndConvertToInt(
oliver@apple.comb9009142013-07-25 03:58:26 +0000114 activeThreshold, jit.baselineCodeBlock());
fpizlo@apple.com86e3d392014-04-18 23:20:00 +0000115 int32_t clippedValue;
116 switch (jit.codeBlock()->jitType()) {
117 case JITCode::DFGJIT:
118 clippedValue = BaselineExecutionCounter::clippedThreshold(jit.codeBlock()->globalObject(), targetValue);
119 break;
120 case JITCode::FTLJIT:
121 clippedValue = UpperTierExecutionCounter::clippedThreshold(jit.codeBlock()->globalObject(), targetValue);
122 break;
123 default:
124 RELEASE_ASSERT_NOT_REACHED();
mjs@apple.com0a661162014-09-08 02:16:47 +0000125#if COMPILER_QUIRK(CONSIDERS_UNREACHABLE_CODE)
fpizlo@apple.comf2b13502014-04-18 23:26:19 +0000126 clippedValue = 0; // Make some compilers, and mhahnenberg, happy.
mjs@apple.com0a661162014-09-08 02:16:47 +0000127#endif
fpizlo@apple.comf2b13502014-04-18 23:26:19 +0000128 break;
fpizlo@apple.com86e3d392014-04-18 23:20:00 +0000129 }
oliver@apple.comb9009142013-07-25 03:58:26 +0000130 jit.store32(AssemblyHelpers::TrustedImm32(-clippedValue), AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfJITExecuteCounter()));
131 jit.store32(AssemblyHelpers::TrustedImm32(activeThreshold), AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfJITExecutionActiveThreshold()));
fpizlo@apple.com86e3d392014-04-18 23:20:00 +0000132 jit.store32(AssemblyHelpers::TrustedImm32(formattedTotalExecutionCount(clippedValue)), AssemblyHelpers::Address(GPRInfo::regT0, CodeBlock::offsetOfJITExecutionTotalCount()));
oliver@apple.comb9009142013-07-25 03:58:26 +0000133
134 doneAdjusting.link(&jit);
135}
136
oliver@apple.comea771492013-07-25 03:58:38 +0000137void reifyInlinedCallFrames(CCallHelpers& jit, const OSRExitBase& exit)
oliver@apple.comb9009142013-07-25 03:58:26 +0000138{
oliver@apple.com5a24fdd2013-07-25 04:00:54 +0000139 ASSERT(jit.baselineCodeBlock()->jitType() == JITCode::BaselineJIT);
oliver@apple.comb9009142013-07-25 03:58:26 +0000140 jit.storePtr(AssemblyHelpers::TrustedImmPtr(jit.baselineCodeBlock()), AssemblyHelpers::addressFor((VirtualRegister)JSStack::CodeBlock));
oliver@apple.com7ddfce82013-07-25 04:01:59 +0000141
142 CodeOrigin codeOrigin;
143 for (codeOrigin = exit.m_codeOrigin; codeOrigin.inlineCallFrame; codeOrigin = codeOrigin.inlineCallFrame->caller) {
oliver@apple.comb9009142013-07-25 03:58:26 +0000144 InlineCallFrame* inlineCallFrame = codeOrigin.inlineCallFrame;
145 CodeBlock* baselineCodeBlock = jit.baselineCodeBlockFor(codeOrigin);
146 CodeBlock* baselineCodeBlockForCaller = jit.baselineCodeBlockFor(inlineCallFrame->caller);
mark.lam@apple.comca860af2014-10-06 22:17:09 +0000147 void* jumpTarget = nullptr;
fpizlo@apple.com4c6b8ad2014-07-22 21:08:50 +0000148 void* trueReturnPC = nullptr;
oliver@apple.comb9009142013-07-25 03:58:26 +0000149
fpizlo@apple.com4c6b8ad2014-07-22 21:08:50 +0000150 unsigned callBytecodeIndex = inlineCallFrame->caller.bytecodeIndex;
151
152 switch (inlineCallFrame->kind) {
153 case InlineCallFrame::Call:
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +0000154 case InlineCallFrame::Construct:
155 case InlineCallFrame::CallVarargs:
156 case InlineCallFrame::ConstructVarargs: {
fpizlo@apple.com4c6b8ad2014-07-22 21:08:50 +0000157 CallLinkInfo* callLinkInfo =
158 baselineCodeBlockForCaller->getCallLinkInfoForBytecodeIndex(callBytecodeIndex);
159 RELEASE_ASSERT(callLinkInfo);
160
msaboff@apple.com203a56e2015-06-24 22:37:30 +0000161 jumpTarget = callLinkInfo->callReturnLocation().executableAddress();
fpizlo@apple.com4c6b8ad2014-07-22 21:08:50 +0000162 break;
163 }
164
165 case InlineCallFrame::GetterCall:
166 case InlineCallFrame::SetterCall: {
167 StructureStubInfo* stubInfo =
168 baselineCodeBlockForCaller->findStubInfo(CodeOrigin(callBytecodeIndex));
169 RELEASE_ASSERT(stubInfo);
170
171 switch (inlineCallFrame->kind) {
172 case InlineCallFrame::GetterCall:
173 jumpTarget = jit.vm()->getCTIStub(baselineGetterReturnThunkGenerator).code().executableAddress();
174 break;
175 case InlineCallFrame::SetterCall:
176 jumpTarget = jit.vm()->getCTIStub(baselineSetterReturnThunkGenerator).code().executableAddress();
177 break;
178 default:
179 RELEASE_ASSERT_NOT_REACHED();
180 break;
181 }
182
183 trueReturnPC = stubInfo->callReturnLocation.labelAtOffset(
184 stubInfo->patch.deltaCallToDone).executableAddress();
185 break;
186 } }
oliver@apple.comb9009142013-07-25 03:58:26 +0000187
188 GPRReg callerFrameGPR;
189 if (inlineCallFrame->caller.inlineCallFrame) {
190 jit.addPtr(AssemblyHelpers::TrustedImm32(inlineCallFrame->caller.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister, GPRInfo::regT3);
191 callerFrameGPR = GPRInfo::regT3;
192 } else
193 callerFrameGPR = GPRInfo::callFrameRegister;
194
fpizlo@apple.com4c6b8ad2014-07-22 21:08:50 +0000195 jit.storePtr(AssemblyHelpers::TrustedImmPtr(jumpTarget), AssemblyHelpers::addressForByteOffset(inlineCallFrame->returnPCOffset()));
196 if (trueReturnPC)
197 jit.storePtr(AssemblyHelpers::TrustedImmPtr(trueReturnPC), AssemblyHelpers::addressFor(inlineCallFrame->stackOffset + virtualRegisterForArgument(inlineCallFrame->arguments.size()).offset()));
198
oliver@apple.comb9009142013-07-25 03:58:26 +0000199 jit.storePtr(AssemblyHelpers::TrustedImmPtr(baselineCodeBlock), AssemblyHelpers::addressFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::CodeBlock)));
fpizlo@apple.com8fefdd32015-02-18 19:55:47 +0000200 if (!inlineCallFrame->isVarargs())
201 jit.store32(AssemblyHelpers::TrustedImm32(inlineCallFrame->arguments.size()), AssemblyHelpers::payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::ArgumentCount)));
202#if USE(JSVALUE64)
mark.lam@apple.comc8151c42013-10-30 21:26:46 +0000203 jit.store64(callerFrameGPR, AssemblyHelpers::addressForByteOffset(inlineCallFrame->callerFrameOffset()));
saambarati1@gmail.com9137c0b2015-08-25 19:40:46 +0000204 uint32_t locationBits = CallSiteIndex(codeOrigin.bytecodeIndex).bits();
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000205 jit.store32(AssemblyHelpers::TrustedImm32(locationBits), AssemblyHelpers::tagFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::ArgumentCount)));
fpizlo@apple.coma62d4822013-10-06 04:22:43 +0000206 if (!inlineCallFrame->isClosureCall)
207 jit.store64(AssemblyHelpers::TrustedImm64(JSValue::encode(JSValue(inlineCallFrame->calleeConstant()))), AssemblyHelpers::addressFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::Callee)));
fpizlo@apple.com0e97f122013-10-07 14:36:49 +0000208#else // USE(JSVALUE64) // so this is the 32-bit part
mark.lam@apple.comc8151c42013-10-30 21:26:46 +0000209 jit.storePtr(callerFrameGPR, AssemblyHelpers::addressForByteOffset(inlineCallFrame->callerFrameOffset()));
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000210 Instruction* instruction = baselineCodeBlock->instructions().begin() + codeOrigin.bytecodeIndex;
saambarati1@gmail.com9137c0b2015-08-25 19:40:46 +0000211 uint32_t locationBits = CallSiteIndex(instruction).bits();
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000212 jit.store32(AssemblyHelpers::TrustedImm32(locationBits), AssemblyHelpers::tagFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::ArgumentCount)));
oliver@apple.comb9009142013-07-25 03:58:26 +0000213 jit.store32(AssemblyHelpers::TrustedImm32(JSValue::CellTag), AssemblyHelpers::tagFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::Callee)));
fpizlo@apple.coma62d4822013-10-06 04:22:43 +0000214 if (!inlineCallFrame->isClosureCall)
215 jit.storePtr(AssemblyHelpers::TrustedImmPtr(inlineCallFrame->calleeConstant()), AssemblyHelpers::payloadFor((VirtualRegister)(inlineCallFrame->stackOffset + JSStack::Callee)));
oliver@apple.comb9009142013-07-25 03:58:26 +0000216#endif // USE(JSVALUE64) // ending the #else part, so directly above is the 32-bit part
oliver@apple.comcf0e6c42013-07-25 04:01:45 +0000217 }
oliver@apple.com7ddfce82013-07-25 04:01:59 +0000218
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000219#if USE(JSVALUE64)
saambarati1@gmail.com9137c0b2015-08-25 19:40:46 +0000220 uint32_t locationBits = CallSiteIndex(codeOrigin.bytecodeIndex).bits();
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000221#else
222 Instruction* instruction = jit.baselineCodeBlock()->instructions().begin() + codeOrigin.bytecodeIndex;
saambarati1@gmail.com9137c0b2015-08-25 19:40:46 +0000223 uint32_t locationBits = CallSiteIndex(instruction).bits();
oliver@apple.comc4c9b8a2013-07-25 04:02:09 +0000224#endif
225 jit.store32(AssemblyHelpers::TrustedImm32(locationBits), AssemblyHelpers::tagFor((VirtualRegister)(JSStack::ArgumentCount)));
oliver@apple.comb9009142013-07-25 03:58:26 +0000226}
227
mhahnenberg@apple.com9a4c5292014-02-05 21:42:33 +0000228#if ENABLE(GGC)
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000229static void osrWriteBarrier(CCallHelpers& jit, GPRReg owner, GPRReg scratch)
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000230{
mark.lam@apple.com874eacf2014-11-05 01:19:37 +0000231 AssemblyHelpers::Jump ownerIsRememberedOrInEden = jit.jumpIfIsRememberedOrInEden(owner);
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000232
233 // We need these extra slots because setupArgumentsWithExecState will use poke on x86.
234#if CPU(X86)
235 jit.subPtr(MacroAssembler::TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
236#endif
237
238 jit.setupArgumentsWithExecState(owner);
mhahnenberg@apple.comb6f85192014-02-27 01:27:18 +0000239 jit.move(MacroAssembler::TrustedImmPtr(reinterpret_cast<void*>(operationOSRWriteBarrier)), scratch);
240 jit.call(scratch);
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000241
242#if CPU(X86)
243 jit.addPtr(MacroAssembler::TrustedImm32(sizeof(void*) * 3), MacroAssembler::stackPointerRegister);
244#endif
245
mark.lam@apple.com874eacf2014-11-05 01:19:37 +0000246 ownerIsRememberedOrInEden.link(&jit);
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000247}
mhahnenberg@apple.com9a4c5292014-02-05 21:42:33 +0000248#endif // ENABLE(GGC)
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000249
oliver@apple.comea771492013-07-25 03:58:38 +0000250void adjustAndJumpToTarget(CCallHelpers& jit, const OSRExitBase& exit)
oliver@apple.comb9009142013-07-25 03:58:26 +0000251{
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000252#if ENABLE(GGC)
mhahnenberg@apple.comb27e24a2014-06-13 22:18:52 +0000253 jit.move(AssemblyHelpers::TrustedImmPtr(jit.codeBlock()->ownerExecutable()), GPRInfo::nonArgGPR0);
254 osrWriteBarrier(jit, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1);
255 InlineCallFrameSet* inlineCallFrames = jit.codeBlock()->jitCode()->dfgCommon()->inlineCallFrames.get();
256 if (inlineCallFrames) {
257 for (InlineCallFrame* inlineCallFrame : *inlineCallFrames) {
258 ScriptExecutable* ownerExecutable = inlineCallFrame->executable.get();
259 jit.move(AssemblyHelpers::TrustedImmPtr(ownerExecutable), GPRInfo::nonArgGPR0);
260 osrWriteBarrier(jit, GPRInfo::nonArgGPR0, GPRInfo::nonArgGPR1);
261 }
mhahnenberg@apple.comb3eab8d2014-02-05 21:27:13 +0000262 }
263#endif
264
oliver@apple.comb9009142013-07-25 03:58:26 +0000265 if (exit.m_codeOrigin.inlineCallFrame)
266 jit.addPtr(AssemblyHelpers::TrustedImm32(exit.m_codeOrigin.inlineCallFrame->stackOffset * sizeof(EncodedJSValue)), GPRInfo::callFrameRegister);
267
268 CodeBlock* baselineCodeBlock = jit.baselineCodeBlockFor(exit.m_codeOrigin);
269 Vector<BytecodeAndMachineOffset>& decodedCodeMap = jit.decodedCodeMapFor(baselineCodeBlock);
270
271 BytecodeAndMachineOffset* mapping = binarySearch<BytecodeAndMachineOffset, unsigned>(decodedCodeMap, decodedCodeMap.size(), exit.m_codeOrigin.bytecodeIndex, BytecodeAndMachineOffset::getBytecodeIndex);
272
273 ASSERT(mapping);
274 ASSERT(mapping->m_bytecodeIndex == exit.m_codeOrigin.bytecodeIndex);
275
oliver@apple.com5a24fdd2013-07-25 04:00:54 +0000276 void* jumpTarget = baselineCodeBlock->jitCode()->executableAddressAtOffset(mapping->m_machineCodeOffset);
msaboff@apple.com95894332014-01-29 19:18:54 +0000277
278 jit.addPtr(AssemblyHelpers::TrustedImm32(JIT::stackPointerOffsetFor(baselineCodeBlock) * sizeof(Register)), GPRInfo::callFrameRegister, AssemblyHelpers::stackPointerRegister);
oliver@apple.comb9009142013-07-25 03:58:26 +0000279
msaboff@apple.com95894332014-01-29 19:18:54 +0000280 jit.jitAssertTagsInPlace();
281
oliver@apple.comb9009142013-07-25 03:58:26 +0000282 jit.move(AssemblyHelpers::TrustedImmPtr(jumpTarget), GPRInfo::regT2);
283 jit.jump(GPRInfo::regT2);
oliver@apple.comb9009142013-07-25 03:58:26 +0000284}
285
oliver@apple.comb9009142013-07-25 03:58:26 +0000286} } // namespace JSC::DFG
287
288#endif // ENABLE(DFG_JIT)
289