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