5 #ifndef V8_ARM_LITHIUM_ARM_H_
6 #define V8_ARM_LITHIUM_ARM_H_
20 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
21 V(AccessArgumentsAt) \
24 V(AllocateBlockContext) \
26 V(ArgumentsElements) \
34 V(CallWithDescriptor) \
40 V(CheckInstanceType) \
49 V(ClassOfTestAndBranch) \
50 V(CompareMinusZeroAndBranch) \
51 V(CompareNumericAndBranch) \
52 V(CmpObjectEqAndBranch) \
76 V(FlooringDivByConstI) \
77 V(FlooringDivByPowerOf2I) \
82 V(GetCachedArrayIndex) \
84 V(HasCachedArrayIndexAndBranch) \
85 V(HasInstanceTypeAndBranch) \
86 V(InnerAllocatedObject) \
88 V(InstanceOfKnownGlobal) \
90 V(Integer32ToDouble) \
92 V(IsConstructCallAndBranch) \
93 V(IsObjectAndBranch) \
94 V(IsStringAndBranch) \
96 V(IsUndetectableAndBranch) \
101 V(LoadFieldByIndex) \
102 V(LoadFunctionPrototype) \
104 V(LoadGlobalGeneric) \
106 V(LoadKeyedGeneric) \
108 V(LoadNamedGeneric) \
136 V(SeqStringGetChar) \
137 V(SeqStringSetChar) \
143 V(StoreContextSlot) \
144 V(StoreFrameContext) \
147 V(StoreKeyedGeneric) \
149 V(StoreNamedGeneric) \
151 V(StringCharCodeAt) \
152 V(StringCharFromCode) \
153 V(StringCompareAndBranch) \
157 V(TailCallThroughMegamorphicCache) \
159 V(ToFastProperties) \
160 V(TransitionElementsKind) \
161 V(TrapAllocationMemento) \
163 V(TypeofIsAndBranch) \
169 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
170 virtual Opcode opcode() const FINAL OVERRIDE { \
171 return LInstruction::k##type; \
173 virtual void CompileToNative(LCodeGen* generator) FINAL OVERRIDE; \
174 virtual const char* Mnemonic() const FINAL OVERRIDE { \
177 static L##type* cast(LInstruction* instr) { \
178 DCHECK(instr->Is##type()); \
179 return reinterpret_cast<L##type*>(instr); \
183 #define DECLARE_HYDROGEN_ACCESSOR(type) \
184 H##type* hydrogen() const { \
185 return H##type::cast(hydrogen_value()); \
201 virtual void PrintTo(StringStream* stream);
207 #define DECLARE_OPCODE(type) k##type,
210 #undef DECLARE_OPCODE
216 #define DECLARE_PREDICATE(type) \
217 bool Is##type() const { return opcode() == k##type; }
219 #undef DECLARE_PREDICATE
223 virtual bool IsGap()
const {
return false; }
308 template<
int R,
int I,
int T>
339 return reinterpret_cast<LGap*
>(instr);
377 return !IsRedundant();
384 class LGoto
FINAL :
public LTemplateInstruction<0, 0, 0> {
386 explicit LGoto(HBasicBlock* block) : block_(block) { }
390 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
391 virtual
bool IsControl() const
OVERRIDE {
return true; }
393 int block_id()
const {
return block_->block_id(); }
406 void set_gap_instructions_size(
int gap_instructions_size) {
407 gap_instructions_size_ = gap_instructions_size;
423 class LDummyUse
FINAL :
public LTemplateInstruction<1, 1, 0> {
432 class LDeoptimize
FINAL :
public LTemplateInstruction<0, 0, 0> {
443 :
LGap(block), replacement_(
NULL) { }
450 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
452 int block_id()
const {
return block()->block_id(); }
473 class LCallStub
FINAL :
public LTemplateInstruction<1, 1, 0> {
476 inputs_[0] = context;
486 class LTailCallThroughMegamorphicCache
FINAL
492 inputs_[0] = context;
493 inputs_[1] = receiver;
502 "tail-call-through-megamorphic-cache")
515 template<
int I,
int T>
533 if (true_label_ ==
NULL) {
539 if (false_label_ ==
NULL) {
562 inputs_[0] = receiver;
563 inputs_[1] =
function;
574 class LApplyArguments
FINAL :
public LTemplateInstruction<1, 4, 0> {
580 inputs_[0] =
function;
581 inputs_[1] = receiver;
583 inputs_[3] = elements;
595 class LAccessArgumentsAt
FINAL :
public LTemplateInstruction<1, 3, 0> {
598 inputs_[0] = arguments;
616 inputs_[0] = elements;
625 class LArgumentsElements
FINAL :
public LTemplateInstruction<1, 0, 0> {
632 class LModByPowerOf2I
FINAL : public LTemplateInstruction<1, 1, 0> {
635 inputs_[0] = dividend;
653 inputs_[0] = dividend;
690 inputs_[0] = dividend;
708 inputs_[0] = dividend;
726 inputs_[0] = dividend;
727 inputs_[1] = divisor;
743 inputs_[0] = dividend;
751 "flooring-div-by-power-of-2-i")
762 inputs_[0] = dividend;
782 inputs_[0] = dividend;
783 inputs_[1] = divisor;
817 inputs_[1] = multiplier;
818 inputs_[2] = multiplicand;
830 class LMultiplySubD
FINAL :
public LTemplateInstruction<1, 3, 0> {
834 inputs_[0] = minuend;
835 inputs_[1] = multiplier;
836 inputs_[2] = multiplicand;
847 class LDebugBreak
FINAL :
public LTemplateInstruction<0, 0, 0> {
853 class LCompareNumericAndBranch
FINAL :
public LControlInstruction<2, 0> {
864 "compare-numeric-and-branch")
867 Token::
Value op()
const {
return hydrogen()->token(); }
868 bool is_double()
const {
869 return hydrogen()->representation().IsDouble();
872 virtual void PrintDataTo(StringStream* stream)
OVERRIDE;
876 class LMathFloor
FINAL :
public LTemplateInstruction<1, 1, 0> {
914 class LMathAbs
FINAL :
public LTemplateInstruction<1, 2, 0> {
917 inputs_[1] = context;
941 class LMathClz32
FINAL :
public LTemplateInstruction<1, 1, 0> {
953 class LMathExp
FINAL :
public LTemplateInstruction<1, 1, 3> {
962 temps_[2] = double_temp;
963 ExternalReference::InitializeMathExpData();
975 class LMathSqrt
FINAL :
public LTemplateInstruction<1, 1, 0> {
987 class LMathPowHalf
FINAL :
public LTemplateInstruction<1, 1, 0> {
999 class LCmpObjectEqAndBranch
FINAL :
public LControlInstruction<2, 0> {
1017 inputs_[0] = object;
1038 "cmp-minus-zero-and-branch")
1056 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1073 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1088 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1103 "is-undetectable-and-branch")
1106 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1113 inputs_[0] = context;
1123 "string-compare-and-branch")
1126 Token::
Value op()
const {
return hydrogen()->token(); }
1128 virtual void PrintDataTo(StringStream* stream)
OVERRIDE;
1132 class LHasInstanceTypeAndBranch
FINAL :
public LControlInstruction<1, 0> {
1141 "has-instance-type-and-branch")
1144 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1161 class LHasCachedArrayIndexAndBranch
FINAL
1171 "has-cached-array-index-and-branch")
1174 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1189 "class-of-test-and-branch")
1192 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1199 inputs_[0] = context;
1215 class LInstanceOf
FINAL :
public LTemplateInstruction<1, 3, 0> {
1218 inputs_[0] = context;
1231 class LInstanceOfKnownGlobal
FINAL :
public LTemplateInstruction<1, 2, 1> {
1234 inputs_[0] = context;
1244 "instance-of-known-global")
1249 return lazy_deopt_env_;
1253 lazy_deopt_env_ = env;
1265 inputs_[1] = length;
1296 : op_(op), can_deopt_(can_deopt) {
1349 int32_t value()
const {
return hydrogen()->Integer32Value(); }
1353 class LConstantS
FINAL :
public LTemplateInstruction<1, 0, 0> {
1362 class LConstantD
FINAL :
public LTemplateInstruction<1, 0, 0> {
1367 double value()
const {
return hydrogen()->DoubleValue(); }
1371 class LConstantE
FINAL :
public LTemplateInstruction<1, 0, 0> {
1376 ExternalReference value()
const {
1377 return hydrogen()->ExternalReferenceValue();
1382 class LConstantT
FINAL :
public LTemplateInstruction<1, 0, 0> {
1388 return hydrogen()->handle(isolate);
1393 class LBranch
FINAL :
public LControlInstruction<1, 0> {
1404 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1425 class LMapEnumLength
FINAL :
public LTemplateInstruction<1, 1, 0> {
1437 class LDateField
FINAL :
public LTemplateInstruction<1, 1, 1> {
1459 inputs_[0] = string;
1477 inputs_[0] = context;
1478 inputs_[1] = string;
1550 return LInstruction::kArithmeticD;
1567 inputs_[0] = context;
1578 return LInstruction::kArithmeticT;
1592 inputs_[1] = context;
1593 inputs_[2] = parameter_count;
1599 return parameter_count()->IsConstantOperand();
1602 DCHECK(has_constant_parameter_count());
1603 return LConstantOperand::cast(parameter_count());
1611 class LLoadNamedField
FINAL :
public LTemplateInstruction<1, 1, 0> {
1614 inputs_[0] = object;
1627 inputs_[0] = context;
1628 inputs_[1] = object;
1643 class LLoadFunctionPrototype
FINAL :
public LTemplateInstruction<1, 1, 0> {
1646 inputs_[0] =
function;
1661 Heap::RootListIndex index()
const {
return hydrogen()->index(); }
1665 class LLoadKeyed
FINAL :
public LTemplateInstruction<1, 2, 0> {
1668 inputs_[0] = elements;
1675 return hydrogen()->elements_kind();
1678 return hydrogen()->is_external();
1681 return hydrogen()->is_fixed_typed_array();
1684 return is_external() || is_fixed_typed_array();
1690 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1691 uint32_t base_offset()
const {
return hydrogen()->base_offset(); }
1695 class LLoadKeyedGeneric
FINAL :
public LTemplateInstruction<1, 3, 1> {
1699 inputs_[0] = context;
1700 inputs_[1] = object;
1726 inputs_[0] = context;
1727 inputs_[1] = global_object;
1743 class LStoreGlobalCell
FINAL :
public LTemplateInstruction<0, 1, 1> {
1761 inputs_[0] = context;
1769 int slot_index() {
return hydrogen()->slot_index(); }
1778 inputs_[0] = context;
1788 int slot_index() {
return hydrogen()->slot_index(); }
1806 class LDrop
FINAL :
public LTemplateInstruction<0, 0, 0> {
1808 explicit LDrop(
int count) : count_(count) { }
1822 inputs_[0] =
function;
1823 inputs_[1] = code_object;
1839 inputs_[0] = base_object;
1840 inputs_[1] = offset;
1859 class LContext
FINAL :
public LTemplateInstruction<1, 0, 0> {
1866 class LDeclareGlobals
FINAL : public LTemplateInstruction<0, 1, 0> {
1869 inputs_[0] = context;
1882 inputs_[0] =
function;
1890 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1892 int arity()
const {
return hydrogen()->argument_count() - 1; }
1896 class LCallWithDescriptor
FINAL :
public LTemplateResultInstruction<1> {
1900 : descriptor_(descriptor),
1901 inputs_(descriptor.GetRegisterParameterCount() + 1, zone) {
1903 inputs_.AddAll(operands, zone);
1914 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1916 int arity()
const {
return hydrogen()->argument_count() - 1; }
1930 class LInvokeFunction
FINAL :
public LTemplateInstruction<1, 2, 0> {
1933 inputs_[0] = context;
1934 inputs_[1] =
function;
1943 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1945 int arity()
const {
return hydrogen()->argument_count() - 1; }
1949 class LCallFunction
FINAL :
public LTemplateInstruction<1, 2, 0> {
1952 inputs_[0] = context;
1953 inputs_[1] =
function;
1962 int arity()
const {
return hydrogen()->argument_count() - 1; }
1966 class LCallNew
FINAL :
public LTemplateInstruction<1, 2, 0> {
1969 inputs_[0] = context;
1970 inputs_[1] = constructor;
1979 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
1981 int arity()
const {
return hydrogen()->argument_count() - 1; }
1985 class LCallNewArray
FINAL :
public LTemplateInstruction<1, 2, 0> {
1988 inputs_[0] = context;
1989 inputs_[1] = constructor;
1998 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2000 int arity()
const {
return hydrogen()->argument_count() - 1; }
2004 class LCallRuntime
FINAL :
public LTemplateInstruction<1, 1, 0> {
2007 inputs_[0] = context;
2020 int arity()
const {
return hydrogen()->argument_count(); }
2025 class LInteger32ToDouble
FINAL :
public LTemplateInstruction<1, 1, 0> {
2037 class LUint32ToDouble
FINAL :
public LTemplateInstruction<1, 1, 0> {
2049 class LNumberTagI
FINAL :
public LTemplateInstruction<1, 1, 2> {
2065 class LNumberTagU
FINAL :
public LTemplateInstruction<1, 1, 2> {
2081 class LNumberTagD
FINAL :
public LTemplateInstruction<1, 1, 2> {
2109 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2114 class LDoubleToI
FINAL :
public LTemplateInstruction<1, 1, 0> {
2125 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2130 class LTaggedToI
FINAL :
public LTemplateInstruction<1, 1, 2> {
2147 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2151 class LSmiTag
FINAL :
public LTemplateInstruction<1, 1, 0> {
2180 : needs_check_(needs_check) {
2197 inputs_[0] = object;
2209 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2212 return hydrogen()->field_representation();
2217 class LStoreNamedGeneric
FINAL :
public LTemplateInstruction<0, 3, 0> {
2220 inputs_[0] = context;
2221 inputs_[1] = object;
2232 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2239 class LStoreKeyed
FINAL :
public LTemplateInstruction<0, 3, 0> {
2242 inputs_[0] = object;
2249 return hydrogen()->is_fixed_typed_array();
2252 return is_external() || is_fixed_typed_array();
2258 return hydrogen()->elements_kind();
2264 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2265 bool NeedsCanonicalization() {
2266 if (hydrogen()->value()->IsAdd() || hydrogen()->value()->IsSub() ||
2267 hydrogen()->value()->IsMul() || hydrogen()->value()->IsDiv()) {
2270 return hydrogen()->NeedsCanonicalization();
2276 class LStoreKeyedGeneric
FINAL :
public LTemplateInstruction<0, 4, 0> {
2282 inputs_[0] = context;
2296 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2302 class LTransitionElementsKind
FINAL :
public LTemplateInstruction<0, 2, 1> {
2307 inputs_[0] = object;
2308 inputs_[1] = context;
2309 temps_[0] = new_map_temp;
2317 "transition-elements-kind")
2320 virtual
void PrintDataTo(StringStream* stream)
OVERRIDE;
2322 Handle<
Map> original_map() {
return hydrogen()->original_map().handle(); }
2324 return hydrogen()->transitioned_map().handle();
2331 class LTrapAllocationMemento
FINAL :
public LTemplateInstruction<0, 1, 1> {
2335 inputs_[0] = object;
2343 "trap-allocation-memento")
2347 class LStringAdd
FINAL :
public LTemplateInstruction<1, 3, 0> {
2350 inputs_[0] = context;
2368 inputs_[0] = context;
2369 inputs_[1] = string;
2385 inputs_[0] = context;
2386 inputs_[1] = char_code;
2448 class LCheckNonSmi
FINAL :
public LTemplateInstruction<0, 1, 0> {
2464 inputs_[0] = unclamped;
2473 class LClampIToUint8
FINAL :
public LTemplateInstruction<1, 1, 0> {
2476 inputs_[0] = unclamped;
2485 class LClampTToUint8
FINAL :
public LTemplateInstruction<1, 1, 1> {
2488 inputs_[0] = unclamped;
2499 class LDoubleBits
FINAL :
public LTemplateInstruction<1, 1, 0> {
2526 class LAllocate
FINAL :
public LTemplateInstruction<1, 2, 2> {
2532 inputs_[0] = context;
2551 inputs_[0] = context;
2564 inputs_[0] = context;
2590 inputs_[0] = context;
2601 class LTypeofIsAndBranch
FINAL :
public LControlInstruction<1, 0> {
2627 "is-construct-call-and-branch")
2631 class LOsrEntry
FINAL :
public LTemplateInstruction<0, 0, 0> {
2642 class LStackCheck
FINAL :
public LTemplateInstruction<0, 1, 0> {
2645 inputs_[0] = context;
2653 Label* done_label() {
return &done_label_; }
2663 inputs_[0] = context;
2664 inputs_[1] = object;
2674 class LForInCacheArray
FINAL :
public LTemplateInstruction<1, 1, 0> {
2685 return HForInCacheArray::cast(this->hydrogen_value())->idx();
2690 class LCheckMapValue
FINAL :
public LTemplateInstruction<0, 2, 0> {
2704 class LLoadFieldByIndex
FINAL :
public LTemplateInstruction<1, 2, 0> {
2707 inputs_[0] = object;
2721 inputs_[0] = context;
2733 inputs_[0] = context;
2734 inputs_[1] =
function;
2747 class LChunkBuilder;
2751 :
LChunk(info, graph) { }
2762 current_instruction_(
NULL),
2763 current_block_(
NULL),
2765 allocator_(allocator) {}
2771 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2893 #undef DECLARE_HYDROGEN_ACCESSOR
2894 #undef DECLARE_CONCRETE_INSTRUCTION
A sandboxed execution context with its own set of built-in objects and functions.
The superclass of all JavaScript values and objects.
static U update(U previous, T value)
int GetRegisterParameterCount() const
Source to read snapshot and builtins files from.
LInstructionGap(HBasicBlock *block)
LLoadFunctionPrototype(LOperand *function)
LCallJSFunction(LOperand *function)
LDivByConstI(LOperand *dividend, int32_t divisor)
LSmiUntag(LOperand *value, bool needs_check)
LInstruction * DoDivByPowerOf2I(HDiv *instr)
ZoneList< LOperand * > inputs_
LCheckSmi(LOperand *value)
LTypeofIsAndBranch(LOperand *value)
LBoundsCheck(LOperand *index, LOperand *length)
DECLARE_CONCRETE_INSTRUCTION(IsUndetectableAndBranch, "is-undetectable-and-branch") virtual void PrintDataTo(StringStream *stream) OVERRIDE
virtual LOperand * TempAt(int i) FINAL OVERRIDE
MUST_USE_RESULT LUnallocated * TempRegister()
LTrapAllocationMemento(LOperand *object, LOperand *temp)
LIsSmiAndBranch(LOperand *value)
LDivByPowerOf2I(LOperand *dividend, int32_t divisor)
LStoreKeyed(LOperand *object, LOperand *key, LOperand *value)
LUint32ToDouble(LOperand *value)
LModByPowerOf2I(LOperand *dividend, int32_t divisor)
const CallInterfaceDescriptor descriptor()
LStringCharCodeAt(LOperand *context, LOperand *string, LOperand *index)
LInstruction * DoArithmeticT(Token::Value op, HBinaryOperation *instr)
LStoreNamedField(LOperand *object, LOperand *value, LOperand *temp)
LPower(LOperand *left, LOperand *right)
LStringCompareAndBranch(LOperand *context, LOperand *left, LOperand *right)
MUST_USE_RESULT LUnallocated * TempDoubleRegister()
LInnerAllocatedObject(LOperand *base_object, LOperand *offset)
LCmpObjectEqAndBranch(LOperand *left, LOperand *right)
uint32_t base_offset() const
LInstruction * DoFlooringDivByPowerOf2I(HMathFloorOfDiv *instr)
virtual Opcode opcode() const OVERRIDE
LStoreNamedGeneric(LOperand *context, LOperand *object, LOperand *value)
LMathClz32(LOperand *value)
LMathMinMax(LOperand *left, LOperand *right)
LConstructDouble(LOperand *hi, LOperand *lo)
LShiftI(Token::Value op, LOperand *left, LOperand *right, bool can_deopt)
LLoadContextSlot(LOperand *context)
virtual void PrintDataTo(StringStream *stream) OVERRIDE
LInstruction * DefineSameAsFirst(LTemplateResultInstruction< 1 > *instr)
LBitI(LOperand *left, LOperand *right)
LDoubleBits(LOperand *value)
LDeclareGlobals(LOperand *context)
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
virtual void CompileToNative(LCodeGen *generator) OVERRIDE
LWrapReceiver(LOperand *receiver, LOperand *function)
LNumberTagD(LOperand *value, LOperand *temp, LOperand *temp2)
LApplyArguments(LOperand *function, LOperand *receiver, LOperand *length, LOperand *elements)
LStringAdd(LOperand *context, LOperand *left, LOperand *right)
MUST_USE_RESULT LOperand * Use(HValue *value)
MUST_USE_RESULT LOperand * UseAtStart(HValue *value)
MUST_USE_RESULT LOperand * UseConstant(HValue *value)
bool has_constant_parameter_count()
MUST_USE_RESULT LOperand * UseOrConstantAtStart(HValue *value)
SaveFPRegsMode save_doubles() const
LInteger32ToDouble(LOperand *value)
virtual int TempCount() FINAL OVERRIDE
LForInCacheArray(LOperand *map)
LCmpT(LOperand *context, LOperand *left, LOperand *right)
LInstruction * DoMathAbs(HUnaryMathOperation *instr)
LLabel * replacement() const
LCompareMinusZeroAndBranch(LOperand *value, LOperand *temp)
LStoreContextSlot(LOperand *context, LOperand *value)
LMathExp(LOperand *value, LOperand *double_temp, LOperand *temp1, LOperand *temp2)
LCmpMapAndBranch(LOperand *value, LOperand *temp)
LDummyUse(LOperand *value)
LInstruction * DoMathExp(HUnaryMathOperation *instr)
MUST_USE_RESULT LOperand * UseTempRegister(HValue *value)
LInstruction * DefineFixedDouble(LTemplateResultInstruction< 1 > *instr, DoubleRegister reg)
DECLARE_CONCRETE_INSTRUCTION(HasInstanceTypeAndBranch, "has-instance-type-and-branch") virtual void PrintDataTo(StringStream *stream) OVERRIDE
LInstruction * DoModByPowerOf2I(HMod *instr)
LInstruction * AssignEnvironment(LInstruction *instr)
LEnvironment * lazy_deopt_env_
bool is_fixed_typed_array() const
LLoadNamedField(LOperand *object)
int gap_instructions_size_
LUnallocated * ToUnallocated(DoubleRegister reg)
LDateField(LOperand *date, LOperand *temp, Smi *index)
LAddI(LOperand *left, LOperand *right)
LMathRound(LOperand *value, LOperand *temp)
LInstruction * Define(LTemplateResultInstruction< 1 > *instr, LUnallocated *result)
LDoubleToSmi(LOperand *value)
LCmpHoleAndBranch(LOperand *object)
virtual bool HasInterestingComment(LCodeGen *gen) const
LInstruction * AssignPointerMap(LInstruction *instr)
LMathFloor(LOperand *value)
LInstruction * DoMathFloor(HUnaryMathOperation *instr)
LIsStringAndBranch(LOperand *value, LOperand *temp)
LInstruction * DoMathRound(HUnaryMathOperation *instr)
LGoto(HBasicBlock *block)
LCallNew(LOperand *context, LOperand *constructor)
LStackCheck(LOperand *context)
LLoadFieldByIndex(LOperand *object, LOperand *index)
virtual LOperand * InputAt(int i) FINAL OVERRIDE
virtual bool IsControl() const OVERRIDE
void DoBasicBlock(HBasicBlock *block, HBasicBlock *next_block)
LClampTToUint8(LOperand *unclamped, LOperand *temp)
LRSubI(LOperand *left, LOperand *right)
LArgumentsLength(LOperand *elements)
LIsConstructCallAndBranch(LOperand *temp)
LMathFround(LOperand *value)
LLoadNamedGeneric(LOperand *context, LOperand *object, LOperand *vector)
MUST_USE_RESULT LOperand * UseFixedDouble(HValue *value, DoubleRegister fixed_register)
LCheckMapValue(LOperand *value, LOperand *map)
LArithmeticT(Token::Value op, LOperand *context, LOperand *left, LOperand *right)
LLoadKeyedGeneric(LOperand *context, LOperand *object, LOperand *key, LOperand *vector)
LGetCachedArrayIndex(LOperand *value)
LDoubleToI(LOperand *value)
LOperand * GetNextSpillSlot(RegisterKind kind)
LConstantOperand * constant_parameter_count()
LCallNewArray(LOperand *context, LOperand *constructor)
LFlooringDivI(LOperand *dividend, LOperand *divisor, LOperand *temp)
DECLARE_CONCRETE_INSTRUCTION(ClassOfTestAndBranch, "class-of-test-and-branch") virtual void PrintDataTo(StringStream *stream) OVERRIDE
LOperand * new_map_temp()
LForInPrepareMap(LOperand *context, LOperand *object)
LMapEnumLength(LOperand *value)
LInstruction * DefineAsSpilled(LTemplateResultInstruction< 1 > *instr, int index)
LStoreCodeEntry(LOperand *function, LOperand *code_object)
LOperand * offset() const
LInstruction * DoMultiplySub(HValue *minuend, HMul *mul)
LSeqStringGetChar(LOperand *string, LOperand *index)
LInstruction * DoMultiplyAdd(HMul *mul, HValue *addend)
HBasicBlock * current_block_
MUST_USE_RESULT LOperand * UseRegisterAtStart(HValue *value)
LInstruction * DoMathPowHalf(HUnaryMathOperation *instr)
LInvokeFunction(LOperand *context, LOperand *function)
LSubI(LOperand *left, LOperand *right)
CallInterfaceDescriptor descriptor_
LCheckMaps(LOperand *value=NULL)
LInstruction * DoFlooringDivByConstI(HMathFloorOfDiv *instr)
LMulI(LOperand *left, LOperand *right)
bool is_typed_elements() const
LLabel(HBasicBlock *block)
bool HasReplacement() const
LInstruction * DoModByConstI(HMod *instr)
MUST_USE_RESULT LOperand * Use(HValue *value, LUnallocated *operand)
LCheckValue(LOperand *value)
LStringCharFromCode(LOperand *context, LOperand *char_code)
LInstruction * DoShift(Token::Value op, HBitwiseBinaryOperation *instr)
LCheckInstanceType(LOperand *value)
LInstruction * DoArithmeticD(Token::Value op, HArithmeticBinaryOperation *instr)
LStoreKeyedGeneric(LOperand *context, LOperand *obj, LOperand *key, LOperand *value)
LSeqStringSetChar(LOperand *context, LOperand *string, LOperand *index, LOperand *value)
virtual int InputCount() FINAL OVERRIDE
DISALLOW_COPY_AND_ASSIGN(LChunkBuilder)
LInstruction * DoMathClz32(HUnaryMathOperation *instr)
LInstruction * DoMathSqrt(HUnaryMathOperation *instr)
ElementsKind elements_kind() const
DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind, "transition-elements-kind") virtual void PrintDataTo(StringStream *stream) OVERRIDE
LCallWithDescriptor(CallInterfaceDescriptor descriptor, const ZoneList< LOperand * > &operands, Zone *zone)
LOperand * global_object()
LCallRuntime(LOperand *context)
LLoadGlobalGeneric(LOperand *context, LOperand *global_object, LOperand *vector)
LInstruction * DoRSub(HSub *instr)
LAllocate(LOperand *context, LOperand *size, LOperand *temp1, LOperand *temp2)
MUST_USE_RESULT LOperand * UseFixed(HValue *value, Register fixed_register)
LClampDToUint8(LOperand *unclamped)
LOperand * base_object() const
LInstanceOfKnownGlobal(LOperand *context, LOperand *value, LOperand *temp)
LPlatformChunk(CompilationInfo *info, HGraph *graph)
LRegExpLiteral(LOperand *context)
virtual bool HasInterestingComment(LCodeGen *gen) const OVERRIDE
LOperand * string() const
LInstruction * DoMathLog(HUnaryMathOperation *instr)
LInstruction * DoDivByConstI(HDiv *instr)
void VisitInstruction(HInstruction *current)
LOperand * multiplicand()
LPushArgument(LOperand *value)
DECLARE_CONCRETE_INSTRUCTION(HasCachedArrayIndexAndBranch, "has-cached-array-index-and-branch") virtual void PrintDataTo(StringStream *stream) OVERRIDE
MUST_USE_RESULT LOperand * UseRegister(HValue *value)
LClassOfTestAndBranch(LOperand *value, LOperand *temp)
bool is_osr_entry() const
static bool HasMagicNumberForDivisor(int32_t divisor)
LMultiplyAddD(LOperand *addend, LOperand *multiplier, LOperand *multiplicand)
LModI(LOperand *left, LOperand *right, LOperand *temp, LOperand *temp2)
virtual const char * Mnemonic() const OVERRIDE
LFlooringDivByConstI(LOperand *dividend, int32_t divisor, LOperand *temp)
LDivI(LOperand *dividend, LOperand *divisor, LOperand *temp)
MUST_USE_RESULT LOperand * UseOrConstant(HValue *value)
LCallStub(LOperand *context)
LInstruction * DoFlooringDivI(HMathFloorOfDiv *instr)
LMathAbs(LOperand *context, LOperand *value)
LInstruction * DefineFixed(LTemplateResultInstruction< 1 > *instr, Register reg)
LCompareNumericAndBranch(LOperand *left, LOperand *right)
LInstruction * DoDivI(HDiv *instr)
LFunctionLiteral(LOperand *context)
virtual MUST_USE_RESULT LOperand * UseAny(HValue *value) OVERRIDE
LMathSqrt(LOperand *value)
MUST_USE_RESULT LOperand * FixedTemp(Register reg)
virtual void PrintDataTo(StringStream *stream)
Handle< Map > transitioned_map()
LMathLog(LOperand *value)
LLoadKeyed(LOperand *elements, LOperand *key)
LMultiplySubD(LOperand *minuend, LOperand *multiplier, LOperand *multiplicand)
LOperand * parameter_count()
LReturn(LOperand *value, LOperand *context, LOperand *parameter_count)
LCallFunction(LOperand *context, LOperand *function)
LTaggedToI(LOperand *value, LOperand *temp, LOperand *temp2)
MUST_USE_RESULT LOperand * FixedTemp(DoubleRegister reg)
LHasCachedArrayIndexAndBranch(LOperand *value)
LInstruction * DoModI(HMod *instr)
MUST_USE_RESULT LOperand * UseRegisterOrConstantAtStart(HValue *value)
void AddInstruction(LInstruction *instr, HInstruction *current)
LStoreGlobalCell(LOperand *value, LOperand *temp)
void set_replacement(LLabel *label)
bool is_loop_header() const
LInstanceOf(LOperand *context, LOperand *left, LOperand *right)
LFlooringDivByPowerOf2I(LOperand *dividend, int32_t divisor)
LCheckNonSmi(LOperand *value)
HInstruction * current_instruction_
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
LNumberUntagD(LOperand *value)
LUnallocated * ToUnallocated(Register reg)
HBasicBlock * next_block_
LOperand * target() const
LIsObjectAndBranch(LOperand *value, LOperand *temp)
LTypeof(LOperand *context, LOperand *value)
MUST_USE_RESULT LOperand * UseRegisterOrConstant(HValue *value)
LChunkBuilder(CompilationInfo *info, HGraph *graph, LAllocator *allocator)
LNumberTagI(LOperand *value, LOperand *temp1, LOperand *temp2)
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env) OVERRIDE
LMathPowHalf(LOperand *value)
LEnvironment * GetDeferredLazyDeoptimizationEnvironment()
LClampIToUint8(LOperand *unclamped)
int gap_instructions_size()
LHasInstanceTypeAndBranch(LOperand *value)
LNumberTagU(LOperand *value, LOperand *temp1, LOperand *temp2)
LInstruction * DefineAsRegister(LTemplateResultInstruction< 1 > *instr)
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal, "instance-of-known-global") Handle< JSFunction > function() const
LModByConstI(LOperand *dividend, int32_t divisor)
LTransitionElementsKind(LOperand *object, LOperand *context, LOperand *new_map_temp)
LToFastProperties(LOperand *value)
LTailCallThroughMegamorphicCache(LOperand *context, LOperand *receiver, LOperand *name)
LInstruction * MarkAsCall(LInstruction *instr, HInstruction *hinstr, CanDeoptimize can_deoptimize=CANNOT_DEOPTIMIZE_EAGERLY)
LInstruction * DoMathFround(HUnaryMathOperation *instr)
int GetNextSpillIndex(RegisterKind kind)
static HValue * cast(HValue *value)
Handle< ScopeInfo > scope_info()
LAllocateBlockContext(LOperand *context, LOperand *function)
int LookupDestination(int block_id) const
Label * GetAssemblyLabel(int block_id) const
HControlInstruction * hydrogen()
virtual bool IsControl() const FINAL OVERRIDE
int FalseDestination(LChunk *chunk)
HBasicBlock * SuccessorAt(int i)
Label * FalseLabel(LChunk *chunk)
int TrueDestination(LChunk *chunk)
Label * TrueLabel(LChunk *chunk)
static LGap * cast(LInstruction *instr)
virtual bool IsGap() const OVERRIDE
LParallelMove * GetParallelMove(InnerPosition pos)
HBasicBlock * block() const
virtual void PrintDataTo(StringStream *stream) OVERRIDE
LParallelMove * parallel_moves_[LAST_INNER_POSITION+1]
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
SetOncePointer< LPointerMap > pointer_map_
virtual int InputCount()=0
void set_environment(LEnvironment *env)
virtual bool HasResult() const =0
friend class TempIterator
bool HasPointerMap() const
virtual int TempCount()=0
virtual const char * Mnemonic() const =0
virtual void PrintTo(StringStream *stream)
virtual LOperand * TempAt(int i)=0
LEnvironment * environment() const
@ LITHIUM_CONCRETE_INSTRUCTION_LIST
virtual LOperand * InputAt(int i)=0
void set_hydrogen_value(HValue *value)
virtual void PrintDataTo(StringStream *stream)
virtual LOperand * result() const =0
bool IsMarkedAsCall() const
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
HValue * hydrogen_value() const
bool HasEnvironment() const
virtual void PrintOutputOperandTo(StringStream *stream)
void set_pointer_map(LPointerMap *p)
friend class InputIterator
LEnvironment * environment_
virtual Opcode opcode() const =0
virtual bool ClobbersDoubleRegisters(Isolate *isolate) const
bool ClobbersTemps() const
bool ClobbersRegisters() const
virtual bool HasInterestingComment(LCodeGen *gen) const
virtual void CompileToNative(LCodeGen *generator)=0
virtual bool IsControl() const
LPointerMap * pointer_map() const
virtual bool IsGap() const
LStoreFrameContext(LOperand *context)
EmbeddedContainer< LOperand *, I > inputs_
virtual LOperand * TempAt(int i) FINAL OVERRIDE
virtual int TempCount() FINAL OVERRIDE
EmbeddedContainer< LOperand *, T > temps_
virtual LOperand * InputAt(int i) FINAL OVERRIDE
virtual int InputCount() FINAL OVERRIDE
void set_result(LOperand *operand)
virtual bool HasResult() const FINAL OVERRIDE
EmbeddedContainer< LOperand *, R > results_
LOperand * result() const
STATIC_ASSERT(R==0||R==1)
static Smi * FromInt(int value)
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf map
enable harmony numeric enable harmony object literal extensions Optimize object size
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be expose gc extension under the specified name show built in functions in stack traces use random jit cookie to mask large constants minimum length for automatic enable preparsing CPU profiler sampling interval in microseconds trace out of bounds accesses to external arrays default size of stack region v8 is allowed to maximum length of function source code printed in a stack trace min size of a semi the new space consists of two semi spaces print one trace line following each garbage collection do not print trace line after scavenger collection print cumulative GC statistics in name
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
#define DECLARE_PREDICATE(type)
#define DECLARE_OPCODE(type)
#define DECLARE_HYDROGEN_ACCESSOR(type)
#define DCHECK(condition)
static Object * DeclareGlobals(Isolate *isolate, Handle< GlobalObject > global, Handle< String > name, Handle< Object > value, PropertyAttributes attr, bool is_var, bool is_const, bool is_function)
Debugger support for the V8 JavaScript engine.
#define T(name, string, precedence)