1635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project/* 2635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Copyright (C) 2008 Apple Inc. All rights reserved. 3635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 4635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * Redistribution and use in source and binary forms, with or without 5635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * modification, are permitted provided that the following conditions 6635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * are met: 7635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 8635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer. 9635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 10635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 11635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * documentation and/or other materials provided with the distribution. 12635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * 13635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project */ 25635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 26635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef JIT_h 27635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#define JIT_h 28635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 29635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Platform.h> 30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 31635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(JIT) 32635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// We've run into some problems where changing the size of the class JIT leads to 345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// performance fluctuations. Try forcing alignment in an attempt to stabalize this. 355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if COMPILER(GCC) 365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define JIT_CLASS_ALIGNMENT __attribute__ ((aligned (32))) 375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else 385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define JIT_CLASS_ALIGNMENT 395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif 40635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 41cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#define ASSERT_JIT_OFFSET(actual, expected) ASSERT_WITH_MESSAGE(actual == expected, "JIT Offset \"%s\" should be %d, not %d.\n", #expected, static_cast<int>(actual), static_cast<int>(expected)); 42cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CodeBlock.h" 44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h" 458f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JITCode.h" 468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include "JITStubs.h" 47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Opcode.h" 48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RegisterFile.h" 49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "MacroAssembler.h" 50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Profiler.h" 518f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <bytecode/SamplingTool.h> 52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/AlwaysInline.h> 53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <wtf/Vector.h> 54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC { 56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class CodeBlock; 585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian class JIT; 59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JSPropertyNameIterator; 60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class Interpreter; 61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class Register; 62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class RegisterFile; 63635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class ScopeChainNode; 64635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class StructureChain; 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct CallLinkInfo; 67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct Instruction; 68635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct OperandTypes; 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct PolymorphicAccessStructureList; 700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct SimpleJumpTable; 710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch struct StringJumpTable; 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct StructureStubInfo; 73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct CallRecord { 758f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian MacroAssembler::Call from; 76635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned bytecodeIndex; 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void* to; 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CallRecord() 80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian CallRecord(MacroAssembler::Call from, unsigned bytecodeIndex, void* to = 0) 84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : from(from) 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , bytecodeIndex(bytecodeIndex) 86635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , to(to) 87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct JumpTable { 92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MacroAssembler::Jump from; 93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned toBytecodeIndex; 94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JumpTable(MacroAssembler::Jump f, unsigned t) 96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : from(f) 97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , toBytecodeIndex(t) 98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct SlowCaseEntry { 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MacroAssembler::Jump from; 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned to; 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned hint; 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SlowCaseEntry(MacroAssembler::Jump f, unsigned t, unsigned h = 0) 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : from(f) 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , to(t) 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , hint(h) 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct SwitchRecord { 116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project enum Type { 117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Immediate, 118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Character, 119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project String 120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 122635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Type type; 123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project union { 125635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SimpleJumpTable* simpleJumpTable; 126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project StringJumpTable* stringJumpTable; 127635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } jumpTable; 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned bytecodeIndex; 130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned defaultOffset; 131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SwitchRecord(SimpleJumpTable* jumpTable, unsigned bytecodeIndex, unsigned defaultOffset, Type type) 133635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : type(type) 134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , bytecodeIndex(bytecodeIndex) 135635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , defaultOffset(defaultOffset) 136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project this->jumpTable.simpleJumpTable = jumpTable; 138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project SwitchRecord(StringJumpTable* jumpTable, unsigned bytecodeIndex, unsigned defaultOffset) 141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project : type(String) 142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , bytecodeIndex(bytecodeIndex) 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project , defaultOffset(defaultOffset) 144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project this->jumpTable.stringJumpTable = jumpTable; 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 149635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct PropertyStubCompilationInfo { 1508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian MacroAssembler::Call callReturnLocation; 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MacroAssembler::Label hotPathBegin; 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project struct StructureStubCompilationInfo { 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MacroAssembler::DataLabelPtr hotPathBegin; 1568f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian MacroAssembler::Call hotPathOther; 1578f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian MacroAssembler::Call callReturnLocation; 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian struct MethodCallCompilationInfo { 1615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian MethodCallCompilationInfo(unsigned propertyAccessIndex) 1625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian : propertyAccessIndex(propertyAccessIndex) 1635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 1645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 1655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 1665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian MacroAssembler::DataLabelPtr structureToCompare; 1675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned propertyAccessIndex; 168635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project }; 169635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // Near calls can only be patched to other JIT code, regular calls can be patched to JIT code or relinked to stub functions. 1710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void ctiPatchNearCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction); 1720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction); 1730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, FunctionPtr newCalleeFunction); 174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project class JIT : private MacroAssembler { 1765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian friend class JITStubCall; 1775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project using MacroAssembler::Jump; 179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project using MacroAssembler::JumpList; 180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project using MacroAssembler::Label; 181635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1828f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // NOTES: 1838f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // 1848f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // regT0 has two special meanings. The return value from a stub 1858f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // call will always be in regT0, and by default (unless 1868f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // a register is specified) emitPutVirtualRegister() will store 1878f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // the value from regT0. 1888f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // 1895f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // regT3 is required to be callee-preserved. 1905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian // 1918f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // tempRegister2 is has no such dependencies. It is important that 1928f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // on x86/x86-64 it is ecx for performance reasons, since the 1938f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // MacroAssembler will need to plant register swaps if it is not - 1948f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // however the code will still function correctly. 195d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86_64) 196231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID returnValueRegister = X86Registers::eax; 197231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID cachedResultRegister = X86Registers::eax; 198231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID firstArgumentRegister = X86Registers::edi; 199231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 200231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID timeoutCheckRegister = X86Registers::r12; 201231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID callFrameRegister = X86Registers::r13; 202231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID tagTypeNumberRegister = X86Registers::r14; 203231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID tagMaskRegister = X86Registers::r15; 204231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 205231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT0 = X86Registers::eax; 206231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT1 = X86Registers::edx; 207231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT2 = X86Registers::ecx; 208231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT3 = X86Registers::ebx; 209231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 210231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT0 = X86Registers::xmm0; 211231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT1 = X86Registers::xmm1; 212231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT2 = X86Registers::xmm2; 213d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(X86) 214231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID returnValueRegister = X86Registers::eax; 215231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID cachedResultRegister = X86Registers::eax; 2168f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // On x86 we always use fastcall conventions = but on 2178f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // OS X if might make more sense to just use regparm. 218231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID firstArgumentRegister = X86Registers::ecx; 219231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 220231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID timeoutCheckRegister = X86Registers::esi; 221231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID callFrameRegister = X86Registers::edi; 222231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 223231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT0 = X86Registers::eax; 224231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT1 = X86Registers::edx; 225231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT2 = X86Registers::ecx; 226231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT3 = X86Registers::ebx; 227231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 228231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT0 = X86Registers::xmm0; 229231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT1 = X86Registers::xmm1; 230231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT2 = X86Registers::xmm2; 231d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_THUMB2) 232231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID returnValueRegister = ARMRegisters::r0; 233231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID cachedResultRegister = ARMRegisters::r0; 234231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID firstArgumentRegister = ARMRegisters::r0; 235231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 236231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT0 = ARMRegisters::r0; 237231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT1 = ARMRegisters::r1; 238231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT2 = ARMRegisters::r2; 239231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT3 = ARMRegisters::r4; 240231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 241231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID callFrameRegister = ARMRegisters::r5; 242231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID timeoutCheckRegister = ARMRegisters::r6; 243231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 244231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT0 = ARMRegisters::d0; 245231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT1 = ARMRegisters::d1; 246231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT2 = ARMRegisters::d2; 247d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_TRADITIONAL) 248231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID returnValueRegister = ARMRegisters::r0; 249231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID cachedResultRegister = ARMRegisters::r0; 250231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID firstArgumentRegister = ARMRegisters::r0; 251231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 252231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID timeoutCheckRegister = ARMRegisters::r5; 253231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID callFrameRegister = ARMRegisters::r4; 254231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 255231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT0 = ARMRegisters::r0; 256231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT1 = ARMRegisters::r1; 257231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT2 = ARMRegisters::r2; 2580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Callee preserved 259231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regT3 = ARMRegisters::r7; 2600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 261231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regS0 = ARMRegisters::S0; 2620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Callee preserved 263231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regS1 = ARMRegisters::S1; 2640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 265231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regStackPtr = ARMRegisters::sp; 266231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const RegisterID regLink = ARMRegisters::lr; 2670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 268231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT0 = ARMRegisters::d0; 269231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT1 = ARMRegisters::d1; 270231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const FPRegisterID fpRegT2 = ARMRegisters::d2; 2718f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#else 2728f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian #error "JIT not supported on this platform." 273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 274635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 275635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const int patchGetByIdDefaultStructure = -1; 276635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Magic number - initial offset cannot be representable as a signed 8bit value, or the X86Assembler 277635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // will compress the displacement, and we may not be able to fit a patched offset. 278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static const int patchGetByIdDefaultOffset = 256; 279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 280635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project public: 281231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static JITCode compile(JSGlobalData* globalData, CodeBlock* codeBlock) 282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 283231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block return JIT(globalData, codeBlock).privateCompile(); 284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 285635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void compileGetByIdProto(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress) 287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 288635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 289635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompileGetByIdProto(stubInfo, structure, prototypeStructure, cachedOffset, returnAddress, callFrame); 290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 292635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static void compileGetByIdSelfList(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* polymorphicStructures, int currentIndex, Structure* structure, size_t cachedOffset) 293635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 294635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 295635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompileGetByIdSelfList(stubInfo, polymorphicStructures, currentIndex, structure, cachedOffset); 296635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 297635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static void compileGetByIdProtoList(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructureList, int currentIndex, Structure* structure, Structure* prototypeStructure, size_t cachedOffset) 298635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 299635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 300635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompileGetByIdProtoList(stubInfo, prototypeStructureList, currentIndex, structure, prototypeStructure, cachedOffset, callFrame); 301635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 302635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static void compileGetByIdChainList(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructureList, int currentIndex, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset) 303635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 304635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 305635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompileGetByIdChainList(stubInfo, prototypeStructureList, currentIndex, structure, chain, count, cachedOffset, callFrame); 306635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 307635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void compileGetByIdChain(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress) 309635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 310635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 311635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompileGetByIdChain(stubInfo, structure, chain, count, cachedOffset, returnAddress, callFrame); 312635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 313635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void compilePutByIdTransition(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress) 315635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 316635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 317635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project jit.privateCompilePutByIdTransition(stubInfo, oldStructure, newStructure, cachedOffset, chain, returnAddress); 318635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 319635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block static void compileCTIMachineTrampolines(JSGlobalData* globalData, RefPtr<ExecutablePool>* executablePool, TrampolineStructure *trampolines) 321635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 322635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData); 3238a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block jit.privateCompileCTIMachineTrampolines(executablePool, globalData, trampolines); 324635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 325635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void patchGetByIdSelf(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress); 3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void patchPutByIdReplace(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress); 3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void patchMethodCallProto(CodeBlock* codeblock, MethodCallLinkInfo&, JSFunction*, Structure*, JSObject*, ReturnAddressPtr); 329635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void compilePatchGetArrayLength(JSGlobalData* globalData, CodeBlock* codeBlock, ReturnAddressPtr returnAddress) 331635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 332635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT jit(globalData, codeBlock); 333635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return jit.privateCompilePatchGetArrayLength(returnAddress); 334635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 335635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static void linkCall(JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, JITCode&, CallLinkInfo*, int callerArgCount, JSGlobalData*); 337635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static void unlinkCall(CallLinkInfo*); 338635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 339635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project private: 3405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian struct JSRInfo { 3415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian DataLabelPtr storeLocation; 3425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Label target; 3435f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 3445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSRInfo(DataLabelPtr storeLocation, Label targetLocation) 3455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian : storeLocation(storeLocation) 3465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian , target(targetLocation) 3475f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian { 3485f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian } 3495f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian }; 3505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 351635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JIT(JSGlobalData*, CodeBlock* = 0); 352635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 353635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileMainPass(); 354635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileLinkPass(); 355635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileSlowCases(); 356231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block JITCode privateCompile(); 3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void privateCompileGetByIdProto(StructureStubInfo*, Structure*, Structure* prototypeStructure, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame); 358635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileGetByIdSelfList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, size_t cachedOffset); 359635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileGetByIdProtoList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, Structure* prototypeStructure, size_t cachedOffset, CallFrame* callFrame); 360635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void privateCompileGetByIdChainList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, StructureChain* chain, size_t count, size_t cachedOffset, CallFrame* callFrame); 3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void privateCompileGetByIdChain(StructureStubInfo*, Structure*, StructureChain*, size_t count, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame); 3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void privateCompilePutByIdTransition(StructureStubInfo*, Structure*, Structure*, size_t cachedOffset, StructureChain*, ReturnAddressPtr returnAddress); 363635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 3648a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block void privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* data, TrampolineStructure *trampolines); 3650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void privateCompilePatchGetArrayLength(ReturnAddressPtr returnAddress); 366635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 367635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void addSlowCase(Jump); 3680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void addSlowCase(JumpList); 369635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void addJump(Jump, int); 370635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitJumpSlowToHot(Jump, int); 371635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 372635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpCall(OpcodeID, Instruction* instruction, unsigned callLinkInfoIndex); 3735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void compileOpCallVarargs(Instruction* instruction); 374635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpCallInitializeCallFrame(); 375635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpCallSetupArgs(Instruction*); 3765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void compileOpCallVarargsSetupArgs(Instruction*); 377635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned callLinkInfoIndex, OpcodeID opcodeID); 3785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter); 379635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpConstructSetupArgs(Instruction*); 3800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 381635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project enum CompileOpStrictEqType { OpStrictEq, OpNStrictEq }; 382635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void compileOpStrictEq(Instruction* instruction, CompileOpStrictEqType type); 383231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block bool isOperandConstantImmediateDouble(unsigned src); 384231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 385231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void emitLoadDouble(unsigned index, FPRegisterID value); 386231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void emitLoadInt32ToDouble(unsigned index, FPRegisterID value); 387231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 388231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Address addressFor(unsigned index, RegisterID base = callFrameRegister); 389635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 390cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void testPrototype(Structure*, JumpList& failureCases); 391cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 3920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 3930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Address tagFor(unsigned index, RegisterID base = callFrameRegister); 3940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Address payloadFor(unsigned index, RegisterID base = callFrameRegister); 3950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getOperandConstantImmediateInt(unsigned op1, unsigned op2, unsigned& op, int32_t& constant); 3970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 3980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitLoadTag(unsigned index, RegisterID tag); 3990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitLoadPayload(unsigned index, RegisterID payload); 4000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitLoad(const JSValue& v, RegisterID tag, RegisterID payload); 4020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitLoad(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister); 4030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitLoad2(unsigned index1, RegisterID tag1, RegisterID payload1, unsigned index2, RegisterID tag2, RegisterID payload2); 4040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStore(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister); 4060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStore(unsigned index, const JSValue constant, RegisterID base = callFrameRegister); 4070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStoreInt32(unsigned index, RegisterID payload, bool indexIsInt32 = false); 4080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStoreInt32(unsigned index, Imm32 payload, bool indexIsInt32 = false); 4090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStoreCell(unsigned index, RegisterID payload, bool indexIsCell = false); 4100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStoreBool(unsigned index, RegisterID tag, bool indexIsBool = false); 4110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitStoreDouble(unsigned index, FPRegisterID value); 4120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isLabeled(unsigned bytecodeIndex); 4140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void map(unsigned bytecodeIndex, unsigned virtualRegisterIndex, RegisterID tag, RegisterID payload); 4150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void unmap(RegisterID); 4160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void unmap(); 4170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool isMapped(unsigned virtualRegisterIndex); 4180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getMappedPayload(unsigned virtualRegisterIndex, RegisterID& payload); 4190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch bool getMappedTag(unsigned virtualRegisterIndex, RegisterID& tag); 4200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex); 4220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex, RegisterID tag); 4230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, unsigned virtualRegisterIndex); 4240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) 4260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetByIdHotPath(); 4270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false); 4280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 4290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, Structure* structure, size_t cachedOffset); 4300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID resultTag, RegisterID resultPayload, size_t cachedOffset); 431cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, RegisterID structure, RegisterID offset); 4320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compilePutDirectOffset(RegisterID base, RegisterID valueTag, RegisterID valuePayload, Structure* structure, size_t cachedOffset); 4330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // Arithmetic opcode helpers 4350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitAdd32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType); 4360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSub32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType); 4370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitBinaryDoubleOp(OpcodeID, unsigned dst, unsigned op1, unsigned op2, OperandTypes, JumpList& notInt32Op1, JumpList& notInt32Op2, bool op1IsInRegisters = true, bool op2IsInRegisters = true); 4380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 439d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86) 4400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_put_by_id. 4410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdStructure = 7; 4420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdExternalLoad = 13; 4430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthPutByIdExternalLoad = 3; 4440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdPropertyMapOffset1 = 22; 4450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdPropertyMapOffset2 = 28; 4460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_get_by_id. 4470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdStructure = 7; 4480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdBranchToSlowCase = 13; 4490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdExternalLoad = 13; 4500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthGetByIdExternalLoad = 3; 4510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPropertyMapOffset1 = 22; 4520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPropertyMapOffset2 = 28; 4530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPutResult = 28; 4540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING) && USE(JIT_STUB_ARGUMENT_VA_LIST) 4550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 35; 4560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#elif ENABLE(OPCODE_SAMPLING) 4570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 37; 4580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#elif USE(JIT_STUB_ARGUMENT_VA_LIST) 4590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 25; 4600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 4610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 27; 4620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 4630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetOpCallCompareToJump = 6; 4640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 4650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoObj = 11; 4660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoStruct = 18; 4670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckPutFunction = 29; 468d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_TRADITIONAL) 469643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // These architecture specific value are used to enable patching - see comment on op_put_by_id. 470643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetPutByIdStructure = 4; 471643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetPutByIdExternalLoad = 16; 472643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchLengthPutByIdExternalLoad = 4; 473643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetPutByIdPropertyMapOffset1 = 20; 474643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetPutByIdPropertyMapOffset2 = 28; 475643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // These architecture specific value are used to enable patching - see comment on op_get_by_id. 476643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdStructure = 4; 477643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdBranchToSlowCase = 16; 478643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdExternalLoad = 16; 479643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchLengthGetByIdExternalLoad = 4; 480643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdPropertyMapOffset1 = 20; 481643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdPropertyMapOffset2 = 28; 482643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdPutResult = 36; 483643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(OPCODE_SAMPLING) 484643ca7872b450ea4efacab6188849e5aac2ba161Steve Block #error "OPCODE_SAMPLING is not yet supported" 485643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else 486643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetGetByIdSlowCaseCall = 32; 487643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif 488643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetOpCallCompareToJump = 12; 489643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 490643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetMethodCheckProtoObj = 12; 491643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetMethodCheckProtoStruct = 20; 492643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int patchOffsetMethodCheckPutFunction = 32; 493643ca7872b450ea4efacab6188849e5aac2ba161Steve Block 494643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // sequenceOpCall 495643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceOpCallInstructionSpace = 12; 496643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceOpCallConstantSpace = 2; 497643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // sequenceMethodCheck 498643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceMethodCheckInstructionSpace = 40; 499643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceMethodCheckConstantSpace = 6; 500643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // sequenceGetByIdHotPath 501643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceGetByIdHotPathInstructionSpace = 36; 502643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceGetByIdHotPathConstantSpace = 4; 503643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // sequenceGetByIdSlowCase 504643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceGetByIdSlowCaseInstructionSpace = 40; 505643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequenceGetByIdSlowCaseConstantSpace = 2; 506643ca7872b450ea4efacab6188849e5aac2ba161Steve Block // sequencePutById 507643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequencePutByIdInstructionSpace = 36; 508643ca7872b450ea4efacab6188849e5aac2ba161Steve Block static const int sequencePutByIdConstantSpace = 4; 5090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 5100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#error "JSVALUE32_64 not supported on this platform." 5110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 5120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else // USE(JSVALUE32_64) 5140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitGetVirtualRegister(int src, RegisterID dst); 5150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2); 5160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitPutVirtualRegister(unsigned dst, RegisterID from = regT0); 5170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int32_t getConstantOperandImmediateInt(unsigned src); 5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitGetVariableObjectRegister(RegisterID variableObject, int index, RegisterID dst); 5210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitPutVariableObjectRegister(RegisterID src, RegisterID variableObject, int index); 5220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void killLastResultRegister(); 5240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Jump emitJumpIfJSCell(RegisterID); 5260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Jump emitJumpIfBothJSCells(RegisterID, RegisterID, RegisterID); 5270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfJSCell(RegisterID); 5280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Jump emitJumpIfNotJSCell(RegisterID); 5290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotJSCell(RegisterID); 5300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotJSCell(RegisterID, int VReg); 5310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE64) 5320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfImmediateNumber(RegisterID); 5330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfNotImmediateNumber(RegisterID); 5340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 5350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfImmediateNumber(RegisterID reg) 5360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 5370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return emitJumpIfImmediateInteger(reg); 5380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfNotImmediateNumber(RegisterID reg) 5410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch { 5420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch return emitJumpIfNotImmediateInteger(reg); 5430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } 5440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 5450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfImmediateInteger(RegisterID); 5460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfNotImmediateInteger(RegisterID); 5470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch JIT::Jump emitJumpIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); 5480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotImmediateInteger(RegisterID); 549231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void emitJumpSlowCaseIfNotImmediateNumber(RegisterID); 5500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitJumpSlowCaseIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID); 5510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if !USE(JSVALUE64) 5530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitFastArithDeTagImmediate(RegisterID); 5540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch Jump emitFastArithDeTagImmediateJumpIfZero(RegisterID); 5550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 5560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitFastArithReTagImmediate(RegisterID src, RegisterID dest); 5570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitFastArithImmToInt(RegisterID); 5580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest); 5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitTagAsBoolImmediate(RegisterID reg); 5610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileBinaryArithOp(OpcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi); 562231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if USE(JSVALUE64) 563231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes, bool op1HasImmediateIntFastCase, bool op2HasImmediateIntFastCase); 564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes); 566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 5670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 5680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS) 5690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetByIdHotPath(int resultVReg, int baseVReg, Identifier* ident, unsigned propertyAccessInstructionIndex); 5700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false); 5710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 5725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void compileGetDirectOffset(RegisterID base, RegisterID result, Structure* structure, size_t cachedOffset); 5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void compileGetDirectOffset(JSObject* base, RegisterID temp, RegisterID result, size_t cachedOffset); 574cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void compileGetDirectOffset(RegisterID base, RegisterID result, RegisterID structure, RegisterID offset, RegisterID scratch); 5755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void compilePutDirectOffset(RegisterID base, RegisterID value, Structure* structure, size_t cachedOffset); 5765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 577d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86_64) 5780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_put_by_id. 5790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdStructure = 10; 5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdExternalLoad = 20; 5810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthPutByIdExternalLoad = 4; 5820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdPropertyMapOffset = 31; 5830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_get_by_id. 5840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdStructure = 10; 5850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdBranchToSlowCase = 20; 5860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdExternalLoad = 20; 5870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthGetByIdExternalLoad = 4; 5880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPropertyMapOffset = 31; 5890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPutResult = 31; 5900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING) 591231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdSlowCaseCall = 64; 5920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 5930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 41; 5940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 5950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetOpCallCompareToJump = 9; 5965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 5970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoObj = 20; 5980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoStruct = 30; 5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckPutFunction = 50; 600d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(X86) 6010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_put_by_id. 6020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdStructure = 7; 6030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdExternalLoad = 13; 6040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthPutByIdExternalLoad = 3; 6050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdPropertyMapOffset = 22; 6060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_get_by_id. 6070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdStructure = 7; 6080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdBranchToSlowCase = 13; 6090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdExternalLoad = 13; 6100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthGetByIdExternalLoad = 3; 6110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPropertyMapOffset = 22; 6120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdPutResult = 22; 6130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING) && USE(JIT_STUB_ARGUMENT_VA_LIST) 6140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 31; 6150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#elif ENABLE(OPCODE_SAMPLING) 6160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 33; 6170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#elif USE(JIT_STUB_ARGUMENT_VA_LIST) 6180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 21; 6190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 6200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 23; 6210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 6220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetOpCallCompareToJump = 6; 6235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 6240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoObj = 11; 6250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckProtoStruct = 18; 6260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetMethodCheckPutFunction = 29; 627d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_THUMB2) 6280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_put_by_id. 6290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetPutByIdStructure = 10; 630cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetPutByIdExternalLoad = 26; 6310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthPutByIdExternalLoad = 12; 632cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetPutByIdPropertyMapOffset = 46; 6330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch // These architecture specific value are used to enable patching - see comment on op_get_by_id. 6340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdStructure = 10; 635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetGetByIdBranchToSlowCase = 26; 636cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetGetByIdExternalLoad = 26; 6370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchLengthGetByIdExternalLoad = 12; 638cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetGetByIdPropertyMapOffset = 46; 639cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetGetByIdPutResult = 50; 6400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING) 6410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE 6420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 6430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch static const int patchOffsetGetByIdSlowCaseCall = 28; 6440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 645cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetOpCallCompareToJump = 16; 6465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 647cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetMethodCheckProtoObj = 24; 648cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetMethodCheckProtoStruct = 34; 649cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetMethodCheckPutFunction = 58; 650d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_TRADITIONAL) 651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // These architecture specific value are used to enable patching - see comment on op_put_by_id. 652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetPutByIdStructure = 4; 653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetPutByIdExternalLoad = 16; 654231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchLengthPutByIdExternalLoad = 4; 655231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetPutByIdPropertyMapOffset = 20; 656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // These architecture specific value are used to enable patching - see comment on op_get_by_id. 657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdStructure = 4; 658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdBranchToSlowCase = 16; 659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdExternalLoad = 16; 660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchLengthGetByIdExternalLoad = 4; 661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdPropertyMapOffset = 20; 662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetGetByIdPutResult = 28; 663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING) 664231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block #error "OPCODE_SAMPLING is not yet supported" 665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 666cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int patchOffsetGetByIdSlowCaseCall = 28; 667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 668231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetOpCallCompareToJump = 12; 669231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 670231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetMethodCheckProtoObj = 12; 671231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetMethodCheckProtoStruct = 20; 672231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int patchOffsetMethodCheckPutFunction = 32; 6730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 674231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // sequenceOpCall 675231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceOpCallInstructionSpace = 12; 676231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceOpCallConstantSpace = 2; 677231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // sequenceMethodCheck 678231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceMethodCheckInstructionSpace = 40; 679231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceMethodCheckConstantSpace = 6; 680231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // sequenceGetByIdHotPath 681231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceGetByIdHotPathInstructionSpace = 28; 682231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceGetByIdHotPathConstantSpace = 3; 683231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // sequenceGetByIdSlowCase 684cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block static const int sequenceGetByIdSlowCaseInstructionSpace = 32; 685231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequenceGetByIdSlowCaseConstantSpace = 2; 686231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // sequencePutById 687231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequencePutByIdInstructionSpace = 28; 688231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block static const int sequencePutByIdConstantSpace = 3; 689231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 690643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // USE(JSVALUE32_64) 691231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 692231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL 693231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define BEGIN_UNINTERRUPTED_SEQUENCE(name) beginUninterruptedSequence(name ## InstructionSpace, name ## ConstantSpace) 694231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define END_UNINTERRUPTED_SEQUENCE(name) endUninterruptedSequence(name ## InstructionSpace, name ## ConstantSpace) 695231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 696231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void beginUninterruptedSequence(int, int); 697231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void endUninterruptedSequence(int, int); 698231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 699231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else 700231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define BEGIN_UNINTERRUPTED_SEQUENCE(name) 701231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#define END_UNINTERRUPTED_SEQUENCE(name) 702231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 703231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 7040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_add(Instruction*); 7050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_bitand(Instruction*); 7060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_bitnot(Instruction*); 7070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_bitor(Instruction*); 7080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_bitxor(Instruction*); 7095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_call(Instruction*); 7105f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_call_eval(Instruction*); 7115f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_call_varargs(Instruction*); 7120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_catch(Instruction*); 7135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_construct(Instruction*); 7140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_construct_verify(Instruction*); 7150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_convert_this(Instruction*); 7160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_create_arguments(Instruction*); 7170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_debug(Instruction*); 7180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_del_by_id(Instruction*); 7190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_div(Instruction*); 7200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_end(Instruction*); 7210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_enter(Instruction*); 7220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_enter_with_activation(Instruction*); 7230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_eq(Instruction*); 7240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_eq_null(Instruction*); 7250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_get_by_id(Instruction*); 7260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_get_by_val(Instruction*); 727cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void emit_op_get_by_pname(Instruction*); 7285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_get_global_var(Instruction*); 7295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_get_scoped_var(Instruction*); 7300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_init_arguments(Instruction*); 7310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_instanceof(Instruction*); 7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_jeq_null(Instruction*); 7330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_jfalse(Instruction*); 7340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_jmp(Instruction*); 7350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_jmp_scopes(Instruction*); 7365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_jneq_null(Instruction*); 7375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_jneq_ptr(Instruction*); 7380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_jnless(Instruction*); 739643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void emit_op_jless(Instruction*); 7400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_jnlesseq(Instruction*); 7415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_jsr(Instruction*); 7425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_jtrue(Instruction*); 7430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_load_varargs(Instruction*); 7440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_loop(Instruction*); 7450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_loop_if_less(Instruction*); 7460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_loop_if_lesseq(Instruction*); 7470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_loop_if_true(Instruction*); 748643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void emit_op_loop_if_false(Instruction*); 7490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_lshift(Instruction*); 7500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_method_check(Instruction*); 7510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_mod(Instruction*); 7520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_mov(Instruction*); 7530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_mul(Instruction*); 7540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_negate(Instruction*); 7555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_neq(Instruction*); 7560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_neq_null(Instruction*); 7570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_new_array(Instruction*); 7580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_new_error(Instruction*); 7590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_new_func(Instruction*); 7600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_new_func_exp(Instruction*); 7610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_new_object(Instruction*); 7625f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_new_regexp(Instruction*); 763cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void emit_op_get_pnames(Instruction*); 7645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_next_pname(Instruction*); 7650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_not(Instruction*); 7665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_nstricteq(Instruction*); 7670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_pop_scope(Instruction*); 7680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_post_dec(Instruction*); 7690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_post_inc(Instruction*); 7700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_pre_dec(Instruction*); 7710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_pre_inc(Instruction*); 7720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_profile_did_call(Instruction*); 7730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_profile_will_call(Instruction*); 7745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_push_new_scope(Instruction*); 7750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_push_scope(Instruction*); 7760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_by_id(Instruction*); 7770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_by_index(Instruction*); 7780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_by_val(Instruction*); 7790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_getter(Instruction*); 7800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_global_var(Instruction*); 7810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_scoped_var(Instruction*); 7820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_put_setter(Instruction*); 7830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_resolve(Instruction*); 7840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_resolve_base(Instruction*); 7850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_resolve_global(Instruction*); 7860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_resolve_skip(Instruction*); 7870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_resolve_with_base(Instruction*); 7880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_ret(Instruction*); 7890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_rshift(Instruction*); 7900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_sret(Instruction*); 7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_strcat(Instruction*); 7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_stricteq(Instruction*); 7930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_sub(Instruction*); 7945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_switch_char(Instruction*); 7950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_switch_imm(Instruction*); 7965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emit_op_switch_string(Instruction*); 7970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_tear_off_activation(Instruction*); 7980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_tear_off_arguments(Instruction*); 7990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_throw(Instruction*); 8000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_to_jsnumber(Instruction*); 8010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_to_primitive(Instruction*); 8020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emit_op_unexpected_load(Instruction*); 8038a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#if ENABLE(JIT_OPTIMIZE_MOD) 8048a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block void softModulo(); 8058a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif 8065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_add(Instruction*, Vector<SlowCaseEntry>::iterator&); 8080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_bitand(Instruction*, Vector<SlowCaseEntry>::iterator&); 8090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_bitnot(Instruction*, Vector<SlowCaseEntry>::iterator&); 8100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_bitor(Instruction*, Vector<SlowCaseEntry>::iterator&); 8110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_bitxor(Instruction*, Vector<SlowCaseEntry>::iterator&); 8120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_call(Instruction*, Vector<SlowCaseEntry>::iterator&); 8130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_call_eval(Instruction*, Vector<SlowCaseEntry>::iterator&); 8140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_call_varargs(Instruction*, Vector<SlowCaseEntry>::iterator&); 8150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_construct(Instruction*, Vector<SlowCaseEntry>::iterator&); 8165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_construct_verify(Instruction*, Vector<SlowCaseEntry>::iterator&); 8170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_convert_this(Instruction*, Vector<SlowCaseEntry>::iterator&); 8180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_div(Instruction*, Vector<SlowCaseEntry>::iterator&); 8190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_eq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_get_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); 8215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_get_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&); 822cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block void emitSlow_op_get_by_pname(Instruction*, Vector<SlowCaseEntry>::iterator&); 8230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_instanceof(Instruction*, Vector<SlowCaseEntry>::iterator&); 8240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_jfalse(Instruction*, Vector<SlowCaseEntry>::iterator&); 8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_jnless(Instruction*, Vector<SlowCaseEntry>::iterator&); 826643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void emitSlow_op_jless(Instruction*, Vector<SlowCaseEntry>::iterator&); 8270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_jnlesseq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_jtrue(Instruction*, Vector<SlowCaseEntry>::iterator&); 8295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_loop_if_less(Instruction*, Vector<SlowCaseEntry>::iterator&); 8305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_loop_if_lesseq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_loop_if_true(Instruction*, Vector<SlowCaseEntry>::iterator&); 832643ca7872b450ea4efacab6188849e5aac2ba161Steve Block void emitSlow_op_loop_if_false(Instruction*, Vector<SlowCaseEntry>::iterator&); 8330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_lshift(Instruction*, Vector<SlowCaseEntry>::iterator&); 8340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&); 8350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&); 8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_mul(Instruction*, Vector<SlowCaseEntry>::iterator&); 8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_negate(Instruction*, Vector<SlowCaseEntry>::iterator&); 8385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_neq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_not(Instruction*, Vector<SlowCaseEntry>::iterator&); 8405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_nstricteq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_post_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); 8420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_post_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); 8430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_pre_dec(Instruction*, Vector<SlowCaseEntry>::iterator&); 8440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_pre_inc(Instruction*, Vector<SlowCaseEntry>::iterator&); 8450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&); 8460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&); 8470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_resolve_global(Instruction*, Vector<SlowCaseEntry>::iterator&); 8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_rshift(Instruction*, Vector<SlowCaseEntry>::iterator&); 8490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_stricteq(Instruction*, Vector<SlowCaseEntry>::iterator&); 8500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_sub(Instruction*, Vector<SlowCaseEntry>::iterator&); 8515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitSlow_op_to_jsnumber(Instruction*, Vector<SlowCaseEntry>::iterator&); 8520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitSlow_op_to_primitive(Instruction*, Vector<SlowCaseEntry>::iterator&); 8535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 8540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch /* These functions are deprecated: Please use JITStubCall instead. */ 855635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutJITStubArg(RegisterID src, unsigned argumentNumber); 8560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 857231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block void emitPutJITStubArg(RegisterID tag, RegisterID payload, unsigned argumentNumber); 8580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch1, RegisterID scratch2); 8590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 860635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutJITStubArgFromVirtualRegister(unsigned src, unsigned argumentNumber, RegisterID scratch); 8610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 862635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutJITStubArgConstant(unsigned value, unsigned argumentNumber); 863635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutJITStubArgConstant(void* value, unsigned argumentNumber); 864635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitGetJITStubArg(unsigned argumentNumber, RegisterID dst); 865635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 866635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitInitRegister(unsigned dst); 867635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 868635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry entry); 869635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void emitPutImmediateToCallFrameHeader(void* value, RegisterFile::CallFrameHeaderEntry entry); 8705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitGetFromCallFrameHeaderPtr(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from = callFrameRegister); 8715f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitGetFromCallFrameHeader32(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from = callFrameRegister); 872635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8735f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian JSValue getConstantOperand(unsigned src); 874635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project bool isOperandConstantImmediateInt(unsigned src); 875635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 876635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Jump getSlowCase(Vector<SlowCaseEntry>::iterator& iter) 877635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 878635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return iter++->from; 879635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 880635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void linkSlowCase(Vector<SlowCaseEntry>::iterator& iter) 881635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project { 882635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project iter->from.link(this); 883635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ++iter; 884635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 885635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, int vReg); 886635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 887635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Jump checkStructure(RegisterID reg, Structure* structure); 888635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 889635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void restoreArgumentReference(); 890635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void restoreArgumentReferenceForTrampoline(); 891635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8925f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Call emitNakedCall(CodePtr function = CodePtr()); 8930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch 8940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch void preserveReturnAddressAfterCall(RegisterID); 8955f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void restoreReturnAddressBeforeReturn(RegisterID); 8965f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void restoreReturnAddressBeforeReturn(Address); 897635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 8988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian void emitTimeoutCheck(); 899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG 900635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void printBytecodeOperandTypes(unsigned src1, unsigned src2); 901635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 902635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 9035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SAMPLING_FLAGS) 9045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void setSamplingFlag(int32_t); 9055f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void clearSamplingFlag(int32_t); 906635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 9075f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 9085f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SAMPLING_COUNTERS) 9095f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void emitCount(AbstractSamplingCounter&, uint32_t = 1); 910635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 911635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(OPCODE_SAMPLING) 9135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void sampleInstruction(Instruction*, bool = false); 914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 9155f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 9165f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(CODEBLOCK_SAMPLING) 9175f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void sampleCodeBlock(CodeBlock*); 918635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else 9195f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian void sampleCodeBlock(CodeBlock*) {} 920635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif 921635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 922635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Interpreter* m_interpreter; 923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project JSGlobalData* m_globalData; 924635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project CodeBlock* m_codeBlock; 925635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 926635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<CallRecord> m_calls; 927635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<Label> m_labels; 928635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<PropertyStubCompilationInfo> m_propertyAccessCompilationInfo; 929635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<StructureStubCompilationInfo> m_callStructureStubCompilationInfo; 9305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian Vector<MethodCallCompilationInfo> m_methodCallCompilationInfo; 931635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<JumpTable> m_jmpTable; 932635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 933635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project unsigned m_bytecodeIndex; 934635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<JSRInfo> m_jsrSites; 935635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<SlowCaseEntry> m_slowCases; 936635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project Vector<SwitchRecord> m_switches; 937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 9385f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned m_propertyAccessInstructionIndex; 9395f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned m_globalResolveInfoIndex; 9405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian unsigned m_callLinkInfoIndex; 9415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian 9420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64) 9430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch unsigned m_jumpTargetIndex; 9440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch unsigned m_mappedBytecodeIndex; 9450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch unsigned m_mappedVirtualRegisterIndex; 9460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RegisterID m_mappedTag; 9470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch RegisterID m_mappedPayload; 9480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else 9490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch int m_lastResultBytecodeRegister; 9500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch unsigned m_jumpTargetsPosition; 9510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif 952231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block 953231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG 954231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL 955231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block Label m_uninterruptedInstructionSequenceBegin; 956231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block int m_uninterruptedConstantSequenceBegin; 957231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 958231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif 9590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch } JIT_CLASS_ALIGNMENT; 960d0825bca7fe65beaee391d30da42e937db621564Steve Block 961d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emit_op_loop(Instruction* currentInstruction) 962d0825bca7fe65beaee391d30da42e937db621564Steve Block { 963d0825bca7fe65beaee391d30da42e937db621564Steve Block emitTimeoutCheck(); 964d0825bca7fe65beaee391d30da42e937db621564Steve Block emit_op_jmp(currentInstruction); 965d0825bca7fe65beaee391d30da42e937db621564Steve Block } 966d0825bca7fe65beaee391d30da42e937db621564Steve Block 967d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emit_op_loop_if_true(Instruction* currentInstruction) 968d0825bca7fe65beaee391d30da42e937db621564Steve Block { 969d0825bca7fe65beaee391d30da42e937db621564Steve Block emitTimeoutCheck(); 970d0825bca7fe65beaee391d30da42e937db621564Steve Block emit_op_jtrue(currentInstruction); 971d0825bca7fe65beaee391d30da42e937db621564Steve Block } 972d0825bca7fe65beaee391d30da42e937db621564Steve Block 973d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 974d0825bca7fe65beaee391d30da42e937db621564Steve Block { 975d0825bca7fe65beaee391d30da42e937db621564Steve Block emitSlow_op_jtrue(currentInstruction, iter); 976d0825bca7fe65beaee391d30da42e937db621564Steve Block } 977d0825bca7fe65beaee391d30da42e937db621564Steve Block 978d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emit_op_loop_if_false(Instruction* currentInstruction) 979d0825bca7fe65beaee391d30da42e937db621564Steve Block { 980d0825bca7fe65beaee391d30da42e937db621564Steve Block emitTimeoutCheck(); 981d0825bca7fe65beaee391d30da42e937db621564Steve Block emit_op_jfalse(currentInstruction); 982d0825bca7fe65beaee391d30da42e937db621564Steve Block } 983d0825bca7fe65beaee391d30da42e937db621564Steve Block 984d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emitSlow_op_loop_if_false(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 985d0825bca7fe65beaee391d30da42e937db621564Steve Block { 986d0825bca7fe65beaee391d30da42e937db621564Steve Block emitSlow_op_jfalse(currentInstruction, iter); 987d0825bca7fe65beaee391d30da42e937db621564Steve Block } 988d0825bca7fe65beaee391d30da42e937db621564Steve Block 989d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emit_op_loop_if_less(Instruction* currentInstruction) 990d0825bca7fe65beaee391d30da42e937db621564Steve Block { 991d0825bca7fe65beaee391d30da42e937db621564Steve Block emitTimeoutCheck(); 992d0825bca7fe65beaee391d30da42e937db621564Steve Block emit_op_jless(currentInstruction); 993d0825bca7fe65beaee391d30da42e937db621564Steve Block } 994d0825bca7fe65beaee391d30da42e937db621564Steve Block 995d0825bca7fe65beaee391d30da42e937db621564Steve Block inline void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter) 996d0825bca7fe65beaee391d30da42e937db621564Steve Block { 997d0825bca7fe65beaee391d30da42e937db621564Steve Block emitSlow_op_jless(currentInstruction, iter); 998d0825bca7fe65beaee391d30da42e937db621564Steve Block } 999d0825bca7fe65beaee391d30da42e937db621564Steve Block 10000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace JSC 1001635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1002635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // ENABLE(JIT) 1003635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1004635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // JIT_h 1005