hydrogen-instructions.h revision 257744e915dfc84d6d07a6b2accf8402d9ffc708
11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 the V8 project authors. All rights reserved. 2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without 3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met: 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions of source code must retain the above copyright 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// notice, this list of conditions and the following disclaimer. 8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Redistributions in binary form must reproduce the above 9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// copyright notice, this list of conditions and the following 10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// disclaimer in the documentation and/or other materials provided 11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// with the distribution. 12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// * Neither the name of Google Inc. nor the names of its 13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// contributors may be used to endorse or promote products derived 14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// from this software without specific prior written permission. 15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// 16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_HYDROGEN_INSTRUCTIONS_H_ 29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_ 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h" 3244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "allocation.h" 34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "code-stubs.h" 35257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#include "data-flow.h" 3644f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "small-pointer-list.h" 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "string-stream.h" 38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "zone.h" 39b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 40b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations. 44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock; 45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment; 46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction; 47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation; 48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue; 49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction; 50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder; 51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 53257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ 54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitwiseBinaryOperation) \ 55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ControlInstruction) \ 56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Instruction) \ 57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ 601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(AbnormalExit) \ 61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(AccessArgumentsAt) \ 62b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Add) \ 63b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ApplyArguments) \ 64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsElements) \ 65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsLength) \ 66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArgumentsObject) \ 67b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLiteral) \ 68b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitAnd) \ 69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitNot) \ 70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitOr) \ 71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BitXor) \ 72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BlockEntry) \ 73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BoundsCheck) \ 74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallConstantFunction) \ 75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallFunction) \ 76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallGlobal) \ 77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKeyed) \ 78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallKnownGlobal) \ 79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNamed) \ 80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallNew) \ 81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallRuntime) \ 82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CallStub) \ 83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Change) \ 84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckFunction) \ 85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckInstanceType) \ 86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckMap) \ 87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckNonSmi) \ 88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckPrototypeMaps) \ 89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CheckSmi) \ 90257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ClampToUint8) \ 9144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ClassOfTest) \ 92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Compare) \ 93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(CompareJSObjectEq) \ 941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(CompareMap) \ 95257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(CompareSymbolEq) \ 96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Constant) \ 971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(Context) \ 98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(DeleteProperty) \ 99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Deoptimize) \ 100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Div) \ 101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(EnterInlined) \ 10244f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ExternalArrayLength) \ 1039fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block V(FixedArrayLength) \ 104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(ForceRepresentation) \ 105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(FunctionLiteral) \ 106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch V(GetCachedArrayIndex) \ 107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalObject) \ 108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalReceiver) \ 109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Goto) \ 11044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(HasInstanceType) \ 11144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(HasCachedArrayIndex) \ 112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(In) \ 113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InstanceOf) \ 114086aeeaae12517475c22695a200be45495516549Ben Murdoch V(InstanceOfKnownGlobal) \ 115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(InvokeFunction) \ 116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(IsConstructCall) \ 117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(IsNull) \ 118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(IsObject) \ 119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(IsSmi) \ 120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(IsUndetectable) \ 1219fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block V(JSArrayLength) \ 122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LeaveInlined) \ 123b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch V(LoadContextSlot) \ 124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadElements) \ 12544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadExternalArrayPointer) \ 1261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(LoadFunctionPrototype) \ 1278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalCell) \ 1288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(LoadGlobalGeneric) \ 129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedFastElement) \ 130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadKeyedGeneric) \ 13144f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadKeyedSpecializedArrayElement) \ 132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedField) \ 13344f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(LoadNamedFieldPolymorphic) \ 134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(LoadNamedGeneric) \ 135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mod) \ 136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Mul) \ 137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ObjectLiteral) \ 138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntry) \ 1391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(OuterContext) \ 140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Parameter) \ 141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Power) \ 142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(PushArgument) \ 143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(RegExpLiteral) \ 144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Return) \ 145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sar) \ 146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shl) \ 147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Shr) \ 148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Simulate) \ 149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StackCheck) \ 1501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StoreContextSlot) \ 1518b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalCell) \ 1528b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch V(StoreGlobalGeneric) \ 153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedFastElement) \ 15444f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(StoreKeyedSpecializedArrayElement) \ 155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreKeyedGeneric) \ 156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedField) \ 157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(StoreNamedGeneric) \ 158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch V(StringAdd) \ 1591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringCharCodeAt) \ 16044f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(StringCharFromCode) \ 1611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(StringLength) \ 162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Sub) \ 1631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(Test) \ 164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Throw) \ 16544f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(ToFastProperties) \ 166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Typeof) \ 167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(TypeofIs) \ 168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnaryMathOperation) \ 169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(UnknownOSRValue) \ 170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ValueOf) 171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define GVN_FLAG_LIST(V) \ 173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Calls) \ 174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(InobjectFields) \ 175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BackingStoreFields) \ 176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayElements) \ 17744f0eee88ff00398ff7f715fab053374d808c90dSteve Block V(SpecializedArrayElements) \ 178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalVars) \ 179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Maps) \ 180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(ArrayLengths) \ 1811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block V(ContextSlots) \ 182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(OsrEntries) 183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 184257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type) \ 185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool Is##type() const { return true; } \ 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static H##type* cast(HValue* value) { \ 187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(value->Is##type()); \ 188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<H##type*>(value); \ 189257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type) \ 193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder); \ 194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static H##type* cast(HValue* value) { \ 195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->Is##type()); \ 196257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<H##type*>(value); \ 197257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } \ 198257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::k##type; } 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Range: public ZoneObject { 202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range() 204e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(kMinInt), 205e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(kMaxInt), 206e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range(int32_t lower, int32_t upper) 210e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(lower), 211e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(upper), 212e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper() const { return upper_; } 216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower() const { return lower_; } 217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next() const { return next_; } 218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* CopyClearLower() const { return new Range(kMinInt, upper_); } 219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* CopyClearUpper() const { return new Range(lower_, kMaxInt); } 220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* Copy() const { return new Range(lower_, upper_); } 221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Mask() const; 222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } 225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeNegative() const { return lower_ < 0; } 226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Includes(int value) const { return lower_ <= value && upper_ >= value; } 227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool IsMostGeneric() const { return lower_ == kMinInt && upper_ == kMaxInt; } 228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool IsInSmiRange() const { 229e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void KeepOrder(); 232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Verify() const; 233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void StackUpon(Range* other) { 235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Intersect(other); 236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = other; 237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Intersect(Range* other); 240e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Union(Range* other); 241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void AddConstant(int32_t value); 243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Sar(int32_t value); 244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Shl(int32_t value); 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool AddAndCheckOverflow(Range* other); 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool SubAndCheckOverflow(Range* other); 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool MulAndCheckOverflow(Range* other); 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower_; 251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper_; 252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next_; 253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool can_be_minus_zero_; 254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass Representation { 258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Kind { 260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNone, 261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged, 262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kDouble, 263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kInteger32, 2641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block kExternal, 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNumRepresentations 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation() : kind_(kNone) { } 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation None() { return Representation(kNone); } 271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Tagged() { return Representation(kTagged); } 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Integer32() { return Representation(kInteger32); } 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static Representation Double() { return Representation(kDouble); } 2741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static Representation External() { return Representation(kExternal); } 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(const Representation& other) { 277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == other.kind_; 278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Kind kind() const { return static_cast<Kind>(kind_); } 281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNone() const { return kind_ == kNone; } 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() const { return kind_ == kTagged; } 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger32() const { return kind_ == kInteger32; } 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDouble() const { return kind_ == kDouble; } 2851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsExternal() const { return kind_ == kExternal; } 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSpecialization() const { 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return kind_ == kInteger32 || kind_ == kDouble; 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* Mnemonic() const; 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit Representation(Kind k) : kind_(k) { } 293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure kind fits in int8. 2958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kNumRepresentations <= (1 << kBitsPerByte)); 2968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int8_t kind_; 298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HType { 302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType() : type_(kUninitialized) { } 304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Tagged() { return HType(kTagged); } 306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedPrimitive() { return HType(kTaggedPrimitive); } 307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TaggedNumber() { return HType(kTaggedNumber); } 308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Smi() { return HType(kSmi); } 309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType HeapNumber() { return HType(kHeapNumber); } 310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType String() { return HType(kString); } 311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Boolean() { return HType(kBoolean); } 312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType NonPrimitive() { return HType(kNonPrimitive); } 313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSArray() { return HType(kJSArray); } 314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType JSObject() { return HType(kJSObject); } 315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType Uninitialized() { return HType(kUninitialized); } 316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Return the weakest (least precise) common type. 318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType Combine(HType other) { 319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HType(static_cast<Type>(type_ & other.type_)); 320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool Equals(const HType& other) { 323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == other.type_; 324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSubtypeOf(const HType& other) { 327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Combine(other).Equals(other); 328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTagged() { 331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTagged) == kTagged); 333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedPrimitive() { 336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedPrimitive) == kTaggedPrimitive); 338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsTaggedNumber() { 341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kTaggedNumber) == kTaggedNumber); 343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsSmi() { 346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kSmi) == kSmi); 348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsHeapNumber() { 351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kHeapNumber) == kHeapNumber); 353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsString() { 356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kString) == kString); 358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsBoolean() { 361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kBoolean) == kBoolean); 363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsNonPrimitive() { 366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kNonPrimitive) == kNonPrimitive); 368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSArray() { 371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSArray) == kJSArray); 373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsJSObject() { 376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(type_ != kUninitialized); 377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ((type_ & kJSObject) == kJSObject); 378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsUninitialized() { 381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_ == kUninitialized; 382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HType TypeFromValue(Handle<Object> value); 385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* ToString(); 387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* ToShortString(); 388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Type { 391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTagged = 0x1, // 0000 0000 0000 0001 392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedPrimitive = 0x5, // 0000 0000 0000 0101 393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTaggedNumber = 0xd, // 0000 0000 0000 1101 394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kSmi = 0x1d, // 0000 0000 0001 1101 395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kHeapNumber = 0x2d, // 0000 0000 0010 1101 396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kString = 0x45, // 0000 0000 0100 0101 397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBoolean = 0x85, // 0000 0000 1000 0101 398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kNonPrimitive = 0x101, // 0000 0001 0000 0001 399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kJSObject = 0x301, // 0000 0011 0000 0001 400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kJSArray = 0x701, // 0000 0111 1000 0001 401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUninitialized = 0x1fff // 0001 1111 1111 1111 402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4048b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch // Make sure type fits in int16. 4058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch STATIC_ASSERT(kUninitialized < (1 << (2 * kBitsPerByte))); 4068b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HType(Type t) : type_(t) { } 408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch int16_t type_; 410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 413257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject { 414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 415257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode(HValue* value, int index, HUseListNode* tail) 416257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : tail_(tail), value_(value), index_(index) { 417257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 418257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 419257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail() const { return tail_; } 420257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() const { return value_; } 421257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() const { return index_; } 422257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 423257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_tail(HUseListNode* list) { tail_ = list; } 424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG 426257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Zap() { 427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch tail_ = reinterpret_cast<HUseListNode*>(1); 428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_ = NULL; 429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch index_ = -1; 430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 432257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 433257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 434257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail_; 435257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 439257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 440257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted. 441257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them. 442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseIterator BASE_EMBEDDED { 443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Done() { return current_ == NULL; } 445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Advance(); 446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { 448257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 449257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return value_; 450257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 452257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() { 453257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(!Done()); 454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return index_; 455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HUseIterator(HUseListNode* head); 459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 460257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* current_; 461257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* next_; 462257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 463257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class HValue; 466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 467257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue: public ZoneObject { 470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoNumber = -1; 472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // There must be one corresponding kDepends flag for every kChanges flag and 474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // the order of the kChanges flags must be exactly the same as of the kDepends 475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // flags. 476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Flag { 477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare global value numbering flags. 478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch #define DECLARE_DO(type) kChanges##type, kDependsOn##type, 479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GVN_FLAG_LIST(DECLARE_DO) 480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch #undef DECLARE_DO 481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kFlexibleRepresentation, 482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUseGVN, 483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanOverflow, 484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBailoutOnMinusZero, 485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanBeDivByZero, 4867d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch kDeoptimizeOnUndefined, 487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kIsArguments, 488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTruncatingToInt32, 489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kLastFlag = kTruncatingToInt32 490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STATIC_ASSERT(kLastFlag < kBitsPerInt); 493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kChangesToDependsFlagsLeftShift = 1; 495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int ChangesFlagsMask() { 497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int result = 0; 498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Create changes mask. 499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DECLARE_DO(type) result |= (1 << kChanges##type); 500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch GVN_FLAG_LIST(DECLARE_DO) 501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_DO 502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return result; 503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int DependsFlagsMask() { 506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return ConvertChangesToDependsFlags(ChangesFlagsMask()); 507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static int ConvertChangesToDependsFlags(int flags) { 510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return flags << kChangesToDependsFlagsLeftShift; 511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HValue* cast(HValue* value) { return value; } 514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Opcode { 516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare a unique enum value for each hydrogen instruction. 517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_OPCODE(type) k##type, 518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) 519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kPhi 520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_OPCODE 521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const = 0; 523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare a non-virtual predicates for each concrete HInstruction or HValue. 525257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Is##type() const { return opcode() == k##type; } 527257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 528257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 529257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool IsPhi() const { return opcode() == kPhi; } 530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 531257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare virtual predicates for abstract HInstruction or HValue 532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool Is##type() const { return false; } 534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE) 535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue() : block_(NULL), 538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch id_(kNoNumber), 539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_(HType::Tagged()), 540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch use_list_(NULL), 541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch range_(NULL), 542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch flags_(0) {} 543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HValue() {} 544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block() const { return block_; } 546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetBlock(HBasicBlock* block); 547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id() const { return id_; } 549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_id(int id) { id_ = id; } 550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseIterator uses() const { return HUseIterator(use_list_); } 552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return false; } 554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation() const { return representation_; } 555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ChangeRepresentation(Representation r) { 556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation was already set and is allowed to be changed. 557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!r.IsNone()); 558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(CheckFlag(kFlexibleRepresentation)); 559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RepresentationChanged(r); 560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 562257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void AssumeRepresentation(Representation r); 563257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 564257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { return true; } 565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type() const { return type_; } 567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_type(HType type) { 568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(HasNoUses()); 569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch type_ = type; 570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // An operation needs to override this function iff: 573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 1) it can produce an int32 output. 574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // 2) the true value of its output can potentially be minus zero. 575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The implementation must set a flag so that it bails out in the case where 576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it would otherwise output what should be a minus zero as an int32 zero. 577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the operation also exists in a form that takes int32 and outputs int32 578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then the operation should return its input value so that we can propagate 579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // back. There are two operations that need to propagate back to more than 580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // one input. They are phi and binary add. They always return NULL and 581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // expect the caller to take care of things. 582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited) { 583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch visited->Add(id()); 584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return NULL; 585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDefinedAfter(HBasicBlock* other) const; 588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Operands. 590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() = 0; 591e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) = 0; 592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetOperandAt(int index, HValue* value); 593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 594257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void DeleteAndReplaceWith(HValue* other); 595257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void ReplaceAllUsesWith(HValue* other); 596257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasNoUses() const { return use_list_ == NULL; } 597257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasMultipleUses() const { 598257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return use_list_ != NULL && use_list_->tail() != NULL; 599257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int UseCount() const; 601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ClearOperands(); 602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags() const { return flags_; } 6041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetFlag(Flag f) { flags_ |= (1 << f); } 6051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearFlag(Flag f) { flags_ &= ~(1 << f); } 6061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; } 6071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetAllSideEffects() { flags_ |= AllSideEffects(); } 6091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearAllSideEffects() { flags_ &= ~AllSideEffects(); } 6101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool HasSideEffects() const { return (flags_ & AllSideEffects()) != 0; } 611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range() const { return range_; } 613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasRange() const { return range_ != NULL; } 614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNewRange(Range* r); 615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RemoveLastAddedRange(); 616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ComputeInitialRange(); 617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation helpers. 619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const = 0; 620e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 621e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // This gives the instruction an opportunity to replace itself with an 626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction that does the same in some better way. To replace an 627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction with a new one, first add the new instruction to the graph, 628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then return it. Return NULL to have the instruction deleted. 629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { return this; } 630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(HValue* other); 632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode(); 633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Printing support. 635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream) = 0; 636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void PrintNameTo(StringStream* stream); 637257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintTypeTo(StringStream* stream); 638257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintRangeTo(StringStream* stream); 639257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintChangesTo(StringStream* stream); 640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 641257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const char* Mnemonic() const; 642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Updated the inferred type of this instruction and returns true if 644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it has changed. 645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool UpdateInferredType(); 646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 647e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 6501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() = 0; 651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 6541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // This function must be overridden for instructions with flag kUseGVN, to 6551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // compare the non-Operand parts of the instruction. 656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 6571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 6581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return false; 6591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { } 661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() = 0; 663e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) = 0; 664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void clear_block() { 665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(block_ != NULL); 666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block_ = NULL; 667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_representation(Representation r) { 670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Representation is set-once. 671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(representation_.IsNone() && !r.IsNone()); 672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 6761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // A flag mask to mark an instruction as having arbitrary side effects. 6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block static int AllSideEffects() { 6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return ChangesFlagsMask() & ~(1 << kChangesOsrEntries); 6791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 6801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Remove the matching use from the use list if present. Returns the 682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // removed list node or NULL. 683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* RemoveUse(HValue* value, int index); 684257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterUse(int index, HValue* new_value); 686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block_; 688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The id of this instruction in the hydrogen graph, assigned when first 690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // added to the graph. Reflects creation order. 691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id_; 692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation_; 694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type_; 695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* use_list_; 696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range_; 697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags_; 698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DISALLOW_COPY_AND_ASSIGN(HValue); 700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction: public HValue { 704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next() const { return next_; } 706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous() const { return previous_; } 707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 708e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 709e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream) { } 710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsLinked() const { return block() != NULL; } 712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void Unlink(); 713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertBefore(HInstruction* next); 714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InsertAfter(HInstruction* previous); 715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position() const { return position_; } 717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool has_position() const { return position_ != RelocInfo::kNoPosition; } 718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_position(int position) { position_ = position; } 719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 7231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 726b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // Returns whether this is some kind of deoptimizing check 727b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch // instruction. 728b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return false; } 729b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 730e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return false; } 731e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(Instruction) 733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction() 736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : next_(NULL), 737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch previous_(NULL), 738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch position_(RelocInfo::kNoPosition) { 739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnOsrEntries); 740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() { Unlink(); } 743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitializeAsFirst(HBasicBlock* block) { 746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!IsLinked()); 747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetBlock(block); 748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 750257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void PrintMnemonicTo(StringStream* stream); 751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* next_; 753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HInstruction* previous_; 754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int position_; 755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch friend class HBasicBlock; 757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HControlInstruction: public HInstruction { 761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HControlInstruction(HBasicBlock* first, HBasicBlock* second) 7631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : first_successor_(first), second_successor_(second) { 7641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 7651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* FirstSuccessor() const { return first_successor_; } 7671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* SecondSuccessor() const { return second_successor_; } 7681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 771257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 7721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 7741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* first_successor_; 7751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* second_successor_; 776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 779e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int NumElements> 780e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOperandContainer { 781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HOperandContainer() : elems_() { } 783e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 784e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int length() { return NumElements; } 785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue*& operator[](int i) { 786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch ASSERT(i < length()); 787e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return elems_[i]; 788e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* elems_[NumElements]; 792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<> 796e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOperandContainer<0> { 797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 798e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int length() { return 0; } 799e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue*& operator[](int i) { 800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UNREACHABLE(); 801e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch static HValue* t = 0; 802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return t; 803e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 804e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 805e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 806e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 807e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int V> 808e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HTemplateInstruction : public HInstruction { 809e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int OperandCount() { return V; } 811e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HOperandContainer<V> inputs_; 818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 819e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate<int V> 822e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HTemplateControlInstruction : public HControlInstruction { 823e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HTemplateControlInstruction<V>(HBasicBlock* first, HBasicBlock* second) 825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HControlInstruction(first, second) { } 826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch int OperandCount() { return V; } 827e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* OperandAt(int i) { return inputs_[i]; } 828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 829e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 830e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void InternalSetOperandAt(int i, HValue* value) { inputs_[i] = value; } 831e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 833e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HOperandContainer<V> inputs_; 834e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 835e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 836e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBlockEntry: public HTemplateInstruction<0> { 838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 840e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 841e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 843257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 845e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 846e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 84744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HDeoptimize: public HControlInstruction { 848e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 84944f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HDeoptimize(int environment_length) 85044f0eee88ff00398ff7f715fab053374d808c90dSteve Block : HControlInstruction(NULL, NULL), 85144f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_(environment_length) { } 852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 854e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 855e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 8561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 85744f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual int OperandCount() { return values_.length(); } 85844f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual HValue* OperandAt(int index) { return values_[index]; } 85944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 86044f0eee88ff00398ff7f715fab053374d808c90dSteve Block void AddEnvironmentValue(HValue* value) { 86144f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_.Add(NULL); 86244f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetOperandAt(values_.length() - 1, value); 86344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 86444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 866257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum UseEnvironment { 868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kNoUses, 869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kUseAll 870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 87144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87244f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 87344f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual void InternalSetOperandAt(int index, HValue* value) { 87444f0eee88ff00398ff7f715fab053374d808c90dSteve Block values_[index] = value; 87544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 87644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 87744f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 87844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneList<HValue*> values_; 879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HGoto: public HTemplateControlInstruction<0> { 883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 8841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGoto(HBasicBlock* target) 885e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HTemplateControlInstruction<0>(target, NULL), 886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch include_stack_check_(false) { } 887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_include_stack_check(bool include_stack_check) { 889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch include_stack_check_ = include_stack_check; 890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool include_stack_check() const { return include_stack_check_; } 892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 893e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 894e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 895e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Goto) 898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool include_stack_check_; 901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryControlInstruction: public HTemplateControlInstruction<1> { 905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HUnaryControlInstruction(HValue* value, 9071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* true_target, 9081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* false_target) 909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HTemplateControlInstruction<1>(true_target, false_target) { 910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 915e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HTest: public HUnaryControlInstruction { 920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HTest(HValue* value, HBasicBlock* true_target, HBasicBlock* false_target) 9221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryControlInstruction(value, true_target, false_target) { 9231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL && false_target != NULL); 924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Test) 931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCompareMap: public HUnaryControlInstruction { 935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCompareMap(HValue* value, 9371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<Map> map, 9381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* true_target, 9391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBasicBlock* false_target) 9401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryControlInstruction(value, true_target, false_target), 9411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block map_(map) { 9421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(true_target != NULL); 9431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(false_target != NULL); 944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!map.is_null()); 945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 947e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 951e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 952e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 953e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareMap) 956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HReturn: public HUnaryControlInstruction { 963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 9641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HReturn(HValue* value) 9651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryControlInstruction(value, NULL, NULL) { 9661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 972257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Return) 973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAbnormalExit: public HTemplateControlInstruction<0> { 977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HAbnormalExit() : HTemplateControlInstruction<0>(NULL, NULL) { } 979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 980e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 982e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 984257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 988e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryOperation: public HTemplateInstruction<1> { 989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HUnaryOperation(HValue* value) { 991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 994e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HThrow: public HUnaryOperation { 10001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 10011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HThrow(HValue* value) : HUnaryOperation(value) { 10021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 10031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 10041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 10051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 10061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 10081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Throw) 1010257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1012257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1013257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HForceRepresentation: public HTemplateInstruction<1> { 1014257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1015257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HForceRepresentation(HValue* value, Representation required_representation) { 1016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(0, value); 1017257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(required_representation); 1018257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1019257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1020257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { return OperandAt(0); } 1021257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1022257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1023257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1024257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1025257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return representation(); // Same as the output representation. 1026257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1027257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1028257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 10291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 10301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 10311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HChange: public HUnaryOperation { 1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HChange(HValue* value, 1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation from, 1036e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation to, 10377d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool is_truncating, 10387d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool deoptimize_on_undefined) 10397d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch : HUnaryOperation(value), 10407d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch from_(from), 10417d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch deoptimize_on_undefined_(deoptimize_on_undefined) { 1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!from.IsNone() && !to.IsNone()); 1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!from.Equals(to)); 1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(to); 1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (is_truncating) SetFlag(kTruncatingToInt32); 1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (from.IsInteger32() && to.IsTagged() && value->range() != NULL && 1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch value->range()->IsInSmiRange()) { 1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_type(HType::Smi()); 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation from() const { return from_; } 10568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Representation to() const { return representation(); } 10577d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool deoptimize_on_undefined() const { return deoptimize_on_undefined_; } 1058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return from_; 1060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1062e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } 1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1064e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1066257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Change) 1067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1069e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!other->IsChange()) return false; 1071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HChange* change = HChange::cast(other); 1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return value() == change->value() 10737d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch && to().Equals(change->to()) 10747d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch && deoptimize_on_undefined() == change->deoptimize_on_undefined(); 1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation from_; 10797d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch bool deoptimize_on_undefined_; 1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HClampToUint8: public HUnaryOperation { 1084257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1085257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HClampToUint8(HValue* value) 1086257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HUnaryOperation(value), 1087257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch input_rep_(Representation::None()) { 1088257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kFlexibleRepresentation); 1089257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 1090257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 1091257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1092257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1093257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1094257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return input_rep_; 1095257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation InferredRepresentation() { 1098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // TODO(danno): Inference on input types should happen separately from 1099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // return representation. 1100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation new_rep = value()->representation(); 1101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (input_rep_.IsNone()) { 1102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!new_rep.IsNone()) { 1103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch input_rep_ = new_rep; 1104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Integer32(); 1105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::None(); 1107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } else { 1109257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Integer32(); 1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1111257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 1114257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1115257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 1116257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 1117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 1119257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Representation input_rep_; 1120257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1121257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1122257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSimulate: public HInstruction { 1124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 11258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HSimulate(int ast_id, int pop_count) 1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : ast_id_(ast_id), 1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pop_count_(pop_count), 1128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_(2), 1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_(2) {} 1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HSimulate() {} 1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1132e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAstId() const { return ast_id_ != AstNode::kNoNumber; } 1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 1136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_ast_id(int id) { 1137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(!HasAstId()); 1138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ast_id_ = id; 1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count() const { return pop_count_; } 1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const ZoneList<HValue*>* values() const { return &values_; } 1143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int GetAssignedIndexAt(int index) const { 1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasAssignedIndexAt(index)); 1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index]; 1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAssignedIndexAt(int index) const { 1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index] != kNoIndex; 1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddAssignedValue(int index, HValue* value) { 1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(index, value); 1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddPushedValue(HValue* value) { 1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(kNoIndex, value); 1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return values_.length(); } 1157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return values_[index]; } 1158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1163257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Simulate) 1164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 11661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 1171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[index] = value; 1172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoIndex = -1; 1176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddValue(int index, HValue* value) { 1177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch assigned_indexes_.Add(index); 1178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Resize the list of pushed values. 1179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_.Add(NULL); 1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Set the operand through the base method in HValue to make sure that the 1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // use lists are correctly updated. 1182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(values_.length() - 1, value); 1183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count_; 1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> values_; 1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int> assigned_indexes_; 1188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1191e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStackCheck: public HTemplateInstruction<0> { 1192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HStackCheck() { } 1194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1197e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1198e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1199257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StackCheck) 1200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1203e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HEnterInlined: public HTemplateInstruction<0> { 1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1205257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HEnterInlined(Handle<JSFunction> closure, 1206257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch FunctionLiteral* function, 1207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind) 1208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : closure_(closure), 1209257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch function_(function), 1210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch call_kind_(call_kind) { 1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1213e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure() const { return closure_; } 1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function() const { return function_; } 1217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind() const { return call_kind_; } 1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1221e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1223257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(EnterInlined) 1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure_; 1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function_; 1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch CallKind call_kind_; 1229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1232e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLeaveInlined: public HTemplateInstruction<0> { 1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLeaveInlined() {} 1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1236e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1237e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1239e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1240257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPushArgument: public HUnaryOperation { 1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HPushArgument(HValue* value) : HUnaryOperation(value) { 1247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 1248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1254e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* argument() { return OperandAt(0); } 1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(PushArgument) 12571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 1258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1260e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HContext: public HTemplateInstruction<0> { 12611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 12621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HContext() { 12631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 12641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 12651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 12661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1268e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1269e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1270e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1271257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Context); 12721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 12731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1274e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 12781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HOuterContext: public HUnaryOperation { 1279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 12801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HOuterContext(HValue* inner) : HUnaryOperation(inner) { 12811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 12821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 12831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 12841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1285257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OuterContext); 12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1290e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 12911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 12931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 12941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 12951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 12961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalObject: public HUnaryOperation { 12971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 12981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalObject(HValue* context) : HUnaryOperation(context) { 1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalObject) 13041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1305e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1308e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HGlobalReceiver: public HUnaryOperation { 1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 13161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HGlobalReceiver(HValue* global_object) 13171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(global_object) { 1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GlobalReceiver) 13231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 1334e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCall: public HTemplateInstruction<V> { 1335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 13361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The argument count includes the receiver. 1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 1338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 1339e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->SetAllSideEffects(); 13401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { return HType::Tagged(); } 1343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 13441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual int argument_count() const { return argument_count_; } 13451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1346e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool IsCall() { return true; } 13471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 13481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 13491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int argument_count_; 13501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 13511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 13521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1353e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnaryCall: public HCall<1> { 13541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 13551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall(HValue* value, int argument_count) 1356e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<1>(argument_count) { 13571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, value); 13581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 13591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 13631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1366e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(0); } 13671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 13681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 13691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryCall: public HCall<2> { 13711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 13721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBinaryCall(HValue* first, HValue* second, int argument_count) 1373e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<2>(argument_count) { 13741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, first); 13751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(1, second); 1376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1381e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1382e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 13831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1384e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* first() { return OperandAt(0); } 1385e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* second() { return OperandAt(1); } 1386257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1387257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 13881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1389257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HInvokeFunction: public HBinaryCall { 1390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HInvokeFunction(HValue* context, HValue* function, int argument_count) 1392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HBinaryCall(context, function, argument_count) { 1393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1394257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1396257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 1397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* context() { return first(); } 1400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* function() { return second(); } 1401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1406e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallConstantFunction: public HCall<0> { 1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCallConstantFunction(Handle<JSFunction> function, int argument_count) 1409e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), function_(function) { } 1410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function() const { return function_; } 14121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsApplyFunction() const { 141444f0eee88ff00398ff7f715fab053374d808c90dSteve Block return function_->code() == 141544f0eee88ff00398ff7f715fab053374d808c90dSteve Block Isolate::Current()->builtins()->builtin(Builtins::kFunctionApply); 1416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1419e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1421e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1424257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallConstantFunction) 1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> function_; 1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallKeyed: public HBinaryCall { 1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKeyed(HValue* context, HValue* key, int argument_count) 14341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, key, argument_count) { 1435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return second(); } 1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKeyed) 1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNamed: public HUnaryCall { 1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNamed(HValue* context, Handle<String> name, int argument_count) 14511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 14521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1454e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1459257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNamed) 1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1462e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallFunction: public HUnaryCall { 1471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallFunction(HValue* context, int argument_count) 14731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count) { 14741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 14751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1482257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallFunction) 1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 14861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallGlobal: public HUnaryCall { 1487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallGlobal(HValue* context, Handle<String> name, int argument_count) 14891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), name_(name) { 14901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1492e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1494e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1497e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1498e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1499e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallGlobal) 1502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1508e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallKnownGlobal: public HCall<0> { 1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallKnownGlobal(Handle<JSFunction> target, int argument_count) 1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), target_(target) { } 1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1513e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 15141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1517e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1518e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1520e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallKnownGlobal) 1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallNew: public HBinaryCall { 1529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNew(HValue* context, HValue* constructor, int argument_count) 15311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryCall(context, constructor, argument_count) { 15321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 1539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* constructor() { return second(); } 1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNew) 1542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1545e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCallRuntime: public HCall<0> { 1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCallRuntime(Handle<String> name, 154844f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function, 1549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int argument_count) 1550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<0>(argument_count), c_function_(c_function), name_(name) { } 1551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 155344f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function() const { return c_function_; } 1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1556e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1557e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1559e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1560257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 156344f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function_; 1564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 15689fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HJSArrayLength: public HUnaryOperation { 1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 15709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block explicit HJSArrayLength(HValue* value) : HUnaryOperation(value) { 1571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length of an array is stored as a tagged value in the array 1572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // object. It is guaranteed to be 32 bit integer, but it can be 1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // represented as either a smi or heap number. 1574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnArrayLengths); 157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 1578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(JSArrayLength) 15851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 15861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1587e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 15889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 15899fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 15909fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 15919fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HFixedArrayLength: public HUnaryOperation { 15929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 15939fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block explicit HFixedArrayLength(HValue* value) : HUnaryOperation(value) { 15949fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 15959fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block SetFlag(kUseGVN); 159644f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnArrayLengths); 15979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 15989fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 15999fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block virtual Representation RequiredInputRepresentation(int index) const { 16009fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 16019fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 16029fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 1603257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FixedArrayLength) 16041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 16071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 16081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 161044f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HExternalArrayLength: public HUnaryOperation { 16111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 161244f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HExternalArrayLength(HValue* value) : HUnaryOperation(value) { 16131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Integer32()); 16141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The result of this instruction is idempotent as long as its inputs don't 16151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // change. The length of a pixel array cannot change once set, so it's not 16161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // necessary to introduce a kDependsOnArrayLengths or any other dependency. 16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 16181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 16221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ExternalArrayLength) 16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitNot: public HUnaryOperation { 1632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HBitNot(HValue* value) : HUnaryOperation(value) { 1634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kTruncatingToInt32); 1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1644257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitNot) 16451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1647e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HUnaryMathOperation: public HUnaryOperation { 1652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryMathOperation(HValue* value, BuiltinFunctionId op) 1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(value), op_(op) { 1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: 1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: 1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: 1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 1660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: 1662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 1664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: 1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathPowHalf: 1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: 1668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: 1669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: 1670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 1671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 1672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 1673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 1674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1678e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1680e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 1683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op_) { 1686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: 1687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: 1688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCeil: 1689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: 1690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathPowHalf: 1691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathLog: 1692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSin: 1693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathCos: 1694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Double(); 1695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: 1696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 1698e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch UNREACHABLE(); 1699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 1700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { 1704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // If the input is integer32 then we replace the floor instruction 1705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with its inputs. This happens before the representation changes are 1706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // introduced. 1707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (op() == kMathFloor) { 1708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value()->representation().IsInteger32()) return value(); 1709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return this; 1711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op() const { return op_; } 1714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const char* OpName() const; 1715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1716257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 1717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1719e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 1721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return op_ == b->op(); 1722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch BuiltinFunctionId op_; 1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadElements: public HUnaryOperation { 1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HLoadElements(HValue* value) : HUnaryOperation(value) { 1732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 1735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1741257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadElements) 17421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1744e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 17451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 17461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 174844f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadExternalArrayPointer: public HUnaryOperation { 17491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 175044f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HLoadExternalArrayPointer(HValue* value) 17511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value) { 17521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::External()); 17531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The result of this instruction is idempotent as long as its inputs don't 175444f0eee88ff00398ff7f715fab053374d808c90dSteve Block // change. The external array of a specialized array elements object cannot 17551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // change once set, so it's no necessary to introduce any additional 17561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // dependencies on top of the inputs. 17571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 17581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 17591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 17611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 17621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 17631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1764257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadExternalArrayPointer) 17651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 17661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckMap: public HUnaryOperation { 1772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckMap(HValue* value, Handle<Map> map) 1774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(value), map_(map) { 1775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 1778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1780b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1781b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1785e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1786e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 17891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map() const { return map_; } 1793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMap) 1795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1797e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckMap* b = HCheckMap::cast(other); 1799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return map_.is_identical_to(b->map()); 1800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> map_; 1804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckFunction: public HUnaryOperation { 1808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction(HValue* value, Handle<JSFunction> function) 1810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(value), target_(function) { 1811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1815b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1816b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1820e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 1821e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 18241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target() const { return target_; } 1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1829257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckFunction) 1830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1832e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckFunction* b = HCheckFunction::cast(other); 1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return target_.is_identical_to(b->target()); 1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> target_; 1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckInstanceType: public HUnaryOperation { 1843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1844257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsJSObjectOrJSFunction(HValue* value) { 1845257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_JS_OBJECT_OR_JS_FUNCTION); 1846257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1847257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsJSArray(HValue* value) { 1848257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_JS_ARRAY); 1849257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1850257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsString(HValue* value) { 1851257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_STRING); 1852257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HCheckInstanceType* NewIsSymbol(HValue* value) { 1854257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return new HCheckInstanceType(value, IS_SYMBOL); 1855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1857b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1858b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 18641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1867257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* Canonicalize() { 1868257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!value()->type().IsUninitialized() && 1869257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value()->type().IsString() && 1870257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch check_ == IS_STRING) { 1871257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 1872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1873257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 1874257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1876257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } 1877257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckInterval(InstanceType* first, InstanceType* last); 1878257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); 1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1880257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) 1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(ager): It could be nice to allow the ommision of instance 1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // type checks if we have already performed an instance type check 1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with a larger range. 1886e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckInstanceType* b = HCheckInstanceType::cast(other); 1888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return check_ == b->check_; 1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1892257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch enum Check { 1893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_JS_OBJECT_OR_JS_FUNCTION, 1894257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_JS_ARRAY, 1895257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_STRING, 1896257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch IS_SYMBOL, 1897257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch LAST_INTERVAL_CHECK = IS_JS_ARRAY 1898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch }; 1899257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1900257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HCheckInstanceType(HValue* value, Check check) 1901257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HUnaryOperation(value), check_(check) { 1902257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 1903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 1904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const Check check_; 1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckNonSmi: public HUnaryOperation { 1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckNonSmi(HValue* value) : HUnaryOperation(value) { 1913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1917b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1918b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 1921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 19261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1929257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HValue* Canonicalize() { 1930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HType value_type = value()->type(); 1931257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (!value_type.IsUninitialized() && 1932257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (value_type.IsHeapNumber() || 1933257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsString() || 1934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsBoolean() || 1935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_type.IsNonPrimitive())) { 1936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 1937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 1939257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1940257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi) 19421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 19431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 1944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 1945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1948e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HCheckPrototypeMaps: public HTemplateInstruction<0> { 1949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1950b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HCheckPrototypeMaps(Handle<JSObject> prototype, Handle<JSObject> holder) 1951b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch : prototype_(prototype), holder_(holder) { 1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnMaps); 1954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1956b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 19591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1962b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype() const { return prototype_; } 1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder() const { return holder_; } 1964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckPrototypeMaps) 1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1967e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 1968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1969e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1970e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1971e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 197244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->IsAllocationAllowed()); 1973b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch intptr_t hash = reinterpret_cast<intptr_t>(*prototype()); 1974b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch hash = 17 * hash + reinterpret_cast<intptr_t>(*holder()); 1975b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return hash; 1976b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 1977b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 1980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckPrototypeMaps* b = HCheckPrototypeMaps::cast(other); 1981b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch return prototype_.is_identical_to(b->prototype()) && 1982b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch holder_.is_identical_to(b->holder()); 1983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1986b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch Handle<JSObject> prototype_; 1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSObject> holder_; 1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCheckSmi: public HUnaryOperation { 1992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HCheckSmi(HValue* value) : HUnaryOperation(value) { 1994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 1995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1998b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 1999b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2003e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 20061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2009257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 20101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 20111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPhi: public HValue { 2017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HPhi(int merged_index) 2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : inputs_(2), 2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch merged_index_(merged_index), 202144f0eee88ff00398ff7f715fab053374d808c90dSteve Block phi_id_(-1), 2022257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_live_(false), 2023257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_(true) { 2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch non_phi_uses_[i] = 0; 2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] = 0; 2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(merged_index >= 0); 2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2033e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool double_occurred = false; 2035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool int32_occurred = false; 2036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < OperandCount(); ++i) { 2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* value = OperandAt(i); 2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsDouble()) double_occurred = true; 2039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsInteger32()) int32_occurred = true; 2040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (value->representation().IsTagged()) return Representation::Tagged(); 2041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (double_occurred) return Representation::Double(); 2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (int32_occurred) return Representation::Integer32(); 2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2052e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2053e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual int OperandCount() { return inputs_.length(); } 2054e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HValue* OperandAt(int index) { return inputs_[index]; } 2055e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* GetRedundantReplacement(); 2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddInput(HValue* value); 205744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasRealUses(); 2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 20591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool IsReceiver() { return merged_index_ == 0; } 2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index() const { return merged_index_; } 2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2063e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintTo(StringStream* stream); 2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 20661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitRealUses(int id); 2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNonPhiUsesFrom(HPhi* other); 2071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddIndirectUsesTo(int* use_count); 2072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_non_phi_uses() const { 2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kTagged]; 2075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_non_phi_uses() const { 2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kInteger32]; 2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_non_phi_uses() const { 2080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kDouble]; 2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_indirect_uses() const { 2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kTagged]; 2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_indirect_uses() const { 2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kInteger32]; 2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_indirect_uses() const { 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kDouble]; 2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id() { return phi_id_; } 209244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live() { return is_live_; } 209344f0eee88ff00398ff7f715fab053374d808c90dSteve Block void set_is_live(bool b) { is_live_ = b; } 2094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2095257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HPhi* cast(HValue* value) { 2096257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(value->IsPhi()); 2097257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<HPhi*>(value); 2098257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2099257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const { return HValue::kPhi; } 2100257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2101257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2102257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return is_convertible_to_integer_; 2103257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2104257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2105257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_is_convertible_to_integer(bool b) { 2106257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch is_convertible_to_integer_ = b; 2107257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2108257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph(); 2111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void InternalSetOperandAt(int index, HValue* value) { 2112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_[index] = value; 2113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> inputs_; 2117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index_; 2118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int non_phi_uses_[Representation::kNumRepresentations]; 2120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int indirect_uses_[Representation::kNumRepresentations]; 2121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id_; 212244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool is_live_; 2123257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_convertible_to_integer_; 2124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2127e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsObject: public HTemplateInstruction<0> { 2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsObject() { 2130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kIsArguments); 2132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2135e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2138257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 2139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HConstant: public HTemplateInstruction<0> { 2143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant(Handle<Object> handle, Representation r); 2145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle() const { return handle_; } 2147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 214844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool InOldSpace() const { return !HEAP->InNewSpace(*handle_); } 21499fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 2150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2154257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool IsConvertibleToInteger() const { 2155257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsSmi()) return true; 2156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (handle_->IsHeapNumber() && 2157257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch (HeapNumber::cast(*handle_)->value() == 2158257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static_cast<double>(NumberToInt32(*handle_)))) return true; 2159257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return false; 2160257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2161257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 216244f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return !representation().IsDouble(); } 2163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsInteger() const { return handle_->IsSmi(); } 2166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToRepresentation(Representation r) const; 2167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* CopyToTruncatedInt32() const; 2168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasInteger32Value() const { return has_int32_value_; } 2169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Integer32Value() const { 2170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasInteger32Value()); 2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return int32_value_; 2172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasDoubleValue() const { return has_double_value_; } 2174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double DoubleValue() const { 2175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(HasDoubleValue()); 2176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return double_value_; 2177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasStringValue() const { return handle_->IsString(); } 2179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 21808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool ToBoolean() const; 21818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 2182e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 218344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 2184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<intptr_t>(*handle()); 2185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 21881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() { } 2189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2191257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Constant) 2192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HConstant* other_constant = HConstant::cast(other); 2198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return handle().is_identical_to(other_constant->handle()); 2199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> handle_; 2203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The following two values represent the int32 and the double value of the 2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // given constant if there is a lossless conversion between the constant 2206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // and the specific representation. 2207257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_int32_value_ : 1; 2208257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_double_value_ : 1; 2209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t int32_value_; 2210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double double_value_; 2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HBinaryOperation: public HTemplateInstruction<2> { 2215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBinaryOperation(HValue* left, HValue* right) { 2217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(left != NULL && right != NULL); 2218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, left); 2219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, right); 2220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* left() { return OperandAt(0); } 2223e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* right() { return OperandAt(1); } 2224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(kasperl): Move these helpers to the IA-32 Lithium 2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction sequence builder. 2227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* LeastConstantOperand() { 2228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return right(); 2229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left(); 2230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2231e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* MostConstantOperand() { 2232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (IsCommutative() && left()->IsConstant()) return left(); 2233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return right(); 2234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return false; } 2237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2238e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2242e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HApplyArguments: public HTemplateInstruction<4> { 2243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HApplyArguments(HValue* function, 2245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* receiver, 2246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* length, 2247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* elements) { 2248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, function); 2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, receiver); 2251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, length); 2252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(3, elements); 22531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length is untagged, all other inputs are tagged. 2258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 2) 2259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Integer32() 2260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Tagged(); 2261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 2264e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* receiver() { return OperandAt(1); } 2265e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(2); } 2266e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* elements() { return OperandAt(3); } 2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2268257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 2269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2272e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArgumentsElements: public HTemplateInstruction<0> { 2273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArgumentsElements() { 2275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The value produced by this instruction is a pointer into the stack 2276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // that looks as if it was a smi because of alignment. 2277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2281257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 22821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2284e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 22871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArgumentsLength: public HUnaryOperation { 2293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 2296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 23041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 23051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2306e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HAccessArgumentsAt: public HTemplateInstruction<3> { 2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, arguments); 2316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, length); 2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, index); 2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2320e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The arguments elements is considered tagged. 2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return index == 0 2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Tagged() 2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Integer32(); 2327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* arguments() { return OperandAt(0); } 2330e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(1); } 2331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* index() { return OperandAt(2); } 2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) 2334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBoundsCheck: public HBinaryOperation { 2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBoundsCheck(HValue* index, HValue* length) 2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(index, length) { 23437d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch set_representation(Representation::Integer32()); 2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2347b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch virtual bool IsCheckInstruction() const { return true; } 2348b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 2349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Integer32(); 2351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 23541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify(); 2355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2357e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* index() { return left(); } 2358e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return right(); } 2359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2360257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 23611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 23621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitwiseBinaryOperation: public HBinaryOperation { 2368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBitwiseBinaryOperation(HValue* left, HValue* right) 2370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(left, right) { 23711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 23721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kFlexibleRepresentation); 23731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 23771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return representation(); 2378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void RepresentationChanged(Representation to) { 23811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block if (!to.IsTagged()) { 23821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ASSERT(to.IsInteger32()); 23831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 23841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kTruncatingToInt32); 23851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 23861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 23871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 23881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 23901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 2392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HArithmeticBinaryOperation: public HBinaryOperation { 2396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArithmeticBinaryOperation(HValue* left, HValue* right) 2398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(left, right) { 2399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 24011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { 2405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (!to.IsTagged()) { 24061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 2407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2411e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 2414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation InferredRepresentation() { 2416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (left()->representation().Equals(right()->representation())) { 2417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return left()->representation(); 2418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HValue::InferredRepresentation(); 2420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCompare: public HBinaryOperation { 2425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCompare(HValue* left, HValue* right, Token::Value token) 2427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(left, right), token_(token) { 2428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(Token::IsCompareOp(token)); 2429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 24301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetInputRepresentation(Representation r); 24341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 243544f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { 2436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 24371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 24381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return input_representation_; 2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation GetInputRepresentation() const { 2443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return input_representation_; 2444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token() const { return token_; } 2446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2448e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2450e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return HValue::Hashcode() * 7 + token_; 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Compare) 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCompare* comp = HCompare::cast(other); 2459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return token_ == comp->token(); 2460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation input_representation_; 2464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token_; 2465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HCompareJSObjectEq: public HBinaryOperation { 2469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCompareJSObjectEq(HValue* left, HValue* right) 2471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(left, right) { 2472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 247444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 2475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 247744f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { 2478257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 24791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 24801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2486257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareJSObjectEq) 24871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 24881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2489e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HCompareSymbolEq: public HBinaryOperation { 2494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 2495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HCompareSymbolEq(HValue* left, HValue* right, Token::Value op) 2496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : HBinaryOperation(left, right), op_(op) { 2497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch ASSERT(op == Token::EQ || op == Token::EQ_STRICT); 2498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 2499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 2500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kDependsOnMaps); 2501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2502257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2503257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Token::Value op() const { return op_; } 2504257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2505257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool EmitAtUses() { 2506257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 2507257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2508257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2509257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2510257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 2511257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { return HType::Boolean(); } 2514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2515257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareSymbolEq); 2516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2517257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 2518257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { 2519257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return op_ == HCompareSymbolEq::cast(other)->op_; 2520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2521257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2522257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 2523257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const Token::Value op_; 2524257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2525257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2526257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HUnaryPredicate: public HUnaryOperation { 2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HUnaryPredicate(HValue* value) : HUnaryOperation(value) { 2530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 25331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 253444f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { 2535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 25361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 25371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsNull: public HUnaryPredicate { 2546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HIsNull(HValue* value, bool is_strict) 2548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryPredicate(value), is_strict_(is_strict) { } 2549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_strict() const { return is_strict_; } 2551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsNull) 2553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2555e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HIsNull* b = HIsNull::cast(other); 2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return is_strict_ == b->is_strict(); 2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_strict_; 2562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsObject: public HUnaryPredicate { 2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HIsObject(HValue* value) : HUnaryPredicate(value) { } 2568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2569257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsObject) 25701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2572e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HIsSmi: public HUnaryPredicate { 2577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HIsSmi(HValue* value) : HUnaryPredicate(value) { } 2579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2580257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsSmi) 2581257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2582257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 2583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 2584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2585257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2586257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2587257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HIsUndetectable: public HUnaryPredicate { 2588257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 2589257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HIsUndetectable(HValue* value) : HUnaryPredicate(value) { } 2590257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2591257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsUndetectable) 25921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 25951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 25961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2598e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HIsConstructCall: public HTemplateInstruction<0> { 25991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 26001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HIsConstructCall() { 26011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 26021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 26031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 26041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 260544f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { 2606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 26071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 26081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2609e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2610e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2611e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2613257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsConstructCall) 26141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2616e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HHasInstanceType: public HUnaryPredicate { 2621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HHasInstanceType(HValue* value, InstanceType type) 2623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryPredicate(value), from_(type), to_(type) { } 2624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HHasInstanceType(HValue* value, InstanceType from, InstanceType to) 2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryPredicate(value), from_(from), to_(to) { 2626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ASSERT(to == LAST_TYPE); // Others not implemented yet in backend. 2627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from() { return from_; } 2630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to() { return to_; } 2631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2632e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2634257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasInstanceType) 2635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HHasInstanceType* b = HHasInstanceType::cast(other); 2639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (from_ == b->from()) && (to_ == b->to()); 2640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from_; 2644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to_; // Inclusive range, not all combinations work. 2645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2646b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HHasCachedArrayIndex: public HUnaryPredicate { 2649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HHasCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { } 2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndex) 26531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2656e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 2657e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2658e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HGetCachedArrayIndex: public HUnaryPredicate { 2660e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 2661e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HGetCachedArrayIndex(HValue* value) : HUnaryPredicate(value) { } 2662e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) 2664e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2665e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 2666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HClassOfTest: public HUnaryPredicate { 2671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HClassOfTest(HValue* value, Handle<String> class_name) 2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryPredicate(value), class_name_(class_name) { } 2674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClassOfTest) 2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2677e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name() const { return class_name_; } 2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2682e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HClassOfTest* b = HClassOfTest::cast(other); 2684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return class_name_.is_identical_to(b->class_name_); 2685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name_; 2689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HTypeofIs: public HUnaryPredicate { 2693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HTypeofIs(HValue* value, Handle<String> type_literal) 2695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryPredicate(value), type_literal_(type_literal) { } 2696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal() { return type_literal_; } 2698e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 2699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2700257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(TypeofIs) 2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2703e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 2704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HTypeofIs* b = HTypeofIs::cast(other); 2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return type_literal_.is_identical_to(b->type_literal_); 2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> type_literal_; 2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2713e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HInstanceOf: public HTemplateInstruction<3> { 2714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 27151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HInstanceOf(HValue* context, HValue* left, HValue* right) { 27161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, context); 27171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(1, left); 27181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, right); 2719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 27201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2723e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 2724e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* left() { return OperandAt(1); } 2725e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* right() { return OperandAt(2); } 27261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 272744f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { 2728257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return !HasSideEffects() && !HasMultipleUses(); 27291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 2730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 27361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2737257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 2738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2741086aeeaae12517475c22695a200be45495516549Ben Murdochclass HInstanceOfKnownGlobal: public HUnaryOperation { 2742086aeeaae12517475c22695a200be45495516549Ben Murdoch public: 2743086aeeaae12517475c22695a200be45495516549Ben Murdoch HInstanceOfKnownGlobal(HValue* left, Handle<JSFunction> right) 2744086aeeaae12517475c22695a200be45495516549Ben Murdoch : HUnaryOperation(left), function_(right) { 2745086aeeaae12517475c22695a200be45495516549Ben Murdoch set_representation(Representation::Tagged()); 27461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 2747086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2748086aeeaae12517475c22695a200be45495516549Ben Murdoch 2749086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function() { return function_; } 2750086aeeaae12517475c22695a200be45495516549Ben Murdoch 2751086aeeaae12517475c22695a200be45495516549Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2752086aeeaae12517475c22695a200be45495516549Ben Murdoch return Representation::Tagged(); 2753086aeeaae12517475c22695a200be45495516549Ben Murdoch } 2754086aeeaae12517475c22695a200be45495516549Ben Murdoch 2755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) 2756086aeeaae12517475c22695a200be45495516549Ben Murdoch 2757086aeeaae12517475c22695a200be45495516549Ben Murdoch private: 2758086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function_; 2759086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 2760086aeeaae12517475c22695a200be45495516549Ben Murdoch 2761086aeeaae12517475c22695a200be45495516549Ben Murdoch 2762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HPower: public HBinaryOperation { 2763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HPower(HValue* left, HValue* right) 2765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(left, right) { 2766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 2767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 1) ? Representation::None() : Representation::Double(); 2772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2774257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Power) 27751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2777e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2781b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HAdd: public HArithmeticBinaryOperation { 2782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HAdd(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { 2784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 2785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Add is only commutative if two integer values are added and not if two 2788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // tagged values are added (because it might be a String concatenation). 2789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 2790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 2791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 2794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2795e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2797257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Add) 2798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2800e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 28011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSub: public HArithmeticBinaryOperation { 2807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HSub(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { 2809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 2810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2814257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sub) 2815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 28181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMul: public HArithmeticBinaryOperation { 2824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HMul(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { 2826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 2827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 2830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Only commutative if it is certain that not two objects are multiplicated. 2832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { 2833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 2834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2836257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mul) 2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2839e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 28401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HMod: public HArithmeticBinaryOperation { 2846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HMod(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { 2848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 2849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 285144f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasPowerOf2Divisor() { 285244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (right()->IsConstant() && 285344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HConstant::cast(right())->HasInteger32Value()) { 285444f0eee88ff00398ff7f715fab053374d808c90dSteve Block int32_t value = HConstant::cast(right())->Integer32Value(); 285544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return value != 0 && (IsPowerOf2(value) || IsPowerOf2(-value)); 285644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 285744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 285844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return false; 285944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 286044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 2861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 2862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2863257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mod) 2864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2866e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 28671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDiv: public HArithmeticBinaryOperation { 2873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HDiv(HValue* left, HValue* right) : HArithmeticBinaryOperation(left, right) { 2875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 2876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 2877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited); 2880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2881257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Div) 2882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2884e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 28851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitAnd: public HBitwiseBinaryOperation { 2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBitAnd(HValue* left, HValue* right) 2893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return true; } 2896e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2898257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitAnd) 2899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2901e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 29021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitXor: public HBitwiseBinaryOperation { 2908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBitXor(HValue* left, HValue* right) 2910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return true; } 2913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2915257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitXor) 29161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2918e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBitOr: public HBitwiseBinaryOperation { 2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBitOr(HValue* left, HValue* right) 2925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return true; } 2928e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2930257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BitOr) 2931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2933e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 29341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShl: public HBitwiseBinaryOperation { 2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2941b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HShl(HValue* left, HValue* right) 2942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2945e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shl) 29481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HShr: public HBitwiseBinaryOperation { 2955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HShr(HValue* left, HValue* right) 2957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2959e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shr) 29621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2964e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HSar: public HBitwiseBinaryOperation { 2969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HSar(HValue* left, HValue* right) 2971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBitwiseBinaryOperation(left, right) { } 2972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Range* InferRange(); 2974e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2976257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sar) 29771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2979e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 2980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2983e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HOsrEntry: public HTemplateInstruction<0> { 2984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HOsrEntry(int ast_id) : ast_id_(ast_id) { 2986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesOsrEntries); 2987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id() const { return ast_id_; } 2990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2991e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 2992e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2993e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2994e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2995257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int ast_id_; 2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3002e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HParameter: public HTemplateInstruction<0> { 3003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HParameter(unsigned index) : index_(index) { 3005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index() const { return index_; } 3009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3010e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3013e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3014e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3016257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Parameter) 3017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index_; 3020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HCallStub: public HUnaryCall { 3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 30261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryCall(context, argument_count), 30271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block major_key_(major_key), 3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_(TranscendentalCache::kNumberOfCaches) { 3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key() { return major_key_; } 30321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3033e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transcendental_type(TranscendentalCache::Type transcendental_type) { 3036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch transcendental_type_ = transcendental_type; 3037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type() { 3039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return transcendental_type_; 3040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 30411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3042e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3043e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3044e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3045e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3046e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3048257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallStub) 3049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key_; 3052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch TranscendentalCache::Type transcendental_type_; 3053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3056e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HUnknownOSRValue: public HTemplateInstruction<0> { 3057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HUnknownOSRValue() { set_representation(Representation::Tagged()); } 3059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3060e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3061e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3062e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3063e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3064257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 3065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalCell: public HTemplateInstruction<0> { 3069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 30708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalCell(Handle<JSGlobalPropertyCell> cell, bool check_hole_value) 3071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : cell_(cell), check_hole_value_(check_hole_value) { 3072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnGlobalVars); 3075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 3078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool check_hole_value() const { return check_hole_value_; } 3079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode() { 308344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(!HEAP->allow_allocation(false)); 3084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return reinterpret_cast<intptr_t>(*cell_); 3085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3087e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3088e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3091257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 3092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 30958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalCell* b = HLoadGlobalCell::cast(other); 3096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return cell_.is_identical_to(b->cell()); 3097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 3101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool check_hole_value_; 3102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31058b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HLoadGlobalGeneric: public HBinaryOperation { 3106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 31078b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HLoadGlobalGeneric(HValue* context, 31088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 31098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 31108b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof) 31118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : HBinaryOperation(context, global_object), 31128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch name_(name), 31138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch for_typeof_(for_typeof) { 31148b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 31158b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 31168b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 31178b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31188b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 31198b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 31208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 31218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof() const { return for_typeof_; } 31228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 31248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 31268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 31278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 31288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3129257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) 31308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 31328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 31338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof_; 31348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 31358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31378b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalCell: public HUnaryOperation { 31388b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 31398b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalCell(HValue* value, 31408b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<JSGlobalPropertyCell> cell, 31418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool check_hole_value) 31421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(value), 31431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block cell_(cell), 31441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block check_hole_value_(check_hole_value) { 3145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesGlobalVars); 3146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell() const { return cell_; } 31491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool check_hole_value() const { return check_hole_value_; } 3150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3156257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 3157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSGlobalPropertyCell> cell_; 31601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool check_hole_value_; 3161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 31648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochclass HStoreGlobalGeneric: public HTemplateInstruction<3> { 31658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 31668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HStoreGlobalGeneric(HValue* context, 31678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object, 31688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name, 31698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 31708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode) 31718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 31728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch strict_mode_(strict_mode) { 31738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(0, context); 31748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(1, global_object); 31758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetOperandAt(2, value); 31768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 31778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch SetAllSideEffects(); 31788b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 31798b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31808b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 31818b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 31828b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name() const { return name_; } 31838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value() { return OperandAt(2); } 31848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode() { return strict_mode_; } 31858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual void PrintDataTo(StringStream* stream); 31878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 31898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 31908b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 31918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3192257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalGeneric) 31938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31948b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 31958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch Handle<Object> name_; 31968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode_; 31978b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 31988b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 31998b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 32001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadContextSlot: public HUnaryOperation { 3201b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 32021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HLoadContextSlot(HValue* context , int slot_index) 32031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HUnaryOperation(context), slot_index_(slot_index) { 3204b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_representation(Representation::Tagged()); 3205b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SetFlag(kUseGVN); 32061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnContextSlots); 3207b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3208b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3209b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index() const { return slot_index_; } 3210b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 32111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 32121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 3213b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3214b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3215e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 32161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3217257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) 3218b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3219b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected: 3220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3221b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadContextSlot* b = HLoadContextSlot::cast(other); 32221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (slot_index() == b->slot_index()); 3223b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 3224b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3225b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private: 32261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index_; 32271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 32281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockstatic inline bool StoringValueNeedsWriteBarrier(HValue* value) { 32311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return !value->type().IsSmi() && 32321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block !(value->IsConstant() && HConstant::cast(value)->InOldSpace()); 32331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 32341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStoreContextSlot: public HBinaryOperation { 32371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 32381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreContextSlot(HValue* context, int slot_index, HValue* value) 32391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryOperation(context, value), slot_index_(slot_index) { 32401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kChangesContextSlots); 32411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 32421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 32451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index() const { return slot_index_; } 32461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 32481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 32491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 32501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 32521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 32531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 32541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3255e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 32561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 32581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 32591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 3260b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index_; 3261b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 3262b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3263b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoadNamedField: public HUnaryOperation { 3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField(HValue* object, bool is_in_object, int offset) 3267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HUnaryOperation(object), 3268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(is_in_object), 3269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 327244f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 3273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object) { 3274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnInobjectFields); 3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 3276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnBackingStoreFields); 3277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 3282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 3283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3287e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3289257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 3290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3292e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HLoadNamedField* b = HLoadNamedField::cast(other); 3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return is_in_object_ == b->is_in_object_ && offset_ == b->offset_; 3295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 3299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 3300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 330344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadNamedFieldPolymorphic: public HUnaryOperation { 330444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 330544f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadNamedFieldPolymorphic(HValue* object, 330644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneMapList* types, 330744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name); 330844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 330944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* object() { return OperandAt(0); } 331044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneMapList* types() { return &types_; } 331144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name() { return name_; } 331244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic() { return need_generic_; } 331344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 331444f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual Representation RequiredInputRepresentation(int index) const { 331544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 331644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 331744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedFieldPolymorphic) 331944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 332044f0eee88ff00398ff7f715fab053374d808c90dSteve Block static const int kMaxLoadPolymorphism = 4; 332144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 332244f0eee88ff00398ff7f715fab053374d808c90dSteve Block protected: 332344f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* value); 332444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 332544f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 332644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ZoneMapList types_; 332744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<String> name_; 332844f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool need_generic_; 332944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 333044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 333144f0eee88ff00398ff7f715fab053374d808c90dSteve Block 333244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 33331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HLoadNamedGeneric: public HBinaryOperation { 3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 33351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) 33361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryOperation(context, object), name_(name) { 3337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 33381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3341e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3342e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(1); } 3343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name() const { return name_; } 3344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) 3350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Object> name_; 3353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 33569fac840a46e8b7e26894f4792ba26dde14c56b04Steve Blockclass HLoadFunctionPrototype: public HUnaryOperation { 33579fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block public: 33589fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block explicit HLoadFunctionPrototype(HValue* function) 33599fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block : HUnaryOperation(function) { 33609fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block set_representation(Representation::Tagged()); 33611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 33621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnCalls); 33639fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 33649fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 33669fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 33679fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block virtual Representation RequiredInputRepresentation(int index) const { 33689fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return Representation::Tagged(); 33699fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 33709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3371257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 33729fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 33739fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block protected: 3374e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 33759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block}; 33769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 33779fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3378e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedFastElement: public HBinaryOperation { 3379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HLoadKeyedFastElement(HValue* obj, HValue* key) : HBinaryOperation(obj, key) { 3381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kDependsOnArrayElements); 3383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3386e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3388e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The key is supposed to be Integer32. 3391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 1) ? Representation::Integer32() 3392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Tagged(); 3393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3397257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool RequiresHoleCheck() const; 3398257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) 34001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3402e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 34031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 34041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 340644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HLoadKeyedSpecializedArrayElement: public HBinaryOperation { 34071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 340844f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement(HValue* external_elements, 340944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 341044f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type) 341144f0eee88ff00398ff7f715fab053374d808c90dSteve Block : HBinaryOperation(external_elements, key), 341244f0eee88ff00398ff7f715fab053374d808c90dSteve Block array_type_(array_type) { 3413257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (array_type == kExternalFloatArray || 3414257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch array_type == kExternalDoubleArray) { 341544f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Double()); 341644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 341744f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Integer32()); 341844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 341944f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnSpecializedArrayElements); 342044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // Native code could change the specialized array. 34211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kDependsOnCalls); 34221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 34231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 34261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 34281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The key is supposed to be Integer32, but the base pointer 34291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // for the element load is a naked pointer. 34301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (index == 1) ? Representation::Integer32() 34311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : Representation::External(); 34321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3434e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 3435e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 343644f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type() const { return array_type_; } 34371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement) 34391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 34401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 344144f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { 344244f0eee88ff00398ff7f715fab053374d808c90dSteve Block if (!other->IsLoadKeyedSpecializedArrayElement()) return false; 344344f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement* cast_other = 344444f0eee88ff00398ff7f715fab053374d808c90dSteve Block HLoadKeyedSpecializedArrayElement::cast(other); 344544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return array_type_ == cast_other->array_type(); 344644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 344744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 344844f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 344944f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type_; 3450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3453e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HLoadKeyedGeneric: public HTemplateInstruction<3> { 3454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3455257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) { 3456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch set_representation(Representation::Tagged()); 3457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, obj); 3458e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 34591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 34601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 34611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 34621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3463e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3464e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 34669fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3467e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3473257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 3474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedField: public HBinaryOperation { 3478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HStoreNamedField(HValue* obj, 34801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 3481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HValue* val, 3482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool in_object, 3483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset) 3484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HBinaryOperation(obj, val), 3485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch name_(name), 3486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch is_in_object_(in_object), 3487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch offset_(offset) { 3488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch if (is_in_object_) { 3489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesInobjectFields); 3490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } else { 3491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kChangesBackingStoreFields); 3492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 3496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 34981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 3499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3500e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3503e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 3504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3505e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() const { return name_; } 3506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object() const { return is_in_object_; } 3507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset() const { return offset_; } 3508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition() const { return transition_; } 3509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_transition(Handle<Map> map) { transition_ = map; } 3510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 35121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 35131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 35141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3516e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 3517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool is_in_object_; 3518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int offset_; 3519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<Map> transition_; 3520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3523e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreNamedGeneric: public HTemplateInstruction<3> { 3524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 35251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreNamedGeneric(HValue* context, 35261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 35271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<String> name, 35288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 35298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode) 35308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : name_(name), 35318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch strict_mode_(strict_mode) { 3532e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 3533e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, value); 35341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(2, context); 35351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 35361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 35371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3538e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(1); } 3540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(2); } 3541e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name() { return name_; } 35428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode() { return strict_mode_; } 35431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3544e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 35451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) 35511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 35521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 3553e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Handle<String> name_; 35548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode_; 3555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3558e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedFastElement: public HTemplateInstruction<3> { 3559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3560e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HStoreKeyedFastElement(HValue* obj, HValue* key, HValue* val) { 3561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, obj); 3562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(1, key); 3563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(2, val); 3564e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetFlag(kChangesArrayElements); 3565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch // The key is supposed to be Integer32. 3569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return (index == 1) ? Representation::Integer32() 3570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : Representation::Tagged(); 3571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3573e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3575e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 3576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 35789fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block return StoringValueNeedsWriteBarrier(value()); 35799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 35809fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3583257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedFastElement) 3584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 358744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStoreKeyedSpecializedArrayElement: public HTemplateInstruction<3> { 3588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 358944f0eee88ff00398ff7f715fab053374d808c90dSteve Block HStoreKeyedSpecializedArrayElement(HValue* external_elements, 359044f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* key, 359144f0eee88ff00398ff7f715fab053374d808c90dSteve Block HValue* val, 359244f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type) 359344f0eee88ff00398ff7f715fab053374d808c90dSteve Block : array_type_(array_type) { 359444f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kChangesSpecializedArrayElements); 3595e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, external_elements); 3596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 3597e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, val); 3598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 3601e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3603e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch if (index == 0) { 3604e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::External(); 3605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } else { 3606257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch if (index == 2 && (array_type() == kExternalFloatArray || 3607257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch array_type() == kExternalDoubleArray)) { 360844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Double(); 360944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } else { 361044f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Integer32(); 361144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 3612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3615e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* external_pointer() { return OperandAt(0); } 3616e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3617e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 361844f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type() const { return array_type_; } 3619e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement) 3621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 362244f0eee88ff00398ff7f715fab053374d808c90dSteve Block private: 362344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ExternalArrayType array_type_; 3624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3627e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HStoreKeyedGeneric: public HTemplateInstruction<4> { 3628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 36291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStoreKeyedGeneric(HValue* context, 36301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* object, 36311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HValue* key, 36328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* value, 36338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode) 36348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch : strict_mode_(strict_mode) { 3635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(0, object); 3636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(1, key); 3637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch SetOperandAt(2, value); 36381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(3, context); 36391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 36401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 36411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return OperandAt(0); } 3643e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return OperandAt(1); } 3644e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* value() { return OperandAt(2); } 3645e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(3); } 36468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode() { return strict_mode_; } 36471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3649e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3652e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void PrintDataTo(StringStream* stream); 36531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3654257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 36558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 36568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 36578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool strict_mode_; 36588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 36598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 36608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3661257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HStringAdd: public HBinaryOperation { 3662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 3663257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HStringAdd(HValue* left, HValue* right) : HBinaryOperation(left, right) { 3664257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 3665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 3666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kDependsOnMaps); 3667257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 3671257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3673257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 3674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::String(); 3675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringAdd) 3678257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3679257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 3680257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool DataEquals(HValue* other) { return true; } 3681257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 3682257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3683257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 36841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringCharCodeAt: public HBinaryOperation { 36851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 36861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HStringCharCodeAt(HValue* string, HValue* index) 36871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : HBinaryOperation(string, index) { 36881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Integer32()); 36891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 369044f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 36911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 36921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 36931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 36941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The index is supposed to be Integer32. 36951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (index == 1) ? Representation::Integer32() 36961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block : Representation::Tagged(); 36971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 36981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* string() { return OperandAt(0); } 3700e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* index() { return OperandAt(1); } 37011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 37031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3705e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 37061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Range* InferRange() { 37081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return new Range(0, String::kMaxUC16CharCode); 37091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 37111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 371344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HStringCharFromCode: public HUnaryOperation { 371444f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 371544f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HStringCharFromCode(HValue* char_code) : HUnaryOperation(char_code) { 371644f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 371744f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kUseGVN); 371844f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 371944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 372044f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual Representation RequiredInputRepresentation(int index) const { 372144f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Integer32(); 372244f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 372344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 372444f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool DataEquals(HValue* other) { return true; } 372544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 372744f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 372844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 372944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 37301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockclass HStringLength: public HUnaryOperation { 37311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 37321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block explicit HStringLength(HValue* string) : HUnaryOperation(string) { 37331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 37341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 373544f0eee88ff00398ff7f715fab053374d808c90dSteve Block SetFlag(kDependsOnMaps); 37361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 37391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 37401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3742e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType() { 37431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 37441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return HType::Smi(); 37451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 37461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StringLength) 37481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3750e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { return true; } 37511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 37521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Range* InferRange() { 37531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return new Range(0, String::kMaxLength); 37541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 3755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3758e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 3759e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HMaterializedLiteral: public HTemplateInstruction<V> { 3760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3761e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HMaterializedLiteral<V>(int index, int depth) 3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : literal_index_(index), depth_(depth) { 3763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 3764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index() const { return literal_index_; } 3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth() const { return depth_; } 3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index_; 3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth_; 3772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3775e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HArrayLiteral: public HMaterializedLiteral<0> { 3776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HArrayLiteral(Handle<FixedArray> constant_elements, 3778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length, 3779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index, 3780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int depth) 3781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HMaterializedLiteral<0>(literal_index, depth), 3782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch length_(length), 3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch constant_elements_(constant_elements) {} 3784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_elements() const { return constant_elements_; } 3786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length() const { return length_; } 3787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsCopyOnWrite() const; 3789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3790e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3791e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3792e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3793e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3794257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArrayLiteral) 3795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int length_; 3798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_elements_; 3799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3802e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HObjectLiteral: public HMaterializedLiteral<1> { 3803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 38041e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HObjectLiteral(HValue* context, 38051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<FixedArray> constant_properties, 3806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements, 3807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index, 380844f0eee88ff00398ff7f715fab053374d808c90dSteve Block int depth, 380944f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function) 3810e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HMaterializedLiteral<1>(literal_index, depth), 3811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch constant_properties_(constant_properties), 381244f0eee88ff00398ff7f715fab053374d808c90dSteve Block fast_elements_(fast_elements), 381344f0eee88ff00398ff7f715fab053374d808c90dSteve Block has_function_(has_function) { 38141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, context); 38151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 3816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 3818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties() const { 3819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return constant_properties_; 3820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements() const { return fast_elements_; } 382244f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function() const { return has_function_; } 3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3824e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3825e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3826e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 38271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3828257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ObjectLiteral) 3829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<FixedArray> constant_properties_; 3832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool fast_elements_; 383344f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool has_function_; 3834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3837e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HRegExpLiteral: public HMaterializedLiteral<0> { 3838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HRegExpLiteral(Handle<String> pattern, 3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags, 3841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index) 3842e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HMaterializedLiteral<0>(literal_index, 0), 3843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pattern_(pattern), 3844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch flags_(flags) { } 3845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern() { return pattern_; } 3847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags() { return flags_; } 3848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3849e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3850e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3851e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3852e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3853257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) 3854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern_; 3857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags_; 3858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochclass HFunctionLiteral: public HTemplateInstruction<0> { 3862b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HFunctionLiteral(Handle<SharedFunctionInfo> shared, bool pretenure) 3864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : shared_info_(shared), pretenure_(pretenure) { 3865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3868e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3869e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3870e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3871e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3872257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 3873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 3875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure() const { return pretenure_; } 3876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info_; 3879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure_; 3880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HTypeof: public HUnaryOperation { 3884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HTypeof(HValue* value) : HUnaryOperation(value) { 3886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 38891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual Representation RequiredInputRepresentation(int index) const { 38901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 38911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 38921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3893257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Typeof) 3894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 389744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockclass HToFastProperties: public HUnaryOperation { 389844f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 389944f0eee88ff00398ff7f715fab053374d808c90dSteve Block explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 390044f0eee88ff00398ff7f715fab053374d808c90dSteve Block // This instruction is not marked as having side effects, but 390144f0eee88ff00398ff7f715fab053374d808c90dSteve Block // changes the map of the input operand. Use it only when creating 390244f0eee88ff00398ff7f715fab053374d808c90dSteve Block // object literals. 390344f0eee88ff00398ff7f715fab053374d808c90dSteve Block ASSERT(value->IsObjectLiteral()); 390444f0eee88ff00398ff7f715fab053374d808c90dSteve Block set_representation(Representation::Tagged()); 390544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 390644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 390744f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual Representation RequiredInputRepresentation(int index) const { 390844f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 390944f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 391044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3911257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 391244f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 391344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 391444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 3915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValueOf: public HUnaryOperation { 3916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch explicit HValueOf(HValue* value) : HUnaryOperation(value) { 3918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3924e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ValueOf) 3926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HDeleteProperty: public HBinaryOperation { 3930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HDeleteProperty(HValue* obj, HValue* key) 3932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : HBinaryOperation(obj, key) { 3933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 39341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 3935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 3939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(DeleteProperty) 3942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* object() { return left(); } 3944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* key() { return right(); } 3945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HIn: public HTemplateInstruction<2> { 3949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 3950257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HIn(HValue* key, HValue* object) { 3951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(0, key); 3952257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(1, object); 3953257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 3954257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetAllSideEffects(); 3955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* key() { return OperandAt(0); } 3958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* object() { return OperandAt(1); } 3959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3960257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Representation RequiredInputRepresentation(int index) const { 3961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 3962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual HType CalculateInferredType() { 3965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return HType::Boolean(); 3966257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3967257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3968257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual void PrintDataTo(StringStream* stream); 3969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3970257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(In) 3971257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 3972257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION 3974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION 3975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 3977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_HYDROGEN_INSTRUCTIONS_H_ 3979