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) \
107 V(IsConstructCallAndBranch) \
109 V(IsObjectAndBranch) \
110 V(IsStringAndBranch) \
112 V(IsUndetectableAndBranch) \
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) \
152 V(StoreContextSlot) \
154 V(StoreGlobalGeneric) \
155 V(StoreKeyedFastDoubleElement) \
156 V(StoreKeyedFastElement) \
157 V(StoreKeyedGeneric) \
158 V(StoreKeyedSpecializedArrayElement) \
160 V(StoreNamedGeneric) \
162 V(StringCharCodeAt) \
163 V(StringCharFromCode) \
164 V(StringCompareAndBranch) \
170 V(ToFastProperties) \
171 V(TransitionElementsKind) \
173 V(TypeofIsAndBranch) \
174 V(UnaryMathOperation) \
180 V(LoadFieldByIndex) \
186 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
187 virtual Opcode opcode() const { return LInstruction::k##type; } \
188 virtual void CompileToNative(LCodeGen* generator); \
189 virtual const char* Mnemonic() const { return mnemonic; } \
190 static L##type* cast(LInstruction* instr) { \
191 ASSERT(instr->Is##type()); \
192 return reinterpret_cast<L##type*>(instr); \
196 #define DECLARE_HYDROGEN_ACCESSOR(type) \
197 H##type* hydrogen() const { \
198 return H##type::cast(hydrogen_value()); \
202 class LInstruction:
public ZoneObject {
205 : environment_(
NULL),
206 hydrogen_value_(
NULL),
211 virtual const char*
Mnemonic()
const = 0;
218 #define DECLARE_OPCODE(type) k##type,
221 #undef DECLARE_OPCODE
227 #define DECLARE_PREDICATE(type) \
228 bool Is##type() const { return opcode() == k##type; }
230 #undef DECLARE_PREDICATE
234 virtual bool IsGap()
const {
return false; }
270 virtual int InputCount() = 0;
271 virtual LOperand* InputAt(
int i) = 0;
274 virtual int TempCount() = 0;
275 virtual LOperand* TempAt(
int i) = 0;
287 template<
int R,
int I,
int T>
288 class LTemplateInstruction:
public LInstruction {
303 virtual int InputCount() {
return I; }
304 virtual LOperand* InputAt(
int i) {
return inputs_[i]; }
306 virtual int TempCount() {
return T; }
307 virtual LOperand* TempAt(
int i) {
return temps_[i]; }
311 class LGap:
public LTemplateInstruction<0, 0, 0> {
321 virtual bool IsGap()
const {
return true; }
325 return reinterpret_cast<LGap*
>(instr);
342 if (parallel_moves_[pos] ==
NULL) {
345 return parallel_moves_[pos];
349 return parallel_moves_[pos];
358 class LInstructionGap:
public LGap {
366 class LGoto:
public LTemplateInstruction<0, 0, 0> {
381 class LLazyBailout:
public LTemplateInstruction<0, 0, 0> {
387 class LDeoptimize:
public LTemplateInstruction<0, 0, 0> {
393 class LLabel:
public LGap {
396 :
LGap(block), replacement_(
NULL) { }
415 class LParameter:
public LTemplateInstruction<1, 0, 0> {
421 class LCallStub:
public LTemplateInstruction<1, 1, 0> {
433 return hydrogen()->transcendental_type();
438 class LUnknownOSRValue:
public LTemplateInstruction<1, 0, 0> {
444 template<
int I,
int T>
445 class LControlInstruction:
public LTemplateInstruction<0, I, T> {
461 class LWrapReceiver:
public LTemplateInstruction<1, 2, 1> {
479 class LApplyArguments:
public LTemplateInstruction<1, 4, 0> {
500 class LAccessArgumentsAt:
public LTemplateInstruction<1, 3, 0> {
530 class LArgumentsElements:
public LTemplateInstruction<1, 0, 0> {
537 class LModI: public LTemplateInstruction<1, 2, 1> {
554 class
LDivI: public LTemplateInstruction<1, 2, 1> {
589 class
LMulI: public LTemplateInstruction<1, 2, 1> {
621 return hydrogen()->GetInputRepresentation().IsDouble();
628 class LUnaryMathOperation:
public LTemplateInstruction<1, 2, 0> {
675 "cmp-object-eq-and-branch")
679 class LCmpConstantEqAndBranch:
public LControlInstruction<1, 0> {
688 "cmp-constant-eq-and-branch")
713 class LIsObjectAndBranch:
public LControlInstruction<1, 1> {
771 "is-undetectable-and-branch")
789 "string-compare-and-branch")
798 class LHasInstanceTypeAndBranch:
public LControlInstruction<1, 1> {
809 "has-instance-type-and-branch")
838 "has-cached-array-index-and-branch")
853 "is-construct-call-and-branch")
857 class LClassOfTestAndBranch:
public LControlInstruction<1, 2> {
870 "class-of-test-and-branch")
877 class
LCmpT: public LTemplateInstruction<1, 3, 0> {
892 class LInstanceOf:
public LTemplateInstruction<1, 3, 0> {
906 class LInstanceOfKnownGlobal:
public LTemplateInstruction<1, 2, 1> {
918 "instance-of-known-global")
923 return lazy_deopt_env_;
926 lazy_deopt_env_ = env;
934 class LBoundsCheck:
public LTemplateInstruction<0, 2, 0> {
949 class
LBitI: public LTemplateInstruction<1, 2, 0> {
966 class LShiftI:
public LTemplateInstruction<1, 2, 0> {
969 : op_(op), can_deopt_(can_deopt) {
988 class LSubI:
public LTemplateInstruction<1, 2, 0> {
1003 class
LConstantI: public LTemplateInstruction<1, 0, 0> {
1008 int32_t value()
const {
return hydrogen()->Integer32Value(); }
1012 class LConstantD:
public LTemplateInstruction<1, 0, 1> {
1023 double value()
const {
return hydrogen()->DoubleValue(); }
1027 class LConstantT:
public LTemplateInstruction<1, 0, 0> {
1036 class LBranch:
public LControlInstruction<1, 1> {
1068 return hydrogen()->FirstSuccessor()->block_id();
1071 return hydrogen()->SecondSuccessor()->block_id();
1076 class LJSArrayLength:
public LTemplateInstruction<1, 1, 0> {
1098 "fixed-array-base-length")
1115 class LElementsKind:
public LTemplateInstruction<1, 1, 0> {
1128 class
LValueOf: public LTemplateInstruction<1, 1, 1> {
1143 class
LDateField: public LTemplateInstruction<1, 1, 1> {
1164 class LThrow:
public LTemplateInstruction<0, 2, 0> {
1178 class LBitNotI:
public LTemplateInstruction<1, 1, 0> {
1190 class LAddI:
public LTemplateInstruction<1, 2, 0> {
1205 class
LMathMinMax: public LTemplateInstruction<1, 2, 0> {
1220 class
LPower: public LTemplateInstruction<1, 2, 0> {
1235 class
LRandom: public LTemplateInstruction<1, 1, 0> {
1248 class
LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1263 virtual const char*
Mnemonic()
const;
1270 class LArithmeticT:
public LTemplateInstruction<1, 3, 0> {
1288 virtual const char*
Mnemonic()
const;
1297 class LReturn:
public LTemplateInstruction<0, 1, 0> {
1307 class LLoadNamedField:
public LTemplateInstruction<1, 1, 0> {
1352 class LLoadFunctionPrototype:
public LTemplateInstruction<1, 1, 1> {
1379 class LLoadExternalArrayPointer:
public LTemplateInstruction<1, 1, 0> {
1388 "load-external-array-pointer")
1392 class LLoadKeyedFastElement:
public LTemplateInstruction<1, 2, 0> {
1405 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1409 class LLoadKeyedFastDoubleElement:
public LTemplateInstruction<1, 2, 0> {
1420 "load-keyed-fast-double-element")
1423 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1427 inline static bool ExternalArrayOpRequiresTemp(
1428 Representation key_representation,
1429 ElementsKind elements_kind) {
1433 return key_representation.IsTagged() &&
1440 class LLoadKeyedSpecializedArrayElement:
public LTemplateInstruction<1, 2, 0> {
1443 inputs_[0] = external_pointer;
1451 "load-keyed-specialized-array-element")
1454 ElementsKind elements_kind()
const {
1455 return hydrogen()->elements_kind();
1461 class LLoadKeyedGeneric:
public LTemplateInstruction<1, 3, 0> {
1477 class LLoadGlobalCell:
public LTemplateInstruction<1, 0, 0> {
1484 class LLoadGlobalGeneric: public LTemplateInstruction<1, 2, 0> {
1502 class LStoreGlobalCell:
public LTemplateInstruction<0, 1, 0> {
1537 class LLoadContextSlot:
public LTemplateInstruction<1, 1, 0> {
1548 int slot_index() {
return hydrogen()->slot_index(); }
1554 class LStoreContextSlot:
public LTemplateInstruction<0, 2, 1> {
1569 int slot_index() {
return hydrogen()->slot_index(); }
1575 class LPushArgument:
public LTemplateInstruction<0, 1, 0> {
1587 class LDrop:
public LTemplateInstruction<0, 0, 0> {
1589 explicit LDrop(
int count) : count_(count) { }
1607 class
LContext: public LTemplateInstruction<1, 0, 0> {
1613 class LOuterContext:
public LTemplateInstruction<1, 1, 0> {
1625 class LDeclareGlobals:
public LTemplateInstruction<0, 1, 0> {
1650 class LGlobalReceiver:
public LTemplateInstruction<1, 1, 0> {
1662 class LCallConstantFunction:
public LTemplateInstruction<1, 0, 0> {
1670 int arity()
const {
return hydrogen()->argument_count() - 1; }
1674 class LInvokeFunction:
public LTemplateInstruction<1, 2, 0> {
1689 int arity()
const {
return hydrogen()->argument_count() - 1; }
1694 class LCallKeyed:
public LTemplateInstruction<1, 2, 0> {
1709 int arity()
const {
return hydrogen()->argument_count() - 1; }
1713 class LCallNamed:
public LTemplateInstruction<1, 1, 0> {
1727 int arity()
const {
return hydrogen()->argument_count() - 1; }
1731 class LCallFunction:
public LTemplateInstruction<1, 2, 0> {
1744 int arity()
const {
return hydrogen()->argument_count() - 1; }
1748 class LCallGlobal:
public LTemplateInstruction<1, 1, 0> {
1762 int arity()
const {
return hydrogen()->argument_count() - 1; }
1766 class LCallKnownGlobal:
public LTemplateInstruction<1, 0, 0> {
1774 int arity()
const {
return hydrogen()->argument_count() - 1; }
1778 class LCallNew:
public LTemplateInstruction<1, 2, 0> {
1793 int arity()
const {
return hydrogen()->argument_count() - 1; }
1797 class LCallRuntime:
public LTemplateInstruction<1, 1, 0> {
1809 int arity()
const {
return hydrogen()->argument_count(); }
1813 class LInteger32ToDouble:
public LTemplateInstruction<1, 1, 0> {
1825 class LUint32ToDouble:
public LTemplateInstruction<1, 1, 1> {
1839 class LNumberTagI:
public LTemplateInstruction<1, 1, 0> {
1851 class LNumberTagU:
public LTemplateInstruction<1, 1, 1> {
1864 class LNumberTagD:
public LTemplateInstruction<1, 1, 1> {
1879 class LDoubleToI:
public LTemplateInstruction<1, 1, 1> {
1892 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1897 class LTaggedToI:
public LTemplateInstruction<1, 1, 1> {
1910 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1914 class LSmiTag:
public LTemplateInstruction<1, 1, 0> {
1926 class LNumberUntagD:
public LTemplateInstruction<1, 1, 1> {
1941 class
LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1944 : needs_check_(needs_check) {
1952 bool needs_check()
const {
return needs_check_; }
1959 class LStoreNamedField:
public LTemplateInstruction<0, 2, 2> {
1983 int offset() {
return hydrogen()->offset(); }
1988 class LStoreNamedGeneric:
public LTemplateInstruction<0, 3, 0> {
2009 class LStoreKeyedFastElement:
public LTemplateInstruction<0, 3, 0> {
2022 "store-keyed-fast-element")
2026 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
2030 class LStoreKeyedFastDoubleElement:
public LTemplateInstruction<0, 3, 0> {
2045 "store-keyed-fast-double-element")
2050 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
2056 class LStoreKeyedSpecializedArrayElement:
public LTemplateInstruction<0, 3, 0> {
2061 inputs_[0] = external_pointer;
2071 "store-keyed-specialized-array-element")
2074 ElementsKind elements_kind()
const {
2075 return hydrogen()->elements_kind();
2081 class LStoreKeyedGeneric:
public LTemplateInstruction<0, 4, 0> {
2107 class LTransitionElementsKind:
public LTemplateInstruction<1, 1, 2> {
2113 temps_[0] = new_map_temp;
2122 "transition-elements-kind")
2127 Handle<
Map> original_map() {
return hydrogen()->original_map(); }
2132 class LStringAdd:
public LTemplateInstruction<1, 3, 0> {
2222 class
LCheckMaps: public LTemplateInstruction<0, 1, 0> {
2251 class LCheckSmi:
public LTemplateInstruction<0, 1, 0> {
2263 class LClampDToUint8:
public LTemplateInstruction<1, 1, 0> {
2275 class LClampIToUint8:
public LTemplateInstruction<1, 1, 0> {
2287 class LClampTToUint8:
public LTemplateInstruction<1, 1, 1> {
2300 class LCheckNonSmi:
public LTemplateInstruction<0, 1, 0> {
2312 class LAllocateObject:
public LTemplateInstruction<1, 1, 1> {
2327 class
LFastLiteral: public LTemplateInstruction<1, 1, 0> {
2394 class LToFastProperties:
public LTemplateInstruction<1, 1, 0> {
2407 class
LTypeof: public LTemplateInstruction<1, 2, 0> {
2421 class LTypeofIsAndBranch:
public LControlInstruction<1, 0> {
2438 class LDeleteProperty:
public LTemplateInstruction<1, 3, 0> {
2454 class LOsrEntry:
public LTemplateInstruction<0, 0, 0> {
2460 LOperand** SpilledRegisterArray() {
return register_spills_; }
2463 void MarkSpilledRegister(
int allocation_index,
LOperand* spill_operand);
2464 void MarkSpilledDoubleRegister(
int allocation_index,
2477 class LStackCheck:
public LTemplateInstruction<0, 1, 0> {
2488 Label* done_label() {
return &done_label_; }
2495 class LIn:
public LTemplateInstruction<1, 3, 0> {
2511 class LForInPrepareMap:
public LTemplateInstruction<1, 2, 0> {
2525 class LForInCacheArray:
public LTemplateInstruction<1, 1, 0> {
2541 class LCheckMapValue:
public LTemplateInstruction<0, 2, 0> {
2555 class LLoadFieldByIndex:
public LTemplateInstruction<1, 2, 0> {
2569 class LChunkBuilder;
2570 class LPlatformChunk:
public LChunk {
2574 num_double_slots_(0) { }
2576 int GetNextSpillIndex(
bool is_double);
2577 LOperand* GetNextSpillSlot(
bool is_double);
2582 int num_double_slots_;
2592 zone_(graph->zone()),
2594 current_instruction_(
NULL),
2595 current_block_(
NULL),
2598 allocator_(allocator),
2599 position_(RelocInfo::kNoPosition),
2600 instruction_pending_deoptimization_environment_(
NULL),
2607 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2611 static HValue* SimplifiedDividendForMathFloorOfDiv(HValue* val);
2612 static HValue* SimplifiedDivisorForMathFloorOfDiv(HValue* val);
2622 LPlatformChunk* chunk()
const {
return chunk_; }
2623 CompilationInfo* info()
const {
return info_; }
2624 HGraph* graph()
const {
return graph_; }
2625 Zone* zone()
const {
return zone_; }
2627 bool is_unused()
const {
return status_ == UNUSED; }
2628 bool is_building()
const {
return status_ == BUILDING; }
2629 bool is_done()
const {
return status_ ==
DONE; }
2630 bool is_aborted()
const {
return status_ == ABORTED; }
2632 void Abort(
const char* reason);
2635 LUnallocated* ToUnallocated(Register reg);
2636 LUnallocated* ToUnallocated(XMMRegister reg);
2640 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2642 XMMRegister fixed_register);
2668 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2681 template<
int I,
int T>
2682 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2684 template<
int I,
int T>
2685 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2686 template<
int I,
int T>
2687 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2689 template<
int I,
int T>
2690 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2691 template<
int I,
int T>
2692 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2694 template<
int I,
int T>
2695 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2704 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2711 HInstruction* hinstr,
2712 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2714 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2715 int* argument_index_accumulator);
2717 void VisitInstruction(HInstruction* current);
2719 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2722 HArithmeticBinaryOperation* instr);
2724 HArithmeticBinaryOperation* instr);
2726 LPlatformChunk* chunk_;
2727 CompilationInfo* info_;
2728 HGraph*
const graph_;
2731 HInstruction* current_instruction_;
2732 HBasicBlock* current_block_;
2733 HBasicBlock* next_block_;
2734 int argument_count_;
2735 LAllocator* allocator_;
2737 LInstruction* instruction_pending_deoptimization_environment_;
2738 BailoutId pending_deoptimization_ast_id_;
2743 #undef DECLARE_HYDROGEN_ACCESSOR
2744 #undef DECLARE_CONCRETE_INSTRUCTION
2748 #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)
friend class TempIterator
LGlobalReceiver(LOperand *global_object)
static LGap * cast(LInstruction *instr)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
Handle< Map > transitioned_map()
LLoadFieldByIndex(LOperand *object, LOperand *index)
LGetCachedArrayIndex(LOperand *value)
void set_pointer_map(LPointerMap *p)
bool IsMarkedAsCall() const
LStringCharCodeAt(LOperand *context, LOperand *string, LOperand *index)
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)
LOperand * new_map_temp()
LCheckSmi(LOperand *value)
LStringLength(LOperand *string)
LIsObjectAndBranch(LOperand *value, LOperand *temp)
LStoreGlobalCell(LOperand *value)
LLoadNamedFieldPolymorphic(LOperand *context, LOperand *object)
LTypeof(LOperand *context, LOperand *value)
LLabel(HBasicBlock *block)
LJSArrayLength(LOperand *value)
int true_block_id() const
LAllocateObject(LOperand *context, LOperand *temp)
LOperand * external_pointer()
LChunkBuilder(CompilationInfo *info, HGraph *graph, LAllocator *allocator)
LTransitionElementsKind(LOperand *object, LOperand *new_map_temp, LOperand *temp)
LMathFloorOfDiv(LOperand *left, LOperand *right, LOperand *temp=NULL)
LOuterContext(LOperand *context)
static const int kNumAllocatableRegisters
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
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)
LOperand * external_pointer()
LMathPowHalf(LOperand *context, LOperand *value, LOperand *temp)
friend class InputIterator
LIn(LOperand *context, LOperand *key, LOperand *object)
StrictModeFlag strict_mode_flag()
LUint32ToDouble(LOperand *value, LOperand *temp)
LNumberTagD(LOperand *value, LOperand *temp)
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< Map > map() const
LStoreGlobalGeneric(LOperand *context, LOperand *global_object, LOperand *value)
LGlobalObject(LOperand *context)
EmbeddedContainer< LOperand *, R > results_
LLabel * replacement() const
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()
LElementsKind(LOperand *value)
virtual Opcode opcode() const
HBasicBlock * SuccessorAt(int i)
LStoreKeyedFastElement(LOperand *obj, LOperand *key, LOperand *val)
LIsStringAndBranch(LOperand *value, LOperand *temp)
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)
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
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 use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra 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 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if expose natives in global object expose gc extension number of stack frames to capture disable builtin natives files print a stack trace if an assertion failure occurs use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations prepare for turning on always opt minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions automatically set the debug break flag when debugger commands are in the queue always cause a debug break before aborting maximum length of function source code printed in a stack trace max size of the new max size of the old max size of executable always perform global GCs print one trace line following each garbage collection do not print trace line after scavenger collection print more details following each garbage collection print amount of external allocated memory after each time it is adjusted flush code that we expect not to use again before full gc do incremental marking steps track object counts and memory usage use caching Perform compaction on every full GC Never perform compaction on full GC testing only Compact code space on full incremental collections Default seed for initializing random generator(0, the default, means to use system random).") DEFINE_bool(use_verbose_printer
LOperand * global_object()
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)
activate correct semantics for inheriting readonliness false
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)
EmbeddedContainer< LOperand *, I > inputs_
virtual bool IsGap() const
LTaggedToI(LOperand *value, LOperand *temp)
LCallFunction(LOperand *context, LOperand *function)
LHasCachedArrayIndexAndBranch(LOperand *value)
LCheckFunction(LOperand *value)
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
virtual void PrintDataTo(StringStream *stream)
LCallGlobal(LOperand *context)
LLoadElements(LOperand *object)
LCmpConstantEqAndBranch(LOperand *left)
virtual void CompileToNative(LCodeGen *generator)=0
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,"load-keyed-fast-double-element") uint32_t additional_index() const
virtual bool IsGap() const
LMathMinMax(LOperand *left, LOperand *right)
#define DECLARE_HYDROGEN_ACCESSOR(type)
static const int kNumAllocatableRegisters
LCallNew(LOperand *context, LOperand *constructor)
LNumberTagU(LOperand *value, LOperand *temp)
LThrow(LOperand *context, LOperand *value)
LCheckMaps(LOperand *value)
bool IsLoopHeader() const
LLoadKeyedFastDoubleElement(LOperand *elements, LOperand *key)
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
uint32_t additional_index() const
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,"load-keyed-specialized-array-element") ElementsKind elements_kind() const
virtual void PrintDataTo(StringStream *stream)
LMapEnumLength(LOperand *value)
LCallRuntime(LOperand *context)
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)
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 use dead code elimination trace on stack replacement optimize closures cache optimized code for closures functions with arguments object loop weight for representation inference allow uint32 values on optimize frames if they are used only in safe operations track parallel recompilation enable all profiler experiments number of stack frames inspected by the profiler call recompile stub directly when self optimizing trigger profiler ticks based on counting instead of timing weight back edges by jump distance for interrupt triggering percentage of ICs that must have type info to allow optimization watch_ic_patching retry_self_opt interrupt_at_exit extra verbose compilation tracing generate extra 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 and VFP2 enable use of VFP2 instructions if available enable use of SDIV and UDIV instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of MIPS FPU instructions if NULL
virtual Opcode opcode() const
bool HasPointerMap() const
LCheckMapValue(LOperand *value, LOperand *map)
LIsSmiAndBranch(LOperand *value)
LStringCharFromCode(LOperand *context, LOperand *char_code)
LInteger32ToDouble(LOperand *value)
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,"store-keyed-specialized-array-element") ElementsKind elements_kind() 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)
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)
LLoadNamedGeneric(LOperand *context, LOperand *object)
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
LSmiUntag(LOperand *value, bool needs_check)
LLoadKeyedSpecializedArrayElement(LOperand *external_pointer, LOperand *key)
LInvokeFunction(LOperand *context, LOperand *function)
virtual void PrintDataTo(StringStream *stream)