28 #ifndef V8_IA32_LITHIUM_IA32_H_
29 #define V8_IA32_LITHIUM_IA32_H_
43 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
44 V(AccessArgumentsAt) \
48 V(ArgumentsElements) \
57 V(CallConstantFunction) \
67 V(CheckInstanceType) \
70 V(CheckPrototypeMaps) \
75 V(ClassOfTestAndBranch) \
77 V(CmpObjectEqAndBranch) \
80 V(CmpConstantEqAndBranch) \
92 V(FixedArrayBaseLength) \
94 V(GetCachedArrayIndex) \
98 V(HasCachedArrayIndexAndBranch) \
99 V(HasInstanceTypeAndBranch) \
102 V(InstanceOfKnownGlobal) \
104 V(Integer32ToDouble) \
106 V(IsConstructCallAndBranch) \
108 V(IsObjectAndBranch) \
109 V(IsStringAndBranch) \
111 V(IsUndetectableAndBranch) \
112 V(StringCompareAndBranch) \
118 V(LoadExternalArrayPointer) \
119 V(LoadFunctionPrototype) \
121 V(LoadGlobalGeneric) \
122 V(LoadKeyedFastElement) \
123 V(LoadKeyedFastDoubleElement) \
124 V(LoadKeyedGeneric) \
125 V(LoadKeyedSpecializedArrayElement) \
127 V(LoadNamedFieldPolymorphic) \
128 V(LoadNamedGeneric) \
148 V(StoreContextSlot) \
150 V(StoreGlobalGeneric) \
151 V(StoreKeyedFastDoubleElement) \
152 V(StoreKeyedFastElement) \
153 V(StoreKeyedGeneric) \
154 V(StoreKeyedSpecializedArrayElement) \
156 V(StoreNamedGeneric) \
158 V(StringCharCodeAt) \
159 V(StringCharFromCode) \
165 V(ToFastProperties) \
166 V(TransitionElementsKind) \
168 V(TypeofIsAndBranch) \
169 V(UnaryMathOperation) \
175 V(LoadFieldByIndex) \
181 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
182 virtual Opcode opcode() const { return LInstruction::k##type; } \
183 virtual void CompileToNative(LCodeGen* generator); \
184 virtual const char* Mnemonic() const { return mnemonic; } \
185 static L##type* cast(LInstruction* instr) { \
186 ASSERT(instr->Is##type()); \
187 return reinterpret_cast<L##type*>(instr); \
191 #define DECLARE_HYDROGEN_ACCESSOR(type) \
192 H##type* hydrogen() const { \
193 return H##type::cast(hydrogen_value()); \
197 class LInstruction:
public ZoneObject {
200 : environment_(
NULL),
201 hydrogen_value_(
NULL),
206 virtual const char*
Mnemonic()
const = 0;
213 #define DECLARE_OPCODE(type) k##type,
216 #undef DECLARE_OPCODE
222 #define DECLARE_PREDICATE(type) \
223 bool Is##type() const { return opcode() == k##type; }
225 #undef DECLARE_PREDICATE
229 virtual bool IsGap()
const {
return false; }
278 template<
int R,
int I,
int T>
279 class LTemplateInstruction:
public LInstruction {
300 class LGap:
public LTemplateInstruction<0, 0, 0> {
310 virtual bool IsGap()
const {
return true; }
314 return reinterpret_cast<LGap*
>(instr);
331 if (parallel_moves_[pos] ==
NULL) {
334 return parallel_moves_[pos];
338 return parallel_moves_[pos];
347 class LInstructionGap:
public LGap {
355 class LGoto:
public LTemplateInstruction<0, 0, 0> {
370 class LLazyBailout:
public LTemplateInstruction<0, 0, 0> {
376 class LDeoptimize:
public LTemplateInstruction<0, 0, 0> {
382 class LLabel:
public LGap {
385 :
LGap(block), replacement_(
NULL) { }
404 class LParameter:
public LTemplateInstruction<1, 0, 0> {
410 class LCallStub:
public LTemplateInstruction<1, 1, 0> {
422 return hydrogen()->transcendental_type();
427 class LUnknownOSRValue:
public LTemplateInstruction<1, 0, 0> {
433 template<
int I,
int T>
434 class LControlInstruction:
public LTemplateInstruction<0, I, T> {
450 class LWrapReceiver:
public LTemplateInstruction<1, 2, 1> {
467 class LApplyArguments:
public LTemplateInstruction<1, 4, 0> {
488 class LAccessArgumentsAt:
public LTemplateInstruction<1, 3, 0> {
506 class LArgumentsLength:
public LTemplateInstruction<1, 1, 0> {
516 class LArgumentsElements:
public LTemplateInstruction<1, 0, 0> {
523 class LModI: public LTemplateInstruction<1, 2, 1> {
536 class
LDivI: public LTemplateInstruction<1, 2, 1> {
549 class
LMulI: public LTemplateInstruction<1, 2, 1> {
574 return hydrogen()->GetInputRepresentation().IsDouble();
581 class LUnaryMathOperation:
public LTemplateInstruction<1, 2, 0> {
625 "cmp-object-eq-and-branch")
629 class LCmpConstantEqAndBranch:
public LControlInstruction<1, 0> {
636 "cmp-constant-eq-and-branch")
658 class LIsObjectAndBranch:
public LControlInstruction<1, 1> {
705 "is-undetectable-and-branch")
720 "string-compare-and-branch")
729 class LHasInstanceTypeAndBranch:
public LControlInstruction<1, 1> {
737 "has-instance-type-and-branch")
762 "has-cached-array-index-and-branch")
774 "is-construct-call-and-branch")
778 class LClassOfTestAndBranch:
public LControlInstruction<1, 2> {
787 "class-of-test-and-branch")
794 class
LCmpT: public LTemplateInstruction<1, 3, 0> {
809 class LInstanceOf:
public LTemplateInstruction<1, 3, 0> {
823 class LInstanceOfKnownGlobal:
public LTemplateInstruction<1, 2, 1> {
832 "instance-of-known-global")
837 return lazy_deopt_env_;
840 lazy_deopt_env_ = env;
848 class LBoundsCheck:
public LTemplateInstruction<0, 2, 0> {
862 class LBitI:
public LTemplateInstruction<1, 2, 0> {
876 class
LShiftI: public LTemplateInstruction<1, 2, 0> {
879 : op_(op), can_deopt_(can_deopt) {
896 class
LSubI: public LTemplateInstruction<1, 2, 0> {
908 class
LConstantI: public LTemplateInstruction<1, 0, 0> {
913 int32_t value()
const {
return hydrogen()->Integer32Value(); }
917 class LConstantD:
public LTemplateInstruction<1, 0, 1> {
926 double value()
const {
return hydrogen()->DoubleValue(); }
930 class LConstantT:
public LTemplateInstruction<1, 0, 0> {
939 class LBranch:
public LControlInstruction<1, 1> {
966 return hydrogen()->FirstSuccessor()->block_id();
969 return hydrogen()->SecondSuccessor()->block_id();
974 class LJSArrayLength:
public LTemplateInstruction<1, 1, 0> {
992 "fixed-array-base-length")
1008 class
LValueOf: public LTemplateInstruction<1, 1, 1> {
1020 class
LDateField: public LTemplateInstruction<1, 1, 1> {
1031 Smi* index()
const {
return index_; }
1038 class LThrow:
public LTemplateInstruction<0, 2, 0> {
1052 class LBitNotI:
public LTemplateInstruction<1, 1, 0> {
1062 class LAddI:
public LTemplateInstruction<1, 2, 0> {
1074 class
LPower: public LTemplateInstruction<1, 2, 0> {
1086 class
LRandom: public LTemplateInstruction<1, 1, 0> {
1097 class
LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1109 virtual const char*
Mnemonic()
const;
1116 class LArithmeticT:
public LTemplateInstruction<1, 3, 0> {
1130 virtual const char*
Mnemonic()
const;
1142 class LReturn:
public LTemplateInstruction<0, 1, 0> {
1152 class LLoadNamedField:
public LTemplateInstruction<1, 1, 0> {
1165 class LLoadNamedFieldPolymorphic:
public LTemplateInstruction<1, 2, 0> {
1180 class LLoadNamedGeneric:
public LTemplateInstruction<1, 2, 0> {
1196 class LLoadFunctionPrototype:
public LTemplateInstruction<1, 1, 1> {
1210 class LLoadElements:
public LTemplateInstruction<1, 1, 0> {
1220 class LLoadExternalArrayPointer:
public LTemplateInstruction<1, 1, 0> {
1227 "load-external-array-pointer")
1231 class LLoadKeyedFastElement:
public LTemplateInstruction<1, 2, 0> {
1247 class LLoadKeyedFastDoubleElement:
public LTemplateInstruction<1, 2, 0> {
1255 "load-keyed-fast-double-element")
1264 class LLoadKeyedSpecializedArrayElement:
public LTemplateInstruction<1, 2, 0> {
1267 inputs_[0] = external_pointer;
1272 "load-keyed-specialized-array-element")
1278 return hydrogen()->elements_kind();
1284 class LLoadKeyedGeneric:
public LTemplateInstruction<1, 3, 0> {
1300 class LLoadGlobalCell:
public LTemplateInstruction<1, 0, 0> {
1307 class LLoadGlobalGeneric: public LTemplateInstruction<1, 2, 0> {
1324 class LStoreGlobalCell:
public LTemplateInstruction<0, 1, 0> {
1337 class LStoreGlobalGeneric:
public LTemplateInstruction<0, 3, 0> {
1358 class LLoadContextSlot:
public LTemplateInstruction<1, 1, 0> {
1374 class LStoreContextSlot:
public LTemplateInstruction<0, 2, 1> {
1393 class LPushArgument:
public LTemplateInstruction<0, 1, 0> {
1403 class LDrop:
public LTemplateInstruction<0, 0, 0> {
1405 explicit LDrop(
int count) : count_(count) { }
1423 class
LContext: public LTemplateInstruction<1, 0, 0> {
1429 class LOuterContext:
public LTemplateInstruction<1, 1, 0> {
1441 class LDeclareGlobals:
public LTemplateInstruction<0, 1, 0> {
1464 class LGlobalReceiver:
public LTemplateInstruction<1, 1, 0> {
1476 class LCallConstantFunction:
public LTemplateInstruction<1, 0, 0> {
1484 int arity()
const {
return hydrogen()->argument_count() - 1; }
1488 class LInvokeFunction:
public LTemplateInstruction<1, 2, 0> {
1503 int arity()
const {
return hydrogen()->argument_count() - 1; }
1508 class LCallKeyed:
public LTemplateInstruction<1, 2, 0> {
1523 int arity()
const {
return hydrogen()->argument_count() - 1; }
1527 class LCallNamed:
public LTemplateInstruction<1, 1, 0> {
1540 int arity()
const {
return hydrogen()->argument_count() - 1; }
1544 class LCallFunction:
public LTemplateInstruction<1, 2, 0> {
1556 int arity()
const {
return hydrogen()->argument_count() - 1; }
1560 class LCallGlobal:
public LTemplateInstruction<1, 1, 0> {
1573 int arity()
const {
return hydrogen()->argument_count() - 1; }
1577 class LCallKnownGlobal:
public LTemplateInstruction<1, 0, 0> {
1585 int arity()
const {
return hydrogen()->argument_count() - 1; }
1589 class LCallNew:
public LTemplateInstruction<1, 2, 0> {
1603 int arity()
const {
return hydrogen()->argument_count() - 1; }
1607 class LCallRuntime:
public LTemplateInstruction<1, 1, 0> {
1617 int arity()
const {
return hydrogen()->argument_count(); }
1621 class LInteger32ToDouble:
public LTemplateInstruction<1, 1, 0> {
1631 class LNumberTagI:
public LTemplateInstruction<1, 1, 0> {
1641 class LNumberTagD:
public LTemplateInstruction<1, 1, 1> {
1653 class LDoubleToI:
public LTemplateInstruction<1, 1, 1> {
1663 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1668 class LTaggedToI:
public LTemplateInstruction<1, 1, 1> {
1678 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1682 class LSmiTag:
public LTemplateInstruction<1, 1, 0> {
1692 class LNumberUntagD:
public LTemplateInstruction<1, 1, 1> {
1704 class
LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1707 : needs_check_(needs_check) {
1713 bool needs_check()
const {
return needs_check_; }
1720 class LStoreNamedField:
public LTemplateInstruction<0, 2, 2> {
1742 int offset() {
return hydrogen()->offset(); }
1747 class LStoreNamedGeneric:
public LTemplateInstruction<0, 3, 0> {
1768 class LStoreKeyedFastElement:
public LTemplateInstruction<0, 3, 0> {
1777 "store-keyed-fast-element")
1789 class LStoreKeyedFastDoubleElement:
public LTemplateInstruction<0, 3, 0> {
1800 "store-keyed-fast-double-element")
1814 class LStoreKeyedSpecializedArrayElement:
public LTemplateInstruction<0, 3, 0> {
1819 inputs_[0] = external_pointer;
1825 "store-keyed-specialized-array-element")
1832 return hydrogen()->elements_kind();
1838 class LStoreKeyedGeneric:
public LTemplateInstruction<0, 4, 0> {
1863 class LTransitionElementsKind:
public LTemplateInstruction<1, 1, 2> {
1869 temps_[0] = new_map_temp;
1874 "transition-elements-kind")
1887 class LStringAdd:
public LTemplateInstruction<1, 3, 0> {
1904 class LStringCharCodeAt:
public LTemplateInstruction<1, 3, 0> {
1921 class LStringCharFromCode:
public LTemplateInstruction<1, 2, 0> {
1936 class LStringLength:
public LTemplateInstruction<1, 1, 0> {
1949 class LCheckFunction:
public LTemplateInstruction<0, 1, 0> {
1974 class
LCheckMaps: public LTemplateInstruction<0, 1, 0> {
1999 class LCheckSmi:
public LTemplateInstruction<0, 1, 0> {
2009 class LClampDToUint8:
public LTemplateInstruction<1, 1, 0> {
2021 class LClampIToUint8:
public LTemplateInstruction<1, 1, 0> {
2033 class LClampTToUint8:
public LTemplateInstruction<1, 1, 1> {
2046 class LCheckNonSmi:
public LTemplateInstruction<0, 1, 0> {
2056 class LAllocateObject:
public LTemplateInstruction<1, 1, 1> {
2070 class LFastLiteral:
public LTemplateInstruction<1, 1, 0> {
2137 class LToFastProperties:
public LTemplateInstruction<1, 1, 0> {
2148 class
LTypeof: public LTemplateInstruction<1, 2, 0> {
2159 class LTypeofIsAndBranch:
public LControlInstruction<1, 0> {
2174 class LDeleteProperty:
public LTemplateInstruction<1, 3, 0> {
2190 class LOsrEntry:
public LTemplateInstruction<0, 0, 0> {
2196 LOperand** SpilledRegisterArray() {
return register_spills_; }
2199 void MarkSpilledRegister(
int allocation_index,
LOperand* spill_operand);
2200 void MarkSpilledDoubleRegister(
int allocation_index,
2213 class LStackCheck:
public LTemplateInstruction<0, 1, 0> {
2224 Label* done_label() {
return &done_label_; }
2231 class LIn:
public LTemplateInstruction<1, 3, 0> {
2247 class LForInPrepareMap:
public LTemplateInstruction<1, 2, 0> {
2261 class LForInCacheArray:
public LTemplateInstruction<1, 1, 0> {
2277 class LCheckMapValue:
public LTemplateInstruction<0, 2, 0> {
2291 class LLoadFieldByIndex:
public LTemplateInstruction<1, 2, 0> {
2305 class LChunkBuilder;
2306 class LChunk:
public ZoneObject {
2309 : spill_slot_count_(0),
2310 num_double_slots_(0),
2313 instructions_(32, graph->zone()),
2314 pointer_maps_(8, graph->zone()),
2315 inlined_closures_(1, graph->zone()) { }
2322 int GetNextSpillIndex(
bool is_double);
2323 LOperand* GetNextSpillSlot(
bool is_double);
2325 int ParameterAt(
int index);
2326 int GetParameterStackSlot(
int index)
const;
2329 CompilationInfo*
info()
const {
return info_; }
2333 LGap* GetGapAt(
int index)
const;
2334 bool IsGapAt(
int index)
const;
2335 int NearestGapPos(
int index)
const;
2336 void MarkEmptyBlocks();
2339 HBasicBlock* block = graph_->blocks()->at(block_id);
2344 LLabel* cur = GetLabel(block_id);
2345 while (cur->replacement() !=
NULL) {
2346 cur = cur->replacement();
2348 return cur->block_id();
2351 LLabel* label = GetLabel(block_id);
2352 ASSERT(!label->HasReplacement());
2353 return label->label();
2357 return &inlined_closures_;
2361 inlined_closures_.Add(closure, zone());
2367 int spill_slot_count_;
2368 int num_double_slots_;
2369 CompilationInfo* info_;
2383 zone_(graph->zone()),
2385 current_instruction_(
NULL),
2386 current_block_(
NULL),
2389 allocator_(allocator),
2390 position_(RelocInfo::kNoPosition),
2391 instruction_pending_deoptimization_environment_(
NULL),
2392 pending_deoptimization_ast_id_(
AstNode::kNoNumber) { }
2398 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2410 LChunk* chunk()
const {
return chunk_; }
2411 CompilationInfo* info()
const {
return info_; }
2412 HGraph* graph()
const {
return graph_; }
2413 Zone* zone()
const {
return zone_; }
2415 bool is_unused()
const {
return status_ == UNUSED; }
2416 bool is_building()
const {
return status_ == BUILDING; }
2417 bool is_done()
const {
return status_ ==
DONE; }
2418 bool is_aborted()
const {
return status_ == ABORTED; }
2420 void Abort(
const char* format, ...);
2423 LUnallocated* ToUnallocated(Register reg);
2424 LUnallocated* ToUnallocated(XMMRegister reg);
2428 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2430 XMMRegister fixed_register);
2456 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2469 template<
int I,
int T>
2470 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2472 template<
int I,
int T>
2473 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2474 template<
int I,
int T>
2475 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2477 template<
int I,
int T>
2478 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2479 template<
int I,
int T>
2480 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2482 template<
int I,
int T>
2483 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2492 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2499 HInstruction* hinstr,
2500 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2502 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2503 int* argument_index_accumulator);
2505 void VisitInstruction(HInstruction* current);
2507 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2510 HArithmeticBinaryOperation* instr);
2512 HArithmeticBinaryOperation* instr);
2515 CompilationInfo* info_;
2516 HGraph*
const graph_;
2519 HInstruction* current_instruction_;
2520 HBasicBlock* current_block_;
2521 HBasicBlock* next_block_;
2522 int argument_count_;
2523 LAllocator* allocator_;
2525 LInstruction* instruction_pending_deoptimization_environment_;
2526 int pending_deoptimization_ast_id_;
2531 #undef DECLARE_HYDROGEN_ACCESSOR
2532 #undef DECLARE_CONCRETE_INSTRUCTION
2536 #endif // V8_IA32_LITHIUM_IA32_H_
LDateField(LOperand *date, LOperand *temp, Smi *index)
LArgumentsLength(LOperand *elements)
LInstanceOf(LOperand *context, LOperand *left, LOperand *right)
LLoadContextSlot(LOperand *context)
LWrapReceiver(LOperand *receiver, LOperand *function, LOperand *temp)
LGlobalReceiver(LOperand *global_object)
static LGap * cast(LInstruction *instr)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
Handle< Map > transitioned_map()
LLoadFieldByIndex(LOperand *object, LOperand *index)
Handle< Object > name() const
uint32_t additional_index() const
LGetCachedArrayIndex(LOperand *value)
void set_pointer_map(LPointerMap *p)
bool IsMarkedAsCall() const
Handle< Object > name() const
LStringCharCodeAt(LOperand *context, LOperand *string, LOperand *index)
virtual LOperand * InputAt(int i)=0
LOperand * global_object()
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
void set_environment(LEnvironment *env)
void set_result(LOperand *operand)
LCmpT(LOperand *context, LOperand *left, LOperand *right)
int false_block_id() const
virtual void PrintOutputOperandTo(StringStream *stream)
LDoubleToI(LOperand *value, LOperand *temp)
EmbeddedContainer< LOperand *, T > temps_
LStoreContextSlot(LOperand *context, LOperand *value, LOperand *temp)
LStringCompareAndBranch(LOperand *context, LOperand *left, LOperand *right)
uint32_t additional_index() const
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
LConstantD(LOperand *temp)
LNumberTagI(LOperand *value)
LForInPrepareMap(LOperand *context, LOperand *object)
LInstructionGap(HBasicBlock *block)
int num_double_slots() const
LCheckSmi(LOperand *value)
LStringLength(LOperand *string)
LIsObjectAndBranch(LOperand *value, LOperand *temp)
Handle< Object > name() const
LStoreGlobalCell(LOperand *value)
uint32_t additional_index() const
LLoadNamedFieldPolymorphic(LOperand *context, LOperand *object)
LTypeof(LOperand *context, LOperand *value)
LLabel(HBasicBlock *block)
LJSArrayLength(LOperand *value)
int true_block_id() const
Handle< String > name() const
LAllocateObject(LOperand *context, LOperand *temp)
LChunkBuilder(CompilationInfo *info, HGraph *graph, LAllocator *allocator)
LOuterContext(LOperand *context)
static const int kNumAllocatableRegisters
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
Handle< Object > name() const
LClampDToUint8(LOperand *value)
Handle< Map > transition() const
LEnvironment * environment() const
LBranch(LOperand *value, LOperand *temp)
virtual HBasicBlock * SuccessorAt(int i)=0
LCheckNonSmi(LOperand *value)
#define ASSERT(condition)
LStoreKeyedGeneric(LOperand *context, LOperand *object, LOperand *key, LOperand *value)
LArrayLiteral(LOperand *context)
LBoundsCheck(LOperand *index, LOperand *length)
LClampTToUint8(LOperand *value, LOperand *temp)
virtual const char * Mnemonic() const =0
LFixedArrayBaseLength(LOperand *value)
LClassOfTestAndBranch(LOperand *value, LOperand *temp, LOperand *temp2)
LInstanceOfKnownGlobal(LOperand *context, LOperand *value, LOperand *temp)
LStringAdd(LOperand *context, LOperand *left, LOperand *right)
virtual void PrintDataTo(StringStream *stream)
LModI(LOperand *left, LOperand *right, LOperand *temp)
uint32_t additional_index() const
LMathPowHalf(LOperand *context, LOperand *value, LOperand *temp)
LIn(LOperand *context, LOperand *key, LOperand *object)
LChunk(CompilationInfo *info, HGraph *graph)
StrictModeFlag strict_mode_flag()
LNumberTagD(LOperand *value, LOperand *temp)
LTransitionElementsKind(LOperand *object, LOperand *new_map_temp, LOperand *temp_reg)
LDeclareGlobals(LOperand *context)
LIsNilAndBranch(LOperand *value, LOperand *temp)
LFunctionLiteral(LOperand *context)
void set_hydrogen_value(HValue *value)
LLoadNamedField(LOperand *object)
#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
LPower(LOperand *left, LOperand *right)
virtual bool HasResult() const =0
Handle< JSObject > holder() const
LCallKeyed(LOperand *context, LOperand *key)
virtual Opcode opcode() const =0
Handle< Object > name() const
Handle< Map > map() const
LStoreGlobalGeneric(LOperand *context, LOperand *global_object, LOperand *value)
LGlobalObject(LOperand *context)
EmbeddedContainer< LOperand *, R > results_
ElementsKind elements_kind() const
LLabel * replacement() const
virtual LOperand * TempAt(int i)=0
LDivI(LOperand *left, LOperand *right, LOperand *temp)
Handle< JSFunction > known_function()
LAddI(LOperand *left, LOperand *right)
bool is_loop_header() const
LObjectLiteral(LOperand *context)
LCmpObjectEqAndBranch(LOperand *left, LOperand *right)
LOperand ** SpilledDoubleRegisterArray()
int spill_slot_count() const
LOperand * InputAt(int i)
LElementsKind(LOperand *value)
virtual Opcode opcode() const
HBasicBlock * SuccessorAt(int i)
LStoreKeyedFastElement(LOperand *obj, LOperand *key, LOperand *val)
LIsStringAndBranch(LOperand *value, LOperand *temp)
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,"load-keyed-fast-double-element") LOperand *elements()
LCheckInstanceType(LOperand *value, LOperand *temp)
LLoadKeyedFastElement(LOperand *elements, LOperand *key)
bool HasEnvironment() const
LCallStub(LOperand *context)
LStackCheck(LOperand *context)
virtual bool HasResult() const
LBitI(LOperand *left, LOperand *right)
virtual int TempCount()=0
LLoadExternalArrayPointer(LOperand *object)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
LOperand * global_object()
virtual bool IsControl() const
LTypeofIsAndBranch(LOperand *value)
LFastLiteral(LOperand *context)
virtual LOperand * result()=0
LUnaryMathOperation(LOperand *context, LOperand *value)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
virtual bool IsControl() const
LCmpMapAndBranch(LOperand *value)
HBasicBlock * block() const
LSubI(LOperand *left, LOperand *right)
TranscendentalCache::Type transcendental_type()
LLoadGlobalGeneric(LOperand *context, LOperand *global_object)
LMulI(LOperand *left, LOperand *right, LOperand *temp)
virtual void PrintTo(StringStream *stream)
LDeleteProperty(LOperand *context, LOperand *obj, LOperand *key)
virtual void PrintDataTo(StringStream *stream)
LStoreKeyedFastDoubleElement(LOperand *elements, LOperand *key, LOperand *val)
LCallNamed(LOperand *context)
#define T(name, string, precedence)
LToFastProperties(LOperand *value)
LLoadKeyedGeneric(LOperand *context, LOperand *obj, LOperand *key)
LStoreKeyedSpecializedArrayElement(LOperand *external_pointer, LOperand *key, LOperand *val)
virtual int SuccessorCount()=0
LRegExpLiteral(LOperand *context)
LNumberUntagD(LOperand *value, LOperand *temp)
LRandom(LOperand *global_object)
LForInCacheArray(LOperand *map)
virtual bool IsControl() const
LPointerMap * pointer_map() const
LShiftI(Token::Value op, LOperand *left, LOperand *right, bool can_deopt)
Label * GetAssemblyLabel(int block_id) const
int first_instruction_index() const
ElementsKind elements_kind() const
EmbeddedContainer< LOperand *, I > inputs_
LLabel * GetLabel(int block_id) const
virtual bool IsGap() const
LTaggedToI(LOperand *value, LOperand *temp)
LCallFunction(LOperand *context, LOperand *function)
LHasCachedArrayIndexAndBranch(LOperand *value)
LCheckFunction(LOperand *value)
const ZoneList< Handle< JSFunction > > * inlined_closures() const
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
virtual void PrintDataTo(StringStream *stream)
CompilationInfo * info() const
LCallGlobal(LOperand *context)
LLoadElements(LOperand *object)
LCmpConstantEqAndBranch(LOperand *left)
virtual void CompileToNative(LCodeGen *generator)=0
virtual bool IsGap() const
#define DECLARE_HYDROGEN_ACCESSOR(type)
static const int kNumAllocatableRegisters
LCallNew(LOperand *context, LOperand *constructor)
LThrow(LOperand *context, LOperand *value)
LCheckMaps(LOperand *value)
bool IsLoopHeader() const
activate correct semantics for inheriting readonliness enable harmony semantics for typeof enable harmony enable harmony proxies enable all harmony harmony_scoping harmony_proxies harmony_scoping tracks arrays with only smi values automatically unbox arrays of doubles use crankshaft use hydrogen range analysis use hydrogen global value numbering use function inlining maximum number of AST nodes considered for a single inlining loop invariant code motion print statistics for hydrogen trace generated IR for specified phases trace register allocator trace range analysis trace representation types environment for every instruction put a break point before deoptimizing polymorphic inlining perform array bounds checks elimination trace on stack replacement optimize closures functions with arguments object optimize functions containing for in loops profiler considers IC stability primitive functions trigger their own optimization re try self optimization if it failed insert an interrupt check at function exit execution budget before interrupt is triggered call count before self optimization self_optimization count_based_interrupts weighted_back_edges trace_opt emit comments in code disassembly enable use of SSE3 instructions if available enable use of CMOV instruction if available enable use of SAHF instruction if enable use of VFP3 instructions if available this implies enabling ARMv7 enable use of ARMv7 instructions if enable use of MIPS FPU instructions if NULL
LLoadKeyedFastDoubleElement(LOperand *elements, LOperand *key)
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
uint32_t additional_index() const
const ZoneList< LPointerMap * > * pointer_maps() const
virtual void PrintDataTo(StringStream *stream)
Handle< String > name() const
LCallRuntime(LOperand *context)
StrictModeFlag strict_mode_flag()
LEnvironment * GetDeferredLazyDeoptimizationEnvironment()
STATIC_ASSERT(R==0||R==1)
void set_replacement(LLabel *label)
StrictModeFlag strict_mode_flag()
LCmpIDAndBranch(LOperand *left, LOperand *right)
LParallelMove * GetParallelMove(InnerPosition pos)
LStoreNamedGeneric(LOperand *context, LOperand *object, LOperand *value)
virtual Opcode opcode() const
bool HasPointerMap() const
LCheckMapValue(LOperand *value, LOperand *map)
LIsSmiAndBranch(LOperand *value)
LStringCharFromCode(LOperand *context, LOperand *char_code)
uint32_t additional_index() const
LInteger32ToDouble(LOperand *value)
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,"load-keyed-specialized-array-element") LOperand *external_pointer()
int LookupDestination(int block_id) const
LCheckPrototypeMaps(LOperand *temp)
#define DECLARE_PREDICATE(type)
LArithmeticT(Token::Value op, LOperand *context, LOperand *left, LOperand *right)
LClampIToUint8(LOperand *value)
#define DECLARE_OPCODE(type)
virtual int InputCount()=0
bool NeedsCanonicalization()
LLoadFunctionPrototype(LOperand *function, LOperand *temp)
LIsConstructCallAndBranch(LOperand *temp)
static HValue * cast(HValue *value)
LHasInstanceTypeAndBranch(LOperand *value, LOperand *temp)
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,"instance-of-known-global") Handle< JSFunction > function() const
HValue * hydrogen_value() const
LPushArgument(LOperand *value)
LStoreNamedField(LOperand *obj, LOperand *val, LOperand *temp, LOperand *temp_map)
bool HasReplacement() const
LValueOf(LOperand *value, LOperand *temp)
LBitNotI(LOperand *value)
LApplyArguments(LOperand *function, LOperand *receiver, LOperand *length, LOperand *elements)
Handle< Map > original_map()
LLoadNamedGeneric(LOperand *context, LOperand *object)
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,"store-keyed-specialized-array-element") LOperand *external_pointer()
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
const ZoneList< LInstruction * > * instructions() const
LSmiUntag(LOperand *value, bool needs_check)
LLoadKeyedSpecializedArrayElement(LOperand *external_pointer, LOperand *key)
LInvokeFunction(LOperand *context, LOperand *function)
virtual void PrintDataTo(StringStream *stream)
void AddInlinedClosure(Handle< JSFunction > closure)