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#if ENABLE(JIT)
30635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
315f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// We've run into some problems where changing the size of the class JIT leads to
325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian// performance fluctuations.  Try forcing alignment in an attempt to stabalize this.
335f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if COMPILER(GCC)
345f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define JIT_CLASS_ALIGNMENT __attribute__ ((aligned (32)))
355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#else
365f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#define JIT_CLASS_ALIGNMENT
375f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#endif
38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
3981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#define ASSERT_JIT_OFFSET(actual, expected) ASSERT_WITH_MESSAGE(actual == expected, "JIT Offset \"%s\" should be %d, not %d.\n", #expected, static_cast<int>(expected), static_cast<int>(actual));
40cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#include "CodeBlock.h"
42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Interpreter.h"
4321939df44de1705786c545cd1bf519d47250322dBen Murdoch#include "JSInterfaceJIT.h"
44635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Opcode.h"
45635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "Profiler.h"
468f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian#include <bytecode/SamplingTool.h>
47635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectnamespace JSC {
49635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
50635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class CodeBlock;
515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    class JIT;
52635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class JSPropertyNameIterator;
53635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Interpreter;
54635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class Register;
55635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class RegisterFile;
56635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class ScopeChainNode;
57635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    class StructureChain;
58635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
59635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct CallLinkInfo;
60635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct Instruction;
61635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct OperandTypes;
62635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct PolymorphicAccessStructureList;
630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    struct SimpleJumpTable;
640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    struct StringJumpTable;
65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct StructureStubInfo;
66635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
67635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct CallRecord {
688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        MacroAssembler::Call from;
69e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned bytecodeOffset;
70635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void* to;
71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CallRecord()
73635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
74635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
76e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CallRecord(MacroAssembler::Call from, unsigned bytecodeOffset, void* to = 0)
77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : from(from)
78e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            , bytecodeOffset(bytecodeOffset)
79635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , to(to)
80635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
82635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
84635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct JumpTable {
85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        MacroAssembler::Jump from;
86e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned toBytecodeOffset;
87635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
88635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JumpTable(MacroAssembler::Jump f, unsigned t)
89635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : from(f)
90e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            , toBytecodeOffset(t)
91635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
92635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
93635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
94635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
95635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct SlowCaseEntry {
96635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        MacroAssembler::Jump from;
97635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned to;
98635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned hint;
99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        SlowCaseEntry(MacroAssembler::Jump f, unsigned t, unsigned h = 0)
101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : from(f)
102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , to(t)
103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , hint(h)
104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct SwitchRecord {
109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        enum Type {
110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Immediate,
111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            Character,
112635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            String
113635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        };
114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Type type;
116635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        union {
118635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            SimpleJumpTable* simpleJumpTable;
119635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            StringJumpTable* stringJumpTable;
120635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        } jumpTable;
121635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
122e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned bytecodeOffset;
123635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        unsigned defaultOffset;
124635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
125e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        SwitchRecord(SimpleJumpTable* jumpTable, unsigned bytecodeOffset, unsigned defaultOffset, Type type)
126635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : type(type)
127e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            , bytecodeOffset(bytecodeOffset)
128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , defaultOffset(defaultOffset)
129635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
130635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            this->jumpTable.simpleJumpTable = jumpTable;
131635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
132635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
133e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        SwitchRecord(StringJumpTable* jumpTable, unsigned bytecodeOffset, unsigned defaultOffset)
134635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            : type(String)
135e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            , bytecodeOffset(bytecodeOffset)
136635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            , defaultOffset(defaultOffset)
137635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
138635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            this->jumpTable.stringJumpTable = jumpTable;
139635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
140635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
141635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
142635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct PropertyStubCompilationInfo {
1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        MacroAssembler::Call callReturnLocation;
144635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        MacroAssembler::Label hotPathBegin;
145635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
147635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    struct StructureStubCompilationInfo {
148635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        MacroAssembler::DataLabelPtr hotPathBegin;
1498f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        MacroAssembler::Call hotPathOther;
1508f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        MacroAssembler::Call callReturnLocation;
151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    struct MethodCallCompilationInfo {
1545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MethodCallCompilationInfo(unsigned propertyAccessIndex)
1555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            : propertyAccessIndex(propertyAccessIndex)
1565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        {
1575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        }
1585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
1595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        MacroAssembler::DataLabelPtr structureToCompare;
1605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned propertyAccessIndex;
161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    };
162635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian    // Near calls can only be patched to other JIT code, regular calls can be patched to JIT code or relinked to stub functions.
1640bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void ctiPatchNearCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction);
1650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, MacroAssemblerCodePtr newCalleeFunction);
1660bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    void ctiPatchCallByReturnAddress(CodeBlock* codeblock, ReturnAddressPtr returnAddress, FunctionPtr newCalleeFunction);
167635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
16821939df44de1705786c545cd1bf519d47250322dBen Murdoch    class JIT : private JSInterfaceJIT {
1695f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        friend class JITStubCall;
1705f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
171635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::Jump;
172635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::JumpList;
173635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        using MacroAssembler::Label;
174635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
175635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static const int patchGetByIdDefaultStructure = -1;
176635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // Magic number - initial offset cannot be representable as a signed 8bit value, or the X86Assembler
177635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        // will compress the displacement, and we may not be able to fit a patched offset.
178635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        static const int patchGetByIdDefaultOffset = 256;
179635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
180635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    public:
181dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        static JITCode compile(JSGlobalData* globalData, CodeBlock* codeBlock, CodePtr* functionEntryArityCheck = 0, void* offsetBase = 0)
182635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
183dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            return JIT(globalData, codeBlock, offsetBase).privateCompile(functionEntryArityCheck);
184635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
185635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1865ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compileGetByIdProto(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, Structure* prototypeStructure, const Identifier& ident, const PropertySlot& slot, size_t cachedOffset, ReturnAddressPtr returnAddress)
187635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
188635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
1895ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompileGetByIdProto(stubInfo, structure, prototypeStructure, ident, slot, cachedOffset, returnAddress, callFrame);
190635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1925ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compileGetByIdSelfList(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* polymorphicStructures, int currentIndex, Structure* structure, const Identifier& ident, const PropertySlot& slot, size_t cachedOffset)
193635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
194635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
1955ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompileGetByIdSelfList(stubInfo, polymorphicStructures, currentIndex, structure, ident, slot, cachedOffset);
196635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
1975ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compileGetByIdProtoList(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructureList, int currentIndex, Structure* structure, Structure* prototypeStructure, const Identifier& ident, const PropertySlot& slot, size_t cachedOffset)
198635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
199635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
2005ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompileGetByIdProtoList(stubInfo, prototypeStructureList, currentIndex, structure, prototypeStructure, ident, slot, cachedOffset, callFrame);
201635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
2025ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compileGetByIdChainList(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, PolymorphicAccessStructureList* prototypeStructureList, int currentIndex, Structure* structure, StructureChain* chain, size_t count, const Identifier& ident, const PropertySlot& slot, size_t cachedOffset)
203635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
204635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
2055ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompileGetByIdChainList(stubInfo, prototypeStructureList, currentIndex, structure, chain, count, ident, slot, cachedOffset, callFrame);
206635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
207635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2085ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compileGetByIdChain(JSGlobalData* globalData, CallFrame* callFrame, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* structure, StructureChain* chain, size_t count, const Identifier& ident, const PropertySlot& slot, size_t cachedOffset, ReturnAddressPtr returnAddress)
209635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
210635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
2115ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompileGetByIdChain(stubInfo, structure, chain, count, ident, slot, cachedOffset, returnAddress, callFrame);
212635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2145ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compilePutByIdTransition(JSGlobalData* globalData, CodeBlock* codeBlock, StructureStubInfo* stubInfo, Structure* oldStructure, Structure* newStructure, size_t cachedOffset, StructureChain* chain, ReturnAddressPtr returnAddress, bool direct)
215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
2175ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            jit.privateCompilePutByIdTransition(stubInfo, oldStructure, newStructure, cachedOffset, chain, returnAddress, direct);
218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2208a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        static void compileCTIMachineTrampolines(JSGlobalData* globalData, RefPtr<ExecutablePool>* executablePool, TrampolineStructure *trampolines)
221635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
222967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (!globalData->canUseJIT())
223967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                return;
224dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            JIT jit(globalData, 0, 0);
2258a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block            jit.privateCompileCTIMachineTrampolines(executablePool, globalData, trampolines);
226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
227635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
228e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        static CodePtr compileCTINativeCall(JSGlobalData* globalData, PassRefPtr<ExecutablePool> executablePool, NativeFunction func)
229e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        {
230967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch            if (!globalData->canUseJIT())
231967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch                return CodePtr();
232dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch            JIT jit(globalData, 0, 0);
233e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block            return jit.privateCompileCTINativeCall(executablePool, globalData, func);
234e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        }
235e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block
2360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static void patchGetByIdSelf(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress);
237e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static void patchPutByIdReplace(CodeBlock* codeblock, StructureStubInfo*, Structure*, size_t cachedOffset, ReturnAddressPtr returnAddress, bool direct);
2382daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static void patchMethodCallProto(JSGlobalData&, CodeBlock* codeblock, MethodCallLinkInfo&, JSFunction*, Structure*, JSObject*, ReturnAddressPtr);
239635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2405ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        static void compilePatchGetArrayLength(JSGlobalData* globalData, CodeBlock* codeBlock, ReturnAddressPtr returnAddress)
241635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
242635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            JIT jit(globalData, codeBlock);
2435ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen            return jit.privateCompilePatchGetArrayLength(returnAddress);
244635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
245635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2465af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        static void linkCall(JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, CodePtr, CallLinkInfo*, int callerArgCount, JSGlobalData*);
2475af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        static void linkConstruct(JSFunction* callee, CodeBlock* callerCodeBlock, CodeBlock* calleeCodeBlock, CodePtr, CallLinkInfo*, int callerArgCount, JSGlobalData*);
248635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
249635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    private:
2505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        struct JSRInfo {
2515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            DataLabelPtr storeLocation;
2525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            Label target;
2535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
2545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            JSRInfo(DataLabelPtr storeLocation, Label targetLocation)
2555f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                : storeLocation(storeLocation)
2565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian                , target(targetLocation)
2575f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            {
2585f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian            }
2595f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        };
2605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
261dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        JIT(JSGlobalData*, CodeBlock* = 0, void* = 0);
262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void privateCompileMainPass();
264635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void privateCompileLinkPass();
265635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void privateCompileSlowCases();
2665af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        JITCode privateCompile(CodePtr* functionEntryArityCheck);
2675ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompileGetByIdProto(StructureStubInfo*, Structure*, Structure* prototypeStructure, const Identifier&, const PropertySlot&, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame);
2685ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompileGetByIdSelfList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, const Identifier&, const PropertySlot&, size_t cachedOffset);
2695ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompileGetByIdProtoList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, Structure* prototypeStructure, const Identifier&, const PropertySlot&, size_t cachedOffset, CallFrame* callFrame);
2705ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompileGetByIdChainList(StructureStubInfo*, PolymorphicAccessStructureList*, int, Structure*, StructureChain* chain, size_t count, const Identifier&, const PropertySlot&, size_t cachedOffset, CallFrame* callFrame);
2715ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompileGetByIdChain(StructureStubInfo*, Structure*, StructureChain*, size_t count, const Identifier&, const PropertySlot&, size_t cachedOffset, ReturnAddressPtr returnAddress, CallFrame* callFrame);
2725ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompilePutByIdTransition(StructureStubInfo*, Structure*, Structure*, size_t cachedOffset, StructureChain*, ReturnAddressPtr returnAddress, bool direct);
273635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
2748a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        void privateCompileCTIMachineTrampolines(RefPtr<ExecutablePool>* executablePool, JSGlobalData* data, TrampolineStructure *trampolines);
2755af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        Label privateCompileCTINativeCall(JSGlobalData*, bool isConstruct = false);
276e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        CodePtr privateCompileCTINativeCall(PassRefPtr<ExecutablePool> executablePool, JSGlobalData* data, NativeFunction func);
2775ddde30071f639962dd557c453f2ad01f8f0fd00Kristian Monsen        void privateCompilePatchGetArrayLength(ReturnAddressPtr returnAddress);
278635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
279635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addSlowCase(Jump);
2800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void addSlowCase(JumpList);
281635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void addJump(Jump, int);
282635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void emitJumpSlowToHot(Jump, int);
283635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
284635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void compileOpCall(OpcodeID, Instruction* instruction, unsigned callLinkInfoIndex);
2855f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void compileOpCallVarargs(Instruction* instruction);
286635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void compileOpCallInitializeCallFrame();
287635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void compileOpCallSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter, unsigned callLinkInfoIndex, OpcodeID opcodeID);
2885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void compileOpCallVarargsSlowCase(Instruction* instruction, Vector<SlowCaseEntry>::iterator& iter);
2890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
290635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        enum CompileOpStrictEqType { OpStrictEq, OpNStrictEq };
291635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void compileOpStrictEq(Instruction* instruction, CompileOpStrictEqType type);
292231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        bool isOperandConstantImmediateDouble(unsigned src);
293231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
294231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void emitLoadDouble(unsigned index, FPRegisterID value);
295231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void emitLoadInt32ToDouble(unsigned index, FPRegisterID value);
296231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
297dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        void testPrototype(JSValue, JumpList& failureCases);
298cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block
2990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
3000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool getOperandConstantImmediateInt(unsigned op1, unsigned op2, unsigned& op, int32_t& constant);
3010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitLoadTag(unsigned index, RegisterID tag);
3030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitLoadPayload(unsigned index, RegisterID payload);
3040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitLoad(const JSValue& v, RegisterID tag, RegisterID payload);
3060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitLoad(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister);
3070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitLoad2(unsigned index1, RegisterID tag1, RegisterID payload1, unsigned index2, RegisterID tag2, RegisterID payload2);
3080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitStore(unsigned index, RegisterID tag, RegisterID payload, RegisterID base = callFrameRegister);
3100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitStore(unsigned index, const JSValue constant, RegisterID base = callFrameRegister);
3110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitStoreInt32(unsigned index, RegisterID payload, bool indexIsInt32 = false);
3122bde8e466a4451c7319e3a072d118917957d6554Steve Block        void emitStoreInt32(unsigned index, TrustedImm32 payload, bool indexIsInt32 = false);
3130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitStoreCell(unsigned index, RegisterID payload, bool indexIsCell = false);
3142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void emitStoreBool(unsigned index, RegisterID payload, bool indexIsBool = false);
3150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitStoreDouble(unsigned index, FPRegisterID value);
3160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
317e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        bool isLabeled(unsigned bytecodeOffset);
318e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        void map(unsigned bytecodeOffset, unsigned virtualRegisterIndex, RegisterID tag, RegisterID payload);
3190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void unmap(RegisterID);
3200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void unmap();
3210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool isMapped(unsigned virtualRegisterIndex);
3220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool getMappedPayload(unsigned virtualRegisterIndex, RegisterID& payload);
3230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        bool getMappedTag(unsigned virtualRegisterIndex, RegisterID& tag);
3240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex);
3260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotJSCell(unsigned virtualRegisterIndex, RegisterID tag);
3270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, unsigned virtualRegisterIndex);
3280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS)
3300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileGetByIdHotPath();
3310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false);
3320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, Structure* structure, size_t cachedOffset);
33481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        void compileGetDirectOffset(JSObject* base, RegisterID resultTag, RegisterID resultPayload, size_t cachedOffset);
33581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        void compileGetDirectOffset(RegisterID base, RegisterID resultTag, RegisterID resultPayload, RegisterID offset);
3360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compilePutDirectOffset(RegisterID base, RegisterID valueTag, RegisterID valuePayload, Structure* structure, size_t cachedOffset);
3370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // Arithmetic opcode helpers
3390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitAdd32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType);
3400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSub32Constant(unsigned dst, unsigned op, int32_t constant, ResultType opType);
3410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitBinaryDoubleOp(OpcodeID, unsigned dst, unsigned op1, unsigned op2, OperandTypes, JumpList& notInt32Op1, JumpList& notInt32Op2, bool op1IsInRegisters = true, bool op2IsInRegisters = true);
3420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
343d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86)
3440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
3450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdStructure = 7;
3460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset1 = 22;
3470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset2 = 28;
3480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
3490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdStructure = 7;
3500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdBranchToSlowCase = 13;
3510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset1 = 22;
3520bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset2 = 28;
3530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPutResult = 28;
354967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(OPCODE_SAMPLING)
3550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 37;
3560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
3570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 27;
3580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
3590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetOpCallCompareToJump = 6;
3600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
3610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoObj = 11;
3620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoStruct = 18;
3630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckPutFunction = 29;
364d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_TRADITIONAL)
365643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
366643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetPutByIdStructure = 4;
367643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetPutByIdPropertyMapOffset1 = 20;
368643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetPutByIdPropertyMapOffset2 = 28;
369643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
370643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdStructure = 4;
371643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdBranchToSlowCase = 16;
372643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdPropertyMapOffset1 = 20;
373643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdPropertyMapOffset2 = 28;
374643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdPutResult = 36;
375643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#if ENABLE(OPCODE_SAMPLING)
376643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        #error "OPCODE_SAMPLING is not yet supported"
377643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#else
378643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetGetByIdSlowCaseCall = 32;
379643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif
380643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetOpCallCompareToJump = 12;
381643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
382643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetMethodCheckProtoObj = 12;
383643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetMethodCheckProtoStruct = 20;
384643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int patchOffsetMethodCheckPutFunction = 32;
385643ca7872b450ea4efacab6188849e5aac2ba161Steve Block
386643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // sequenceOpCall
387643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceOpCallInstructionSpace = 12;
388643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceOpCallConstantSpace = 2;
389643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // sequenceMethodCheck
390643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceMethodCheckInstructionSpace = 40;
391643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceMethodCheckConstantSpace = 6;
392643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // sequenceGetByIdHotPath
393643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceGetByIdHotPathInstructionSpace = 36;
394e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceGetByIdHotPathConstantSpace = 4;
395e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // sequenceGetByIdSlowCase
3966b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        static const int sequenceGetByIdSlowCaseInstructionSpace = 56;
397e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceGetByIdSlowCaseConstantSpace = 2;
398e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // sequencePutById
399e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequencePutByIdInstructionSpace = 36;
400e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequencePutByIdConstantSpace = 4;
401e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#elif CPU(ARM_THUMB2)
402e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
403e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetPutByIdStructure = 10;
40481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset1 = 36;
40581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset2 = 48;
406e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
407e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetGetByIdStructure = 10;
408e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetGetByIdBranchToSlowCase = 26;
40981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset1 = 36;
41081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset2 = 48;
41181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPutResult = 52;
412e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#if ENABLE(OPCODE_SAMPLING)
413e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        #error "OPCODE_SAMPLING is not yet supported"
414e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#else
415e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetGetByIdSlowCaseCall = 30;
416e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke#endif
417e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetOpCallCompareToJump = 16;
418e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
419e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetMethodCheckProtoObj = 24;
420e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetMethodCheckProtoStruct = 34;
421e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int patchOffsetMethodCheckPutFunction = 58;
422e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke
423e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // sequenceOpCall
424e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceOpCallInstructionSpace = 12;
425e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceOpCallConstantSpace = 2;
426e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // sequenceMethodCheck
427e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceMethodCheckInstructionSpace = 40;
428e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceMethodCheckConstantSpace = 6;
429e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        // sequenceGetByIdHotPath
430e458d70a0d18538346f41b503114c9ebe6b2ce12Leon Clarke        static const int sequenceGetByIdHotPathInstructionSpace = 36;
431643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceGetByIdHotPathConstantSpace = 4;
432643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // sequenceGetByIdSlowCase
433643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceGetByIdSlowCaseInstructionSpace = 40;
434643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequenceGetByIdSlowCaseConstantSpace = 2;
435643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        // sequencePutById
436643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequencePutByIdInstructionSpace = 36;
437643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        static const int sequencePutByIdConstantSpace = 4;
4385abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#elif CPU(MIPS)
4395abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if WTF_MIPS_ISA(1)
4405abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetPutByIdStructure = 16;
44181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset1 = 56;
44281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset2 = 72;
4435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdStructure = 16;
4445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdBranchToSlowCase = 48;
44581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset1 = 56;
44681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset2 = 76;
44781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPutResult = 96;
4485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(OPCODE_SAMPLING)
4495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        #error "OPCODE_SAMPLING is not yet supported"
4505abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#else
4515abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdSlowCaseCall = 44;
4525abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
4535abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetOpCallCompareToJump = 32;
4545abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckProtoObj = 32;
4555abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckProtoStruct = 56;
4565abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckPutFunction = 88;
4575abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#else // WTF_MIPS_ISA(1)
4585abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetPutByIdStructure = 12;
45981bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset1 = 48;
46081bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetPutByIdPropertyMapOffset2 = 64;
4615abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdStructure = 12;
4625abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdBranchToSlowCase = 44;
46381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset1 = 48;
46481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPropertyMapOffset2 = 64;
46581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        static const int patchOffsetGetByIdPutResult = 80;
4665abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#if ENABLE(OPCODE_SAMPLING)
4675abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        #error "OPCODE_SAMPLING is not yet supported"
4685abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#else
4695abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetGetByIdSlowCaseCall = 44;
4705abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
4715abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetOpCallCompareToJump = 32;
4725abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckProtoObj = 32;
4735abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckProtoStruct = 52;
4745abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick        static const int patchOffsetMethodCheckPutFunction = 84;
4755abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick#endif
4762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#elif CPU(SH4)
4772daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch       // These architecture specific value are used to enable patching - see comment on op_put_by_id.
4782daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdStructure = 6;
4792daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset = 24;
4802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetPutByIdStructure = 6;
4812daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
4822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdBranchToSlowCase = 10;
4832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset = 24;
4842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdPutResult = 32;
4852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
4862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // sequenceOpCall
4872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceOpCallInstructionSpace = 12;
4882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceOpCallConstantSpace = 2;
4892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // sequenceMethodCheck
4902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceMethodCheckInstructionSpace = 40;
4912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceMethodCheckConstantSpace = 6;
4922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // sequenceGetByIdHotPath
4932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceGetByIdHotPathInstructionSpace = 36;
4942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceGetByIdHotPathConstantSpace = 5;
4952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // sequenceGetByIdSlowCase
4962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceGetByIdSlowCaseInstructionSpace = 26;
4972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequenceGetByIdSlowCaseConstantSpace = 2;
4982daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        // sequencePutById
4992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequencePutByIdInstructionSpace = 36;
5002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int sequencePutByIdConstantSpace = 5;
5012daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset1 = 20;
5032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset2 = 26;
5042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5052daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset1 = 20;
5062daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset2 = 26;
5072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5082daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#if ENABLE(OPCODE_SAMPLING)
5092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE
5102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#else
5112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 22;
5122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#endif
5132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetOpCallCompareToJump = 4;
5142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
5152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetMethodCheckProtoObj = 12;
5162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetMethodCheckProtoStruct = 20;
5172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        static const int patchOffsetMethodCheckPutFunction = 32;
5180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#error "JSVALUE32_64 not supported on this platform."
5200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else // USE(JSVALUE32_64)
5230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitGetVirtualRegister(int src, RegisterID dst);
5240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitGetVirtualRegisters(int src1, RegisterID dst1, int src2, RegisterID dst2);
5250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitPutVirtualRegister(unsigned dst, RegisterID from = regT0);
5260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int32_t getConstantOperandImmediateInt(unsigned src);
5280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void killLastResultRegister();
5300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Jump emitJumpIfJSCell(RegisterID);
5320bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Jump emitJumpIfBothJSCells(RegisterID, RegisterID, RegisterID);
5330bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfJSCell(RegisterID);
5340bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Jump emitJumpIfNotJSCell(RegisterID);
5350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotJSCell(RegisterID);
5360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotJSCell(RegisterID, int VReg);
537a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(JSVALUE32_64)
5380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JIT::Jump emitJumpIfImmediateNumber(RegisterID reg)
5390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
5400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return emitJumpIfImmediateInteger(reg);
5410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
5420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JIT::Jump emitJumpIfNotImmediateNumber(RegisterID reg)
5440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        {
5450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch            return emitJumpIfNotImmediateInteger(reg);
5460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        }
5470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JIT::Jump emitJumpIfImmediateInteger(RegisterID);
5490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JIT::Jump emitJumpIfNotImmediateInteger(RegisterID);
5500bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        JIT::Jump emitJumpIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID);
5510bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotImmediateInteger(RegisterID);
552231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void emitJumpSlowCaseIfNotImmediateNumber(RegisterID);
5530bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitJumpSlowCaseIfNotImmediateIntegers(RegisterID, RegisterID, RegisterID);
5540bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
555a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch#if USE(JSVALUE32_64)
5560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitFastArithDeTagImmediate(RegisterID);
5570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        Jump emitFastArithDeTagImmediateJumpIfZero(RegisterID);
5580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitFastArithReTagImmediate(RegisterID src, RegisterID dest);
5600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitFastArithIntToImmNoCheck(RegisterID src, RegisterID dest);
5610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitTagAsBoolImmediate(RegisterID reg);
5630bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileBinaryArithOp(OpcodeID, unsigned dst, unsigned src1, unsigned src2, OperandTypes opi);
564231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if USE(JSVALUE64)
565231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes, bool op1HasImmediateIntFastCase, bool op2HasImmediateIntFastCase);
566231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
567231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void compileBinaryArithOpSlowCase(OpcodeID, Vector<SlowCaseEntry>::iterator&, unsigned dst, unsigned src1, unsigned src2, OperandTypes);
568231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
5690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
5700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(JIT_OPTIMIZE_PROPERTY_ACCESS)
5710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileGetByIdHotPath(int resultVReg, int baseVReg, Identifier* ident, unsigned propertyAccessInstructionIndex);
5720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void compileGetByIdSlowCase(int resultVReg, int baseVReg, Identifier* ident, Vector<SlowCaseEntry>::iterator& iter, bool isMethodCheck = false);
5730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void compileGetDirectOffset(RegisterID base, RegisterID result, Structure* structure, size_t cachedOffset);
57581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        void compileGetDirectOffset(JSObject* base, RegisterID result, size_t cachedOffset);
57681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        void compileGetDirectOffset(RegisterID base, RegisterID result, RegisterID offset, RegisterID scratch);
5775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void compilePutDirectOffset(RegisterID base, RegisterID value, Structure* structure, size_t cachedOffset);
5785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
579d0825bca7fe65beaee391d30da42e937db621564Steve Block#if CPU(X86_64)
5800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
5810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdStructure = 10;
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 patchOffsetGetByIdPropertyMapOffset = 31;
5870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPutResult = 31;
5880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING)
589231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetGetByIdSlowCaseCall = 64;
5900bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
5910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 41;
5920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
5930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetOpCallCompareToJump = 9;
5945f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
5950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoObj = 20;
5960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoStruct = 30;
5970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckPutFunction = 50;
598d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(X86)
5990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
6000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdStructure = 7;
6010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdPropertyMapOffset = 22;
6020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
6030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdStructure = 7;
6040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdBranchToSlowCase = 13;
6050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPropertyMapOffset = 22;
6060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdPutResult = 22;
607967717af5423377c967781471ee106e2bb4e11c8Ben Murdoch#if ENABLE(OPCODE_SAMPLING)
6080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 33;
6090bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
6100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 23;
6110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
6120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetOpCallCompareToJump = 6;
6135f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
6140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoObj = 11;
6150bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckProtoStruct = 18;
6160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetMethodCheckPutFunction = 29;
617d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_THUMB2)
6180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
6190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetPutByIdStructure = 10;
620cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetPutByIdPropertyMapOffset = 46;
6210bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
6220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdStructure = 10;
623cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetGetByIdBranchToSlowCase = 26;
624cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetGetByIdPropertyMapOffset = 46;
625cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetGetByIdPutResult = 50;
6260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if ENABLE(OPCODE_SAMPLING)
6270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 0; // FIMXE
6280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
6290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        static const int patchOffsetGetByIdSlowCaseCall = 28;
6300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
631cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetOpCallCompareToJump = 16;
6325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
633cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetMethodCheckProtoObj = 24;
634cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetMethodCheckProtoStruct = 34;
635cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetMethodCheckPutFunction = 58;
636d0825bca7fe65beaee391d30da42e937db621564Steve Block#elif CPU(ARM_TRADITIONAL)
637231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // These architecture specific value are used to enable patching - see comment on op_put_by_id.
638231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetPutByIdStructure = 4;
639231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetPutByIdPropertyMapOffset = 20;
640231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // These architecture specific value are used to enable patching - see comment on op_get_by_id.
641231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetGetByIdStructure = 4;
642231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetGetByIdBranchToSlowCase = 16;
643231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetGetByIdPropertyMapOffset = 20;
644231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetGetByIdPutResult = 28;
645231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if ENABLE(OPCODE_SAMPLING)
646231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        #error "OPCODE_SAMPLING is not yet supported"
647231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
648cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int patchOffsetGetByIdSlowCaseCall = 28;
649231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
650231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetOpCallCompareToJump = 12;
651231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
652231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetMethodCheckProtoObj = 12;
653231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetMethodCheckProtoStruct = 20;
654231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int patchOffsetMethodCheckPutFunction = 32;
6550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
656231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // sequenceOpCall
657231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceOpCallInstructionSpace = 12;
658231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceOpCallConstantSpace = 2;
659231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // sequenceMethodCheck
660231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceMethodCheckInstructionSpace = 40;
661231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceMethodCheckConstantSpace = 6;
662231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // sequenceGetByIdHotPath
663231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceGetByIdHotPathInstructionSpace = 28;
664231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceGetByIdHotPathConstantSpace = 3;
665231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // sequenceGetByIdSlowCase
666cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        static const int sequenceGetByIdSlowCaseInstructionSpace = 32;
667231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequenceGetByIdSlowCaseConstantSpace = 2;
668231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        // sequencePutById
669231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequencePutByIdInstructionSpace = 28;
670231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        static const int sequencePutByIdConstantSpace = 3;
671dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#elif CPU(MIPS)
672dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if WTF_MIPS_ISA(1)
673dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetPutByIdStructure = 16;
674dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetPutByIdPropertyMapOffset = 68;
675dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdStructure = 16;
676dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdBranchToSlowCase = 48;
677dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdPropertyMapOffset = 68;
678dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdPutResult = 88;
679dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(OPCODE_SAMPLING)
680dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        #error "OPCODE_SAMPLING is not yet supported"
681dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
682dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdSlowCaseCall = 40;
683dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
684dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetOpCallCompareToJump = 32;
685dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckProtoObj = 32;
686dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckProtoStruct = 56;
687dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckPutFunction = 88;
688dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else // WTF_MIPS_ISA(1)
689dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetPutByIdStructure = 12;
690dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetPutByIdPropertyMapOffset = 60;
691dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdStructure = 12;
692dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdBranchToSlowCase = 44;
693dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdPropertyMapOffset = 60;
694dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdPutResult = 76;
695dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#if ENABLE(OPCODE_SAMPLING)
696dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        #error "OPCODE_SAMPLING is not yet supported"
697dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#else
698dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetGetByIdSlowCaseCall = 40;
699dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
700dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetOpCallCompareToJump = 32;
701dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckProtoObj = 32;
702dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckProtoStruct = 52;
703dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block        static const int patchOffsetMethodCheckPutFunction = 84;
704dcc8cf2e65d1aa555cce12431a16547e66b469eeSteve Block#endif
705231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
706643ca7872b450ea4efacab6188849e5aac2ba161Steve Block#endif // USE(JSVALUE32_64)
707231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
708dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if (defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL)
709dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#define BEGIN_UNINTERRUPTED_SEQUENCE(name) do { beginUninterruptedSequence(name ## InstructionSpace, name ## ConstantSpace); } while (false)
7102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define END_UNINTERRUPTED_SEQUENCE_FOR_PUT(name, dst) do { endUninterruptedSequence(name ## InstructionSpace, name ## ConstantSpace, dst); } while (false)
7112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define END_UNINTERRUPTED_SEQUENCE(name) END_UNINTERRUPTED_SEQUENCE_FOR_PUT(name, 0)
712231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
713231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        void beginUninterruptedSequence(int, int);
7142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        void endUninterruptedSequence(int, int, int);
715231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
716231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#else
717dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#define BEGIN_UNINTERRUPTED_SEQUENCE(name)  do { beginUninterruptedSequence(); } while (false)
718dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#define END_UNINTERRUPTED_SEQUENCE(name)  do { endUninterruptedSequence(); } while (false)
7192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#define END_UNINTERRUPTED_SEQUENCE_FOR_PUT(name, dst) do { endUninterruptedSequence(); } while (false)
720231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
721231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
7220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_add(Instruction*);
7230bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_bitand(Instruction*);
7240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_bitnot(Instruction*);
7250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_bitor(Instruction*);
7260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_bitxor(Instruction*);
7275f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_call(Instruction*);
7285f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_call_eval(Instruction*);
7295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_call_varargs(Instruction*);
730e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        void emit_op_call_put_result(Instruction*);
7310bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_catch(Instruction*);
7325f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_construct(Instruction*);
7335af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        void emit_op_get_callee(Instruction*);
7345af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        void emit_op_create_this(Instruction*);
7350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_convert_this(Instruction*);
736a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void emit_op_convert_this_strict(Instruction*);
7370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_create_arguments(Instruction*);
7380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_debug(Instruction*);
7390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_del_by_id(Instruction*);
7400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_div(Instruction*);
7410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_end(Instruction*);
7420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_enter(Instruction*);
743a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void emit_op_create_activation(Instruction*);
7440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_eq(Instruction*);
7450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_eq_null(Instruction*);
7460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_get_by_id(Instruction*);
747bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emit_op_get_arguments_length(Instruction*);
7480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_get_by_val(Instruction*);
749bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emit_op_get_argument_by_val(Instruction*);
750cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        void emit_op_get_by_pname(Instruction*);
7515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_get_global_var(Instruction*);
7525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_get_scoped_var(Instruction*);
753bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emit_op_init_lazy_reg(Instruction*);
7546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        void emit_op_check_has_instance(Instruction*);
7550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_instanceof(Instruction*);
7565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_jeq_null(Instruction*);
7570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_jfalse(Instruction*);
7580bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_jmp(Instruction*);
7590bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_jmp_scopes(Instruction*);
7605f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_jneq_null(Instruction*);
7615f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_jneq_ptr(Instruction*);
7620bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_jnless(Instruction*);
763643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void emit_op_jless(Instruction*);
76421939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emit_op_jlesseq(Instruction*, bool invert = false);
7650bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_jnlesseq(Instruction*);
7665f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_jsr(Instruction*);
7675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_jtrue(Instruction*);
7680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_load_varargs(Instruction*);
7690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_loop(Instruction*);
7700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_loop_if_less(Instruction*);
7710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_loop_if_lesseq(Instruction*);
7720bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_loop_if_true(Instruction*);
773643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void emit_op_loop_if_false(Instruction*);
7740bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_lshift(Instruction*);
7750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_method_check(Instruction*);
7760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_mod(Instruction*);
7770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_mov(Instruction*);
7780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_mul(Instruction*);
7790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_negate(Instruction*);
7805f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_neq(Instruction*);
7810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_neq_null(Instruction*);
7820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_new_array(Instruction*);
7830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_new_func(Instruction*);
7840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_new_func_exp(Instruction*);
7850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_new_object(Instruction*);
7866c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        void emit_op_new_regexp(Instruction*);
787cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        void emit_op_get_pnames(Instruction*);
7885f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_next_pname(Instruction*);
7890bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_not(Instruction*);
7905f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_nstricteq(Instruction*);
7910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_pop_scope(Instruction*);
7920bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_post_dec(Instruction*);
7930bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_post_inc(Instruction*);
7940bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_pre_dec(Instruction*);
7950bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_pre_inc(Instruction*);
7960bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_profile_did_call(Instruction*);
7970bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_profile_will_call(Instruction*);
7985f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_push_new_scope(Instruction*);
7990bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_push_scope(Instruction*);
8000bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_by_id(Instruction*);
8010bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_by_index(Instruction*);
8020bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_by_val(Instruction*);
8030bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_getter(Instruction*);
8040bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_global_var(Instruction*);
8050bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_scoped_var(Instruction*);
8060bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_put_setter(Instruction*);
8070bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_resolve(Instruction*);
8080bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_resolve_base(Instruction*);
809a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void emit_op_ensure_property_exists(Instruction*);
8106c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        void emit_op_resolve_global(Instruction*, bool dynamic = false);
8116c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        void emit_op_resolve_global_dynamic(Instruction*);
8120bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_resolve_skip(Instruction*);
8130bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_resolve_with_base(Instruction*);
8140bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_ret(Instruction*);
815e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        void emit_op_ret_object_or_this(Instruction*);
8160bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_rshift(Instruction*);
8170bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_sret(Instruction*);
8180bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_strcat(Instruction*);
8190bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_stricteq(Instruction*);
8200bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_sub(Instruction*);
8215f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_switch_char(Instruction*);
8220bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_switch_imm(Instruction*);
8235f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emit_op_switch_string(Instruction*);
8240bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_tear_off_activation(Instruction*);
8250bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_tear_off_arguments(Instruction*);
8260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_throw(Instruction*);
8276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        void emit_op_throw_reference_error(Instruction*);
8280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_to_jsnumber(Instruction*);
8290bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_to_primitive(Instruction*);
8300bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emit_op_unexpected_load(Instruction*);
83121939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emit_op_urshift(Instruction*);
8320617145a89917ae7735fe1c9538688ab9a577df5Kristian Monsen#if ENABLE(JIT_USE_SOFT_MODULO)
8338a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block        void softModulo();
8348a0914b749bbe7da7768e07a7db5c6d4bb09472bSteve Block#endif
8355f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8360bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_add(Instruction*, Vector<SlowCaseEntry>::iterator&);
8370bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_bitand(Instruction*, Vector<SlowCaseEntry>::iterator&);
8380bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_bitnot(Instruction*, Vector<SlowCaseEntry>::iterator&);
8390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_bitor(Instruction*, Vector<SlowCaseEntry>::iterator&);
8400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_bitxor(Instruction*, Vector<SlowCaseEntry>::iterator&);
8410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_call(Instruction*, Vector<SlowCaseEntry>::iterator&);
8420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_call_eval(Instruction*, Vector<SlowCaseEntry>::iterator&);
8430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_call_varargs(Instruction*, Vector<SlowCaseEntry>::iterator&);
8440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_construct(Instruction*, Vector<SlowCaseEntry>::iterator&);
8450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_convert_this(Instruction*, Vector<SlowCaseEntry>::iterator&);
846a94275402997c11dd2e778633dacf4b7e630a35dBen Murdoch        void emitSlow_op_convert_this_strict(Instruction*, Vector<SlowCaseEntry>::iterator&);
8470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_div(Instruction*, Vector<SlowCaseEntry>::iterator&);
8480bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_eq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8490bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_get_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&);
850bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emitSlow_op_get_arguments_length(Instruction*, Vector<SlowCaseEntry>::iterator&);
8515f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_get_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&);
852bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emitSlow_op_get_argument_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&);
853cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block        void emitSlow_op_get_by_pname(Instruction*, Vector<SlowCaseEntry>::iterator&);
8546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        void emitSlow_op_check_has_instance(Instruction*, Vector<SlowCaseEntry>::iterator&);
8550bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_instanceof(Instruction*, Vector<SlowCaseEntry>::iterator&);
8560bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_jfalse(Instruction*, Vector<SlowCaseEntry>::iterator&);
8570bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_jnless(Instruction*, Vector<SlowCaseEntry>::iterator&);
858643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void emitSlow_op_jless(Instruction*, Vector<SlowCaseEntry>::iterator&);
85921939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emitSlow_op_jlesseq(Instruction*, Vector<SlowCaseEntry>::iterator&, bool invert = false);
8600bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_jnlesseq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8610bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_jtrue(Instruction*, Vector<SlowCaseEntry>::iterator&);
862bec39347bb3bb5bf1187ccaf471d26247f28b585Kristian Monsen        void emitSlow_op_load_varargs(Instruction*, Vector<SlowCaseEntry>::iterator&);
8635f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_loop_if_less(Instruction*, Vector<SlowCaseEntry>::iterator&);
8645f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_loop_if_lesseq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8655f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_loop_if_true(Instruction*, Vector<SlowCaseEntry>::iterator&);
866643ca7872b450ea4efacab6188849e5aac2ba161Steve Block        void emitSlow_op_loop_if_false(Instruction*, Vector<SlowCaseEntry>::iterator&);
8670bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_lshift(Instruction*, Vector<SlowCaseEntry>::iterator&);
8680bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_method_check(Instruction*, Vector<SlowCaseEntry>::iterator&);
8690bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_mod(Instruction*, Vector<SlowCaseEntry>::iterator&);
8700bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_mul(Instruction*, Vector<SlowCaseEntry>::iterator&);
8710bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_negate(Instruction*, Vector<SlowCaseEntry>::iterator&);
8725f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_neq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8730bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_not(Instruction*, Vector<SlowCaseEntry>::iterator&);
8745f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_nstricteq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8750bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_post_dec(Instruction*, Vector<SlowCaseEntry>::iterator&);
8760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_post_inc(Instruction*, Vector<SlowCaseEntry>::iterator&);
8770bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_pre_dec(Instruction*, Vector<SlowCaseEntry>::iterator&);
8780bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_pre_inc(Instruction*, Vector<SlowCaseEntry>::iterator&);
8790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_put_by_id(Instruction*, Vector<SlowCaseEntry>::iterator&);
8800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_put_by_val(Instruction*, Vector<SlowCaseEntry>::iterator&);
8810bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_resolve_global(Instruction*, Vector<SlowCaseEntry>::iterator&);
8826c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen        void emitSlow_op_resolve_global_dynamic(Instruction*, Vector<SlowCaseEntry>::iterator&);
8830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_rshift(Instruction*, Vector<SlowCaseEntry>::iterator&);
8840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_stricteq(Instruction*, Vector<SlowCaseEntry>::iterator&);
8850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_sub(Instruction*, Vector<SlowCaseEntry>::iterator&);
8865f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitSlow_op_to_jsnumber(Instruction*, Vector<SlowCaseEntry>::iterator&);
8870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void emitSlow_op_to_primitive(Instruction*, Vector<SlowCaseEntry>::iterator&);
88821939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emitSlow_op_urshift(Instruction*, Vector<SlowCaseEntry>::iterator&);
88921939df44de1705786c545cd1bf519d47250322dBen Murdoch
89021939df44de1705786c545cd1bf519d47250322dBen Murdoch
89121939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emitRightShift(Instruction*, bool isUnsigned);
89221939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emitRightShiftSlowCase(Instruction*, Vector<SlowCaseEntry>::iterator&, bool isUnsigned);
8935f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
8945af96e2c7b73ebc627c6894727826a7576d31758Leon Clarke        /* This function is deprecated. */
895635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void emitGetJITStubArg(unsigned argumentNumber, RegisterID dst);
896635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
897635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void emitInitRegister(unsigned dst);
898635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
899635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void emitPutToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry entry);
9002bde8e466a4451c7319e3a072d118917957d6554Steve Block        void emitPutCellToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry);
9012bde8e466a4451c7319e3a072d118917957d6554Steve Block        void emitPutIntToCallFrameHeader(RegisterID from, RegisterFile::CallFrameHeaderEntry);
902635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void emitPutImmediateToCallFrameHeader(void* value, RegisterFile::CallFrameHeaderEntry entry);
9035f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitGetFromCallFrameHeaderPtr(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from = callFrameRegister);
9045f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitGetFromCallFrameHeader32(RegisterFile::CallFrameHeaderEntry entry, RegisterID to, RegisterID from = callFrameRegister);
905635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9065f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        JSValue getConstantOperand(unsigned src);
907635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        bool isOperandConstantImmediateInt(unsigned src);
90821939df44de1705786c545cd1bf519d47250322dBen Murdoch        bool isOperandConstantImmediateChar(unsigned src);
909635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
910635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Jump getSlowCase(Vector<SlowCaseEntry>::iterator& iter)
911635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
912635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            return iter++->from;
913635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
914635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void linkSlowCase(Vector<SlowCaseEntry>::iterator& iter)
915635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        {
916635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            iter->from.link(this);
917635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project            ++iter;
918635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        }
919635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void linkSlowCaseIfNotJSCell(Vector<SlowCaseEntry>::iterator&, int vReg);
920635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
921635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Jump checkStructure(RegisterID reg, Structure* structure);
922635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
923635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void restoreArgumentReference();
924635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void restoreArgumentReferenceForTrampoline();
925635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9265f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        Call emitNakedCall(CodePtr function = CodePtr());
9270bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch
9280bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        void preserveReturnAddressAfterCall(RegisterID);
9295f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void restoreReturnAddressBeforeReturn(RegisterID);
9305f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void restoreReturnAddressBeforeReturn(Address);
931635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
93221939df44de1705786c545cd1bf519d47250322dBen Murdoch        // Loads the character value of a single character string into dst.
93321939df44de1705786c545cd1bf519d47250322dBen Murdoch        void emitLoadCharacterString(RegisterID src, RegisterID dst, JumpList& failures);
93421939df44de1705786c545cd1bf519d47250322dBen Murdoch
9358f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian        void emitTimeoutCheck();
936635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#ifndef NDEBUG
937635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        void printBytecodeOperandTypes(unsigned src1, unsigned src2);
938635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
939635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9405f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SAMPLING_FLAGS)
9415f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void setSamplingFlag(int32_t);
9425f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void clearSamplingFlag(int32_t);
943635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
9445f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9455f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(SAMPLING_COUNTERS)
9465f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void emitCount(AbstractSamplingCounter&, uint32_t = 1);
947635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
948635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
949635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#if ENABLE(OPCODE_SAMPLING)
9505f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void sampleInstruction(Instruction*, bool = false);
951635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
9525f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9535f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian#if ENABLE(CODEBLOCK_SAMPLING)
9545f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void sampleCodeBlock(CodeBlock*);
955635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#else
9565f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        void sampleCodeBlock(CodeBlock*) {}
957635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif
958635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
959635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Interpreter* m_interpreter;
960635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        JSGlobalData* m_globalData;
961635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        CodeBlock* m_codeBlock;
962635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
963635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<CallRecord> m_calls;
964635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<Label> m_labels;
965635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<PropertyStubCompilationInfo> m_propertyAccessCompilationInfo;
966635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<StructureStubCompilationInfo> m_callStructureStubCompilationInfo;
9675f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        Vector<MethodCallCompilationInfo> m_methodCallCompilationInfo;
968635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<JumpTable> m_jmpTable;
969635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
970e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned m_bytecodeOffset;
971635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<JSRInfo> m_jsrSites;
972635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<SlowCaseEntry> m_slowCases;
973635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project        Vector<SwitchRecord> m_switches;
974635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
9755f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned m_propertyAccessInstructionIndex;
9765f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned m_globalResolveInfoIndex;
9775f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian        unsigned m_callLinkInfoIndex;
9785f1ab04193ad0130ca8204aadaceae083aca9881Feng Qian
9790bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#if USE(JSVALUE32_64)
9800bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        unsigned m_jumpTargetIndex;
981e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        unsigned m_mappedBytecodeOffset;
9820bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        unsigned m_mappedVirtualRegisterIndex;
9830bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RegisterID m_mappedTag;
9840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        RegisterID m_mappedPayload;
9850bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#else
9860bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        int m_lastResultBytecodeRegister;
9870bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        unsigned m_jumpTargetsPosition;
9880bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#endif
989231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block
990231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#ifndef NDEBUG
991231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#if defined(ASSEMBLER_HAS_CONSTANT_POOL) && ASSEMBLER_HAS_CONSTANT_POOL
992231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        Label m_uninterruptedInstructionSequenceBegin;
993231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block        int m_uninterruptedConstantSequenceBegin;
994231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
995231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block#endif
996dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch        void* m_linkerOffset;
997e78cbe89e6f337f2f1fe40315be88f742b547151Steve Block        static CodePtr stringGetByValStubGenerator(JSGlobalData* globalData, ExecutablePool* pool);
9980bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    } JIT_CLASS_ALIGNMENT;
999d0825bca7fe65beaee391d30da42e937db621564Steve Block
1000d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emit_op_loop(Instruction* currentInstruction)
1001d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1002d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitTimeoutCheck();
1003d0825bca7fe65beaee391d30da42e937db621564Steve Block        emit_op_jmp(currentInstruction);
1004d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1005d0825bca7fe65beaee391d30da42e937db621564Steve Block
1006d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emit_op_loop_if_true(Instruction* currentInstruction)
1007d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1008d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitTimeoutCheck();
1009d0825bca7fe65beaee391d30da42e937db621564Steve Block        emit_op_jtrue(currentInstruction);
1010d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1011d0825bca7fe65beaee391d30da42e937db621564Steve Block
1012d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emitSlow_op_loop_if_true(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
1013d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1014d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitSlow_op_jtrue(currentInstruction, iter);
1015d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1016d0825bca7fe65beaee391d30da42e937db621564Steve Block
1017d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emit_op_loop_if_false(Instruction* currentInstruction)
1018d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1019d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitTimeoutCheck();
1020d0825bca7fe65beaee391d30da42e937db621564Steve Block        emit_op_jfalse(currentInstruction);
1021d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1022d0825bca7fe65beaee391d30da42e937db621564Steve Block
1023d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emitSlow_op_loop_if_false(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
1024d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1025d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitSlow_op_jfalse(currentInstruction, iter);
1026d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1027d0825bca7fe65beaee391d30da42e937db621564Steve Block
1028d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emit_op_loop_if_less(Instruction* currentInstruction)
1029d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1030d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitTimeoutCheck();
1031d0825bca7fe65beaee391d30da42e937db621564Steve Block        emit_op_jless(currentInstruction);
1032d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1033d0825bca7fe65beaee391d30da42e937db621564Steve Block
1034d0825bca7fe65beaee391d30da42e937db621564Steve Block    inline void JIT::emitSlow_op_loop_if_less(Instruction* currentInstruction, Vector<SlowCaseEntry>::iterator& iter)
1035d0825bca7fe65beaee391d30da42e937db621564Steve Block    {
1036d0825bca7fe65beaee391d30da42e937db621564Steve Block        emitSlow_op_jless(currentInstruction, iter);
1037d0825bca7fe65beaee391d30da42e937db621564Steve Block    }
1038d0825bca7fe65beaee391d30da42e937db621564Steve Block
10390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch} // namespace JSC
1040635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1041635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // ENABLE(JIT)
1042635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1043635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#endif // JIT_h
1044