28 #ifndef V8_ARM64_LITHIUM_ARM64_H_
29 #define V8_ARM64_LITHIUM_ARM64_H_
43 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
44 V(AccessArgumentsAt) \
50 V(ArgumentsElements) \
64 V(CallWithDescriptor) \
65 V(CheckInstanceType) \
74 V(ClassOfTestAndBranch) \
75 V(CmpHoleAndBranchD) \
76 V(CmpHoleAndBranchT) \
78 V(CmpObjectEqAndBranch) \
80 V(CompareMinusZeroAndBranch) \
81 V(CompareNumericAndBranch) \
101 V(FlooringDivByConstI) \
102 V(FlooringDivByPowerOf2I) \
107 V(GetCachedArrayIndex) \
109 V(HasCachedArrayIndexAndBranch) \
110 V(HasInstanceTypeAndBranch) \
111 V(InnerAllocatedObject) \
113 V(InstanceOfKnownGlobal) \
115 V(Integer32ToDouble) \
117 V(IsConstructCallAndBranch) \
118 V(IsObjectAndBranch) \
120 V(IsStringAndBranch) \
121 V(IsUndetectableAndBranch) \
125 V(LoadFieldByIndex) \
126 V(LoadFunctionPrototype) \
128 V(LoadGlobalGeneric) \
129 V(LoadKeyedExternal) \
131 V(LoadKeyedFixedDouble) \
132 V(LoadKeyedGeneric) \
134 V(LoadNamedGeneric) \
162 V(SeqStringGetChar) \
163 V(SeqStringSetChar) \
170 V(StoreContextSlot) \
172 V(StoreKeyedExternal) \
174 V(StoreKeyedFixedDouble) \
175 V(StoreKeyedGeneric) \
177 V(StoreNamedGeneric) \
179 V(StringCharCodeAt) \
180 V(StringCharFromCode) \
181 V(StringCompareAndBranch) \
186 V(ToFastProperties) \
187 V(TransitionElementsKind) \
188 V(TrapAllocationMemento) \
189 V(TruncateDoubleToIntOrSmi) \
191 V(TypeofIsAndBranch) \
197 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
198 virtual Opcode opcode() const V8_FINAL V8_OVERRIDE { \
199 return LInstruction::k##type; \
201 virtual void CompileToNative(LCodeGen* generator) V8_FINAL V8_OVERRIDE; \
202 virtual const char* Mnemonic() const V8_FINAL V8_OVERRIDE { \
205 static L##type* cast(LInstruction* instr) { \
206 ASSERT(instr->Is##type()); \
207 return reinterpret_cast<L##type*>(instr); \
211 #define DECLARE_HYDROGEN_ACCESSOR(type) \
212 H##type* hydrogen() const { \
213 return H##type::cast(this->hydrogen_value()); \
217 class LInstruction :
public ZoneObject {
220 : environment_(
NULL),
221 hydrogen_value_(
NULL),
222 bit_field_(IsCallBits::encode(
false)) { }
227 virtual const char*
Mnemonic()
const = 0;
234 #define DECLARE_OPCODE(type) k##type,
237 #undef DECLARE_OPCODE
243 #define DECLARE_PREDICATE(type) \
244 bool Is##type() const { return opcode() == k##type; }
246 #undef DECLARE_PREDICATE
250 virtual bool IsGap()
const {
return false; }
267 void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_,
true); }
268 bool IsCall()
const {
return IsCallBits::decode(bit_field_); }
279 virtual int InputCount() = 0;
280 virtual LOperand* InputAt(
int i) = 0;
281 virtual int TempCount() = 0;
282 virtual LOperand* TempAt(
int i) = 0;
294 class IsCallBits:
public BitField<bool, 0, 1> {};
296 LEnvironment* environment_;
297 SetOncePointer<LPointerMap> pointer_map_;
298 HValue* hydrogen_value_;
305 class LTemplateResultInstruction :
public LInstruction {
323 template<
int R,
int I,
int T>
324 class LTemplateInstruction :
public LTemplateResultInstruction<R> {
326 EmbeddedContainer<LOperand*, I>
inputs_;
327 EmbeddedContainer<LOperand*, T>
temps_;
339 class LUnknownOSRValue
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
348 template<
int I,
int T>
349 class LControlInstruction :
public LTemplateInstruction<0, I, T> {
367 if (true_label_ ==
NULL) {
374 if (false_label_ ==
NULL) {
385 DECLARE_HYDROGEN_ACCESSOR(ControlInstruction);
392 class LGap :
public LTemplateInstruction<0, 0, 0> {
407 return reinterpret_cast<LGap*
>(instr);
412 HBasicBlock*
block()
const {
return block_; }
424 if (parallel_moves_[pos] ==
NULL) {
425 parallel_moves_[pos] =
new(zone) LParallelMove(zone);
427 return parallel_moves_[pos];
431 return parallel_moves_[pos];
440 class LInstructionGap
V8_FINAL :
public LGap {
445 return !IsRedundant();
452 class LDrop
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
454 explicit LDrop(
int count) : count_(count) { }
456 int count()
const {
return count_; }
472 class LDummyUse
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
481 class LGoto
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
483 explicit LGoto(HBasicBlock* block) : block_(block) { }
488 virtual
bool IsControl() const V8_OVERRIDE {
return true; }
490 int block_id()
const {
return block_->block_id(); }
497 class LLazyBailout
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
503 void set_gap_instructions_size(
int gap_instructions_size) {
504 gap_instructions_size_ = gap_instructions_size;
509 int gap_instructions_size_;
513 class LLabel
V8_FINAL :
public LGap {
516 :
LGap(block), replacement_(
NULL) { }
525 int block_id()
const {
return block()->block_id(); }
535 LLabel* replacement_;
539 class LOsrEntry
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
550 class LAccessArgumentsAt
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
555 inputs_[0] = arguments;
570 class LAddE
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
600 class LAddS
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
615 class LAllocate
V8_FINAL : public LTemplateInstruction<1, 2, 3> {
622 inputs_[0] = context;
640 class LApplyArguments
V8_FINAL : public LTemplateInstruction<1, 4, 0> {
646 inputs_[0] =
function;
647 inputs_[1] = receiver;
649 inputs_[3] = elements;
661 class LArgumentsElements
V8_FINAL :
public LTemplateInstruction<1, 0, 1> {
674 class LArgumentsLength
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
677 inputs_[0] = elements;
686 class LArithmeticD
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
701 return LInstruction::kArithmeticD;
711 class LArithmeticT
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
718 inputs_[0] = context;
729 return LInstruction::kArithmeticT;
732 virtual const char* Mnemonic() const V8_OVERRIDE;
739 class LBoundsCheck
V8_FINAL : public LTemplateInstruction<0, 2, 0> {
754 class LBitI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
771 class LBitS
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
803 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
807 class LCallJSFunction
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
810 inputs_[0] =
function;
818 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
820 int arity()
const {
return hydrogen()->argument_count() - 1; }
824 class LCallFunction
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
827 inputs_[0] = context;
828 inputs_[1] =
function;
837 int arity()
const {
return hydrogen()->argument_count() - 1; }
841 class LCallNew
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
844 inputs_[0] = context;
845 inputs_[1] = constructor;
854 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
856 int arity()
const {
return hydrogen()->argument_count() - 1; }
860 class LCallNewArray
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
863 inputs_[0] = context;
864 inputs_[1] = constructor;
873 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
875 int arity()
const {
return hydrogen()->argument_count() - 1; }
879 class LCallRuntime
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
882 inputs_[0] = context;
890 virtual
bool ClobbersDoubleRegisters() const V8_OVERRIDE {
895 int arity()
const {
return hydrogen()->argument_count(); }
900 class LCallStub
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
903 inputs_[0] = context;
913 class LCheckInstanceType
V8_FINAL : public LTemplateInstruction<0, 1, 1> {
928 class LCheckMaps
V8_FINAL : public LTemplateInstruction<0, 1, 1> {
943 class LCheckNonSmi
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
956 class LCheckSmi
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
968 class LCheckValue
V8_FINAL :
public LTemplateInstruction<0, 1, 0> {
981 class LClampDToUint8
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
984 inputs_[0] = unclamped;
993 class LClampIToUint8
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
996 inputs_[0] = unclamped;
1005 class LClampTToUint8
V8_FINAL :
public LTemplateInstruction<1, 1, 2> {
1008 inputs_[0] = unclamped;
1021 class LDoubleBits
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1034 class LConstructDouble
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
1050 class LClassOfTestAndBranch
V8_FINAL :
public LControlInstruction<1, 2> {
1063 "class-of-test-and-branch")
1066 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1070 class LCmpHoleAndBranchD
V8_FINAL : public LControlInstruction<1, 1> {
1073 inputs_[0] = object;
1085 class LCmpHoleAndBranchT
V8_FINAL : public LControlInstruction<1, 0> {
1088 inputs_[0] = object;
1098 class LCmpMapAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1115 class LCmpObjectEqAndBranch
V8_FINAL :
public LControlInstruction<2, 0> {
1130 class LCmpT
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1133 inputs_[0] = context;
1149 class LCompareMinusZeroAndBranch
V8_FINAL :
public LControlInstruction<1, 1> {
1160 "cmp-minus-zero-and-branch")
1165 class LCompareNumericAndBranch
V8_FINAL : public LControlInstruction<2, 0> {
1176 "compare-numeric-and-branch")
1179 Token::
Value op()
const {
return hydrogen()->token(); }
1181 return hydrogen()->representation().IsDouble();
1188 class LConstantD
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1193 double value()
const {
return hydrogen()->DoubleValue(); }
1197 class LConstantE
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1202 ExternalReference value()
const {
1203 return hydrogen()->ExternalReferenceValue();
1208 class LConstantI
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1213 int32_t value()
const {
return hydrogen()->Integer32Value(); }
1217 class LConstantS
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1226 class LConstantT
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1232 return hydrogen()->handle(isolate);
1237 class LContext
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1244 class LDateField
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1261 class LDebugBreak
V8_FINAL : public LTemplateInstruction<0, 0, 0> {
1267 class LDeclareGlobals
V8_FINAL :
public LTemplateInstruction<0, 1, 0> {
1270 inputs_[0] = context;
1280 class LDeoptimize
V8_FINAL : public LTemplateInstruction<0, 0, 0> {
1287 class LDivByPowerOf2I
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1290 inputs_[0] = dividend;
1305 class LDivByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 1> {
1308 inputs_[0] = dividend;
1325 class LDivI
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
1342 class LDoubleToIntOrSmi
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1353 bool tag_result() {
return hydrogen()->representation().IsSmi(); }
1357 class LForInCacheArray
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1368 return HForInCacheArray::cast(this->hydrogen_value())->idx();
1373 class LForInPrepareMap
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1376 inputs_[0] = context;
1377 inputs_[1] = object;
1387 class LGetCachedArrayIndex
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1400 class LHasCachedArrayIndexAndBranch
V8_FINAL
1401 : public LControlInstruction<1, 1> {
1412 "has-cached-array-index-and-branch")
1415 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1419 class LHasInstanceTypeAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1430 "has-instance-type-and-branch")
1433 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1437 class LInnerAllocatedObject
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1440 inputs_[0] = base_object;
1441 inputs_[1] = offset;
1453 class LInstanceOf
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
1456 inputs_[0] = context;
1469 class LInstanceOfKnownGlobal
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1472 inputs_[0] = context;
1480 "instance-of-known-global")
1485 return lazy_deopt_env_;
1488 LEnvironment* env) V8_OVERRIDE {
1489 lazy_deopt_env_ = env;
1493 LEnvironment* lazy_deopt_env_;
1497 class LInteger32ToDouble
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1509 class LCallWithDescriptor
V8_FINAL :
public LTemplateResultInstruction<1> {
1514 : descriptor_(descriptor),
1515 inputs_(descriptor->environment_length() + 1, zone) {
1517 inputs_.AddAll(operands, zone);
1528 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1530 int arity()
const {
return hydrogen()->argument_count() - 1; }
1532 const CallInterfaceDescriptor* descriptor_;
1533 ZoneList<LOperand*> inputs_;
1536 virtual int InputCount()
V8_FINAL V8_OVERRIDE {
return inputs_.length(); }
1537 virtual LOperand* InputAt(
int i)
V8_FINAL V8_OVERRIDE {
return inputs_[i]; }
1539 virtual int TempCount()
V8_FINAL V8_OVERRIDE {
return 0; }
1540 virtual LOperand* TempAt(
int i)
V8_FINAL V8_OVERRIDE {
return NULL; }
1544 class LInvokeFunction
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1547 inputs_[0] = context;
1548 inputs_[1] =
function;
1557 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1559 int arity()
const {
return hydrogen()->argument_count() - 1; }
1563 class LIsConstructCallAndBranch
V8_FINAL :
public LControlInstruction<0, 2> {
1574 "is-construct-call-and-branch")
1578 class LIsObjectAndBranch
V8_FINAL :
public LControlInstruction<1, 2> {
1593 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1597 class LIsStringAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1610 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1614 class LIsSmiAndBranch
V8_FINAL : public LControlInstruction<1, 0> {
1625 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1629 class LIsUndetectableAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1640 "is-undetectable-and-branch")
1643 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1647 class LLoadContextSlot
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1650 inputs_[0] = context;
1658 int slot_index()
const {
return hydrogen()->slot_index(); }
1664 class LLoadNamedField
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1667 inputs_[0] = object;
1677 class LFunctionLiteral
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1680 inputs_[0] = context;
1690 class LLoadFunctionPrototype
V8_FINAL : public LTemplateInstruction<1, 1, 1> {
1693 inputs_[0] =
function;
1705 class LLoadGlobalCell
V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1712 class LLoadGlobalGeneric
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1715 inputs_[0] = context;
1716 inputs_[1] = global_object;
1734 this->inputs_[0] = elements;
1735 this->inputs_[1] = key;
1741 return this->hydrogen()->elements_kind();
1744 return this->hydrogen()->is_external();
1747 return hydrogen()->is_fixed_typed_array();
1750 return is_external() || is_fixed_typed_array();
1753 return this->hydrogen()->index_offset();
1756 this->elements()->PrintTo(stream);
1758 this->key()->PrintTo(stream);
1759 if (this->hydrogen()->IsDehoisted()) {
1760 stream->Add(
" + %d]", this->additional_index());
1809 class LLoadKeyedGeneric
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
1812 inputs_[0] = context;
1813 inputs_[1] = object;
1825 class LLoadNamedGeneric
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1828 inputs_[0] = context;
1829 inputs_[1] = object;
1842 class LLoadRoot
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1847 Heap::RootListIndex index()
const {
return hydrogen()->index(); }
1851 class LMapEnumLength
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1867 this->inputs_[0] = value;
1879 class LMathAbs
V8_FINAL :
public LUnaryMathOperation<0> {
1891 inputs_[0] = context;
1916 : LUnaryMathOperation<4>(value) {
1917 temps_[0] = double_temp1;
1921 ExternalReference::InitializeMathExpData();
1933 class LMathFloor
V8_FINAL :
public LUnaryMathOperation<0> {
1940 class LFlooringDivByPowerOf2I
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1943 inputs_[0] = dividend;
1951 "flooring-div-by-power-of-2-i")
1959 class LFlooringDivByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 2> {
1962 inputs_[0] = dividend;
1979 class LFlooringDivI
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
1982 inputs_[0] = dividend;
1983 inputs_[1] = divisor;
2003 class LMathClz32
V8_FINAL :
public LUnaryMathOperation<0> {
2010 class LMathMinMax
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2032 class LMathRound
V8_FINAL :
public LUnaryMathOperation<1> {
2045 class LMathSqrt
V8_FINAL :
public LUnaryMathOperation<0> {
2052 class LModByPowerOf2I
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2055 inputs_[0] = dividend;
2070 class LModByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2073 inputs_[0] = dividend;
2090 class LModI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2105 class LMulConstIS
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2113 LConstantOperand*
right() {
return LConstantOperand::cast(inputs_[1]); }
2120 class LMulI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2135 class LMulS
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2150 class LNumberTagD
V8_FINAL : public LTemplateInstruction<1, 1, 2> {
2167 class LNumberTagU
V8_FINAL : public LTemplateInstruction<1, 1, 2> {
2185 class LNumberUntagD
V8_FINAL :
public LTemplateInstruction<1, 1, 1> {
2201 class LParameter
V8_FINAL : public LTemplateInstruction<1, 0, 0> {
2208 class LPower
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2223 class LPushArgument
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2235 class LRegExpLiteral
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2238 inputs_[0] = context;
2248 class LReturn
V8_FINAL : public LTemplateInstruction<0, 3, 0> {
2252 inputs_[1] = context;
2253 inputs_[2] = parameter_count;
2260 return parameter_count()->IsConstantOperand();
2263 ASSERT(has_constant_parameter_count());
2264 return LConstantOperand::cast(parameter_count());
2271 class LSeqStringGetChar
V8_FINAL :
public LTemplateInstruction<1, 2, 1> {
2276 inputs_[0] = string;
2290 class LSeqStringSetChar
V8_FINAL : public LTemplateInstruction<1, 4, 1> {
2297 inputs_[0] = context;
2298 inputs_[1] = string;
2315 class LSmiTag
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2328 class LSmiUntag
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2331 : needs_check_(needs_check) {
2345 class LStackCheck
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2348 inputs_[0] = context;
2356 Label* done_label() {
return &done_label_; }
2367 this->inputs_[0] = elements;
2368 this->inputs_[1] = key;
2369 this->inputs_[2] = value;
2374 return hydrogen()->is_fixed_typed_array();
2377 return is_external() || is_fixed_typed_array();
2383 return this->hydrogen()->elements_kind();
2387 return this->hydrogen()->NeedsCanonicalization();
2392 this->elements()->PrintTo(stream);
2394 this->key()->PrintTo(stream);
2395 if (this->hydrogen()->IsDehoisted()) {
2396 stream->Add(
" + %d] <-", this->additional_index());
2398 stream->Add(
"] <- ");
2401 if (this->value() ==
NULL) {
2402 ASSERT(hydrogen()->IsConstantHoleStore() &&
2403 hydrogen()->value()->representation().IsDouble());
2404 stream->Add(
"<the hole(nan)>");
2406 this->value()->PrintTo(stream);
2414 class LStoreKeyedExternal
V8_FINAL :
public LStoreKeyed<1> {
2428 class LStoreKeyedFixed
V8_FINAL :
public LStoreKeyed<1> {
2442 class LStoreKeyedFixedDouble
V8_FINAL :
public LStoreKeyed<1> {
2453 "store-keyed-fixed-double")
2457 class LStoreKeyedGeneric
V8_FINAL :
public LTemplateInstruction<0, 4, 0> {
2463 inputs_[0] = context;
2477 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2483 class LStoreNamedField
V8_FINAL :
public LTemplateInstruction<0, 2, 2> {
2487 inputs_[0] = object;
2501 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2503 Handle<
Map> transition()
const {
return hydrogen()->transition_map(); }
2505 return hydrogen()->field_representation();
2510 class LStoreNamedGeneric
V8_FINAL:
public LTemplateInstruction<0, 3, 0> {
2513 inputs_[0] = context;
2514 inputs_[1] = object;
2525 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2532 class LStringAdd
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
2535 inputs_[0] = context;
2550 class LStringCharCodeAt
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
2553 inputs_[0] = context;
2554 inputs_[1] = string;
2567 class LStringCharFromCode
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2570 inputs_[0] = context;
2571 inputs_[1] = char_code;
2582 class LStringCompareAndBranch
V8_FINAL : public LControlInstruction<3, 0> {
2585 inputs_[0] = context;
2595 "string-compare-and-branch")
2598 Token::
Value op()
const {
return hydrogen()->token(); }
2600 virtual void PrintDataTo(StringStream* stream)
V8_OVERRIDE;
2605 class LTaggedToI
V8_FINAL :
public LTemplateInstruction<1, 1, 2> {
2620 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2624 class LShiftI
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2627 : op_(op), can_deopt_(can_deopt) {
2645 class LShiftS
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
2648 bool can_deopt) : op_(op), can_deopt_(can_deopt) {
2668 class LStoreCodeEntry
V8_FINAL: public LTemplateInstruction<0, 2, 1> {
2672 inputs_[0] =
function;
2673 inputs_[1] = code_object;
2688 class LStoreContextSlot
V8_FINAL : public LTemplateInstruction<0, 2, 1> {
2691 inputs_[0] = context;
2703 int slot_index() {
return hydrogen()->slot_index(); }
2709 class LStoreGlobalCell
V8_FINAL :
public LTemplateInstruction<0, 1, 2> {
2726 class LSubI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2741 class
LSubS: public LTemplateInstruction<1, 2, 0> {
2756 class LThisFunction
V8_FINAL : public LTemplateInstruction<1, 0, 0> {
2763 class LToFastProperties
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2776 class LTransitionElementsKind
V8_FINAL : public LTemplateInstruction<0, 2, 2> {
2782 inputs_[0] = object;
2783 inputs_[1] = context;
2794 "transition-elements-kind")
2797 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2799 Handle<
Map> original_map() {
return hydrogen()->original_map().handle(); }
2801 return hydrogen()->transitioned_map().handle();
2808 class LTrapAllocationMemento
V8_FINAL :
public LTemplateInstruction<0, 1, 2> {
2811 inputs_[0] = object;
2824 class LTruncateDoubleToIntOrSmi
V8_FINAL
2825 :
public LTemplateInstruction<1, 1, 0> {
2834 "truncate-double-to-int-or-smi")
2837 bool tag_result() {
return hydrogen()->representation().IsSmi(); }
2841 class LTypeof
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2844 inputs_[0] = context;
2855 class LTypeofIsAndBranch
V8_FINAL :
public LControlInstruction<1, 2> {
2876 class LUint32ToDouble
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2888 class LCheckMapValue
V8_FINAL :
public LTemplateInstruction<0, 2, 1> {
2904 class LLoadFieldByIndex
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2907 inputs_[0] = object;
2918 class LWrapReceiver
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2921 inputs_[0] = receiver;
2922 inputs_[1] =
function;
2933 class LChunkBuilder;
2934 class LPlatformChunk
V8_FINAL :
public LChunk {
2937 :
LChunk(info, graph) { }
2939 int GetNextSpillIndex();
2944 class LChunkBuilder
V8_FINAL :
public LChunkBuilderBase {
2947 : LChunkBuilderBase(graph->zone()),
2952 current_instruction_(
NULL),
2953 current_block_(
NULL),
2954 allocator_(allocator) { }
2957 LPlatformChunk* Build();
2962 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2966 LInstruction* DoDivByPowerOf2I(HDiv* instr);
2967 LInstruction* DoDivByConstI(HDiv* instr);
2968 LInstruction* DoDivI(HBinaryOperation* instr);
2969 LInstruction* DoModByPowerOf2I(HMod* instr);
2970 LInstruction* DoModByConstI(HMod* instr);
2971 LInstruction* DoModI(HMod* instr);
2972 LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2973 LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2974 LInstruction* DoFlooringDivI(HMathFloorOfDiv* instr);
2976 static bool HasMagicNumberForDivision(
int32_t divisor);
2986 HGraph* graph()
const {
return graph_; }
2987 Isolate* isolate()
const {
return info_->isolate(); }
2989 bool is_unused()
const {
return status_ == UNUSED; }
2990 bool is_building()
const {
return status_ == BUILDING; }
2991 bool is_done()
const {
return status_ ==
DONE; }
2992 bool is_aborted()
const {
return status_ == ABORTED; }
2994 int argument_count()
const {
return argument_count_; }
2995 CompilationInfo*
info()
const {
return info_; }
2996 Heap* heap()
const {
return isolate()->heap(); }
3001 LUnallocated* ToUnallocated(Register reg);
3006 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
3033 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
3050 LInstruction* Define(LTemplateResultInstruction<1>* instr,
3051 LUnallocated* result);
3052 LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
3053 LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
3056 LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
3057 LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
3059 LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
3062 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
3067 LInstruction* MarkAsCall(
3068 LInstruction* instr,
3069 HInstruction* hinstr,
3070 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
3072 LInstruction* AssignPointerMap(LInstruction* instr);
3073 LInstruction* AssignEnvironment(LInstruction* instr);
3075 void VisitInstruction(HInstruction* current);
3076 void DoBasicBlock(HBasicBlock* block);
3078 LInstruction* DoShift(
Token::Value op, HBitwiseBinaryOperation* instr);
3080 HArithmeticBinaryOperation* instr);
3082 HBinaryOperation* instr);
3084 LPlatformChunk* chunk_;
3085 CompilationInfo* info_;
3086 HGraph*
const graph_;
3088 HInstruction* current_instruction_;
3089 HBasicBlock* current_block_;
3090 LAllocator* allocator_;
3095 #undef DECLARE_HYDROGEN_ACCESSOR
3096 #undef DECLARE_CONCRETE_INSTRUCTION
3100 #endif // V8_ARM64_LITHIUM_ARM64_H_
LMathRound(LOperand *value, LOperand *temp1)
LCallFunction(LOperand *context, LOperand *function)
LStoreKeyed(LOperand *elements, LOperand *key, LOperand *value)
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter NULL
LLoadFieldByIndex(LOperand *object, LOperand *index)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env) V8_OVERRIDE
virtual Opcode opcode() const V8_OVERRIDE
LTrapAllocationMemento(LOperand *object, LOperand *temp1, LOperand *temp2)
LCmpObjectEqAndBranch(LOperand *left, LOperand *right)
static LGap * cast(LInstruction *instr)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
LPower(LOperand *left, LOperand *right)
LModI(LOperand *left, LOperand *right)
void set_pointer_map(LPointerMap *p)
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
bool IsMarkedAsCall() const
DECLARE_CONCRETE_INSTRUCTION(TruncateDoubleToIntOrSmi,"truncate-double-to-int-or-smi") bool tag_result()
virtual bool HasInterestingComment(LCodeGen *gen) const V8_OVERRIDE
LStoreKeyedFixedDouble(LOperand *elements, LOperand *key, LOperand *value, LOperand *temp)
LMathFloor(LOperand *value)
LBitS(LOperand *left, LOperand *right)
LUint32ToDouble(LOperand *value)
LMulConstIS(LOperand *left, LConstantOperand *right)
void PrintDataTo(StringStream *stream) V8_OVERRIDE
LCmpHoleAndBranchD(LOperand *object, LOperand *temp)
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf map
void set_environment(LEnvironment *env)
LIsObjectAndBranch(LOperand *value, LOperand *temp1, LOperand *temp2)
virtual void PrintDataTo(StringStream *stream) V8_OVERRIDE
LStoreKeyedFixed(LOperand *elements, LOperand *key, LOperand *value, LOperand *temp)
virtual void PrintOutputOperandTo(StringStream *stream)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
EmbeddedContainer< LOperand *, T > temps_
LMathClz32(LOperand *value)
LLoadKeyedGeneric(LOperand *context, LOperand *object, LOperand *key)
LTaggedToI(LOperand *value, LOperand *temp1, LOperand *temp2)
LForInCacheArray(LOperand *map)
static Smi * FromInt(int value)
LInstanceOf(LOperand *context, LOperand *left, LOperand *right)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
LHasCachedArrayIndexAndBranch(LOperand *value, LOperand *temp)
bool is_loop_header() const
LStringAdd(LOperand *context, LOperand *left, LOperand *right)
LShiftS(Token::Value op, LOperand *left, LOperand *right, LOperand *temp, bool can_deopt)
LDummyUse(LOperand *value)
LLoadFunctionPrototype(LOperand *function, LOperand *temp)
int environment_length() const
LLabel(HBasicBlock *block)
LSeqStringGetChar(LOperand *string, LOperand *index, LOperand *temp)
LStoreNamedGeneric(LOperand *context, LOperand *object, LOperand *value)
LClassOfTestAndBranch(LOperand *value, LOperand *temp1, LOperand *temp2)
ElementsKind elements_kind() const
LBoundsCheck(LOperand *index, LOperand *length)
LSeqStringSetChar(LOperand *context, LOperand *string, LOperand *index, LOperand *value, LOperand *temp)
LMathPowHalf(LOperand *value)
bool is_fixed_typed_array() const
bool NeedsCanonicalization()
LEnvironment * environment() const
virtual HBasicBlock * SuccessorAt(int i)=0
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
#define ASSERT(condition)
LArithmeticT(Token::Value op, LOperand *context, LOperand *left, LOperand *right)
LConstantOperand * constant_parameter_count()
LStringCharCodeAt(LOperand *context, LOperand *string, LOperand *index)
LDateField(LOperand *date, Smi *index)
LIsStringAndBranch(LOperand *value, LOperand *temp)
virtual const char * Mnemonic() const =0
LChunkBuilder(CompilationInfo *info, HGraph *graph, LAllocator *allocator)
LNumberTagU(LOperand *value, LOperand *temp1, LOperand *temp2)
LCallStub(LOperand *context)
LOperand * result() const
LCallRuntime(LOperand *context)
LAddI(LOperand *left, LOperand *right)
EmbeddedContainer< LOperand *, R > results_
LCmpT(LOperand *context, LOperand *left, LOperand *right)
virtual void PrintDataTo(StringStream *stream)
LFlooringDivByPowerOf2I(LOperand *dividend, int32_t divisor)
LCallNewArray(LOperand *context, LOperand *constructor)
LOperand * parameter_count()
virtual bool ClobbersDoubleRegisters() const
LDivByConstI(LOperand *dividend, int32_t divisor, LOperand *temp)
LCallJSFunction(LOperand *function)
Label * FalseLabel(LChunk *chunk)
LFlooringDivByConstI(LOperand *dividend, int32_t divisor, LOperand *temp)
Representation representation() const
LOperand * target() const
virtual LOperand * result() const =0
virtual bool HasInterestingComment(LCodeGen *gen) const
LClampIToUint8(LOperand *unclamped)
LGetCachedArrayIndex(LOperand *value)
LBitI(LOperand *left, LOperand *right)
LGoto(HBasicBlock *block)
uint32_t additional_index() const
LMathExp(LOperand *value, LOperand *double_temp1, LOperand *temp1, LOperand *temp2, LOperand *temp3)
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
bool has_constant_parameter_count()
LClampDToUint8(LOperand *unclamped)
void set_hydrogen_value(HValue *value)
LStoreKeyedExternal(LOperand *elements, LOperand *key, LOperand *value, LOperand *temp)
#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
LLoadContextSlot(LOperand *context)
LIsSmiAndBranch(LOperand *value)
virtual bool HasResult() const =0
DwVfpRegister DoubleRegister
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object size
LOperand * base_object() const
LTransitionElementsKind(LOperand *object, LOperand *context, LOperand *temp1, LOperand *temp2=NULL)
LConstructDouble(LOperand *hi, LOperand *lo, LOperand *temp)
virtual Opcode opcode() const =0
LTypeof(LOperand *context, LOperand *value)
LSubS(LOperand *left, LOperand *right)
LModByPowerOf2I(LOperand *dividend, int32_t divisor)
LCallNew(LOperand *context, LOperand *constructor)
LCheckValue(LOperand *value)
bool is_typed_elements() const
LOperand * double_temp1()
LPlatformChunk(CompilationInfo *info, HGraph *graph)
LDoubleToIntOrSmi(LOperand *value)
int TrueDestination(LChunk *chunk)
LNumberUntagD(LOperand *value, LOperand *temp)
HBasicBlock * SuccessorAt(int i)
virtual bool IsControl() const V8_FINAL V8_OVERRIDE
LCmpMapAndBranch(LOperand *value, LOperand *temp)
int gap_instructions_size()
LDeclareGlobals(LOperand *context)
LDivI(LOperand *left, LOperand *right, LOperand *temp)
LClampTToUint8(LOperand *unclamped, LOperand *temp1, LOperand *temp2)
LModByConstI(LOperand *dividend, int32_t divisor, LOperand *temp)
bool HasEnvironment() const
LArgumentsLength(LOperand *elements)
LCompareNumericAndBranch(LOperand *left, LOperand *right)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
bool HasReplacement() const
LMathSqrt(LOperand *value)
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
LToFastProperties(LOperand *value)
LCompareMinusZeroAndBranch(LOperand *value, LOperand *temp)
LAllocate(LOperand *context, LOperand *size, LOperand *temp1, LOperand *temp2, LOperand *temp3)
LNumberTagD(LOperand *value, LOperand *temp1, LOperand *temp2)
LLoadKeyed(LOperand *elements, LOperand *key)
LLoadKeyedFixedDouble(LOperand *elements, LOperand *key, LOperand *temp)
DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,"compare-numeric-and-branch") Token bool is_double() const
LMapEnumLength(LOperand *value)
LLoadKeyedFixed(LOperand *elements, LOperand *key, LOperand *temp)
HBasicBlock * block() const
uint32_t additional_index() const
LBranch(LOperand *value, LOperand *temp1, LOperand *temp2)
virtual void PrintTo(StringStream *stream)
LOperand * global_object()
ElementsKind from_kind() const
LStoreKeyedGeneric(LOperand *context, LOperand *obj, LOperand *key, LOperand *value)
#define T(name, string, precedence)
LHasInstanceTypeAndBranch(LOperand *value, LOperand *temp)
LTruncateDoubleToIntOrSmi(LOperand *value)
LReturn(LOperand *value, LOperand *context, LOperand *parameter_count)
BuiltinFunctionId op() const
STATIC_ASSERT(R==0||R==1)
LMathMinMax(LOperand *left, LOperand *right)
bool ClobbersTemps() const
LAddS(LOperand *left, LOperand *right)
virtual int SuccessorCount()=0
LCheckMaps(LOperand *value, LOperand *temp=NULL)
LMathAbsTagged(LOperand *context, LOperand *value, LOperand *temp1, LOperand *temp2, LOperand *temp3)
virtual bool IsControl() const
LPointerMap * pointer_map() const
void set_replacement(LLabel *label)
LStoreGlobalCell(LOperand *value, LOperand *temp1, LOperand *temp2)
LStoreCodeEntry(LOperand *function, LOperand *code_object, LOperand *temp)
LStoreContextSlot(LOperand *context, LOperand *value, LOperand *temp)
bool is_typed_elements() const
LArgumentsElements(LOperand *temp)
bool is_osr_entry() const
EmbeddedContainer< LOperand *, I > inputs_
LApplyArguments(LOperand *function, LOperand *receiver, LOperand *length, LOperand *elements)
LOperand * offset() const
virtual bool IsGap() const
LInstanceOfKnownGlobal(LOperand *context, LOperand *value)
const CallInterfaceDescriptor * descriptor()
LMathLog(LOperand *value)
#define DECLARE_HYDROGEN_ACCESSOR(type)
LLoadNamedField(LOperand *object)
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function info
LSubI(LOperand *left, LOperand *right)
LFlooringDivI(LOperand *dividend, LOperand *divisor, LOperand *temp)
void PrintDataTo(StringStream *stream) V8_OVERRIDE
LCheckSmi(LOperand *value)
Label * TrueLabel(LChunk *chunk)
LShiftI(Token::Value op, LOperand *left, LOperand *right, bool can_deopt)
LCallWithDescriptor(const CallInterfaceDescriptor *descriptor, ZoneList< LOperand * > &operands, Zone *zone)
LCheckInstanceType(LOperand *value, LOperand *temp)
virtual void CompileToNative(LCodeGen *generator)=0
LLabel * replacement() const
LAddE(LOperand *left, LOperand *right)
LDoubleBits(LOperand *value)
Handle< Map > transitioned_map()
virtual bool HasInterestingComment(LCodeGen *gen) const
LCmpHoleAndBranchT(LOperand *object)
LEnvironment * GetDeferredLazyDeoptimizationEnvironment()
LTypeofIsAndBranch(LOperand *value, LOperand *temp1, LOperand *temp2)
virtual bool HasResult() const V8_FINAL V8_OVERRIDE
LLoadNamedGeneric(LOperand *context, LOperand *object)
LUnaryMathOperation(LOperand *value)
#define DECLARE_PREDICATE(type)
LConstantOperand * right()
LStoreNamedField(LOperand *object, LOperand *value, LOperand *temp0, LOperand *temp1)
bool is_fixed_typed_array() const
LWrapReceiver(LOperand *receiver, LOperand *function)
LCheckNonSmi(LOperand *value)
LParallelMove * GetParallelMove(InnerPosition pos)
ElementsKind to_kind() const
bool ClobbersRegisters() const
LStringCompareAndBranch(LOperand *context, LOperand *left, LOperand *right)
LForInPrepareMap(LOperand *context, LOperand *object)
Label * GetAssemblyLabel(int block_id) const
void set_result(LOperand *operand)
bool HasPointerMap() const
LMathAbs(LOperand *value)
LInstructionGap(HBasicBlock *block)
LPushArgument(LOperand *value)
LFunctionLiteral(LOperand *context)
LInvokeFunction(LOperand *context, LOperand *function)
LMulI(LOperand *left, LOperand *right)
LMulS(LOperand *left, LOperand *right)
LLoadKeyedExternal(LOperand *elements, LOperand *key, LOperand *temp)
LStackCheck(LOperand *context)
LIsConstructCallAndBranch(LOperand *temp1, LOperand *temp2)
int LookupDestination(int block_id) const
LCheckMapValue(LOperand *value, LOperand *map, LOperand *temp)
LStringCharFromCode(LOperand *context, LOperand *char_code)
LInnerAllocatedObject(LOperand *base_object, LOperand *offset)
ElementsKind elements_kind() const
enable upcoming ES6 features enable harmony block scoping enable harmony enable harmony proxies enable harmony generators enable harmony numeric enable harmony string enable harmony math functions harmony_scoping harmony_symbols harmony_collections harmony_iteration harmony_strings harmony_scoping harmony_maths tracks arrays with only smi values Optimize object Array DOM strings and string pretenure call new trace pretenuring decisions of HAllocate instructions track fields with only smi values track fields with heap values track_fields track_fields Enables optimizations which favor memory size over execution speed use string slices optimization filter maximum number of GVN fix point iterations use function inlining use allocation folding eliminate write barriers targeting allocations in optimized code maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining crankshaft harvests type feedback from stub cache trace check elimination phase hydrogen tracing filter trace hydrogen to given file name trace inlining decisions trace store elimination trace all use positions trace global value numbering trace hydrogen escape analysis trace the tracking of allocation sites trace map generalization environment for every instruction deoptimize every n garbage collections put a break point before deoptimizing deoptimize uncommon cases use on stack replacement trace array bounds check elimination perform array index dehoisting use load elimination use store elimination use constant folding eliminate unreachable code number of stress runs when picking a function to watch for shared function not JSFunction itself flushes the cache of optimized code for closures on every GC functions with arguments object maximum number of escape analysis fix point iterations allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms concurrent on stack replacement do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes number of stack frames inspected by the profiler percentage of ICs that must have type info to allow optimization 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 VFP3 instructions if available enable use of NEON instructions if 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 d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long expose natives in global object expose freeBuffer extension expose gc extension under the specified name expose externalize string extension number of stack frames to capture disable builtin natives files print name of functions for which code is generated use random jit cookie to mask large constants trace lazy optimization use adaptive optimizations always try to OSR functions trace optimize function deoptimization minimum length for automatic enable preparsing maximum number of optimization attempts before giving up cache prototype transitions trace debugging JSON request response trace out of bounds accesses to external arrays trace_js_array_abuse automatically set the debug break flag when debugger commands are in the queue abort by crashing 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 statistics of the maximum memory committed for the heap in name
LSmiUntag(LOperand *value, bool needs_check)
HValue * hydrogen_value() const
LDivByPowerOf2I(LOperand *dividend, int32_t divisor)
virtual bool IsGap() const V8_OVERRIDE
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,"instance-of-known-global") Handle< JSFunction > function() const
SaveFPRegsMode save_doubles() const
int FalseDestination(LChunk *chunk)
LLoadGlobalGeneric(LOperand *context, LOperand *global_object)
LRegExpLiteral(LOperand *context)
#define DECLARE_OPCODE(type)
LInteger32ToDouble(LOperand *value)