13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 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) \ 653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(AllocateObject) \ 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ApplyArguments) \ 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsElements) \ 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsLength) \ 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsObject) \ 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLiteral) \ 713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(Bitwise) \ 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitNot) \ 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BlockEntry) \ 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BoundsCheck) \ 753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(Branch) \ 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallConstantFunction) \ 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallFunction) \ 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallGlobal) \ 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKeyed) \ 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKnownGlobal) \ 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNamed) \ 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNew) \ 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallRuntime) \ 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallStub) \ 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Change) \ 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckFunction) \ 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckInstanceType) \ 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckMap) \ 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckNonSmi) \ 90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckPrototypeMaps) \ 91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckSmi) \ 92257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ClampToUint8) \ 933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ClassOfTestAndBranch) \ 943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareIDAndBranch) \ 953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareGeneric) \ 963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareObjectEqAndBranch) \ 971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(CompareMap) \ 983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(CompareConstantEqAndBranch) \ 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Constant) \ 1001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(Context) \ 1013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(DeclareGlobals) \ 102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(DeleteProperty) \ 103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Deoptimize) \ 104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Div) \ 1053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ElementsKind) \ 106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(EnterInlined) \ 1073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(FastLiteral) \ 10869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch V(FixedArrayBaseLength) \ 109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ForceRepresentation) \ 110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(FunctionLiteral) \ 111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch V(GetCachedArrayIndex) \ 112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalObject) \ 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalReceiver) \ 114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Goto) \ 1153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(HasCachedArrayIndexAndBranch) \ 1163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(HasInstanceTypeAndBranch) \ 117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(In) \ 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InstanceOf) \ 119086aeeaae12517475c22695a200be45495516549Ben Murdoch V(InstanceOfKnownGlobal) \ 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(InvokeFunction) \ 1213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsConstructCallAndBranch) \ 1223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(IsNilAndBranch) \ 1233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsObjectAndBranch) \ 1243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(IsStringAndBranch) \ 1253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsSmiAndBranch) \ 1263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(IsUndetectableAndBranch) \ 1273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(StringCompareAndBranch) \ 1289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block V(JSArrayLength) \ 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LeaveInlined) \ 130b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(LoadContextSlot) \ 131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadElements) \ 13244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadExternalArrayPointer) \ 1331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(LoadFunctionPrototype) \ 1348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalCell) \ 1358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalGeneric) \ 1363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(LoadKeyedFastDoubleElement) \ 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedFastElement) \ 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedGeneric) \ 13944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadKeyedSpecializedArrayElement) \ 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedField) \ 14144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadNamedFieldPolymorphic) \ 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedGeneric) \ 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mod) \ 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mul) \ 1455d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch V(ObjectLiteral) \ 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntry) \ 1471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(OuterContext) \ 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Parameter) \ 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Power) \ 150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(PushArgument) \ 1513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(Random) \ 152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(RegExpLiteral) \ 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Return) \ 154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sar) \ 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shl) \ 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shr) \ 157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Simulate) \ 1583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(SoftDeoptimize) \ 159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StackCheck) \ 1601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StoreContextSlot) \ 1618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalCell) \ 1628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalGeneric) \ 1633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(StoreKeyedFastDoubleElement) \ 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedFastElement) \ 165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedGeneric) \ 1663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(StoreKeyedSpecializedArrayElement) \ 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedField) \ 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedGeneric) \ 169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(StringAdd) \ 1701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringCharCodeAt) \ 17144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(StringCharFromCode) \ 1721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringLength) \ 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sub) \ 1743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(ThisFunction) \ 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Throw) \ 17644f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ToFastProperties) \ 1773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(TransitionElementsKind) \ 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Typeof) \ 1793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(TypeofIsAndBranch) \ 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnaryMathOperation) \ 181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnknownOSRValue) \ 1823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch V(UseConst) \ 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ValueOf) \ 1843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ForInPrepareMap) \ 1853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ForInCacheArray) \ 1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(CheckMapValue) \ 1873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(LoadFieldByIndex) \ 1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(DateField) \ 1893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(WrapReceiver) 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V) \ 192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Calls) \ 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InobjectFields) \ 194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BackingStoreFields) \ 1953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ElementsKind) \ 1963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ElementsPointer) \ 197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayElements) \ 19869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch V(DoubleArrayElements) \ 19944f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(SpecializedArrayElements) \ 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalVars) \ 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Maps) \ 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLengths) \ 2031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(ContextSlots) \ 204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntries) 205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type) \ 207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool Is##type() const { return true; } \ 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static H##type* cast(HValue* value) { \ 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(value->Is##type()); \ 210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<H##type*>(value); \ 211257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 214257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type) \ 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ 216257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static H##type* cast(HValue* value) { \ 217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->Is##type()); \ 218257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<H##type*>(value); \ 219257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } \ 220257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::k##type; } 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject { 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range() 226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(kMinInt), 227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(kMaxInt), 228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range(int32_t lower, int32_t upper) 232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(lower), 233e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(upper), 234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 235e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper() const { return upper_; } 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower() const { return lower_; } 239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next() const { return next_; } 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* CopyClearLower(Zone* zone) const { 2413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(kMinInt, upper_); 2423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* CopyClearUpper(Zone* zone) const { 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(lower_, kMaxInt); 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* Copy(Zone* zone) const { 2473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(lower_, upper_); 24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(CanBeMinusZero()); 24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Mask() const; 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeNegative() const { return lower_ < 0; } 256e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Includes(int value) const { return lower_ <= value && upper_ >= value; } 25769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch bool IsMostGeneric() const { 25869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero(); 25969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool IsInSmiRange() const { 261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void KeepOrder(); 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Verify() const; 2663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void StackUpon(Range* other) { 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Intersect(other); 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = other; 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 273e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Intersect(Range* other); 274e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Union(Range* other); 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void AddConstant(int32_t value); 277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Sar(int32_t value); 278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Shl(int32_t value); 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool AddAndCheckOverflow(Range* other); 280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool SubAndCheckOverflow(Range* other); 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool MulAndCheckOverflow(Range* other); 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower_; 285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper_; 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next_; 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool can_be_minus_zero_; 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation { 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Kind { 294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNone, 295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged, 296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kDouble, 297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kInteger32, 2981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kExternal, 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNumRepresentations 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation() : kind_(kNone) { } 303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation None() { return Representation(kNone); } 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Tagged() { return Representation(kTagged); } 306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Integer32() { return Representation(kInteger32); } 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Double() { return Representation(kDouble); } 3081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static Representation External() { return Representation(kExternal); } 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(const Representation& other) { 311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == other.kind_; 312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Kind kind() const { return static_cast<Kind>(kind_); } 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNone() const { return kind_ == kNone; } 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() const { return kind_ == kTagged; } 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger32() const { return kind_ == kInteger32; } 318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDouble() const { return kind_ == kDouble; } 3191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsExternal() const { return kind_ == kExternal; } 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSpecialization() const { 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == kInteger32 || kind_ == kDouble; 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* Mnemonic() const; 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit Representation(Kind k) : kind_(k) { } 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure kind fits in int8. 3298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte)); 3308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int8_t kind_; 332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType { 336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType() : type_(kUninitialized) { } 338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Tagged() { return HType(kTagged); } 340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } 341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedNumber() { return HType(kTaggedNumber); } 342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Smi() { return HType(kSmi); } 343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType HeapNumber() { return HType(kHeapNumber); } 344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType String() { return HType(kString); } 345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Boolean() { return HType(kBoolean); } 346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType NonPrimitive() { return HType(kNonPrimitive); } 347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSArray() { return HType(kJSArray); } 348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSObject() { return HType(kJSObject); } 349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Uninitialized() { return HType(kUninitialized); } 350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Return the weakest (least precise) common type. 352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType Combine(HType other) { 353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType(static_cast<Type>(type_ & other.type_)); 354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool Equals(const HType& other) { 357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == other.type_; 358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSubtypeOf(const HType& other) { 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Combine(other).Equals(other); 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() { 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTagged) == kTagged); 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedPrimitive() { 370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedPrimitive) == kTaggedPrimitive); 372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedNumber() { 375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedNumber) == kTaggedNumber); 377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSmi() { 380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kSmi) == kSmi); 382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsHeapNumber() { 385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kHeapNumber) == kHeapNumber); 387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsString() { 390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kString) == kString); 392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsBoolean() { 395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kBoolean) == kBoolean); 397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNonPrimitive() { 400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kNonPrimitive) == kNonPrimitive); 402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSArray() { 405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSArray) == kJSArray); 407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSObject() { 410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSObject) == kJSObject); 412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsUninitialized() { 415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == kUninitialized; 416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool IsHeapObject() { 4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(type_ != kUninitialized); 4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return IsHeapNumber() || IsString() || IsNonPrimitive(); 4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TypeFromValue(Handle<Object> value); 424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* ToString(); 426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Type { 429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged = 0x1, // 0000 0000 0000 0001 430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedNumber = 0xd, // 0000 0000 0000 1101 432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kSmi = 0x1d, // 0000 0000 0001 1101 433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kHeapNumber = 0x2d, // 0000 0000 0010 1101 434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kString = 0x45, // 0000 0000 0100 0101 435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBoolean = 0x85, // 0000 0000 1000 0101 436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNonPrimitive = 0x101, // 0000 0001 0000 0001 437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kJSObject = 0x301, // 0000 0011 0000 0001 4383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kJSArray = 0x701, // 0000 0111 0000 0001 439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUninitialized = 0x1fff // 0001 1111 1111 1111 440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure type fits in int16. 4438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte))); 4448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HType(Type t) : type_(t) { } 446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int16_t type_; 448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject { 452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode(HValue* value, int index, HUseListNode* tail) 454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : tail_(tail), value_(value), index_(index) { 455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HUseListNode* tail(); 458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() const { return value_; } 459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() const { return index_; } 460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_tail(HUseListNode* list) { tail_ = list; } 462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG 464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Zap() { 465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch tail_ = reinterpret_cast<HUseListNode*>(1); 466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_ = NULL; 467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch index_ = -1; 468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 469257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 470257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 472257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail_; 473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 474257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 475257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 476257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 477257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted. 479257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them. 480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED { 481257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Done() { return current_ == NULL; } 483257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Advance(); 484257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 485257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { 486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 487257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return value_; 488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() { 491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return index_; 493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HUseIterator(HUseListNode* head); 497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* current_; 499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* next_; 500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 502257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class HValue; 504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// There must be one corresponding kDepends flag for every kChanges flag and 5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// the order of the kChanges flags must be exactly the same as of the kDepends 5093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// flags. 5103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum GVNFlag { 5113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Declare global value numbering flags. 5123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DECLARE_FLAG(type) kChanges##type, kDependsOn##type, 5133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVN_FLAG_LIST(DECLARE_FLAG) 5143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_FLAG 5153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kAfterLastFlag, 5163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kLastFlag = kAfterLastFlag - 1 5173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 5183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochtypedef EnumSet<GVNFlag> GVNFlagSet; 5203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject { 523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoNumber = -1; 525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Flag { 527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kFlexibleRepresentation, 5283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Participate in Global Value Numbering, i.e. elimination of 5293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // unnecessary recomputations. If an instruction sets this flag, it must 5303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // implement DataEquals(), which will be used to determine if other 5313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // occurrences of the instruction are indeed the same. 532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUseGVN, 533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanOverflow, 534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBailoutOnMinusZero, 535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanBeDivByZero, 5367d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch kDeoptimizeOnUndefined, 537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kIsArguments, 538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTruncatingToInt32, 5393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kIsDead, 5403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kLastFlag = kIsDead 541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STATIC_ASSERT(kLastFlag < kBitsPerInt); 544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kChangesToDependsFlagsLeftShift = 1; 546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet ConvertChangesToDependsFlags(GVNFlagSet flags) { 5483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return GVNFlagSet(flags.ToIntegral() << kChangesToDependsFlagsLeftShift); 549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HValue* cast(HValue* value) { return value; } 552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Opcode { 554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare a unique enum value for each hydrogen instruction. 555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_OPCODE(type) k##type, 556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) 557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kPhi 558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_OPCODE 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const = 0; 561257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare a non-virtual predicates for each concrete HInstruction or HValue. 563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Is##type() const { return opcode() == k##type; } 565257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 566257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 567257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool IsPhi() const { return opcode() == kPhi; } 568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare virtual predicates for abstract HInstruction or HValue 570257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 571257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool Is##type() const { return false; } 572257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE) 573257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue() : block_(NULL), 576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch id_(kNoNumber), 577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_(HType::Tagged()), 578257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch use_list_(NULL), 579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_(NULL), 580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch flags_(0) {} 581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HValue() {} 582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block() const { return block_; } 584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetBlock(HBasicBlock* block); 5853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int LoopWeight() const; 586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id() const { return id_; } 588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_id(int id) { id_ = id; } 589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseIterator uses() const { return HUseIterator(use_list_); } 591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 59244f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return false; } 593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation() const { return representation_; } 594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ChangeRepresentation(Representation r) { 595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation was already set and is allowed to be changed. 596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!r.IsNone()); 597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CheckFlag(kFlexibleRepresentation)); 598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RepresentationChanged(r); 599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 601257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void AssumeRepresentation(Representation r); 602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { return true; } 604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type() const { return type_; } 60669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void set_type(HType new_type) { 60769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ASSERT(new_type.IsSubtypeOf(type_)); 60869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch type_ = new_type; 609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // An operation needs to override this function iff: 612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 1) it can produce an int32 output. 613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 2) the true value of its output can potentially be minus zero. 614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The implementation must set a flag so that it bails out in the case where 615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it would otherwise output what should be a minus zero as an int32 zero. 616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the operation also exists in a form that takes int32 and outputs int32 617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then the operation should return its input value so that we can propagate 6183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // back. There are three operations that need to propagate back to more than 6193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // one input. They are phi and binary div and mul. They always return NULL 6203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // and expect the caller to take care of things. 621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) { 622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDefinedAfter(HBasicBlock* other) const; 627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Operands. 629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() = 0; 630e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) = 0; 631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetOperandAt(int index, HValue* value); 632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 633257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void DeleteAndReplaceWith(HValue* other); 634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void ReplaceAllUsesWith(HValue* other); 635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasNoUses() const { return use_list_ == NULL; } 636257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasMultipleUses() const { 637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return use_list_ != NULL && use_list_->tail() != NULL; 638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int UseCount() const; 6403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Mark this HValue as dead and to be removed from other HValues' use lists. 6423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void Kill(); 643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags() const { return flags_; } 6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetFlag(Flag f) { flags_ |= (1 << f); } 6461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearFlag(Flag f) { flags_ &= ~(1 << f); } 6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; } 6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns true if the flag specified is set for all uses, false otherwise. 6503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool CheckUsesForFlag(Flag f); 6515d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 6523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet gvn_flags() const { return gvn_flags_; } 6533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void SetGVNFlag(GVNFlag f) { gvn_flags_.Add(f); } 6543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ClearGVNFlag(GVNFlag f) { gvn_flags_.Remove(f); } 6553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool CheckGVNFlag(GVNFlag f) const { return gvn_flags_.Contains(f); } 6563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void SetAllSideEffects() { gvn_flags_.Add(AllSideEffectsFlagSet()); } 6573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ClearAllSideEffects() { 6583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch gvn_flags_.Remove(AllSideEffectsFlagSet()); 6593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasSideEffects() const { 6613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return gvn_flags_.ContainsAnyOf(AllSideEffectsFlagSet()); 6623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasObservableSideEffects() const { 6643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return gvn_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet()); 6653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet DependsOnFlags() const { 6683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = gvn_flags_; 6693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllDependsOnFlagSet()); 6703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 6713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet SideEffectFlags() const { 6743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = gvn_flags_; 6753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllSideEffectsFlagSet()); 6763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 6773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet ChangesFlags() const { 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = gvn_flags_; 6813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllChangesFlagSet()); 6823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 6833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet ObservableChangesFlags() const { 6863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = gvn_flags_; 6873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllChangesFlagSet()); 6883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllObservableSideEffectsFlagSet()); 6893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 691589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range() const { return range_; } 693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasRange() const { return range_ != NULL; } 6943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void AddNewRange(Range* r, Zone* zone); 695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RemoveLastAddedRange(); 6963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ComputeInitialRange(Zone* zone); 697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation helpers. 6993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) = 0; 700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 701e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // This gives the instruction an opportunity to replace itself with an 706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction that does the same in some better way. To replace an 707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction with a new one, first add the new instruction to the graph, 708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then return it. Return NULL to have the instruction deleted. 709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { return this; } 710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 711e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(HValue* other); 712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode(); 713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Printing support. 715e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream) = 0; 716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void PrintNameTo(StringStream* stream); 717257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintTypeTo(StringStream* stream); 718257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintRangeTo(StringStream* stream); 719257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintChangesTo(StringStream* stream); 720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 721257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const char* Mnemonic() const; 722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Updated the inferred type of this instruction and returns true if 724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it has changed. 725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool UpdateInferredType(); 726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 7301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() = 0; 731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 7341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // This function must be overridden for instructions with flag kUseGVN, to 7351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // compare the non-Operand parts of the instruction. 736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 7371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 7381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return false; 7391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { } 7413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() = 0; 743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) = 0; 744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void clear_block() { 745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block_ != NULL); 746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block_ = NULL; 747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_representation(Representation r) { 750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation is set-once. 751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(representation_.IsNone() && !r.IsNone()); 752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllDependsOnFlagSet() { 7563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result; 757589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch // Create changes mask. 7583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ADD_FLAG(type) result.Add(kDependsOn##type); 7593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVN_FLAG_LIST(ADD_FLAG) 7603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef ADD_FLAG 7613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 7623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllChangesFlagSet() { 7653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result; 7663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Create changes mask. 7673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define ADD_FLAG(type) result.Add(kChanges##type); 768589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch GVN_FLAG_LIST(ADD_FLAG) 769589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG 770589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return result; 771589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 772589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 7731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // A flag mask to mark an instruction as having arbitrary side effects. 7743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllSideEffectsFlagSet() { 7753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = AllChangesFlagSet(); 7763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Remove(kChangesOsrEntries); 7773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 7783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // A flag mask of all side effects that can make observable changes in 7813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // an executing program (i.e. are not safe to repeat, move or remove); 7823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllObservableSideEffectsFlagSet() { 7833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result = AllChangesFlagSet(); 7843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Remove(kChangesElementsKind); 7853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Remove(kChangesElementsPointer); 7863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Remove(kChangesMaps); 7873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 788592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 789592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 790257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Remove the matching use from the use list if present. Returns the 791257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // removed list node or NULL. 792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* RemoveUse(HValue* value, int index); 793257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterUse(int index, HValue* new_value); 795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block_; 797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The id of this instruction in the hydrogen graph, assigned when first 799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // added to the graph. Reflects creation order. 800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id_; 801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation_; 803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type_; 804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* use_list_; 805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range_; 806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags_; 8073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet gvn_flags_; 808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DISALLOW_COPY_AND_ASSIGN(HValue); 811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue { 815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next() const { return next_; } 817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous() const { return previous_; } 818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream) { } 821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsLinked() const { return block() != NULL; } 823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Unlink(); 824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertBefore(HInstruction* next); 825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertAfter(HInstruction* previous); 826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position() const { return position_; } 828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool has_position() const { return position_ != RelocInfo::kNoPosition; } 829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_position(int position) { position_ = position; } 830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } 8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 8361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return false; } 840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 841257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(Instruction) 842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction() 845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : next_(NULL), 846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_(NULL), 847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch position_(RelocInfo::kNoPosition) { 8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnOsrEntries); 849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() { Unlink(); } 852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitializeAsFirst(HBasicBlock* block) { 855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(block); 857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 859257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintMnemonicTo(StringStream* stream); 860257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next_; 862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous_; 863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position_; 864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class HBasicBlock; 866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int V> 8703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateInstruction : public HInstruction { 871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 8723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int OperandCount() { return V; } 8733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 8763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 8771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 8781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 8793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HValue*, V> inputs_; 880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HControlInstruction: public HInstruction { 884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 8853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HBasicBlock* SuccessorAt(int i) = 0; 8863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual int SuccessorCount() = 0; 8873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; 888e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 8903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* FirstSuccessor() { 8923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; 8933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 8943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* SecondSuccessor() { 8953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; 896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 897e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 8983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 899e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 900e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSuccessorIterator BASE_EMBEDDED { 903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 9043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HSuccessorIterator(HControlInstruction* instr) 9053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : instr_(instr), current_(0) { } 906e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool Done() { return current_ >= instr_->SuccessorCount(); } 9083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* Current() { return instr_->SuccessorAt(current_); } 9093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Advance() { current_++; } 910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 911e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 9123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HControlInstruction* instr_; 9133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int current_; 914e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 916e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V> 9183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTemplateControlInstruction: public HControlInstruction { 919e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 9203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int SuccessorCount() { return S; } 9213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* SuccessorAt(int i) { return successors_[i]; } 9223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void SetSuccessorAt(int i, HBasicBlock* block) { successors_[i] = block; } 9233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int OperandCount() { return V; } 925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 929e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 930e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 931e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 9323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HBasicBlock*, S> successors_; 9333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HValue*, V> inputs_; 934e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 935e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 936e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 937e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> { 938e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 9393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 941e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 945e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 946e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// We insert soft-deoptimize when we hit code with unknown typefeedback, 9483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// so that we get a chance of re-optimizing with useful typefeedback. 9493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch// HSoftDeoptimize does not end a basic block as opposed to HDeoptimize. 9503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HSoftDeoptimize: public HTemplateInstruction<0> { 9513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 9523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 9533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 9543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(SoftDeoptimize) 9573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 9583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 96044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction { 961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 9623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HDeoptimize(int environment_length) : values_(environment_length) { } 963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 9643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 965e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 9671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 96844f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual int OperandCount() { return values_.length(); } 96944f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual HValue* OperandAt(int index) { return values_[index]; } 9703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 9713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 9723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual int SuccessorCount() { return 0; } 9733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HBasicBlock* SuccessorAt(int i) { 9743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 9753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return NULL; 9763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 9773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void SetSuccessorAt(int i, HBasicBlock* block) { 9783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 9793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 98044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 98144f0eee88ff00398ff7f715fab053374d808c90dSteve Block void AddEnvironmentValue(HValue* value) { 98244f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_.Add(NULL); 98344f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetOperandAt(values_.length() - 1, value); 98444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 98544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 986257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 987257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 988257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum UseEnvironment { 989257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kNoUses, 990257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kUseAll 991257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 99244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 99344f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 99444f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual void InternalSetOperandAt(int index, HValue* value) { 99544f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_[index] = value; 99644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 99744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 99844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 99944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneList<HValue*> values_; 1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGoto: public HTemplateControlInstruction<1, 0> { 1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 10053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HGoto(HBasicBlock* target) { 10063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetSuccessorAt(0, target); 10073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1013589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PrintDataTo(StringStream* stream); 1014589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Goto) 1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<2, 1> { 1020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 10213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryControlInstruction(HValue* value, 10223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* true_target, 10233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* false_target) { 1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 10253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(0, true_target); 10263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(1, false_target); 1027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1031e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBranch: public HUnaryControlInstruction { 1036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 103769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBranch(HValue* value, 103869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBasicBlock* true_target, 103969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HBasicBlock* false_target, 104069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types = ToBooleanStub::no_types()) 104169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target), 104269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch expected_input_types_(expected_input_types) { 10431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL && false_target != NULL); 1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 10453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HBranch(HValue* value) 10463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 10473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 105369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types() const { 105469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return expected_input_types_; 105569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 105669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 10573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Branch) 105869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 105969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 106069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types_; 1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction { 1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 10661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCompareMap(HValue* value, 10671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<Map> map, 10681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* true_target, 10691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* false_target) 10701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryControlInstruction(value, true_target, false_target), 10711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block map_(map) { 10721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL); 10731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(false_target != NULL); 1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!map.is_null()); 1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1084e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareMap) 1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HReturn: public HTemplateControlInstruction<0, 1> { 1093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 10943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HReturn(HValue* value) { 10953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, value); 10961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 10983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1099e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1101e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 11023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 11033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(0); } 11053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Return) 1107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HAbnormalExit: public HTemplateControlInstruction<0, 0> { 1111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 11123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1113e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1114e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1120e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> { 1121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HUnaryOperation(HValue* value) { 1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static HUnaryOperation* cast(HValue* value) { 11273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return reinterpret_cast<HUnaryOperation*>(value); 11283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1130e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 1131e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 11353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThrow: public HTemplateInstruction<2> { 11361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 11373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HThrow(HValue* context, HValue* value) { 11383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 11393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 11401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 11411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 11421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 11441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 11451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 11461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 11483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 11493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1150257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Throw) 1151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1152257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1153257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 11543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUseConst: public HUnaryOperation { 11553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 11563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } 11573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 11593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 11603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 11613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UseConst) 11633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 11643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 11653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1166257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> { 1167257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1168257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HForceRepresentation(HValue* value, Representation required_representation) { 1169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(0, value); 1170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(required_representation); 1171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { return OperandAt(0); } 1174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 11773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return representation(); // Same as the output representation. 1179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 11821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 11831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 11841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation { 1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HChange(HValue* value, 1188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation to, 11897d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool is_truncating, 11907d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool deoptimize_on_undefined) 11913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryOperation(value) { 11923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!value->representation().IsNone() && !to.IsNone()); 11933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(!value->representation().Equals(to)); 1194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(to); 11953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_type(HType::TaggedNumber()); 1196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 11973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (deoptimize_on_undefined) SetFlag(kDeoptimizeOnUndefined); 1198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (is_truncating) SetFlag(kTruncatingToInt32); 1199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 12023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 12033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation from() { return value()->representation(); } 12063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation to() { return representation(); } 12073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool deoptimize_on_undefined() const { 12083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return CheckFlag(kDeoptimizeOnUndefined); 12093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool deoptimize_on_minus_zero() const { 12113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return CheckFlag(kBailoutOnMinusZero); 12123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 12133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 12143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return from(); 1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 121869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1221257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Change) 1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 12243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation { 1229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HClampToUint8(HValue* value) 12313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryOperation(value) { 12323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 1233257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 1234257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1235257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 12363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 12373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 1238257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1239257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 12403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 12413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 12433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 12443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 12453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 12463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction { 1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 12498b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HSimulate(int ast_id, int pop_count) 1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : ast_id_(ast_id), 1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pop_count_(pop_count), 1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_(2), 1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_(2) {} 1254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HSimulate() {} 1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1256e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; } 1259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 1260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_ast_id(int id) { 1261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!HasAstId()); 1262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ast_id_ = id; 1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count() const { return pop_count_; } 1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const ZoneList<HValue*>* values() const { return &values_; } 1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int GetAssignedIndexAt(int index) const { 1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasAssignedIndexAt(index)); 1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index]; 1270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAssignedIndexAt(int index) const { 1272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index] != kNoIndex; 1273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddAssignedValue(int index, HValue* value) { 1275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(index, value); 1276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddPushedValue(HValue* value) { 1278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(kNoIndex, value); 1279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return values_.length(); } 1281e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return values_[index]; } 1282e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 12833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1287257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Simulate) 1288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 12901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[index] = value; 1296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoIndex = -1; 1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddValue(int index, HValue* value) { 1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_.Add(index); 1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Resize the list of pushed values. 1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_.Add(NULL); 1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Set the operand through the base method in HValue to make sure that the 1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // use lists are correctly updated. 1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(values_.length() - 1, value); 1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count_; 1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> values_; 1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int> assigned_indexes_; 1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStackCheck: public HTemplateInstruction<1> { 1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 13173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum Type { 13183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kFunctionEntry, 13193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kBackwardsBranch 13203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 13213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStackCheck(HValue* context, Type type) : type_(type) { 13233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 13243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 1327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 13293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 1330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Eliminate() { 13333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // The stack check eliminator might try to eliminate the same stack 13343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // check instruction multiple times. 13353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (IsLinked()) { 13363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DeleteFromGraph(); 13373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_function_entry() { return type_ == kFunctionEntry; } 13413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_backwards_branch() { return type_ == kBackwardsBranch; } 13423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StackCheck) 13443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 13463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Type type_; 1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1350e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> { 1351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HEnterInlined(Handle<JSFunction> closure, 13533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int arguments_count, 1354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FunctionLiteral* function, 13553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CallKind call_kind, 13563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_construct, 13573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* arguments) 1358257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : closure_(closure), 13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments_count_(arguments_count), 1360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function_(function), 13613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch call_kind_(call_kind), 13623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch is_construct_(is_construct), 13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch arguments_(arguments) { 1364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure() const { return closure_; } 13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int arguments_count() const { return arguments_count_; } 1370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function() const { return function_; } 1371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind() const { return call_kind_; } 13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_construct() const { return is_construct_; } 1373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1376e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1377e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* arguments() { return arguments_; } 13793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(EnterInlined) 1381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure_; 13843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int arguments_count_; 1385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function_; 1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind_; 13873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool is_construct_; 13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Variable* arguments_; 1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1392e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> { 1393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLeaveInlined() {} 1395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1398e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 1401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation { 1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 1407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1414e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* argument() { return OperandAt(0); } 1415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(PushArgument) 14171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 1418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HThisFunction: public HTemplateInstruction<0> { 14213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 14223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch explicit HThisFunction(Handle<JSFunction> closure) : closure_(closure) { 14233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Tagged()); 14243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 14253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 14263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 14283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 14293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 14303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSFunction> closure() const { return closure_; } 14323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ThisFunction) 14343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { 14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HThisFunction* b = HThisFunction::cast(other); 14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return *closure() == *b->closure(); 14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSFunction> closure_; 14433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 14443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 14453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> { 14471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 14481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HContext() { 14491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 14501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 14511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Context) 14581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1460e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation { 1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { 14671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 14681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 14691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1471257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OuterContext); 14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1474e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 14771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 14791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 14801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HDeclareGlobals: public HUnaryOperation { 14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 14843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HDeclareGlobals(HValue* context, 14853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> pairs, 14863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int flags) 14873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryOperation(context), 14883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch pairs_(pairs), 14893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch flags_(flags) { 14903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 14913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetAllSideEffects(); 14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> pairs() const { return pairs_; } 14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int flags() const { return flags_; } 14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) 14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> pairs_; 15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int flags_; 15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 15091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation { 15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 15111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { 1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalObject) 15171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1521e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 15221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1523e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation { 1528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalReceiver(HValue* global_object) 15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(global_object) { 1531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver) 15361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 15411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1542e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 1547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> { 1548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The argument count includes the receiver. 1550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 1552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->SetAllSideEffects(); 15531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { return HType::Tagged(); } 1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual int argument_count() const { return argument_count_; } 15581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return true; } 15601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 15621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int argument_count_; 15631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 15641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> { 15671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 15681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall(HValue* value, int argument_count) 1569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<1>(argument_count) { 15701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, value); 15711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 15721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 15761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 15781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 15801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 15811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> { 15841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 15851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBinaryCall(HValue* first, HValue* second, int argument_count) 1586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<2>(argument_count) { 15871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, first); 15881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(1, second); 1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 15961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* first() { return OperandAt(0); } 1598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* second() { return OperandAt(1); } 1599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 16011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1602257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall { 1603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1604257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HInvokeFunction(HValue* context, HValue* function, int argument_count) 1605257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HBinaryCall(context, function, argument_count) { 1606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 16083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1609257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 1610257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1612257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* context() { return first(); } 1613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* function() { return second(); } 1614257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1615257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> { 1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCallConstantFunction(Handle<JSFunction> function, int argument_count) 1622e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), function_(function) { } 1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function() const { return function_; } 16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsApplyFunction() const { 162744f0eee88ff00398ff7f715fab053374d808c90dSteve Block return function_->code() == 162844f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply); 1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 16333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1634e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction) 1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function_; 1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall { 1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKeyed(HValue* context, HValue* key, int argument_count) 16471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, key, argument_count) { 1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return second(); } 1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1657257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKeyed) 1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall { 1662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNamed(HValue* context, Handle<String> name, int argument_count) 16641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 16651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1667e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1669e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNamed) 1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1675e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1676e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1677e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HCallFunction: public HBinaryCall { 1684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 16853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCallFunction(HValue* context, HValue* function, int argument_count) 16863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HBinaryCall(context, function, argument_count) { 16871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return first(); } 16903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* function() { return second(); } 1691e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1693e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallFunction) 1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall { 1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 17021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallGlobal(HValue* context, Handle<String> name, int argument_count) 17031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 17041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1706e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1712e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1714e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallGlobal) 1716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> { 1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 17241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKnownGlobal(Handle<JSFunction> target, int argument_count) 1725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), target_(target) { } 1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 17281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1735257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal) 1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall { 1743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 17441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNew(HValue* context, HValue* constructor, int argument_count) 17451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, constructor, argument_count) { 17461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1753e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* constructor() { return second(); } 1754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNew) 1756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCallRuntime: public HCall<1> { 1760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCallRuntime(HValue* context, 17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> name, 176344f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function, 1764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int argument_count) 17653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HCall<1>(argument_count), c_function_(c_function), name_(name) { 17663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 177244f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function() const { return c_function_; } 1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 17753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 17763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 1777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1778e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1779257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 1780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 178244f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function_; 1783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 178769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HJSArrayLength: public HTemplateInstruction<2> { 1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 178969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HJSArrayLength(HValue* value, HValue* typecheck) { 1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length of an array is stored as a tagged value in the array 1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // object. It is guaranteed to be 32 bit integer, but it can be 1792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // represented as either a smi or heap number. 179369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(0, value); 179469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(1, typecheck); 1795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 17973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnArrayLengths); 17983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1805589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch virtual void PrintDataTo(StringStream* stream); 1806589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 180769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HValue* value() { return OperandAt(0); } 1808589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch HValue* typecheck() { return OperandAt(1); } 180969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1810257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) 18111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 18149fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 18159fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 18169fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 181769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HFixedArrayBaseLength: public HUnaryOperation { 18189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 181969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) { 18209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 18219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block SetFlag(kUseGVN); 18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnArrayLengths); 18239fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 18249fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 18253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 18269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 18279fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 18289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 182969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(FixedArrayBaseLength) 18301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HElementsKind: public HUnaryOperation { 18373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 18383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HElementsKind(HValue* value) : HUnaryOperation(value) { 18393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 18403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 18413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnElementsKind); 18423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 18453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 18463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 18473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ElementsKind) 18493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 18513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 18523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 18533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 18543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation { 1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HBitNot(HValue* value) : HUnaryOperation(value) { 1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kTruncatingToInt32); 1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitNot) 18691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 18701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 18753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HUnaryMathOperation: public HTemplateInstruction<2> { 1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 18773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) 18783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : op_(op) { 18793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 18803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: 1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: 1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: 1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: 1888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: 1892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathPowHalf: 1893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: 1894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: 1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: 18963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathTan: 1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 1898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 1900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 1901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 19063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 19073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1908e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1910e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 19153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 0) { 19163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 19173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch switch (op_) { 19193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathFloor: 19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathRound: 19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathCeil: 19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathSqrt: 19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathPowHalf: 19243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathLog: 19253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathSin: 19263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathCos: 19273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case kMathTan: 19283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Double(); 19293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch case kMathAbs: 19303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return representation(); 19313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch default: 19323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch UNREACHABLE(); 19333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 19343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { 1939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the input is integer32 then we replace the floor instruction 1940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with its inputs. This happens before the representation changes are 1941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // introduced. 1942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (op() == kMathFloor) { 1943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->representation().IsInteger32()) return value(); 1944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return this; 1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op() const { return op_; } 1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* OpName() const; 1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op_ == b->op(); 1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op_; 1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation { 1965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HLoadElements(HValue* value) : HUnaryOperation(value) { 1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnElementsPointer); 1970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 19723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadElements) 19771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 19801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 19811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 198344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation { 19841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 198544f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HLoadExternalArrayPointer(HValue* value) 19861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value) { 19871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::External()); 19881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The result of this instruction is idempotent as long as its inputs don't 198944f0eee88ff00398ff7f715fab053374d808c90dSteve Block // change. The external array of a specialized array elements object cannot 19901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // change once set, so it's no necessary to introduce any additional 19911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // dependencies on top of the inputs. 19921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 19931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 19961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 19971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 19981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1999257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 20001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2002e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 200669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochclass HCheckMap: public HTemplateInstruction<2> { 2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 20083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCheckMap(HValue* value, 20093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> map, 20103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* typecheck = NULL, 20113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CompareMapMode mode = REQUIRE_EXACT_MAP) 20123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : map_(map), 20133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode_(mode) { 201469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(0, value); 201569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // If callers don't depend on a typecheck, they can pass in NULL. In that 201669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch // case we use a copy of the |value| argument as a dummy value. 201769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(1, typecheck != NULL ? typecheck : value); 2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 20203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 20213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // If the map to check doesn't have the untransitioned elements, it must not 20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // be hoisted above TransitionElements instructions. 20233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (mode == REQUIRE_EXACT_MAP || !map->has_fast_smi_only_elements()) { 20243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnElementsKind); 20253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 20263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch has_element_transitions_ = 20273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL || 20283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL; 2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2034e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2035e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 203769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch HValue* value() { return OperandAt(0); } 2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 20393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CompareMapMode mode() const { return mode_; } 2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMap) 2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckMap* b = HCheckMap::cast(other); 20463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Two CheckMaps instructions are DataEqual if their maps are identical and 20473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // they have the same mode. The mode comparison can be ignored if the map 20483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // has no elements transitions. 20493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return map_.is_identical_to(b->map()) && 20503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch (b->mode() == mode() || !has_element_transitions_); 2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 20543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool has_element_transitions_; 2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 20563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch CompareMapMode mode_; 2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation { 2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction(HValue* value, Handle<JSFunction> function) 2063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(value), target_(function) { 2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2071e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2072e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 20751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2080257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckFunction) 2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction* b = HCheckFunction::cast(other); 2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return target_.is_identical_to(b->target()); 2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation { 2094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 20953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static HCheckInstanceType* NewIsSpecObject(HValue* value) { 20963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return new HCheckInstanceType(value, IS_SPEC_OBJECT); 2097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsJSArray(HValue* value) { 2099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_JS_ARRAY); 2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsString(HValue* value) { 2102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_STRING); 2103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsSymbol(HValue* value) { 2105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_SYMBOL); 2106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HValue* Canonicalize(); 2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } 2117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckInterval(InstanceType* first, InstanceType* last); 2118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); 2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) 2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(ager): It could be nice to allow the ommision of instance 2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // type checks if we have already performed an instance type check 2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with a larger range. 2126e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckInstanceType* b = HCheckInstanceType::cast(other); 2128257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return check_ == b->check_; 2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2132257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum Check { 21333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch IS_SPEC_OBJECT, 2134257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_JS_ARRAY, 2135257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_STRING, 2136257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_SYMBOL, 2137257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LAST_INTERVAL_CHECK = IS_JS_ARRAY 2138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 2139257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const char* GetCheckName(); 21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2142257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HCheckInstanceType(HValue* value, Check check) 2143257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HUnaryOperation(value), check_(check) { 2144257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 2145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 2146257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2147257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2148257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const Check check_; 2149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation { 2153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { 2155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 21661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2169257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* Canonicalize() { 2170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HType value_type = value()->type(); 2171257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!value_type.IsUninitialized() && 2172257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (value_type.IsHeapNumber() || 2173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsString() || 2174257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsBoolean() || 2175257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsNonPrimitive())) { 2176257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 2177257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2178257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 2179257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2180257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2181257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi) 21821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2184e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2188e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> { 2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2190b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder) 2191b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : prototype_(prototype), holder_(holder) { 2192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 21971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2200b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype() const { return prototype_; } 2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder() const { return holder_; } 2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2203257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) 2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2209e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 221044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->IsAllocationAllowed()); 2211b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch intptr_t hash = reinterpret_cast<intptr_t>(*prototype()); 2212b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch hash = 17 * hash + reinterpret_cast<intptr_t>(*holder()); 2213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return hash; 2214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 2215b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2217e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); 2219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return prototype_.is_identical_to(b->prototype()) && 2220b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch holder_.is_identical_to(b->holder()); 2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype_; 2225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder_; 2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation { 2230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { 2232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 22421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2245257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 22461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue { 2253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HPhi(int merged_index) 2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : inputs_(2), 2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch merged_index_(merged_index), 225744f0eee88ff00398ff7f715fab053374d808c90dSteve Block phi_id_(-1), 2258257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_live_(false), 2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_(true) { 2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch non_phi_uses_[i] = 0; 2262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] = 0; 2263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(merged_index >= 0); 2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation InferredRepresentation(); 2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 2274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2275e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return inputs_.length(); } 2277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return inputs_[index]; } 2278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* GetRedundantReplacement(); 2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddInput(HValue* value); 228044f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasRealUses(); 2281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 22821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsReceiver() { return merged_index_ == 0; } 2283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index() const { return merged_index_; } 2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 22891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitRealUses(int id); 2293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNonPhiUsesFrom(HPhi* other); 2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddIndirectUsesTo(int* use_count); 2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_non_phi_uses() const { 2297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kTagged]; 2298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_non_phi_uses() const { 2300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kInteger32]; 2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_non_phi_uses() const { 2303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kDouble]; 2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_indirect_uses() const { 2306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kTagged]; 2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_indirect_uses() const { 2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kInteger32]; 2310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_indirect_uses() const { 2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kDouble]; 2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id() { return phi_id_; } 231544f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live() { return is_live_; } 231644f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_is_live(bool b) { is_live_ = b; } 2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HPhi* cast(HValue* value) { 2319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->IsPhi()); 2320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<HPhi*>(value); 2321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::kPhi; } 2323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return is_convertible_to_integer_; 2326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_is_convertible_to_integer(bool b) { 2329257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_ = b; 2330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2332589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch bool AllOperandsConvertibleToInteger() { 2333589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 2334589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (!OperandAt(i)->IsConvertibleToInteger()) return false; 2335589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2336589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return true; 2337589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 2338589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph(); 2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_[index] = value; 2343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> inputs_; 2347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index_; 2348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int non_phi_uses_[Representation::kNumRepresentations]; 2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int indirect_uses_[Representation::kNumRepresentations]; 2351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id_; 235244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live_; 2353257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_convertible_to_integer_; 2354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> { 2358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsObject() { 2360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kIsArguments); 2362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> { 2373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant(Handle<Object> handle, Representation r); 2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle() const { return handle_; } 2377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 237844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); } 23799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 23803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool ImmortalImmovable() const { 23813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Heap* heap = HEAP; 23823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->undefined_value()) return true; 23833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->null_value()) return true; 23843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->true_value()) return true; 23853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->false_value()) return true; 23863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->the_hole_value()) return true; 23873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->minus_zero_value()) return true; 23883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->nan_value()) return true; 23893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (*handle_ == heap->empty_string()) return true; 23903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 23913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 23923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 23933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2394e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsSmi()) return true; 2399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsHeapNumber() && 2400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (HeapNumber::cast(*handle_)->value() == 2401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static_cast<double>(NumberToInt32(*handle_)))) return true; 2402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return false; 2403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 240544f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return !representation().IsDouble(); } 24063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 2407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger() const { return handle_->IsSmi(); } 2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToRepresentation(Representation r) const; 2411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToTruncatedInt32() const; 2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasInteger32Value() const { return has_int32_value_; } 2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Integer32Value() const { 2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasInteger32Value()); 2415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return int32_value_; 2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasDoubleValue() const { return has_double_value_; } 2418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double DoubleValue() const { 2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasDoubleValue()); 2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return double_value_; 2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 24223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasNumberValue() const { return has_int32_value_ || has_double_value_; } 24233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t NumberValueAsInteger32() const { 24243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(HasNumberValue()); 24253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (has_int32_value_) return int32_value_; 24263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return DoubleToInt32(double_value_); 24273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasStringValue() const { return handle_->IsString(); } 2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool ToBoolean() const; 24318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2432e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 243344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 24343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch intptr_t hash = reinterpret_cast<intptr_t>(*handle()); 24353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Prevent smis from having fewer hash values when truncated to 24363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the least significant bits. 24373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const int kShiftSize = kSmiShiftSize + kSmiTagSize; 24383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch STATIC_ASSERT(kShiftSize != 0); 24393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return hash ^ (hash >> kShiftSize); 2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 24431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() { } 2444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Constant) 2447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 24493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 2450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* other_constant = HConstant::cast(other); 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return handle().is_identical_to(other_constant->handle()); 2454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle_; 2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The following two values represent the int32 and the double value of the 2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // given constant if there is a lossless conversion between the constant 2461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // and the specific representation. 2462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_int32_value_ : 1; 2463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_double_value_ : 1; 2464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t int32_value_; 2465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double double_value_; 2466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBinaryOperation: public HTemplateInstruction<3> { 2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 24713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBinaryOperation(HValue* context, HValue* left, HValue* right) { 2472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(left != NULL && right != NULL); 24733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 24743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, left); 24753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, right); 2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 24793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(1); } 24803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(2); } 2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(kasperl): Move these helpers to the IA-32 Lithium 2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction sequence builder. 2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* LeastConstantOperand() { 2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return right(); 2486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2488e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* MostConstantOperand() { 2489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return left(); 2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return right(); 2491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return false; } 2494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2495e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 24993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HWrapReceiver: public HTemplateInstruction<2> { 25003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 25013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HWrapReceiver(HValue* receiver, HValue* function) { 25023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 25033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, receiver); 25043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, function); 25053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 25063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 25083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 25093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 25103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* receiver() { return OperandAt(0); } 25123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* function() { return OperandAt(1); } 25133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 25153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) 25173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 25183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 25193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> { 2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HApplyArguments(HValue* function, 2523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* receiver, 2524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* length, 2525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* elements) { 2526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, function); 2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, receiver); 2529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, length); 2530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(3, elements); 25311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length is untagged, all other inputs are tagged. 2536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 2) 2537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Integer32() 2538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Tagged(); 2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 2542e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* receiver() { return OperandAt(1); } 2543e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(2); } 2544e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* elements() { return OperandAt(3); } 2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> { 2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsElements() { 2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The value produced by this instruction is a pointer into the stack 2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // that looks as if it was a smi because of alignment. 2555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2559257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 25601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2562e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2563e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 25651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation { 2571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 2573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 2574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2578e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2579e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2580e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 25821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2588e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> { 2589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 2591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, arguments); 2594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, length); 2595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, index); 2596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The arguments elements is considered tagged. 2602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return index == 0 2603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Tagged() 2604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Integer32(); 2605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2607e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* arguments() { return OperandAt(0); } 2608e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(1); } 2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* index() { return OperandAt(2); } 2610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2611257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) 2612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2613e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HBoundsCheck: public HTemplateInstruction<2> { 2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 26193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBoundsCheck(HValue* index, HValue* length) { 26203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, index); 26213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, length); 26227d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch set_representation(Representation::Integer32()); 2623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 263069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 2631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* index() { return OperandAt(0); } 26333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* length() { return OperandAt(1); } 2634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2635257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 26361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation { 2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 26443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right) 26453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 26461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 26471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kFlexibleRepresentation); 26481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 26523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 26533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 26543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : representation(); 2655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void RepresentationChanged(Representation to) { 26581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (!to.IsTagged()) { 26591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsInteger32()); 26601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 26611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kTruncatingToInt32); 26621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 26631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 26641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 26651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 26671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation { 2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 26743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 26753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 26781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { 2682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!to.IsTagged()) { 26831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 26893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 26903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 26913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 26923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : representation(); 2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 26943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2695e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 2696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->representation().Equals(right()->representation())) { 2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left()->representation(); 2698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HValue::InferredRepresentation(); 2700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareGeneric: public HBinaryOperation { 2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareGeneric(HValue* context, 27073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left, 27083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right, 27093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token) 27103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right), token_(token) { 2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(Token::IsCompareOp(token)); 2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 27131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 27193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation GetInputRepresentation() const { 27213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 27233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token() const { return token_; } 2725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 2730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token_; 2733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareIDAndBranch: public HTemplateControlInstruction<2, 2> { 2737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareIDAndBranch(HValue* left, HValue* right, Token::Value token) 27393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : token_(token) { 27403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(Token::IsCompareOp(token)); 27413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 27423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 2743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 27463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 27473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token() const { return token_; } 27483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 27493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void SetInputRepresentation(Representation r); 27503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Representation GetInputRepresentation() const { 27513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return input_representation_; 27521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 27531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return input_representation_; 2756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 27573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 2758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareIDAndBranch) 27601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 27623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Representation input_representation_; 27633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token_; 2764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 27673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> { 2768257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 27693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareObjectEqAndBranch(HValue* left, HValue* right) { 27703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 27713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 2772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 27753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 2776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 27783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 27793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2780257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 2781257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2782257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) 2784257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2785257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2786257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 27873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HCompareConstantEqAndBranch: public HUnaryControlInstruction { 2788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareConstantEqAndBranch(HValue* left, int right, Token::Value op) 27903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(left, NULL, NULL), op_(op), right_(right) { 27913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ASSERT(op == Token::EQ_STRICT); 2792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 27931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value op() const { return op_; } 27953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return value(); } 27963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int right() const { return right_; } 27971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 27993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Integer32(); 2800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 28013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareConstantEqAndBranch); 28033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 28053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const Token::Value op_; 28063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch const int right_; 2807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HIsNilAndBranch: public HUnaryControlInstruction { 2811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HIsNilAndBranch(HValue* value, EqualityKind kind, NilValue nil) 28133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), kind_(kind), nil_(nil) { } 2814592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 28153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EqualityKind kind() const { return kind_; } 28163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NilValue nil() const { return nil_; } 2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 28193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 28203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(IsNilAndBranch) 28253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 28273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch EqualityKind kind_; 28283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch NilValue nil_; 2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsObjectAndBranch: public HUnaryControlInstruction { 2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsObjectAndBranch(HValue* value) 28353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 28401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 28413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) 2842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HIsStringAndBranch: public HUnaryControlInstruction { 28453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 28463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch explicit HIsStringAndBranch(HValue* value) 28473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 28483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 28493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 28513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 28523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 28533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) 28543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 28553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsSmiAndBranch: public HUnaryControlInstruction { 2858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 28593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsSmiAndBranch(HValue* value) 28603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 28613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 28623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) 2863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 2869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 2870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 28733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsUndetectableAndBranch: public HUnaryControlInstruction { 2874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 28753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HIsUndetectableAndBranch(HValue* value) 28763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 28783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 28793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 28803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 28811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 28823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) 28831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 28841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 28851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 28863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HStringCompareAndBranch: public HTemplateControlInstruction<2, 3> { 28873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 28883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStringCompareAndBranch(HValue* context, 28893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 28903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right, 28913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value token) 28923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : token_(token) { 28933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(Token::IsCompareOp(token)); 28943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, context); 28953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, left); 28963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(2, right); 28973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 28983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 28993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 29013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left() { return OperandAt(1); } 29023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right() { return OperandAt(2); } 29033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value token() const { return token_; } 29043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 29063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 29093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 29103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation GetInputRepresentation() const { 29123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 29133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 29143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) 29163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 29183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value token_; 29193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 29203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 29223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIsConstructCallAndBranch: public HTemplateControlInstruction<2, 0> { 29231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 29243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 2925e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2926e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2927e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 29283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) 2929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasInstanceTypeAndBranch: public HUnaryControlInstruction { 2933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType type) 29353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } 29363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) 29373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { 2938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. 2939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from() { return from_; } 2942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to() { return to_; } 2943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) 29513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from_; 2954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to_; // Inclusive range, not all combinations work. 2955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HHasCachedArrayIndexAndBranch: public HUnaryControlInstruction { 2959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HHasCachedArrayIndexAndBranch(HValue* value) 29613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 2962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 29653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 29661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) 2968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 29713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HGetCachedArrayIndex: public HUnaryOperation { 2972e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 29733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { 29743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Tagged()); 29753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 29763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 29773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 29803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) 2983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2984e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 2985e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HClassOfTestAndBranch: public HUnaryControlInstruction { 2990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 29913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HClassOfTestAndBranch(HValue* value, Handle<String> class_name) 29923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), 29933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch class_name_(class_name) { } 2994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 29953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) 29963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 29973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 29983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 29993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3001e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name() const { return class_name_; } 3004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name_; 3007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeofIsAndBranch: public HUnaryControlInstruction { 3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) 30133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HUnaryControlInstruction(value, NULL, NULL), 30143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch type_literal_(type_literal) { } 3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal() { return type_literal_; } 3017e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) 3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 30223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 3023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal_; 3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOf: public HBinaryOperation { 3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HInstanceOf(HValue* context, HValue* left, HValue* right) 30333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 30351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 30433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 30451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3046257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HInstanceOfKnownGlobal: public HTemplateInstruction<2> { 3051086aeeaae12517475c22695a200be45495516549Ben Murdoch public: 30523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HInstanceOfKnownGlobal(HValue* context, 30533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left, 30543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<JSFunction> right) 30553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : function_(right) { 30563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 30573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, left); 3058086aeeaae12517475c22695a200be45495516549Ben Murdoch set_representation(Representation::Tagged()); 30591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3060086aeeaae12517475c22695a200be45495516549Ben Murdoch } 3061086aeeaae12517475c22695a200be45495516549Ben Murdoch 30623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 30633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(1); } 3064086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function() { return function_; } 3065086aeeaae12517475c22695a200be45495516549Ben Murdoch 30663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3067086aeeaae12517475c22695a200be45495516549Ben Murdoch return Representation::Tagged(); 3068086aeeaae12517475c22695a200be45495516549Ben Murdoch } 3069086aeeaae12517475c22695a200be45495516549Ben Murdoch 30703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 30713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 3072257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) 3073086aeeaae12517475c22695a200be45495516549Ben Murdoch 3074086aeeaae12517475c22695a200be45495516549Ben Murdoch private: 3075086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function_; 3076086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 3077086aeeaae12517475c22695a200be45495516549Ben Murdoch 3078086aeeaae12517475c22695a200be45495516549Ben Murdoch 30793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HPower: public HTemplateInstruction<2> { 3080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HPower(HValue* left, HValue* right) { 30823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 30833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 30893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right() { return OperandAt(1); } 30903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 30913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 30923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 30933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Double() 30943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::None(); 3095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Power) 30981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 30991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3100e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HRandom: public HTemplateInstruction<1> { 31053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 31063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch explicit HRandom(HValue* global_object) { 31073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, global_object); 31083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Double()); 31093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* global_object() { return OperandAt(0); } 31123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 31143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 31153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 31163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Random) 31183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 31193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation { 3122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HAdd(HValue* context, HValue* left, HValue* right) 31243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Add is only commutative if two integer values are added and not if two 3129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // tagged values are added (because it might be a String concatenation). 3130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 3131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 3132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHAdd(Zone* zone, 31373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 31383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 31393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 31403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3141e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 3142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 31443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3145257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Add) 3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 31491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 31503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation { 3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HSub(HValue* context, HValue* left, HValue* right) 31573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 31643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 31653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHSub(Zone* zone, 31663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 31673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 31683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 31693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3170257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sub) 3171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 31741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 31753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 3176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation { 3180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HMul(HValue* context, HValue* left, HValue* right) 31823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Only commutative if it is certain that not two objects are multiplicated. 3189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 3190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 3191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHMul(Zone* zone, 31943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 31953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 31963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 31973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mul) 3199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 32021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 3204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation { 3208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 32093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HMod(HValue* context, HValue* left, HValue* right) 32103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 3212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 321444f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasPowerOf2Divisor() { 321544f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (right()->IsConstant() && 321644f0eee88ff00398ff7f715fab053374d808c90dSteve Block HConstant::cast(right())->HasInteger32Value()) { 321744f0eee88ff00398ff7f715fab053374d808c90dSteve Block int32_t value = HConstant::cast(right())->Integer32Value(); 321844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); 321944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 322044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 322144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 322244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 322344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 32263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHMod(Zone* zone, 32273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 32283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 32293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 32303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mod) 3232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3234e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 32351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 3237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation { 3241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 32423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HDiv(HValue* context, HValue* left, HValue* right) 32433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 3244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 3245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 3246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 3249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 32503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHDiv(Zone* zone, 32513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 32523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 32533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 32543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3255592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Div) 3256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3258e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 32591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 3261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 32643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HBitwise: public HBitwiseBinaryOperation { 3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 32663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HBitwise(Token::Value op, HValue* context, HValue* left, HValue* right) 32673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HBitwiseBinaryOperation(context, left, right), op_(op) { 32683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(op == Token::BIT_AND || 32693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::BIT_OR || 32703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch op == Token::BIT_XOR); 32713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3272c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 32733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op() const { return op_; } 327485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 327585b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch virtual bool IsCommutative() const { return true; } 3276592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 32773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 327885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 32793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHBitwise(Zone* zone, 32803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op, 32813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 32823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 32833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 328485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 32853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Bitwise) 328685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 328785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch protected: 32883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { 32893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return op() == HBitwise::cast(other)->op(); 32903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 329185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 32923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 32933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 32943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 32953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op_; 3296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation { 3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HShl(HValue* context, HValue* left, HValue* right) 33023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 33053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHShl(Zone* zone, 33073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 33083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 33093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 3310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shl) 33121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 33131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3314e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation { 3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HShr(HValue* context, HValue* left, HValue* right) 33213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 33243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHShr(Zone* zone, 33263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 33273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 33283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 3329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shr) 33311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 33321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation { 3338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HSar(HValue* context, HValue* left, HValue* right) 33403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBitwiseBinaryOperation(context, left, right) { } 3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 33433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 33443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static HInstruction* NewHSar(Zone* zone, 33453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context, 33463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left, 33473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right); 3348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sar) 33501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 33511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3352e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 3353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> { 3357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { 33593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesOsrEntries); 3360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 3363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3367e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3368257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 3369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 3372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3375e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> { 3376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HParameter(unsigned index) : index_(index) { 3378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index() const { return index_; } 3382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 33853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3386e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Parameter) 3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index_; 3393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall { 3397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 33991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), 34001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block major_key_(major_key), 3401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_(TranscendentalCache::kNumberOfCaches) { 3402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key() { return major_key_; } 34051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 3407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transcendental_type(TranscendentalCache::Type transcendental_type) { 3409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_ = transcendental_type; 3410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type() { 3412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return transcendental_type_; 3413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 34141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3416e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 34173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallStub) 3422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key_; 3425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type_; 3426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3429e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> { 3430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 34313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HUnknownOSRValue() 34323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : incoming_value_(NULL) { 34333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 34343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 34363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 34403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void set_incoming_value(HPhi* value) { 34413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch incoming_value_ = value; 34423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* incoming_value() { 34453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return incoming_value_; 34463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 34493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 34503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 34513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* incoming_value_; 3452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 34558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> { 3456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 34573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, PropertyDetails details) 34583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : cell_(cell), details_(details) { 3459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 34613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnGlobalVars); 3462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 34653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck(); 3466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3469e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 347044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 3471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<intptr_t>(*cell_); 3472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 34743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 3479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 34828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalCell* b = HLoadGlobalCell::cast(other); 3483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return cell_.is_identical_to(b->cell()); 3484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 34883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyDetails details_; 3489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 34923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadGlobalGeneric: public HTemplateInstruction<2> { 3493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 34948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalGeneric(HValue* context, 34958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 34968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 34978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof) 34983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name), 34998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for_typeof_(for_typeof) { 35003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 35013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, global_object); 35028b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 35038b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 35048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 35058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 35078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 35088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 35098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof() const { return for_typeof_; } 35108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 35128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 35148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 35158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 35168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) 35188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 35208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 35218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof_; 35228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 35238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) { 35263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return !value->type().IsBoolean() 35273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch && !value->type().IsSmi() 35283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); 35293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 35303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 35313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 35328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation { 35338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 35348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalCell(HValue* value, 35358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<JSGlobalPropertyCell> cell, 35363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyDetails details) 35371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value), 35381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block cell_(cell), 35393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch details_(details) { 35403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesGlobalVars); 3541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 35443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck() { 35453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return !details_.IsDontDelete() || details_.IsReadOnly(); 35463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 35473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool NeedsWriteBarrier() { 35483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return StoringValueNeedsWriteBarrier(value()); 35493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 35513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 3557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 35603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyDetails details_; 3561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 35648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> { 35658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 35668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalGeneric(HValue* context, 35678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 35688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 35698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 35703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag) 35718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 35723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch strict_mode_flag_(strict_mode_flag) { 35738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(0, context); 35748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(1, global_object); 35758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(2, value); 35768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 35778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 35788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 35798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 35818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 35828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 35838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value() { return OperandAt(2); } 35843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 35858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 35878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 35898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 35908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 35918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3592257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric) 35938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 35958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 35963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag_; 35978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 35988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 35998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 36001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation { 3601b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 36023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum Mode { 36033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Perform a normal load of the context slot without checking its value. 36043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNoCheck, 36053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Load and check the value of the context slot. Deoptimize if it's the 36063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // hole value. This is used for checking for loading of uninitialized 36073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // harmony bindings where we deoptimize into full-codegen generated code 36083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which will subsequently throw a reference error. 36093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckDeoptimize, 36103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Load and check the value of the context slot. Return undefined if it's 36113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the hole value. This is used for non-harmony const assignments 36123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckReturnUndefined 36133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 36143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadContextSlot(HValue* context, Variable* var) 36163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryOperation(context), slot_index_(var->index()) { 36173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(var->IsContextSlot()); 36183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch switch (var->mode()) { 36193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case LET: 36203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CONST_HARMONY: 36213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode_ = kCheckDeoptimize; 36223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 36233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch case CONST: 36243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode_ = kCheckReturnUndefined; 36253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch break; 36263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch default: 36273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch mode_ = kNoCheck; 36283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3629b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_representation(Representation::Tagged()); 3630b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SetFlag(kUseGVN); 36313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnContextSlots); 3632b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3633b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3634b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index() const { return slot_index_; } 36353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode() const { return mode_; } 36363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool DeoptimizesOnHole() { 36383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ == kCheckDeoptimize; 36393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3640c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 36413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck() { 36423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ != kNoCheck; 36433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 36443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 36461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 3647b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3648b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 36501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) 3652b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3653b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected: 3654e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3655b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadContextSlot* b = HLoadContextSlot::cast(other); 36561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (slot_index() == b->slot_index()); 3657b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3658b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3659b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private: 36601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index_; 36613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode_; 36621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 36631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreContextSlot: public HTemplateInstruction<2> { 36661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 36673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum Mode { 36683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Perform a normal store to the context slot without checking its previous 36693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // value. 36703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNoCheck, 36713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Check the previous value of the context slot and deoptimize if it's the 36723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // hole value. This is used for checking for assignments to uninitialized 36733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // harmony bindings where we deoptimize into full-codegen generated code 36743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which will subsequently throw a reference error. 36753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckDeoptimize, 36763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Check the previous value and ignore assignment if it isn't a hole value 36773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckIgnoreAssignment 36783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 36793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 36803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) 36813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : slot_index_(slot_index), mode_(mode) { 36823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 36833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 36843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesContextSlots); 36851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 36861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 36891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index() const { return slot_index_; } 36903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode() const { return mode_; } 36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3692e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 36931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 36941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 36951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool DeoptimizesOnHole() { 36973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ == kCheckDeoptimize; 36983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 36993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 37003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck() { 37013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ != kNoCheck; 37023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 37033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 37043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 37051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 3713b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index_; 37143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode_; 3715b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 3716b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3717b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation { 3719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField(HValue* object, bool is_in_object, int offset) 3721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(object), 3722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(is_in_object), 3723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 3724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 37263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 3727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object) { 37283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnInobjectFields); 3729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 37303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnBackingStoreFields); 3731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 3736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 3737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 37383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3741e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3743257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 3744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField* b = HLoadNamedField::cast(other); 3748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; 3749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 3753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 3754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 37573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedFieldPolymorphic: public HTemplateInstruction<2> { 375844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 37593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadNamedFieldPolymorphic(HValue* context, 37603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object, 376169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList* types, 376244f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name); 376344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 37653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object() { return OperandAt(1); } 376669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList* types() { return &types_; } 376744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name() { return name_; } 376844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic() { return need_generic_; } 376944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 377144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 377244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 377344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 377469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 377569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3776257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic) 377744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 377844f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kMaxLoadPolymorphism = 4; 377944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 378044f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 378144f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* value); 378244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 378344f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 378469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SmallMapList types_; 378544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name_; 378644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic_; 378744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 378844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 378944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 379044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadNamedGeneric: public HTemplateInstruction<2> { 3792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 37931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) 37943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name) { 37953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 37963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, object); 3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 37981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(1); } 3803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name() const { return name_; } 3804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 380969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch virtual void PrintDataTo(StringStream* stream); 381069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 3811257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) 3812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name_; 3815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation { 38199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 38209fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block explicit HLoadFunctionPrototype(HValue* function) 38219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block : HUnaryOperation(function) { 38229fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 38231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 38243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnCalls); 38259fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 38269fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 38289fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 38293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 38309fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 38319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 38329fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3833257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 38349fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 38359fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected: 3836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 38379fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 38389fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 38399fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 38403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastElement: public HTemplateInstruction<2> { 3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 38423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; 38433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 38443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastElement(HValue* obj, 38453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* key, 38463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) 38473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : hole_check_mode_(hole_check_mode) { 38483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, obj); 38493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 3850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 38513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnArrayElements); 3852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 38583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The key is supposed to be Integer32. 38603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 38613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 38623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 3863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3865e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 38673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck(); 3868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) 38701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 38711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 38723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { 38733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!other->IsLoadKeyedFastElement()) return false; 38743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other); 38753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return hole_check_mode_ == other_load->hole_check_mode_; 38763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 38773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 38783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 38793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HoleCheckMode hole_check_mode_; 38801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 38811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 38821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 38833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedFastDoubleElement: public HTemplateInstruction<2> { 38843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 38853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HLoadKeyedFastDoubleElement(HValue* elements, HValue* key) { 38863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, elements); 38873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 38883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Double()); 38893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnDoubleArrayElements); 38903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetFlag(kUseGVN); 38913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 38923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 38933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* elements() { return OperandAt(0); } 38943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 38953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 38963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 38973fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // The key is supposed to be Integer32. 38983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 38993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 39003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 39013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 39023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39033fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 39043fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement) 39063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 39083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 39093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 39103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 39123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HLoadKeyedSpecializedArrayElement: public HTemplateInstruction<2> { 39131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 391444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement(HValue* external_elements, 391544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 3916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind) 39173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : elements_kind_(elements_kind) { 39183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, external_elements); 39193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 3920589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch if (elements_kind == EXTERNAL_FLOAT_ELEMENTS || 3921589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind == EXTERNAL_DOUBLE_ELEMENTS) { 392244f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Double()); 392344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 392444f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Integer32()); 392544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 39263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnSpecializedArrayElements); 392744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Native code could change the specialized array. 39283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnCalls); 39291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 39301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 39311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3932e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 39331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 39343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 39351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The key is supposed to be Integer32, but the base pointer 39361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // for the element load is a naked pointer. 39373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 39383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::External() 39393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 39401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 39411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3942e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3944589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind() const { return elements_kind_; } 39451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 39463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 39473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) 39491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 39501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 395144f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { 395244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!other->IsLoadKeyedSpecializedArrayElement()) return false; 395344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement* cast_other = 395444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement::cast(other); 39553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return elements_kind_ == cast_other->elements_kind(); 395644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 395744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 395844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 3959589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind_; 3960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3963e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> { 3964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { 3966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 3967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, obj); 3968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 39691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 39701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 39711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 39721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3973e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3975e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 39769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 39793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 3980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 39833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 39843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3985257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 3986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 39893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreNamedField: public HTemplateInstruction<2> { 3990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HStoreNamedField(HValue* obj, 39921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 3993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* val, 3994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool in_object, 3995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset) 39963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : name_(name), 3997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(in_object), 3998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 39993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, obj); 40003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, val); 4001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object_) { 40023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesInobjectFields); 4003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 40043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesBackingStoreFields); 4005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4008257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 4009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 40103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 40111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 4012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 4014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4015e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 4016e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 4017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() const { return name_; } 4019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 4020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 4021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition() const { return transition_; } 4022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transition(Handle<Map> map) { transition_ = map; } 4023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4024e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 40251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 40261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 40271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4029e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 4030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 4031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 4032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition_; 4033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> { 4037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 40381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreNamedGeneric(HValue* context, 40391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 40401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 40418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 40423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag) 40438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 40443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch strict_mode_flag_(strict_mode_flag) { 4045e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 4046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, value); 40471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 40481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 40491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 40501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4051e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 4052e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 4053e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 4054e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() { return name_; } 40553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 40561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4057e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 40581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4063257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) 40641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 40651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 4066e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 40673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag_; 4068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4071e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> { 4072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 40733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val, 40743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind = FAST_ELEMENTS) 40753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : elements_kind_(elements_kind) { 4076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, obj); 4077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, key); 4078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, val); 40793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesArrayElements); 4080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 40823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4083e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // The key is supposed to be Integer32. 40843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 1 40853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Integer32() 4086e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : Representation::Tagged(); 4087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 4090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 4091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 40923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool value_is_smi() { 40933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return elements_kind_ == FAST_SMI_ONLY_ELEMENTS; 40943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 40973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (value_is_smi()) { 40983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return false; 40993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } else { 41003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return StoringValueNeedsWriteBarrier(value()); 41013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 4102592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 4103592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 4105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement) 41073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 41083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 41093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind elements_kind_; 4110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 41133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStoreKeyedFastDoubleElement: public HTemplateInstruction<3> { 41143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 41153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStoreKeyedFastDoubleElement(HValue* elements, 41163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key, 41173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* val) { 41183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, elements); 41193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 41203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, val); 41213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesDoubleArrayElements); 41223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 41233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 41253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 1) { 41263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Integer32(); 41273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else if (index == 2) { 41283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Double(); 41293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 41303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 41313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 41323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 41333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* elements() { return OperandAt(0); } 41353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 41363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(2); } 41373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool NeedsWriteBarrier() { 41393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return StoringValueNeedsWriteBarrier(value()); 41403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 41413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual void PrintDataTo(StringStream* stream); 41433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastDoubleElement) 41453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 41463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 41473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 414844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { 4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 415044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HStoreKeyedSpecializedArrayElement(HValue* external_elements, 415144f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 415244f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* val, 4153589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind) 41543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : elements_kind_(elements_kind) { 41553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesSpecializedArrayElements); 4156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, external_elements); 4157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 4158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, val); 4159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 4162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 41633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (index == 0) { 4165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::External(); 4166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 41673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool float_or_double_elements = 4168589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind() == EXTERNAL_FLOAT_ELEMENTS || 4169589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch elements_kind() == EXTERNAL_DOUBLE_ELEMENTS; 41703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (index == 2 && float_or_double_elements) { 417144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Double(); 417244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 417344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Integer32(); 417444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 4175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 4179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 4180e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 4181589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind() const { return elements_kind_; } 4182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4183257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) 4184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 418544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 4186589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch ElementsKind elements_kind_; 4187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4190e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> { 4191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 41921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreKeyedGeneric(HValue* context, 41931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 41941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* key, 41958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 41963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag) 41973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : strict_mode_flag_(strict_mode_flag) { 4198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 4199e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 4200e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, value); 42011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(3, context); 42021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 42031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 42041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 4206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 4207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 4208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(3); } 42093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag() { return strict_mode_flag_; } 42101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 42113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4212e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4215e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 42161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 42188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 42198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 42203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch StrictModeFlag strict_mode_flag_; 42213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 42223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HTransitionElementsKind: public HTemplateInstruction<1> { 42253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 42263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind(HValue* object, 42273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> original_map, 42283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> transitioned_map) 42293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : original_map_(original_map), 42303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch transitioned_map_(transitioned_map) { 42313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, object); 42323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetFlag(kUseGVN); 42333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesElementsKind); 42343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kChangesElementsPointer); 42353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 42363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 42373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 42393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 42403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 42413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* object() { return OperandAt(0); } 42433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> original_map() { return original_map_; } 42443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> transitioned_map() { return transitioned_map_; } 42453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 42473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 42493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 42513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { 42523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); 42533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return original_map_.is_identical_to(instr->original_map()) && 42543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch transitioned_map_.is_identical_to(instr->transitioned_map()); 42553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 42563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 42573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 42583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> original_map_; 42593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<Map> transitioned_map_; 42608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 42618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 42628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 4263257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation { 4264257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 42653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringAdd(HValue* context, HValue* left, HValue* right) 42663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 4267257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 4268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 42693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 4270257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 42723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4273257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 4274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 4277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::String(); 4278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4280257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringAdd) 4281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4282257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 4283257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 4284257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4286257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 42873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharCodeAt: public HTemplateInstruction<3> { 42881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 42893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 42903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 42913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, string); 42923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, index); 42931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Integer32()); 42941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 42953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 42961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 42971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 42983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 42991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The index is supposed to be Integer32. 43003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 2 43013fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Integer32() 43021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : Representation::Tagged(); 43031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 43063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* string() { return OperandAt(1); } 43073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* index() { return OperandAt(2); } 43081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 43101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 4312e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 43131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone) { 43153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(0, String::kMaxUtf16CodeUnit); 43161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 43181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HStringCharFromCode: public HTemplateInstruction<2> { 432144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 43223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HStringCharFromCode(HValue* context, HValue* char_code) { 43233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 43243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, char_code); 43253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 432644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kUseGVN); 432744f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 432844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 43313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 43323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::Integer32(); 433344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 43343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 433544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 43373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 43383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 433944f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { return true; } 434044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 434244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 434344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 434444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 43451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation { 43461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 43471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HStringLength(HValue* string) : HUnaryOperation(string) { 43481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 43491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 43503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 43511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 43541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 43551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { 43581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 43591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return HType::Smi(); 43601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 43611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4362257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringLength) 43631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 4365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 43661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 43673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone) { 43683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(0, String::kMaxLength); 43693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 43703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 43713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HAllocateObject: public HTemplateInstruction<1> { 43743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 43753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HAllocateObject(HValue* context, Handle<JSFunction> constructor) 43763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : constructor_(constructor) { 43773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, context); 43783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 43793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 43803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 43823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSFunction> constructor() { return constructor_; } 43833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 43853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 43865d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch } 43873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 43883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(AllocateObject) 43903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 43913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 43923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSFunction> constructor_; 43935d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}; 43945d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 43955d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 4396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 4397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> { 4398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4399e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HMaterializedLiteral<V>(int index, int depth) 4400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : literal_index_(index), depth_(depth) { 4401e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 4402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index() const { return literal_index_; } 4405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth() const { return depth_; } 4406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index_; 4409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth_; 4410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 44133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HFastLiteral: public HMaterializedLiteral<1> { 44143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 44153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HFastLiteral(HValue* context, 44163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSObject> boilerplate, 44173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int total_size, 44183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int literal_index, 44193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int depth) 44203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HMaterializedLiteral<1>(literal_index, depth), 44213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch boilerplate_(boilerplate), 44223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch total_size_(total_size) { 44233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, context); 44243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 44253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Maximum depth and total number of elements and properties for literal 44273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // graphs to be considered for fast deep-copying. 44283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxLiteralDepth = 3; 44293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static const int kMaxLiteralProperties = 8; 44303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 44323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSObject> boilerplate() const { return boilerplate_; } 44333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int total_size() const { return total_size_; } 44343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 44363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 44373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 44383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 44393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(FastLiteral) 44413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 44433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<JSObject> boilerplate_; 44443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int total_size_; 44453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 44463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 44483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HArrayLiteral: public HMaterializedLiteral<1> { 4449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 44503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HArrayLiteral(HValue* context, 44513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<HeapObject> boilerplate_object, 4452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length, 4453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index, 4454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth) 44553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HMaterializedLiteral<1>(literal_index, depth), 4456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length_(length), 44573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch boilerplate_object_(boilerplate_object) { 44583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 44593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 44613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 44623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ElementsKind boilerplate_elements_kind() const { 44633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch if (!boilerplate_object_->IsJSObject()) { 44643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return FAST_ELEMENTS; 44653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 44663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Handle<JSObject>::cast(boilerplate_object_)->GetElementsKind(); 44673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 44683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<HeapObject> boilerplate_object() const { return boilerplate_object_; } 4469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length() const { return length_; } 4470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsCopyOnWrite() const; 4472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 44733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 44743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4475e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 44763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 4477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) 4479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length_; 44823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<HeapObject> boilerplate_object_; 4483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 44865d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdochclass HObjectLiteral: public HMaterializedLiteral<1> { 4487592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 44885d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch HObjectLiteral(HValue* context, 44895d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch Handle<FixedArray> constant_properties, 44905d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch bool fast_elements, 44915d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch int literal_index, 44925d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch int depth, 44935d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch bool has_function) 4494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HMaterializedLiteral<1>(literal_index, depth), 4495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch constant_properties_(constant_properties), 449644f0eee88ff00398ff7f715fab053374d808c90dSteve Block fast_elements_(fast_elements), 449744f0eee88ff00398ff7f715fab053374d808c90dSteve Block has_function_(has_function) { 44981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, context); 44991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 4500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 4502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties() const { 4503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return constant_properties_; 4504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements() const { return fast_elements_; } 450644f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function() const { return has_function_; } 4507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 45113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 45121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 45135d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) 4514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties_; 4517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements_; 451844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function_; 4519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HRegExpLiteral: public HMaterializedLiteral<1> { 4523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 45243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HRegExpLiteral(HValue* context, 45253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> pattern, 4526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags, 4527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index) 45283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HMaterializedLiteral<1>(literal_index, 0), 4529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pattern_(pattern), 45303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch flags_(flags) { 45313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 45322b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch SetAllSideEffects(); 45333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 4536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern() { return pattern_; } 4537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags() { return flags_; } 4538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 45403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 45423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 4543e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) 4545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern_; 4548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags_; 4549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HFunctionLiteral: public HTemplateInstruction<1> { 4553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 45543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HFunctionLiteral(HValue* context, 45553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<SharedFunctionInfo> shared, 45563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool pretenure) 4557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : shared_info_(shared), pretenure_(pretenure) { 45583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 4559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 45633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 45653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 45673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType(); 4568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 4570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 4572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure() const { return pretenure_; } 4573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info_; 4576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure_; 4577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HTypeof: public HTemplateInstruction<2> { 4581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 45823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HTypeof(HValue* context, HValue* value) { 45833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 45843fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 4585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 45883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 45893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* value() { return OperandAt(1); } 45903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 45913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HValue* Canonicalize(); 45923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 45933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 45951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 45961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 45971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Typeof) 4599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 460244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation { 460344f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 460444f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 460544f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This instruction is not marked as having side effects, but 460644f0eee88ff00398ff7f715fab053374d808c90dSteve Block // changes the map of the input operand. Use it only when creating 460744f0eee88ff00398ff7f715fab053374d808c90dSteve Block // object literals. 46083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch ASSERT(value->IsObjectLiteral() || value->IsFastLiteral()); 460944f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 461044f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 461144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 46123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 461344f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 461444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 461544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4616257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 461744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 461844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 461944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation { 4621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HValueOf(HValue* value) : HUnaryOperation(value) { 4623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 4624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 4628e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4629e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ValueOf) 4631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HDateField: public HUnaryOperation { 46353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 46363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HDateField(HValue* date, Smi* index) 46373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryOperation(date), index_(index) { 46383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 46393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 46403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Smi* index() const { return index_; } 46423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 46443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 46453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 46463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DateField) 46483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 46503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Smi* index_; 46513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 46523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 46533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation { 4655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 46563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HDeleteProperty(HValue* context, HValue* obj, HValue* key) 46573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, obj, key) { 4658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 46591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 4664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch virtual HType CalculateInferredType(); 46673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(DeleteProperty) 4669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4670e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return left(); } 4671e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return right(); } 4672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 46753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochclass HIn: public HTemplateInstruction<3> { 4676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 46773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HIn(HValue* context, HValue* key, HValue* object) { 46783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 46793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, key); 46803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, object); 4681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 4682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetAllSideEffects(); 4683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 46853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 46863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* key() { return OperandAt(1); } 46873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* object() { return OperandAt(2); } 4688257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 46893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 4690257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 4691257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4692257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 4694257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::Boolean(); 4695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4697257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual void PrintDataTo(StringStream* stream); 4698257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4699257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(In) 4700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4701257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 47023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HCheckMapValue: public HTemplateInstruction<2> { 47043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 47053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HCheckMapValue(HValue* value, 47063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* map) { 47073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, value); 47083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, map); 47093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 47103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetFlag(kUseGVN); 47113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnMaps); 47123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetGVNFlag(kDependsOnElementsKind); 47133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 47163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 47173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 47203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType() { 47223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 47233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* value() { return OperandAt(0); } 47263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* map() { return OperandAt(1); } 47273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) 47293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 47313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual bool DataEquals(HValue* other) { 47323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 47333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 47353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HForInPrepareMap : public HTemplateInstruction<2> { 47383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 47393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInPrepareMap(HValue* context, 47403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* object) { 47413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, context); 47423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, object); 47433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 47443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetAllSideEffects(); 47453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 47483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 47493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 47523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* enumerable() { return OperandAt(1); } 47533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 47553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType() { 47573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 47583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); 47613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 47623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HForInCacheArray : public HTemplateInstruction<2> { 47653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 47663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray(HValue* enumerable, 47673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* keys, 47683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int idx) : idx_(idx) { 47693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, enumerable); 47703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, keys); 47713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 47723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 47753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 47763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* enumerable() { return OperandAt(0); } 47793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* map() { return OperandAt(1); } 47803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int idx() { return idx_; } 47813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* index_cache() { 47833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return index_cache_; 47843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void set_index_cache(HForInCacheArray* index_cache) { 47873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index_cache_ = index_cache; 47883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 47913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType() { 47933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 47943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 47953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); 47973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 47983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int idx_; 48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* index_cache_; 48013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 48023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochclass HLoadFieldByIndex : public HTemplateInstruction<2> { 48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFieldByIndex(HValue* object, 48073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* index) { 48083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, object); 48093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, index); 48103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 48113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 48123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 48143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 48153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 48163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* object() { return OperandAt(0); } 48183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* index() { return OperandAt(1); } 48193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual void PrintDataTo(StringStream* stream); 48213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual HType CalculateInferredType() { 48233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 48243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 48253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); 48273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 48283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION 4831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION 4832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 4834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4836