28 #ifndef V8_X64_LITHIUM_X64_H_
29 #define V8_X64_LITHIUM_X64_H_
43 #define LITHIUM_ALL_INSTRUCTION_LIST(V) \
44 V(ControlInstruction) \
46 LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
49 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
50 V(AccessArgumentsAt) \
54 V(ArgumentsElements) \
63 V(CallConstantFunction) \
73 V(CheckInstanceType) \
76 V(CheckPrototypeMaps) \
81 V(ClassOfTestAndBranch) \
82 V(CmpConstantEqAndBranch) \
84 V(CmpObjectEqAndBranch) \
98 V(FixedArrayBaseLength) \
101 V(GetCachedArrayIndex) \
105 V(HasCachedArrayIndexAndBranch) \
106 V(HasInstanceTypeAndBranch) \
109 V(InstanceOfKnownGlobal) \
111 V(Integer32ToDouble) \
114 V(IsConstructCallAndBranch) \
116 V(IsObjectAndBranch) \
117 V(IsStringAndBranch) \
119 V(IsUndetectableAndBranch) \
125 V(LoadExternalArrayPointer) \
126 V(LoadFunctionPrototype) \
128 V(LoadGlobalGeneric) \
129 V(LoadKeyedFastDoubleElement) \
130 V(LoadKeyedFastElement) \
131 V(LoadKeyedGeneric) \
132 V(LoadKeyedSpecializedArrayElement) \
134 V(LoadNamedFieldPolymorphic) \
135 V(LoadNamedGeneric) \
157 V(StoreContextSlot) \
159 V(StoreGlobalGeneric) \
160 V(StoreKeyedFastDoubleElement) \
161 V(StoreKeyedFastElement) \
162 V(StoreKeyedGeneric) \
163 V(StoreKeyedSpecializedArrayElement) \
165 V(StoreNamedGeneric) \
167 V(StringCharCodeAt) \
168 V(StringCharFromCode) \
169 V(StringCompareAndBranch) \
175 V(ToFastProperties) \
176 V(TransitionElementsKind) \
178 V(TypeofIsAndBranch) \
179 V(UnaryMathOperation) \
185 V(LoadFieldByIndex) \
191 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
192 virtual Opcode opcode() const { return LInstruction::k##type; } \
193 virtual void CompileToNative(LCodeGen* generator); \
194 virtual const char* Mnemonic() const { return mnemonic; } \
195 static L##type* cast(LInstruction* instr) { \
196 ASSERT(instr->Is##type()); \
197 return reinterpret_cast<L##type*>(instr); \
201 #define DECLARE_HYDROGEN_ACCESSOR(type) \
202 H##type* hydrogen() const { \
203 return H##type::cast(hydrogen_value()); \
207 class LInstruction:
public ZoneObject {
210 : environment_(
NULL),
211 hydrogen_value_(
NULL),
217 virtual const char*
Mnemonic()
const = 0;
224 #define DECLARE_OPCODE(type) k##type,
227 #undef DECLARE_OPCODE
233 #define DECLARE_PREDICATE(type) \
234 bool Is##type() const { return opcode() == k##type; }
236 #undef DECLARE_PREDICATE
240 virtual bool IsGap()
const {
return false; }
275 virtual int InputCount() = 0;
276 virtual LOperand* InputAt(
int i) = 0;
279 virtual int TempCount() = 0;
280 virtual LOperand* TempAt(
int i) = 0;
292 template<
int R,
int I,
int T>
293 class LTemplateInstruction:
public LInstruction {
308 virtual int InputCount() {
return I; }
309 virtual LOperand* InputAt(
int i) {
return inputs_[i]; }
311 virtual int TempCount() {
return T; }
312 virtual LOperand* TempAt(
int i) {
return temps_[i]; }
316 class LGap:
public LTemplateInstruction<0, 0, 0> {
327 virtual bool IsGap()
const {
return true; }
331 return reinterpret_cast<LGap*
>(instr);
349 if (parallel_moves_[pos] ==
NULL) {
352 return parallel_moves_[pos];
356 return parallel_moves_[pos];
365 class LInstructionGap:
public LGap {
373 class LGoto:
public LTemplateInstruction<0, 0, 0> {
388 class LLazyBailout:
public LTemplateInstruction<0, 0, 0> {
400 int gap_instructions_size_;
404 class LDeoptimize:
public LTemplateInstruction<0, 0, 0> {
410 class LLabel:
public LGap {
413 :
LGap(block), replacement_(
NULL) { }
432 class LParameter:
public LTemplateInstruction<1, 0, 0> {
438 class LCallStub:
public LTemplateInstruction<1, 0, 0> {
444 return hydrogen()->transcendental_type();
449 class LUnknownOSRValue:
public LTemplateInstruction<1, 0, 0> {
455 template<
int I,
int T>
456 class LControlInstruction:
public LTemplateInstruction<0, I, T> {
472 class LWrapReceiver:
public LTemplateInstruction<1, 2, 0> {
486 class LApplyArguments:
public LTemplateInstruction<1, 4, 0> {
507 class LAccessArgumentsAt:
public LTemplateInstruction<1, 3, 0> {
537 class LArgumentsElements:
public LTemplateInstruction<1, 0, 0> {
544 class LModI: public LTemplateInstruction<1, 2, 1> {
561 class
LDivI: public LTemplateInstruction<1, 2, 1> {
597 class
LMulI: public LTemplateInstruction<1, 2, 0> {
627 return hydrogen()->GetInputRepresentation().IsDouble();
634 class LUnaryMathOperation:
public LTemplateInstruction<1, 1, 0> {
650 class LCmpObjectEqAndBranch:
public LControlInstruction<2, 0> {
661 "cmp-object-eq-and-branch")
665 class LCmpConstantEqAndBranch:
public LControlInstruction<1, 0> {
674 "cmp-constant-eq-and-branch")
699 class LIsObjectAndBranch:
public LControlInstruction<1, 0> {
757 "is-undetectable-and-branch")
775 "string-compare-and-branch")
784 class LHasInstanceTypeAndBranch:
public LControlInstruction<1, 0> {
793 "has-instance-type-and-branch")
822 "has-cached-array-index-and-branch")
842 "class-of-test-and-branch")
849 class
LCmpT: public LTemplateInstruction<1, 2, 0> {
866 class LIn:
public LTemplateInstruction<1, 2, 0> {
880 class LInstanceOf:
public LTemplateInstruction<1, 2, 0> {
894 class LInstanceOfKnownGlobal:
public LTemplateInstruction<1, 1, 1> {
905 "instance-of-known-global")
910 return lazy_deopt_env_;
913 lazy_deopt_env_ = env;
921 class LBoundsCheck:
public LTemplateInstruction<0, 2, 0> {
936 class
LBitI: public LTemplateInstruction<1, 2, 0> {
953 class
LShiftI: public LTemplateInstruction<1, 2, 0> {
956 : op_(op), can_deopt_(can_deopt) {
974 class
LSubI: public LTemplateInstruction<1, 2, 0> {
989 class
LConstantI: public LTemplateInstruction<1, 0, 0> {
994 int32_t value()
const {
return hydrogen()->Integer32Value(); }
998 class LConstantD:
public LTemplateInstruction<1, 0, 1> {
1009 double value()
const {
return hydrogen()->DoubleValue(); }
1013 class LConstantT:
public LTemplateInstruction<1, 0, 0> {
1022 class LBranch:
public LControlInstruction<1, 0> {
1052 return hydrogen()->FirstSuccessor()->block_id();
1055 return hydrogen()->SecondSuccessor()->block_id();
1060 class LJSArrayLength:
public LTemplateInstruction<1, 1, 0> {
1082 "fixed-array-base-length")
1099 class LElementsKind:
public LTemplateInstruction<1, 1, 0> {
1112 class
LValueOf: public LTemplateInstruction<1, 1, 0> {
1125 class
LDateField: public LTemplateInstruction<1, 1, 0> {
1142 class
LThrow: public LTemplateInstruction<0, 1, 0> {
1154 class LBitNotI:
public LTemplateInstruction<1, 1, 0> {
1166 class LAddI:
public LTemplateInstruction<1, 2, 0> {
1181 class
LMathMinMax: public LTemplateInstruction<1, 2, 0> {
1196 class
LPower: public LTemplateInstruction<1, 2, 0> {
1211 class
LRandom: public LTemplateInstruction<1, 1, 0> {
1224 class
LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1238 virtual const char*
Mnemonic()
const;
1245 class LArithmeticT:
public LTemplateInstruction<1, 2, 0> {
1259 virtual const char*
Mnemonic()
const;
1266 class LReturn:
public LTemplateInstruction<0, 1, 0> {
1278 class LLoadNamedField:
public LTemplateInstruction<1, 1, 0> {
1304 class LLoadNamedGeneric:
public LTemplateInstruction<1, 1, 0> {
1318 class LLoadFunctionPrototype:
public LTemplateInstruction<1, 1, 0> {
1331 class LLoadElements:
public LTemplateInstruction<1, 1, 0> {
1343 class LLoadExternalArrayPointer:
public LTemplateInstruction<1, 1, 0> {
1352 "load-external-array-pointer")
1356 class LLoadKeyedFastElement:
public LTemplateInstruction<1, 2, 0> {
1372 class LLoadKeyedFastDoubleElement:
public LTemplateInstruction<1, 2, 0> {
1380 "load-keyed-fast-double-element")
1389 class LLoadKeyedSpecializedArrayElement:
public LTemplateInstruction<1, 2, 0> {
1392 inputs_[0] = external_pointer;
1397 "load-keyed-specialized-array-element")
1403 return hydrogen()->elements_kind();
1409 class LLoadKeyedGeneric:
public LTemplateInstruction<1, 2, 0> {
1423 class LLoadGlobalCell:
public LTemplateInstruction<1, 0, 0> {
1430 class LLoadGlobalGeneric: public LTemplateInstruction<1, 1, 0> {
1445 class LStoreGlobalCell:
public LTemplateInstruction<0, 1, 1> {
1479 class LLoadContextSlot:
public LTemplateInstruction<1, 1, 0> {
1490 int slot_index() {
return hydrogen()->slot_index(); }
1496 class LStoreContextSlot:
public LTemplateInstruction<0, 2, 1> {
1511 int slot_index() {
return hydrogen()->slot_index(); }
1517 class LPushArgument:
public LTemplateInstruction<0, 1, 0> {
1529 class LDrop:
public LTemplateInstruction<0, 0, 0> {
1531 explicit LDrop(
int count) : count_(count) { }
1549 class
LContext: public LTemplateInstruction<1, 0, 0> {
1555 class LOuterContext:
public LTemplateInstruction<1, 1, 0> {
1567 class LDeclareGlobals:
public LTemplateInstruction<0, 0, 0> {
1574 class LGlobalObject: public LTemplateInstruction<1, 0, 0> {
1580 class LGlobalReceiver:
public LTemplateInstruction<1, 1, 0> {
1592 class LCallConstantFunction:
public LTemplateInstruction<1, 0, 0> {
1600 int arity()
const {
return hydrogen()->argument_count() - 1; }
1604 class LInvokeFunction:
public LTemplateInstruction<1, 1, 0> {
1617 int arity()
const {
return hydrogen()->argument_count() - 1; }
1622 class LCallKeyed:
public LTemplateInstruction<1, 1, 0> {
1635 int arity()
const {
return hydrogen()->argument_count() - 1; }
1639 class LCallNamed:
public LTemplateInstruction<1, 0, 0> {
1647 int arity()
const {
return hydrogen()->argument_count() - 1; }
1651 class LCallFunction:
public LTemplateInstruction<1, 1, 0> {
1661 int arity()
const {
return hydrogen()->argument_count() - 1; }
1665 class LCallGlobal:
public LTemplateInstruction<1, 0, 0> {
1673 int arity()
const {
return hydrogen()->argument_count() - 1; }
1677 class LCallKnownGlobal:
public LTemplateInstruction<1, 0, 0> {
1685 int arity()
const {
return hydrogen()->argument_count() - 1; }
1689 class LCallNew:
public LTemplateInstruction<1, 1, 0> {
1702 int arity()
const {
return hydrogen()->argument_count() - 1; }
1706 class LCallRuntime:
public LTemplateInstruction<1, 0, 0> {
1712 int arity()
const {
return hydrogen()->argument_count(); }
1716 class LInteger32ToDouble:
public LTemplateInstruction<1, 1, 0> {
1728 class LUint32ToDouble:
public LTemplateInstruction<1, 1, 1> {
1742 class LNumberTagI:
public LTemplateInstruction<1, 1, 0> {
1754 class LNumberTagU:
public LTemplateInstruction<1, 1, 1> {
1768 class LNumberTagD:
public LTemplateInstruction<1, 1, 1> {
1783 class LDoubleToI:
public LTemplateInstruction<1, 1, 0> {
1794 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1799 class LTaggedToI:
public LTemplateInstruction<1, 1, 1> {
1812 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1816 class LSmiTag:
public LTemplateInstruction<1, 1, 0> {
1828 class LNumberUntagD:
public LTemplateInstruction<1, 1, 0> {
1841 class
LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1844 : needs_check_(needs_check) {
1877 int offset() {
return hydrogen()->offset(); }
1882 class LStoreNamedGeneric:
public LTemplateInstruction<0, 2, 0> {
1902 class LStoreKeyedFastElement:
public LTemplateInstruction<0, 3, 0> {
1915 "store-keyed-fast-element")
1920 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1924 class LStoreKeyedFastDoubleElement:
public LTemplateInstruction<0, 3, 0> {
1939 "store-keyed-fast-double-element")
1944 bool NeedsCanonicalization() {
return hydrogen()->NeedsCanonicalization(); }
1949 class LStoreKeyedSpecializedArrayElement:
public LTemplateInstruction<0, 3, 0> {
1954 inputs_[0] = external_pointer;
1964 "store-keyed-specialized-array-element")
1967 ElementsKind elements_kind()
const {
return hydrogen()->elements_kind(); }
1972 class LStoreKeyedGeneric:
public LTemplateInstruction<0, 3, 0> {
1993 class LTransitionElementsKind:
public LTemplateInstruction<1, 1, 2> {
1999 temps_[0] = new_map_temp;
2008 "transition-elements-kind")
2013 Handle<
Map> original_map() {
return hydrogen()->original_map(); }
2018 class LStringAdd:
public LTemplateInstruction<1, 2, 0> {
2100 class
LCheckMaps: public LTemplateInstruction<0, 1, 0> {
2129 class LCheckSmi:
public LTemplateInstruction<0, 1, 0> {
2141 class LClampDToUint8:
public LTemplateInstruction<1, 1, 0> {
2153 class LClampIToUint8:
public LTemplateInstruction<1, 1, 0> {
2165 class LClampTToUint8:
public LTemplateInstruction<1, 1, 1> {
2180 class LCheckNonSmi:
public LTemplateInstruction<0, 1, 0> {
2192 class LAllocateObject:
public LTemplateInstruction<1, 0, 1> {
2205 class
LFastLiteral: public LTemplateInstruction<1, 0, 0> {
2242 class LToFastProperties:
public LTemplateInstruction<1, 1, 0> {
2255 class
LTypeof: public LTemplateInstruction<1, 1, 0> {
2267 class LTypeofIsAndBranch:
public LControlInstruction<1, 0> {
2284 class LIsConstructCallAndBranch:
public LControlInstruction<0, 1> {
2293 "is-construct-call-and-branch")
2312 class LOsrEntry:
public LTemplateInstruction<0, 0, 0> {
2318 LOperand** SpilledRegisterArray() {
return register_spills_; }
2321 void MarkSpilledRegister(
int allocation_index,
LOperand* spill_operand);
2322 void MarkSpilledDoubleRegister(
int allocation_index,
2335 class LStackCheck:
public LTemplateInstruction<0, 0, 0> {
2340 Label* done_label() {
return &done_label_; }
2347 class LForInPrepareMap:
public LTemplateInstruction<1, 1, 0> {
2359 class LForInCacheArray:
public LTemplateInstruction<1, 1, 0> {
2375 class LCheckMapValue:
public LTemplateInstruction<0, 2, 0> {
2389 class LLoadFieldByIndex:
public LTemplateInstruction<1, 2, 0> {
2403 class LChunkBuilder;
2404 class LPlatformChunk:
public LChunk {
2407 :
LChunk(info, graph) { }
2409 int GetNextSpillIndex(
bool is_double);
2410 LOperand* GetNextSpillSlot(
bool is_double);
2420 zone_(graph->zone()),
2422 current_instruction_(
NULL),
2423 current_block_(
NULL),
2426 allocator_(allocator),
2427 position_(RelocInfo::kNoPosition),
2428 instruction_pending_deoptimization_environment_(
NULL),
2435 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2439 static HValue* SimplifiedDividendForMathFloorOfDiv(HValue* val);
2440 static HValue* SimplifiedDivisorForMathFloorOfDiv(HValue* val);
2450 LPlatformChunk* chunk()
const {
return chunk_; }
2451 CompilationInfo* info()
const {
return info_; }
2452 HGraph* graph()
const {
return graph_; }
2453 Zone* zone()
const {
return zone_; }
2455 bool is_unused()
const {
return status_ == UNUSED; }
2456 bool is_building()
const {
return status_ == BUILDING; }
2457 bool is_done()
const {
return status_ ==
DONE; }
2458 bool is_aborted()
const {
return status_ == ABORTED; }
2460 void Abort(
const char* reason);
2463 LUnallocated* ToUnallocated(Register reg);
2464 LUnallocated* ToUnallocated(XMMRegister reg);
2468 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2470 XMMRegister fixed_register);
2496 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2509 template<
int I,
int T>
2510 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2512 template<
int I,
int T>
2513 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2514 template<
int I,
int T>
2515 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2517 template<
int I,
int T>
2518 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2519 template<
int I,
int T>
2520 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2522 template<
int I,
int T>
2523 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2532 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2539 HInstruction* hinstr,
2540 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2542 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2543 int* argument_index_accumulator);
2545 void VisitInstruction(HInstruction* current);
2547 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2550 HArithmeticBinaryOperation* instr);
2552 HArithmeticBinaryOperation* instr);
2554 LPlatformChunk* chunk_;
2555 CompilationInfo* info_;
2556 HGraph*
const graph_;
2559 HInstruction* current_instruction_;
2560 HBasicBlock* current_block_;
2561 HBasicBlock* next_block_;
2562 int argument_count_;
2563 LAllocator* allocator_;
2565 LInstruction* instruction_pending_deoptimization_environment_;
2566 BailoutId pending_deoptimization_ast_id_;
2571 #undef DECLARE_HYDROGEN_ACCESSOR
2572 #undef DECLARE_CONCRETE_INSTRUCTION
2576 #endif // V8_X64_LITHIUM_X64_H_
LCmpT(LOperand *left, LOperand *right)
LStringCharCodeAt(LOperand *string, LOperand *index)
LArgumentsLength(LOperand *elements)
LLoadContextSlot(LOperand *context)
LDoubleToI(LOperand *value)
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)
uint32_t additional_index() const
LGetCachedArrayIndex(LOperand *value)
LCallKeyed(LOperand *key)
void set_pointer_map(LPointerMap *p)
bool IsMarkedAsCall() const
LOperand * global_object()
LStoreKeyedFastDoubleElement(LOperand *elements, LOperand *key, LOperand *value)
void set_environment(LEnvironment *env)
void set_result(LOperand *operand)
int false_block_id() const
virtual void PrintOutputOperandTo(StringStream *stream)
EmbeddedContainer< LOperand *, T > temps_
LStoreContextSlot(LOperand *context, LOperand *value, LOperand *temp)
uint32_t additional_index() const
LAllocateObject(LOperand *temp)
LWrapReceiver(LOperand *receiver, LOperand *function)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
LConstantD(LOperand *temp)
LNumberTagI(LOperand *value)
#define DECLARE_OPCODE(type)
LInstructionGap(HBasicBlock *block)
LDateField(LOperand *date, Smi *index)
LClampTToUint8(LOperand *unclamped, LOperand *temp_xmm)
LLoadGlobalGeneric(LOperand *global_object)
LOperand * new_map_temp()
LCheckSmi(LOperand *value)
LLoadFunctionPrototype(LOperand *function)
LStringLength(LOperand *string)
Handle< Object > name() const
LLabel(HBasicBlock *block)
LJSArrayLength(LOperand *value)
int true_block_id() const
LClampIToUint8(LOperand *unclamped)
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
Handle< Map > transition() const
LEnvironment * environment() const
LValueOf(LOperand *value)
virtual HBasicBlock * SuccessorAt(int i)=0
LCheckNonSmi(LOperand *value)
#define ASSERT(condition)
LBoundsCheck(LOperand *index, LOperand *length)
virtual const char * Mnemonic() const =0
LFixedArrayBaseLength(LOperand *value)
LClassOfTestAndBranch(LOperand *value, LOperand *temp, LOperand *temp2)
LCheckInstanceType(LOperand *value)
virtual void PrintDataTo(StringStream *stream)
LModI(LOperand *left, LOperand *right, LOperand *temp)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
int gap_instructions_size()
LStoreKeyedFastElement(LOperand *object, LOperand *key, LOperand *value)
uint32_t additional_index() const
friend class InputIterator
LInvokeFunction(LOperand *function)
LHasInstanceTypeAndBranch(LOperand *value)
LStoreKeyedGeneric(LOperand *object, LOperand *key, LOperand *value)
StrictModeFlag strict_mode_flag()
LUint32ToDouble(LOperand *value, LOperand *temp)
LNumberTagD(LOperand *value, LOperand *temp)
LNumberUntagD(LOperand *value)
LIsNilAndBranch(LOperand *value, LOperand *temp)
#define DECLARE_PREDICATE(type)
LForInPrepareMap(LOperand *object)
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
virtual Opcode opcode() const =0
Handle< Object > name() const
Handle< Map > map() const
EmbeddedContainer< LOperand *, R > results_
ElementsKind elements_kind() const
LLabel * replacement() const
LDeleteProperty(LOperand *obj, LOperand *key)
LDivI(LOperand *left, LOperand *right, LOperand *temp)
Handle< JSFunction > known_function()
LAddI(LOperand *left, LOperand *right)
bool is_loop_header() const
LCmpObjectEqAndBranch(LOperand *left, LOperand *right)
LOperand ** SpilledDoubleRegisterArray()
LElementsKind(LOperand *value)
virtual Opcode opcode() const
HBasicBlock * SuccessorAt(int i)
LIsStringAndBranch(LOperand *value, LOperand *temp)
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,"load-keyed-fast-double-element") LOperand *elements()
LLoadKeyedFastElement(LOperand *elements, LOperand *key)
bool HasEnvironment() const
virtual bool HasResult() const
LBitI(LOperand *left, LOperand *right)
LLoadExternalArrayPointer(LOperand *object)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
virtual bool IsControl() const
LTypeofIsAndBranch(LOperand *value)
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
LStoreGlobalGeneric(LOperand *global_object, LOperand *value)
LOperand * global_object()
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
virtual bool IsControl() const
LCmpMapAndBranch(LOperand *value)
LStringCharFromCode(LOperand *char_code)
HBasicBlock * block() const
LSubI(LOperand *left, LOperand *right)
TranscendentalCache::Type transcendental_type()
virtual void PrintTo(StringStream *stream)
activate correct semantics for inheriting readonliness false
virtual void PrintDataTo(StringStream *stream)
#define DECLARE_HYDROGEN_ACCESSOR(type)
#define T(name, string, precedence)
LToFastProperties(LOperand *value)
LInstanceOf(LOperand *left, LOperand *right)
LIsObjectAndBranch(LOperand *value)
LMulI(LOperand *left, LOperand *right)
virtual int SuccessorCount()=0
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)
LHasCachedArrayIndexAndBranch(LOperand *value)
LCheckFunction(LOperand *value)
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
LArithmeticT(Token::Value op, LOperand *left, LOperand *right)
virtual void PrintDataTo(StringStream *stream)
void set_gap_instructions_size(int gap_instructions_size)
LLoadElements(LOperand *object)
LCmpConstantEqAndBranch(LOperand *left)
virtual void CompileToNative(LCodeGen *generator)=0
virtual bool IsGap() const
LMathMinMax(LOperand *left, LOperand *right)
static const int kNumAllocatableRegisters
LNumberTagU(LOperand *value, LOperand *temp)
LStringAdd(LOperand *left, LOperand *right)
LLoadNamedFieldPolymorphic(LOperand *object)
LCheckMaps(LOperand *value)
LClampDToUint8(LOperand *unclamped)
bool IsLoopHeader() const
LStoreNamedField(LOperand *object, LOperand *value, LOperand *temp)
LLoadKeyedFastDoubleElement(LOperand *elements, LOperand *key)
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
uint32_t additional_index() const
virtual void PrintDataTo(StringStream *stream)
LMapEnumLength(LOperand *value)
LUnaryMathOperation(LOperand *value)
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)
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
LInstanceOfKnownGlobal(LOperand *value, LOperand *temp)
bool HasPointerMap() const
LCheckMapValue(LOperand *value, LOperand *map)
LIsSmiAndBranch(LOperand *value)
uint32_t additional_index() const
LInteger32ToDouble(LOperand *value)
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,"store-keyed-specialized-array-element") ElementsKind elements_kind() const
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,"load-keyed-specialized-array-element") LOperand *external_pointer()
LCheckPrototypeMaps(LOperand *temp)
LCallNew(LOperand *constructor)
LIn(LOperand *key, LOperand *object)
LIsConstructCallAndBranch(LOperand *temp)
static HValue * cast(HValue *value)
LLoadNamedGeneric(LOperand *object)
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,"instance-of-known-global") Handle< JSFunction > function() const
HValue * hydrogen_value() const
LPushArgument(LOperand *value)
LStringCompareAndBranch(LOperand *left, LOperand *right)
bool HasReplacement() const
LBitNotI(LOperand *value)
LApplyArguments(LOperand *function, LOperand *receiver, LOperand *length, LOperand *elements)
LCallFunction(LOperand *function)
LStoreNamedGeneric(LOperand *object, LOperand *value)
LLoadKeyedGeneric(LOperand *obj, LOperand *key)
LStoreGlobalCell(LOperand *value, LOperand *temp)
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
LSmiUntag(LOperand *value, bool needs_check)
LLoadKeyedSpecializedArrayElement(LOperand *external_pointer, LOperand *key)
virtual void PrintDataTo(StringStream *stream)
LStoreKeyedSpecializedArrayElement(LOperand *external_pointer, LOperand *key, LOperand *value)
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)