28 #ifndef V8_ARM_LITHIUM_ARM_H_
29 #define V8_ARM_LITHIUM_ARM_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) \
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()); \
210 : environment_(
NULL),
211 hydrogen_value_(
NULL),
216 virtual const char*
Mnemonic()
const = 0;
223 #define DECLARE_OPCODE(type) k##type,
226 #undef DECLARE_OPCODE
232 #define DECLARE_PREDICATE(type) \
233 bool Is##type() const { return opcode() == k##type; }
235 #undef DECLARE_PREDICATE
239 virtual bool IsGap()
const {
return false; }
274 virtual int InputCount() = 0;
275 virtual LOperand* InputAt(
int i) = 0;
278 virtual int TempCount() = 0;
279 virtual LOperand* TempAt(
int i) = 0;
291 template<
int R,
int I,
int T>
306 virtual int InputCount() {
return I; }
309 virtual int TempCount() {
return T; }
310 virtual LOperand* TempAt(
int i) {
return temps_[i]; }
325 virtual bool IsGap()
const {
return true; }
329 return reinterpret_cast<LGap*
>(instr);
346 if (parallel_moves_[pos] ==
NULL) {
349 return parallel_moves_[pos];
353 return parallel_moves_[pos];
397 int gap_instructions_size_;
410 :
LGap(block), replacement_(
NULL) { }
441 return hydrogen()->transcendental_type();
452 template<
int I,
int T>
611 class
LMulI: public LTemplateInstruction<1, 2, 1> {
643 return hydrogen()->GetInputRepresentation().IsDouble();
679 "cmp-object-eq-and-branch")
693 "cmp-constant-eq-and-branch")
776 "is-undetectable-and-branch")
794 "string-compare-and-branch")
797 Token::
Value op()
const {
return hydrogen()->token(); }
812 "has-instance-type-and-branch")
841 "has-cached-array-index-and-branch")
859 "class-of-test-and-branch")
866 class
LCmpT: public LTemplateInstruction<1, 2, 0> {
908 "instance-of-known-global")
913 return lazy_deopt_env_;
916 lazy_deopt_env_ = env;
939 class
LBitI: public LTemplateInstruction<1, 2, 0> {
956 class
LShiftI: public LTemplateInstruction<1, 2, 0> {
959 : op_(op), can_deopt_(can_deopt) {
977 class
LSubI: public LTemplateInstruction<1, 2, 0> {
997 int32_t value()
const {
return hydrogen()->Integer32Value(); }
1006 double value()
const {
return hydrogen()->DoubleValue(); }
1051 return hydrogen()->FirstSuccessor()->block_id();
1054 return hydrogen()->SecondSuccessor()->block_id();
1081 "fixed-array-base-length")
1145 class
LThrow: public LTemplateInstruction<0, 1, 0> {
1169 class LAddI:
public LTemplateInstruction<1, 2, 0> {
1199 class
LPower: public LTemplateInstruction<1, 2, 0> {
1214 class
LRandom: public LTemplateInstruction<1, 1, 0> {
1241 virtual const char*
Mnemonic()
const;
1262 virtual const char*
Mnemonic()
const;
1269 class LReturn:
public LTemplateInstruction<0, 1, 0> {
1356 "load-external-array-pointer")
1373 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1388 "load-keyed-fast-double-element")
1391 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1398 inputs_[0] = external_pointer;
1406 "load-keyed-specialized-array-element")
1409 ElementsKind elements_kind()
const {
1410 return hydrogen()->elements_kind();
1498 int slot_index() {
return hydrogen()->slot_index(); }
1517 int slot_index() {
return hydrogen()->slot_index(); }
1535 class LDrop:
public LTemplateInstruction<0, 0, 0> {
1537 explicit LDrop(
int count) : count_(count) { }
1612 int arity()
const {
return hydrogen()->argument_count() - 1; }
1629 int arity()
const {
return hydrogen()->argument_count() - 1; }
1647 int arity()
const {
return hydrogen()->argument_count() - 1; }
1660 int arity()
const {
return hydrogen()->argument_count() - 1; }
1675 int arity()
const {
return hydrogen()->argument_count() - 1; }
1687 int arity()
const {
return hydrogen()->argument_count() - 1; }
1699 int arity()
const {
return hydrogen()->argument_count() - 1; }
1716 int arity()
const {
return hydrogen()->argument_count() - 1; }
1726 int arity()
const {
return hydrogen()->argument_count(); }
1810 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1835 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
1839 class LSmiTag:
public LTemplateInstruction<1, 1, 0> {
1867 : needs_check_(needs_check) {
1900 int offset() {
return hydrogen()->offset(); }
1938 "store-keyed-fast-element")
1943 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1962 "store-keyed-fast-double-element")
1967 uint32_t additional_index()
const {
return hydrogen()->index_offset(); }
1998 inputs_[0] = external_pointer;
2008 "store-keyed-specialized-array-element")
2011 ElementsKind elements_kind()
const {
return hydrogen()->elements_kind(); }
2022 temps_[0] = new_map_temp;
2031 "transition-elements-kind")
2036 Handle<
Map> original_map() {
return hydrogen()->original_map(); }
2284 class
LTypeof: public LTemplateInstruction<1, 1, 0> {
2322 "is-construct-call-and-branch")
2346 LOperand** SpilledRegisterArray() {
return register_spills_; }
2349 void MarkSpilledRegister(
int allocation_index,
LOperand* spill_operand);
2350 void MarkSpilledDoubleRegister(
int allocation_index,
2368 Label* done_label() {
return &done_label_; }
2375 class LIn:
public LTemplateInstruction<1, 2, 0> {
2445 class LChunkBuilder;
2449 :
LChunk(info, graph) { }
2451 int GetNextSpillIndex(
bool is_double);
2452 LOperand* GetNextSpillSlot(
bool is_double);
2462 zone_(graph->zone()),
2464 current_instruction_(
NULL),
2465 current_block_(
NULL),
2468 allocator_(allocator),
2469 position_(RelocInfo::kNoPosition),
2470 instruction_pending_deoptimization_environment_(
NULL),
2477 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2481 static bool HasMagicNumberForDivisor(
int32_t divisor);
2482 static HValue* SimplifiedDividendForMathFloorOfDiv(HValue* val);
2483 static HValue* SimplifiedDivisorForMathFloorOfDiv(HValue* val);
2493 LPlatformChunk* chunk()
const {
return chunk_; }
2494 CompilationInfo* info()
const {
return info_; }
2495 HGraph* graph()
const {
return graph_; }
2496 Zone* zone()
const {
return zone_; }
2498 bool is_unused()
const {
return status_ == UNUSED; }
2499 bool is_building()
const {
return status_ == BUILDING; }
2500 bool is_done()
const {
return status_ ==
DONE; }
2501 bool is_aborted()
const {
return status_ == ABORTED; }
2503 void Abort(
const char* reason);
2506 LUnallocated* ToUnallocated(Register reg);
2511 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2539 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2552 template<
int I,
int T>
2553 LInstruction* Define(LTemplateInstruction<1, I, T>* instr,
2555 template<
int I,
int T>
2556 LInstruction* DefineAsRegister(LTemplateInstruction<1, I, T>* instr);
2557 template<
int I,
int T>
2558 LInstruction* DefineAsSpilled(LTemplateInstruction<1, I, T>* instr,
2560 template<
int I,
int T>
2561 LInstruction* DefineSameAsFirst(LTemplateInstruction<1, I, T>* instr);
2562 template<
int I,
int T>
2563 LInstruction* DefineFixed(LTemplateInstruction<1, I, T>* instr,
2565 template<
int I,
int T>
2566 LInstruction* DefineFixedDouble(LTemplateInstruction<1, I, T>* instr,
2571 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2578 HInstruction* hinstr,
2579 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2581 LEnvironment* CreateEnvironment(HEnvironment* hydrogen_env,
2582 int* argument_index_accumulator);
2584 void VisitInstruction(HInstruction* current);
2586 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2589 HArithmeticBinaryOperation* instr);
2591 HArithmeticBinaryOperation* instr);
2593 LPlatformChunk* chunk_;
2594 CompilationInfo* info_;
2595 HGraph*
const graph_;
2598 HInstruction* current_instruction_;
2599 HBasicBlock* current_block_;
2600 HBasicBlock* next_block_;
2601 int argument_count_;
2602 LAllocator* allocator_;
2604 LInstruction* instruction_pending_deoptimization_environment_;
2605 BailoutId pending_deoptimization_ast_id_;
2610 #undef DECLARE_HYDROGEN_ACCESSOR
2611 #undef DECLARE_CONCRETE_INSTRUCTION
2615 #endif // V8_ARM_LITHIUM_ARM_H_
LCmpT(LOperand *left, LOperand *right)
LStringCharCodeAt(LOperand *string, LOperand *index)
LDateField(LOperand *date, LOperand *temp, Smi *index)
LArgumentsLength(LOperand *elements)
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)
#define DECLARE_OPCODE(type)
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)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
LNumberTagI(LOperand *value)
LInstructionGap(HBasicBlock *block)
LClampTToUint8(LOperand *unclamped, LOperand *temp)
LLoadGlobalGeneric(LOperand *global_object)
Handle< JSFunction > target() const
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)
Handle< String > name() const
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 DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
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
LInvokeFunction(LOperand *function)
#define DECLARE_HYDROGEN_ACCESSOR(type)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
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)
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
LNumberTagD(LOperand *value, LOperand *temp, LOperand *temp2)
#define DECLARE_PREDICATE(type)
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)
Handle< String > name() const
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)