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