hydrogen-instructions.h revision 592a9fc1d8ea420377a2e7efd0600e20b058be2b
11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_HYDROGEN_INSTRUCTIONS_H_ 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_ 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h" 3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h" 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "code-stubs.h" 35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "data-flow.h" 3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "small-pointer-list.h" 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "string-stream.h" 383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "v8conversions.h" 393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch#include "v8utils.h" 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone.h" 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations. 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock; 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment; 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction; 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation; 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue; 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction; 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder; 53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 55257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitwiseBinaryOperation) \ 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ControlInstruction) \ 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Instruction) \ 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ 621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(AbnormalExit) \ 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(AccessArgumentsAt) \ 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Add) \ 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ApplyArguments) \ 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsElements) \ 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsLength) \ 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsObject) \ 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLiteral) \ 70592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(Bitwise) \ 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitNot) \ 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BlockEntry) \ 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BoundsCheck) \ 743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(Branch) \ 75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallConstantFunction) \ 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallFunction) \ 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallGlobal) \ 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKeyed) \ 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKnownGlobal) \ 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNamed) \ 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNew) \ 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallRuntime) \ 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallStub) \ 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Change) \ 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckFunction) \ 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckInstanceType) \ 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckMap) \ 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckNonSmi) \ 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckPrototypeMaps) \ 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckSmi) \ 91257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ClampToUint8) \ 923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ClassOfTestAndBranch) \ 933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareIDAndBranch) \ 943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareGeneric) \ 953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareObjectEqAndBranch) \ 961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(CompareMap) \ 973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareConstantEqAndBranch) \ 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Constant) \ 991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(Context) \ 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(DeleteProperty) \ 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Deoptimize) \ 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Div) \ 1033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ElementsKind) \ 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(EnterInlined) \ 10569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch V(FixedArrayBaseLength) \ 106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ForceRepresentation) \ 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(FunctionLiteral) \ 108e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch V(GetCachedArrayIndex) \ 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalObject) \ 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalReceiver) \ 111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Goto) \ 1123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(HasCachedArrayIndexAndBranch) \ 1133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(HasInstanceTypeAndBranch) \ 114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(In) \ 115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InstanceOf) \ 116086aeeaae12517475c22695a200be45495516549Ben Murdoch V(InstanceOfKnownGlobal) \ 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(InvokeFunction) \ 1183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsConstructCallAndBranch) \ 119592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(IsNilAndBranch) \ 1203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsObjectAndBranch) \ 121592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(IsStringAndBranch) \ 1223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsSmiAndBranch) \ 1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsUndetectableAndBranch) \ 124592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(StringCompareAndBranch) \ 1259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block V(JSArrayLength) \ 126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LeaveInlined) \ 127b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(LoadContextSlot) \ 128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadElements) \ 12944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadExternalArrayPointer) \ 1301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(LoadFunctionPrototype) \ 1318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalCell) \ 1328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalGeneric) \ 1333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(LoadKeyedFastDoubleElement) \ 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedFastElement) \ 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedGeneric) \ 13644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadKeyedSpecializedArrayElement) \ 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedField) \ 13844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadNamedFieldPolymorphic) \ 139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedGeneric) \ 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mod) \ 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mul) \ 142592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(ObjectLiteralFast) \ 143592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(ObjectLiteralGeneric) \ 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntry) \ 1451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(OuterContext) \ 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Parameter) \ 147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Power) \ 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(PushArgument) \ 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(RegExpLiteral) \ 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Return) \ 151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sar) \ 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shl) \ 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shr) \ 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Simulate) \ 1553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(SoftDeoptimize) \ 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StackCheck) \ 1571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StoreContextSlot) \ 1588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalCell) \ 1598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalGeneric) \ 1603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(StoreKeyedFastDoubleElement) \ 161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedFastElement) \ 162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedGeneric) \ 1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(StoreKeyedSpecializedArrayElement) \ 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedField) \ 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedGeneric) \ 166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(StringAdd) \ 1671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringCharCodeAt) \ 16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(StringCharFromCode) \ 1691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringLength) \ 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sub) \ 1713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ThisFunction) \ 172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Throw) \ 17344f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ToFastProperties) \ 1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ToInt32) \ 175592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(TransitionElementsKind) \ 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Typeof) \ 1773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(TypeofIsAndBranch) \ 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnaryMathOperation) \ 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnknownOSRValue) \ 1803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(UseConst) \ 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ValueOf) 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V) \ 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Calls) \ 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InobjectFields) \ 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BackingStoreFields) \ 187592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch V(ElementsKind) \ 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayElements) \ 18969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch V(DoubleArrayElements) \ 19044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(SpecializedArrayElements) \ 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalVars) \ 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Maps) \ 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLengths) \ 1941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(ContextSlots) \ 195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntries) 196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type) \ 198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool Is##type() const { return true; } \ 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static H##type* cast(HValue* value) { \ 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(value->Is##type()); \ 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<H##type*>(value); \ 202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type) \ 206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ 207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static H##type* cast(HValue* value) { \ 208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->Is##type()); \ 209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<H##type*>(value); \ 210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } \ 211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::k##type; } 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject { 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 216e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range() 217e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(kMinInt), 218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(kMaxInt), 219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range(int32_t lower, int32_t upper) 223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(lower), 224e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(upper), 225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper() const { return upper_; } 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower() const { return lower_; } 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next() const { return next_; } 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* CopyClearLower() const { return new Range(kMinInt, upper_); } 232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); } 23369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Range* Copy() const { 23469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch Range* result = new Range(lower_, upper_); 23569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(CanBeMinusZero()); 23669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 23769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Mask() const; 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } 240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } 242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeNegative() const { return lower_ < 0; } 243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Includes(int value) const { return lower_ <= value && upper_ >= value; } 24469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch bool IsMostGeneric() const { 24569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero(); 24669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool IsInSmiRange() const { 248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void KeepOrder(); 251592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch#ifdef DEBUG 252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Verify() const; 253592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch#endif 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void StackUpon(Range* other) { 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Intersect(other); 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = other; 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Intersect(Range* other); 261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Union(Range* other); 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void AddConstant(int32_t value); 264e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Sar(int32_t value); 265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Shl(int32_t value); 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool AddAndCheckOverflow(Range* other); 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool SubAndCheckOverflow(Range* other); 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool MulAndCheckOverflow(Range* other); 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower_; 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper_; 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next_; 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool can_be_minus_zero_; 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation { 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Kind { 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNone, 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged, 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kDouble, 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kInteger32, 2851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kExternal, 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNumRepresentations 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation() : kind_(kNone) { } 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation None() { return Representation(kNone); } 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Tagged() { return Representation(kTagged); } 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Integer32() { return Representation(kInteger32); } 294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Double() { return Representation(kDouble); } 2951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static Representation External() { return Representation(kExternal); } 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(const Representation& other) { 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == other.kind_; 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3018b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Kind kind() const { return static_cast<Kind>(kind_); } 302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNone() const { return kind_ == kNone; } 303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() const { return kind_ == kTagged; } 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger32() const { return kind_ == kInteger32; } 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDouble() const { return kind_ == kDouble; } 3061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsExternal() const { return kind_ == kExternal; } 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSpecialization() const { 308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == kInteger32 || kind_ == kDouble; 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* Mnemonic() const; 311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit Representation(Kind k) : kind_(k) { } 314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure kind fits in int8. 3168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte)); 3178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int8_t kind_; 319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType { 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType() : type_(kUninitialized) { } 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Tagged() { return HType(kTagged); } 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } 328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedNumber() { return HType(kTaggedNumber); } 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Smi() { return HType(kSmi); } 330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType HeapNumber() { return HType(kHeapNumber); } 331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType String() { return HType(kString); } 332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Boolean() { return HType(kBoolean); } 333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType NonPrimitive() { return HType(kNonPrimitive); } 334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSArray() { return HType(kJSArray); } 335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSObject() { return HType(kJSObject); } 336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Uninitialized() { return HType(kUninitialized); } 337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Return the weakest (least precise) common type. 339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType Combine(HType other) { 340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType(static_cast<Type>(type_ & other.type_)); 341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool Equals(const HType& other) { 344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == other.type_; 345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSubtypeOf(const HType& other) { 348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Combine(other).Equals(other); 349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() { 352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTagged) == kTagged); 354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedPrimitive() { 357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedPrimitive) == kTaggedPrimitive); 359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedNumber() { 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedNumber) == kTaggedNumber); 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSmi() { 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kSmi) == kSmi); 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsHeapNumber() { 372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kHeapNumber) == kHeapNumber); 374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsString() { 377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kString) == kString); 379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsBoolean() { 382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kBoolean) == kBoolean); 384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNonPrimitive() { 387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kNonPrimitive) == kNonPrimitive); 389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSArray() { 392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSArray) == kJSArray); 394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSObject() { 397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSObject) == kJSObject); 399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsUninitialized() { 402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == kUninitialized; 403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 405592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool IsHeapObject() { 406592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(type_ != kUninitialized); 407592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return IsHeapNumber() || IsString() || IsNonPrimitive(); 408592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 409592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TypeFromValue(Handle<Object> value); 411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* ToString(); 413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Type { 416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged = 0x1, // 0000 0000 0000 0001 417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedNumber = 0xd, // 0000 0000 0000 1101 419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kSmi = 0x1d, // 0000 0000 0001 1101 420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kHeapNumber = 0x2d, // 0000 0000 0010 1101 421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kString = 0x45, // 0000 0000 0100 0101 422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBoolean = 0x85, // 0000 0000 1000 0101 423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNonPrimitive = 0x101, // 0000 0001 0000 0001 424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kJSObject = 0x301, // 0000 0011 0000 0001 4253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kJSArray = 0x701, // 0000 0111 0000 0001 426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUninitialized = 0x1fff // 0001 1111 1111 1111 427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure type fits in int16. 4308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte))); 4318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HType(Type t) : type_(t) { } 433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int16_t type_; 435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject { 439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode(HValue* value, int index, HUseListNode* tail) 441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : tail_(tail), value_(value), index_(index) { 442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail() const { return tail_; } 445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() const { return value_; } 446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() const { return index_; } 447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_tail(HUseListNode* list) { tail_ = list; } 449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG 451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Zap() { 452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch tail_ = reinterpret_cast<HUseListNode*>(1); 453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_ = NULL; 454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch index_ = -1; 455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail_; 460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted. 466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them. 467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED { 468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Done() { return current_ == NULL; } 470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Advance(); 471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { 473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return value_; 475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() { 478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return index_; 480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 481257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HUseIterator(HUseListNode* head); 484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 485257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* current_; 486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* next_; 487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class HValue; 491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject { 495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoNumber = -1; 497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // There must be one corresponding kDepends flag for every kChanges flag and 499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the order of the kChanges flags must be exactly the same as of the kDepends 500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // flags. 501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Flag { 502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare global value numbering flags. 503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch #define DECLARE_DO(type) kChanges##type, kDependsOn##type, 504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GVN_FLAG_LIST(DECLARE_DO) 505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch #undef DECLARE_DO 506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kFlexibleRepresentation, 5073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Participate in Global Value Numbering, i.e. elimination of 5083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // unnecessary recomputations. If an instruction sets this flag, it must 5093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // implement DataEquals(), which will be used to determine if other 5103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // occurrences of the instruction are indeed the same. 511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUseGVN, 512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanOverflow, 513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBailoutOnMinusZero, 514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanBeDivByZero, 5157d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch kDeoptimizeOnUndefined, 516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kIsArguments, 517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTruncatingToInt32, 518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kLastFlag = kTruncatingToInt32 519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STATIC_ASSERT(kLastFlag < kBitsPerInt); 522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kChangesToDependsFlagsLeftShift = 1; 524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int ConvertChangesToDependsFlags(int flags) { 526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return flags << kChangesToDependsFlagsLeftShift; 527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HValue* cast(HValue* value) { return value; } 530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Opcode { 532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare a unique enum value for each hydrogen instruction. 533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_OPCODE(type) k##type, 534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) 535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kPhi 536257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_OPCODE 537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const = 0; 539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare a non-virtual predicates for each concrete HInstruction or HValue. 541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Is##type() const { return opcode() == k##type; } 543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool IsPhi() const { return opcode() == kPhi; } 546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare virtual predicates for abstract HInstruction or HValue 548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 549257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool Is##type() const { return false; } 550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE) 551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue() : block_(NULL), 554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch id_(kNoNumber), 555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_(HType::Tagged()), 556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch use_list_(NULL), 557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_(NULL), 558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch flags_(0) {} 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HValue() {} 560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block() const { return block_; } 562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetBlock(HBasicBlock* block); 563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id() const { return id_; } 565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_id(int id) { id_ = id; } 566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseIterator uses() const { return HUseIterator(use_list_); } 568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 56944f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return false; } 570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation() const { return representation_; } 571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ChangeRepresentation(Representation r) { 572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation was already set and is allowed to be changed. 573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!r.IsNone()); 574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CheckFlag(kFlexibleRepresentation)); 575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RepresentationChanged(r); 576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void AssumeRepresentation(Representation r); 579257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { return true; } 581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type() const { return type_; } 58369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void set_type(HType new_type) { 58469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(new_type.IsSubtypeOf(type_)); 58569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch type_ = new_type; 586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // An operation needs to override this function iff: 589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 1) it can produce an int32 output. 590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 2) the true value of its output can potentially be minus zero. 591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The implementation must set a flag so that it bails out in the case where 592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it would otherwise output what should be a minus zero as an int32 zero. 593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the operation also exists in a form that takes int32 and outputs int32 594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then the operation should return its input value so that we can propagate 5953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // back. There are three operations that need to propagate back to more than 5963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // one input. They are phi and binary div and mul. They always return NULL 5973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // and expect the caller to take care of things. 598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) { 599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDefinedAfter(HBasicBlock* other) const; 604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Operands. 606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() = 0; 607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) = 0; 608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetOperandAt(int index, HValue* value); 609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void DeleteAndReplaceWith(HValue* other); 611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void ReplaceAllUsesWith(HValue* other); 612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasNoUses() const { return use_list_ == NULL; } 613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasMultipleUses() const { 614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return use_list_ != NULL && use_list_->tail() != NULL; 615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int UseCount() const; 617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ClearOperands(); 618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags() const { return flags_; } 6201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetFlag(Flag f) { flags_ |= (1 << f); } 6211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearFlag(Flag f) { flags_ &= ~(1 << f); } 6221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; } 6231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetAllSideEffects() { flags_ |= AllSideEffects(); } 6251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); } 6261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; } 627592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool HasObservableSideEffects() const { 628592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return (flags_ & ObservableSideEffects()) != 0; 629592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 631589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch int ChangesFlags() const { return flags_ & ChangesFlagsMask(); } 632592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int ObservableChangesFlags() const { 633592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return flags_ & ChangesFlagsMask() & ObservableSideEffects(); 634592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 635589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range() const { return range_; } 637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasRange() const { return range_ != NULL; } 638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNewRange(Range* r); 639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RemoveLastAddedRange(); 640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ComputeInitialRange(); 641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation helpers. 643592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) = 0; 644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // This gives the instruction an opportunity to replace itself with an 650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction that does the same in some better way. To replace an 651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction with a new one, first add the new instruction to the graph, 652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then return it. Return NULL to have the instruction deleted. 653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { return this; } 654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(HValue* other); 656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode(); 657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Printing support. 659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream) = 0; 660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void PrintNameTo(StringStream* stream); 661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintTypeTo(StringStream* stream); 662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintRangeTo(StringStream* stream); 663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintChangesTo(StringStream* stream); 664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const char* Mnemonic() const; 666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Updated the inferred type of this instruction and returns true if 668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it has changed. 669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool UpdateInferredType(); 670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 6741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() = 0; 675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // This function must be overridden for instructions with flag kUseGVN, to 6791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // compare the non-Operand parts of the instruction. 680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 6811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 6821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return false; 6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { } 685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() = 0; 687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) = 0; 688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void clear_block() { 689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block_ != NULL); 690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block_ = NULL; 691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_representation(Representation r) { 694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation is set-once. 695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(representation_.IsNone() && !r.IsNone()); 696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 700589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch static int ChangesFlagsMask() { 701589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch int result = 0; 702589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Create changes mask. 703589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#define ADD_FLAG(type) result |= (1 << kChanges##type); 704589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch GVN_FLAG_LIST(ADD_FLAG) 705589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG 706589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return result; 707589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 708589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 7091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // A flag mask to mark an instruction as having arbitrary side effects. 7101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static int AllSideEffects() { 7111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return ChangesFlagsMask() & ~(1 << kChangesOsrEntries); 7121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 7131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 714592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch // A flag mask of all side effects that can make observable changes in 715592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch // an executing program (i.e. are not safe to repeat, move or remove); 716592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static int ObservableSideEffects() { 717592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return ChangesFlagsMask() & ~(1 << kChangesElementsKind); 718592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 719592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 720257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Remove the matching use from the use list if present. Returns the 721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // removed list node or NULL. 722257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* RemoveUse(HValue* value, int index); 723257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterUse(int index, HValue* new_value); 725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block_; 727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The id of this instruction in the hydrogen graph, assigned when first 729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // added to the graph. Reflects creation order. 730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id_; 731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation_; 733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type_; 734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* use_list_; 735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range_; 736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags_; 737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DISALLOW_COPY_AND_ASSIGN(HValue); 739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue { 743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next() const { return next_; } 745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous() const { return previous_; } 746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 747e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 748e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream) { } 749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsLinked() const { return block() != NULL; } 751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Unlink(); 752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertBefore(HInstruction* next); 753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertAfter(HInstruction* previous); 754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position() const { return position_; } 756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool has_position() const { return position_ != RelocInfo::kNoPosition; } 757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_position(int position) { position_ = position; } 758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 7621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return false; } 766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 767257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(Instruction) 768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction() 771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : next_(NULL), 772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_(NULL), 773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch position_(RelocInfo::kNoPosition) { 774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnOsrEntries); 775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() { Unlink(); } 778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitializeAsFirst(HBasicBlock* block) { 781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(block); 783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintMnemonicTo(StringStream* stream); 786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next_; 788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous_; 789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position_; 790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class HBasicBlock; 792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int V> 7963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateInstruction : public HInstruction { 797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int OperandCount() { return V; } 7993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 8023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 8031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 8053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HValue*, V> inputs_; 806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HControlInstruction: public HInstruction { 810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 8113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HBasicBlock* SuccessorAt(int i) = 0; 8123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual int SuccessorCount() = 0; 8133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; 814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 8163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* FirstSuccessor() { 8183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; 8193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 8203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* SecondSuccessor() { 8213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; 822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSuccessorIterator BASE_EMBEDDED { 829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 8303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HSuccessorIterator(HControlInstruction* instr) 8313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : instr_(instr), current_(0) { } 832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool Done() { return current_ >= instr_->SuccessorCount(); } 8343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* Current() { return instr_->SuccessorAt(current_); } 8353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Advance() { current_++; } 836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 8383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HControlInstruction* instr_; 8393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int current_; 840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V> 8443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateControlInstruction: public HControlInstruction { 845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 8463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int SuccessorCount() { return S; } 8473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* SuccessorAt(int i) { return successors_[i]; } 8483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; } 8493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int OperandCount() { return V; } 851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 8583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HBasicBlock*, S> successors_; 8593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HValue*, V> inputs_; 860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> { 864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 865592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 872e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// We insert soft-deoptimize when we hit code with unknown typefeedback, 8743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// so that we get a chance of re-optimizing with useful typefeedback. 8753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// HSoftDeoptimize does not end a basic block as opposed to HDeoptimize. 8763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSoftDeoptimize: public HTemplateInstruction<0> { 8773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 878592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 8793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 8803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 8813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(SoftDeoptimize) 8833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 8843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 88644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction { 887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 8883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HDeoptimize(int environment_length) : values_(environment_length) { } 889e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 890592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 891e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 8931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 89444f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual int OperandCount() { return values_.length(); } 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual HValue* OperandAt(int index) { return values_[index]; } 8963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 8973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual int SuccessorCount() { return 0; } 8993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HBasicBlock* SuccessorAt(int i) { 9003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 9013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 9023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void SetSuccessorAt(int i, HBasicBlock* block) { 9043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 9053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 90644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 90744f0eee88ff00398ff7f715fab053374d808c90dSteve Block void AddEnvironmentValue(HValue* value) { 90844f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_.Add(NULL); 90944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetOperandAt(values_.length() - 1, value); 91044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 91144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 912257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 913257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum UseEnvironment { 915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kNoUses, 916257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kUseAll 917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 91844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 91944f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 92044f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual void InternalSetOperandAt(int index, HValue* value) { 92144f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_[index] = value; 92244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 92344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 92444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 92544f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneList<HValue*> values_; 926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGoto: public HTemplateControlInstruction<1, 0> { 930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HGoto(HBasicBlock* target) { 932592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetSuccessorAt(0, target); 933592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 935592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 939589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PrintDataTo(StringStream* stream); 940589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Goto) 942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> { 946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryControlInstruction(HValue* value, 9483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* true_target, 9493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* false_target) { 950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 9513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(0, true_target); 9523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(1, false_target); 953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 955e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBranch: public HUnaryControlInstruction { 962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 96369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBranch(HValue* value, 96469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBasicBlock* true_target, 96569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBasicBlock* false_target, 96669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types = ToBooleanStub::no_types()) 96769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target), 96869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch expected_input_types_(expected_input_types) { 9691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL && false_target != NULL); 970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 9713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HBranch(HValue* value) 9723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 9733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 97969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types() const { 98069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return expected_input_types_; 98169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 98269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 9833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Branch) 98469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 98569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 98669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types_; 987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction { 991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCompareMap(HValue* value, 9931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<Map> map, 9941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* true_target, 9951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* false_target) 9961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryControlInstruction(value, true_target, false_target), 9971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block map_(map) { 9981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL); 9991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(false_target != NULL); 1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!map.is_null()); 1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1003e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 1006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1008e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1009e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareMap) 1012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 1015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HReturn: public HTemplateControlInstruction<0, 1> { 1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 10203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HReturn(HValue* value) { 10213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, value); 10221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1024592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1025e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1026e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1027e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 10283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 10293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(0); } 10313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1032257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Return) 1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HAbnormalExit: public HTemplateControlInstruction<0, 0> { 1037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1038592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1039e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1040e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1042257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> { 1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HUnaryOperation(HValue* value) { 1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static HUnaryOperation* cast(HValue* value) { 10533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return reinterpret_cast<HUnaryOperation*>(value); 10543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool CanTruncateToInt32() const { 10573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return CheckFlag(kTruncatingToInt32); 10583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 1061e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThrow: public HTemplateInstruction<2> { 10661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 10673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HThrow(HValue* context, HValue* value) { 10683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 10693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 10701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 10711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 10721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1073592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 10741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 10751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 10761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 10773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 10783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 10793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Throw) 1081257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1082257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 10843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUseConst: public HUnaryOperation { 10853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 10863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } 10873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1088592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 10893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 10903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 10913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UseConst) 10933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 10943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> { 1097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HForceRepresentation(HValue* value, Representation required_representation) { 1099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(0, value); 1100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(required_representation); 1101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { return OperandAt(0); } 1104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1107592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return representation(); // Same as the output representation. 1109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 11121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 11131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation { 1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HChange(HValue* value, 1118e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation to, 11197d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool is_truncating, 11207d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool deoptimize_on_undefined) 1121592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HUnaryOperation(value) { 1122592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(!value->representation().IsNone() && !to.IsNone()); 1123592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(!value->representation().Equals(to)); 1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(to); 1125592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch set_type(HType::TaggedNumber()); 1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1127592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); 1128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (is_truncating) SetFlag(kTruncatingToInt32); 1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1132592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1134592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Representation from() { return value()->representation(); } 1135592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Representation to() { return representation(); } 1136592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool deoptimize_on_undefined() const { 1137592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return CheckFlag(kDeoptimizeOnUndefined); 1138592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 1139592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1140592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return from(); 1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 114369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual Range* InferRange(); 114469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Change) 1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1150592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation { 1155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HClampToUint8(HValue* value) 11573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryOperation(value) { 11583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 1159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 1160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1162592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 11633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 1164257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1165257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 11663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 11673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 11693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 11703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 11713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HToInt32: public HUnaryOperation { 11743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 11753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HToInt32(HValue* value) 11763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryOperation(value) { 11773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 11783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 11793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1181592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 11823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 11833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool CanTruncateToInt32() const { 11863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return true; 11873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HValue* Canonicalize() { 11903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (value()->representation().IsInteger32()) { 11913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return value(); 1192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 11933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return this; 1194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 11973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ToInt32) 1198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 1200257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 1201257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1202257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction { 1205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 12068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HSimulate(int ast_id, int pop_count) 1207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : ast_id_(ast_id), 1208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pop_count_(pop_count), 1209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_(2), 1210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_(2) {} 1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HSimulate() {} 1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; } 1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 1217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_ast_id(int id) { 1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!HasAstId()); 1219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ast_id_ = id; 1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count() const { return pop_count_; } 1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const ZoneList<HValue*>* values() const { return &values_; } 1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int GetAssignedIndexAt(int index) const { 1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasAssignedIndexAt(index)); 1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index]; 1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAssignedIndexAt(int index) const { 1229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index] != kNoIndex; 1230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddAssignedValue(int index, HValue* value) { 1232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(index, value); 1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddPushedValue(HValue* value) { 1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(kNoIndex, value); 1236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return values_.length(); } 1238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return values_[index]; } 1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1240592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1241e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1244257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Simulate) 1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 12471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[index] = value; 1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoIndex = -1; 1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddValue(int index, HValue* value) { 1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_.Add(index); 1259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Resize the list of pushed values. 1260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_.Add(NULL); 1261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Set the operand through the base method in HValue to make sure that the 1262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // use lists are correctly updated. 1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(values_.length() - 1, value); 1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count_; 1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> values_; 1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int> assigned_indexes_; 1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStackCheck: public HTemplateInstruction<1> { 1273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 12743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum Type { 12753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kFunctionEntry, 12763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kBackwardsBranch 12773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 12783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStackCheck(HValue* context, Type type) : type_(type) { 12803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 12813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 12823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 1284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1285592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 12863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 1287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 12893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Eliminate() { 12903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // The stack check eliminator might try to eliminate the same stack 12913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // check instruction multiple times. 12923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (IsLinked()) { 12933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DeleteFromGraph(); 12943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 12953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 12963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_function_entry() { return type_ == kFunctionEntry; } 12983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_backwards_branch() { return type_ == kBackwardsBranch; } 12993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StackCheck) 13013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 13033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Type type_; 1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> { 1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HEnterInlined(Handle<JSFunction> closure, 1310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FunctionLiteral* function, 1311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind) 1312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : closure_(closure), 1313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function_(function), 1314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch call_kind_(call_kind) { 1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure() const { return closure_; } 1320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function() const { return function_; } 1321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind() const { return call_kind_; } 1322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1323592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(EnterInlined) 1328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure_; 1331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function_; 1332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind_; 1333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> { 1337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLeaveInlined() {} 1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1340592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1343e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 1345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation { 1349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 1351e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 1352e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1354592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1358e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* argument() { return OperandAt(0); } 1359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(PushArgument) 13611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 1362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 13643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThisFunction: public HTemplateInstruction<0> { 13653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1366592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch explicit HThisFunction(Handle<JSFunction> closure) : closure_(closure) { 13673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Tagged()); 13683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 13693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1371592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 13723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 13733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1375592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<JSFunction> closure() const { return closure_; } 1376592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 13773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ThisFunction) 13783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 1380592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual bool DataEquals(HValue* other) { 1381592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HThisFunction* b = HThisFunction::cast(other); 1382592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return *closure() == *b->closure(); 1383592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 1384592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 1385592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 1386592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<JSFunction> closure_; 13873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 13883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1390e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> { 13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 13921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HContext() { 13931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 13941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 13951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 13961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1397592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1400e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Context) 14021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1404e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation { 1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { 14111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 14121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 14131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OuterContext); 14161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1417592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 14231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 14241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation { 14271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 14281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { 1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalObject) 14341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1435592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1436e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1440e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation { 1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalReceiver(HValue* global_object) 14471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(global_object) { 1448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver) 14531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1454592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1459e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> { 1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The argument count includes the receiver. 1467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 1468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 1469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->SetAllSideEffects(); 14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { return HType::Tagged(); } 1473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual int argument_count() const { return argument_count_; } 14751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return true; } 14771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 14791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int argument_count_; 14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> { 14841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 14851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall(HValue* value, int argument_count) 1486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<1>(argument_count) { 14871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, value); 14881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1490592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 14931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 14951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 14971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 14981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> { 15011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 15021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBinaryCall(HValue* first, HValue* second, int argument_count) 1503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<2>(argument_count) { 15041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, first); 15051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(1, second); 1506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1510592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1512e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 15131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* first() { return OperandAt(0); } 1515e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* second() { return OperandAt(1); } 1516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 15181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall { 1520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HInvokeFunction(HValue* context, HValue* function, int argument_count) 1522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HBinaryCall(context, function, argument_count) { 1523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1525592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 1527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1528257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* context() { return first(); } 1530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* function() { return second(); } 1531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1536e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> { 1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCallConstantFunction(Handle<JSFunction> function, int argument_count) 1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), function_(function) { } 1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function() const { return function_; } 15421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsApplyFunction() const { 154444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return function_->code() == 154544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply); 1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1548e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1549e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1550592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction) 1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function_; 1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall { 1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKeyed(HValue* context, HValue* key, int argument_count) 15641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, key, argument_count) { 1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1567592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1571e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return second(); } 1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKeyed) 1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall { 1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNamed(HValue* context, Handle<String> name, int argument_count) 15811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 15821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 15831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNamed) 1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1591592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1600592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HCallFunction: public HBinaryCall { 1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1602592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HCallFunction(HValue* context, HValue* function, int argument_count) 1603592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HBinaryCall(context, function, argument_count) { 16041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1606592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context() { return first(); } 1607592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* function() { return second(); } 1608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1609592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallFunction) 1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall { 1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallGlobal(HValue* context, Handle<String> name, int argument_count) 16201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1623e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1625e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1628592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1630e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallGlobal) 1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> { 1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKnownGlobal(Handle<JSFunction> target, int argument_count) 1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), target_(target) { } 1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 16451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 1647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1648592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal) 1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall { 1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNew(HValue* context, HValue* constructor, int argument_count) 16621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, constructor, argument_count) { 16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1665592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1669e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1670e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* constructor() { return second(); } 1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNew) 1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCallRuntime: public HCall<1> { 1677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCallRuntime(HValue* context, 16793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> name, 168044f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function, 1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int argument_count) 16823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HCall<1>(argument_count), c_function_(c_function), name_(name) { 16833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 16843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 16853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1686e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 168944f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function() const { return c_function_; } 1690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1692592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 16933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 1694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1695e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 169944f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function_; 1700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 170469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HJSArrayLength: public HTemplateInstruction<2> { 1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 170669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HJSArrayLength(HValue* value, HValue* typecheck) { 1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length of an array is stored as a tagged value in the array 1708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // object. It is guaranteed to be 32 bit integer, but it can be 1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // represented as either a smi or heap number. 171069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(0, value); 171169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(1, typecheck); 1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 171444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnArrayLengths); 171544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 1716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1718592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1722589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PrintDataTo(StringStream* stream); 1723589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 172469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HValue* value() { return OperandAt(0); } 1725589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch HValue* typecheck() { return OperandAt(1); } 172669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1727257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) 17281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 17319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 17329fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 17339fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 173469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HFixedArrayBaseLength: public HUnaryOperation { 17359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 173669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) { 17379fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 17389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block SetFlag(kUseGVN); 173944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnArrayLengths); 17409fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 17419fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 1742592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 17439fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 17449fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 17459fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 174669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength) 17471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HElementsKind: public HUnaryOperation { 17543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 17553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HElementsKind(HValue* value) : HUnaryOperation(value) { 17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 1758592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetFlag(kDependsOnElementsKind); 17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1761592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 17633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 17643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ElementsKind) 17663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 17703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation { 1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HBitNot(HValue* value) : HUnaryOperation(value) { 1775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kTruncatingToInt32); 1778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1780592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 1782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitNot) 17861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryMathOperation: public HTemplateInstruction<2> { 1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 17943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) 17953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : op_(op) { 17963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 17973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 1798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: 1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: 1801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: 1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: 1805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: 1809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathPowHalf: 1810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: 1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: 1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: 1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 1816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 1817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 18223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 18233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1830592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 18313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 0) { 18323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 18333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 18343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (op_) { 18353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathFloor: 18363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathRound: 18373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathCeil: 18383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathSqrt: 18393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathPowHalf: 18403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathLog: 18413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathSin: 18423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathCos: 18433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Double(); 18443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathAbs: 18453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return representation(); 18463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch default: 18473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 18483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { 1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the input is integer32 then we replace the floor instruction 1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with its inputs. This happens before the representation changes are 1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // introduced. 1857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (op() == kMathFloor) { 1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->representation().IsInteger32()) return value(); 1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return this; 1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op() const { return op_; } 1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* OpName() const; 1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op_ == b->op(); 1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op_; 1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation { 1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HLoadElements(HValue* value) : HUnaryOperation(value) { 1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 1885592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetFlag(kDependsOnElementsKind); 1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1888592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadElements) 18931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 18961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 18971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 189944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation { 19001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 190144f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HLoadExternalArrayPointer(HValue* value) 19021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value) { 19031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::External()); 19041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The result of this instruction is idempotent as long as its inputs don't 190544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // change. The external array of a specialized array elements object cannot 19061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // change once set, so it's no necessary to introduce any additional 19071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // dependencies on top of the inputs. 19081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 19091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1911592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 19121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 19131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 19161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 192269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HCheckMap: public HTemplateInstruction<2> { 1923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 192469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HCheckMap(HValue* value, Handle<Map> map, HValue* typecheck = NULL) 192569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch : map_(map) { 192669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(0, value); 192769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // If callers don't depend on a typecheck, they can pass in NULL. In that 192869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // case we use a copy of the |value| argument as a dummy value. 192969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(1, typecheck != NULL ? typecheck : value); 1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 1933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1935592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 194169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HValue* value() { return OperandAt(0); } 1942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 1943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1944257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMap) 1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1947e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckMap* b = HCheckMap::cast(other); 1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return map_.is_identical_to(b->map()); 1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 1954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation { 1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction(HValue* value, Handle<JSFunction> function) 1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(value), target_(function) { 1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1965592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 19721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 1976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1977257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckFunction) 1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction* b = HCheckFunction::cast(other); 1982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return target_.is_identical_to(b->target()); 1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation { 1991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 19923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static HCheckInstanceType* NewIsSpecObject(HValue* value) { 19933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return new HCheckInstanceType(value, IS_SPEC_OBJECT); 1994257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsJSArray(HValue* value) { 1996257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_JS_ARRAY); 1997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1998257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsString(HValue* value) { 1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_STRING); 2000257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2001257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsSymbol(HValue* value) { 2002257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_SYMBOL); 2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 2006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HValue* Canonicalize(); 2012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2013257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } 2014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckInterval(InstanceType* first, InstanceType* last); 2015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); 2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2017257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) 2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(ager): It could be nice to allow the ommision of instance 2021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // type checks if we have already performed an instance type check 2022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with a larger range. 2023e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckInstanceType* b = HCheckInstanceType::cast(other); 2025257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return check_ == b->check_; 2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2029257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum Check { 20303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch IS_SPEC_OBJECT, 2031257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_JS_ARRAY, 2032257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_STRING, 2033257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_SYMBOL, 2034257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LAST_INTERVAL_CHECK = IS_JS_ARRAY 2035257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2037592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch const char* GetCheckName(); 2038592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2039257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HCheckInstanceType(HValue* value, Check check) 2040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HUnaryOperation(value), check_(check) { 2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 2042257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 2043257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const Check check_; 2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation { 2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { 2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2056592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 20631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* Canonicalize() { 2067257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HType value_type = value()->type(); 2068257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!value_type.IsUninitialized() && 2069257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (value_type.IsHeapNumber() || 2070257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsString() || 2071257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsBoolean() || 2072257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsNonPrimitive())) { 2073257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 2074257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2075257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 2076257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2077257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2078257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi) 20791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2081e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2085e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> { 2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2087b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder) 2088b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : prototype_(prototype), holder_(holder) { 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 20941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2097b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype() const { return prototype_; } 2098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder() const { return holder_; } 2099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) 2101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2103e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 210744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->IsAllocationAllowed()); 2108b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch intptr_t hash = reinterpret_cast<intptr_t>(*prototype()); 2109b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch hash = 17 * hash + reinterpret_cast<intptr_t>(*holder()); 2110b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return hash; 2111b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2112b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2114e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); 2116b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return prototype_.is_identical_to(b->prototype()) && 2117b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch holder_.is_identical_to(b->holder()); 2118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2121b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype_; 2122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder_; 2123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation { 2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { 2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2133592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 21391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 21431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue { 2150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HPhi(int merged_index) 2152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : inputs_(2), 2153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch merged_index_(merged_index), 215444f0eee88ff00398ff7f715fab053374d808c90dSteve Block phi_id_(-1), 2155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_live_(false), 2156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_(true) { 2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch non_phi_uses_[i] = 0; 2159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] = 0; 2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(merged_index >= 0); 2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool double_occurred = false; 2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool int32_occurred = false; 2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsDouble()) double_occurred = true; 2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsInteger32()) int32_occurred = true; 2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsTagged()) return Representation::Tagged(); 2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (double_occurred) return Representation::Double(); 2177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (int32_occurred) return Representation::Integer32(); 2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 2179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2182592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 2184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2185e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2186e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return inputs_.length(); } 2187e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return inputs_[index]; } 2188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* GetRedundantReplacement(); 2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddInput(HValue* value); 219044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasRealUses(); 2191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsReceiver() { return merged_index_ == 0; } 2193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index() const { return merged_index_; } 2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 21991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitRealUses(int id); 2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNonPhiUsesFrom(HPhi* other); 2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddIndirectUsesTo(int* use_count); 2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_non_phi_uses() const { 2207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kTagged]; 2208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_non_phi_uses() const { 2210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kInteger32]; 2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_non_phi_uses() const { 2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kDouble]; 2214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_indirect_uses() const { 2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kTagged]; 2217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_indirect_uses() const { 2219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kInteger32]; 2220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_indirect_uses() const { 2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kDouble]; 2223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id() { return phi_id_; } 222544f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live() { return is_live_; } 222644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_is_live(bool b) { is_live_ = b; } 2227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HPhi* cast(HValue* value) { 2229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->IsPhi()); 2230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<HPhi*>(value); 2231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2232257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::kPhi; } 2233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return is_convertible_to_integer_; 2236257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2237257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_is_convertible_to_integer(bool b) { 2239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_ = b; 2240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2241257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2242589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch bool AllOperandsConvertibleToInteger() { 2243589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 2244589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (!OperandAt(i)->IsConvertibleToInteger()) return false; 2245589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2246589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return true; 2247589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2248589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph(); 2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_[index] = value; 2253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> inputs_; 2257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index_; 2258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int non_phi_uses_[Representation::kNumRepresentations]; 2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int indirect_uses_[Representation::kNumRepresentations]; 2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id_; 226244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live_; 2263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_convertible_to_integer_; 2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> { 2268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsObject() { 2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kIsArguments); 2272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2274592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> { 2283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant(Handle<Object> handle, Representation r); 2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle() const { return handle_; } 2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 228844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); } 22899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 2290592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool ImmortalImmovable() const { 2291592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Heap* heap = HEAP; 2292592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->undefined_value()) return true; 2293592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->null_value()) return true; 2294592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->true_value()) return true; 2295592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->false_value()) return true; 2296592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->the_hole_value()) return true; 2297592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->minus_zero_value()) return true; 2298592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->nan_value()) return true; 2299592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (*handle_ == heap->empty_string()) return true; 2300592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return false; 2301592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2302592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2303592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsSmi()) return true; 2309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsHeapNumber() && 2310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (HeapNumber::cast(*handle_)->value() == 2311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static_cast<double>(NumberToInt32(*handle_)))) return true; 2312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return false; 2313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 231544f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return !representation().IsDouble(); } 2316592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HValue* Canonicalize(); 2317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger() const { return handle_->IsSmi(); } 2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToRepresentation(Representation r) const; 2321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToTruncatedInt32() const; 2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasInteger32Value() const { return has_int32_value_; } 2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Integer32Value() const { 2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasInteger32Value()); 2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return int32_value_; 2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasDoubleValue() const { return has_double_value_; } 2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double DoubleValue() const { 2329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasDoubleValue()); 2330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return double_value_; 2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2332592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool HasNumberValue() const { return has_int32_value_ || has_double_value_; } 2333592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int32_t NumberValueAsInteger32() const { 2334592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(HasNumberValue()); 2335592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (has_int32_value_) return int32_value_; 2336592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return DoubleToInt32(double_value_); 2337592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasStringValue() const { return handle_->IsString(); } 2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool ToBoolean() const; 23418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 234344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<intptr_t>(*handle()); 2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 23481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() { } 2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Constant) 2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* other_constant = HConstant::cast(other); 2358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return handle().is_identical_to(other_constant->handle()); 2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle_; 2363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The following two values represent the int32 and the double value of the 2365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // given constant if there is a lossless conversion between the constant 2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // and the specific representation. 2367257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_int32_value_ : 1; 2368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_double_value_ : 1; 2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t int32_value_; 2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double double_value_; 2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBinaryOperation: public HTemplateInstruction<3> { 2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 23763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBinaryOperation(HValue* context, HValue* left, HValue* right) { 2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(left != NULL && right != NULL); 23783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 23793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, left); 23803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, right); 2381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 23843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(1); } 23853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(2); } 2386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(kasperl): Move these helpers to the IA-32 Lithium 2388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction sequence builder. 2389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* LeastConstantOperand() { 2390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return right(); 2391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2393e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* MostConstantOperand() { 2394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return left(); 2395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return right(); 2396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return false; } 2399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2400e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2404e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> { 2405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HApplyArguments(HValue* function, 2407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* receiver, 2408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* length, 2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* elements) { 2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, function); 2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, receiver); 2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, length); 2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(3, elements); 24151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2418592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length is untagged, all other inputs are tagged. 2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 2) 2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Integer32() 2422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Tagged(); 2423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 2426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* receiver() { return OperandAt(1); } 2427e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(2); } 2428e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* elements() { return OperandAt(3); } 2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 2431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> { 2435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsElements() { 2437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The value produced by this instruction is a pointer into the stack 2438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // that looks as if it was a smi because of alignment. 2439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 24441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2445592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2447e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 24491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation { 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 2457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2461592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 24661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 24671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2472e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> { 2473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 2475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, arguments); 2478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, length); 2479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, index); 2480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2484592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The arguments elements is considered tagged. 2486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return index == 0 2487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Tagged() 2488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Integer32(); 2489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* arguments() { return OperandAt(0); } 2492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(1); } 2493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* index() { return OperandAt(2); } 2494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) 2496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBoundsCheck: public HTemplateInstruction<2> { 2502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 25033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBoundsCheck(HValue* index, HValue* length) { 25043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, index); 25053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, length); 25067d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch set_representation(Representation::Integer32()); 2507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2510592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 2512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 251469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 2515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* index() { return OperandAt(0); } 25173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* length() { return OperandAt(1); } 2518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 25201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2522e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation { 2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 25283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right) 25293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 25301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 25311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kFlexibleRepresentation); 25321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2535592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 25363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 25373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 25383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : representation(); 2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void RepresentationChanged(Representation to) { 25421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (!to.IsTagged()) { 25431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsInteger32()); 25441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 25451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kTruncatingToInt32); 25461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 25471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 25481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 25491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 25511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation { 2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 25583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 25593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 25621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { 2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!to.IsTagged()) { 25671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2573592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 25743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 25753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 25763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : representation(); 2577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 25783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 2580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->representation().Equals(right()->representation())) { 2581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left()->representation(); 2582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HValue::InferredRepresentation(); 2584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareGeneric: public HBinaryOperation { 2589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 25903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareGeneric(HValue* context, 25913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left, 25923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right, 25933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token) 25943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right), token_(token) { 2595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(Token::IsCompareOp(token)); 2596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 25971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2600592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 26013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation GetInputRepresentation() const { 26053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token() const { return token_; } 2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 2614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token_; 2617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> { 2621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 26223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token) 26233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : token_(token) { 26243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(Token::IsCompareOp(token)); 26253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 26263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 26303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 26313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token() const { return token_; } 26323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void SetInputRepresentation(Representation r); 26343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Representation GetInputRepresentation() const { 26353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return input_representation_; 26361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 26371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2638592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 26393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return input_representation_; 2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch) 26441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 26463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Representation input_representation_; 26473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token_; 2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> { 2652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 26533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareObjectEqAndBranch(HValue* left, HValue* right) { 26543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 26553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 2656257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 26583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 26593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 2660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2661592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 2662592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2663592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 2665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 26673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) 2668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 26713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareConstantEqAndBranch: public HUnaryControlInstruction { 2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 26733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op) 26743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) { 26753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(op == Token::EQ_STRICT); 2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value op() const { return op_; } 26793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return value(); } 26803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int right() const { return right_; } 26811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2682592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 26833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Integer32(); 2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch); 26873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 26883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 26893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const Token::Value op_; 26903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const int right_; 2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2694592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HIsNilAndBranch: public HUnaryControlInstruction { 2695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2696592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HIsNilAndBranch(HValue* value, EqualityKind kind, NilValue nil) 2697592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), kind_(kind), nil_(nil) { } 2698592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2699592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch EqualityKind kind() const { return kind_; } 2700592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch NilValue nil() const { return nil_; } 2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2702592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2704592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2708592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch) 27093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2711592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch EqualityKind kind_; 2712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch NilValue nil_; 2713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsObjectAndBranch: public HUnaryControlInstruction { 2717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsObjectAndBranch(HValue* value) 27193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2721592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 27233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 27241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) 2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2728592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HIsStringAndBranch: public HUnaryControlInstruction { 2729592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 2730592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch explicit HIsStringAndBranch(HValue* value) 2731592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2732592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2733592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2734592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return Representation::Tagged(); 2735592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2736592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2737592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) 2738592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}; 2739592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsSmiAndBranch: public HUnaryControlInstruction { 2742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsSmiAndBranch(HValue* value) 27443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 27453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 27463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) 2747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2748592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 27503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2752257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 2753257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 2754257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsUndetectableAndBranch: public HUnaryControlInstruction { 2758257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 27593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsUndetectableAndBranch(HValue* value) 27603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2761257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2762592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 27643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 27651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) 27671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 27681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2770592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HStringCompareAndBranch: public HTemplateControlInstruction<2, 3> { 2771592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 2772592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HStringCompareAndBranch(HValue* context, 2773592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 2774592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right, 2775592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value token) 2776592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : token_(token) { 2777592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(Token::IsCompareOp(token)); 2778592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetOperandAt(0, context); 2779592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetOperandAt(1, left); 2780592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetOperandAt(2, right); 2781592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch set_representation(Representation::Tagged()); 2782592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2783592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2784592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context() { return OperandAt(0); } 2785592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left() { return OperandAt(1); } 2786592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right() { return OperandAt(2); } 2787592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value token() const { return token_; } 2788592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2789592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 2790592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2791592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2792592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return Representation::Tagged(); 2793592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2794592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2795592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Representation GetInputRepresentation() const { 2796592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return Representation::Tagged(); 2797592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 2798592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2799592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) 2800592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2801592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 2802592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value token_; 2803592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}; 2804592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2805592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 28063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> { 28071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 2808592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 28123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) 2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasInstanceTypeAndBranch: public HUnaryControlInstruction { 2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType type) 28193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } 28203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) 28213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { 2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. 2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from() { return from_; } 2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to() { return to_; } 2827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2830592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) 28353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from_; 2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to_; // Inclusive range, not all combinations work. 2839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction { 2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HHasCachedArrayIndexAndBranch(HValue* value) 28453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2847592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 28501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 28513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) 2852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 28553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGetCachedArrayIndex: public HUnaryOperation { 2856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 28573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { 28583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Tagged()); 28593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 28603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 28613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2862592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) 2867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 2869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HClassOfTestAndBranch: public HUnaryControlInstruction { 2874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HClassOfTestAndBranch(HValue* value, Handle<String> class_name) 28763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), 28773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch class_name_(class_name) { } 2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) 28803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2881592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name() const { return class_name_; } 2888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name_; 2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeofIsAndBranch: public HUnaryControlInstruction { 2895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) 28973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), 28983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch type_literal_(type_literal) { } 2899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal() { return type_literal_; } 2901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) 2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2905592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal_; 2911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOf: public HBinaryOperation { 2915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HInstanceOf(HValue* context, HValue* left, HValue* right) 29173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 2918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 29191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2922592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 29273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 29291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOfKnownGlobal: public HTemplateInstruction<2> { 2935086aeeaae12517475c22695a200be45495516549Ben Murdoch public: 29363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HInstanceOfKnownGlobal(HValue* context, 29373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left, 29383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<JSFunction> right) 29393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : function_(right) { 29403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 29413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, left); 2942086aeeaae12517475c22695a200be45495516549Ben Murdoch set_representation(Representation::Tagged()); 29431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2944086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2945086aeeaae12517475c22695a200be45495516549Ben Murdoch 29463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 29473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(1); } 2948086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function() { return function_; } 2949086aeeaae12517475c22695a200be45495516549Ben Murdoch 2950592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2951086aeeaae12517475c22695a200be45495516549Ben Murdoch return Representation::Tagged(); 2952086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2953086aeeaae12517475c22695a200be45495516549Ben Murdoch 29543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 29553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) 2957086aeeaae12517475c22695a200be45495516549Ben Murdoch 2958086aeeaae12517475c22695a200be45495516549Ben Murdoch private: 2959086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function_; 2960086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2961086aeeaae12517475c22695a200be45495516549Ben Murdoch 2962086aeeaae12517475c22695a200be45495516549Ben Murdoch 29633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HPower: public HTemplateInstruction<2> { 2964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HPower(HValue* left, HValue* right) { 29663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 29673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 2969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 29733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 29743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 29773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Double() 29783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::None(); 2979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Power) 29821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation { 2989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HAdd(HValue* context, HValue* left, HValue* right) 29913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 2992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 2993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Add is only commutative if two integer values are added and not if two 2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // tagged values are added (because it might be a String concatenation). 2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 2998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3003592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHAdd(Zone* zone, 3004592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3008e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Add) 3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 30141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation { 3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HSub(HValue* context, HValue* left, HValue* right) 30223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3028592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHSub(Zone* zone, 3029592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3030592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3031592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3032592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3033257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sub) 3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 30371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation { 3043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HMul(HValue* context, HValue* left, HValue* right) 30453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Only commutative if it is certain that not two objects are multiplicated. 3052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 3053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3056592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHMul(Zone* zone, 3057592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3058592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3059592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3060592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3061257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mul) 3062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3064e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 30651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation { 3071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HMod(HValue* context, HValue* left, HValue* right) 30733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 3075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 307744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasPowerOf2Divisor() { 307844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (right()->IsConstant() && 307944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HConstant::cast(right())->HasInteger32Value()) { 308044f0eee88ff00398ff7f715fab053374d808c90dSteve Block int32_t value = HConstant::cast(right())->Integer32Value(); 308144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); 308244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 308344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 308444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 308544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 308644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3089592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHMod(Zone* zone, 3090592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3091592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3092592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3093592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mod) 3095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 30981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation { 3104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HDiv(HValue* context, HValue* left, HValue* right) 31063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 3108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3114592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHDiv(Zone* zone, 3115592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3116592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3117592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3119592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Div) 3120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3122e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 31231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3128592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HBitwise: public HBitwiseBinaryOperation { 3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3130592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) 3131592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HBitwiseBinaryOperation(context, left, right), op_(op) { 3132592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(op == Token::BIT_AND || 3133592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch op == Token::BIT_OR || 3134592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch op == Token::BIT_XOR); 3135592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3137592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value op() const { return op_; } 3138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return true; } 3140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3141592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHBitwise(Zone* zone, 3142592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value op, 3143592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3144592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3145592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3146592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3147592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Bitwise) 3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3150592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual bool DataEquals(HValue* other) { 3151592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return op() == HBitwise::cast(other)->op(); 3152592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 31531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3155592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3156592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 3157592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Token::Value op_; 3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation { 3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HShl(HValue* context, HValue* left, HValue* right) 31643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3167592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3168592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHShl(Zone* zone, 3169592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3170592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3171592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shl) 31741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 31751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation { 3181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HShr(HValue* context, HValue* left, HValue* right) 31833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 318569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual Range* InferRange(); 3186592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3187592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHShr(Zone* zone, 3188592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3189592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3190592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shr) 31931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 31941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation { 3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 32013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HSar(HValue* context, HValue* left, HValue* right) 32023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 3205592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3206592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static HInstruction* NewHSar(Zone* zone, 3207592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context, 3208592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* left, 3209592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* right); 3210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sar) 32121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> { 3219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { 3221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesOsrEntries); 3222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 3225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3226592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 3231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 3234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> { 3238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HParameter(unsigned index) : index_(index) { 3240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index() const { return index_; } 3244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3247592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3251257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Parameter) 3252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index_; 3255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 32581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall { 3259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 32601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 32611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), 32621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block major_key_(major_key), 3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_(TranscendentalCache::kNumberOfCaches) { 3264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key() { return major_key_; } 32671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3268e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 3269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transcendental_type(TranscendentalCache::Type transcendental_type) { 3271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_ = transcendental_type; 3272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type() { 3274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return transcendental_type_; 3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 32761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3279592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallStub) 3284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key_; 3287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type_; 3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> { 3292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnknownOSRValue() { set_representation(Representation::Tagged()); } 3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3295592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3296e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> { 3304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3305592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) 3306592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : cell_(cell), details_(details) { 3307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnGlobalVars); 3310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 3313592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool RequiresHoleCheck(); 3314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3315e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 331844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<intptr_t>(*cell_); 3320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3322592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 3327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 33308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalCell* b = HLoadGlobalCell::cast(other); 3331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return cell_.is_identical_to(b->cell()); 3332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 3336592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch PropertyDetails details_; 3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadGlobalGeneric: public HTemplateInstruction<2> { 3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalGeneric(HValue* context, 33438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 33448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 33458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof) 33463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name), 33478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for_typeof_(for_typeof) { 33483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 33493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, global_object); 33508b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 33518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 33528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 33538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 33548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 33558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 33568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 33578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof() const { return for_typeof_; } 33588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 33598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 33608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3361592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 33628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 33638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 33648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) 33668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 33678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 33688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 33698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof_; 33708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 33718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 33728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3373592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) { 3374592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return !value->type().IsBoolean() 3375592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch && !value->type().IsSmi() 3376592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); 3377592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 3378592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3379592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 33808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation { 33818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 33828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalCell(HValue* value, 33838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<JSGlobalPropertyCell> cell, 3384592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch PropertyDetails details) 33851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value), 33861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block cell_(cell), 3387592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch details_(details) { 3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesGlobalVars); 3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 3392592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool RequiresHoleCheck() { 3393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return !details_.IsDontDelete() || details_.IsReadOnly(); 3394592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3395592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool NeedsWriteBarrier() { 3396592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return StoringValueNeedsWriteBarrier(value()); 3397592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3399592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3402e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 3405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 3408592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch PropertyDetails details_; 3409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 34128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> { 34138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 34148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalGeneric(HValue* context, 34158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 34168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 34178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 3418592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag) 34198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 3420592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch strict_mode_flag_(strict_mode_flag) { 34218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(0, context); 34228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(1, global_object); 34238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(2, value); 34248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 34258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 34268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 34278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 34288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 34298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 34308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 34318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value() { return OperandAt(2); } 3432592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 34338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 34348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 34358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3436592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 34378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 34388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 34398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric) 34418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 34428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 34438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 3444592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag_; 34458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 34468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 34478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 34481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation { 3449b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 34501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HLoadContextSlot(HValue* context , int slot_index) 34511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(context), slot_index_(slot_index) { 3452b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_representation(Representation::Tagged()); 3453b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SetFlag(kUseGVN); 34541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnContextSlots); 3455b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3456b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3457b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index() const { return slot_index_; } 3458b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3459592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 34601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 3461b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3462b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 34641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) 3466b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3467b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected: 3468e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3469b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadContextSlot* b = HLoadContextSlot::cast(other); 34701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (slot_index() == b->slot_index()); 3471b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3472b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3473b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private: 34741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index_; 34751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 34761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreContextSlot: public HTemplateInstruction<2> { 34791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 34801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreContextSlot(HValue* context, int slot_index, HValue* value) 34813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : slot_index_(slot_index) { 34823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 34833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 34841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kChangesContextSlots); 34851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3487e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 34891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index() const { return slot_index_; } 34901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 34921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 34931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3495592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 34961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 34971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 35001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 35021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 35031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 3504b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index_; 3505b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 3506b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3507b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation { 3509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField(HValue* object, bool is_in_object, int offset) 3511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(object), 3512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(is_in_object), 3513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 3514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 351644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 3517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object) { 3518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnInobjectFields); 3519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 3520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnBackingStoreFields); 3521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3524e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 3526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 3527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3528592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3531e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 3534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3536e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField* b = HLoadNamedField::cast(other); 3538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; 3539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 3543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 3544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 35473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> { 354844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 35493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadNamedFieldPolymorphic(HValue* context, 35503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object, 355169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList* types, 355244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name); 355344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 35553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object() { return OperandAt(1); } 355669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList* types() { return &types_; } 355744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name() { return name_; } 355844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic() { return need_generic_; } 355944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3560592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 356144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 356244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 356344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 356469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 356569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic) 356744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 356844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kMaxLoadPolymorphism = 4; 356944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 357044f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 357144f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* value); 357244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 357344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 357469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList types_; 357544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name_; 357644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic_; 357744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 357844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 357944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 358044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 35813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedGeneric: public HTemplateInstruction<2> { 3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 35831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) 35843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name) { 35853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 35863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, object); 3587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 35881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3592e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(1); } 3593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name() const { return name_; } 3594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3595592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 359969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 360069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) 3602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name_; 3605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 36089fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation { 36099fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 36109fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block explicit HLoadFunctionPrototype(HValue* function) 36119fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block : HUnaryOperation(function) { 36129fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 36131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 36141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnCalls); 36159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 36169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3617e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 36189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3619592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 36209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 36219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 36229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 36249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 36259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected: 3626e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 36279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 36289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 36299fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 36303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastElement: public HTemplateInstruction<2> { 3631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 36323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadKeyedFastElement(HValue* obj, HValue* key) { 36333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, obj); 36343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 3635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnArrayElements); 3637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3643592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The key is supposed to be Integer32. 36453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 36463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 36473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 3648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3652592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool RequiresHoleCheck(); 3653257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) 36551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 36581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 36591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { 36623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 36633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) { 36643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, elements); 36653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 36663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Double()); 366769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetFlag(kDependsOnDoubleArrayElements); 36683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 36693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 36703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* elements() { return OperandAt(0); } 36723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 36733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3674592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 36753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // The key is supposed to be Integer32. 36763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 36773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 36783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 36793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 36803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 36823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement) 36843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 36863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 36873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 36883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 36903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { 36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 369244f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement(HValue* external_elements, 369344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 3694589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind) 36953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : elements_kind_(elements_kind) { 36963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, external_elements); 36973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 3698589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 3699589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 370044f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Double()); 370144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 370244f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Integer32()); 370344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 370444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnSpecializedArrayElements); 370544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Native code could change the specialized array. 37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnCalls); 37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 37081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3710e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3712592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 37131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The key is supposed to be Integer32, but the base pointer 37141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // for the element load is a naked pointer. 37153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 37163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::External() 37173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 37181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 3721e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3722589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind() const { return elements_kind_; } 37231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3724257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) 37251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 372744f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { 372844f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!other->IsLoadKeyedSpecializedArrayElement()) return false; 372944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement* cast_other = 373044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement::cast(other); 37313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return elements_kind_ == cast_other->elements_kind(); 373244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 373344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 373444f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3735589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind_; 3736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3739e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> { 3740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { 3742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 3743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, obj); 3744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 37451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 37461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 37471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3751e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 37529fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3755592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3759257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 3760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 37633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreNamedField: public HTemplateInstruction<2> { 3764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HStoreNamedField(HValue* obj, 37661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* val, 3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool in_object, 3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset) 37703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name), 3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(in_object), 3772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 37733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, obj); 37743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, val); 3775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object_) { 3776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesInobjectFields); 3777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 3778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesBackingStoreFields); 3779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3784592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 37851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 3786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 3791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() const { return name_; } 3793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 3794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 3795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition() const { return transition_; } 3796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transition(Handle<Map> map) { transition_ = map; } 3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 37991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 38001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 38011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 3804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 3805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition_; 3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> { 3811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 38121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreNamedGeneric(HValue* context, 38131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 38141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 38158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 3816592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag) 38178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 3818592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch strict_mode_flag_(strict_mode_flag) { 3819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 3820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, value); 38211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 38221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 38231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 38241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 3827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 3828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() { return name_; } 3829592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 38301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 38321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3833592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3837257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) 38381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 38391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 3840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 3841592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag_; 3842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> { 3846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3847592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, 3848592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ElementsKind elements_kind = FAST_ELEMENTS) 3849592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : elements_kind_(elements_kind) { 3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, obj); 3851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, key); 3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, val); 3853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetFlag(kChangesArrayElements); 3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3856592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // The key is supposed to be Integer32. 38583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 1 38593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Integer32() 3860e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : Representation::Tagged(); 3861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3863e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 3866592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool value_is_smi() { 3867592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return elements_kind_ == FAST_SMI_ONLY_ELEMENTS; 3868592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 3871592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch if (value_is_smi()) { 3872592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return false; 3873592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } else { 3874592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return StoringValueNeedsWriteBarrier(value()); 3875592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3876592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 3877592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3878592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool ValueNeedsSmiCheck() { 3879592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return value_is_smi(); 38809fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 38819fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3884257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement) 3885592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 3886592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 3887592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ElementsKind elements_kind_; 3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { 38923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 38933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStoreKeyedFastDoubleElement(HValue* elements, 38943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key, 38953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* val) { 38963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, elements); 38973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 38983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, val); 389969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetFlag(kChangesDoubleArrayElements); 39003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 39013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3902592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 39033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 1) { 39043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Integer32(); 39053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (index == 2) { 39063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Double(); 39073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 39083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 39093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 39103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 39113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* elements() { return OperandAt(0); } 39133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 39143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(2); } 39153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool NeedsWriteBarrier() { 39173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return StoringValueNeedsWriteBarrier(value()); 39183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 39193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 39213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) 39233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 39243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 392644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { 3927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 392844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HStoreKeyedSpecializedArrayElement(HValue* external_elements, 392944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 393044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* val, 3931589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind) 39323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : elements_kind_(elements_kind) { 393344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kChangesSpecializedArrayElements); 3934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, external_elements); 3935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 3936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, val); 3937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3939e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3941592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (index == 0) { 3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::External(); 3944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 39453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool float_or_double_elements = 3946589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind() == EXTERNAL_FLOAT_ELEMENTS || 3947589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind() == EXTERNAL_DOUBLE_ELEMENTS; 39483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 2 && float_or_double_elements) { 394944f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Double(); 395044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 395144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Integer32(); 395244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 3953e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3956e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 3957e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3958e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 3959589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind() const { return elements_kind_; } 3960e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) 3962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 396344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3964589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind_; 3965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> { 3969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 39701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreKeyedGeneric(HValue* context, 39711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 39721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* key, 39738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 3974592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag) 3975592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : strict_mode_flag_(strict_mode_flag) { 3976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 3978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, value); 39791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(3, context); 39801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 39811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 39821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 3986e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(3); } 3987592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 39881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3989592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3990e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3993e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 39941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 39968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 39978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 3998592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch StrictModeFlag strict_mode_flag_; 3999592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}; 4000592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4001592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4002592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HTransitionElementsKind: public HTemplateInstruction<1> { 4003592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 4004592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HTransitionElementsKind(HValue* object, 4005592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> original_map, 4006592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> transitioned_map) 4007592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : original_map_(original_map), 4008592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch transitioned_map_(transitioned_map) { 4009592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetOperandAt(0, object); 4010592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetFlag(kUseGVN); 4011592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetFlag(kChangesElementsKind); 4012592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch set_representation(Representation::Tagged()); 4013592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4014592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4015592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4016592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return Representation::Tagged(); 4017592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4018592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4019592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* object() { return OperandAt(0); } 4020592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> original_map() { return original_map_; } 4021592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> transitioned_map() { return transitioned_map_; } 4022592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4023592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 4024592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4025592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 4026592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4027592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch protected: 4028592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual bool DataEquals(HValue* other) { 4029592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); 4030592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return original_map_.is_identical_to(instr->original_map()) && 4031592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch transitioned_map_.is_identical_to(instr->transitioned_map()); 4032592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4033592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4034592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 4035592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> original_map_; 4036592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<Map> transitioned_map_; 40378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 40388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 40398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation { 4041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 40423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringAdd(HValue* context, HValue* left, HValue* right) 40433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 4044257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 4045257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 4046257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kDependsOnMaps); 4047257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4048257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4049592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4050257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 4051257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4052257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4053257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 4054257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::String(); 4055257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4056257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4057257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringAdd) 4058257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4059257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 4060257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 4061257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4062257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 40643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharCodeAt: public HTemplateInstruction<3> { 40651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 40663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 40673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 40683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, string); 40693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, index); 40701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Integer32()); 40711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 407244f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 40731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 40741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4075592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 40761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The index is supposed to be Integer32. 40773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 2 40783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Integer32() 40791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : Representation::Tagged(); 40801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 40811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 40833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* string() { return OperandAt(1); } 40843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* index() { return OperandAt(2); } 40851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4086257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 40871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 4089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 40901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Range* InferRange() { 40921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return new Range(0, String::kMaxUC16CharCode); 40931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 40941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 40951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharFromCode: public HTemplateInstruction<2> { 409844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 40993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringCharFromCode(HValue* context, HValue* char_code) { 41003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 41013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, char_code); 4102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch set_representation(Representation::Tagged()); 410344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kUseGVN); 410444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 410544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4106592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 41073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 41083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 41093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 411044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 4111592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 411244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 41143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 41153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 411644f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { return true; } 411744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 411944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 412044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 412144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 41221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation { 41231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 41241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HStringLength(HValue* string) : HUnaryOperation(string) { 41251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 41261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 412744f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 41281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 41291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4130592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 41311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 41331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { 41351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 41361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return HType::Smi(); 41371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 41381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringLength) 41401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 41411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 4142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 41431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 41441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Range* InferRange() { 41451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return new Range(0, String::kMaxLength); 41461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 4147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 4151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> { 4152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HMaterializedLiteral<V>(int index, int depth) 4154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : literal_index_(index), depth_(depth) { 4155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 4156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index() const { return literal_index_; } 4159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth() const { return depth_; } 4160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index_; 4163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth_; 4164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 41673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HArrayLiteral: public HMaterializedLiteral<1> { 4168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 41693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HArrayLiteral(HValue* context, 41703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<FixedArray> constant_elements, 4171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length, 4172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index, 4173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth) 41743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HMaterializedLiteral<1>(literal_index, depth), 4175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length_(length), 41763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch constant_elements_(constant_elements) { 41773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 41783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 41803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 4181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_elements() const { return constant_elements_; } 4182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length() const { return length_; } 4183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsCopyOnWrite() const; 4185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4186592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 41873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4189592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 4190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) 4192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length_; 4195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_elements_; 4196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4199592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HObjectLiteralFast: public HMaterializedLiteral<1> { 4200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4201592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HObjectLiteralFast(HValue* context, 4202592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<JSObject> boilerplate, 4203592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int total_size, 4204592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int literal_index, 4205592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int depth) 4206592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch : HMaterializedLiteral<1>(literal_index, depth), 4207592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch boilerplate_(boilerplate), 4208592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch total_size_(total_size) { 4209592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch SetOperandAt(0, context); 4210592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4211592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4212592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch // Maximum depth and total number of properties for object literal 4213592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch // graphs to be considered for fast deep-copying. 4214592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static const int kMaxObjectLiteralDepth = 3; 4215592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch static const int kMaxObjectLiteralProperties = 8; 4216592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4217592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HValue* context() { return OperandAt(0); } 4218592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<JSObject> boilerplate() const { return boilerplate_; } 4219592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int total_size() const { return total_size_; } 4220592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4221592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4222592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch return Representation::Tagged(); 4223592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4224592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 4225592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4226592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ObjectLiteralFast) 4227592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4228592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch private: 4229592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<JSObject> boilerplate_; 4230592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int total_size_; 4231592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch}; 4232592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4233592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4234592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdochclass HObjectLiteralGeneric: public HMaterializedLiteral<1> { 4235592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 4236592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch HObjectLiteralGeneric(HValue* context, 4237592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch Handle<FixedArray> constant_properties, 4238592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool fast_elements, 4239592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int literal_index, 4240592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch int depth, 4241592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch bool has_function) 4242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HMaterializedLiteral<1>(literal_index, depth), 4243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch constant_properties_(constant_properties), 424444f0eee88ff00398ff7f715fab053374d808c90dSteve Block fast_elements_(fast_elements), 424544f0eee88ff00398ff7f715fab053374d808c90dSteve Block has_function_(has_function) { 42461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, context); 42471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 4248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 4250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties() const { 4251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return constant_properties_; 4252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements() const { return fast_elements_; } 425444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function() const { return has_function_; } 4255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4256592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4257e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4258e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4259592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 42601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4261592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ObjectLiteralGeneric) 4262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties_; 4265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements_; 426644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function_; 4267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 42703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HRegExpLiteral: public HMaterializedLiteral<1> { 4271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 42723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HRegExpLiteral(HValue* context, 42733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> pattern, 4274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags, 4275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index) 42763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HMaterializedLiteral<1>(literal_index, 0), 4277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pattern_(pattern), 42783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch flags_(flags) { 42793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 42802b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch SetAllSideEffects(); 42813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 42833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 4284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern() { return pattern_; } 4285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags() { return flags_; } 4286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4287592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 42883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4290592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 4291e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) 4293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern_; 4296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags_; 4297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HFunctionLiteral: public HTemplateInstruction<1> { 4301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 43023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HFunctionLiteral(HValue* context, 43033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<SharedFunctionInfo> shared, 43043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool pretenure) 4305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : shared_info_(shared), pretenure_(pretenure) { 43063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 4307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 43113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4312592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 43133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4315592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HType CalculateInferredType(); 4316e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4317257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 4318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 4320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure() const { return pretenure_; } 4321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info_; 4324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure_; 4325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeof: public HTemplateInstruction<2> { 4329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HTypeof(HValue* context, HValue* value) { 43313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 43323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 4333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 43373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 43383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4339592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual HValue* Canonicalize(); 4340592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual void PrintDataTo(StringStream* stream); 4341592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4342592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 43431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 43441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Typeof) 4347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 435044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation { 435144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 435244f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 435344f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This instruction is not marked as having side effects, but 435444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // changes the map of the input operand. Use it only when creating 435544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // object literals. 4356592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch ASSERT(value->IsObjectLiteralGeneric() || value->IsObjectLiteralFast()); 435744f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 435844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 435944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4360592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 436144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 436244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 436344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 436544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 436644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 436744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation { 4369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HValueOf(HValue* value) : HUnaryOperation(value) { 4371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4374592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4378257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ValueOf) 4379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation { 4383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 43843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HDeleteProperty(HValue* context, HValue* obj, HValue* key) 43853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, obj, key) { 4386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 43871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4390592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 4392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 43953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(DeleteProperty) 4397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return left(); } 4399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return right(); } 4400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 44033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIn: public HTemplateInstruction<3> { 4404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 44053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIn(HValue* context, HValue* key, HValue* object) { 44063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 44073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 44083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, object); 4409257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 4410257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetAllSideEffects(); 4411257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4412257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 44133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 44143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 44153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object() { return OperandAt(2); } 4416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4417592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4418257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 4419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4420257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 4422257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::Boolean(); 4423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual void PrintDataTo(StringStream* stream); 4426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(In) 4428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION 4431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION 4432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 4434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4436