1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved. 2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be 3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file. 4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 5014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#ifndef V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_ 6014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_ 7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/hydrogen.h" 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium.h" 10014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/crankshaft/lithium-allocator.h" 11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/safepoint-table.h" 12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/utils.h" 13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 { 15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal { 16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Forward declarations. 18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LCodeGen; 19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \ 21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(AccessArgumentsAt) \ 22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(AddI) \ 23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Allocate) \ 24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ApplyArguments) \ 25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ArgumentsElements) \ 26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ArgumentsLength) \ 27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ArithmeticD) \ 28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ArithmeticT) \ 29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(BitI) \ 30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(BoundsCheck) \ 31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Branch) \ 32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CallWithDescriptor) \ 33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CallNewArray) \ 34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CallRuntime) \ 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(CheckArrayBufferNotNeutered) \ 36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckInstanceType) \ 37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckNonSmi) \ 38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckMaps) \ 39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckMapValue) \ 40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckSmi) \ 41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CheckValue) \ 42958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ClampDToUint8) \ 43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ClampIToUint8) \ 44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ClampTToUint8) \ 45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ClassOfTestAndBranch) \ 46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CompareNumericAndBranch) \ 47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CmpObjectEqAndBranch) \ 48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CmpHoleAndBranch) \ 49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CmpMapAndBranch) \ 50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(CmpT) \ 51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ConstantD) \ 52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ConstantE) \ 53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ConstantI) \ 54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ConstantS) \ 55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ConstantT) \ 56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Context) \ 57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DebugBreak) \ 58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DeclareGlobals) \ 59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Deoptimize) \ 60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DivByConstI) \ 61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DivByPowerOf2I) \ 62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DivI) \ 63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DoubleToI) \ 64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DoubleToSmi) \ 65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Drop) \ 66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Dummy) \ 67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(DummyUse) \ 68bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(FastAllocate) \ 69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(FlooringDivByConstI) \ 70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(FlooringDivByPowerOf2I) \ 71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(FlooringDivI) \ 72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ForInCacheArray) \ 73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ForInPrepareMap) \ 74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Goto) \ 75014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(HasInPrototypeChainAndBranch) \ 76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(HasInstanceTypeAndBranch) \ 77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(InnerAllocatedObject) \ 78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(InstructionGap) \ 79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Integer32ToDouble) \ 80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(InvokeFunction) \ 81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(IsStringAndBranch) \ 82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(IsSmiAndBranch) \ 83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(IsUndetectableAndBranch) \ 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Label) \ 85958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LazyBailout) \ 86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadContextSlot) \ 87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadRoot) \ 88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadFieldByIndex) \ 89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadFunctionPrototype) \ 90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadKeyed) \ 91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(LoadNamedField) \ 92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathAbs) \ 93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathClz32) \ 9413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MathCos) \ 9513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch V(MathSin) \ 96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathExp) \ 97bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(MathFloorD) \ 98bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(MathFloorI) \ 99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathFround) \ 100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathLog) \ 101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathMinMax) \ 102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathPowHalf) \ 103bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(MathRoundD) \ 104bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch V(MathRoundI) \ 105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MathSqrt) \ 106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(MaybeGrowElements) \ 107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ModByConstI) \ 108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ModByPowerOf2I) \ 109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ModI) \ 110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MulI) \ 111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MultiplyAddD) \ 112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(MultiplySubD) \ 113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(NumberTagD) \ 114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(NumberTagI) \ 115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(NumberTagU) \ 116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(NumberUntagD) \ 117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(OsrEntry) \ 118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Parameter) \ 119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Power) \ 120014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch V(Prologue) \ 121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(PushArgument) \ 122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Return) \ 123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(SeqStringGetChar) \ 124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(SeqStringSetChar) \ 125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ShiftI) \ 126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(SmiTag) \ 127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(SmiUntag) \ 128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StackCheck) \ 129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StoreCodeEntry) \ 130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StoreContextSlot) \ 131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StoreKeyed) \ 132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StoreNamedField) \ 133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StringAdd) \ 134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StringCharCodeAt) \ 135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StringCharFromCode) \ 136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(StringCompareAndBranch) \ 137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(SubI) \ 138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(RSubI) \ 139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(TaggedToI) \ 140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(ThisFunction) \ 141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(TransitionElementsKind) \ 142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(TrapAllocationMemento) \ 143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Typeof) \ 144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(TypeofIsAndBranch) \ 145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(Uint32ToDouble) \ 146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(UnknownOSRValue) \ 147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier V(WrapReceiver) 148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \ 150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Opcode opcode() const final { return LInstruction::k##type; } \ 151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CompileToNative(LCodeGen* generator) final; \ 152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* Mnemonic() const final { return mnemonic; } \ 153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static L##type* cast(LInstruction* instr) { \ 154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(instr->Is##type()); \ 155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return reinterpret_cast<L##type*>(instr); \ 156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_HYDROGEN_ACCESSOR(type) \ 160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier H##type* hydrogen() const { return H##type::cast(hydrogen_value()); } 161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LInstruction : public ZoneObject { 164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction() 166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : environment_(NULL), 167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier hydrogen_value_(NULL), 168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bit_field_(IsCallBits::encode(false)) {} 169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual ~LInstruction() {} 171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual void CompileToNative(LCodeGen* generator) = 0; 173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual const char* Mnemonic() const = 0; 174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual void PrintTo(StringStream* stream); 175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual void PrintDataTo(StringStream* stream); 176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual void PrintOutputOperandTo(StringStream* stream); 177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier enum Opcode { 179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare a unique enum value for each instruction. 180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_OPCODE(type) k##type, 181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_OPCODE) kNumberOfInstructions 182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_OPCODE 183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual Opcode opcode() const = 0; 186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare non-virtual type testers for all leaf IR classes. 188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_PREDICATE(type) \ 189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool Is##type() const { return opcode() == k##type; } 190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LITHIUM_CONCRETE_INSTRUCTION_LIST(DECLARE_PREDICATE) 191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_PREDICATE 192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Declare virtual predicates for instructions that don't have 194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // an opcode. 195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool IsGap() const { return false; } 196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool IsControl() const { return false; } 198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Try deleting this instruction if possible. 200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool TryDelete() { return false; } 201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_environment(LEnvironment* env) { environment_ = env; } 203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LEnvironment* environment() const { return environment_; } 204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool HasEnvironment() const { return environment_ != NULL; } 205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_pointer_map(LPointerMap* p) { pointer_map_.set(p); } 207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LPointerMap* pointer_map() const { return pointer_map_.get(); } 208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool HasPointerMap() const { return pointer_map_.is_set(); } 209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_hydrogen_value(HValue* value) { hydrogen_value_ = value; } 211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HValue* hydrogen_value() const { return hydrogen_value_; } 212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_, true); } 214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsCall() const { return IsCallBits::decode(bit_field_); } 215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch void MarkAsSyntacticTailCall() { 2173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bit_field_ = IsSyntacticTailCallBits::update(bit_field_, true); 2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch bool IsSyntacticTailCall() const { 2203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return IsSyntacticTailCallBits::decode(bit_field_); 2213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch } 2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch 223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Interface to the register allocator and iterators. 224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool ClobbersTemps() const { return IsCall(); } 225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool ClobbersRegisters() const { return IsCall(); } 226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool ClobbersDoubleRegisters(Isolate* isolate) const { 227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return IsCall(); 228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Interface to the register allocator and iterators. 231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsMarkedAsCall() const { return IsCall(); } 232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool HasResult() const = 0; 234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual LOperand* result() const = 0; 235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* FirstInput() { return InputAt(0); } 237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* Output() { return HasResult() ? result() : NULL; } 238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool HasInterestingComment(LCodeGen* gen) const { return true; } 240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#ifdef DEBUG 242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VerifyCall(); 243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual int InputCount() = 0; 246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual LOperand* InputAt(int i) = 0; 247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Iterator support. 250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier friend class InputIterator; 251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier friend class TempIterator; 253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual int TempCount() = 0; 254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual LOperand* TempAt(int i) = 0; 255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier class IsCallBits : public BitField<bool, 0, 1> {}; 2573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch class IsSyntacticTailCallBits : public BitField<bool, IsCallBits::kNext, 1> { 2583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch }; 259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LEnvironment* environment_; 261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SetOncePointer<LPointerMap> pointer_map_; 262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HValue* hydrogen_value_; 263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int bit_field_; 264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// R = number of result operands (0 or 1). 268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int R> 269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LTemplateResultInstruction : public LInstruction { 270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Allow 0 or 1 output operands. 272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier STATIC_ASSERT(R == 0 || R == 1); 273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasResult() const final { return R != 0 && result() != NULL; } 274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_result(LOperand* operand) { results_[0] = operand; } 275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* result() const override { return results_[0]; } 276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected: 278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier EmbeddedContainer<LOperand*, R> results_; 279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// R = number of result operands (0 or 1). 283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// I = number of input operands. 284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// T = number of temporary operands. 285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int R, int I, int T> 286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LTemplateInstruction : public LTemplateResultInstruction<R> { 287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected: 288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier EmbeddedContainer<LOperand*, I> inputs_; 289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier EmbeddedContainer<LOperand*, T> temps_; 290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Iterator support. 293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int InputCount() final { return I; } 294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* InputAt(int i) final { return inputs_[i]; } 295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int TempCount() final { return T; } 297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* TempAt(int i) final { return temps_[i]; } 298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LGap : public LTemplateInstruction<0, 0, 0> { 302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LGap(HBasicBlock* block) : block_(block) { 304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parallel_moves_[BEFORE] = NULL; 305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parallel_moves_[START] = NULL; 306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parallel_moves_[END] = NULL; 307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parallel_moves_[AFTER] = NULL; 308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Can't use the DECLARE-macro here because of sub-classes. 311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsGap() const override { return true; } 312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static LGap* cast(LInstruction* instr) { 314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(instr->IsGap()); 315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return reinterpret_cast<LGap*>(instr); 316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool IsRedundant() const; 319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* block() const { return block_; } 321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier enum InnerPosition { 323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier BEFORE, 324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier START, 325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier END, 326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier AFTER, 327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier FIRST_INNER_POSITION = BEFORE, 328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LAST_INNER_POSITION = AFTER 329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier }; 330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LParallelMove* GetOrCreateParallelMove(InnerPosition pos, Zone* zone) { 332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (parallel_moves_[pos] == NULL) { 333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier parallel_moves_[pos] = new (zone) LParallelMove(zone); 334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parallel_moves_[pos]; 336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LParallelMove* GetParallelMove(InnerPosition pos) { 339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parallel_moves_[pos]; 340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LParallelMove* parallel_moves_[LAST_INNER_POSITION + 1]; 344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* block_; 345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInstructionGap final : public LGap { 349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LInstructionGap(HBasicBlock* block) : LGap(block) {} 351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 352014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInterestingComment(LCodeGen* gen) const override { 353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return !IsRedundant(); 354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(InstructionGap, "gap") 357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 360014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LGoto final : public LTemplateInstruction<0, 0, 0> { 361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LGoto(HBasicBlock* block) : block_(block) {} 363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 364014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInterestingComment(LCodeGen* gen) const override; 365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Goto, "goto") 366014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsControl() const override { return true; } 368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int block_id() const { return block_->block_id(); } 370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* block_; 373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 376014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPrologue final : public LTemplateInstruction<0, 0, 0> { 377014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 378014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(Prologue, "prologue") 379014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 380014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLazyBailout final : public LTemplateInstruction<0, 0, 0> { 383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LLazyBailout() : gap_instructions_size_(0) {} 385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LazyBailout, "lazy-bailout") 387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_gap_instructions_size(int gap_instructions_size) { 389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier gap_instructions_size_ = gap_instructions_size; 390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int gap_instructions_size() { return gap_instructions_size_; } 392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int gap_instructions_size_; 395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummy final : public LTemplateInstruction<1, 0, 0> { 399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LDummy() {} 401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Dummy, "dummy") 402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDummyUse final : public LTemplateInstruction<1, 1, 0> { 406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LDummyUse(LOperand* value) { inputs_[0] = value; } 408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DummyUse, "dummy-use") 409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 412014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeoptimize final : public LTemplateInstruction<0, 0, 0> { 413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsControl() const override { return true; } 415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Deoptimize, "deoptimize") 416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Deoptimize) 417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLabel final : public LGap { 421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LLabel(HBasicBlock* block) : LGap(block), replacement_(NULL) {} 423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInterestingComment(LCodeGen* gen) const override { return false; } 425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Label, "label") 426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int block_id() const { return block()->block_id(); } 430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_loop_header() const { return block()->IsLoopHeader(); } 431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_osr_entry() const { return block()->is_osr_entry(); } 432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* label() { return &label_; } 433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LLabel* replacement() const { return replacement_; } 434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void set_replacement(LLabel* label) { replacement_ = label; } 435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool HasReplacement() const { return replacement_ != NULL; } 436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label label_; 439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LLabel* replacement_; 440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LParameter final : public LTemplateInstruction<1, 0, 0> { 444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier virtual bool HasInterestingComment(LCodeGen* gen) const { return false; } 446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Parameter, "parameter") 447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUnknownOSRValue final : public LTemplateInstruction<1, 0, 0> { 451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInterestingComment(LCodeGen* gen) const override { return false; } 453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(UnknownOSRValue, "unknown-osr-value") 454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniertemplate <int I, int T> 458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LControlInstruction : public LTemplateInstruction<0, I, T> { 459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LControlInstruction() : false_label_(NULL), true_label_(NULL) {} 461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 462014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool IsControl() const final { return true; } 463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int SuccessorCount() { return hydrogen()->SuccessorCount(); } 465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* SuccessorAt(int i) { return hydrogen()->SuccessorAt(i); } 466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int TrueDestination(LChunk* chunk) { 468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return chunk->LookupDestination(true_block_id()); 469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int FalseDestination(LChunk* chunk) { 471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return chunk->LookupDestination(false_block_id()); 472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* TrueLabel(LChunk* chunk) { 475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (true_label_ == NULL) { 476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier true_label_ = chunk->GetAssemblyLabel(TrueDestination(chunk)); 477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return true_label_; 479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* FalseLabel(LChunk* chunk) { 481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (false_label_ == NULL) { 482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier false_label_ = chunk->GetAssemblyLabel(FalseDestination(chunk)); 483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false_label_; 485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier protected: 488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int true_block_id() { return SuccessorAt(0)->block_id(); } 489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int false_block_id() { return SuccessorAt(1)->block_id(); } 490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HControlInstruction* hydrogen() { 493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return HControlInstruction::cast(this->hydrogen_value()); 494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* false_label_; 497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* true_label_; 498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 501014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LWrapReceiver final : public LTemplateInstruction<1, 2, 0> { 502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LWrapReceiver(LOperand* receiver, LOperand* function) { 504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = receiver; 505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = function; 506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(WrapReceiver, "wrap-receiver") 509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(WrapReceiver) 510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* receiver() { return inputs_[0]; } 512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* function() { return inputs_[1]; } 513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 516014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LApplyArguments final : public LTemplateInstruction<1, 4, 0> { 517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LApplyArguments(LOperand* function, LOperand* receiver, LOperand* length, 519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* elements) { 520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = function; 521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = receiver; 522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = length; 523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[3] = elements; 524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ApplyArguments, "apply-arguments") 5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(ApplyArguments) 528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* function() { return inputs_[0]; } 530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* receiver() { return inputs_[1]; } 531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* length() { return inputs_[2]; } 532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* elements() { return inputs_[3]; } 533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 536014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAccessArgumentsAt final : public LTemplateInstruction<1, 3, 0> { 537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LAccessArgumentsAt(LOperand* arguments, LOperand* length, LOperand* index) { 539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = arguments; 540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = length; 541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = index; 542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(AccessArgumentsAt, "access-arguments-at") 545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* arguments() { return inputs_[0]; } 547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* length() { return inputs_[1]; } 548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() { return inputs_[2]; } 549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsLength final : public LTemplateInstruction<1, 1, 0> { 555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LArgumentsLength(LOperand* elements) { inputs_[0] = elements; } 557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* elements() { return inputs_[0]; } 559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ArgumentsLength, "arguments-length") 561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArgumentsElements final : public LTemplateInstruction<1, 0, 0> { 565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ArgumentsElements, "arguments-elements") 567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(ArgumentsElements) 568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByPowerOf2I final : public LTemplateInstruction<1, 1, 0> { 572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LModByPowerOf2I(LOperand* dividend, int32_t divisor) { 574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 578958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() const { return divisor_; } 580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ModByPowerOf2I, "mod-by-power-of-2-i") 582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Mod) 583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModByConstI final : public LTemplateInstruction<1, 1, 0> { 590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LModByConstI(LOperand* dividend, int32_t divisor) { 592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() const { return divisor_; } 598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ModByConstI, "mod-by-const-i") 600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Mod) 601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LModI final : public LTemplateInstruction<1, 2, 0> { 608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LModI(LOperand* left, LOperand* right) { 610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ModI, "mod-i") 618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Mod) 619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> { 623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LDivByPowerOf2I(LOperand* dividend, int32_t divisor) { 625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() const { return divisor_; } 631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DivByPowerOf2I, "div-by-power-of-2-i") 633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Div) 634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivByConstI final : public LTemplateInstruction<1, 1, 0> { 641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LDivByConstI(LOperand* dividend, int32_t divisor) { 643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 645958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() const { return divisor_; } 649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DivByConstI, "div-by-const-i") 651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Div) 652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 658014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDivI final : public LTemplateInstruction<1, 2, 0> { 659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LDivI(LOperand* dividend, LOperand* divisor) { 661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = divisor; 663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 664958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* divisor() { return inputs_[1]; } 667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DivI, "div-i") 669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(BinaryOperation) 670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByPowerOf2I final : public LTemplateInstruction<1, 1, 0> { 674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LFlooringDivByPowerOf2I(LOperand* dividend, int32_t divisor) { 676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() { return divisor_; } 682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(FlooringDivByPowerOf2I, 684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "flooring-div-by-power-of-2-i") 685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv) 686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 689958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 692014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivByConstI final : public LTemplateInstruction<1, 1, 1> { 693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LFlooringDivByConstI(LOperand* dividend, int32_t divisor, LOperand* temp) { 695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier divisor_ = divisor; 697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 699958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor() const { return divisor_; } 702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(FlooringDivByConstI, "flooring-div-by-const-i") 705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv) 706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t divisor_; 709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 712014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LFlooringDivI final : public LTemplateInstruction<1, 2, 0> { 713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LFlooringDivI(LOperand* dividend, LOperand* divisor) { 715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = dividend; 716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = divisor; 717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* dividend() { return inputs_[0]; } 720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* divisor() { return inputs_[1]; } 721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(FlooringDivI, "flooring-div-i") 723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(MathFloorOfDiv) 724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 727014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMulI final : public LTemplateInstruction<1, 2, 0> { 728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LMulI(LOperand* left, LOperand* right) { 730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MulI, "mul-i") 738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Mul) 739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Instruction for computing multiplier * multiplicand + addend. 743014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMultiplyAddD final : public LTemplateInstruction<1, 3, 0> { 744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LMultiplyAddD(LOperand* addend, LOperand* multiplier, 746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplicand) { 747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = addend; 748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = multiplier; 749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = multiplicand; 750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* addend() { return inputs_[0]; } 753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplier() { return inputs_[1]; } 754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplicand() { return inputs_[2]; } 755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MultiplyAddD, "multiply-add-d") 757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 758958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Instruction for computing minuend - multiplier * multiplicand. 761014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMultiplySubD final : public LTemplateInstruction<1, 3, 0> { 762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LMultiplySubD(LOperand* minuend, LOperand* multiplier, 764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplicand) { 765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = minuend; 766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = multiplier; 767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = multiplicand; 768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* minuend() { return inputs_[0]; } 771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplier() { return inputs_[1]; } 772958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* multiplicand() { return inputs_[2]; } 773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MultiplySubD, "multiply-sub-d") 775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 778014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDebugBreak final : public LTemplateInstruction<0, 0, 0> { 779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DebugBreak, "break") 781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCompareNumericAndBranch final : public LControlInstruction<2, 0> { 785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCompareNumericAndBranch(LOperand* left, LOperand* right) { 787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch, 795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "compare-numeric-and-branch") 796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CompareNumericAndBranch) 797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return hydrogen()->token(); } 799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_double() const { return hydrogen()->representation().IsDouble(); } 800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 801014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 804bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.floor with a double result. 805bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathFloorD final : public LTemplateInstruction<1, 1, 0> { 806bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public: 807bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch explicit LMathFloorD(LOperand* value) { inputs_[0] = value; } 808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 809bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* value() { return inputs_[0]; } 810bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 811bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(MathFloorD, "math-floor-d") 812bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 813bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}; 814bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 815bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.floor with an integer result. 816bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathFloorI final : public LTemplateInstruction<1, 1, 0> { 817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 818bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch explicit LMathFloorI(LOperand* value) { inputs_[0] = value; } 819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 822bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(MathFloorI, "math-floor-i") 823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 824958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 826bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.round with a double result. 827bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathRoundD final : public LTemplateInstruction<1, 1, 0> { 828bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public: 829bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch explicit LMathRoundD(LOperand* value) { inputs_[0] = value; } 830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 831bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* value() { return inputs_[0]; } 832bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 833bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(MathRoundD, "math-round-d") 834bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 835bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}; 836bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 837bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch// Math.round with an integer result. 838bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LMathRoundI final : public LTemplateInstruction<1, 1, 1> { 839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 840bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LMathRoundI(LOperand* value, LOperand* temp) { 841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 848bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(MathRoundI, "math-round-i") 849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathFround final : public LTemplateInstruction<1, 1, 0> { 854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LMathFround(LOperand* value) { inputs_[0] = value; } 856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathFround, "math-fround") 860958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 863014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathAbs final : public LTemplateInstruction<1, 2, 0> { 864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LMathAbs(LOperand* context, LOperand* value) { 866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = context; 867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[1]; } 871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathAbs, "math-abs") 874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(UnaryMathOperation) 875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 878014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathLog final : public LTemplateInstruction<1, 1, 0> { 879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LMathLog(LOperand* value) { inputs_[0] = value; } 881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathLog, "math-log") 885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 888014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathClz32 final : public LTemplateInstruction<1, 1, 0> { 889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LMathClz32(LOperand* value) { inputs_[0] = value; } 891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathClz32, "math-clz32") 895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 89713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathCos final : public LTemplateInstruction<1, 1, 0> { 89813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public: 89913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch explicit LMathCos(LOperand* value) { inputs_[0] = value; } 90013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 90113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* value() { return inputs_[0]; } 902958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 90313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECLARE_CONCRETE_INSTRUCTION(MathCos, "math-cos") 90413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 90513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 90613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 90713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathSin final : public LTemplateInstruction<1, 1, 0> { 908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 90913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch explicit LMathSin(LOperand* value) { inputs_[0] = value; } 91013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 91113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LOperand* value() { return inputs_[0]; } 91213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 91313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DECLARE_CONCRETE_INSTRUCTION(MathSin, "math-sin") 91413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch}; 91513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 91613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 91713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochclass LMathExp final : public LTemplateInstruction<1, 1, 0> { 91813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch public: 91913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch explicit LMathExp(LOperand* value) { inputs_[0] = value; } 920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathExp, "math-exp") 924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 927014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathSqrt final : public LTemplateInstruction<1, 1, 0> { 928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LMathSqrt(LOperand* value) { inputs_[0] = value; } 930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathSqrt, "math-sqrt") 934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 937014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathPowHalf final : public LTemplateInstruction<1, 1, 0> { 938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LMathPowHalf(LOperand* value) { inputs_[0] = value; } 940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathPowHalf, "math-pow-half") 944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpObjectEqAndBranch final : public LControlInstruction<2, 0> { 948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCmpObjectEqAndBranch(LOperand* left, LOperand* right) { 950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CmpObjectEqAndBranch, "cmp-object-eq-and-branch") 958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CompareObjectEqAndBranch) 959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 962014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpHoleAndBranch final : public LControlInstruction<1, 0> { 963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCmpHoleAndBranch(LOperand* object) { inputs_[0] = object; } 965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 967958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CmpHoleAndBranch, "cmp-hole-and-branch") 969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CompareHoleAndBranch) 970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 973014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsStringAndBranch final : public LControlInstruction<1, 1> { 974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LIsStringAndBranch(LOperand* value, LOperand* temp) { 976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(IsStringAndBranch, "is-string-and-branch") 984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(IsStringAndBranch) 985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsSmiAndBranch final : public LControlInstruction<1, 0> { 991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LIsSmiAndBranch(LOperand* value) { inputs_[0] = value; } 993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(IsSmiAndBranch, "is-smi-and-branch") 997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(IsSmiAndBranch) 998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LIsUndetectableAndBranch final : public LControlInstruction<1, 1> { 1004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LIsUndetectableAndBranch(LOperand* value, LOperand* temp) { 1006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch, 1014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "is-undetectable-and-branch") 1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(IsUndetectableAndBranch) 1016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1017014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1021014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCompareAndBranch final : public LControlInstruction<3, 0> { 1022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStringCompareAndBranch(LOperand* context, LOperand* left, LOperand* right) { 1024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = left; 1026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = right; 1027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1030958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[1]; } 1031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[2]; } 1032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StringCompareAndBranch, 1034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "string-compare-and-branch") 1035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StringCompareAndBranch) 1036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return hydrogen()->token(); } 1038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1041958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInstanceTypeAndBranch final : public LControlInstruction<1, 0> { 1044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LHasInstanceTypeAndBranch(LOperand* value) { inputs_[0] = value; } 1046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, 1050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "has-instance-type-and-branch") 1051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(HasInstanceTypeAndBranch) 1052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1055958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClassOfTestAndBranch final : public LControlInstruction<1, 1> { 1057958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1058958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LClassOfTestAndBranch(LOperand* value, LOperand* temp) { 1059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, "class-of-test-and-branch") 1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(ClassOfTestAndBranch) 1068958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1073014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpT final : public LTemplateInstruction<1, 3, 0> { 1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCmpT(LOperand* context, LOperand* left, LOperand* right) { 1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = left; 1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = right; 1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[1]; } 1083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[2]; } 1084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CmpT, "cmp-t") 1086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CompareGeneric) 1087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return hydrogen()->token(); } 1089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1092014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LHasInPrototypeChainAndBranch final : public LControlInstruction<2, 0> { 1093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LHasInPrototypeChainAndBranch(LOperand* object, LOperand* prototype) { 1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[0] = object; 1096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[1] = prototype; 1097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object() const { return inputs_[0]; } 1100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* prototype() const { return inputs_[1]; } 1101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(HasInPrototypeChainAndBranch, 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "has-in-prototype-chain-and-branch") 1104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(HasInPrototypeChainAndBranch) 1105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBoundsCheck final : public LTemplateInstruction<0, 2, 0> { 1109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LBoundsCheck(LOperand* index, LOperand* length) { 1111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = index; 1112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = length; 1113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() { return inputs_[0]; } 1116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* length() { return inputs_[1]; } 1117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(BoundsCheck, "bounds-check") 1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(BoundsCheck) 1120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBitI final : public LTemplateInstruction<1, 2, 0> { 1124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LBitI(LOperand* left, LOperand* right) { 1126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return hydrogen()->op(); } 1134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(BitI, "bit-i") 1136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Bitwise) 1137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LShiftI final : public LTemplateInstruction<1, 2, 0> { 1141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LShiftI(Token::Value op, LOperand* left, LOperand* right, bool can_deopt) 1143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : op_(op), can_deopt_(can_deopt) { 1144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return op_; } 1149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool can_deopt() const { return can_deopt_; } 1152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ShiftI, "shift-i") 1154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op_; 1157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool can_deopt_; 1158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1161014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSubI final : public LTemplateInstruction<1, 2, 0> { 1162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LSubI(LOperand* left, LOperand* right) { 1164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(SubI, "sub-i") 1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Sub) 1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LRSubI final : public LTemplateInstruction<1, 2, 0> { 1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LRSubI(LOperand* left, LOperand* right) { 1179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(RSubI, "rsub-i") 1187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Sub) 1188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantI final : public LTemplateInstruction<1, 0, 0> { 1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ConstantI, "constant-i") 1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Constant) 1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int32_t value() const { return hydrogen()->Integer32Value(); } 1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantS final : public LTemplateInstruction<1, 0, 0> { 1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ConstantS, "constant-s") 1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Constant) 1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Smi* value() const { return Smi::FromInt(hydrogen()->Integer32Value()); } 1206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantD final : public LTemplateInstruction<1, 0, 0> { 1210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ConstantD, "constant-d") 1212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Constant) 1213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier double value() const { return hydrogen()->DoubleValue(); } 1215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch uint64_t bits() const { return hydrogen()->DoubleValueAsBits(); } 1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantE final : public LTemplateInstruction<1, 0, 0> { 1220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ConstantE, "constant-e") 1222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Constant) 1223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ExternalReference value() const { 1225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->ExternalReferenceValue(); 1226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LConstantT final : public LTemplateInstruction<1, 0, 0> { 1231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ConstantT, "constant-t") 1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Constant) 1234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Object> value(Isolate* isolate) const { 1236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->handle(isolate); 1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LBranch final : public LControlInstruction<1, 0> { 1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LBranch(LOperand* value) { inputs_[0] = value; } 1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Branch, "branch") 1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Branch) 1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCmpMapAndBranch final : public LControlInstruction<1, 1> { 1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCmpMapAndBranch(LOperand* value, LOperand* temp) { 1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CmpMapAndBranch, "cmp-map-and-branch") 1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CompareMap) 1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map() const { return hydrogen()->map().handle(); } 1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringGetChar final : public LTemplateInstruction<1, 2, 0> { 1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LSeqStringGetChar(LOperand* string, LOperand* index) { 1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = string; 1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = index; 1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* string() const { return inputs_[0]; } 1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() const { return inputs_[1]; } 1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(SeqStringGetChar, "seq-string-get-char") 1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(SeqStringGetChar) 1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSeqStringSetChar final : public LTemplateInstruction<1, 4, 0> { 1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LSeqStringSetChar(LOperand* context, LOperand* string, LOperand* index, 1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value) { 1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = string; 1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = index; 1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[3] = value; 1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* string() { return inputs_[1]; } 1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() { return inputs_[2]; } 1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[3]; } 1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(SeqStringSetChar, "seq-string-set-char") 1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(SeqStringSetChar) 1302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1305014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAddI final : public LTemplateInstruction<1, 2, 0> { 1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LAddI(LOperand* left, LOperand* right) { 1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(AddI, "add-i") 1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Add) 1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1320014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMathMinMax final : public LTemplateInstruction<1, 2, 0> { 1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LMathMinMax(LOperand* left, LOperand* right) { 1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(MathMinMax, "math-min-max") 1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(MathMinMax) 1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1335014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPower final : public LTemplateInstruction<1, 2, 0> { 1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LPower(LOperand* left, LOperand* right) { 1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Power, "power") 1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Power) 1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticD final : public LTemplateInstruction<1, 2, 0> { 1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LArithmeticD(Token::Value op, LOperand* left, LOperand* right) : op_(op) { 1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = left; 1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = right; 1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return op_; } 1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[0]; } 1359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[1]; } 1360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1361014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Opcode opcode() const override { return LInstruction::kArithmeticD; } 1362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CompileToNative(LCodeGen* generator) override; 1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* Mnemonic() const override; 1364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op_; 1367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1370014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LArithmeticT final : public LTemplateInstruction<1, 3, 0> { 1371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LArithmeticT(Token::Value op, LOperand* context, LOperand* left, 1373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right) 1374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : op_(op) { 1375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = left; 1377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = right; 1378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[1]; } 1382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[2]; } 1383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op() const { return op_; } 1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Opcode opcode() const override { return LInstruction::kArithmeticT; } 1386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void CompileToNative(LCodeGen* generator) override; 1387014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* Mnemonic() const override; 1388014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(BinaryOperation) 1390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Token::Value op_; 1393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LReturn final : public LTemplateInstruction<0, 3, 0> { 1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LReturn(LOperand* value, LOperand* context, LOperand* parameter_count) { 1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = context; 1401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = parameter_count; 1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool has_constant_parameter_count() { 1407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return parameter_count()->IsConstantOperand(); 1408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LConstantOperand* constant_parameter_count() { 1410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(has_constant_parameter_count()); 1411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return LConstantOperand::cast(parameter_count()); 1412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* parameter_count() { return inputs_[2]; } 1414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Return, "return") 1416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadNamedField final : public LTemplateInstruction<1, 1, 0> { 1420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LLoadNamedField(LOperand* object) { inputs_[0] = object; } 1422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 1424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadNamedField, "load-named-field") 1426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(LoadNamedField) 1427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFunctionPrototype final : public LTemplateInstruction<1, 1, 0> { 1431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LLoadFunctionPrototype(LOperand* function) { inputs_[0] = function; } 1433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* function() { return inputs_[0]; } 1435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadFunctionPrototype, "load-function-prototype") 1437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(LoadFunctionPrototype) 1438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadRoot final : public LTemplateInstruction<1, 0, 0> { 1442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadRoot, "load-root") 1444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(LoadRoot) 1445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Heap::RootListIndex index() const { return hydrogen()->index(); } 1447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1450014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadKeyed final : public LTemplateInstruction<1, 3, 0> { 1451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1452014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LLoadKeyed(LOperand* elements, LOperand* key, LOperand* backing_store_owner) { 1453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = elements; 1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = key; 1455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[2] = backing_store_owner; 1456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* elements() { return inputs_[0]; } 1459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* key() { return inputs_[1]; } 1460014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner() { return inputs_[2]; } 1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind elements_kind() const { return hydrogen()->elements_kind(); } 1462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_fixed_typed_array() const { 1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->is_fixed_typed_array(); 1464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadKeyed, "load-keyed") 1467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(LoadKeyed) 1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1469014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier uint32_t base_offset() const { return hydrogen()->base_offset(); } 1471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadContextSlot final : public LTemplateInstruction<1, 1, 0> { 1475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LLoadContextSlot(LOperand* context) { inputs_[0] = context; } 1477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadContextSlot, "load-context-slot") 1481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(LoadContextSlot) 1482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int slot_index() { return hydrogen()->slot_index(); } 1484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1485014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1489014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreContextSlot final : public LTemplateInstruction<0, 2, 0> { 1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStoreContextSlot(LOperand* context, LOperand* value) { 1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = value; 1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[1]; } 1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StoreContextSlot, "store-context-slot") 1500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StoreContextSlot) 1501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int slot_index() { return hydrogen()->slot_index(); } 1503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1504014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1508014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPushArgument final : public LTemplateInstruction<0, 1, 0> { 1509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LPushArgument(LOperand* value) { inputs_[0] = value; } 1511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(PushArgument, "push-argument") 1515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1518014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDrop final : public LTemplateInstruction<0, 0, 0> { 1519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LDrop(int count) : count_(count) {} 1521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int count() const { return count_; } 1523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Drop, "drop") 1525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int count_; 1528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1531014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreCodeEntry final : public LTemplateInstruction<0, 2, 0> { 1532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStoreCodeEntry(LOperand* function, LOperand* code_object) { 1534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = function; 1535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = code_object; 1536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* function() { return inputs_[0]; } 1539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* code_object() { return inputs_[1]; } 1540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1541014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StoreCodeEntry, "store-code-entry") 1544958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StoreCodeEntry) 1545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1548014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInnerAllocatedObject final : public LTemplateInstruction<1, 2, 0> { 1549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInnerAllocatedObject(LOperand* base_object, LOperand* offset) { 1551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = base_object; 1552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = offset; 1553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* base_object() const { return inputs_[0]; } 1556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* offset() const { return inputs_[1]; } 1557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1558014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(InnerAllocatedObject, "inner-allocated-object") 1561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1564014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LThisFunction final : public LTemplateInstruction<1, 0, 0> { 1565958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1566958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ThisFunction, "this-function") 1567958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(ThisFunction) 1568958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1569958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1570958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LContext final : public LTemplateInstruction<1, 0, 0> { 1572958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1573958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Context, "context") 1574958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Context) 1575958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1576958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1577958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1578014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDeclareGlobals final : public LTemplateInstruction<0, 1, 0> { 1579958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1580958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LDeclareGlobals(LOperand* context) { inputs_[0] = context; } 1581958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1582958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DeclareGlobals, "declare-globals") 1585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(DeclareGlobals) 1586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1589014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallWithDescriptor final : public LTemplateResultInstruction<1> { 1590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCallWithDescriptor(CallInterfaceDescriptor descriptor, 1592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const ZoneList<LOperand*>& operands, Zone* zone) 1593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : descriptor_(descriptor), 1594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_(descriptor.GetRegisterParameterCount() + 1595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kImplicitRegisterParameterCount, 1596014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch zone) { 1597014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(descriptor.GetRegisterParameterCount() + 1598014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch kImplicitRegisterParameterCount == 1599014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch operands.length()); 1600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_.AddAll(operands, zone); 1601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* target() const { return inputs_[0]; } 1604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const CallInterfaceDescriptor descriptor() { return descriptor_; } 1606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1607014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(CallWithDescriptor) 1608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // The target and context are passed as implicit parameters that are not 1610014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // explicitly listed in the descriptor. 1611014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static const int kImplicitRegisterParameterCount = 2; 1612014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CallWithDescriptor, "call-with-descriptor") 1615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1616014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int arity() const { return hydrogen()->argument_count() - 1; } 1619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CallInterfaceDescriptor descriptor_; 1621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ZoneList<LOperand*> inputs_; 1622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Iterator support. 1624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int InputCount() final { return inputs_.length(); } 1625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* InputAt(int i) final { return inputs_[i]; } 1626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1627014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int TempCount() final { return 0; } 1628014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* TempAt(int i) final { return NULL; } 1629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1632014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInvokeFunction final : public LTemplateInstruction<1, 2, 0> { 1633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInvokeFunction(LOperand* context, LOperand* function) { 1635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1636958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = function; 1637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1640958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* function() { return inputs_[1]; } 1641958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1642958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(InvokeFunction, "invoke-function") 1643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(InvokeFunction) 1644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1645014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int arity() const { return hydrogen()->argument_count() - 1; } 1648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1651014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallNewArray final : public LTemplateInstruction<1, 2, 0> { 1652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1653958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCallNewArray(LOperand* context, LOperand* constructor) { 1654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = constructor; 1656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* constructor() { return inputs_[1]; } 1660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CallNewArray, "call-new-array") 1662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CallNewArray) 1663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int arity() const { return hydrogen()->argument_count() - 1; } 1667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1668958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1670014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCallRuntime final : public LTemplateInstruction<1, 1, 0> { 1671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCallRuntime(LOperand* context) { inputs_[0] = context; } 1673958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CallRuntime, "call-runtime") 1677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CallRuntime) 1678958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1679014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool ClobbersDoubleRegisters(Isolate* isolate) const override { 1680958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return save_doubles() == kDontSaveFPRegs; 1681958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1682958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1683958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const Runtime::Function* function() const { return hydrogen()->function(); } 1684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int arity() const { return hydrogen()->argument_count(); } 1685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SaveFPRegsMode save_doubles() const { return hydrogen()->save_doubles(); } 1686958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1688958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1689014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LInteger32ToDouble final : public LTemplateInstruction<1, 1, 0> { 1690958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1691958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LInteger32ToDouble(LOperand* value) { inputs_[0] = value; } 1692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1694958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Integer32ToDouble, "int32-to-double") 1696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LUint32ToDouble final : public LTemplateInstruction<1, 1, 0> { 1700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LUint32ToDouble(LOperand* value) { inputs_[0] = value; } 1702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1704958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Uint32ToDouble, "uint32-to-double") 1706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1708958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1709014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagI final : public LTemplateInstruction<1, 1, 2> { 1710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LNumberTagI(LOperand* value, LOperand* temp1, LOperand* temp2) { 1712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp1; 1714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[1] = temp2; 1715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp1() { return temps_[0]; } 1719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2() { return temps_[1]; } 1720958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(NumberTagI, "number-tag-i") 1722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1724958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1725014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagU final : public LTemplateInstruction<1, 1, 2> { 1726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LNumberTagU(LOperand* value, LOperand* temp1, LOperand* temp2) { 1728958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp1; 1730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[1] = temp2; 1731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1732958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp1() { return temps_[0]; } 1735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2() { return temps_[1]; } 1736958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(NumberTagU, "number-tag-u") 1738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1740958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1741014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberTagD final : public LTemplateInstruction<1, 1, 2> { 1742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LNumberTagD(LOperand* value, LOperand* temp, LOperand* temp2) { 1744958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[1] = temp2; 1747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1749958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2() { return temps_[1]; } 1752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(NumberTagD, "number-tag-d") 1754958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Change) 1755958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1756958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1757958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToSmi final : public LTemplateInstruction<1, 1, 0> { 1759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LDoubleToSmi(LOperand* value) { inputs_[0] = value; } 1761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1763958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DoubleToSmi, "double-to-smi") 1765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(UnaryOperation) 1766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1768958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Sometimes truncating conversion from a tagged value to an int32. 1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LDoubleToI final : public LTemplateInstruction<1, 1, 0> { 1773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LDoubleToI(LOperand* value) { inputs_[0] = value; } 1775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(DoubleToI, "double-to-i") 1779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(UnaryOperation) 1780958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Truncating conversion from a tagged value to an int32. 1786014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTaggedToI final : public LTemplateInstruction<1, 1, 2> { 1787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LTaggedToI(LOperand* value, LOperand* temp, LOperand* temp2) { 1789958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[1] = temp2; 1792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2() { return temps_[1]; } 1797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(TaggedToI, "tagged-to-i") 1799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Change) 1800958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool truncating() { return hydrogen()->CanTruncateToInt32(); } 1802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1804958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1805014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiTag final : public LTemplateInstruction<1, 1, 0> { 1806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LSmiTag(LOperand* value) { inputs_[0] = value; } 1808958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(SmiTag, "smi-tag") 1812958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Change) 1813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LNumberUntagD final : public LTemplateInstruction<1, 1, 0> { 1817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LNumberUntagD(LOperand* value) { inputs_[0] = value; } 1819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1820958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(NumberUntagD, "double-untag") 1823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Change) 1824c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 1825c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool truncating() { return hydrogen()->CanTruncateToNumber(); } 1826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1828958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1829014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LSmiUntag final : public LTemplateInstruction<1, 1, 0> { 1830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LSmiUntag(LOperand* value, bool needs_check) : needs_check_(needs_check) { 1832958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 1833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 1836958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool needs_check() const { return needs_check_; } 1837958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1838958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(SmiUntag, "smi-untag") 1839958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1840958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 1841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool needs_check_; 1842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1844958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1845014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreNamedField final : public LTemplateInstruction<0, 2, 1> { 1846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStoreNamedField(LOperand* object, LOperand* value, LOperand* temp) { 1848958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = object; 1849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = value; 1850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 1851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1852958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 1854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[1]; } 1855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 1856958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1857958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StoreNamedField, "store-named-field") 1858958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StoreNamedField) 1859958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Representation representation() const { 1863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->field_representation(); 1864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1865958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1868014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStoreKeyed final : public LTemplateInstruction<0, 4, 0> { 1869958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1870014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LStoreKeyed(LOperand* object, LOperand* key, LOperand* value, 1871014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner) { 1872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = object; 1873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = key; 1874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = value; 1875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[3] = backing_store_owner; 1876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1877958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool is_fixed_typed_array() const { 1879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->is_fixed_typed_array(); 1880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1881958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* elements() { return inputs_[0]; } 1882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* key() { return inputs_[1]; } 1883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[2]; } 1884014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* backing_store_owner() { return inputs_[3]; } 1885958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind elements_kind() const { return hydrogen()->elements_kind(); } 1886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StoreKeyed, "store-keyed") 1888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StoreKeyed) 1889958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1890014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool NeedsCanonicalization() { 1892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (hydrogen()->value()->IsAdd() || hydrogen()->value()->IsSub() || 1893958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier hydrogen()->value()->IsMul() || hydrogen()->value()->IsDiv()) { 1894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return false; 1895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->NeedsCanonicalization(); 1897958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier uint32_t base_offset() const { return hydrogen()->base_offset(); } 1899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1900958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1901958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1902014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTransitionElementsKind final : public LTemplateInstruction<0, 2, 1> { 1903958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1904958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LTransitionElementsKind(LOperand* object, LOperand* context, 1905958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* new_map_temp) { 1906958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = object; 1907958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = context; 1908958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = new_map_temp; 1909958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1910958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1911958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[1]; } 1912958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 1913958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* new_map_temp() { return temps_[0]; } 1914958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1915958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind, 1916958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier "transition-elements-kind") 1917958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(TransitionElementsKind) 1918958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 1920958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1921958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> original_map() { return hydrogen()->original_map().handle(); } 1922958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> transitioned_map() { 1923958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return hydrogen()->transitioned_map().handle(); 1924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind from_kind() { return hydrogen()->from_kind(); } 1926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind to_kind() { return hydrogen()->to_kind(); } 1927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 19293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass LTrapAllocationMemento final : public LTemplateInstruction<0, 1, 2> { 1930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 19313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LTrapAllocationMemento(LOperand* object, LOperand* temp1, LOperand* temp2) { 1932958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = object; 19333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch temps_[0] = temp1; 19343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch temps_[1] = temp2; 1935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 19383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LOperand* temp1() { return temps_[0]; } 19393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch LOperand* temp2() { return temps_[1]; } 1940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(TrapAllocationMemento, "trap-allocation-memento") 1942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1945014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LMaybeGrowElements final : public LTemplateInstruction<1, 5, 0> { 1946014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LMaybeGrowElements(LOperand* context, LOperand* object, LOperand* elements, 1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* key, LOperand* current_capacity) { 1949014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[0] = context; 1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[1] = object; 1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[2] = elements; 1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[3] = key; 1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[4] = current_capacity; 1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1956014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* context() { return inputs_[0]; } 1957014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* object() { return inputs_[1]; } 1958014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* elements() { return inputs_[2]; } 1959014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* key() { return inputs_[3]; } 1960014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* current_capacity() { return inputs_[4]; } 1961014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1962f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch bool ClobbersDoubleRegisters(Isolate* isolate) const override { return true; } 1963f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1964014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(MaybeGrowElements) 1965014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(MaybeGrowElements, "maybe-grow-elements") 1966014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 1967014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1968014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1969014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringAdd final : public LTemplateInstruction<1, 3, 0> { 1970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStringAdd(LOperand* context, LOperand* left, LOperand* right) { 1972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = left; 1974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = right; 1975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* left() { return inputs_[1]; } 1979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* right() { return inputs_[2]; } 1980958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1981958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StringAdd, "string-add") 1982958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StringAdd) 1983958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 1984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharCodeAt final : public LTemplateInstruction<1, 3, 0> { 1987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 1988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LStringCharCodeAt(LOperand* context, LOperand* string, LOperand* index) { 1989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 1990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = string; 1991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[2] = index; 1992958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1993958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1994958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 1995958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* string() { return inputs_[1]; } 1996958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() { return inputs_[2]; } 1997958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1998958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StringCharCodeAt, "string-char-code-at") 1999958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StringCharCodeAt) 2000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStringCharFromCode final : public LTemplateInstruction<1, 2, 0> { 2004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LStringCharFromCode(LOperand* context, LOperand* char_code) { 2006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 2007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = char_code; 2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* char_code() { return inputs_[1]; } 2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StringCharFromCode, "string-char-from-code") 2014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StringCharFromCode) 2015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2018014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckValue final : public LTemplateInstruction<0, 1, 0> { 2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCheckValue(LOperand* value) { inputs_[0] = value; } 2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckValue, "check-value") 2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CheckValue) 2026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckArrayBufferNotNeutered final 2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : public LTemplateInstruction<0, 1, 0> { 2031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch public: 2032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit LCheckArrayBufferNotNeutered(LOperand* view) { inputs_[0] = view; } 2033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* view() { return inputs_[0]; } 2035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(CheckArrayBufferNotNeutered, 2037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch "check-array-buffer-not-neutered") 2038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(CheckArrayBufferNotNeutered) 2039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}; 2040014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckInstanceType final : public LTemplateInstruction<0, 1, 0> { 2043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCheckInstanceType(LOperand* value) { inputs_[0] = value; } 2045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2048958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckInstanceType, "check-instance-type") 2049958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CheckInstanceType) 2050958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2051958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2052958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMaps final : public LTemplateInstruction<0, 1, 1> { 2054958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch explicit LCheckMaps(LOperand* value = NULL, LOperand* temp = NULL) { 2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch inputs_[0] = value; 2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch temps_[0] = temp; 2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2059958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch LOperand* temp() { return temps_[0]; } 2062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckMaps, "check-maps") 2064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CheckMaps) 2065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckSmi final : public LTemplateInstruction<1, 1, 0> { 2069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCheckSmi(LOperand* value) { inputs_[0] = value; } 2071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckSmi, "check-smi") 2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2078014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckNonSmi final : public LTemplateInstruction<0, 1, 0> { 2079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LCheckNonSmi(LOperand* value) { inputs_[0] = value; } 2081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckNonSmi, "check-non-smi") 2085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(CheckHeapObject) 2086958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampDToUint8 final : public LTemplateInstruction<1, 1, 0> { 2090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LClampDToUint8(LOperand* unclamped) { inputs_[0] = unclamped; } 2092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* unclamped() { return inputs_[0]; } 2094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2095958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ClampDToUint8, "clamp-d-to-uint8") 2096958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2097958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampIToUint8 final : public LTemplateInstruction<1, 1, 0> { 2100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LClampIToUint8(LOperand* unclamped) { inputs_[0] = unclamped; } 2102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* unclamped() { return inputs_[0]; } 2104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ClampIToUint8, "clamp-i-to-uint8") 2106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LClampTToUint8 final : public LTemplateInstruction<1, 1, 1> { 2110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LClampTToUint8(LOperand* unclamped, LOperand* temp) { 2112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = unclamped; 2113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp; 2114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* unclamped() { return inputs_[0]; } 2117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp() { return temps_[0]; } 2118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ClampTToUint8, "clamp-t-to-uint8") 2120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LAllocate final : public LTemplateInstruction<1, 2, 2> { 2124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LAllocate(LOperand* context, LOperand* size, LOperand* temp1, 2126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2) { 2127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 2128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = size; 2129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[0] = temp1; 2130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier temps_[1] = temp2; 2131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 2134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* size() { return inputs_[1]; } 2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp1() { return temps_[0]; } 2136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* temp2() { return temps_[1]; } 2137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Allocate, "allocate") 2139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(Allocate) 2140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2142bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass LFastAllocate final : public LTemplateInstruction<1, 1, 2> { 2143bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch public: 2144bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LFastAllocate(LOperand* size, LOperand* temp1, LOperand* temp2) { 2145bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch inputs_[0] = size; 2146bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch temps_[0] = temp1; 2147bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch temps_[1] = temp2; 2148bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 2149bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2150bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* size() { return inputs_[0]; } 2151bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* temp1() { return temps_[0]; } 2152bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch LOperand* temp2() { return temps_[1]; } 2153bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2154bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_CONCRETE_INSTRUCTION(FastAllocate, "fast-allocate") 2155bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DECLARE_HYDROGEN_ACCESSOR(Allocate) 2156bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch}; 2157bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 2158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeof final : public LTemplateInstruction<1, 2, 0> { 2160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LTypeof(LOperand* context, LOperand* value) { 2162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 2163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = value; 2164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 2167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[1]; } 2168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(Typeof, "typeof") 2170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2173014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LTypeofIsAndBranch final : public LControlInstruction<1, 0> { 2174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LTypeofIsAndBranch(LOperand* value) { inputs_[0] = value; } 2176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(TypeofIsAndBranch, "typeof-is-and-branch") 2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(TypeofIsAndBranch) 2181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<String> type_literal() { return hydrogen()->type_literal(); } 2183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2184014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch void PrintDataTo(StringStream* stream) override; 2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LOsrEntry final : public LTemplateInstruction<0, 0, 0> { 2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOsrEntry() {} 2191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool HasInterestingComment(LCodeGen* gen) const override { return false; } 2193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(OsrEntry, "osr-entry") 2194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LStackCheck final : public LTemplateInstruction<0, 1, 0> { 2198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LStackCheck(LOperand* context) { inputs_[0] = context; } 2200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 2202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(StackCheck, "stack-check") 2204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_HYDROGEN_ACCESSOR(StackCheck) 2205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label* done_label() { return &done_label_; } 2207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 2209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Label done_label_; 2210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInPrepareMap final : public LTemplateInstruction<1, 2, 0> { 2214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LForInPrepareMap(LOperand* context, LOperand* object) { 2216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = context; 2217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = object; 2218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* context() { return inputs_[0]; } 2221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[1]; } 2222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap, "for-in-prepare-map") 2224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LForInCacheArray final : public LTemplateInstruction<1, 1, 0> { 2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier explicit LForInCacheArray(LOperand* map) { inputs_[0] = map; } 2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* map() { return inputs_[0]; } 2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray, "for-in-cache-array") 2234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int idx() { return HForInCacheArray::cast(this->hydrogen_value())->idx(); } 2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LCheckMapValue final : public LTemplateInstruction<0, 2, 0> { 2240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LCheckMapValue(LOperand* value, LOperand* map) { 2242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = value; 2243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = map; 2244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* value() { return inputs_[0]; } 2247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* map() { return inputs_[1]; } 2248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(CheckMapValue, "check-map-value") 2250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LLoadFieldByIndex final : public LTemplateInstruction<1, 2, 0> { 2254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LLoadFieldByIndex(LOperand* object, LOperand* index) { 2256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[0] = object; 2257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier inputs_[1] = index; 2258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* object() { return inputs_[0]; } 2261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* index() { return inputs_[1]; } 2262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex, "load-field-by-index") 2264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass LChunkBuilder; 2268014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LPlatformChunk final : public LChunk { 2269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LPlatformChunk(CompilationInfo* info, HGraph* graph) : LChunk(info, graph) {} 2271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int GetNextSpillIndex(RegisterKind kind); 2273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LOperand* GetNextSpillSlot(RegisterKind kind); 2274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass LChunkBuilder final : public LChunkBuilderBase { 2278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public: 2279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LChunkBuilder(CompilationInfo* info, HGraph* graph, LAllocator* allocator) 2280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier : LChunkBuilderBase(info, graph), 2281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current_instruction_(NULL), 2282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier current_block_(NULL), 2283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier next_block_(NULL), 2284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier allocator_(allocator) {} 2285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Build the sequence for the graph. 2287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LPlatformChunk* Build(); 2288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Declare methods that deal with the individual node types. 2290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define DECLARE_DO(type) LInstruction* Do##type(H##type* node); 2291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HYDROGEN_CONCRETE_INSTRUCTION_LIST(DECLARE_DO) 2292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_DO 2293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMultiplyAdd(HMul* mul, HValue* addend); 2295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMultiplySub(HValue* minuend, HMul* mul); 2296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoRSub(HSub* instr); 2297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static bool HasMagicNumberForDivisor(int32_t divisor); 2299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathFloor(HUnaryMathOperation* instr); 2301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathRound(HUnaryMathOperation* instr); 2302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathFround(HUnaryMathOperation* instr); 2303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathAbs(HUnaryMathOperation* instr); 2304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathLog(HUnaryMathOperation* instr); 230513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LInstruction* DoMathCos(HUnaryMathOperation* instr); 230613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch LInstruction* DoMathSin(HUnaryMathOperation* instr); 2307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathExp(HUnaryMathOperation* instr); 2308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathSqrt(HUnaryMathOperation* instr); 2309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathPowHalf(HUnaryMathOperation* instr); 2310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoMathClz32(HUnaryMathOperation* instr); 2311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoDivByPowerOf2I(HDiv* instr); 2312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoDivByConstI(HDiv* instr); 2313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoDivI(HDiv* instr); 2314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoModByPowerOf2I(HMod* instr); 2315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoModByConstI(HMod* instr); 2316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoModI(HMod* instr); 2317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr); 2318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr); 2319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr); 2320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private: 2322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Methods for getting operands for Use / Define / Temp. 2323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LUnallocated* ToUnallocated(Register reg); 2324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LUnallocated* ToUnallocated(DoubleRegister reg); 2325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Methods for setting up define-use relationships. 2327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* Use(HValue* value, LUnallocated* operand); 2328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register); 2329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseFixedDouble(HValue* value, 2330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DoubleRegister fixed_register); 2331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // A value that is guaranteed to be allocated to a register. 2333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Operand created by UseRegister is guaranteed to be live until the end of 2334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // instruction. This means that register allocator will not reuse it's 2335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // register for any other operand inside instruction. 2336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Operand created by UseRegisterAtStart is guaranteed to be live only at 2337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // instruction start. Register allocator is free to assign the same register 2338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // to some other operand used inside instruction (i.e. temporary or 2339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // output). 2340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseRegister(HValue* value); 2341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseRegisterAtStart(HValue* value); 2342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in a register that may be trashed. 2344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseTempRegister(HValue* value); 2345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in a register or stack slot. 2347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* Use(HValue* value); 2348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseAtStart(HValue* value); 2349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in a register, stack slot or a constant operand. 2351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseOrConstant(HValue* value); 2352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseOrConstantAtStart(HValue* value); 2353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in a register or a constant operand. 2355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseRegisterOrConstant(HValue* value); 2356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value); 2357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in a constant operand. 2359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* UseConstant(HValue* value); 2360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // An input operand in register, stack slot or a constant operand. 2362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Will not be moved to a register even if one is freely available. 2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MUST_USE_RESULT LOperand* UseAny(HValue* value) override; 2364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Temporary operand that must be in a register. 2366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LUnallocated* TempRegister(); 2367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LUnallocated* TempDoubleRegister(); 2368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* FixedTemp(Register reg); 2369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier MUST_USE_RESULT LOperand* FixedTemp(DoubleRegister reg); 2370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Methods for setting up define-use relationships. 2372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Return the same instruction that they are passed. 2373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* Define(LTemplateResultInstruction<1>* instr, 2374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LUnallocated* result); 2375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr); 2376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr, 2377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int index); 2378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr); 2379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr, Register reg); 2380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr, 2381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DoubleRegister reg); 2382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* AssignEnvironment(LInstruction* instr); 2383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* AssignPointerMap(LInstruction* instr); 2384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY }; 2386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // By default we assume that instruction sequences generated for calls 2388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // cannot deoptimize eagerly and we do not attach environment to this 2389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // instruction. 2390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* MarkAsCall( 2391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* instr, HInstruction* hinstr, 2392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY); 2393958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2394958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void VisitInstruction(HInstruction* current); 2395958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void AddInstruction(LInstruction* instr, HInstruction* current); 2396958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block); 2398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoShift(Token::Value op, HBitwiseBinaryOperation* instr); 2399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoArithmeticD(Token::Value op, 2400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HArithmeticBinaryOperation* instr); 2401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LInstruction* DoArithmeticT(Token::Value op, HBinaryOperation* instr); 2402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HInstruction* current_instruction_; 2404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* current_block_; 2405958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HBasicBlock* next_block_; 2406958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier LAllocator* allocator_; 2407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DISALLOW_COPY_AND_ASSIGN(LChunkBuilder); 2409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}; 2410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_HYDROGEN_ACCESSOR 2412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef DECLARE_CONCRETE_INSTRUCTION 2413014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2414014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif // V8_CRANKSHAFT_PPC_LITHIUM_PPC_H_ 2417