13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifndef V8_HYDROGEN_INSTRUCTIONS_H_ 6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define V8_HYDROGEN_INSTRUCTIONS_H_ 7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/v8.h" 9b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation.h" 11b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 12b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/code-stubs.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/data-flow.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/deoptimizer.h" 16b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/feedback-slots.h" 17b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/hydrogen-types.h" 18b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/small-pointer-list.h" 19b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/unique.h" 20b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/utils.h" 21b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/zone.h" 22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 { 24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal { 25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Forward declarations. 27b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ChangesOf; 28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HBasicBlock; 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDiv; 30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HEnvironment; 31b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInferRepresentationPhase; 32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HInstruction; 33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HLoopInformation; 34b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedField; 35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass HValue; 36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LInstruction; 37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochclass LChunkBuilder; 38b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass OStream; 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define HYDROGEN_ABSTRACT_INSTRUCTION_LIST(V) \ 41b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArithmeticBinaryOperation) \ 42b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BinaryOperation) \ 43b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BitwiseBinaryOperation) \ 44b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ControlInstruction) \ 45b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Instruction) 46b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V) \ 49b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(AbnormalExit) \ 50b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(AccessArgumentsAt) \ 51b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Add) \ 52b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(AllocateBlockContext) \ 53b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Allocate) \ 54b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ApplyArguments) \ 55b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArgumentsElements) \ 56b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArgumentsLength) \ 57b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArgumentsObject) \ 58b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Bitwise) \ 59b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BlockEntry) \ 60b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BoundsCheck) \ 61b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(BoundsCheckBaseIndexInformation) \ 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Branch) \ 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallWithDescriptor) \ 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallJSFunction) \ 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallFunction) \ 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallNew) \ 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallNewArray) \ 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallRuntime) \ 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CallStub) \ 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CapturedObject) \ 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Change) \ 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckHeapObject) \ 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckInstanceType) \ 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckMaps) \ 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckMapValue) \ 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckSmi) \ 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CheckValue) \ 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ClampToUint8) \ 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ClassOfTestAndBranch) \ 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareNumericAndBranch) \ 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareHoleAndBranch) \ 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareGeneric) \ 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareMinusZeroAndBranch) \ 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareObjectEqAndBranch) \ 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(CompareMap) \ 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Constant) \ 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ConstructDouble) \ 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Context) \ 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DateField) \ 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DebugBreak) \ 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DeclareGlobals) \ 92b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Deoptimize) \ 93b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Div) \ 94b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DoubleBits) \ 95b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DummyUse) \ 96b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EnterInlined) \ 97b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(EnvironmentMarker) \ 98b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ForceRepresentation) \ 99b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ForInCacheArray) \ 100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ForInPrepareMap) \ 101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(FunctionLiteral) \ 102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(GetCachedArrayIndex) \ 103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Goto) \ 104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HasCachedArrayIndexAndBranch) \ 105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(HasInstanceTypeAndBranch) \ 106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(InnerAllocatedObject) \ 107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(InstanceOf) \ 108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(InstanceOfKnownGlobal) \ 109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(InvokeFunction) \ 110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(IsConstructCallAndBranch) \ 111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(IsObjectAndBranch) \ 112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(IsStringAndBranch) \ 113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(IsSmiAndBranch) \ 114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(IsUndetectableAndBranch) \ 115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LeaveInlined) \ 116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadContextSlot) \ 117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadFieldByIndex) \ 118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadFunctionPrototype) \ 119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadGlobalCell) \ 120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadGlobalGeneric) \ 121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadKeyed) \ 122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadKeyedGeneric) \ 123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadNamedField) \ 124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadNamedGeneric) \ 125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(LoadRoot) \ 126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MapEnumLength) \ 127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MathFloorOfDiv) \ 128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(MathMinMax) \ 129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Mod) \ 130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Mul) \ 131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OsrEntry) \ 132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Parameter) \ 133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Power) \ 134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(PushArguments) \ 135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(RegExpLiteral) \ 136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Return) \ 137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Ror) \ 138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Sar) \ 139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SeqStringGetChar) \ 140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(SeqStringSetChar) \ 141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Shl) \ 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Shr) \ 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Simulate) \ 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StackCheck) \ 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreCodeEntry) \ 146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreContextSlot) \ 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreFrameContext) \ 148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreGlobalCell) \ 149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreKeyed) \ 150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreKeyedGeneric) \ 151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreNamedField) \ 152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StoreNamedGeneric) \ 153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringAdd) \ 154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringCharCodeAt) \ 155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringCharFromCode) \ 156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringCompareAndBranch) \ 157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Sub) \ 158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TailCallThroughMegamorphicCache) \ 159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ThisFunction) \ 160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ToFastProperties) \ 161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TransitionElementsKind) \ 162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TrapAllocationMemento) \ 163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Typeof) \ 164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TypeofIsAndBranch) \ 165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(UnaryMathOperation) \ 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(UnknownOSRValue) \ 167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(UseConst) \ 1683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(WrapReceiver) 169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define GVN_TRACKED_FLAG_LIST(V) \ 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(NewSpacePromotion) 172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define GVN_UNTRACKED_FLAG_LIST(V) \ 174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArrayElements) \ 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ArrayLengths) \ 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringLengths) \ 177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(BackingStoreFields) \ 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(Calls) \ 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ContextSlots) \ 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DoubleArrayElements) \ 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(DoubleFields) \ 1823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ElementsKind) \ 1833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch V(ElementsPointer) \ 184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(GlobalVars) \ 185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(InobjectFields) \ 186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch V(Maps) \ 187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(OsrEntries) \ 188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(ExternalMemory) \ 189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(StringChars) \ 190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch V(TypedArrayElements) 191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_ABSTRACT_INSTRUCTION(type) \ 194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool Is##type() const FINAL OVERRIDE { return true; } \ 195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static H##type* cast(HValue* value) { \ 196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->Is##type()); \ 197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<H##type*>(value); \ 198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_CONCRETE_INSTRUCTION(type) \ 202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual LInstruction* CompileToLithium( \ 203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LChunkBuilder* builder) FINAL OVERRIDE; \ 204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static H##type* cast(HValue* value) { \ 205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->Is##type()); \ 206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<H##type*>(value); \ 207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } \ 208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Opcode opcode() const FINAL OVERRIDE { \ 209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HValue::k##type; \ 210257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum PropertyAccessType { LOAD, STORE }; 214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Range FINAL : public ZoneObject { 217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Range() 219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(kMinInt), 220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(kMaxInt), 221e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 222e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range(int32_t lower, int32_t upper) 225e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : lower_(lower), 226e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch upper_(upper), 227e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch next_(NULL), 228e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch can_be_minus_zero_(false) { } 229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper() const { return upper_; } 231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower() const { return lower_; } 232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next() const { return next_; } 2333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* CopyClearLower(Zone* zone) const { 2343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(kMinInt, upper_); 2353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* CopyClearUpper(Zone* zone) const { 2373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return new(zone) Range(lower_, kMaxInt); 2383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 2393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* Copy(Zone* zone) const { 2403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Range* result = new(zone) Range(lower_, upper_); 24169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch result->set_can_be_minus_zero(CanBeMinusZero()); 24269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return result; 24369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Mask() const; 245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_can_be_minus_zero(bool b) { can_be_minus_zero_ = b; } 246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeMinusZero() const { return CanBeZero() && can_be_minus_zero_; } 247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeZero() const { return upper_ >= 0 && lower_ <= 0; } 248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool CanBeNegative() const { return lower_ < 0; } 249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanBePositive() const { return upper_ > 0; } 250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Includes(int value) const { return lower_ <= value && upper_ >= value; } 25169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch bool IsMostGeneric() const { 25269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return lower_ == kMinInt && upper_ == kMaxInt && CanBeMinusZero(); 25369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 254e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool IsInSmiRange() const { 255e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return lower_ >= Smi::kMinValue && upper_ <= Smi::kMaxValue; 256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClampToSmi() { 258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch lower_ = Max(lower_, Smi::kMinValue); 259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch upper_ = Min(upper_, Smi::kMaxValue); 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void KeepOrder(); 2623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG 263e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Verify() const; 2643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void StackUpon(Range* other) { 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Intersect(other); 268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch next_ = other; 269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 271e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Intersect(Range* other); 272e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Union(Range* other); 273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CombinedMax(Range* other); 274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CombinedMin(Range* other); 275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void AddConstant(int32_t value); 277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Sar(int32_t value); 278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch void Shl(int32_t value); 279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool AddAndCheckOverflow(const Representation& r, Range* other); 280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool SubAndCheckOverflow(const Representation& r, Range* other); 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MulAndCheckOverflow(const Representation& r, Range* other); 282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t lower_; 285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t upper_; 286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* next_; 287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool can_be_minus_zero_; 288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochclass HUseListNode: public ZoneObject { 292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 293257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode(HValue* value, int index, HUseListNode* tail) 294257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch : tail_(tail), value_(value), index_(index) { 295257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HUseListNode* tail(); 298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() const { return value_; } 299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() const { return index_; } 300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void set_tail(HUseListNode* list) { tail_ = list; } 302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG 304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Zap() { 305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch tail_ = reinterpret_cast<HUseListNode*>(1); 306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch value_ = NULL; 307257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch index_ = -1; 308257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 309257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif 310257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* tail_; 313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 315257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 316257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 317257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// We reuse use list nodes behind the scenes as uses are added and deleted. 319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch// This class is the safe way to iterate uses while deleting them. 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUseIterator FINAL BASE_EMBEDDED { 321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Done() { return current_ == NULL; } 323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void Advance(); 324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value() { 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!Done()); 327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return value_; 328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 329257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index() { 331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!Done()); 332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return index_; 333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch private: 336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch explicit HUseIterator(HUseListNode* head); 337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* current_; 339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* next_; 340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HValue* value_; 341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int index_; 342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch friend class HValue; 344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 345257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 346257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// All tracked flags should appear before untracked ones. 3483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochenum GVNFlag { 3493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Declare global value numbering flags. 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_FLAG(Type) k##Type, 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVN_TRACKED_FLAG_LIST(DECLARE_FLAG) 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVN_UNTRACKED_FLAG_LIST(DECLARE_FLAG) 3533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DECLARE_FLAG 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define COUNT_FLAG(Type) + 1 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNumberOfTrackedSideEffects = 0 GVN_TRACKED_FLAG_LIST(COUNT_FLAG), 356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNumberOfUntrackedSideEffects = 0 GVN_UNTRACKED_FLAG_LIST(COUNT_FLAG), 357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef COUNT_FLAG 358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kNumberOfFlags = kNumberOfTrackedSideEffects + kNumberOfUntrackedSideEffects 359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline GVNFlag GVNFlagFromInt(int i) { 363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i >= 0); 364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(i < kNumberOfFlags); 365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<GVNFlag>(i); 366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass DecompositionResult FINAL BASE_EMBEDDED { 370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecompositionResult() : base_(NULL), offset_(0), scale_(0) {} 372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base() { return base_; } 374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset() { return offset_; } 375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scale() { return scale_; } 376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Apply(HValue* other_base, int other_offset, int other_scale = 0) { 378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (base_ == NULL) { 379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_ = other_base; 380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = other_offset; 381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scale_ = other_scale; 382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (scale_ == 0) { 385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_ = other_base; 386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ += other_offset; 387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scale_ = other_scale; 388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SwapValues(HValue** other_base, int* other_offset, int* other_scale) { 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch swap(&base_, other_base); 397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch swap(&offset_, other_offset); 398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch swap(&scale_, other_scale); 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> void swap(T* a, T* b) { 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T c(*a); 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *a = *b; 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *b = c; 406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base_; 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset_; 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scale_; 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtypedef EnumSet<GVNFlag, int32_t> GVNFlagSet; 415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// This class encapsulates encoding and decoding of sources positions from 418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// which hydrogen values originated. 419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When FLAG_track_hydrogen_positions is set this object encodes the 420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// identifier of the inlining and absolute offset from the start of the 421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// inlined function. 422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// When the flag is not set we simply track absolute offset from the 423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// script start. 424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSourcePosition { 425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition(const HSourcePosition& other) : value_(other.value_) { } 427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HSourcePosition Unknown() { 429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HSourcePosition(RelocInfo::kNoPosition); 430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUnknown() const { return value_ == RelocInfo::kNoPosition; } 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int position() const { return PositionField::decode(value_); } 435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_position(int position) { 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_hydrogen_track_positions) { 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_ = static_cast<int>(PositionField::update(value_, position)); 438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_ = position; 440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int inlining_id() const { return InliningIdField::decode(value_); } 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_inlining_id(int inlining_id) { 445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_hydrogen_track_positions) { 446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value_ = static_cast<int>(InliningIdField::update(value_, inlining_id)); 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int raw() const { return value_; } 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef BitField<int, 0, 9> InliningIdField; 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Offset from the start of the inlined function. 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch typedef BitField<int, 9, 23> PositionField; 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HSourcePosition(int value) : value_(value) { } 459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HPositionInfo; 461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class LCodeGenBase; 462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If FLAG_hydrogen_track_positions is set contains bitfields InliningIdField 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // and PositionField. 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Otherwise contains absolute offset from the script start. 466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int value_; 4673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 4683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HSourcePosition& p); 4713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HValue : public ZoneObject { 474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoNumber = -1; 476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Flag { 478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kFlexibleRepresentation, 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCannotBeTagged, 4803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // Participate in Global Value Numbering, i.e. elimination of 4813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // unnecessary recomputations. If an instruction sets this flag, it must 4823fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // implement DataEquals(), which will be used to determine if other 4833fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // occurrences of the instruction are indeed the same. 484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kUseGVN, 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Track instructions that are dominating side effects. If an instruction 486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sets this flag, it must implement HandleSideEffectDominator() and should 487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // indicate which side effects to track by setting GVN flags. 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTrackSideEffectDominators, 489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanOverflow, 490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kBailoutOnMinusZero, 491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kCanBeDivByZero, 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLeftCanBeMinInt, 493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLeftCanBeNegative, 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLeftCanBePositive, 495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllowUndefinedAsNaN, 496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kIsArguments, 497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch kTruncatingToInt32, 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllUsesTruncatingToInt32, 499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kTruncatingToSmi, 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kAllUsesTruncatingToSmi, 501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set after an instruction is killed. 5023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kIsDead, 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Instructions that are allowed to produce full range unsigned integer 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // values are marked with kUint32 flag. If arithmetic shift or a load from 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // EXTERNAL_UINT32_ELEMENTS array is not marked with this flag 506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it will deoptimize if result does not fit into signed integer range. 507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // HGraph::ComputeSafeUint32Operations is responsible for setting this 508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // flag. 509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kUint32, 510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kHasNoObservableSideEffects, 511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates an instruction shouldn't be replaced by optimization, this flag 512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is useful to set in cases where recomputing a value is cheaper than 513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // extending the value's live range and spilling it. 514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kCantBeReplaced, 515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates the instruction is live during dead code elimination. 516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kIsLive, 517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // HEnvironmentMarkers are deleted before dead code 519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // elimination takes place, so they can repurpose the kIsLive flag: 520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kEndsLiveRange = kIsLive, 521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(everyone): Don't forget to update this! 523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kLastFlag = kIsLive 524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch STATIC_ASSERT(kLastFlag < kBitsPerInt); 527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static HValue* cast(HValue* value) { return value; } 529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch enum Opcode { 531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Declare a unique enum value for each hydrogen instruction. 532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_OPCODE(type) k##type, 533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) 534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch kPhi 535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_OPCODE 536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch }; 537257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual Opcode opcode() const = 0; 538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 539257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare a non-virtual predicates for each concrete HInstruction or HValue. 540257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool Is##type() const { return opcode() == k##type; } 542257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool IsPhi() const { return opcode() == kPhi; } 545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Declare virtual predicates for abstract HInstruction or HValue 547257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #define DECLARE_PREDICATE(type) \ 548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch virtual bool Is##type() const { return false; } 549257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HYDROGEN_ABSTRACT_INSTRUCTION_LIST(DECLARE_PREDICATE) 550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch #undef DECLARE_PREDICATE 551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsBitwiseBinaryShift() { 553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsShl() || IsShr() || IsSar(); 554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HValue(HType type = HType::Tagged()) 557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : block_(NULL), 558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch id_(kNoNumber), 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type_(type), 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch use_list_(NULL), 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range_(NULL), 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch range_poisoned_(false), 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_(0) {} 566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual ~HValue() {} 567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HSourcePosition position() const { 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HSourcePosition::Unknown(); 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HSourcePosition operand_position(int index) const { 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return position(); 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block() const { return block_; } 576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetBlock(HBasicBlock* block); 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note: Never call this method for an unlinked value. 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Isolate* isolate() const; 580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id() const { return id_; } 582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_id(int id) { id_ = id; } 583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 584257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseIterator uses() const { return HUseIterator(use_list_); } 585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 58644f0eee88ff00398ff7f715fab053374d808c90dSteve Block virtual bool EmitAtUses() { return false; } 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation() const { return representation_; } 589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void ChangeRepresentation(Representation r) { 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(CheckFlag(kFlexibleRepresentation)); 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!CheckFlag(kCannotBeTagged) || !r.IsTagged()); 592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch RepresentationChanged(r); 593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsTagged()) { 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Tagged is the bottom of the lattice, don't go any further. 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearFlag(kFlexibleRepresentation); 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AssumeRepresentation(Representation r); 600257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation KnownOptimalRepresentation() { 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = representation(); 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsTagged()) { 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType t = type(); 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (t.IsSmi()) return Representation::Smi(); 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (t.IsHeapNumber()) return Representation::Double(); 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (t.IsHeapObject()) return r; 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return r; 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type() const { return type_; } 61469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch void set_type(HType new_type) { 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(new_type.IsSubtypeOf(type_)); 61669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch type_ = new_type; 617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // There are HInstructions that do not really change a value, they 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // only add pieces of information to it (like bounds checks, map checks, 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // smi checks...). 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We call these instructions "informative definitions", or "iDef". 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // One of the iDef operands is special because it is the value that is 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // "transferred" to the output, we call it the "redefined operand". 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If an HValue is an iDef it must override RedefinedOperandIndex() so that 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it does not return kNoRedefinedOperand; 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoRedefinedOperand = -1; 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return kNoRedefinedOperand; } 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInformativeDefinition() { 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RedefinedOperandIndex() != kNoRedefinedOperand; 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* RedefinedOperand() { 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index = RedefinedOperandIndex(); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index == kNoRedefinedOperand ? NULL : OperandAt(index); 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanReplaceWithDummyUses(); 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const { return 0; } 640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // A purely informative definition is an idef that will not emit code and 642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // should therefore be removed from the graph in the RestoreActualValues 643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // phase (so that live ranges will be shorter). 644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsPurelyInformativeDefinition() { return false; } 645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This method must always return the original HValue SSA definition, 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // regardless of any chain of iDefs of this value. 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* ActualValue() { 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value = this; 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index; 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while ((index = value->RedefinedOperandIndex()) != kNoRedefinedOperand) { 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value = value->OperandAt(index); 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value; 655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInteger32Constant(); 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t GetInteger32Constant(); 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EqualsInteger32Constant(int32_t value); 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool IsDefinedAfter(HBasicBlock* other) const; 662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Operands. 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const = 0; 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int index) const = 0; 666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void SetOperandAt(int index, HValue* value); 667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 668257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void DeleteAndReplaceWith(HValue* other); 669257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void ReplaceAllUsesWith(HValue* other); 670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasNoUses() const { return use_list_ == NULL; } 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasOneUse() const { 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return use_list_ != NULL && use_list_->tail() == NULL; 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 674257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool HasMultipleUses() const { 675257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return use_list_ != NULL && use_list_->tail() != NULL; 676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch int UseCount() const; 6783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Mark this HValue as dead and to be removed from other HValues' use lists. 6803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void Kill(); 681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags() const { return flags_; } 6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void SetFlag(Flag f) { flags_ |= (1 << f); } 6841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block void ClearFlag(Flag f) { flags_ &= ~(1 << f); } 6851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; } 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CopyFlag(Flag f, HValue* other) { 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (other->CheckFlag(f)) SetFlag(f); 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Returns true if the flag specified is set for all uses, false otherwise. 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckUsesForFlag(Flag f) const; 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Same as before and the first one without the flag is returned in value. 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckUsesForFlag(Flag f, HValue** value) const; 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if the flag specified is set for all uses, and this set 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of uses is non-empty. 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const; 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet ChangesFlags() const { return changes_flags_; } 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet DependsOnFlags() const { return depends_on_flags_; } 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetChangesFlag(GVNFlag f) { changes_flags_.Add(f); } 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetDependsOnFlag(GVNFlag f) { depends_on_flags_.Add(f); } 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearChangesFlag(GVNFlag f) { changes_flags_.Remove(f); } 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearDependsOnFlag(GVNFlag f) { depends_on_flags_.Remove(f); } 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckChangesFlag(GVNFlag f) const { 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return changes_flags_.Contains(f); 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckDependsOnFlag(GVNFlag f) const { 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return depends_on_flags_.Contains(f); 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetAllSideEffects() { changes_flags_.Add(AllSideEffectsFlagSet()); } 7113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ClearAllSideEffects() { 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch changes_flags_.Remove(AllSideEffectsFlagSet()); 7133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasSideEffects() const { 715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return changes_flags_.ContainsAnyOf(AllSideEffectsFlagSet()); 7163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool HasObservableSideEffects() const { 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !CheckFlag(kHasNoObservableSideEffects) && 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch changes_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet()); 7203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet SideEffectFlags() const { 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet result = ChangesFlags(); 7243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllSideEffectsFlagSet()); 7253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 7263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet ObservableChangesFlags() const { 729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet result = ChangesFlags(); 7303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch result.Intersect(AllObservableSideEffectsFlagSet()); 7313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 7323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 733589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Range* range() const { 735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!range_poisoned_); 736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return range_; 737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasRange() const { 739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!range_poisoned_); 740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return range_ != NULL; 741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void PoisonRange() { range_poisoned_ = true; } 744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 7453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void AddNewRange(Range* r, Zone* zone); 746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RemoveLastAddedRange(); 7473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void ComputeInitialRange(Zone* zone); 748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Escape analysis helpers. 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) { return true; } 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasOutOfBoundsAccess(int size) { return false; } 752e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Representation helpers. 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) { 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) = 0; 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation(HInferRepresentationPhase* h_infer); 759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // This gives the instruction an opportunity to replace itself with an 761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction that does the same in some better way. To replace an 762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // instruction with a new one, first add the new instruction to the graph, 763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // then return it. Return NULL to have the instruction deleted. 764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual HValue* Canonicalize() { return this; } 765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool Equals(HValue* other); 767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual intptr_t Hashcode(); 768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compute unique ids upfront that is safe wrt GC and concurrent compilation. 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() { } 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Printing support. 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintTo(OStream& os) const = 0; // NOLINT 774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 775257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const char* Mnemonic() const; 776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Type information helpers. 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMonomorphicJSObjectType(); 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(mstarzinger): For now instructions can override this function to 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // specify statically known types, once HType can convey more information 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it should be based on the HType. 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Handle<Map> GetMonomorphicJSObjectMap() { return Handle<Map>(); } 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Updated the inferred type of this instruction and returns true if 786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // it has changed. 787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool UpdateInferredType(); 788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 789e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual HType CalculateInferredType(); 790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This function must be overridden for instructions which have the 792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kTrackSideEffectDominators flag set, to track instructions that are 793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // dominating side effects. 794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // It returns true if it removed an instruction which had side effects. 795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HandleSideEffectDominator(GVNFlag side_effect, 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) { 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check if this instruction has some reason that prevents elimination. 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CannotBeEliminated() const { 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HasObservableSideEffects() || !IsDeletable(); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 8071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block virtual void Verify() = 0; 808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryDecompose(DecompositionResult* decomposition) { 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (RedefinedOperand() != NULL) { 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RedefinedOperand()->TryDecompose(decomposition); 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true conservatively if the program might be able to observe a 819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ToString() operation on this value. 820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ToStringCanBeObserved() const { 821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ToStringOrToNumberCanBeObserved(); 822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true conservatively if the program might be able to observe a 825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ToNumber() operation on this value. 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ToNumberCanBeObserved() const { 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ToStringOrToNumberCanBeObserved(); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MinusZeroMode GetMinusZeroMode() { 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return CheckFlag(kBailoutOnMinusZero) 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? FAIL_ON_MINUS_ZERO : TREAT_MINUS_ZERO_AS_ZERO; 833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 8361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // This function must be overridden for instructions with flag kUseGVN, to 8371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // compare the non-Operand parts of the instruction. 838e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual bool DataEquals(HValue* other) { 8391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block UNREACHABLE(); 8401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return false; 8411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ToStringOrToNumberCanBeObserved() const { 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type().IsTaggedPrimitive()) return false; 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (type().IsJSObject()) return true; 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !representation().IsSmiOrInteger32() && !representation().IsDouble(); 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() { 850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromUses(); 853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation RepresentationFromUseRequirements(); 854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasNonSmiUse(); 855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason); 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddDependantsToWorklist(HInferRepresentationPhase* h_infer); 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void RepresentationChanged(Representation to) { } 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Range* InferRange(Zone* zone); 863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual void DeleteFromGraph() = 0; 864e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) = 0; 865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void clear_block() { 866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(block_ != NULL); 867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch block_ = NULL; 868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void set_representation(Representation r) { 871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(representation_.IsNone() && !r.IsNone()); 872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch representation_ = r; 873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static GVNFlagSet AllFlagSet() { 8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch GVNFlagSet result; 877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define ADD_FLAG(Type) result.Add(k##Type); 878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVN_TRACKED_FLAG_LIST(ADD_FLAG) 879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVN_UNTRACKED_FLAG_LIST(ADD_FLAG) 880589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch#undef ADD_FLAG 881589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch return result; 882589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch } 883589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 8841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // A flag mask to mark an instruction as having arbitrary side effects. 8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllSideEffectsFlagSet() { 886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet result = AllFlagSet(); 887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result.Remove(kOsrEntries); 8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend OStream& operator<<(OStream& os, const ChangesOf& v); 8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // A flag mask of all side effects that can make observable changes in 8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // an executing program (i.e. are not safe to repeat, move or remove); 8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch static GVNFlagSet AllObservableSideEffectsFlagSet() { 895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet result = AllFlagSet(); 896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result.Remove(kNewSpacePromotion); 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result.Remove(kElementsKind); 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result.Remove(kElementsPointer); 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result.Remove(kMaps); 9003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return result; 901592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 902592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 903257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // Remove the matching use from the use list if present. Returns the 904257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch // removed list node or NULL. 905257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* RemoveUse(HValue* value, int index); 906257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void RegisterUse(int index, HValue* new_value); 908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HBasicBlock* block_; 910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The id of this instruction in the hydrogen graph, assigned when first 912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // added to the graph. Reflects creation order. 913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int id_; 914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Representation representation_; 916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HType type_; 917257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HUseListNode* use_list_; 918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Range* range_; 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool range_poisoned_; 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int flags_; 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet changes_flags_; 924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GVNFlagSet depends_on_flags_; 925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const { return false; } 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch DISALLOW_COPY_AND_ASSIGN(HValue); 930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Support for printing various aspects of an HValue. 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct NameOf { 934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit NameOf(const HValue* const v) : value(v) {} 935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HValue* value; 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct TypeOf { 940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit TypeOf(const HValue* const v) : value(v) {} 941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HValue* value; 942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 943b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct ChangesOf { 946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit ChangesOf(const HValue* const v) : value(v) {} 947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HValue* value; 948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 9503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HValue& v); 952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const NameOf& v); 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const TypeOf& v); 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const ChangesOf& v); 955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P0(I) \ 958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context) { \ 959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(); \ 960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 961e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P1(I, P1) \ 963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1) { \ 964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1); \ 965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P2(I, P1, P2) \ 968b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1, P2 p2) { \ 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1, p2); \ 970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P3(I, P1, P2, P3) \ 973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1, P2 p2, P3 p3) { \ 974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1, p2, p3); \ 975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P4(I, P1, P2, P3, P4) \ 978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, \ 979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, \ 980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P1 p1, \ 981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P2 p2, \ 982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P3 p3, \ 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P4 p4) { \ 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1, p2, p3, p4); \ 985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P5(I, P1, P2, P3, P4, P5) \ 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, \ 989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, \ 990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P1 p1, \ 991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P2 p2, \ 992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P3 p3, \ 993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P4 p4, \ 994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P5 p5) { \ 995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1, p2, p3, p4, p5); \ 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 997257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_FACTORY_P6(I, P1, P2, P3, P4, P5, P6) \ 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, \ 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, \ 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P1 p1, \ 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P2 p2, \ 1003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P3 p3, \ 1004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P4 p4, \ 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P5 p5, \ 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P6 p6) { \ 1007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(p1, p2, p3, p4, p5, p6); \ 1008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P0(I) \ 1011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context) { \ 1012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context); \ 1013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(I, P1) \ 1016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1) { \ 1017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context, p1); \ 1018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(I, P1, P2) \ 1021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1, P2 p2) { \ 1022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context, p1, p2); \ 1023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(I, P1, P2, P3) \ 1026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, HValue* context, P1 p1, P2 p2, P3 p3) { \ 1027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context, p1, p2, p3); \ 1028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 10291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(I, P1, P2, P3, P4) \ 1031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, \ 1032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, \ 1033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P1 p1, \ 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P2 p2, \ 1035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P3 p3, \ 1036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P4 p4) { \ 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context, p1, p2, p3, p4); \ 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P5(I, P1, P2, P3, P4, P5) \ 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static I* New(Zone* zone, \ 1042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, \ 1043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P1 p1, \ 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P2 p2, \ 1045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P3 p3, \ 1046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P4 p4, \ 1047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch P5 p5) { \ 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) I(context, p1, p2, p3, p4, p5); \ 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1051e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// A helper class to represent per-operand position information attached to 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// the HInstruction in the compact form. Uses tagging to distinguish between 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// case when only instruction's position is available and case when operands' 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// positions are also available. 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// In the first case it contains intruction's position as a tagged value. 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// In the second case it points to an array which contains instruction's 1058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// position and operands' positions. 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPositionInfo { 1060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HPositionInfo(int pos) : data_(TagPosition(pos)) { } 10623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition position() const { 1064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_operand_positions()) { 1065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return operand_positions()[kInstructionPosIndex]; 1066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HSourcePosition(static_cast<int>(UntagPosition(data_))); 10683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_position(HSourcePosition pos) { 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_operand_positions()) { 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operand_positions()[kInstructionPosIndex] = pos; 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data_ = TagPosition(pos.raw()); 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ensure_storage_for_operand_positions(Zone* zone, int operand_count) { 1079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_operand_positions()) { 1080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1082e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const int length = kFirstOperandPosIndex + operand_count; 1084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition* positions = 1085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone->NewArray<HSourcePosition>(length); 1086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < length; i++) { 1087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch positions[i] = HSourcePosition::Unknown(); 1088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1089e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HSourcePosition pos = position(); 1091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch data_ = reinterpret_cast<intptr_t>(positions); 1092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_position(pos); 1093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_operand_positions()); 1095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition operand_position(int idx) const { 1098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!has_operand_positions()) { 1099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return position(); 1100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return *operand_position_slot(idx); 1102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_operand_position(int idx, HSourcePosition pos) { 1105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *operand_position_slot(idx) = pos; 1106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const intptr_t kInstructionPosIndex = 0; 1110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const intptr_t kFirstOperandPosIndex = 1; 1111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition* operand_position_slot(int idx) const { 1113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_operand_positions()); 1114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return &(operand_positions()[kFirstOperandPosIndex + idx]); 1115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_operand_positions() const { 1118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !IsTaggedPosition(data_); 1119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition* operand_positions() const { 1122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_operand_positions()); 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<HSourcePosition*>(data_); 1124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const intptr_t kPositionTag = 1; 1127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const intptr_t kPositionShift = 1; 1128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool IsTaggedPosition(intptr_t val) { 1129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (val & kPositionTag) != 0; 1130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static intptr_t UntagPosition(intptr_t val) { 1132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsTaggedPosition(val)); 1133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return val >> kPositionShift; 1134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static intptr_t TagPosition(intptr_t val) { 1136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const intptr_t result = (val << kPositionShift) | kPositionTag; 1137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(UntagPosition(result) == val); 1138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch intptr_t data_; 1142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstruction : public HValue { 1146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* next() const { return next_; } 1148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* previous() const { return previous_; } 1149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintTo(OStream& os) const OVERRIDE; // NOLINT 1151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const; // NOLINT 1152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsLinked() const { return block() != NULL; } 1154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Unlink(); 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InsertBefore(HInstruction* next); 1157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class T> T* Prepend(T* instr) { 1159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->InsertBefore(this); 1160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 1161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InsertAfter(HInstruction* previous); 1164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template<class T> T* Append(T* instr) { 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->InsertAfter(this); 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 1168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The position is a write-once variable. 1171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HSourcePosition position() const OVERRIDE { 1172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HSourcePosition(position_.position()); 1173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_position() const { 1175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !position().IsUnknown(); 1176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_position(HSourcePosition position) { 1178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!has_position()); 1179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!position.IsUnknown()); 1180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_.set_position(position); 1181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HSourcePosition operand_position(int index) const OVERRIDE { 1184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HSourcePosition pos = position_.operand_position(index); 1185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return pos.IsUnknown() ? position() : pos; 1186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_operand_position(Zone* zone, int index, HSourcePosition pos) { 1188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= index && index < OperandCount()); 1189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_.ensure_storage_for_operand_positions(zone, OperandCount()); 1190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_.set_operand_position(index, pos); 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool Dominates(HInstruction* other); 1194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanTruncateToSmi() const { return CheckFlag(kTruncatingToSmi); } 1195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanTruncateToInt32() const { return CheckFlag(kTruncatingToInt32); } 1196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual LInstruction* CompileToLithium(LChunkBuilder* builder) = 0; 1198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE; 1201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanDeoptimize(); 1204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasStackCheck() { return false; } 1206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_ABSTRACT_INSTRUCTION(Instruction) 1208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HInstruction(HType type = HType::Tagged()) 1211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HValue(type), 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_(NULL), 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch previous_(NULL), 1214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch position_(RelocInfo::kNoPosition) { 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kOsrEntries); 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void DeleteFromGraph() OVERRIDE { Unlink(); } 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InitializeAsFirst(HBasicBlock* block) { 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!IsLinked()); 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetBlock(block); 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* next_; 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* previous_; 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPositionInfo position_; 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HBasicBlock; 1231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<int V> 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTemplateInstruction : public HInstruction { 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const FINAL OVERRIDE { return V; } 1238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int i) const FINAL OVERRIDE { 1239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inputs_[i]; 1240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HTemplateInstruction(HType type = HType::Tagged()) 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HInstruction(type) {} 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE { 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inputs_[i] = value; 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch EmbeddedContainer<HValue*, V> inputs_; 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HControlInstruction : public HInstruction { 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HBasicBlock* SuccessorAt(int i) const = 0; 1258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int SuccessorCount() const = 0; 1259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetSuccessorAt(int i, HBasicBlock* block) = 0; 1260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) { 1264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *block = NULL; 1265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 1266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* FirstSuccessor() { 1269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SuccessorCount() > 0 ? SuccessorAt(0) : NULL; 1270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* SecondSuccessor() { 1272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return SuccessorCount() > 1 ? SuccessorAt(1) : NULL; 1273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Not() { 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* swap = SuccessorAt(0); 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(0, SuccessorAt(1)); 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(1, swap); 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_ABSTRACT_INSTRUCTION(ControlInstruction) 1282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSuccessorIterator FINAL BASE_EMBEDDED { 1286e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HSuccessorIterator(const HControlInstruction* instr) 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : instr_(instr), current_(0) {} 1289e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 12903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool Done() { return current_ >= instr_->SuccessorCount(); } 12913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* Current() { return instr_->SuccessorAt(current_); } 12923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Advance() { current_++; } 1293e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1294e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const HControlInstruction* instr_; 12963fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int current_; 1297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 1298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochtemplate<int S, int V> 1301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTemplateControlInstruction : public HControlInstruction { 1302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 1303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int SuccessorCount() const OVERRIDE { return S; } 1304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* SuccessorAt(int i) const OVERRIDE { return successors_[i]; } 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetSuccessorAt(int i, HBasicBlock* block) OVERRIDE { 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch successors_[i] = block; 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 13083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int OperandCount() const OVERRIDE { return V; } 1310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* OperandAt(int i) const OVERRIDE { return inputs_[i]; } 1311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 13123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1313e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 1314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InternalSetOperandAt(int i, HValue* value) OVERRIDE { 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inputs_[i] = value; 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1317e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1318e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch private: 13193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HBasicBlock*, S> successors_; 13203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch EmbeddedContainer<HValue*, V> inputs_; 1321e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 1322e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBlockEntry FINAL : public HTemplateInstruction<0> { 1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1329e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(BlockEntry) 1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 1332e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1333e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDummyUse FINAL : public HTemplateInstruction<1> { 13353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HDummyUse(HValue* value) 1337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<1>(HType::Smi()) { 1338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, value); 1339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Pretend to be a Smi so that the HChange instructions inserted 1340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before any use generate as little code as possible. 1341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 1342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 1345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 13483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::None(); 13493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 13503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DummyUse); 13543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 13553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 13563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Inserts an int3/stop break instruction for debugging purposes. 1358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDebugBreak FINAL : public HTemplateInstruction<0> { 1359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 1360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P0(HDebugBreak); 1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 13651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DebugBreak) 1367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 13683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 136944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HGoto FINAL : public HTemplateControlInstruction<1, 0> { 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HGoto(HBasicBlock* target) { 1373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(0, target); 137444f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 137544f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { 1377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *block = FirstSuccessor(); 1378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 1379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 138044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 138344f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 138444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 1385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Goto) 1388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDeoptimize FINAL : public HTemplateControlInstruction<1, 0> { 1392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HDeoptimize* New(Zone* zone, 1394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 1395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason, 1396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Deoptimizer::BailoutType type, 1397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* unreachable_continuation) { 1398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HDeoptimize(reason, type, unreachable_continuation); 13993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { 1402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *block = NULL; 1403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 1404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1407e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1408e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1409e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason() const { return reason_; } 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Deoptimizer::BailoutType type() { return type_; } 1412589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 1413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Deoptimize) 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HDeoptimize(const char* reason, 1417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Deoptimizer::BailoutType type, 1418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* unreachable_continuation) 1419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : reason_(reason), type_(type) { 1420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(0, unreachable_continuation); 1421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason_; 1424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Deoptimizer::BailoutType type_; 1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryControlInstruction : public HTemplateControlInstruction<2, 1> { 1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 14303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryControlInstruction(HValue* value, 14313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* true_target, 14323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HBasicBlock* false_target) { 1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 14343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(0, true_target); 14353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetSuccessorAt(1, false_target); 1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 1441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBranch FINAL : public HUnaryControlInstruction { 1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HBranch, HValue*); 1447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HBranch, HValue*, 1448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToBooleanStub::Types); 1449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HBranch, HValue*, 1450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToBooleanStub::Types, 1451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::None(); 1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE; 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 146269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types() const { 146369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch return expected_input_types_; 146469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch } 146569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 14663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Branch) 146769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 146869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch private: 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBranch(HValue* value, 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToBooleanStub::Types expected_input_types = ToBooleanStub::Types(), 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 1472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target), 1474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch expected_input_types_(expected_input_types) { 1475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 1476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 147869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch ToBooleanStub::Types expected_input_types_; 1479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareMap FINAL : public HUnaryControlInstruction { 1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HCompareMap, HValue*, Handle<Map>); 1485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HCompareMap, HValue*, Handle<Map>, 1486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE { 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (known_successor_index() != kNoKnownSuccessorIndex) { 1490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *block = SuccessorAt(known_successor_index()); 1491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 1492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *block = NULL; 1494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoKnownSuccessorIndex = -1; 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index() const { return known_successor_index_; } 1501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_known_successor_index(int known_successor_index) { 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_successor_index_ = known_successor_index; 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> map() const { return map_; } 1506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool map_is_stable() const { return map_is_stable_; } 1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1509e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1510e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareMap) 1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 1516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareMap(HValue* value, 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 1522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target), 1523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_successor_index_(kNoKnownSuccessorIndex), 1524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map_is_stable_(map->is_stable()), 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map_(Unique<Map>::CreateImmovable(map)) { 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index_ : 31; 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool map_is_stable_ : 1; 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> map_; 1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HContext FINAL : public HTemplateInstruction<0> { 1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HContext* New(Zone* zone) { 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HContext(); 15391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 1543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Context) 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 1549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HContext() { 1552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 1553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 1554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 1557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HReturn FINAL : public HTemplateControlInstruction<0, 3> { 1561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HReturn, HValue*, HValue*); 1563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HReturn, HValue*); 1564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(titzer): require an Int32 input for faster returns. 1567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 2) return Representation::Smi(); 1568e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 1569e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1570e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 15723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 1574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(1); } 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* parameter_count() const { return OperandAt(2); } 15763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1577257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Return) 1578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HReturn(HValue* context, HValue* value, HValue* parameter_count = 0) { 1581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, value); 1582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, context); 1583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, parameter_count); 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAbnormalExit FINAL : public HTemplateControlInstruction<0, 0> { 1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P0(HAbnormalExit); 1591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1593e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1594e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1596257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AbnormalExit) 1597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAbnormalExit() {} 1599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryOperation : public HTemplateInstruction<1> { 1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HUnaryOperation(HValue* value, HType type = HType::Tagged()) 1605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<1>(type) { 1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(0, value); 1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 16093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch static HUnaryOperation* cast(HValue* value) { 16103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return reinterpret_cast<HUnaryOperation*>(value); 16113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 16123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 1614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUseConst FINAL : public HUnaryOperation { 16191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HUseConst, HValue*); 16211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 16241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 16251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(UseConst) 16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HUseConst(HValue* old_value) : HUnaryOperation(old_value) { } 1630257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 1631257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1632257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForceRepresentation FINAL : public HTemplateInstruction<1> { 16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 1635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, HValue* context, HValue* value, 1636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation required_representation); 16373fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); // Same as the output representation. 16423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 16433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 16453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ForceRepresentation) 16473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HForceRepresentation(HValue* value, Representation required_representation) { 1650257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetOperandAt(0, value); 1651257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(required_representation); 1652257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 16531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 16541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 16551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HChange FINAL : public HUnaryOperation { 1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HChange(HValue* value, 1659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch Representation to, 1660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_truncating_to_smi, 1661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_truncating_to_int32) 16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch : HUnaryOperation(value) { 1663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!value->representation().IsNone()); 1664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!to.IsNone()); 1665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!value->representation().Equals(to)); 1666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(to); 1667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 1668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanOverflow); 1669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_truncating_to_smi && to.IsSmi()) { 1670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToSmi); 1671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToInt32); 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_truncating_to_int32) SetFlag(kTruncatingToInt32); 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->representation().IsSmi() || value->type().IsSmi()) { 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::Smi()); 1676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::TaggedNumber()); 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); 1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool can_convert_undefined_to_nan() { 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return CheckUsesForFlag(kAllowUndefinedAsNaN); 16843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE; 1687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation from() const { return value()->representation(); } 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation to() const { return representation(); } 16913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool deoptimize_on_minus_zero() const { 16923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return CheckFlag(kBailoutOnMinusZero); 16933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 16953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return from(); 1696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 169969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1702257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Change) 1703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !from().IsTagged() || value()->type().IsSmi(); 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HClampToUint8 FINAL : public HUnaryOperation { 1715257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HClampToUint8, HValue*); 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 1720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ClampToUint8) 1723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 1726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HClampToUint8(HValue* value) 1729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value) { 17303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch set_representation(Representation::Integer32()); 1731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 1732257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 1733257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1734257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDoubleBits FINAL : public HUnaryOperation { 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Bits { HIGH, LOW }; 1742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HDoubleBits, HValue*, Bits); 1743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Double(); 1746257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 1747257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 1748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DoubleBits) 1749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Bits bits() { return bits_; } 17513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 1753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 1754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other->IsDoubleBits() && HDoubleBits::cast(other)->bits() == bits(); 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HDoubleBits(HValue* value, Bits bits) 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value), bits_(bits) { 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Bits bits_; 17673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 17683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 17693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstructDouble FINAL : public HTemplateInstruction<2> { 1771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 1772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HConstructDouble, HValue*, HValue*); 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 1776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ConstructDouble) 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* hi() { return OperandAt(0); } 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* lo() { return OperandAt(1); } 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 1784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 1785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HConstructDouble(HValue* hi, HValue* lo) { 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Double()); 1789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 1790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, hi); 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, lo); 1792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum RemovableSimulate { 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch REMOVABLE_SIMULATE, 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FIXED_SIMULATE 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSimulate FINAL : public HInstruction { 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate(BailoutId ast_id, 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int pop_count, 1808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone, 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RemovableSimulate removable) 1810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : ast_id_(ast_id), 1811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pop_count_(pop_count), 1812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_(2, zone), 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assigned_indexes_(2, zone), 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone_(zone), 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch removable_(removable), 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch done_with_replay_(false) {} 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ~HSimulate() {} 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasAstId() const { return !ast_id_.IsNone(); } 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ast_id() const { return ast_id_; } 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_ast_id(BailoutId id) { 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!HasAstId()); 1825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ast_id_ = id; 1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1828b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count() const { return pop_count_; } 1829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch const ZoneList<HValue*>* values() const { return &values_; } 1830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int GetAssignedIndexAt(int index) const { 1831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasAssignedIndexAt(index)); 1832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index]; 1833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasAssignedIndexAt(int index) const { 1835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return assigned_indexes_[index] != kNoIndex; 1836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddAssignedValue(int index, HValue* value) { 1838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(index, value); 1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddPushedValue(HValue* value) { 1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch AddValue(kNoIndex, value); 1842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int ToOperandIndex(int environment_index) { 1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < assigned_indexes_.length(); ++i) { 1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (assigned_indexes_[i] == environment_index) return i; 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return -1; 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const OVERRIDE { return values_.length(); } 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int index) const OVERRIDE { 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return values_[index]; 1852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1853e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1856e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 1857e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MergeWith(ZoneList<HSimulate*>* list); 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_candidate_for_removal() { return removable_ == REMOVABLE_SIMULATE; } 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Replay effects of this instruction on the given environment. 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ReplayEnvironment(HEnvironment* env); 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1865257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Simulate) 1866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 1868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE; 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_closure(Handle<JSFunction> closure) { closure_ = closure; } 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> closure() const { return closure_; } 1871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 1872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE { 1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch values_[index] = value; 1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch static const int kNoIndex = -1; 1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddValue(int index, HValue* value) { 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch assigned_indexes_.Add(index, zone_); 1882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Resize the list of pushed values. 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_.Add(NULL, zone_); 1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Set the operand through the base method in HValue to make sure that the 1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // use lists are correctly updated. 1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetOperandAt(values_.length() - 1, value); 1887b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasValueForIndex(int index) { 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < assigned_indexes_.length(); ++i) { 1890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (assigned_indexes_[i] == index) return true; 1891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ast_id_; 1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int pop_count_; 1896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> values_; 1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<int> assigned_indexes_; 1898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone_; 1899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RemovableSimulate removable_ : 2; 1900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool done_with_replay_ : 1; 1901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> closure_; 1904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HEnvironmentMarker FINAL : public HTemplateInstruction<1> { 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 1910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Kind { BIND, LOOKUP }; 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HEnvironmentMarker, Kind, int); 1913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind() const { return kind_; } 1915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index() const { return index_; } 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* next_simulate() { return next_simulate_; } 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_next_simulate(HSimulate* simulate) { 1918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch next_simulate_ = simulate; 1919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 1922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 1923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 1926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_closure(Handle<JSFunction> closure) { 1929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(closure_.is_null()); 1930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!closure.is_null()); 1931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch closure_ = closure; 1932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> closure() const { return closure_; } 1934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(EnvironmentMarker); 1937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 1939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironmentMarker(Kind kind, int index) 1940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : kind_(kind), index_(index), next_simulate_(NULL) { } 1941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Kind kind_; 1943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index_; 1944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSimulate* next_simulate_; 1945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 1947b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> closure_; 1948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1951b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStackCheck FINAL : public HTemplateInstruction<1> { 1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 19543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch enum Type { 19553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kFunctionEntry, 19563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch kBackwardsBranch 19573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch }; 19583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HStackCheck, Type); 19603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 19643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 1965e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 1966e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 19673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch void Eliminate() { 19683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // The stack check eliminator might try to eliminate the same stack 19693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch // check instruction multiple times. 19703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch if (IsLinked()) { 1971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DeleteAndReplaceWith(NULL); 19723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 19733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 19743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_function_entry() { return type_ == kFunctionEntry; } 19763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch bool is_backwards_branch() { return type_ == kBackwardsBranch; } 19773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 1978257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StackCheck) 19793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 19803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 1981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStackCheck(HValue* context, Type type) : type_(type) { 1982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 1983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 1984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 19863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Type type_; 1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum InliningKind { 1991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NORMAL_RETURN, // Drop the function from the environment on return. 1992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CONSTRUCT_CALL_RETURN, // Either use allocated receiver or return value. 1993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch GETTER_CALL_RETURN, // Returning from a getter, need to restore context. 1994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SETTER_CALL_RETURN // Use the RHS of the assignment as the return value. 1995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 1996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsObject; 1999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstant; 2000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HEnterInlined FINAL : public HTemplateInstruction<0> { 2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HEnterInlined* New(Zone* zone, HValue* context, BailoutId return_id, 2005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> closure, 2006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* closure_context, int arguments_count, 2007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral* function, 2008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InliningKind inlining_kind, Variable* arguments_var, 2009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArgumentsObject* arguments_object) { 2010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new (zone) HEnterInlined(return_id, closure, closure_context, 2011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_count, function, inlining_kind, 2012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_var, arguments_object, zone); 2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void RegisterReturnTarget(HBasicBlock* return_target, Zone* zone); 2016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HBasicBlock*>* return_targets() { return &return_targets_; } 2017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure() const { return closure_; } 2021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* closure_context() const { return closure_context_; } 20223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int arguments_count() const { return arguments_count_; } 2023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool arguments_pushed() const { return arguments_pushed_; } 2024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_arguments_pushed() { arguments_pushed_ = true; } 2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function() const { return function_; } 2026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InliningKind inlining_kind() const { return inlining_kind_; } 2027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ReturnId() const { return return_id_; } 2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2030e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2031e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2032e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Variable* arguments_var() { return arguments_var_; } 2034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArgumentsObject* arguments_object() { return arguments_object_; } 20353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(EnterInlined) 2037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnterInlined(BailoutId return_id, Handle<JSFunction> closure, 2040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* closure_context, int arguments_count, 2041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionLiteral* function, InliningKind inlining_kind, 2042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Variable* arguments_var, HArgumentsObject* arguments_object, 2043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Zone* zone) 2044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : return_id_(return_id), 2045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch closure_(closure), 2046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch closure_context_(closure_context), 2047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_count_(arguments_count), 2048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_pushed_(false), 2049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch function_(function), 2050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inlining_kind_(inlining_kind), 2051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_var_(arguments_var), 2052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch arguments_object_(arguments_object), 2053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return_targets_(2, zone) {} 2054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId return_id_; 2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<JSFunction> closure_; 2057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* closure_context_; 20583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int arguments_count_; 2059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool arguments_pushed_; 2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch FunctionLiteral* function_; 2061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InliningKind inlining_kind_; 2062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Variable* arguments_var_; 2063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArgumentsObject* arguments_object_; 2064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HBasicBlock*> return_targets_; 2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLeaveInlined FINAL : public HTemplateInstruction<0> { 2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLeaveInlined(HEnterInlined* entry, 2071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int drop_count) 2072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : entry_(entry), 2073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch drop_count_(drop_count) { } 2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2076e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2077e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2078e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const OVERRIDE { 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return entry_->arguments_pushed() ? -drop_count_ : 0; 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2083257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LeaveInlined) 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnterInlined* entry_; 2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int drop_count_; 2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPushArguments FINAL : public HInstruction { 2092b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HPushArguments* New(Zone* zone, HValue* context) { 2094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HPushArguments(zone); 2095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1) { 2097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPushArguments* instr = new(zone) HPushArguments(zone); 2098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg1); 2099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 2100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, 2102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* arg2) { 2103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPushArguments* instr = new(zone) HPushArguments(zone); 2104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg1); 2105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg2); 2106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 2107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, 2109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* arg2, HValue* arg3) { 2110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPushArguments* instr = new(zone) HPushArguments(zone); 2111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg1); 2112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg2); 2113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg3); 2114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 2115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HPushArguments* New(Zone* zone, HValue* context, HValue* arg1, 2117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* arg2, HValue* arg3, HValue* arg4) { 2118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPushArguments* instr = new(zone) HPushArguments(zone); 2119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg1); 2120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg2); 2121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg3); 2122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instr->AddInput(arg4); 2123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr; 2124e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const OVERRIDE { return inputs_.length(); } 2131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* argument(int i) { return OperandAt(i); } 21321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const FINAL OVERRIDE { 2134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inputs_.length(); 21353fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 2136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int i) const FINAL OVERRIDE { 2137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inputs_[i]; 21383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 21393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddInput(HValue* value); 21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(PushArguments) 21433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 21443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch protected: 2145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InternalSetOperandAt(int i, HValue* value) FINAL OVERRIDE { 2146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inputs_[i] = value; 21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 2150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HPushArguments(Zone* zone) 2151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HInstruction(HType::Tagged()), inputs_(4, zone) { 2152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 2153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HValue*> inputs_; 21563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 21573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 21583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HThisFunction FINAL : public HTemplateInstruction<0> { 21601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 2161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P0(HThisFunction); 21621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 2165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ThisFunction) 21681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 2171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HThisFunction() { 21741e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block set_representation(Representation::Tagged()); 21751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 21761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 21771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 21791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 21801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 21811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDeclareGlobals FINAL : public HUnaryOperation { 21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 2184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HDeclareGlobals, 2185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray>, 2186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int); 21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Handle<FixedArray> pairs() const { return pairs_; } 21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int flags() const { return flags_; } 21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals) 21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2195e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2196e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2197e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HDeclareGlobals(HValue* context, 2200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> pairs, 2201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int flags) 2202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(context), 2203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pairs_(pairs), 2204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_(flags) { 2205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 2207e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2208e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> pairs_; 2210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int flags_; 2211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2214e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochtemplate <int V> 2215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCall : public HTemplateInstruction<V> { 2216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 22171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block // The argument count includes the receiver. 2218e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch explicit HCall<V>(int argument_count) : argument_count_(argument_count) { 2219e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->set_representation(Representation::Tagged()); 2220e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch this->SetAllSideEffects(); 22211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 2222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() FINAL OVERRIDE { 2224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::Tagged(); 2225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_count() const { 2228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return argument_count_; 2229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const OVERRIDE { 2232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return -argument_count(); 2233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 22341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 22361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int argument_count_; 22371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 22381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryCall : public HCall<1> { 22411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 22421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HUnaryCall(HValue* value, int argument_count) 2243e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<1>(argument_count) { 22441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, value); 22451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 22461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation( 2248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) FINAL OVERRIDE { 2249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 22511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 22531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 22551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 22561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 22571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBinaryCall : public HCall<2> { 22591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 22601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HBinaryCall(HValue* first, HValue* second, int argument_count) 2261e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch : HCall<2>(argument_count) { 22621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(0, first); 22631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetOperandAt(1, second); 2264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation( 2269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) FINAL OVERRIDE { 2270e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 2271e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 22721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* first() const { return OperandAt(0); } 2274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* second() const { return OperandAt(1); } 2275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 2276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 22771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallJSFunction FINAL : public HCall<1> { 2279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCallJSFunction* New(Zone* zone, 2281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 2282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 2283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count, 2284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pass_argument_count); 2285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() const { return OperandAt(0); } 2287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 22891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation( 2291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) FINAL OVERRIDE { 2292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index == 0); 2293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 2294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pass_argument_count() const { return pass_argument_count_; } 2297e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasStackCheck() FINAL OVERRIDE { 2299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return has_stack_check_; 2300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallJSFunction) 2303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The argument count includes the receiver. 2306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallJSFunction(HValue* function, 2307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count, 2308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pass_argument_count, 2309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_stack_check) 2310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HCall<1>(argument_count), 2311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pass_argument_count_(pass_argument_count), 2312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_stack_check_(has_stack_check) { 2313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, function); 2314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pass_argument_count_; 2317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_stack_check_; 2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallWithDescriptor FINAL : public HInstruction { 2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCallWithDescriptor* New(Zone* zone, HValue* context, HValue* target, 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count, 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor, 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Vector<HValue*>& operands) { 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(operands.length() == descriptor.GetEnvironmentLength()); 2328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor* res = new (zone) 2329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor(target, argument_count, descriptor, operands, zone); 2330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return res; 2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const FINAL OVERRIDE { 2334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return values_.length(); 2335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int index) const FINAL OVERRIDE { 2337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return values_[index]; 23381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 23391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation( 2341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) FINAL OVERRIDE { 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) { 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int par_index = index - 1; 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(par_index < descriptor_.GetEnvironmentLength()); 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return descriptor_.GetParameterRepresentation(par_index); 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor) 2352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() FINAL OVERRIDE { 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::Tagged(); 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_count() const { 2358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return argument_count_; 2359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const OVERRIDE { 2362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return -argument_count_; 2363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor() const { return descriptor_; } 2366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* target() { 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OperandAt(0); 23691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 23701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2372e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The argument count includes the receiver. 2375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallWithDescriptor(HValue* target, int argument_count, 2376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor, 2377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Vector<HValue*>& operands, Zone* zone) 2378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : descriptor_(descriptor), 2379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_(descriptor.GetEnvironmentLength() + 1, zone) { 2380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch argument_count_ = argument_count; 2381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddOperand(target, zone); 2382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < operands.length(); i++) { 2383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AddOperand(operands[i], zone); 2384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->set_representation(Representation::Tagged()); 2386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->SetAllSideEffects(); 2387e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddOperand(HValue* v, Zone* zone) { 2390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_.Add(NULL, zone); 2391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(values_.length() - 1, v); 2392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void InternalSetOperandAt(int index, 2395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value) FINAL OVERRIDE { 2396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_[index] = value; 2397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallInterfaceDescriptor descriptor_; 2400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HValue*> values_; 2401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count_; 2402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInvokeFunction FINAL : public HBinaryCall { 2406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInvokeFunction, HValue*, int); 2408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInvokeFunction(HValue* context, 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 2411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> known_function, 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count) 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryCall(context, function, argument_count), 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_function_(known_function) { 2415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch formal_parameter_count_ = known_function.is_null() 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? 0 : known_function->shared()->formal_parameter_count(); 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_stack_check_ = !known_function.is_null() && 2418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (known_function->code()->kind() == Code::FUNCTION || 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_function->code()->kind() == Code::OPTIMIZED_FUNCTION); 24201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 2421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInvokeFunction* New(Zone* zone, 2423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 2424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 2425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> known_function, 2426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count) { 2427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HInvokeFunction(context, function, 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_function, argument_count); 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() { return first(); } 2432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() { return second(); } 2433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> known_function() { return known_function_; } 2434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int formal_parameter_count() const { return formal_parameter_count_; } 2435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasStackCheck() FINAL OVERRIDE { 2437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return has_stack_check_; 2438e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2439e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(InvokeFunction) 2441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInvokeFunction(HValue* context, HValue* function, int argument_count) 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryCall(context, function, argument_count), 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_stack_check_(false) { 2446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> known_function_; 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int formal_parameter_count_; 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_stack_check_; 2451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallFunction FINAL : public HBinaryCall { 2455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallFunction, HValue*, int); 2457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3( 2458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallFunction, HValue*, int, CallFunctionFlags); 24591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() { return first(); } 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() { return second(); } 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallFunctionFlags function_flags() const { return function_flags_; } 2463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallFunction) 2465e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int argument_delta() const OVERRIDE { return -argument_count(); } 2467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallFunction(HValue* context, 2470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 2471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count, 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallFunctionFlags flags = NO_CALL_FUNCTION_FLAGS) 2473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryCall(context, function, argument_count), function_flags_(flags) { 2474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CallFunctionFlags function_flags_; 2476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallNew FINAL : public HBinaryCall { 2480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallNew, HValue*, int); 2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() { return first(); } 2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* constructor() { return second(); } 2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNew) 2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 24891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block HCallNew(HValue* context, HValue* constructor, int argument_count) 2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryCall(context, constructor, argument_count) {} 2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallNewArray FINAL : public HBinaryCall { 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallNewArray, 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int, 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind); 2500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return first(); } 2502e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* constructor() { return second(); } 2503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind() const { return elements_kind_; } 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallNewArray) 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallNewArray(HValue* context, HValue* constructor, int argument_count, 2512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind) 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryCall(context, constructor, argument_count), 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind_(elements_kind) {} 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind_; 2517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallRuntime FINAL : public HCall<1> { 2521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCallRuntime, 2523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>, 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Runtime::Function*, 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int); 25263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 25293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 253044f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* function() const { return c_function_; } 2531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name() const { return name_; } 2532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SaveFPRegsMode save_doubles() const { return save_doubles_; } 2533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_save_doubles(SaveFPRegsMode save_doubles) { 2534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch save_doubles_ = save_doubles; 2535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 25383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 2539e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 2540e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 2541257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CallRuntime) 2542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallRuntime(HValue* context, 2545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name, 2546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Runtime::Function* c_function, 2547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int argument_count) 2548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HCall<1>(argument_count), c_function_(c_function), name_(name), 2549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch save_doubles_(kDontSaveFPRegs) { 2550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 2551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 255344f0eee88ff00398ff7f715fab053374d808c90dSteve Block const Runtime::Function* c_function_; 2554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> name_; 2555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SaveFPRegsMode save_doubles_; 2556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMapEnumLength FINAL : public HUnaryOperation { 2560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HMapEnumLength, HValue*); 2562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(MapEnumLength) 25681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 25691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 25719fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 2572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HMapEnumLength(HValue* value) 2574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value, HType::Smi()) { 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Smi()); 25769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block SetFlag(kUseGVN); 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 25789fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 25799fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 2581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnaryMathOperation FINAL : public HTemplateInstruction<2> { 25853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch public: 2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 2587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 2588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 2589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BuiltinFunctionId op); 25903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 2592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 25933fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 25953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) { 2598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 2599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (op_) { 2601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFloor: 2602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathRound: 2603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 2604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathSqrt: 2605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathPowHalf: 2606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 2607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 2608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Double(); 2609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathAbs: 2610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 2611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 2612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 2613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 2614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 2616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 26193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 26213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 2623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromUses() OVERRIDE; 2624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() OVERRIDE; 2625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BuiltinFunctionId op() const { return op_; } 2627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* OpName() const; 2628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(UnaryMathOperation) 26301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 26311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 2633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HUnaryMathOperation* b = HUnaryMathOperation::cast(other); 2634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return op_ == b->op(); 2635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Indicates if we support a double (and int32) output for Math.floor and 2639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Math.round. 2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool SupportsFlexibleFloorAndRound() const { 2641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef V8_TARGET_ARCH_ARM64 2642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 2643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#else 2644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 2645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 2646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 26473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HUnaryMathOperation(HValue* context, HValue* value, BuiltinFunctionId op) 2648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::TaggedNumber()), op_(op) { 26493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 26503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 2651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch switch (op) { 2652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathFloor: 2653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathRound: 2654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SupportsFlexibleFloorAndRound()) { 2655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kFlexibleRepresentation); 2656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 2658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch break; 2660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathClz32: 2661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Integer32()); 2662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 2663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathAbs: 2664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Not setting representation here: it is None intentionally. 2665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 2666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(svenpanne) This flag is actually only needed if representation() 2667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is tagged, and not when it is an unboxed double or unboxed integer. 2668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 2669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 2670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathFround: 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathLog: 2672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kMathExp: 2673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathSqrt: 2674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch case kMathPowHalf: 2675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Double()); 2676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch break; 2677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch default: 2678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch UNREACHABLE(); 2679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 2682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 26853fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* SimplifiedDividendForMathFloorOfDiv(HDiv* hdiv); 2687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* SimplifiedDivisorForMathFloorOfDiv(HDiv* hdiv); 2688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BuiltinFunctionId op_; 2690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 2691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadRoot FINAL : public HTemplateInstruction<0> { 2694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 2695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HLoadRoot, Heap::RootListIndex); 2696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HLoadRoot, Heap::RootListIndex, HType); 2697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 2700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap::RootListIndex index() const { return index_; } 2703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadRoot) 2705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 2708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadRoot* b = HLoadRoot::cast(other); 2709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index_ == b->index_; 2710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HLoadRoot(Heap::RootListIndex index, HType type = HType::Tagged()) 2714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<0>(type), index_(index) { 2715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 2716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(bmeurer): We'll need kDependsOnRoots once we add the 2717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // corresponding HStoreRoot instruction. 2718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kCalls); 2719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 2722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Heap::RootListIndex index_; 2724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckMaps FINAL : public HTemplateInstruction<2> { 2728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckMaps* New(Zone* zone, HValue* context, HValue* value, 2730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, HValue* typecheck = NULL) { 2731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HCheckMaps(value, new(zone) UniqueSet<Map>( 2732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map>::CreateImmovable(map), zone), typecheck); 2733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckMaps* New(Zone* zone, HValue* context, 2735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, SmallMapList* map_list, 2736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* typecheck = NULL) { 2737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UniqueSet<Map>* maps = new(zone) UniqueSet<Map>(map_list->length(), zone); 2738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < map_list->length(); ++i) { 2739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch maps->Add(Unique<Map>::CreateImmovable(map_list->at(i)), zone); 2740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HCheckMaps(value, maps, typecheck); 2742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsStabilityCheck() const { return is_stability_check_; } 2745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MarkAsStabilityCheck() { 2746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch maps_are_stable_ = true; 2747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_migration_target_ = false; 2748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_stability_check_ = true; 2749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearChangesFlag(kNewSpacePromotion); 2750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearDependsOnFlag(kElementsKind); 2751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearDependsOnFlag(kMaps); 2752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } 2755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 2760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value()->type().IsHeapObject()) return value()->type(); 2761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::HeapObject(); 2762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 27651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 2767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* typecheck() const { return OperandAt(1); } 27681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps() const { return maps_; } 2770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_maps(const UniqueSet<Map>* maps) { maps_ = maps; } 27711e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool maps_are_stable() const { return maps_are_stable_; } 2773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMigrationTarget() const { return has_migration_target_; } 2775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 2777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckMaps* CreateAndInsertAfter(Zone* zone, 2779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 2780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> map, 2781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool map_is_stable, 2782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instr) { 2783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr->Append(new(zone) HCheckMaps( 2784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value, new(zone) UniqueSet<Map>(map, zone), map_is_stable)); 27851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 27861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckMaps* CreateAndInsertBefore(Zone* zone, 2788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 2789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps, 2790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool maps_are_stable, 2791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instr) { 2792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instr->Prepend(new(zone) HCheckMaps(value, maps, maps_are_stable)); 27931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 27941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 2795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMaps) 27961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 27971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 2799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->maps()->Equals(HCheckMaps::cast(other)->maps()); 2800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 2803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckMaps(HValue* value, const UniqueSet<Map>* maps, bool maps_are_stable) 2806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), 2807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_migration_target_(false), is_stability_check_(false), 2808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch maps_are_stable_(maps_are_stable) { 2809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NE(0, maps->size()); 281069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch SetOperandAt(0, value); 2811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the object value for the dependency. 2812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, value); 2813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 2814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 2815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 2816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kElementsKind); 2817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckMaps(HValue* value, const UniqueSet<Map>* maps, HValue* typecheck) 2820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::HeapObject()), maps_(maps), 2821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_migration_target_(false), is_stability_check_(false), 2822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch maps_are_stable_(true) { 2823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NE(0, maps->size()); 2824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, value); 2825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Use the object value for the dependency if NULL is passed. 2826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, typecheck ? typecheck : value); 2827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 2828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 2829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 2830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kElementsKind); 2831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < maps->size(); ++i) { 2832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = maps->at(i).handle(); 2833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (map->is_migration_target()) has_migration_target_ = true; 2834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!map->is_stable()) maps_are_stable_ = false; 2835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_migration_target_) SetChangesFlag(kNewSpacePromotion); 2837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps_; 2840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_migration_target_ : 1; 2841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_stability_check_ : 1; 2842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool maps_are_stable_ : 1; 2843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2844b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckValue FINAL : public HUnaryOperation { 2847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckValue* New(Zone* zone, HValue* context, 2849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, Handle<JSFunction> func) { 2850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool in_new_space = zone->isolate()->heap()->InNewSpace(*func); 2851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // NOTE: We create an uninitialized Unique and initialize it later. 2852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is because a JSFunction can move due to GC during graph creation. 2853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(titzer): This is a migration crutch. Replace with some kind of 2854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Uniqueness scope later. 2855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<JSFunction> target = Unique<JSFunction>::CreateUninitialized(func); 2856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckValue* check = new(zone) HCheckValue(value, target, in_new_space); 2857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return check; 2858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HCheckValue* New(Zone* zone, HValue* context, 2860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, Unique<HeapObject> target, 2861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool object_in_new_space) { 2862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HCheckValue(value, target, object_in_new_space); 2863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() OVERRIDE { 2866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_ = Unique<HeapObject>(object_.handle()); 2867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 2875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 2877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE; 2878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 2879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<HeapObject> object() const { return object_; } 2881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool object_in_new_space() const { return object_in_new_space_; } 2882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckValue) 2884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 2887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckValue* b = HCheckValue::cast(other); 2888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_ == b->object_; 2889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckValue(HValue* value, Unique<HeapObject> object, 2893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool object_in_new_space) 2894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value, value->type()), 2895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_(object), 2896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_in_new_space_(object_in_new_space) { 2897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 2898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 2899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<HeapObject> object_; 2902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool object_in_new_space_; 2903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckInstanceType FINAL : public HUnaryOperation { 2907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Check { 2909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IS_SPEC_OBJECT, 2910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IS_JS_ARRAY, 2911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IS_STRING, 2912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IS_INTERNALIZED_STRING, 2913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LAST_INTERVAL_CHECK = IS_JS_ARRAY 2914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 2915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HCheckInstanceType, HValue*, Check); 29173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 2919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 2925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (check_) { 2926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IS_SPEC_OBJECT: return HType::JSObject(); 2927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IS_JS_ARRAY: return HType::JSArray(); 2928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IS_STRING: return HType::String(); 2929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case IS_INTERNALIZED_STRING: return HType::String(); 2930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::Tagged(); 2933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 2936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool is_interval_check() const { return check_ <= LAST_INTERVAL_CHECK; } 2938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckInterval(InstanceType* first, InstanceType* last); 2939257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch void GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag); 2940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Check check() const { return check_; } 2942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType) 2944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 2946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // TODO(ager): It could be nice to allow the ommision of instance 2947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // type checks if we have already performed an instance type check 2948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // with a larger range. 2949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 2950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch HCheckInstanceType* b = HCheckInstanceType::cast(other); 2951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return check_ == b->check_; 2952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 2955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 2957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* GetCheckName() const; 29583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HCheckInstanceType(HValue* value, Check check) 2960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value, HType::HeapObject()), check_(check) { 2961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch set_representation(Representation::Tagged()); 2962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 2963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2965257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch const Check check_; 2966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckSmi FINAL : public HUnaryOperation { 2970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 2971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HCheckSmi, HValue*); 2972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 2974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 2975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 2976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE { 2978257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch HType value_type = value()->type(); 2979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value_type.IsSmi()) { 2980257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NULL; 2981257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2982257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return this; 2983257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 2984257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 2985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckSmi) 29861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 29871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 2988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 2989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 2991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HCheckSmi(HValue* value) : HUnaryOperation(value, HType::Smi()) { 2992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Smi()); 2993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 2994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 2996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 2998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckHeapObject FINAL : public HUnaryOperation { 2999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HCheckHeapObject, HValue*); 3001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } 3003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 3005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 3008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value()->type().IsHeapObject()) return value()->type(); 3009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::HeapObject(); 3010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 3013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE; 3014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 3015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE { 3017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value()->type().IsHeapObject() ? NULL : this; 3018e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3019e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckHeapObject) 3021b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 3022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 3024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HCheckHeapObject(HValue* value) : HUnaryOperation(value) { 3027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 3029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass InductionVariableData; 3034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 30351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstruct InductionVariableLimitUpdate { 3037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableData* updated_variable; 3038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* limit; 3039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool limit_is_upper; 3040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool limit_is_included; 3041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableLimitUpdate() 3043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : updated_variable(NULL), limit(NULL), 3044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch limit_is_upper(false), limit_is_included(false) {} 3045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheck; 3049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPhi; 3050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwise; 3051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass InductionVariableData FINAL : public ZoneObject { 3054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class InductionVariableCheck : public ZoneObject { 3056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck* check() { return check_; } 3058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck* next() { return next_; } 3059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasUpperLimit() { return upper_limit_ >= 0; } 3060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t upper_limit() { 3061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasUpperLimit()); 3062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return upper_limit_; 3063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_upper_limit(int32_t upper_limit) { 3065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch upper_limit_ = upper_limit; 3066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool processed() { return processed_; } 3069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_processed() { processed_ = true; } 3070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck(HBoundsCheck* check, 3072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck* next, 3073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t upper_limit = kNoLimit) 3074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : check_(check), next_(next), upper_limit_(upper_limit), 3075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch processed_(false) {} 3076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck* check_; 3079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck* next_; 3080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t upper_limit_; 3081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool processed_; 3082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ChecksRelatedToLength : public ZoneObject { 3085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* length() { return length_; } 3087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChecksRelatedToLength* next() { return next_; } 3088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck* checks() { return checks_; } 3089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCheck(HBoundsCheck* check, int32_t upper_limit = kNoLimit); 3091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CloseCurrentBlock(); 3092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChecksRelatedToLength(HValue* length, ChecksRelatedToLength* next) 3094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : length_(length), next_(next), checks_(NULL), 3095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch first_check_in_block_(NULL), 3096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch added_index_(NULL), 3097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch added_constant_(NULL), 3098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch current_and_mask_in_block_(0), 3099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch current_or_mask_in_block_(0) {} 3100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UseNewIndexInCurrentBlock(Token::Value token, 3103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t mask, 3104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index_base, 3105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context); 3106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck* first_check_in_block() { return first_check_in_block_; } 3108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwise* added_index() { return added_index_; } 3109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_added_index(HBitwise* index) { added_index_ = index; } 3110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* added_constant() { return added_constant_; } 3111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_added_constant(HConstant* constant) { added_constant_ = constant; } 3112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_and_mask_in_block() { return current_and_mask_in_block_; } 3113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_or_mask_in_block() { return current_or_mask_in_block_; } 3114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_upper_limit() { return current_upper_limit_; } 3115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* length_; 3117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChecksRelatedToLength* next_; 3118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableCheck* checks_; 3119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck* first_check_in_block_; 3121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwise* added_index_; 3122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* added_constant_; 3123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_and_mask_in_block_; 3124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_or_mask_in_block_; 3125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t current_upper_limit_; 3126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct LimitFromPredecessorBlock { 3129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableData* variable; 3130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value token; 3131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* limit; 3132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* other_target; 3133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool LimitIsValid() { return token != Token::ILLEGAL; } 3135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool LimitIsIncluded() { 3137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Token::IsEqualityOp(token) || 3138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch token == Token::GTE || token == Token::LTE; 3139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool LimitIsUpper() { 3141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return token == Token::LTE || token == Token::LT || token == Token::NE; 3142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LimitFromPredecessorBlock() 3145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : variable(NULL), 3146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch token(Token::ILLEGAL), 3147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch limit(NULL), 3148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch other_target(NULL) {} 3149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int32_t kNoLimit = -1; 3152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static InductionVariableData* ExaminePhi(HPhi* phi); 3154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void ComputeLimitFromPredecessorBlock( 3155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block, 3156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LimitFromPredecessorBlock* result); 3157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool ComputeInductionVariableLimit( 3158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* block, 3159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableLimitUpdate* additional_limit); 3160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch struct BitwiseDecompositionResult { 3162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base; 3163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t and_mask; 3164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t or_mask; 3165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context; 3166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitwiseDecompositionResult() 3168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : base(NULL), and_mask(0), or_mask(0), context(NULL) {} 3169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 3170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static void DecomposeBitwise(HValue* value, 3171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BitwiseDecompositionResult* result); 3172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddCheck(HBoundsCheck* check, int32_t upper_limit = kNoLimit); 3174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CheckIfBranchIsLoopGuard(Token::Value token, 3176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* current_branch, 3177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* other_branch); 3178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateAdditionalLimit(InductionVariableLimitUpdate* update); 3180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPhi* phi() { return phi_; } 3182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base() { return base_; } 3183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t increment() { return increment_; } 3184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* limit() { return limit_; } 3185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool limit_included() { return limit_included_; } 3186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* limit_validity() { return limit_validity_; } 3187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* induction_exit_block() { return induction_exit_block_; } 3188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* induction_exit_target() { return induction_exit_target_; } 3189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChecksRelatedToLength* checks() { return checks_; } 3190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* additional_upper_limit() { return additional_upper_limit_; } 3191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool additional_upper_limit_is_included() { 3192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return additional_upper_limit_is_included_; 3193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* additional_lower_limit() { return additional_lower_limit_; } 3195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool additional_lower_limit_is_included() { 3196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return additional_lower_limit_is_included_; 3197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool LowerLimitIsNonNegativeConstant() { 3200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (base()->IsInteger32Constant() && base()->GetInteger32Constant() >= 0) { 3201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 3202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (additional_lower_limit() != NULL && 3204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_lower_limit()->IsInteger32Constant() && 3205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_lower_limit()->GetInteger32Constant() >= 0) { 3206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ignoring the corner case of !additional_lower_limit_is_included() 3207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // is safe, handling it adds unneeded complexity. 3208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 3209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 3211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t ComputeUpperLimit(int32_t and_mask, int32_t or_mask); 3214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch template <class T> void swap(T* a, T* b) { 3217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T c(*a); 3218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *a = *b; 3219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *b = c; 3220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableData(HPhi* phi, HValue* base, int32_t increment) 3223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : phi_(phi), base_(IgnoreOsrValue(base)), increment_(increment), 3224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch limit_(NULL), limit_included_(false), limit_validity_(NULL), 3225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch induction_exit_block_(NULL), induction_exit_target_(NULL), 3226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch checks_(NULL), 3227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_upper_limit_(NULL), 3228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_upper_limit_is_included_(false), 3229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_lower_limit_(NULL), 3230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch additional_lower_limit_is_included_(false) {} 3231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static int32_t ComputeIncrement(HPhi* phi, HValue* phi_operand); 3233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HValue* IgnoreOsrValue(HValue* v); 3235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static InductionVariableData* GetInductionVariableData(HValue* v); 3236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPhi* phi_; 3238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base_; 3239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t increment_; 3240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* limit_; 3241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool limit_included_; 3242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* limit_validity_; 3243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* induction_exit_block_; 3244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* induction_exit_target_; 3245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChecksRelatedToLength* checks_; 3246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* additional_upper_limit_; 3247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool additional_upper_limit_is_included_; 3248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* additional_lower_limit_; 3249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool additional_lower_limit_is_included_; 3250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPhi FINAL : public HValue { 3254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPhi(int merged_index, Zone* zone) 3256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : inputs_(2, zone), 3257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch merged_index_(merged_index), 325844f0eee88ff00398ff7f715fab053374d808c90dSteve Block phi_id_(-1), 3259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch induction_variable_data_(NULL) { 3260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch for (int i = 0; i < Representation::kNumRepresentations; i++) { 3261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch non_phi_uses_[i] = 0; 3262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch indirect_uses_[i] = 0; 3263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(merged_index >= 0 || merged_index == kInvalidMergedIndex); 3265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kFlexibleRepresentation); 3266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 3267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() OVERRIDE; 3270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 3272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 3273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 3274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return representation(); 3276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation KnownOptimalRepresentation() OVERRIDE { 3278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 3279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE; 3281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const OVERRIDE { return inputs_.length(); } 3282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int index) const OVERRIDE { 3283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return inputs_[index]; 3284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3285e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* GetRedundantReplacement(); 3286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddInput(HValue* value); 328744f0eee88ff00398ff7f715fab053374d808c90dSteve Block bool HasRealUses(); 3288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsReceiver() const { return merged_index_ == 0; } 3290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMergedIndex() const { return merged_index_ != kInvalidMergedIndex; } 3291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HSourcePosition position() const OVERRIDE; 3293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index() const { return merged_index_; } 3295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableData* induction_variable_data() { 3297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return induction_variable_data_; 3298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsInductionVariable() { 3300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return induction_variable_data_ != NULL; 3301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsLimitedInductionVariable() { 3303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsInductionVariable() && 3304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch induction_variable_data_->limit() != NULL; 3305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void DetectInductionVariable() { 3307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(induction_variable_data_ == NULL); 3308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch induction_variable_data_ = InductionVariableData::ExaminePhi(this); 3309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintTo(OStream& os) const OVERRIDE; // NOLINT 3312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 3314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE; 3315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 3316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void InitRealUses(int id); 3318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddNonPhiUsesFrom(HPhi* other); 3319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch void AddIndirectUsesTo(int* use_count); 3320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_non_phi_uses() const { 3322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kTagged]; 3323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int smi_non_phi_uses() const { 3325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return non_phi_uses_[Representation::kSmi]; 3326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_non_phi_uses() const { 3328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kInteger32]; 3329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_non_phi_uses() const { 3331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return non_phi_uses_[Representation::kDouble]; 3332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int tagged_indirect_uses() const { 3334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kTagged]; 3335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int smi_indirect_uses() const { 3337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return indirect_uses_[Representation::kSmi]; 3338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int int32_indirect_uses() const { 3340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kInteger32]; 3341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int double_indirect_uses() const { 3343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return indirect_uses_[Representation::kDouble]; 3344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id() { return phi_id_; } 3346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3347257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch static HPhi* cast(HValue* value) { 3348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->IsPhi()); 3349257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return reinterpret_cast<HPhi*>(value); 3350257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Opcode opcode() const OVERRIDE { return HValue::kPhi; } 3352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SimplifyConstantInputs(); 3354257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Marker value representing an invalid merge index. 3356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kInvalidMergedIndex = -1; 3357589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch 3358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void DeleteFromGraph() OVERRIDE; 3360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InternalSetOperandAt(int index, HValue* value) OVERRIDE { 3361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch inputs_[index] = value; 3362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ZoneList<HValue*> inputs_; 3366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int merged_index_; 3367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int non_phi_uses_[Representation::kNumRepresentations]; 3369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int indirect_uses_[Representation::kNumRepresentations]; 3370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int phi_id_; 3371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InductionVariableData* induction_variable_data_; 3372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(titzer): we can't eliminate the receiver for generating backtraces 3374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return !IsReceiver(); } 3375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Common base class for HArgumentsObject and HCapturedObject. 3379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDematerializedObject : public HInstruction { 3380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HDematerializedObject(int count, Zone* zone) : values_(count, zone) {} 3382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int OperandCount() const FINAL OVERRIDE { 3384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return values_.length(); 3385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* OperandAt(int index) const FINAL OVERRIDE { 3387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return values_[index]; 3388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) FINAL OVERRIDE { 3391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 3392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation( 3394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index) FINAL OVERRIDE { 3395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3397e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 3399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InternalSetOperandAt(int index, 3400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value) FINAL OVERRIDE { 3401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_[index] = value; 3402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // List of values tracked by this marker. 3405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ZoneList<HValue*> values_; 3406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsObject FINAL : public HDematerializedObject { 3410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HArgumentsObject* New(Zone* zone, HValue* context, int count) { 3412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HArgumentsObject(count, zone); 3413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The values contain a list of all elements in the arguments object 3416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // including the receiver object, which is skipped when materializing. 3417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const ZoneList<HValue*>* arguments_values() const { return &values_; } 3418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int arguments_count() const { return values_.length(); } 3419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void AddArgument(HValue* argument, Zone* zone) { 3421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_.Add(NULL, zone); // Resize list. 3422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(values_.length() - 1, argument); 3423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3425257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsObject) 3426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArgumentsObject(int count, Zone* zone) 3429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HDematerializedObject(count, zone) { 3430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 3431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kIsArguments); 3432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCapturedObject FINAL : public HDematerializedObject { 3437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCapturedObject(int length, int id, Zone* zone) 3439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HDematerializedObject(length, zone), capture_id_(id) { 3440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 3441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch values_.AddBlock(NULL, length, zone); // Resize list. 3442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The values contain a list of all in-object properties inside the 3445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // captured object and is index by field index. Properties in the 3446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // properties or elements backing store are not tracked here. 3447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const ZoneList<HValue*>* values() const { return &values_; } 3448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length() const { return values_.length(); } 3449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int capture_id() const { return capture_id_; } 3450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Shortcut for the map value of this captured object. 3452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* map_value() const { return values()->first(); } 34539fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 3454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ReuseSideEffectsFromStore(HInstruction* store) { 3455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(store->HasObservableSideEffects()); 3456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(store->IsStoreNamedField()); 3457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch changes_flags_.Add(store->ChangesFlags()); 34583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 34593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Replay effects of this instruction on the given environment. 3461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ReplayEnvironment(HEnvironment* env); 3462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 3464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CapturedObject) 3466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int capture_id_; 3469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that we cannot DCE captured objects as they are used to replay 3471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // the environment. This method is here as an explicit reminder. 3472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(mstarzinger): Turn HSimulates into full snapshots maybe? 3473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const FINAL OVERRIDE { return false; } 3474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HConstant FINAL : public HTemplateInstruction<0> { 3478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HConstant, int32_t); 3480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HConstant, int32_t, Representation); 3481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HConstant, double); 3482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HConstant, Handle<Object>); 3483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HConstant, ExternalReference); 3484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HConstant* CreateAndInsertAfter(Zone* zone, 3486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 3487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t value, 3488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation, 3489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instruction) { 3490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instruction->Append(HConstant::New( 3491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone, context, value, representation)); 3492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Handle<Map> GetMonomorphicJSObjectMap() OVERRIDE { 3495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> object = object_.handle(); 3496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!object.is_null() && object->IsHeapObject()) { 3497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return v8::internal::handle(HeapObject::cast(*object)->map()); 3498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Map>(); 3500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HConstant* CreateAndInsertBefore(Zone* zone, 3503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 3504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t value, 3505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation, 3506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instruction) { 3507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instruction->Prepend(HConstant::New( 3508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch zone, context, value, representation)); 3509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HConstant* CreateAndInsertBefore(Zone* zone, 3512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> map, 3513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool map_is_stable, 3514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instruction) { 3515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instruction->Prepend(new(zone) HConstant( 3516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map, Unique<Map>(Handle<Map>::null()), map_is_stable, 3517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Tagged(), HType::HeapObject(), true, 3518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false, false, MAP_TYPE)); 3519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HConstant* CreateAndInsertAfter(Zone* zone, 3522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> map, 3523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool map_is_stable, 3524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instruction) { 3525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instruction->Append(new(zone) HConstant( 3526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch map, Unique<Map>(Handle<Map>::null()), map_is_stable, 3527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Tagged(), HType::HeapObject(), true, 3528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false, false, MAP_TYPE)); 3529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> handle(Isolate* isolate) { 3532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object_.handle().is_null()) { 3533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Default arguments to is_not_in_new_space depend on this heap number 3534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // to be tenured so that it's guaranteed not to be located in new space. 3535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_ = Unique<Object>::CreateUninitialized( 3536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->factory()->NewNumber(double_value_, TENURED)); 3537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllowDeferredHandleDereference smi_check; 3539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(has_int32_value_ || !object_.handle()->IsSmi()); 3540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_.handle(); 3541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsSpecialDouble() const { 3544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return has_double_value_ && 3545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (bit_cast<int64_t>(double_value_) == bit_cast<int64_t>(-0.0) || 3546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedDoubleArray::is_the_hole_nan(double_value_) || 3547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch std::isnan(double_value_)); 3548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NotInNewSpace() const { 3551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_not_in_new_space_; 3552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool ImmortalImmovable() const; 3555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsCell() const { 3557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instance_type_ == CELL_TYPE || instance_type_ == PROPERTY_CELL_TYPE; 3558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsMap() const { 3561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instance_type_ == MAP_TYPE; 3562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3565e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3566e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3567e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation KnownOptimalRepresentation() OVERRIDE { 3569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasSmiValue() && SmiValuesAre31Bits()) return Representation::Smi(); 3570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasInteger32Value()) return Representation::Integer32(); 3571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasNumberValue()) return Representation::Double(); 3572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasExternalReferenceValue()) return Representation::External(); 3573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 3574257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 3575257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 3576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool EmitAtUses() OVERRIDE; 3577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 3578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* CopyToRepresentation(Representation r, Zone* zone) const; 3579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Maybe<HConstant*> CopyToTruncatedInt32(Zone* zone); 3580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Maybe<HConstant*> CopyToTruncatedNumber(Zone* zone); 3581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasInteger32Value() const { return has_int32_value_; } 3582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t Integer32Value() const { 3583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasInteger32Value()); 3584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return int32_value_; 3585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasSmiValue() const { return has_smi_value_; } 3587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool HasDoubleValue() const { return has_double_value_; } 3588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double DoubleValue() const { 3589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasDoubleValue()); 3590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return double_value_; 3591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsTheHole() const { 3593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HasDoubleValue() && FixedDoubleArray::is_the_hole_nan(double_value_)) { 3594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 3595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_.IsInitialized() && 3597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_.IsKnownGlobal(isolate()->heap()->the_hole_value()); 3598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasNumberValue() const { return has_double_value_; } 36003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int32_t NumberValueAsInteger32() const { 3601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasNumberValue()); 3602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Irrespective of whether a numeric HConstant can be safely 3603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // represented as an int32, we store the (in some cases lossy) 3604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // representation of the number in int32_value_. 3605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return int32_value_; 3606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasStringValue() const { 3608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_double_value_ || has_int32_value_) return false; 3609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!object_.handle().is_null()); 3610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return instance_type_ < FIRST_NONSTRING_TYPE; 3611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> StringValue() const { 3613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasStringValue()); 3614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<String>::cast(object_.handle()); 3615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasInternalizedStringValue() const { 3617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HasStringValue() && StringShape(instance_type_).IsInternalized(); 3618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasExternalReferenceValue() const { 3621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return has_external_reference_value_; 3622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReference ExternalReferenceValue() const { 3624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return external_reference_value_; 3625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasBooleanValue() const { return type_.IsBoolean(); } 3628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool BooleanValue() const { return boolean_value_; } 3629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUndetectable() const { return is_undetectable_; } 3630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType GetInstanceType() const { return instance_type_; } 3631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasMapValue() const { return instance_type_ == MAP_TYPE; } 3633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> MapValue() const { 3634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasMapValue()); 3635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Unique<Map>::cast(GetUnique()); 3636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasStableMapValue() const { 3638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasMapValue() || !has_stable_map_value_); 3639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return has_stable_map_value_; 3640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasObjectMap() const { return !object_map_.IsNull(); } 3643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> ObjectMap() const { 3644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasObjectMap()); 3645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_map_; 3646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual intptr_t Hashcode() OVERRIDE { 3649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_int32_value_) { 3650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<intptr_t>(int32_value_); 3651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (has_double_value_) { 3652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return static_cast<intptr_t>(bit_cast<int64_t>(double_value_)); 3653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (has_external_reference_value_) { 3654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return reinterpret_cast<intptr_t>(external_reference_value_.address()); 3655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!object_.handle().is_null()); 3657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_.Hashcode(); 3658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 36593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 3660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() OVERRIDE { 3662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!has_double_value_ && !has_external_reference_value_) { 3663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!object_.handle().is_null()); 3664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object_ = Unique<Object>(object_.handle()); 3665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Object> GetUnique() const { 3669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_; 3670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 36718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 3672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool EqualsUnique(Unique<Object> other) const { 3673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return object_.IsInitialized() && object_ == other; 3674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 3677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* other_constant = HConstant::cast(other); 3678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_int32_value_) { 3679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other_constant->has_int32_value_ && 3680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_value_ == other_constant->int32_value_; 3681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (has_double_value_) { 3682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other_constant->has_double_value_ && 3683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bit_cast<int64_t>(double_value_) == 3684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bit_cast<int64_t>(other_constant->double_value_); 3685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (has_external_reference_value_) { 3686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other_constant->has_external_reference_value_ && 3687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_reference_value_ == 3688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch other_constant->external_reference_value_; 3689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 3690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (other_constant->has_int32_value_ || 3691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch other_constant->has_double_value_ || 3692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch other_constant->has_external_reference_value_) { 3693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 3694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!object_.handle().is_null()); 3696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other_constant->object_ == object_; 3697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG 3701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void Verify() OVERRIDE { } 3702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif 3703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Constant) 3705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 3707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 3708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 3710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HGraph; 3711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HConstant(Handle<Object> handle, 3712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = Representation::None()); 3713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant(int32_t value, 3714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = Representation::None(), 3715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_not_in_new_space = true, 3716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Object> optional = Unique<Object>(Handle<Object>::null())); 3717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant(double value, 3718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = Representation::None(), 3719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_not_in_new_space = true, 3720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Object> optional = Unique<Object>(Handle<Object>::null())); 3721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant(Unique<Object> object, 3722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> object_map, 3723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_stable_map_value, 3724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r, 3725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type, 3726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_not_in_new_space, 3727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool boolean_value, 3728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_undetectable, 3729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType instance_type); 3730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HConstant(ExternalReference reference); 3732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void Initialize(Representation r); 3734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 3736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If this is a numerical constant, object_ either points to the 3738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // HeapObject the constant originated from or is null. If the 3739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constant is non-numeric, object_ always points to a valid 3740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // constant HeapObject. 3741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Object> object_; 3742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If object_ is a heap object, this points to the stable map of the object. 3744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> object_map_; 3745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If object_ is a map, this indicates whether the map is stable. 3747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_stable_map_value_ : 1; 3748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We store the HConstant in the most specific form safely possible. 3750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The two flags, has_int32_value_ and has_double_value_ tell us if 3751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // int32_value_ and double_value_ hold valid, safe representations 3752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of the constant. has_int32_value_ implies has_double_value_ but 3753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not the converse. 3754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_smi_value_ : 1; 3755257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_int32_value_ : 1; 3756257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch bool has_double_value_ : 1; 3757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_external_reference_value_ : 1; 3758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_not_in_new_space_ : 1; 3759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool boolean_value_ : 1; 3760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_undetectable_: 1; 3761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int32_t int32_value_; 3762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch double double_value_; 3763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalReference external_reference_value_; 3764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const InstanceType kUnknownInstanceType = FILLER_TYPE; 3766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType instance_type_; 3767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBinaryOperation : public HTemplateInstruction<3> { 3771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation(HValue* context, HValue* left, HValue* right, 3773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type = HType::Tagged()) 3774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<3>(type), 3775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_output_representation_(Representation::None()) { 3776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left != NULL && right != NULL); 37773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 37783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, left); 37793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(2, right); 3780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_input_representation_[0] = Representation::None(); 3781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_input_representation_[1] = Representation::None(); 3782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 3785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left() const { return OperandAt(1); } 3786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right() const { return OperandAt(2); } 3787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // True if switching left and right operands likely generates better code. 3789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool AreOperandsBetterSwitched() { 3790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!IsCommutative()) return false; 3791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Constant operands are better off on the right, they can be inlined in 3793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // many situations on most platforms. 3794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (left()->IsConstant()) return true; 3795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right()->IsConstant()) return false; 3796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Otherwise, if there is only one use of the right operand, it would be 3798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // better off on the left for platforms that only have 2-arg arithmetic 3799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // ops (e.g ia32, x64) that clobber the left operand. 3800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return right()->HasOneUse(); 3801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* BetterLeftOperand() { 3804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AreOperandsBetterSwitched() ? right() : left(); 3805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* BetterRightOperand() { 3808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return AreOperandsBetterSwitched() ? left() : right(); 3809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_observed_input_representation(int index, Representation rep) { 3812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(index >= 1 && index <= 2); 3813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_input_representation_[index - 1] = rep; 3814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void initialize_output_representation(Representation observed) { 3817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_output_representation_ = observed; 3818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 3821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) return Representation::Tagged(); 3822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return observed_input_representation_[index - 1]; 3823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 3826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 3827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 3828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation rep = !FLAG_smi_binop && new_rep.IsSmi() 3829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Integer32() : new_rep; 3830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue::UpdateRepresentation(rep, h_infer, reason); 3831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 3834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 3835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() OVERRIDE; 3836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation RepresentationFromOutput(); 3837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void AssumeRepresentation(Representation r) OVERRIDE; 3838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch virtual bool IsCommutative() const { return false; } 3840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 3842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) return Representation::Tagged(); 3845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 3846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetOperandPositions(Zone* zone, 3849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition left_pos, 3850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition right_pos) { 3851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_operand_position(zone, 1, left_pos); 3852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_operand_position(zone, 2, right_pos); 3853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RightIsPowerOf2() { 3856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!right()->IsInteger32Constant()) return false; 3857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t value = right()->GetInteger32Constant(); 3858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value < 0) { 3859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(-value)); 3860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return base::bits::IsPowerOfTwo32(static_cast<uint32_t>(value)); 3862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_ABSTRACT_INSTRUCTION(BinaryOperation) 3865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IgnoreObservedOutputRepresentation(Representation current_rep); 3868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation observed_input_representation_[2]; 3870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation observed_output_representation_; 3871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HWrapReceiver FINAL : public HTemplateInstruction<2> { 38753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 3876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HWrapReceiver, HValue*, HValue*); 38773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 3879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 38813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 38823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 38833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* receiver() const { return OperandAt(0); } 3885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() const { return OperandAt(1); } 3886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 38883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 3890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool known_function() const { return known_function_; } 38913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 38923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(WrapReceiver) 3893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HWrapReceiver(HValue* receiver, HValue* function) { 3896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_function_ = function->IsConstant() && 3897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(function)->handle(function->isolate())->IsJSFunction(); 3898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 3899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, receiver); 3900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, function); 3901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 3902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool known_function_; 39053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 39063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 39073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 3908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HApplyArguments FINAL : public HTemplateInstruction<4> { 3909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HApplyArguments, HValue*, HValue*, HValue*, 3911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*); 3912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The length is untagged, all other inputs are tagged. 3915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return (index == 2) 3916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Integer32() 3917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Tagged(); 3918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3920e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* function() { return OperandAt(0); } 3921e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* receiver() { return OperandAt(1); } 3922e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* length() { return OperandAt(2); } 3923e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* elements() { return OperandAt(3); } 3924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3925257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ApplyArguments) 3926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HApplyArguments(HValue* function, 3929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* receiver, 3930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* length, 3931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* elements) { 3932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 3933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, function); 3934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, receiver); 3935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, length); 3936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(3, elements); 3937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 3938b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 3939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 3940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsElements FINAL : public HTemplateInstruction<0> { 3943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 3944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsElements, bool); 3945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements) 39471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 3948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 3950e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3951e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool from_inlined() const { return from_inlined_; } 3953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 39541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 3956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HArgumentsElements(bool from_inlined) : from_inlined_(from_inlined) { 3959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The value produced by this instruction is a pointer into the stack 3960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that looks as if it was a smi because of alignment. 3961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 3962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 3963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 3966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool from_inlined_; 3968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArgumentsLength FINAL : public HUnaryOperation { 3972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HArgumentsLength, HValue*); 3974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 3976e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 3977e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 3978e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 3979257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength) 39801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 39811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 3982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 3983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 3985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HArgumentsLength(HValue* value) : HUnaryOperation(value) { 3986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 3987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 3988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 3989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 3990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 3991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 3992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAccessArgumentsAt FINAL : public HTemplateInstruction<3> { 3995b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 3996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HAccessArgumentsAt, HValue*, HValue*, HValue*); 3997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 3998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 3999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // The arguments elements is considered tagged. 4002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return index == 0 4003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch ? Representation::Tagged() 4004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch : Representation::Integer32(); 4005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* arguments() const { return OperandAt(0); } 4008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* length() const { return OperandAt(1); } 4009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() const { return OperandAt(2); } 4010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4011257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt) 4012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4014b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAccessArgumentsAt(HValue* arguments, HValue* length, HValue* index) { 4015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 4016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 4017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, arguments); 4018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, length); 4019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, index); 4020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheckBaseIndexInformation; 4027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheck FINAL : public HTemplateInstruction<2> { 4030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HBoundsCheck, HValue*, HValue*); 4032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool skip_check() const { return skip_check_; } 4034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_skip_check() { skip_check_ = true; } 4035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base() const { return base_; } 4037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset() const { return offset_; } 4038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scale() const { return scale_; } 4039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ApplyIndexChange(); 4041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool DetectCompoundIndex() { 4042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base() == NULL); 4043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecompositionResult decomposition; 4045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index()->TryDecompose(&decomposition)) { 4046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_ = decomposition.base(); 4047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = decomposition.offset(); 4048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scale_ = decomposition.scale(); 4049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 4050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 4051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_ = index(); 4052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset_ = 0; 4053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch scale_ = 0; 4054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 4055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 4060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 4064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 4065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() const { return OperandAt(0); } 4067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* length() const { return OperandAt(1); } 4068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool allow_equality() const { return allow_equality_; } 4069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_allow_equality(bool v) { allow_equality_ = v; } 4070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() OVERRIDE { return 0; } 4072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsPurelyInformativeDefinition() OVERRIDE { 4073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return skip_check(); 4074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(BoundsCheck) 4077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 4079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HBoundsCheckBaseIndexInformation; 4080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool skip_check_; 4085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base_; 4086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset_; 4087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int scale_; 4088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool allow_equality_; 4089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Normally HBoundsCheck should be created using the 4092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // HGraphBuilder::AddBoundsCheck() helper. 4093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // However when building stubs, where we know that the arguments are Int32, 4094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // it makes sense to invoke this constructor directly. 4095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck(HValue* index, HValue* length) 4096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : skip_check_(false), 4097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_(NULL), offset_(0), scale_(0), 4098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allow_equality_(false) { 40993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, index); 41003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, length); 4101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kFlexibleRepresentation); 4102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 4103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { 4106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return skip_check() && !FLAG_debug_code; 4107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBoundsCheckBaseIndexInformation FINAL 4112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public HTemplateInstruction<2> { 4113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HBoundsCheckBaseIndexInformation(HBoundsCheck* check) { 4115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DecompositionResult decomposition; 4116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (check->index()->TryDecompose(&decomposition)) { 4117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, decomposition.base()); 4118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, check); 4119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 4120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 4121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base_index() const { return OperandAt(0); } 4125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBoundsCheck* bounds_check() { return HBoundsCheck::cast(OperandAt(1)); } 4126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(BoundsCheckBaseIndexInformation) 4128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 4131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 41321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() OVERRIDE { return 0; } 4136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsPurelyInformativeDefinition() OVERRIDE { return true; } 4137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwiseBinaryOperation : public HBinaryOperation { 4141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwiseBinaryOperation(HValue* context, HValue* left, HValue* right, 4143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type = HType::TaggedNumber()) 4144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryOperation(context, left, right, type) { 41451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kFlexibleRepresentation); 4146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToInt32); 4147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 41481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RepresentationChanged(Representation to) OVERRIDE { 4152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged() && 4153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { 4154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 4155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearFlag(kUseGVN); 4156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 41571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 41581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetFlag(kUseGVN); 41591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 4160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); 41611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 41621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 4164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 4165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 4166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We only generate either int32 or generic tagged bitwise operations. 4167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsDouble()) new_rep = Representation::Integer32(); 4168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 4172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = HBinaryOperation::observed_input_representation(index); 4173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsDouble()) return Representation::Integer32(); 4174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return r; 4175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void initialize_output_representation(Representation observed) { 4178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (observed.IsDouble()) observed = Representation::Integer32(); 4179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBinaryOperation::initialize_output_representation(observed); 4180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 41811e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4182257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_ABSTRACT_INSTRUCTION(BitwiseBinaryOperation) 4183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 4186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMathFloorOfDiv FINAL : public HBinaryOperation { 4190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HMathFloorOfDiv, 4192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 4193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*); 4194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(MathFloorOfDiv) 4196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 4198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMathFloorOfDiv(HValue* context, HValue* left, HValue* right) 42023fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HBinaryOperation(context, left, right) { 4203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 4204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 4205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanOverflow); 4206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanBeDivByZero); 4207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kLeftCanBeMinInt); 4208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kLeftCanBeNegative); 4209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kLeftCanBePositive); 4210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 4211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 4216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HArithmeticBinaryOperation : public HBinaryOperation { 4220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArithmeticBinaryOperation(HValue* context, HValue* left, HValue* right) 4222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryOperation(context, left, right, HType::TaggedNumber()) { 42231e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kFlexibleRepresentation); 4225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 4226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RepresentationChanged(Representation to) OVERRIDE { 4229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged() && 4230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved())) { 4231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 4232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearFlag(kUseGVN); 4233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 42341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block ClearAllSideEffects(); 4235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kUseGVN); 4236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) SetChangesFlag(kNewSpacePromotion); 4238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_ABSTRACT_INSTRUCTION(ArithmeticBinaryOperation) 4241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 4244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareGeneric FINAL : public HBinaryOperation { 4248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HCompareGeneric, HValue*, 4250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, Token::Value); 4251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 42533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 42543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Tagged() 42553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : representation(); 4256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 42573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value token() const { return token_; } 4259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareGeneric) 4262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 42643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HCompareGeneric(HValue* context, 42653fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left, 42663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* right, 42673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token) 4268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryOperation(context, left, right, HType::Boolean()), 4269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch token_(token) { 4270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsCompareOp(token)); 4271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 42721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Token::Value token_; 4276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareNumericAndBranch : public HTemplateControlInstruction<2, 2> { 4280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HCompareNumericAndBranch, 4282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HValue*, Token::Value); 4283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P5(HCompareNumericAndBranch, 4284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HValue*, Token::Value, 4285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 4286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left() const { return OperandAt(0); } 4288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right() const { return OperandAt(1); } 42893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Token::Value token() const { return token_; } 42903fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_observed_input_representation(Representation left, 4292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation right) { 4293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_input_representation_[0] = left; 4294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch observed_input_representation_[1] = right; 42951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 42961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 4298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 4299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 4302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 4304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return observed_input_representation_[index]; 4305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 43081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetOperandPositions(Zone* zone, 4312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition left_pos, 4313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSourcePosition right_pos) { 4314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_operand_position(zone, 0, left_pos); 4315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_operand_position(zone, 1, right_pos); 4316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch) 4319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareNumericAndBranch(HValue* left, 4322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 4323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value token, 4324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : token_(token) { 4327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kFlexibleRepresentation); 4328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsCompareOp(token)); 43293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, left); 43303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, right); 4331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(0, true_target); 4332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(1, false_target); 4333257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation observed_input_representation_[2]; 4336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value token_; 4337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 43393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareHoleAndBranch FINAL : public HUnaryControlInstruction { 4341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*); 4343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HCompareHoleAndBranch, HValue*, 4344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 4345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 4347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 4348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 4351257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 4352257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch) 4354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareHoleAndBranch(HValue* value, 4357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target) { 4360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kFlexibleRepresentation); 4361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 4362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4363257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4364257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4365257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareMinusZeroAndBranch FINAL : public HUnaryControlInstruction { 4367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HCompareMinusZeroAndBranch, HValue*); 43691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 4371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 43721e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return representation(); 4375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 43763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareMinusZeroAndBranch) 43803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 43813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch private: 4382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HCompareMinusZeroAndBranch(HValue* value) 4383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL) { 4384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCompareObjectEqAndBranch : public HTemplateControlInstruction<2, 2> { 4389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HCompareObjectEqAndBranch, HValue*, HValue*); 4391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HCompareObjectEqAndBranch, HValue*, HValue*, 4392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 4393592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 4394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoKnownSuccessorIndex = -1; 4397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index() const { return known_successor_index_; } 4398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_known_successor_index(int known_successor_index) { 4399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_successor_index_ = known_successor_index; 4400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 44013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left() const { return OperandAt(0); } 4403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right() const { return OperandAt(1); } 4404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4406b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 44083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 4412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 4413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CompareObjectEqAndBranch) 44163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCompareObjectEqAndBranch(HValue* left, 4419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 4420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : known_successor_index_(kNoKnownSuccessorIndex) { 4423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, left); 4424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, right); 4425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(0, true_target); 4426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetSuccessorAt(1, false_target); 4427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index_; 4430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsObjectAndBranch FINAL : public HUnaryControlInstruction { 4434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HIsObjectAndBranch, HValue*); 4436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HIsObjectAndBranch, HValue*, 4437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 4438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 44403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 44413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 44421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsObjectAndBranch) 4446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HIsObjectAndBranch(HValue* value, 4449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target) {} 4452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsStringAndBranch FINAL : public HUnaryControlInstruction { 44563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 4457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HIsStringAndBranch, HValue*); 4458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HIsStringAndBranch, HValue*, 4459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 44603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 44623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 44633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 44643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kNoKnownSuccessorIndex = -1; 4468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index() const { return known_successor_index_; } 4469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_known_successor_index(int known_successor_index) { 4470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_successor_index_ = known_successor_index; 4471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 44733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch) 4474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 4476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 4477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HIsStringAndBranch(HValue* value, 4480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target), 4483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_successor_index_(kNoKnownSuccessorIndex) { } 4484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int known_successor_index_; 44863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 44873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsSmiAndBranch FINAL : public HUnaryControlInstruction { 4490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HIsSmiAndBranch, HValue*); 4492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HIsSmiAndBranch, HValue*, 4493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 44943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 44953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch) 4496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 44983fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 44993fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch protected: 4502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 4504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HIsSmiAndBranch(HValue* value, 4507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target) { 4510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 4511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4512257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 4513257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4514257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsUndetectableAndBranch FINAL : public HUnaryControlInstruction { 4516257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 4517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HIsUndetectableAndBranch, HValue*); 4518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HIsUndetectableAndBranch, HValue*, 4519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock*, HBasicBlock*); 4520257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 4521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 45223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 45233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 45241e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch) 4528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HIsUndetectableAndBranch(HValue* value, 4531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* true_target = NULL, 4532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBasicBlock* false_target = NULL) 4533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, true_target, false_target) {} 45341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 45351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 45361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCompareAndBranch : public HTemplateControlInstruction<2, 3> { 45383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 4539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HStringCompareAndBranch, 4540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 4541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 4542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value); 45433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* context() { return OperandAt(0); } 45453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* left() { return OperandAt(1); } 45463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* right() { return OperandAt(2); } 45473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value token() const { return token_; } 45483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 45503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 45523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 45533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 45543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Representation GetInputRepresentation() const { 45563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 45573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 45583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch) 45603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 4562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStringCompareAndBranch(HValue* context, 4563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 4565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value token) 4566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : token_(token) { 4567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(Token::IsCompareOp(token)); 4568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 4569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, left); 4570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, right); 4571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 4572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 4573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 45753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value token_; 45763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 45773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 45783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HIsConstructCallAndBranch : public HTemplateControlInstruction<2, 0> { 45801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 4581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P0(HIsConstructCallAndBranch); 4582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 4585e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 4586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 45873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(IsConstructCallAndBranch) 4588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HIsConstructCallAndBranch() {} 4590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HHasInstanceTypeAndBranch FINAL : public HUnaryControlInstruction { 4594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2( 4596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HHasInstanceTypeAndBranch, HValue*, InstanceType); 4597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3( 4598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HHasInstanceTypeAndBranch, HValue*, InstanceType, InstanceType); 4599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from() { return from_; } 4601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to() { return to_; } 4602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 46063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 4607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 46113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch) 46123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType type) 4615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(type), to_(type) { } 4616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HHasInstanceTypeAndBranch(HValue* value, InstanceType from, InstanceType to) 4617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), from_(from), to_(to) { 4618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(to == LAST_TYPE); // Others not implemented yet in backend. 4619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType from_; 4622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch InstanceType to_; // Inclusive range, not all combinations work. 4623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HHasCachedArrayIndexAndBranch FINAL : public HUnaryControlInstruction { 4627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HHasCachedArrayIndexAndBranch, HValue*); 4629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 46313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 46323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 46331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 46343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch) 4635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HHasCachedArrayIndexAndBranch(HValue* value) 4637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL) { } 4638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}; 4639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HGetCachedArrayIndex FINAL : public HUnaryOperation { 4642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch public: 4643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HGetCachedArrayIndex, HValue*); 46443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 46463fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 46473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4648e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4649257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(GetCachedArrayIndex) 4650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 4651e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch protected: 4652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HGetCachedArrayIndex(HValue* value) : HUnaryOperation(value) { 4656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 4657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 4658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 4661b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4662b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HClassOfTestAndBranch FINAL : public HUnaryControlInstruction { 4665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HClassOfTestAndBranch, HValue*, 4667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>); 4668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch) 46703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 46723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 46733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 4674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name() const { return class_name_; } 4678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HClassOfTestAndBranch(HValue* value, Handle<String> class_name) 4681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), 4682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class_name_(class_name) { } 4683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> class_name_; 4685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTypeofIsAndBranch FINAL : public HUnaryControlInstruction { 4689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HTypeofIsAndBranch, HValue*, Handle<String>); 4691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> type_literal() const { return type_literal_.handle(); } 4693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 4694b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 46953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch) 4696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 4699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool KnownSuccessorBlock(HBasicBlock** block) OVERRIDE; 4702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() OVERRIDE { 4704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type_literal_ = Unique<String>(type_literal_.handle()); 4705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 4708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTypeofIsAndBranch(HValue* value, Handle<String> type_literal) 4709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryControlInstruction(value, NULL, NULL), 4710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch type_literal_(Unique<String>::CreateUninitialized(type_literal)) { } 4711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<String> type_literal_; 4713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstanceOf FINAL : public HBinaryOperation { 4717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOf, HValue*, HValue*); 4719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 4722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 47251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4726257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOf) 4727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstanceOf(HValue* context, HValue* left, HValue* right) 4730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryOperation(context, left, right, HType::Boolean()) { 4731086aeeaae12517475c22695a200be45495516549Ben Murdoch set_representation(Representation::Tagged()); 47321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 4733086aeeaae12517475c22695a200be45495516549Ben Murdoch } 4734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInstanceOfKnownGlobal FINAL : public HTemplateInstruction<2> { 4738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HInstanceOfKnownGlobal, 4740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 4741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction>); 4742086aeeaae12517475c22695a200be45495516549Ben Murdoch 47433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 47443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(1); } 4745086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function() { return function_; } 4746086aeeaae12517475c22695a200be45495516549Ben Murdoch 4747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 4748086aeeaae12517475c22695a200be45495516549Ben Murdoch return Representation::Tagged(); 4749086aeeaae12517475c22695a200be45495516549Ben Murdoch } 4750086aeeaae12517475c22695a200be45495516549Ben Murdoch 4751257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal) 4752086aeeaae12517475c22695a200be45495516549Ben Murdoch 4753086aeeaae12517475c22695a200be45495516549Ben Murdoch private: 4754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstanceOfKnownGlobal(HValue* context, 4755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> right) 4757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::Boolean()), function_(right) { 4758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 4759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, left); 4760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 4761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 4762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4764086aeeaae12517475c22695a200be45495516549Ben Murdoch Handle<JSFunction> function_; 4765086aeeaae12517475c22695a200be45495516549Ben Murdoch}; 4766086aeeaae12517475c22695a200be45495516549Ben Murdoch 4767086aeeaae12517475c22695a200be45495516549Ben Murdoch 4768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HPower FINAL : public HTemplateInstruction<2> { 4769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 4774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 47753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* left() { return OperandAt(0); } 4776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right() const { return OperandAt(1); } 47773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 4778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 47793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return index == 0 47803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch ? Representation::Double() 47813fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : Representation::None(); 4782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 4784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RequiredInputRepresentation(index); 4785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Power) 47881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 47891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 4790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPower(HValue* left, HValue* right) { 4794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, left); 4795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, right); 47963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Double()); 4797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 4798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 47993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 48003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { 4802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !right()->representation().IsTagged(); 48033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 48043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 48053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 48063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAdd FINAL : public HArithmeticBinaryOperation { 4808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 4813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Add is only commutative if two integer values are added and not if two 4815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // tagged values are added (because it might be a String concatenation). 4816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We also do not commute (pointer + offset). 4817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCommutative() const OVERRIDE { 4818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !representation().IsTagged() && !representation().IsExternal(); 4819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 4822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { 4824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (left()->IsInteger32Constant()) { 4825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decomposition->Apply(right(), left()->GetInteger32Constant()); 4826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 4827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (right()->IsInteger32Constant()) { 4828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decomposition->Apply(left(), right()->GetInteger32Constant()); 4829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 4830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 4831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 4832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void RepresentationChanged(Representation to) OVERRIDE { 4836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged() && 4837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (left()->ToNumberCanBeObserved() || right()->ToNumberCanBeObserved() || 4838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->ToStringCanBeObserved() || right()->ToStringCanBeObserved())) { 4839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 4840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearFlag(kUseGVN); 4841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 4842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearAllSideEffects(); 4843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 4844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (to.IsTagged()) { 4846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 4847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ClearFlag(kAllowUndefinedAsNaN); 4848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 48503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() OVERRIDE; 4852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE; 48543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4855257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Add) 4856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 4858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAdd(HValue* context, HValue* left, HValue* right) 48643fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 4865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 4866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSub FINAL : public HArithmeticBinaryOperation { 4871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 4876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 48783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { 4880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right()->IsInteger32Constant()) { 4881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decomposition->Apply(left(), -right()->GetInteger32Constant()); 4882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 4883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 4884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 4885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 48873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4888257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sub) 4889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 4891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 48921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSub(HValue* context, HValue* left, HValue* right) 4897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HArithmeticBinaryOperation(context, left, right) { 4898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanOverflow); 4899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMul FINAL : public HArithmeticBinaryOperation { 4904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 4909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* NewImul(Zone* zone, 4911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right) { 4914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInstruction* instr = HMul::New(zone, context, left, right); 4915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!instr->IsMul()) return instr; 4916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMul* mul = HMul::cast(instr); 4917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TODO(mstarzinger): Prevent bailout on minus zero for imul. 4918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mul->AssumeRepresentation(Representation::Integer32()); 4919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mul->ClearFlag(HValue::kCanOverflow); 4920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return mul; 4921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 4924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch // Only commutative if it is certain that not two objects are multiplicated. 4926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCommutative() const OVERRIDE { 4927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return !representation().IsTagged(); 4928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 4931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 4932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 4933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MulMinusOne(); 49373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4938257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mul) 4939b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4940b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 4941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 4942b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMul(HValue* context, HValue* left, HValue* right) 49473fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 4948b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanOverflow); 4949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 4950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 4951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 495244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMod FINAL : public HArithmeticBinaryOperation { 4954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 4955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 495944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 4960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 4961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 4963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 4964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 4965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 4966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 4967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 49683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 4969257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Mod) 4970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 4972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 49731e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 4974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 4975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 4977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMod(HValue* context, 4978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right) : HArithmeticBinaryOperation(context, left, right) { 4980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanBeDivByZero); 4981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kCanOverflow); 4982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kLeftCanBeNegative); 4983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 4985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 4987b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDiv FINAL : public HArithmeticBinaryOperation { 4988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 4989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 4990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 4991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 4992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 4993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 4995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 4996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 4997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 4998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 4999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HArithmeticBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Div) 5004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 5006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 5007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 5009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 50113fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HDiv(HValue* context, HValue* left, HValue* right) 50123fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HArithmeticBinaryOperation(context, left, right) { 5013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanBeDivByZero); 5014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch SetFlag(kCanOverflow); 5015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMathMinMax FINAL : public HArithmeticBinaryOperation { 5020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Operation { kMathMin, kMathMax }; 5022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 5027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Operation op); 50283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 5030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RequiredInputRepresentation(index); 5031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void InferRepresentation( 5034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer) OVERRIDE; 5035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RepresentationFromInputs() OVERRIDE { 5037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation left_rep = left()->representation(); 5038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation right_rep = right()->representation(); 5039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation result = Representation::Smi(); 5040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = result.generalize(left_rep); 5041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result = result.generalize(right_rep); 5042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (result.IsTagged()) return Representation::Double(); 5043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 5044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCommutative() const OVERRIDE { return true; } 5047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Operation operation() { return operation_; } 5049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(MathMinMax) 5051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 5053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 5054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return other->IsMathMinMax() && 5055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMathMinMax::cast(other)->operation_ == operation_; 5056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 50571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 5059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMathMinMax(HValue* context, HValue* left, HValue* right, Operation op) 5062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HArithmeticBinaryOperation(context, left, right), 5063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch operation_(op) { } 5064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Operation operation_; 5066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HBitwise FINAL : public HBitwiseBinaryOperation { 5070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value op, 5074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 5076c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 50773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op() const { return op_; } 507885b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 5079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsCommutative() const OVERRIDE { return true; } 5080592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 5081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 508285b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 5083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 508485b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 50853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Bitwise) 508685b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 508785b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch protected: 5088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 50893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return op() == HBitwise::cast(other)->op(); 50903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 509185b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch 5092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 50933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 50943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 5095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwise(HValue* context, 5096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Token::Value op, 5097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right) 5099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBitwiseBinaryOperation(context, left, right), 5100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch op_(op) { 5101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(op == Token::BIT_AND || op == Token::BIT_OR || op == Token::BIT_XOR); 5102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // BIT_AND with a smi-range positive value will always unset the 5103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // entire sign-extension of the smi-sign. 5104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (op == Token::BIT_AND && 5105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((left->IsConstant() && 5106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left->representation().IsSmi() && 5107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(left)->Integer32Value() >= 0) || 5108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (right->IsConstant() && 5109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right->representation().IsSmi() && 5110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(right)->Integer32Value() >= 0))) { 5111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToSmi); 5112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToInt32); 5113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // BIT_OR with a smi-range negative value will always set the entire 5114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // sign-extension of the smi-sign. 5115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (op == Token::BIT_OR && 5116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ((left->IsConstant() && 5117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left->representation().IsSmi() && 5118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(left)->Integer32Value() < 0) || 5119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (right->IsConstant() && 5120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right->representation().IsSmi() && 5121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(right)->Integer32Value() < 0))) { 5122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToSmi); 5123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToInt32); 5124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 51273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Token::Value op_; 5128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HShl FINAL : public HBitwiseBinaryOperation { 5132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 5137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 51393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 5141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 5142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 5143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi() && 5144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !(right()->IsInteger32Constant() && 5145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch right()->GetInteger32Constant() >= 0)) { 5146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_rep = Representation::Integer32(); 5147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5151257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shl) 51521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 51531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 5154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 5155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HShl(HValue* context, HValue* left, HValue* right) 5158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBitwiseBinaryOperation(context, left, right) { } 5159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HShr FINAL : public HBitwiseBinaryOperation { 5163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 5168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { 5170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right()->IsInteger32Constant()) { 5171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 5172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is intended to look for HAdd and HSub, to handle compounds 5173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // like ((base + offset) >> scale) with one single decomposition. 5174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->TryDecompose(decomposition); 5175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 5176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 51823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 5184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 5185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 5186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5190257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Shr) 51911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 51921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 5193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 5194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HShr(HValue* context, HValue* left, HValue* right) 5197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBitwiseBinaryOperation(context, left, right) { } 5198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSar FINAL : public HBitwiseBinaryOperation { 5202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right); 5207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryDecompose(DecompositionResult* decomposition) OVERRIDE { 5209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right()->IsInteger32Constant()) { 5210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (decomposition->Apply(left(), 0, right()->GetInteger32Constant())) { 5211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This is intended to look for HAdd and HSub, to handle compounds 5212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // like ((base + offset) >> scale) with one single decomposition. 5213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left()->TryDecompose(decomposition); 5214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 5215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 52193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 5221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 5223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 5224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 5225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Sar) 52301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 52311e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 5232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 5233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSar(HValue* context, HValue* left, HValue* right) 5236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBitwiseBinaryOperation(context, left, right) { } 5237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HRor FINAL : public HBitwiseBinaryOperation { 5241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 5243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 5245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right) { 5246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HRor(context, left, right); 5247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void UpdateRepresentation(Representation new_rep, 5250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInferRepresentationPhase* h_infer, 5251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* reason) OVERRIDE { 5252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (new_rep.IsSmi()) new_rep = Representation::Integer32(); 5253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HBitwiseBinaryOperation::UpdateRepresentation(new_rep, h_infer, reason); 5254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Ror) 5257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 5259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 5260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HRor(HValue* context, HValue* left, HValue* right) 5263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBitwiseBinaryOperation(context, left, right) { 5264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ChangeRepresentation(Representation::Integer32()); 5265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HOsrEntry FINAL : public HTemplateInstruction<0> { 5270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HOsrEntry, BailoutId); 5272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ast_id() const { return ast_id_; } 5274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5276e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 5277e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 5278e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 5279257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(OsrEntry) 5280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HOsrEntry(BailoutId ast_id) : ast_id_(ast_id) { 5283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kOsrEntries); 5284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 5285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BailoutId ast_id_; 5288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HParameter FINAL : public HTemplateInstruction<0> { 5292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum ParameterKind { 5294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STACK_PARAMETER, 5295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch REGISTER_PARAMETER 5296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 5297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HParameter, unsigned); 5299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HParameter, unsigned, ParameterKind); 5300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HParameter, unsigned, ParameterKind, 5301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation); 5302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index() const { return index_; } 5304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ParameterKind kind() const { return kind_; } 5305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5307e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 5308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5309e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 5310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 5311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Parameter) 5313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HParameter(unsigned index, 5316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ParameterKind kind = STACK_PARAMETER) 5317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : index_(index), 5318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kind_(kind) { 5319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 5320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HParameter(unsigned index, 5323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ParameterKind kind, 5324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r) 5325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : index_(index), 5326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kind_(kind) { 5327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(r); 5328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch unsigned index_; 5331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ParameterKind kind_; 5332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCallStub FINAL : public HUnaryCall { 5336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HCallStub, CodeStub::Major, int); 5338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch CodeStub::Major major_key() { return major_key_; } 53391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return value(); } 5341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CallStub) 5345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCallStub(HValue* context, CodeStub::Major major_key, int argument_count) 5348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryCall(context, argument_count), 5349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch major_key_(major_key) { 5350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 53511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CodeStub::Major major_key_; 5353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5354e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 5355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTailCallThroughMegamorphicCache FINAL : public HTemplateInstruction<3> { 5357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HTailCallThroughMegamorphicCache, 5359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HValue*, Code::Flags); 5360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 5363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 5364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 5366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* receiver() const { return OperandAt(1); } 5367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* name() const { return OperandAt(2); } 5368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Code::Flags flags() const { return flags_; } 5369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(TailCallThroughMegamorphicCache) 5373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTailCallThroughMegamorphicCache(HValue* context, HValue* receiver, 5376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* name, Code::Flags flags) 5377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : flags_(flags) { 5378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 5379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, receiver); 5380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, name); 5381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Code::Flags flags_; 5384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HUnknownOSRValue FINAL : public HTemplateInstruction<0> { 5388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HUnknownOSRValue, HEnvironment*, int); 5390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const; // NOLINT 5392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5394e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 5395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 5396e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 5397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_incoming_value(HPhi* value) { incoming_value_ = value; } 5398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HPhi* incoming_value() { return incoming_value_; } 5399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment *environment() { return environment_; } 5400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index() { return index_; } 54013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation KnownOptimalRepresentation() OVERRIDE { 5403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (incoming_value_ == NULL) return Representation::None(); 5404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return incoming_value_->KnownOptimalRepresentation(); 54053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 54063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5407257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue) 54083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 54093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 5410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HUnknownOSRValue(HEnvironment* environment, int index) 5411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : environment_(environment), 5412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch index_(index), 5413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch incoming_value_(NULL) { 5414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 5415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HEnvironment* environment_; 5418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int index_; 54193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HPhi* incoming_value_; 5420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadGlobalCell FINAL : public HTemplateInstruction<0> { 5424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HLoadGlobalCell, Handle<Cell>, 5426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails); 5427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Cell> cell() const { return cell_; } 5429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RequiresHoleCheck() const; 5430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual intptr_t Hashcode() OVERRIDE { 5434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return cell_.Hashcode(); 5435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() OVERRIDE { 5438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cell_ = Unique<Cell>(cell_.handle()); 5439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5442e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::None(); 5443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 5444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 5445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalCell) 5446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch protected: 5448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 5449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return cell_ == HLoadGlobalCell::cast(other)->cell_; 5450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadGlobalCell(Handle<Cell> cell, PropertyDetails details) 5454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : cell_(Unique<Cell>::CreateUninitialized(cell)), details_(details) { 5455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 5456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 5457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kGlobalVars); 5458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); } 5461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Cell> cell_; 54633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PropertyDetails details_; 5464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadGlobalGeneric FINAL : public HTemplateInstruction<2> { 5468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P3(HLoadGlobalGeneric, HValue*, 5470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>, bool); 54718b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 54728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* context() { return OperandAt(0); } 54738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch HValue* global_object() { return OperandAt(1); } 5474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return name_; } 54758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof() const { return for_typeof_; } 5476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot() const { 5477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics && 5478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); 5479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return slot_; 5480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector() const { return feedback_vector_; } 5482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { 5483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics); 5484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch feedback_vector_ = vector; 5485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ = slot; 5486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 54878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 54898b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 54918b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 54928b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 54938b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5494257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadGlobalGeneric) 54958b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 54968b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 5497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadGlobalGeneric(HValue* context, HValue* global_object, 5498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name, bool for_typeof) 5499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : name_(name), for_typeof_(for_typeof), 5500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { 5501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 5502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, global_object); 5503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 5504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 5505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name_; 55088b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch bool for_typeof_; 5509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector_; 5510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot_; 55118b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 55128b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 55138b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAllocate FINAL : public HTemplateInstruction<2> { 5515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static bool CompatibleInstanceTypes(InstanceType type1, 5517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType type2) { 5518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ComputeFlags(TENURED, type1) == ComputeFlags(TENURED, type2) && 5519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ComputeFlags(NOT_TENURED, type1) == ComputeFlags(NOT_TENURED, type2); 5520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 55213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HAllocate* New(Zone* zone, 5523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* size, 5525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type, 5526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure_flag, 5527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType instance_type, 5528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site = 5529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite>::null()) { 5530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HAllocate(context, size, type, pretenure_flag, 5531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch instance_type, allocation_site); 5532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 55333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Maximum instance size for which allocations will be inlined. 5535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const int kMaxInlineSize = 64 * kPointerSize; 5536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 5538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* size() const { return OperandAt(1); } 5539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_size_upper_bound() { return size_upper_bound_ != NULL; } 5541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* size_upper_bound() { return size_upper_bound_; } 5542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_size_upper_bound(HConstant* value) { 5543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(size_upper_bound_ == NULL); 5544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_upper_bound_ = value; 5545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) { 5549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 5550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 5551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 5552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 55533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Handle<Map> GetMonomorphicJSObjectMap() OVERRIDE { 5556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return known_initial_map_; 5557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void set_known_initial_map(Handle<Map> known_initial_map) { 5560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch known_initial_map_ = known_initial_map; 5561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsNewSpaceAllocation() const { 5564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & ALLOCATE_IN_NEW_SPACE) != 0; 5565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOldDataSpaceAllocation() const { 5568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & ALLOCATE_IN_OLD_DATA_SPACE) != 0; 5569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsOldPointerSpaceAllocation() const { 5572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & ALLOCATE_IN_OLD_POINTER_SPACE) != 0; 5573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MustAllocateDoubleAligned() const { 5576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & ALLOCATE_DOUBLE_ALIGNED) != 0; 5577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MustPrefillWithFiller() const { 5580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & PREFILL_WITH_FILLER) != 0; 5581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MakePrefillWithFiller() { 5584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_ = static_cast<HAllocate::Flags>(flags_ | PREFILL_WITH_FILLER); 5585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool MustClearNextMapWord() const { 5588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (flags_ & CLEAR_NEXT_MAP_WORD) != 0; 5589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void MakeDoubleAligned() { 5592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_ = static_cast<HAllocate::Flags>(flags_ | ALLOCATE_DOUBLE_ALIGNED); 5593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HandleSideEffectDominator(GVNFlag side_effect, 5596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) OVERRIDE; 5597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Allocate) 5601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Flags { 5604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATE_IN_NEW_SPACE = 1 << 0, 5605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATE_IN_OLD_DATA_SPACE = 1 << 1, 5606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATE_IN_OLD_POINTER_SPACE = 1 << 2, 5607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOCATE_DOUBLE_ALIGNED = 1 << 3, 5608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PREFILL_WITH_FILLER = 1 << 4, 5609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CLEAR_NEXT_MAP_WORD = 1 << 5 5610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 5611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocate(HValue* context, 5613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* size, 5614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type, 5615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure_flag, 5616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType instance_type, 5617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site = 5618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite>::null()) 5619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(type), 5620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_(ComputeFlags(pretenure_flag, instance_type)), 5621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominating_allocate_(NULL), 5622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch filler_free_space_size_(NULL), 5623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_upper_bound_(NULL) { 5624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 5625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UpdateSize(size); 5626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 5627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTrackSideEffectDominators); 5628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 5629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kNewSpacePromotion); 5630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_trace_pretenuring) { 5632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("HAllocate with AllocationSite %p %s\n", 5633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site.is_null() 5634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? static_cast<void*>(NULL) 5635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : static_cast<void*>(*allocation_site), 5636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure_flag == TENURED ? "tenured" : "not tenured"); 5637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Flags ComputeFlags(PretenureFlag pretenure_flag, 5641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType instance_type) { 5642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Flags flags = pretenure_flag == TENURED 5643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? (Heap::TargetSpaceId(instance_type) == OLD_POINTER_SPACE 5644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? ALLOCATE_IN_OLD_POINTER_SPACE : ALLOCATE_IN_OLD_DATA_SPACE) 5645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : ALLOCATE_IN_NEW_SPACE; 5646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (instance_type == FIXED_DOUBLE_ARRAY_TYPE) { 5647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags = static_cast<Flags>(flags | ALLOCATE_DOUBLE_ALIGNED); 5648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We have to fill the allocated object with one word fillers if we do 5650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // not use allocation folding since some allocations may depend on each 5651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // other, i.e., have a pointer to each other. A GC in between these 5652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // allocations may leave such objects behind in a not completely initialized 5653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // state. 5654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_use_gvn || !FLAG_use_allocation_folding) { 5655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags = static_cast<Flags>(flags | PREFILL_WITH_FILLER); 5656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (pretenure_flag == NOT_TENURED && 5658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSite::CanTrack(instance_type)) { 5659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags = static_cast<Flags>(flags | CLEAR_NEXT_MAP_WORD); 5660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return flags; 5662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateClearNextMapWord(bool clear_next_map_word) { 5665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_ = static_cast<Flags>(clear_next_map_word 5666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? flags_ | CLEAR_NEXT_MAP_WORD 5667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : flags_ & ~CLEAR_NEXT_MAP_WORD); 5668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateSize(HValue* size) { 5671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, size); 5672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size->IsInteger32Constant()) { 5673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_upper_bound_ = HConstant::cast(size); 5674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 5675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_upper_bound_ = NULL; 5676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocate* GetFoldableDominator(HAllocate* dominator); 5680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateFreeSpaceFiller(int32_t filler_size); 5682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void CreateFreeSpaceFiller(int32_t filler_size); 5684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsFoldable(HAllocate* allocate) { 5686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (IsNewSpaceAllocation() && allocate->IsNewSpaceAllocation()) || 5687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsOldDataSpaceAllocation() && allocate->IsOldDataSpaceAllocation()) || 5688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (IsOldPointerSpaceAllocation() && 5689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocate->IsOldPointerSpaceAllocation()); 5690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void ClearNextMapWord(int offset); 5693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Flags flags_; 5695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> known_initial_map_; 5696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocate* dominating_allocate_; 5697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreNamedField* filler_free_space_size_; 5698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant* size_upper_bound_; 5699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 5700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreCodeEntry FINAL: public HTemplateInstruction<2> { 5703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HStoreCodeEntry* New(Zone* zone, 5705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 5707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* code) { 5708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HStoreCodeEntry(function, code); 57093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 57113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 5712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch return Representation::Tagged(); 5713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() { return OperandAt(0); } 5716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* code_object() { return OperandAt(1); } 5717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry) 5719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5720b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 5721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreCodeEntry(HValue* function, HValue* code) { 5722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, function); 5723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, code); 5724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 5726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HInnerAllocatedObject FINAL : public HTemplateInstruction<2> { 57298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch public: 5730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInnerAllocatedObject* New(Zone* zone, 5731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 5732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 5733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* offset, 5734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type) { 5735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HInnerAllocatedObject(value, offset, type); 5736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* base_object() const { return OperandAt(0); } 5739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* offset() const { return OperandAt(1); } 5740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 5742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index == 0 ? Representation::Tagged() : Representation::Integer32(); 5743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 5746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject) 5748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 5750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HInnerAllocatedObject(HValue* value, 5751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* offset, 5752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type) : HTemplateInstruction<2>(type) { 5753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->IsAllocate()); 5754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(type.IsHeapObject()); 5755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, value); 5756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, offset); 57578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch set_representation(Representation::Tagged()); 57588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 5759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 57608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 57618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool StoringValueNeedsWriteBarrier(HValue* value) { 5763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !value->type().IsSmi() 5764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && !value->type().IsNull() 5765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && !value->type().IsBoolean() 5766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && !value->type().IsUndefined() 5767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch && !(value->IsConstant() && HConstant::cast(value)->ImmortalImmovable()); 5768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 57708b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline bool ReceiverObjectNeedsWriteBarrier(HValue* object, 5772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 5773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) { 5774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (object->IsInnerAllocatedObject()) { 5775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = HInnerAllocatedObject::cast(object)->base_object(); 5776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object->IsConstant() && HConstant::cast(object)->IsCell()) { 5778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object->IsConstant() && 5781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(object)->HasExternalReferenceValue()) { 5782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores to external references require no write barriers 5783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We definitely need a write barrier unless the object is the allocation 5786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // dominator. 5787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object == dominator && object->IsAllocate()) { 5788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores to new space allocations require no write barriers. 5789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (HAllocate::cast(object)->IsNewSpaceAllocation()) { 5790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores to old space allocations require no write barriers if the value is 5793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // a constant provably not in new space. 5794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsConstant() && HConstant::cast(value)->NotInNewSpace()) { 5795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores to old space allocations require no write barriers if the value is 5798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // an old space allocation. 5799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (value->IsInnerAllocatedObject()) { 5800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch value = HInnerAllocatedObject::cast(value)->base_object(); 5801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value->IsAllocate() && 5803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch !HAllocate::cast(value)->IsNewSpaceAllocation()) { 5804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 5805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 5808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochinline PointersToHereCheck PointersToHereCheckForObject(HValue* object, 5812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) { 5813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch while (object->IsInnerAllocatedObject()) { 5814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object = HInnerAllocatedObject::cast(object)->base_object(); 5815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (object == dominator && 5817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object->IsAllocate() && 5818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocate::cast(object)->IsNewSpaceAllocation()) { 5819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kPointersToHereAreAlwaysInteresting; 5820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return kPointersToHereMaybeInteresting; 5822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 5823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreGlobalCell FINAL : public HUnaryOperation { 5826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 5827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HStoreGlobalCell, HValue*, 5828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<PropertyCell>, PropertyDetails); 5829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<PropertyCell> cell() const { return cell_; } 5831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RequiresHoleCheck() { return details_.IsConfigurable(); } 5832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NeedsWriteBarrier() { 5833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return StoringValueNeedsWriteBarrier(value()); 5834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void FinalizeUniqueness() OVERRIDE { 5837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cell_ = Unique<PropertyCell>(cell_.handle()); 5838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 58418b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch return Representation::Tagged(); 58428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch } 5843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 58448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreGlobalCell) 58468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 58478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 5848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreGlobalCell(HValue* value, 5849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<PropertyCell> cell, 5850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails details) 5851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(value), 5852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch cell_(Unique<PropertyCell>::CreateUninitialized(cell)), 5853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch details_(details) { 5854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kGlobalVars); 5855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<PropertyCell> cell_; 5858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails details_; 58598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}; 58608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 58618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 5862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadContextSlot FINAL : public HUnaryOperation { 5863b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch public: 58643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum Mode { 58653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Perform a normal load of the context slot without checking its value. 58663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNoCheck, 58673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Load and check the value of the context slot. Deoptimize if it's the 58683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // hole value. This is used for checking for loading of uninitialized 58693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // harmony bindings where we deoptimize into full-codegen generated code 58703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which will subsequently throw a reference error. 58713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckDeoptimize, 58723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Load and check the value of the context slot. Return undefined if it's 58733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // the hole value. This is used for non-harmony const assignments 58743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckReturnUndefined 58753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 58763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadContextSlot(HValue* context, int slot_index, Mode mode) 5878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(context), slot_index_(slot_index), mode_(mode) { 5879b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch set_representation(Representation::Tagged()); 5880b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch SetFlag(kUseGVN); 5881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kContextSlots); 5882b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 5883b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5884b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index() const { return slot_index_; } 58853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode() const { return mode_; } 58863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 58873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool DeoptimizesOnHole() { 58883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ == kCheckDeoptimize; 58893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 5890c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9Ben Murdoch 5891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RequiresHoleCheck() const { 58923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ != kNoCheck; 58933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 58943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 58961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 5897b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 5898b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 59001e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5901257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot) 5902b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5903b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch protected: 5904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 5905b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch HLoadContextSlot* b = HLoadContextSlot::cast(other); 59061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return (slot_index() == b->slot_index()); 5907b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch } 5908b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5909b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch private: 5910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return !RequiresHoleCheck(); } 5911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 59121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index_; 59133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode_; 59141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 59151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 59161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreContextSlot FINAL : public HTemplateInstruction<2> { 59181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 59193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch enum Mode { 59203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Perform a normal store to the context slot without checking its previous 59213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // value. 59223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kNoCheck, 59233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Check the previous value of the context slot and deoptimize if it's the 59243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // hole value. This is used for checking for assignments to uninitialized 59253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // harmony bindings where we deoptimize into full-codegen generated code 59263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // which will subsequently throw a reference error. 59273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckDeoptimize, 59283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch // Check the previous value and ignore assignment if it isn't a hole value 59293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch kCheckIgnoreAssignment 59303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch }; 59313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HStoreContextSlot, HValue*, int, 5933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Mode, HValue*); 59341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 5936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 59371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block int slot_index() const { return slot_index_; } 59383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode() const { return mode_; } 59391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5940e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch bool NeedsWriteBarrier() { 59411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return StoringValueNeedsWriteBarrier(value()); 59421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 59431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 59443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool DeoptimizesOnHole() { 59453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ == kCheckDeoptimize; 59463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 59473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 59483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch bool RequiresHoleCheck() { 59493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return mode_ != kNoCheck; 59503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 59513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 5952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 59531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 59541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 59551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 59571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 5958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot) 59591e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 59601e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block private: 5961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreContextSlot(HValue* context, int slot_index, Mode mode, HValue* value) 5962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : slot_index_(slot_index), mode_(mode) { 5963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 5964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, value); 5965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kContextSlots); 5966b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 5967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5968b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch int slot_index_; 59693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Mode mode_; 5970b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}; 5971b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5972b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch 5973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Represents an access to a portion of an object, such as the map pointer, 5974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// array elements pointer, etc, but not accesses to array elements themselves. 5975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HObjectAccess FINAL { 5976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 5977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsInobject() const { 5978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return portion() != kBackingStore && portion() != kExternalMemory; 5979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsExternalMemory() const { 5982b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return portion() == kExternalMemory; 5983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsStringLength() const { 5986b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return portion() == kStringLengths; 5987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 5988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 5989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool IsMap() const { 5990b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return portion() == kMaps; 599144f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 599244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 5993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline int offset() const { 5994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OffsetField::decode(value_); 5995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 599669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 5997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Representation representation() const { 5998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::FromKind(RepresentationField::decode(value_)); 5999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 600044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Handle<String> name() const { 6002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return name_; 6003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 600444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool immutable() const { 6006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ImmutableField::decode(value_); 6007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 600844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Returns true if access is being made to an in-object property that 6010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // was already added to the object. 6011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool existing_inobject_property() const { 6012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ExistingInobjectPropertyField::decode(value_); 6013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 601444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6015b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline HObjectAccess WithRepresentation(Representation representation) { 6016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(portion(), offset(), representation, name(), 6017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch immutable(), existing_inobject_property()); 6018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 601944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForHeapNumberValue() { 6021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess( 6022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDouble, HeapNumber::kValueOffset, Representation::Double()); 6023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 602444f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForHeapNumberValueLowestBits() { 6026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kDouble, 6027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapNumber::kValueOffset, 6028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Integer32()); 6029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForHeapNumberValueHighestBits() { 6032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kDouble, 6033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapNumber::kValueOffset + kIntSize, 6034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Integer32()); 6035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForElementsPointer() { 6038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kElementsPointer, JSObject::kElementsOffset); 6039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForLiteralsPointer() { 6042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kLiteralsOffset); 6043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 604469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 6045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForNextFunctionLinkPointer() { 6046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kNextFunctionLinkOffset); 6047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForArrayLength(ElementsKind elements_kind) { 6050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess( 6051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayLengths, 6052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArray::kLengthOffset, 6053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsFastElementsKind(elements_kind) 6054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Smi() : Representation::Tagged()); 6055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForAllocationSiteOffset(int offset); 6058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForAllocationSiteList() { 6060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kExternalMemory, 0, Representation::Tagged(), 6061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>::null(), false, false); 60629fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 60639fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForFixedArrayLength() { 6065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess( 6066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayLengths, 6067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray::kLengthOffset, 6068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Smi()); 6069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 60709fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForStringHashField() { 6072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::kHashFieldOffset, 6074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Integer32()); 60759fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block } 60769fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForStringLength() { 6078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(String::kMaxLength <= Smi::kMaxValue); 6079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess( 6080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStringLengths, 6081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::kLengthOffset, 6082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Smi()); 6083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 60849fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForConsStringFirst() { 6086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, ConsString::kFirstOffset); 6087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 60889fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForConsStringSecond() { 6090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, ConsString::kSecondOffset); 6091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 60929fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForPropertiesPointer() { 6094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSObject::kPropertiesOffset); 6095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 60963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForPrototypeOrInitialMap() { 6098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kPrototypeOrInitialMapOffset); 6099b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForSharedFunctionInfoPointer() { 6102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kSharedFunctionInfoOffset); 6103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 6105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForCodeEntryPointer() { 6106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kCodeEntryOffset); 6107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForCodeOffset() { 6110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, SharedFunctionInfo::kCodeOffset); 6111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 6113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForOptimizedCodeMap() { 6114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SharedFunctionInfo::kOptimizedCodeMapOffset); 6116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForFunctionContextPointer() { 6119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, JSFunction::kContextOffset); 6120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMap() { 6123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kMaps, JSObject::kMapOffset); 61243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 61253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapAsInteger32() { 6127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kMaps, JSObject::kMapOffset, 6128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Integer32()); 6129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61301e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapInObjectProperties() { 6132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kInObjectPropertiesOffset, 6134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger8()); 6135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapInstanceType() { 6138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kInstanceTypeOffset, 6140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger8()); 61413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 61423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapInstanceSize() { 6144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kInstanceSizeOffset, 6146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger8()); 6147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61483fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapBitField() { 6150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kBitFieldOffset, 6152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger8()); 61533fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 61543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapBitField2() { 6156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kBitField2Offset, 6158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger8()); 6159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForNameHashField() { 6162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Name::kHashFieldOffset, 6164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::Integer32()); 6165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapInstanceTypeAndBitField() { 6168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT((Map::kInstanceTypeAndBitFieldOffset & 1) == 0); 6169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Ensure the two fields share one 16-bit word, endian-independent. 6170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT((Map::kBitFieldOffset & ~1) == 6171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (Map::kInstanceTypeOffset & ~1)); 6172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, 6173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map::kInstanceTypeAndBitFieldOffset, 6174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation::UInteger16()); 6175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForPropertyCellValue() { 6178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, PropertyCell::kValueOffset); 6179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForCellValue() { 6182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, Cell::kValueOffset); 61831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 61841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForAllocationMementoSite() { 6186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, AllocationMemento::kAllocationSiteOffset); 6187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForCounter() { 6190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kExternalMemory, 0, Representation::Integer32(), 6191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>::null(), false, false); 61921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 61931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForExternalUInteger8() { 6195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kExternalMemory, 0, Representation::UInteger8(), 6196b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>::null(), false, false); 6197b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 61981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to an offset in a fixed array header. 6200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForFixedArrayHeader(int offset); 62013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to an in-object property in a JSObject. 6203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This kind of access must be used when the object |map| is known and 6204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // in-object properties are being accessed. Accesses of the in-object 6205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // properties can have different semantics depending on whether corresponding 6206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // property was added to the map or not. 6207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForMapAndOffset(Handle<Map> map, int offset, 6208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation = Representation::Tagged()); 62091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to an in-object property in a JSObject. 6211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This kind of access can be used for accessing object header fields or 6212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // in-object properties if the map of the object is not known. 6213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForObservableJSObjectOffset(int offset, 6214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation = Representation::Tagged()) { 6215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ForMapAndOffset(Handle<Map>::null(), offset, representation); 621644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 621744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to an in-object property in a JSArray. 6219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayOffset(int offset); 6220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForContextSlot(int index); 6222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to the backing store of an object. 6224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForBackingStoreOffset(int offset, 6225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation = Representation::Tagged()); 62261e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access to a resolved field (in-object or backing store). 6228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForField(Handle<Map> map, int index, 6229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation, 6230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name); 62319fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 6232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create an access for the payload of a Cell or JSGlobalPropertyCell. 6233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForCellPayload(Isolate* isolate); 6234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSTypedArrayLength() { 6236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSTypedArray::kLengthOffset); 6238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferBackingStore() { 6241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBuffer::kBackingStoreOffset, Representation::External()); 6243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 62443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferByteLength() { 6246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBuffer::kByteLengthOffset, Representation::Tagged()); 6248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForExternalArrayExternalPointer() { 6251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExternalArray::kExternalPointerOffset, Representation::External()); 6253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferViewWeakNext() { 6256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBufferView::kWeakNextOffset); 6258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferWeakFirstView() { 6261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBuffer::kWeakFirstViewOffset); 6263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6265b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferViewBuffer() { 6266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBufferView::kBufferOffset); 6268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6269e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 6270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferViewByteOffset() { 6271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBufferView::kByteOffsetOffset); 6273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForJSArrayBufferViewByteLength() { 6276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess::ForObservableJSObjectOffset( 6277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSArrayBufferView::kByteLengthOffset); 6278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HObjectAccess ForGlobalObjectNativeContext() { 6281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HObjectAccess(kInobject, GlobalObject::kNativeContextOffset); 62821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 62831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline bool Equals(HObjectAccess that) const { 6285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value_ == that.value_; // portion and offset must match 6286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 6289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetGVNFlags(HValue *instr, PropertyAccessType access_type); 6290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // internal use only; different parts of an object or array 6293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum Portion { 6294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kMaps, // map of an object 6295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kArrayLengths, // the length of an array 6296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStringLengths, // the length of a string 6297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kElementsPointer, // elements pointer 6298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBackingStore, // some field in the backing store 6299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kDouble, // some double field 6300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kInobject, // some other in-object field 6301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kExternalMemory // some field in external memory 6302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 63031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess() : value_(0) {} 6305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess(Portion portion, int offset, 6307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation = Representation::Tagged(), 6308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name = Handle<String>::null(), 6309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool immutable = false, 6310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool existing_inobject_property = true) 6311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : value_(PortionField::encode(portion) | 6312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch RepresentationField::encode(representation.kind()) | 6313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ImmutableField::encode(immutable ? 1 : 0) | 6314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ExistingInobjectPropertyField::encode( 6315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch existing_inobject_property ? 1 : 0) | 6316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OffsetField::encode(offset)), 6317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch name_(name) { 6318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // assert that the fields decode correctly 6319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->offset() == offset); 6320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->portion() == portion); 6321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->immutable() == immutable); 6322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(this->existing_inobject_property() == existing_inobject_property); 6323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(RepresentationField::decode(value_) == representation.kind()); 6324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!this->existing_inobject_property() || IsInobject()); 6325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class PortionField : public BitField<Portion, 0, 3> {}; 6328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class RepresentationField : public BitField<Representation::Kind, 3, 4> {}; 6329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ImmutableField : public BitField<bool, 7, 1> {}; 6330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ExistingInobjectPropertyField : public BitField<bool, 8, 1> {}; 6331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class OffsetField : public BitField<int, 9, 23> {}; 6332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t value_; // encodes portion, representation, immutable, and offset 6334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name_; 63351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HLoadNamedField; 6337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class HStoreNamedField; 6338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend class SideEffectsTracker; 6339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch friend OStream& operator<<(OStream& os, const HObjectAccess& access); 63401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline Portion portion() const { 6342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PortionField::decode(value_); 6343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 63461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochOStream& operator<<(OStream& os, const HObjectAccess& access); 6348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadNamedField FINAL : public HTemplateInstruction<2> { 6351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 6352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HLoadNamedField, HValue*, 6353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HObjectAccess); 6354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P5(HLoadNamedField, HValue*, HValue*, 6355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess, const UniqueSet<Map>*, HType); 6356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 6358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dependency() const { 6359b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasDependency()); 6360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OperandAt(1); 6361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6362b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasDependency() const { return OperandAt(0) != OperandAt(1); } 6363b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access() const { return access_; } 6364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation field_representation() const { 6365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return access_.representation(); 63663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps() const { return maps_; } 6369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { return false; } 6371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasOutOfBoundsAccess(int size) OVERRIDE { 6372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !access().IsInobject() || access().offset() >= size; 6373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6375b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0 && access().IsExternalMemory()) { 6376b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object must be external in case of external memory access 6377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::External(); 63783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 6379b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 6380592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch } 6381b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 6382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 6383592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 6384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanBeReplacedWith(HValue* other) const { 6385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!CheckFlag(HValue::kCantBeReplaced)) return false; 6386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!type().Equals(other->type())) return false; 6387b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!representation().Equals(other->representation())) return false; 6388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other->IsLoadNamedField()) return true; 6389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadNamedField* that = HLoadNamedField::cast(other); 6390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->maps_ == that->maps_) return true; 6391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->maps_ == NULL || that->maps_ == NULL) return false; 6392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return this->maps_->IsSubset(that->maps_); 6393b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedField) 6396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6397b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 6398b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 6399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadNamedField* that = HLoadNamedField::cast(other); 6400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!this->access_.Equals(that->access_)) return false; 6401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (this->maps_ == that->maps_) return true; 6402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (this->maps_ != NULL && 6403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch that->maps_ != NULL && 6404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->maps_->Equals(that->maps_)); 64053fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 64063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadNamedField(HValue* object, 6409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dependency, 6410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access) 6411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : access_(access), maps_(NULL) { 6412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(object); 6413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, object); 6414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, dependency ? dependency : object); 6415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation representation = access.representation(); 6417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (representation.IsInteger8() || 6418b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch representation.IsUInteger8() || 6419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch representation.IsInteger16() || 6420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch representation.IsUInteger16()) { 6421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 6422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (representation.IsSmi()) { 6423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::Smi()); 6424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits()) { 6425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 6426b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6427b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(representation); 6428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (representation.IsDouble() || 6430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch representation.IsExternal() || 6431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch representation.IsInteger32()) { 6432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(representation); 6433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (representation.IsHeapObject()) { 6434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::HeapObject()); 6435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 64363fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } else { 6437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 64383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 6439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch access.SetGVNFlags(this, LOAD); 64403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 64413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadNamedField(HValue* object, 6443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dependency, 6444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access, 6445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps, 6446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HType type) 6447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(type), access_(access), maps_(maps) { 6448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(maps); 6449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NE(0, maps->size()); 64503fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_NOT_NULL(object); 6452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, object); 6453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, dependency ? dependency : object); 6454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(access.representation().IsHeapObject()); 6456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(type.IsHeapObject()); 6457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 6458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch access.SetGVNFlags(this, LOAD); 64603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 64613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 64633fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access_; 6465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const UniqueSet<Map>* maps_; 64663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}; 64673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 64683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadNamedGeneric FINAL : public HTemplateInstruction<2> { 6470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 6471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadNamedGeneric, HValue*, 6472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object>); 6473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 6475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(1); } 6476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> name() const { return name_; } 6477e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 6478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot() const { 6479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics && 6480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); 6481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return slot_; 6482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector() const { return feedback_vector_; } 6484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { 6485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics); 6486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch feedback_vector_ = vector; 6487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ = slot; 6488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 6492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6493e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 6494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 6495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadNamedGeneric) 6497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadNamedGeneric(HValue* context, HValue* object, Handle<Object> name) 6500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : name_(name), 6501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { 6502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 6503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, object); 6504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 65051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block SetAllSideEffects(); 65061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 65071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> name_; 6509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector_; 6510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot_; 6511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 65121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadFunctionPrototype FINAL : public HUnaryOperation { 6515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HLoadFunctionPrototype, HValue*); 6517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() { return OperandAt(0); } 6519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6521e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 6522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 6523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 6524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype) 65251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 6527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 65288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 65298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch private: 6530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HLoadFunctionPrototype(HValue* function) 6531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(function) { 6532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 6533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 6534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kCalls); 6535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass ArrayInstructionInterface { 6539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6540b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* GetKey() = 0; 6541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetKey(HValue* key) = 0; 6542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ElementsKind elements_kind() const = 0; 6543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // TryIncreaseBaseOffset returns false if overflow would result. 6544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool TryIncreaseBaseOffset(uint32_t increase_by_value) = 0; 6545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDehoisted() const = 0; 6546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual void SetDehoisted(bool is_dehoisted) = 0; 6547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ~ArrayInstructionInterface() { } 6548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Representation KeyedAccessIndexRequirement(Representation r) { 6550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return r.IsInteger32() || SmiValuesAre32Bits() 6551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Integer32() : Representation::Smi(); 6552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 65533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 65543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 65553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic const int kDefaultKeyedHeaderOffsetSentinel = -1; 6557b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6558b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum LoadKeyedHoleMode { 6559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NEVER_RETURN_HOLE, 6560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ALLOW_RETURN_HOLE 6561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadKeyed FINAL 6565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public HTemplateInstruction<3>, public ArrayInstructionInterface { 65663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 6567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HLoadKeyed, HValue*, HValue*, HValue*, 6568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind); 6569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P5(HLoadKeyed, HValue*, HValue*, HValue*, 6570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind, LoadKeyedHoleMode); 6571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P6(HLoadKeyed, HValue*, HValue*, HValue*, 6572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind, LoadKeyedHoleMode, int); 6573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_external() const { 6575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsExternalArrayElementsKind(elements_kind()); 6576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_fixed_typed_array() const { 6578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsFixedTypedArrayElementsKind(elements_kind()); 6579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_typed_elements() const { 6581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_external() || is_fixed_typed_array(); 6582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* elements() const { return OperandAt(0); } 6584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key() const { return OperandAt(1); } 6585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dependency() const { 6586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(HasDependency()); 6587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return OperandAt(2); 6588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool HasDependency() const { return OperandAt(0) != OperandAt(2); } 6590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t base_offset() const { return BaseOffsetField::decode(bit_field_); } 6591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool TryIncreaseBaseOffset(uint32_t increase_by_value); 6592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* GetKey() { return key(); } 6593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetKey(HValue* key) { SetOperandAt(1, key); } 6594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDehoisted() const { return IsDehoistedField::decode(bit_field_); } 6595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetDehoisted(bool is_dehoisted) { 6596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bit_field_ = IsDehoistedField::update(bit_field_, is_dehoisted); 6597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual ElementsKind elements_kind() const OVERRIDE { 6599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ElementsKindField::decode(bit_field_); 6600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LoadKeyedHoleMode hole_mode() const { 6602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HoleModeField::decode(bit_field_); 66033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 66043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_fast: tagged[int32] (none) 6607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_double: tagged[int32] (none) 6608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_fixed_typed_array: tagged[int32] (none) 6609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_external: external[int32] (none) 6610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) { 6611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_external() ? Representation::External() 6612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Tagged(); 6613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 1) { 6615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ArrayInstructionInterface::KeyedAccessIndexRequirement( 6616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OperandAt(1)->representation()); 6617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 66193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 66203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 6622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RequiredInputRepresentation(index); 6623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 66243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 66263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 6627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool UsesMustHandleHole() const; 6628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool AllUsesCanTreatHoleAsNaN() const; 6629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool RequiresHoleCheck() const; 6630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE; 6632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyed) 66343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 66353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 6636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 6637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!other->IsLoadKeyed()) return false; 6638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadKeyed* other_load = HLoadKeyed::cast(other); 6639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsDehoisted() && base_offset() != other_load->base_offset()) 6641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 6642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return elements_kind() == other_load->elements_kind(); 66433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 66443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 66453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 6646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadKeyed(HValue* obj, 6647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key, 6648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dependency, 6649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind, 6650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch LoadKeyedHoleMode mode = NEVER_RETURN_HOLE, 6651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = kDefaultKeyedHeaderOffsetSentinel) 6652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : bit_field_(0) { 6653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset = offset == kDefaultKeyedHeaderOffsetSentinel 6654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? GetDefaultHeaderSizeForElementsKind(elements_kind) 6655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : offset; 6656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bit_field_ = ElementsKindField::encode(elements_kind) | 6657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HoleModeField::encode(mode) | 6658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch BaseOffsetField::encode(offset); 66598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 6660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, obj); 6661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, key); 6662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, dependency != NULL ? dependency : obj); 6663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!is_typed_elements()) { 6665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // I can detect the case between storing double (holey and fast) and 6666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // smi/object by looking at elements_kind_. 6667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsFastSmiOrObjectElementsKind(elements_kind) || 6668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsFastDoubleElementsKind(elements_kind)); 6669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsFastSmiOrObjectElementsKind(elements_kind)) { 6671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsFastSmiElementsKind(elements_kind) && 6672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (!IsHoleyElementsKind(elements_kind) || 6673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mode == NEVER_RETURN_HOLE)) { 6674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::Smi()); 6675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits() && !RequiresHoleCheck()) { 6676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 6677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Smi()); 6679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 6682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kArrayElements); 6685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Double()); 6687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kDoubleArrayElements); 6688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (elements_kind == EXTERNAL_FLOAT32_ELEMENTS || 6691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind == EXTERNAL_FLOAT64_ELEMENTS || 6692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind == FLOAT32_ELEMENTS || 6693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind == FLOAT64_ELEMENTS) { 6694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Double()); 6695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 6697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_external()) { 6700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kExternalMemory); 6701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_fixed_typed_array()) { 6702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kTypedArrayElements); 6703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 6705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Native code could change the specialized array. 6707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kCalls); 6708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 67098b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch 6710257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch SetFlag(kUseGVN); 6711257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 6712257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { 6714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !RequiresHoleCheck(); 6715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Establish some checks around our packed fields 6718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch enum LoadKeyedBits { 6719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsForElementsKind = 5, 6720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsForHoleMode = 1, 6721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsForBaseOffset = 25, 6722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsForIsDehoisted = 1, 6723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStartElementsKind = 0, 6725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStartHoleMode = kStartElementsKind + kBitsForElementsKind, 6726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStartBaseOffset = kStartHoleMode + kBitsForHoleMode, 6727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kStartIsDehoisted = kStartBaseOffset + kBitsForBaseOffset 6728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch }; 6729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT((kBitsForElementsKind + kBitsForBaseOffset + 6731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kBitsForIsDehoisted) <= sizeof(uint32_t)*8); 6732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(kElementsKindCount <= (1 << kBitsForElementsKind)); 6733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class ElementsKindField: 6734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public BitField<ElementsKind, kStartElementsKind, kBitsForElementsKind> 6735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {}; // NOLINT 6736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class HoleModeField: 6737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public BitField<LoadKeyedHoleMode, kStartHoleMode, kBitsForHoleMode> 6738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {}; // NOLINT 6739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class BaseOffsetField: 6740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public BitField<uint32_t, kStartBaseOffset, kBitsForBaseOffset> 6741b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {}; // NOLINT 6742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch class IsDehoistedField: 6743b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public BitField<bool, kStartIsDehoisted, kBitsForIsDehoisted> 6744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch {}; // NOLINT 6745b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t bit_field_; 6746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadKeyedGeneric FINAL : public HTemplateInstruction<3> { 6750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 6751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HLoadKeyedGeneric, HValue*, 6752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*); 6753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 6754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key() const { return OperandAt(1); } 6755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(2); } 6756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot() const { 6757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics && 6758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ != FeedbackSlotInterface::kInvalidFeedbackSlot); 6759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return slot_; 6760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector() const { return feedback_vector_; } 6762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetVectorAndSlot(Handle<FixedArray> vector, int slot) { 6763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(FLAG_vector_ics); 6764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch feedback_vector_ = vector; 6765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slot_ = slot; 6766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 6769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // tagged[tagged] 6772257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return Representation::Tagged(); 6773257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 6774257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 6776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) 6778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HLoadKeyedGeneric(HValue* context, HValue* obj, HValue* key) 6781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : slot_(FeedbackSlotInterface::kInvalidFeedbackSlot) { 6782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 6783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, obj); 6784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, key); 6785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, context); 6786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 6787257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 6788257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> feedback_vector_; 6790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int slot_; 6791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 6792257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Indicates whether the store is a store to an entry that was previously 6795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// initialized or not. 6796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochenum StoreFieldOrKeyedMode { 6797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The entry could be either previously initialized or not. 6798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch INITIALIZING_STORE, 6799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // At the time of this store it is guaranteed that the entry is already 6800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // initialized. 6801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STORE_TO_INITIALIZED_ENTRY 6802257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 6803257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6804257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 6805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedField FINAL : public HTemplateInstruction<3> { 68061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 6807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HStoreNamedField, HValue*, 6808b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess, HValue*); 6809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HStoreNamedField, HValue*, 6810b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess, HValue*, StoreFieldOrKeyedMode); 6811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedField) 6813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasEscapingOperandAt(int index) OVERRIDE { 6815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index == 1; 68161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 6817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HasOutOfBoundsAccess(int size) OVERRIDE { 6818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !access().IsInobject() || access().offset() >= size; 6819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0 && access().IsExternalMemory()) { 6822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object must be external in case of external memory access 6823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::External(); 6824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (index == 1) { 6825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsInteger8() || 6826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch field_representation().IsUInteger8() || 6827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch field_representation().IsInteger16() || 6828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch field_representation().IsUInteger16() || 6829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch field_representation().IsInteger32()) { 6830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 6831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (field_representation().IsDouble()) { 6832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return field_representation(); 6833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (field_representation().IsSmi()) { 6834b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) { 6835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 6836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return field_representation(); 6838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (field_representation().IsExternal()) { 6839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::External(); 6840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 6843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HandleSideEffectDominator(GVNFlag side_effect, 6845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) OVERRIDE { 6846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(side_effect == kNewSpacePromotion); 6847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_use_write_barrier_elimination) return false; 6848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominator_ = dominator; 6849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 6850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 68521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 6854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 6855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* transition() const { return OperandAt(2); } 6856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access() const { return access_; } 6858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator() const { return dominator_; } 6859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_transition() const { return has_transition_; } 6860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode() const { return store_mode_; } 6861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> transition_map() const { 6863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (has_transition()) { 6864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Map>::cast( 6865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HConstant::cast(transition())->handle(Isolate::Current())); 6866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 6867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Map>(); 6868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 68701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetTransition(HConstant* transition) { 6872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!has_transition()); // Only set once. 6873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, transition); 6874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_transition_ = true; 6875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kMaps); 6876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NeedsWriteBarrier() const { 6879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!field_representation().IsDouble() || !has_transition()); 6880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsDouble()) return false; 6881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsSmi()) return false; 6882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsInteger32()) return false; 6883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsExternal()) return false; 6884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return StoringValueNeedsWriteBarrier(value()) && 6885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ReceiverObjectNeedsWriteBarrier(object(), value(), dominator()); 6886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NeedsWriteBarrierForMap() { 6889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ReceiverObjectNeedsWriteBarrier(object(), transition(), 6890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominator()); 6891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 68921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SmiCheck SmiCheckForWriteBarrier() const { 6894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (field_representation().IsHeapObject()) return OMIT_SMI_CHECK; 6895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value()->type().IsHeapObject()) return OMIT_SMI_CHECK; 6896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return INLINE_SMI_CHECK; 6897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PointersToHereCheck PointersToHereCheckForValue() const { 6900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PointersToHereCheckForObject(value(), dominator()); 6901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation field_representation() const { 6904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return access_.representation(); 6905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void UpdateValue(HValue* value) { 6908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, value); 6909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6910b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool CanBeReplacedWith(HStoreNamedField* that) const { 6912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!this->access().Equals(that->access())) return false; 6913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (SmiValuesAre32Bits() && 6914b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->field_representation().IsSmi() && 6915b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->store_mode() == INITIALIZING_STORE && 6916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch that->store_mode() == STORE_TO_INITIALIZED_ENTRY) { 6917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We cannot replace an initializing store to a smi field with a store to 6918b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // an initialized entry on 64-bit architectures (with 32-bit smis). 6919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 6920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return true; 69221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 6923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6924b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreNamedField(HValue* obj, 6926b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access, 6927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* val, 6928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE) 6929b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : access_(access), 6930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominator_(NULL), 6931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_transition_(false), 6932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch store_mode_(store_mode) { 6933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Stores to a non existing in-object property are allowed only to the 6934b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // newly allocated objects (via HAllocate or HInnerAllocatedObject). 6935b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!access.IsInobject() || access.existing_inobject_property() || 6936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch obj->IsAllocate() || obj->IsInnerAllocatedObject()); 6937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, obj); 6938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, val); 6939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, obj); 6940b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch access.SetGVNFlags(this, STORE); 6941b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 6942b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6943b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HObjectAccess access_; 6944b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator_; 6945b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_transition_ : 1; 6946b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode_ : 1; 69471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}; 69481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 69491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 6950b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreNamedGeneric FINAL : public HTemplateInstruction<3> { 695144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 6952b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreNamedGeneric, HValue*, 6953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>, HValue*, 6954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode); 6955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 6956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 6957b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(2); } 6958b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name() const { return name_; } 6959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode() const { return strict_mode_; } 696044f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 6962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6963b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 696544f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 696644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6967b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreNamedGeneric) 69683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 6969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 6970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreNamedGeneric(HValue* context, 6971b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object, 6972b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name, 6973b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 6974b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode) 6975b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : name_(name), 6976b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch strict_mode_(strict_mode) { 6977b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, object); 6978b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, value); 6979b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, context); 6980b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 6981b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 698244f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name_; 6984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode_; 698544f0eee88ff00398ff7f715fab053374d808c90dSteve Block}; 698644f0eee88ff00398ff7f715fab053374d808c90dSteve Block 698744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 6988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreKeyed FINAL 6989b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : public HTemplateInstruction<3>, public ArrayInstructionInterface { 69901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block public: 6991b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P4(HStoreKeyed, HValue*, HValue*, HValue*, 6992b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind); 6993b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P5(HStoreKeyed, HValue*, HValue*, HValue*, 6994b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind, StoreFieldOrKeyedMode); 6995b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P6(HStoreKeyed, HValue*, HValue*, HValue*, 6996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind, StoreFieldOrKeyedMode, int); 6997b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 6998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 6999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_fast: tagged[int32] = tagged 7000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_double: tagged[int32] = double 7001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_smi : tagged[int32] = smi 7002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_fixed_typed_array: tagged[int32] = (double | int32) 7003b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // kind_external: external[int32] = (double | int32) 7004b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 0) { 7005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_external() ? Representation::External() 7006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Tagged(); 7007b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (index == 1) { 7008b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return ArrayInstructionInterface::KeyedAccessIndexRequirement( 7009b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OperandAt(1)->representation()); 7010b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7011b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7012b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(index, 2); 7013b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return RequiredValueRepresentation(elements_kind_, store_mode_); 70141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 70151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7016b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static Representation RequiredValueRepresentation( 7017b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind kind, StoreFieldOrKeyedMode mode) { 7018b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsDoubleOrFloatElementsKind(kind)) { 7019b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Double(); 7020b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7021b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7022b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() && 7023b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch mode == STORE_TO_INITIALIZED_ENTRY) { 7024b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Integer32(); 7025b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7026b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7027b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsFastSmiElementsKind(kind)) { 7028b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Smi(); 7029b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7030b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7031b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsExternalArrayElementsKind(kind) || 7032b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch IsFixedTypedArrayElementsKind(kind) 7033b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Integer32() 7034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Tagged(); 7035b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7036b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_external() const { 7038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsExternalArrayElementsKind(elements_kind()); 7039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_fixed_typed_array() const { 7042b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsFixedTypedArrayElementsKind(elements_kind()); 7043b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7045b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_typed_elements() const { 7046b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return is_external() || is_fixed_typed_array(); 7047b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation observed_input_representation(int index) OVERRIDE { 7050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index < 2) return RequiredInputRepresentation(index); 7051b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsUninitialized()) { 7052b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::None(); 7053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Representation r = RequiredValueRepresentation(elements_kind_, store_mode_); 7055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For fast object elements kinds, don't assume anything. 7056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (r.IsTagged()) return Representation::None(); 7057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return r; 7058b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7060b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* elements() const { return OperandAt(0); } 7061b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key() const { return OperandAt(1); } 7062b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(2); } 7063b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool value_is_smi() const { 7064b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return IsFastSmiElementsKind(elements_kind_); 7065b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7066b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode() const { return store_mode_; } 7067b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind() const { return elements_kind_; } 7068b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t base_offset() const { return base_offset_; } 7069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool TryIncreaseBaseOffset(uint32_t increase_by_value); 7070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* GetKey() { return key(); } 7071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetKey(HValue* key) { SetOperandAt(1, key); } 7072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsDehoisted() const { return is_dehoisted_; } 7073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetDehoisted(bool is_dehoisted) { is_dehoisted_ = is_dehoisted; } 7074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsUninitialized() { return is_uninitialized_; } 7075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch void SetUninitialized(bool is_uninitialized) { 7076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_uninitialized_ = is_uninitialized; 7077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool IsConstantHoleStore() { 7080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value()->IsConstant() && HConstant::cast(value())->IsTheHole(); 7081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool HandleSideEffectDominator(GVNFlag side_effect, 7084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator) OVERRIDE { 7085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(side_effect == kNewSpacePromotion); 7086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominator_ = dominator; 7087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 7088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator() const { return dominator_; } 7091b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7092b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NeedsWriteBarrier() { 7093b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value_is_smi()) { 7094b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return false; 7095b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 7096b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return StoringValueNeedsWriteBarrier(value()) && 7097b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ReceiverObjectNeedsWriteBarrier(elements(), value(), dominator()); 7098b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7099b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7100b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7101b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PointersToHereCheck PointersToHereCheckForValue() const { 7102b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return PointersToHereCheckForObject(value(), dominator()); 7103b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7104b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7105b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool NeedsCanonicalization(); 7106b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7107b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 7108b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7109b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyed) 7110b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7111b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7112b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreKeyed(HValue* obj, HValue* key, HValue* val, 7113b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind, 7114b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode = INITIALIZING_STORE, 7115b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = kDefaultKeyedHeaderOffsetSentinel) 7116b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : elements_kind_(elements_kind), 7117b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch base_offset_(offset == kDefaultKeyedHeaderOffsetSentinel 7118b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? GetDefaultHeaderSizeForElementsKind(elements_kind) 7119b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : offset), 7120b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_dehoisted_(false), 7121b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_uninitialized_(false), 7122b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch store_mode_(store_mode), 7123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dominator_(NULL) { 7124b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, obj); 7125b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, key); 7126b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, val); 7127b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7128b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsFastObjectElementsKind(elements_kind)) { 7129b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTrackSideEffectDominators); 7130b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kNewSpacePromotion); 7131b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7132b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_external()) { 7133b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kExternalMemory); 7134b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 7135b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (IsFastDoubleElementsKind(elements_kind)) { 7136b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kDoubleArrayElements); 7137b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (IsFastSmiElementsKind(elements_kind)) { 7138b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kArrayElements); 7139b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else if (is_fixed_typed_array()) { 7140b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kTypedArrayElements); 7141b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kAllowUndefinedAsNaN); 7142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 7143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kArrayElements); 7144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7146b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // EXTERNAL_{UNSIGNED_,}{BYTE,SHORT,INT}_ELEMENTS are truncating. 7147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if ((elements_kind >= EXTERNAL_INT8_ELEMENTS && 7148b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind <= EXTERNAL_UINT32_ELEMENTS) || 7149b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch (elements_kind >= UINT8_ELEMENTS && 7150b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elements_kind <= INT32_ELEMENTS)) { 7151b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kTruncatingToInt32); 7152b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7154b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind_; 7156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t base_offset_; 7157b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_dehoisted_ : 1; 7158b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_uninitialized_ : 1; 7159b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StoreFieldOrKeyedMode store_mode_: 1; 7160b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* dominator_; 7161b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7164b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreKeyedGeneric FINAL : public HTemplateInstruction<4> { 7165b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HStoreKeyedGeneric, HValue*, 7167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HValue*, StrictMode); 7168b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 7170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key() const { return OperandAt(1); } 7171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(2); } 7172b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(3); } 7173b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode() const { return strict_mode_; } 7174b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // tagged[tagged] = tagged 71771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 71781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 71791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 7181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7182b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreKeyedGeneric) 7183b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7184b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7185b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStoreKeyedGeneric(HValue* context, 7186b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object, 7187b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* key, 7188b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value, 7189b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode) 7190b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : strict_mode_(strict_mode) { 7191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, object); 7192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, key); 7193b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, value); 7194b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(3, context); 7195b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 71961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 71971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7198b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode_; 7199b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7200b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7201b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7202b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTransitionElementsKind FINAL : public HTemplateInstruction<2> { 7203b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7204b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch inline static HTransitionElementsKind* New(Zone* zone, 7205b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 7206b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object, 7207b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> original_map, 7208b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> transitioned_map) { 7209b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) HTransitionElementsKind(context, object, 7210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch original_map, transitioned_map); 7211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7214b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 7218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(1); } 7219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> original_map() const { return original_map_; } 7220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> transitioned_map() const { return transitioned_map_; } 7221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind from_kind() const { return from_kind_; } 7222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind() const { return to_kind_; } 7223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 7225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 72271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 72281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block protected: 7229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 7230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTransitionElementsKind* instr = HTransitionElementsKind::cast(other); 7231b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return original_map_ == instr->original_map_ && 7232b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch transitioned_map_ == instr->transitioned_map_; 7233b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 72361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7238b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HTransitionElementsKind(HValue* context, 7239b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object, 7240b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> original_map, 7241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> transitioned_map) 7242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : original_map_(Unique<Map>(original_map)), 7243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch transitioned_map_(Unique<Map>(transitioned_map)), 7244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch from_kind_(original_map->elements_kind()), 7245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch to_kind_(transitioned_map->elements_kind()) { 7246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, object); 7247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, context); 7248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7249b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kElementsKind); 7250b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!IsSimpleMapChangeTransition(from_kind_, to_kind_)) { 7251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kElementsPointer); 7252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 7253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 72553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7257b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> original_map_; 7258b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Unique<Map> transitioned_map_; 7259b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind from_kind_; 7260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind to_kind_; 72613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 72623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 72633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringAdd FINAL : public HBinaryOperation { 72653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7266b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 7267b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 7268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 7269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 7270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure_flag = NOT_TENURED, 7271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringAddFlags flags = STRING_ADD_CHECK_BOTH, 7272b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site = 7273b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite>::null()); 7274b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringAddFlags flags() const { return flags_; } 7276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure_flag() const { return pretenure_flag_; } 7277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 7283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringAdd) 7285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 7287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 7288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return flags_ == HStringAdd::cast(other)->flags_ && 7289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure_flag_ == HStringAdd::cast(other)->pretenure_flag_; 7290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7291b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStringAdd(HValue* context, 7294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* left, 7295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* right, 7296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure_flag, 7297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StringAddFlags flags, 7298b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site) 7299b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HBinaryOperation(context, left, right, HType::String()), 7300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch flags_(flags), pretenure_flag_(pretenure_flag) { 73013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 7302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 7304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 7305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_trace_pretenuring) { 7306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PrintF("HStringAdd with AllocationSite %p %s\n", 7307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site.is_null() 7308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? static_cast<void*>(NULL) 7309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : static_cast<void*>(*allocation_site), 7310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure_flag == TENURED ? "tenured" : "not tenured"); 7311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 73123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 73133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // No side-effects except possible allocation: 7315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 7316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const StringAddFlags flags_; 7318b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const PretenureFlag pretenure_flag_; 7319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCharCodeAt FINAL : public HTemplateInstruction<3> { 7323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HStringCharCodeAt, 7325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, 7326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*); 73273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 73283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 7329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The index is supposed to be Integer32. 7330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index == 2 7331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Integer32() 7332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Tagged(); 73335d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch } 73343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 7336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string() const { return OperandAt(1); } 7337b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() const { return OperandAt(2); } 7338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt) 7340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 7342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 7343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE { 7345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) Range(0, String::kMaxUtf16CodeUnit); 7346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStringCharCodeAt(HValue* context, HValue* string, HValue* index) { 7350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 7351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, string); 7352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, index); 7353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 7354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 7356b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kStringChars); 7357b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 7358b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 73593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7360b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // No side effects: runtime function assumes string + number inputs. 7361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 73625d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}; 73635d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 73645d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch 7365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStringCharFromCode FINAL : public HTemplateInstruction<2> { 7366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 7368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 7369b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* char_code); 7370b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7372b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return index == 0 7373b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Representation::Tagged() 7374b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Integer32(); 7375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 7376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7377b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 7378b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 7379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { return true; } 7381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7382b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode) 7383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7385b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HStringCharFromCode(HValue* context, HValue* char_code) 7386b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::String()) { 73873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, context); 7388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, char_code); 7389b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7390b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7391b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 73923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 73933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7394b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { 7395b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return !value()->ToNumberCanBeObserved(); 73963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 73973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 73983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 73993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate <int V> 7401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HMaterializedLiteral : public HTemplateInstruction<V> { 7402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMaterializedLiteral<V>(int index, int depth, AllocationSiteMode mode) 7404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : literal_index_(index), depth_(depth), allocation_site_mode_(mode) { 7405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->set_representation(Representation::Tagged()); 74063fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 7407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HMaterializedLiteral<V>(int index, int depth) 7409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : literal_index_(index), depth_(depth), 7410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site_mode_(DONT_TRACK_ALLOCATION_SITE) { 7411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch this->set_representation(Representation::Tagged()); 74123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int literal_index() const { return literal_index_; } 7415b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int depth() const { return depth_; } 7416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteMode allocation_site_mode() const { 7417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return allocation_site_mode_; 7418e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 7419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 7421b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const FINAL OVERRIDE { return true; } 7422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7423b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int literal_index_; 7424b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int depth_; 7425b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteMode allocation_site_mode_; 7426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HRegExpLiteral FINAL : public HMaterializedLiteral<1> { 7430592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch public: 7431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4(HRegExpLiteral, 7432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray>, 7433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>, 7434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String>, 7435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int); 7436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7437e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch HValue* context() { return OperandAt(0); } 7438b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> literals() { return literals_; } 7439b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> pattern() { return pattern_; } 7440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> flags() { return flags_; } 7441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7443e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch return Representation::Tagged(); 7444e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 74451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7446b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(RegExpLiteral) 7447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 74493fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HRegExpLiteral(HValue* context, 7450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> literals, 74513fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> pattern, 7452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags, 7453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch int literal_index) 74543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch : HMaterializedLiteral<1>(literal_index, 0), 7455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch literals_(literals), 7456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch pattern_(pattern), 74573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch flags_(flags) { 74583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 74592b4ba1175df6a5a6b9b5cda034189197bf6565ecBen Murdoch SetAllSideEffects(); 7460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_type(HType::JSObject()); 74613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch } 7462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> literals_; 7464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> pattern_; 7465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<String> flags_; 7466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HFunctionLiteral FINAL : public HTemplateInstruction<1> { 7470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P2(HFunctionLiteral, 7472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo>, 7473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool); 74743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 74753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 74773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch return Representation::Tagged(); 7478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 7479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7480257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FunctionLiteral) 7481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info() const { return shared_info_; } 7483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch bool pretenure() const { return pretenure_; } 7484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_no_literals() const { return has_no_literals_; } 7485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_arrow() const { return IsArrowFunction(kind_); } 7486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_generator() const { return IsGeneratorFunction(kind_); } 7487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_concise_method() const { return IsConciseMethod(kind_); } 7488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionKind kind() const { return kind_; } 7489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode() const { return strict_mode_; } 7490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch private: 7492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HFunctionLiteral(HValue* context, Handle<SharedFunctionInfo> shared, 7493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pretenure) 7494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<1>(HType::JSObject()), 7495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shared_info_(shared), 7496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch kind_(shared->kind()), 7497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure_(pretenure), 7498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch has_no_literals_(shared->num_literals() == 0), 7499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch strict_mode_(shared->strict_mode()) { 7500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 7501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 7503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 7506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch Handle<SharedFunctionInfo> shared_info_; 7508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FunctionKind kind_; 7509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool pretenure_ : 1; 7510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool has_no_literals_ : 1; 7511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch StrictMode strict_mode_; 7512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTypeof FINAL : public HTemplateInstruction<2> { 7516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HTypeof, HValue*); 7518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 7520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(1); } 7521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 7523b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(Typeof) 7529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 75313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch explicit HTypeof(HValue* context, HValue* value) { 75323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(0, context); 75333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SetOperandAt(1, value); 7534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 7535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 7536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 7538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 75393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 75403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HTrapAllocationMemento FINAL : public HTemplateInstruction<1> { 7542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7543b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HTrapAllocationMemento, HValue*); 7544b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 75461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block return Representation::Tagged(); 75471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block } 75481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 7549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() { return OperandAt(0); } 7550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7551b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento) 7552b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7553b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7554b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HTrapAllocationMemento(HValue* obj) { 7555b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, obj); 7556b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HToFastProperties FINAL : public HUnaryOperation { 756144f0eee88ff00398ff7f715fab053374d808c90dSteve Block public: 7562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HToFastProperties, HValue*); 756344f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 756544f0eee88ff00398ff7f715fab053374d808c90dSteve Block return Representation::Tagged(); 756644f0eee88ff00398ff7f715fab053374d808c90dSteve Block } 756744f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7568257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(ToFastProperties) 756944f0eee88ff00398ff7f715fab053374d808c90dSteve Block 7570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HToFastProperties(HValue* value) : HUnaryOperation(value) { 7572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch set_representation(Representation::Tagged()); 7573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 7574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This instruction is not marked as kChangesMaps, but does 7576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // change the map of the input operand. Use it only when creating 7577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // object literals via a runtime call. 7578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(value->IsCallRuntime()); 7579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef DEBUG 7580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const Runtime::Function* function = HCallRuntime::cast(value)->function(); 7581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(function->function_id == Runtime::kCreateObjectLiteral); 7582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 7583e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch } 7584e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch 7585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 7586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HDateField FINAL : public HUnaryOperation { 75903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HDateField, HValue*, Smi*); 75923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 75933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Smi* index() const { return index_; } 75943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 75963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 75973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 75983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 75993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(DateField) 76003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 76013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 7602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HDateField(HValue* date, Smi* index) 7603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(date), index_(index) { 7604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 76073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch Smi* index_; 76083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 76093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 76103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSeqStringGetChar FINAL : public HTemplateInstruction<2> { 7612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch public: 7613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static HInstruction* New(Zone* zone, 7614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context, 7615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding, 7616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string, 7617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index); 7618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (index == 0) ? Representation::Tagged() 7621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Integer32(); 7622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 7623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding() const { return encoding_; } 7625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string() const { return OperandAt(0); } 7626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() const { return OperandAt(1); } 7627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar) 7629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch protected: 7631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 7632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return encoding() == HSeqStringGetChar::cast(other)->encoding(); 7633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch } 7634b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Range* InferRange(Zone* zone) OVERRIDE { 7636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (encoding() == String::ONE_BYTE_ENCODING) { 7637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) Range(0, String::kMaxOneByteCharCode); 7638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 7639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK_EQ(String::TWO_BYTE_ENCODING, encoding()); 7640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return new(zone) Range(0, String::kMaxUtf16CodeUnit); 7641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7642b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7643b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7644b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7645b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSeqStringGetChar(String::Encoding encoding, 7646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string, 7647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index) : encoding_(encoding) { 7648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, string); 7649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, index); 7650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Integer32()); 7651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kStringChars); 7653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 76543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 7655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 7656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding_; 7658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}; 7659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7660257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HSeqStringSetChar FINAL : public HTemplateInstruction<4> { 7662257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch public: 7663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P4( 7664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSeqStringSetChar, String::Encoding, 7665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, HValue*, HValue*); 7666257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding() { return encoding_; } 76683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch HValue* context() { return OperandAt(0); } 7669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string() { return OperandAt(1); } 7670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() { return OperandAt(2); } 7671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() { return OperandAt(3); } 7672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (index <= 1) ? Representation::Tagged() 7675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Representation::Integer32(); 7676257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch } 7677257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar) 7679257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HSeqStringSetChar(HValue* context, 7682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding, 7683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* string, 7684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index, 7685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value) : encoding_(encoding) { 7686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 7687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, string); 7688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(2, index); 7689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(3, value); 7690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kStringChars); 7692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7693257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 7694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::Encoding encoding_; 7695257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}; 7696257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 76973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HCheckMapValue FINAL : public HTemplateInstruction<2> { 76993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HCheckMapValue, HValue*, HValue*); 77013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 77033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 77043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 77073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 7709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value()->type().IsHeapObject()) return value()->type(); 7710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return HType::HeapObject(); 77113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* value() const { return OperandAt(0); } 7714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* map() const { return OperandAt(1); } 7715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HValue* Canonicalize() OVERRIDE; 77173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) 77193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch protected: 7721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual int RedefinedOperandIndex() { return 0; } 7722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool DataEquals(HValue* other) OVERRIDE { 77243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return true; 77253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 7726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7727b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7728b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HCheckMapValue(HValue* value, HValue* map) 7729b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HTemplateInstruction<2>(HType::HeapObject()) { 7730b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, value); 7731b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, map); 7732b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7733b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetFlag(kUseGVN); 7734b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kMaps); 7735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetDependsOnFlag(kElementsKind); 7736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 77373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 77383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForInPrepareMap FINAL : public HTemplateInstruction<2> { 77413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7742b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_WITH_CONTEXT_FACTORY_P1(HForInPrepareMap, HValue*); 77433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7744b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 77453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 77463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 7749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* enumerable() const { return OperandAt(1); } 77503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 77523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 77543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 77553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); 7758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HForInPrepareMap(HValue* context, 7761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object) { 7762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 7763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, object); 7764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetAllSideEffects(); 7766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 77673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 77683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HForInCacheArray FINAL : public HTemplateInstruction<2> { 77713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HForInCacheArray, HValue*, HValue*, int); 77733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 77753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Representation::Tagged(); 77763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* enumerable() const { return OperandAt(0); } 7779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* map() const { return OperandAt(1); } 7780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int idx() const { return idx_; } 77813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* index_cache() { 77833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return index_cache_; 77843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch void set_index_cache(HForInCacheArray* index_cache) { 77873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch index_cache_ = index_cache; 77883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 77913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7792b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 77933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 77943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 77953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); 77973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 77983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch private: 7799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HForInCacheArray(HValue* enumerable, 7800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* keys, 7801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int idx) : idx_(idx) { 7802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, enumerable); 7803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, keys); 7804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch int idx_; 78083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HForInCacheArray* index_cache_; 78093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 78103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 78113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HLoadFieldByIndex FINAL : public HTemplateInstruction<2> { 78133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch public: 7814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P2(HLoadFieldByIndex, HValue*, HValue*); 7815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 78163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HLoadFieldByIndex(HValue* object, 78173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch HValue* index) { 78183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(0, object); 78193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch SetOperandAt(1, index); 7820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kNewSpacePromotion); 78213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch set_representation(Representation::Tagged()); 78223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 78233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) OVERRIDE { 7825b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (index == 1) { 7826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Smi(); 7827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 7828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 78303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 78313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* object() const { return OperandAt(0); } 7833b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* index() const { return OperandAt(1); } 78343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const OVERRIDE; // NOLINT 78363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7837b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual HType CalculateInferredType() OVERRIDE { 78383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return HType::Tagged(); 78393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch } 78403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 78413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); 7842b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual bool IsDeletable() const OVERRIDE { return true; } 78453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}; 78463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 78473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 7848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HStoreFrameContext: public HUnaryOperation { 7849b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P1(HStoreFrameContext, HValue*); 7851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7852b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() { return OperandAt(0); } 7853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 7855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(StoreFrameContext) 7859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch explicit HStoreFrameContext(HValue* context) 7861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : HUnaryOperation(context) { 7862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetChangesFlag(kContextSlots); 7864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7868b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass HAllocateBlockContext: public HTemplateInstruction<2> { 7869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 7870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_INSTRUCTION_FACTORY_P3(HAllocateBlockContext, HValue*, 7871b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue*, Handle<ScopeInfo>); 7872b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* context() const { return OperandAt(0); } 7873b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function() const { return OperandAt(1); } 7874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info() const { return scope_info_; } 7875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual Representation RequiredInputRepresentation(int index) { 7877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Representation::Tagged(); 7878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7879b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch virtual OStream& PrintDataTo(OStream& os) const; // NOLINT 7881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7882b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DECLARE_CONCRETE_INSTRUCTION(AllocateBlockContext) 7883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch private: 7885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HAllocateBlockContext(HValue* context, 7886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HValue* function, 7887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info) 7888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : scope_info_(scope_info) { 7889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(0, context); 7890b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetOperandAt(1, function); 7891b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch set_representation(Representation::Tagged()); 7892b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 7893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info_; 7895b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 7896b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_INSTRUCTION 7900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DECLARE_CONCRETE_INSTRUCTION 7901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} } // namespace v8::internal 7903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 7904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif // V8_HYDROGEN_INSTRUCTIONS_H_ 7905