28 #ifndef V8_MIPS_LITHIUM_MIPS_H_
29 #define V8_MIPS_LITHIUM_MIPS_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) \
100 V(GetCachedArrayIndex) \
104 V(HasCachedArrayIndexAndBranch) \
105 V(HasInstanceTypeAndBranch) \
108 V(InstanceOfKnownGlobal) \
110 V(Integer32ToDouble) \
113 V(IsConstructCallAndBranch) \
115 V(IsObjectAndBranch) \
116 V(IsStringAndBranch) \
118 V(IsUndetectableAndBranch) \
124 V(LoadExternalArrayPointer) \
125 V(LoadFunctionPrototype) \
127 V(LoadGlobalGeneric) \
128 V(LoadKeyedFastDoubleElement) \
129 V(LoadKeyedFastElement) \
130 V(LoadKeyedGeneric) \
131 V(LoadKeyedSpecializedArrayElement) \
133 V(LoadNamedFieldPolymorphic) \
134 V(LoadNamedGeneric) \
156 V(StoreContextSlot) \
158 V(StoreGlobalGeneric) \
159 V(StoreKeyedFastDoubleElement) \
160 V(StoreKeyedFastElement) \
161 V(StoreKeyedGeneric) \
162 V(StoreKeyedSpecializedArrayElement) \
164 V(StoreNamedGeneric) \
166 V(StringCharCodeAt) \
167 V(StringCharFromCode) \
168 V(StringCompareAndBranch) \
174 V(ToFastProperties) \
175 V(TransitionElementsKind) \
177 V(TypeofIsAndBranch) \
178 V(UnaryMathOperation) \
184 V(LoadFieldByIndex) \
189 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
190 virtual Opcode opcode() const { return LInstruction::k##type; } \
191 virtual void CompileToNative(LCodeGen* generator); \
192 virtual const char* Mnemonic() const { return mnemonic; } \
193 static L##type* cast(LInstruction* instr) { \
194 ASSERT(instr->Is##type()); \
195 return reinterpret_cast<L##type*>(instr); \
199 #define DECLARE_HYDROGEN_ACCESSOR(type) \
200 H##type* hydrogen() const { \
201 return H##type::cast(hydrogen_value()); \
205 class LInstruction:
public ZoneObject {
208 : environment_(
NULL),
209 hydrogen_value_(
NULL),
214 virtual const char*
Mnemonic()
const = 0;
221 #define DECLARE_OPCODE(type) k##type,
224 #undef DECLARE_OPCODE
230 #define DECLARE_PREDICATE(type) \
231 bool Is##type() const { return opcode() == k##type; }
233 #undef DECLARE_PREDICATE
237 virtual bool IsGap()
const {
return false; }
272 virtual int InputCount() = 0;
273 virtual LOperand* InputAt(
int i) = 0;
276 virtual int TempCount() = 0;
277 virtual LOperand* TempAt(
int i) = 0;
283 bool is_save_doubles_;
290 template<
int R,
int I,
int T>
291 class LTemplateInstruction:
public LInstruction {
305 virtual int InputCount() {
return I; }
306 virtual LOperand* InputAt(
int i) {
return inputs_[i]; }
308 virtual int TempCount() {
return T; }
309 virtual LOperand* TempAt(
int i) {
return temps_[i]; }
313 class LGap:
public LTemplateInstruction<0, 0, 0> {
324 virtual bool IsGap()
const {
return true; }
328 return reinterpret_cast<LGap*
>(instr);
345 if (parallel_moves_[pos] ==
NULL) {
348 return parallel_moves_[pos];
352 return parallel_moves_[pos];
361 class LInstructionGap:
public LGap {
369 class LGoto:
public LTemplateInstruction<0, 0, 0> {
384 class LLazyBailout:
public LTemplateInstruction<0, 0, 0> {
396 int gap_instructions_size_;
400 class LDeoptimize:
public LTemplateInstruction<0, 0, 0> {
406 class LLabel:
public LGap {
409 :
LGap(block), replacement_(
NULL) { }
428 class LParameter:
public LTemplateInstruction<1, 0, 0> {
434 class LCallStub:
public LTemplateInstruction<1, 0, 0> {
440 return hydrogen()->transcendental_type();
445 class LUnknownOSRValue:
public LTemplateInstruction<1, 0, 0> {
451 template<
int I,
int T>
452 class LControlInstruction:
public LTemplateInstruction<0, I, T> {
468 class LWrapReceiver:
public LTemplateInstruction<1, 2, 0> {
482 class LApplyArguments:
public LTemplateInstruction<1, 4, 0> {
503 class LAccessArgumentsAt:
public LTemplateInstruction<1, 3, 0> {
521 class LArgumentsLength:
public LTemplateInstruction<1, 1, 0> {
533 class LArgumentsElements:
public LTemplateInstruction<1, 0, 0> {
540 class LModI: public LTemplateInstruction<1, 2, 3> {
576 class
LDivI: public LTemplateInstruction<1, 2, 0> {
591 class
LMulI: public LTemplateInstruction<1, 2, 1> {
623 return hydrogen()->GetInputRepresentation().IsDouble();
630 class LUnaryMathOperation:
public LTemplateInstruction<1, 1, 1> {
648 class LCmpObjectEqAndBranch:
public LControlInstruction<2, 0> {
659 "cmp-object-eq-and-branch")
673 "cmp-constant-eq-and-branch")
696 class LIsObjectAndBranch:
public LControlInstruction<1, 1> {
756 "is-undetectable-and-branch")
774 "string-compare-and-branch")
777 Token::
Value op()
const {
return hydrogen()->token(); }
783 class LHasInstanceTypeAndBranch:
public LControlInstruction<1, 0> {
792 "has-instance-type-and-branch")
821 "has-cached-array-index-and-branch")
839 "class-of-test-and-branch")
846 class
LCmpT: public LTemplateInstruction<1, 2, 0> {
863 class LInstanceOf:
public LTemplateInstruction<1, 2, 0> {
877 class LInstanceOfKnownGlobal:
public LTemplateInstruction<1, 1, 1> {
888 "instance-of-known-global")
893 return lazy_deopt_env_;
896 lazy_deopt_env_ = env;
904 class LBoundsCheck:
public LTemplateInstruction<0, 2, 0> {
919 class
LBitI: public LTemplateInstruction<1, 2, 0> {
936 class
LShiftI: public LTemplateInstruction<1, 2, 0> {
939 : op_(op), can_deopt_(can_deopt) {
957 class
LSubI: public LTemplateInstruction<1, 2, 0> {
972 class
LConstantI: public LTemplateInstruction<1, 0, 0> {
977 int32_t value()
const {
return hydrogen()->Integer32Value(); }
981 class LConstantD:
public LTemplateInstruction<1, 0, 0> {
986 double value()
const {
return hydrogen()->DoubleValue(); }
990 class LConstantT:
public LTemplateInstruction<1, 0, 0> {
999 class LBranch:
public LControlInstruction<1, 0> {
1031 return hydrogen()->FirstSuccessor()->block_id();
1034 return hydrogen()->SecondSuccessor()->block_id();
1039 class LJSArrayLength:
public LTemplateInstruction<1, 1, 0> {
1061 "fixed-array-base-length")
1078 class LElementsKind:
public LTemplateInstruction<1, 1, 0> {
1091 class
LValueOf: public LTemplateInstruction<1, 1, 1> {
1106 class
LDateField: public LTemplateInstruction<1, 1, 1> {
1125 class
LThrow: public LTemplateInstruction<0, 1, 0> {
1137 class LBitNotI:
public LTemplateInstruction<1, 1, 0> {
1149 class LAddI:
public LTemplateInstruction<1, 2, 0> {
1164 class
LMathMinMax: public LTemplateInstruction<1, 2, 0> {
1179 class
LPower: public LTemplateInstruction<1, 2, 0> {
1194 class
LRandom: public LTemplateInstruction<1, 1, 0> {
1207 class
LArithmeticD: public LTemplateInstruction<1, 2, 0> {
1221 virtual const char*
Mnemonic()
const;
1228 class LArithmeticT:
public LTemplateInstruction<1, 2, 0> {
1242 virtual const char*
Mnemonic()
const;
1249 class LReturn:
public LTemplateInstruction<0, 1, 0> {
1261 class LLoadNamedField:
public LTemplateInstruction<1, 1, 0> {
1302 class LLoadFunctionPrototype:
public LTemplateInstruction<1, 1, 0> {
1327 class LLoadExternalArrayPointer:
public LTemplateInstruction<1, 1, 0> {
1336 "load-external-array-pointer")
1340 class LLoadKeyedFastElement:
public LTemplateInstruction<1, 2, 0> {
1353 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1357 class LLoadKeyedFastDoubleElement:
public LTemplateInstruction<1, 2, 0> {
1368 "load-keyed-fast-double-element")
1371 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1375 class LLoadKeyedSpecializedArrayElement:
public LTemplateInstruction<1, 2, 0> {
1379 inputs_[0] = external_pointer;
1387 "load-keyed-specialized-array-element")
1390 ElementsKind elements_kind()
const {
1391 return hydrogen()->elements_kind();
1397 class LLoadKeyedGeneric:
public LTemplateInstruction<1, 2, 0> {
1411 class LLoadGlobalCell:
public LTemplateInstruction<1, 0, 0> {
1418 class LLoadGlobalGeneric: public LTemplateInstruction<1, 1, 0> {
1434 class LStoreGlobalCell:
public LTemplateInstruction<0, 1, 1> {
1468 class LLoadContextSlot:
public LTemplateInstruction<1, 1, 0> {
1479 int slot_index() {
return hydrogen()->slot_index(); }
1485 class LStoreContextSlot:
public LTemplateInstruction<0, 2, 0> {
1498 int slot_index() {
return hydrogen()->slot_index(); }
1504 class LPushArgument:
public LTemplateInstruction<0, 1, 0> {
1516 class LDrop:
public LTemplateInstruction<0, 0, 0> {
1518 explicit LDrop(
int count) : count_(count) { }
1536 class
LContext: public LTemplateInstruction<1, 0, 0> {
1542 class LOuterContext:
public LTemplateInstruction<1, 1, 0> {
1554 class LDeclareGlobals:
public LTemplateInstruction<0, 0, 0> {
1561 class LGlobalObject: public LTemplateInstruction<1, 1, 0> {
1573 class LGlobalReceiver:
public LTemplateInstruction<1, 1, 0> {
1585 class LCallConstantFunction:
public LTemplateInstruction<1, 0, 0> {
1593 int arity()
const {
return hydrogen()->argument_count() - 1; }
1597 class LInvokeFunction:
public LTemplateInstruction<1, 1, 0> {
1610 int arity()
const {
return hydrogen()->argument_count() - 1; }
1615 class LCallKeyed:
public LTemplateInstruction<1, 1, 0> {
1628 int arity()
const {
return hydrogen()->argument_count() - 1; }
1633 class LCallNamed:
public LTemplateInstruction<1, 0, 0> {
1641 int arity()
const {
return hydrogen()->argument_count() - 1; }
1645 class LCallFunction:
public LTemplateInstruction<1, 1, 0> {
1656 int arity()
const {
return hydrogen()->argument_count() - 1; }
1660 class LCallGlobal:
public LTemplateInstruction<1, 0, 0> {
1668 int arity()
const {
return hydrogen()->argument_count() - 1; }
1672 class LCallKnownGlobal:
public LTemplateInstruction<1, 0, 0> {
1680 int arity()
const {
return hydrogen()->argument_count() - 1; }
1684 class LCallNew:
public LTemplateInstruction<1, 1, 0> {
1697 int arity()
const {
return hydrogen()->argument_count() - 1; }
1701 class LCallRuntime:
public LTemplateInstruction<1, 0, 0> {
1707 int arity()
const {
return hydrogen()->argument_count(); }
1711 class LInteger32ToDouble:
public LTemplateInstruction<1, 1, 0> {
1723 class LUint32ToDouble:
public LTemplateInstruction<1, 1, 0> {
1735 class LNumberTagI:
public LTemplateInstruction<1, 1, 0> {
1747 class LNumberTagU:
public LTemplateInstruction<1, 1, 0> {
1759 class LNumberTagD:
public LTemplateInstruction<1, 1, 2> {
1776 class LDoubleToI:
public LTemplateInstruction<1, 1, 2> {
1791 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1796 class LTaggedToI:
public LTemplateInstruction<1, 1, 3> {
1816 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1820 class LSmiTag:
public LTemplateInstruction<1, 1, 0> {
1832 class LNumberUntagD:
public LTemplateInstruction<1, 1, 0> {
1845 class
LSmiUntag: public LTemplateInstruction<1, 1, 0> {
1848 : needs_check_(needs_check) {
1881 int offset() {
return hydrogen()->offset(); }
1886 class LStoreNamedGeneric:
public LTemplateInstruction<0, 2, 0> {
1906 class LStoreKeyedFastElement:
public LTemplateInstruction<0, 3, 0> {
1919 "store-keyed-fast-element")
1924 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1928 class LStoreKeyedFastDoubleElement:
public LTemplateInstruction<0, 3, 0> {
1943 "store-keyed-fast-double-element")
1948 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1954 class LStoreKeyedGeneric:
public LTemplateInstruction<0, 3, 0> {
1974 class LStoreKeyedSpecializedArrayElement:
public LTemplateInstruction<0, 3, 0> {
1979 inputs_[0] = external_pointer;
1989 "store-keyed-specialized-array-element")
1992 ElementsKind elements_kind()
const {
return hydrogen()->elements_kind(); }
1997 class LTransitionElementsKind:
public LTemplateInstruction<1, 1, 2> {
2003 temps_[0] = new_map_temp;
2012 "transition-elements-kind")
2017 Handle<
Map> original_map() {
return hydrogen()->original_map(); }
2022 class LStringAdd:
public LTemplateInstruction<1, 2, 0> {
2105 class
LCheckMaps: public LTemplateInstruction<0, 1, 0> {
2136 class LCheckSmi:
public LTemplateInstruction<0, 1, 0> {
2148 class LCheckNonSmi:
public LTemplateInstruction<0, 1, 0> {
2160 class LClampDToUint8:
public LTemplateInstruction<1, 1, 1> {
2174 class LClampIToUint8:
public LTemplateInstruction<1, 1, 0> {
2186 class LClampTToUint8:
public LTemplateInstruction<1, 1, 1> {
2200 class LAllocateObject:
public LTemplateInstruction<1, 0, 2> {
2215 class
LFastLiteral: public LTemplateInstruction<1, 0, 0> {
2252 class LToFastProperties:
public LTemplateInstruction<1, 1, 0> {
2265 class
LTypeof: public LTemplateInstruction<1, 1, 0> {
2277 class LTypeofIsAndBranch:
public LControlInstruction<1, 0> {
2294 class LIsConstructCallAndBranch:
public LControlInstruction<0, 1> {
2303 "is-construct-call-and-branch")
2307 class LDeleteProperty:
public LTemplateInstruction<1, 2, 0> {
2321 class LOsrEntry:
public LTemplateInstruction<0, 0, 0> {
2327 LOperand** SpilledRegisterArray() {
return register_spills_; }
2330 void MarkSpilledRegister(
int allocation_index,
LOperand* spill_operand);
2331 void MarkSpilledDoubleRegister(
int allocation_index,
2344 class LStackCheck:
public LTemplateInstruction<0, 0, 0> {
2349 Label* done_label() {
return &done_label_; }
2356 class LIn:
public LTemplateInstruction<1, 2, 0> {
2370 class LForInPrepareMap:
public LTemplateInstruction<1, 1, 0> {
2382 class LForInCacheArray:
public LTemplateInstruction<1, 1, 0> {
2398 class LCheckMapValue:
public LTemplateInstruction<0, 2, 0> {
2412 class LLoadFieldByIndex:
public LTemplateInstruction<1, 2, 0> {
2426 class LChunkBuilder;
2427 class LPlatformChunk:
public LChunk {
2430 :
LChunk(info, graph) { }
2432 int GetNextSpillIndex(
bool is_double);
2433 LOperand* GetNextSpillSlot(
bool is_double);
2443 zone_(graph->zone()),
2445 current_instruction_(
NULL),
2446 current_block_(
NULL),
2449 allocator_(allocator),
2450 position_(RelocInfo::kNoPosition),
2451 instruction_pending_deoptimization_environment_(
NULL),
2458 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2470 LPlatformChunk* chunk()
const {
return chunk_; }
2471 CompilationInfo* info()
const {
return info_; }
2472 HGraph* graph()
const {
return graph_; }
2473 Zone* zone()
const {
return zone_; }
2475 bool is_unused()
const {
return status_ == UNUSED; }
2476 bool is_building()
const {
return status_ == BUILDING; }
2477 bool is_done()
const {
return status_ ==
DONE; }
2478 bool is_aborted()
const {
return status_ == ABORTED; }
2480 void Abort(
const char* reason);
2483 LUnallocated* ToUnallocated(Register reg);
2488 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2516 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2529 template<
int I,
int T>
2530 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2532 template<
int I,
int T>
2533 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2534 template<
int I,
int T>
2535 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2537 template<
int I,
int T>
2538 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2539 template<
int I,
int T>
2540 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2542 template<
int I,
int T>
2543 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2548 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2555 HInstruction* hinstr,
2556 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2558 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2559 int* argument_index_accumulator);
2561 void VisitInstruction(HInstruction* current);
2563 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2567 HArithmeticBinaryOperation* instr);
2569 HArithmeticBinaryOperation* instr);
2571 LPlatformChunk* chunk_;
2572 CompilationInfo* info_;
2573 HGraph*
const graph_;
2576 HInstruction* current_instruction_;
2577 HBasicBlock* current_block_;
2578 HBasicBlock* next_block_;
2579 int argument_count_;
2580 LAllocator* allocator_;
2582 LInstruction* instruction_pending_deoptimization_environment_;
2583 BailoutId pending_deoptimization_ast_id_;
2588 #undef DECLARE_HYDROGEN_ACCESSOR
2589 #undef DECLARE_CONCRETE_INSTRUCTION
2593 #endif // V8_MIPS_LITHIUM_MIPS_H_
LCmpT(LOperand *left, LOperand *right)
LStringCharCodeAt(LOperand *string, LOperand *index)
LDateField(LOperand *date, LOperand *temp, Smi *index)
LArgumentsLength(LOperand *elements)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
LLoadContextSlot(LOperand *context)
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)
LCallKeyed(LOperand *key)
void set_pointer_map(LPointerMap *p)
bool IsMarkedAsCall() const
LOperand * global_object()
LClassOfTestAndBranch(LOperand *value, LOperand *temp)
LStoreKeyedFastDoubleElement(LOperand *elements, LOperand *key, LOperand *value)
void set_environment(LEnvironment *env)
void set_result(LOperand *operand)
LCheckPrototypeMaps(LOperand *temp, LOperand *temp2)
int false_block_id() const
virtual void PrintOutputOperandTo(StringStream *stream)
EmbeddedContainer< LOperand *, T > temps_
uint32_t additional_index() const
LWrapReceiver(LOperand *receiver, LOperand *function)
#define DECLARE_OPCODE(type)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
LNumberTagI(LOperand *value)
LInstructionGap(HBasicBlock *block)
LClampTToUint8(LOperand *unclamped, LOperand *temp)
LLoadGlobalGeneric(LOperand *global_object)
LOperand * new_map_temp()
LCheckSmi(LOperand *value)
LLoadFunctionPrototype(LOperand *function)
LStringLength(LOperand *string)
LIsObjectAndBranch(LOperand *value, LOperand *temp)
LUnaryMathOperation(LOperand *value, LOperand *temp)
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)
LOuterContext(LOperand *context)
static const int kNumAllocatableRegisters
Handle< Map > transition() const
LEnvironment * environment() const
LStoreContextSlot(LOperand *context, 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)
LCheckInstanceType(LOperand *value)
virtual void PrintDataTo(StringStream *stream)
int gap_instructions_size()
LStoreKeyedFastElement(LOperand *object, LOperand *key, LOperand *value)
LOperand * external_pointer()
friend class InputIterator
#define DECLARE_PREDICATE(type)
LInvokeFunction(LOperand *function)
LHasInstanceTypeAndBranch(LOperand *value)
StrictModeFlag strict_mode_flag()
LNumberUntagD(LOperand *value)
LTaggedToI(LOperand *value, LOperand *temp, LOperand *temp2, LOperand *temp3)
LNumberTagU(LOperand *value)
LForInPrepareMap(LOperand *object)
void set_hydrogen_value(HValue *value)
LLoadNamedField(LOperand *object)
#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
LPower(LOperand *left, LOperand *right)
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
virtual bool HasResult() const =0
Handle< JSObject > holder() const
DwVfpRegister DoubleRegister
LAllocateObject(LOperand *temp, LOperand *temp2)
virtual Opcode opcode() const =0
Handle< Map > map() const
LUint32ToDouble(LOperand *value)
LGlobalObject(LOperand *context)
EmbeddedContainer< LOperand *, R > results_
LLabel * replacement() const
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)
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)
LOperand * global_object()
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
LStringCharFromCode(LOperand *char_code)
HBasicBlock * block() const
LSubI(LOperand *left, LOperand *right)
TranscendentalCache::Type transcendental_type()
LMulI(LOperand *left, LOperand *right, LOperand *temp)
virtual void PrintTo(StringStream *stream)
LDivI(LOperand *left, LOperand *right)
activate correct semantics for inheriting readonliness false
LDeleteProperty(LOperand *object, LOperand *key)
virtual void PrintDataTo(StringStream *stream)
#define T(name, string, precedence)
LToFastProperties(LOperand *value)
LInstanceOf(LOperand *left, LOperand *right)
LCmpMapAndBranch(LOperand *value, LOperand *temp)
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
LLoadKeyedGeneric(LOperand *object, LOperand *key)
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
#define DECLARE_HYDROGEN_ACCESSOR(type)
LNumberTagD(LOperand *value, LOperand *temp, LOperand *temp2)
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastDoubleElement,"load-keyed-fast-double-element") uint32_t additional_index() const
LClampDToUint8(LOperand *unclamped, LOperand *temp)
virtual bool IsGap() const
LMathMinMax(LOperand *left, LOperand *right)
static const int kNumAllocatableRegisters
LStringAdd(LOperand *left, LOperand *right)
LLoadNamedFieldPolymorphic(LOperand *object)
LCheckMaps(LOperand *value)
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
DECLARE_CONCRETE_INSTRUCTION(LoadKeyedSpecializedArrayElement,"load-keyed-specialized-array-element") ElementsKind elements_kind() const
virtual void PrintDataTo(StringStream *stream)
LMapEnumLength(LOperand *value)
LEnvironment * GetDeferredLazyDeoptimizationEnvironment()
STATIC_ASSERT(R==0||R==1)
void set_replacement(LLabel *label)
StrictModeFlag strict_mode_flag()
LStoreKeyedGeneric(LOperand *obj, LOperand *key, LOperand *value)
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)
LInteger32ToDouble(LOperand *value)
DECLARE_CONCRETE_INSTRUCTION(StoreKeyedSpecializedArrayElement,"store-keyed-specialized-array-element") ElementsKind elements_kind() const
LCallNew(LOperand *constructor)
bool NeedsCanonicalization()
LIn(LOperand *key, LOperand *object)
LIsConstructCallAndBranch(LOperand *temp)
static HValue * cast(HValue *value)
LModI(LOperand *left, LOperand *right, LOperand *temp, LOperand *temp2, LOperand *temp3)
LOperand * global_object()
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
LValueOf(LOperand *value, LOperand *temp)
LBitNotI(LOperand *value)
LApplyArguments(LOperand *function, LOperand *receiver, LOperand *length, LOperand *elements)
LDoubleToI(LOperand *value, LOperand *temp, LOperand *temp2)
LModI(LOperand *left, LOperand *right)
LCallFunction(LOperand *function)
LStoreNamedGeneric(LOperand *object, LOperand *value)
LIsNilAndBranch(LOperand *value)
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)