28 #ifndef V8_X64_LITHIUM_X64_H_
29 #define V8_X64_LITHIUM_X64_H_
43 #define LITHIUM_CONCRETE_INSTRUCTION_LIST(V) \
44 V(AccessArgumentsAt) \
48 V(ArgumentsElements) \
56 V(CallWithDescriptor) \
62 V(CheckInstanceType) \
71 V(ClassOfTestAndBranch) \
72 V(CompareMinusZeroAndBranch) \
73 V(CompareNumericAndBranch) \
74 V(CmpObjectEqAndBranch) \
98 V(FlooringDivByConstI) \
99 V(FlooringDivByPowerOf2I) \
103 V(GetCachedArrayIndex) \
105 V(HasCachedArrayIndexAndBranch) \
106 V(HasInstanceTypeAndBranch) \
107 V(InnerAllocatedObject) \
109 V(InstanceOfKnownGlobal) \
111 V(Integer32ToDouble) \
113 V(IsConstructCallAndBranch) \
114 V(IsObjectAndBranch) \
115 V(IsStringAndBranch) \
117 V(IsUndetectableAndBranch) \
122 V(LoadFieldByIndex) \
123 V(LoadFunctionPrototype) \
125 V(LoadGlobalGeneric) \
127 V(LoadKeyedGeneric) \
129 V(LoadNamedGeneric) \
154 V(SeqStringGetChar) \
155 V(SeqStringSetChar) \
161 V(StoreContextSlot) \
164 V(StoreKeyedGeneric) \
166 V(StoreNamedGeneric) \
168 V(StringCharCodeAt) \
169 V(StringCharFromCode) \
170 V(StringCompareAndBranch) \
174 V(ToFastProperties) \
175 V(TransitionElementsKind) \
176 V(TrapAllocationMemento) \
178 V(TypeofIsAndBranch) \
184 #define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic) \
185 virtual Opcode opcode() const V8_FINAL V8_OVERRIDE { \
186 return LInstruction::k##type; \
188 virtual void CompileToNative(LCodeGen* generator) V8_FINAL V8_OVERRIDE; \
189 virtual const char* Mnemonic() const V8_FINAL V8_OVERRIDE { \
192 static L##type* cast(LInstruction* instr) { \
193 ASSERT(instr->Is##type()); \
194 return reinterpret_cast<L##type*>(instr); \
198 #define DECLARE_HYDROGEN_ACCESSOR(type) \
199 H##type* hydrogen() const { \
200 return H##type::cast(hydrogen_value()); \
204 class LInstruction :
public ZoneObject {
207 : environment_(
NULL),
208 hydrogen_value_(
NULL),
209 bit_field_(IsCallBits::encode(
false)) {
215 virtual const char*
Mnemonic()
const = 0;
222 #define DECLARE_OPCODE(type) k##type,
225 #undef DECLARE_OPCODE
231 #define DECLARE_PREDICATE(type) \
232 bool Is##type() const { return opcode() == k##type; }
234 #undef DECLARE_PREDICATE
238 virtual bool IsGap()
const {
return false; }
253 void MarkAsCall() { bit_field_ = IsCallBits::update(bit_field_,
true); }
254 bool IsCall()
const {
return IsCallBits::decode(bit_field_); }
285 virtual int InputCount() = 0;
286 virtual LOperand* InputAt(
int i) = 0;
289 virtual int TempCount() = 0;
290 virtual LOperand* TempAt(
int i) = 0;
292 class IsCallBits:
public BitField<bool, 0, 1> {};
294 LEnvironment* environment_;
295 SetOncePointer<LPointerMap> pointer_map_;
296 HValue* hydrogen_value_;
303 class LTemplateResultInstruction :
public LInstruction {
324 template<
int R,
int I,
int T>
325 class LTemplateInstruction :
public LTemplateResultInstruction<R> {
327 EmbeddedContainer<LOperand*, I>
inputs_;
328 EmbeddedContainer<LOperand*, T>
temps_;
340 class LGap :
public LTemplateInstruction<0, 0, 0> {
355 return reinterpret_cast<LGap*
>(instr);
360 HBasicBlock*
block()
const {
return block_; }
373 if (parallel_moves_[pos] ==
NULL) {
374 parallel_moves_[pos] =
new(zone) LParallelMove(zone);
376 return parallel_moves_[pos];
380 return parallel_moves_[pos];
389 class LInstructionGap
V8_FINAL :
public LGap {
394 return !IsRedundant();
401 class LGoto
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
403 explicit LGoto(HBasicBlock* block) : block_(block) { }
408 virtual
bool IsControl() const V8_OVERRIDE {
return true; }
410 int block_id()
const {
return block_->block_id(); }
417 class LLazyBailout
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
423 void set_gap_instructions_size(
int gap_instructions_size) {
424 gap_instructions_size_ = gap_instructions_size;
429 int gap_instructions_size_;
433 class LDummy
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
440 class LDummyUse
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
449 class LDeoptimize
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
456 class LLabel
V8_FINAL : public LGap {
459 : LGap(block), replacement_(
NULL) { }
468 int block_id()
const {
return block()->block_id(); }
478 LLabel* replacement_;
482 class LParameter
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
491 class LCallStub
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
494 inputs_[0] = context;
513 template<
int I,
int T>
514 class LControlInstruction :
public LTemplateInstruction<0, I, T> {
521 HBasicBlock*
SuccessorAt(
int i) {
return hydrogen()->SuccessorAt(i); }
531 if (true_label_ ==
NULL) {
537 if (false_label_ ==
NULL) {
557 class LWrapReceiver
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
560 inputs_[0] = receiver;
561 inputs_[1] =
function;
578 inputs_[0] =
function;
579 inputs_[1] = receiver;
581 inputs_[3] = elements;
593 class LAccessArgumentsAt
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
596 inputs_[0] = arguments;
614 inputs_[0] = elements;
623 class LArgumentsElements
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
630 class LModByPowerOf2I
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
633 inputs_[0] = dividend;
648 class LModByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 2> {
654 inputs_[0] = dividend;
673 class LModI
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
690 class LDivByPowerOf2I
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
693 inputs_[0] = dividend;
708 class LDivByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 2> {
714 inputs_[0] = dividend;
733 class LDivI
V8_FINAL : public LTemplateInstruction<1, 2, 1> {
750 class LFlooringDivByPowerOf2I
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
753 inputs_[0] = dividend;
761 "flooring-div-by-power-of-2-i")
769 class LFlooringDivByConstI
V8_FINAL : public LTemplateInstruction<1, 1, 3> {
776 inputs_[0] = dividend;
797 class LMulI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
823 "compare-numeric-and-branch")
826 Token::
Value op()
const {
return hydrogen()->token(); }
828 return hydrogen()->representation().IsDouble();
835 class LMathFloor
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
848 class LMathRound
V8_FINAL : public LTemplateInstruction<1, 1, 1> {
863 class LMathAbs
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
866 inputs_[1] = context;
878 class LMathLog
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
890 class LMathClz32
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
902 class LMathExp
V8_FINAL :
public LTemplateInstruction<1, 1, 2> {
908 ExternalReference::InitializeMathExpData();
919 class LMathSqrt
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
931 class LMathPowHalf
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
943 class LCmpObjectEqAndBranch
V8_FINAL :
public LControlInstruction<2, 0> {
957 class LCmpHoleAndBranch
V8_FINAL :
public LControlInstruction<1, 0> {
970 class LCompareMinusZeroAndBranch
V8_FINAL : public LControlInstruction<1, 0> {
979 "cmp-minus-zero-and-branch")
985 class LIsObjectAndBranch
V8_FINAL : public LControlInstruction<1, 0> {
1000 class LIsStringAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1013 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1017 class LIsSmiAndBranch
V8_FINAL : public LControlInstruction<1, 0> {
1028 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1032 class LIsUndetectableAndBranch
V8_FINAL : public LControlInstruction<1, 1> {
1043 "is-undetectable-and-branch")
1046 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1050 class LStringCompareAndBranch
V8_FINAL : public LControlInstruction<3, 0> {
1055 inputs_[0] = context;
1065 "string-compare-and-branch")
1068 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1074 class LHasInstanceTypeAndBranch
V8_FINAL :
public LControlInstruction<1, 0> {
1083 "has-instance-type-and-branch")
1086 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1090 class LGetCachedArrayIndex
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1103 class LHasCachedArrayIndexAndBranch
V8_FINAL
1104 : public LControlInstruction<1, 0> {
1113 "has-cached-array-index-and-branch")
1116 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1120 class LClassOfTestAndBranch
V8_FINAL : public LControlInstruction<1, 2> {
1133 "class-of-test-and-branch")
1136 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1140 class LCmpT
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1143 inputs_[0] = context;
1159 class LInstanceOf
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
1162 inputs_[0] = context;
1175 class LInstanceOfKnownGlobal
V8_FINAL :
public LTemplateInstruction<1, 2, 1> {
1178 inputs_[0] = context;
1188 "instance-of-known-global")
1193 return lazy_deopt_env_;
1196 LEnvironment* env) V8_OVERRIDE {
1197 lazy_deopt_env_ = env;
1201 LEnvironment* lazy_deopt_env_;
1205 class LBoundsCheck
V8_FINAL :
public LTemplateInstruction<0, 2, 0> {
1209 inputs_[1] = length;
1220 class LBitI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1237 class LShiftI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1240 : op_(op), can_deopt_(can_deopt) {
1258 class LSubI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1273 class LConstantI
V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1278 int32_t value()
const {
return hydrogen()->Integer32Value(); }
1282 class LConstantS
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1291 class LConstantD
V8_FINAL :
public LTemplateInstruction<1, 0, 1> {
1302 double value()
const {
return hydrogen()->DoubleValue(); }
1306 class LConstantE
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1311 ExternalReference value()
const {
1312 return hydrogen()->ExternalReferenceValue();
1317 class LConstantT
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1323 return hydrogen()->handle(isolate);
1328 class LBranch
V8_FINAL :
public LControlInstruction<1, 0> {
1339 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1343 class LDebugBreak
V8_FINAL : public LTemplateInstruction<0, 0, 0> {
1349 class LCmpMapAndBranch
V8_FINAL :
public LControlInstruction<1, 0> {
1364 class LMapEnumLength
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1376 class LDateField
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1393 class LSeqStringGetChar
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1396 inputs_[0] = string;
1408 class LSeqStringSetChar
V8_FINAL : public LTemplateInstruction<1, 4, 0> {
1414 inputs_[0] = context;
1415 inputs_[1] = string;
1429 class LAddI
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1441 add->BetterLeftOperand()->UseCount() > 1;
1449 class LMathMinMax
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1464 class LPower
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1479 class LArithmeticD
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1492 return LInstruction::kArithmeticD;
1495 virtual const char* Mnemonic() const V8_OVERRIDE;
1502 class LArithmeticT
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
1509 inputs_[0] = context;
1520 return LInstruction::kArithmeticT;
1523 virtual const char* Mnemonic() const V8_OVERRIDE;
1530 class LReturn
V8_FINAL : public LTemplateInstruction<0, 3, 0> {
1536 inputs_[1] = context;
1537 inputs_[2] = parameter_count;
1544 return parameter_count()->IsConstantOperand();
1547 ASSERT(has_constant_parameter_count());
1548 return LConstantOperand::cast(parameter_count());
1557 class LLoadNamedField
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1560 inputs_[0] = object;
1570 class LLoadNamedGeneric
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1573 inputs_[0] = context;
1574 inputs_[1] = object;
1586 class LLoadFunctionPrototype
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1589 inputs_[0] =
function;
1599 class LLoadRoot
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1604 Heap::RootListIndex index()
const {
return hydrogen()->index(); }
1608 class LLoadKeyed
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1611 inputs_[0] = elements;
1618 bool is_external()
const {
1619 return hydrogen()->is_external();
1622 return hydrogen()->is_fixed_typed_array();
1625 return is_external() || is_fixed_typed_array();
1632 return hydrogen()->elements_kind();
1637 class LLoadKeyedGeneric
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
1640 inputs_[0] = context;
1653 class LLoadGlobalCell
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1660 class LLoadGlobalGeneric
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
1663 inputs_[0] = context;
1664 inputs_[1] = global_object;
1677 class LStoreGlobalCell
V8_FINAL :
public LTemplateInstruction<0, 1, 1> {
1692 class LLoadContextSlot
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1695 inputs_[0] = context;
1703 int slot_index() {
return hydrogen()->slot_index(); }
1709 class LStoreContextSlot
V8_FINAL :
public LTemplateInstruction<0, 2, 1> {
1712 inputs_[0] = context;
1724 int slot_index() {
return hydrogen()->slot_index(); }
1730 class LPushArgument
V8_FINAL :
public LTemplateInstruction<0, 1, 0> {
1742 class LDrop
V8_FINAL :
public LTemplateInstruction<0, 0, 0> {
1744 explicit LDrop(
int count) : count_(count) { }
1755 class LStoreCodeEntry
V8_FINAL: public LTemplateInstruction<0, 1, 1> {
1758 inputs_[0] =
function;
1759 temps_[0] = code_object;
1772 class LInnerAllocatedObject
V8_FINAL: public LTemplateInstruction<1, 2, 0> {
1775 inputs_[0] = base_object;
1776 inputs_[1] = offset;
1788 class LThisFunction
V8_FINAL :
public LTemplateInstruction<1, 0, 0> {
1795 class LContext
V8_FINAL : public LTemplateInstruction<1, 0, 0> {
1802 class LDeclareGlobals
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
1805 inputs_[0] = context;
1815 class LCallJSFunction
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
1818 inputs_[0] =
function;
1826 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1828 int arity()
const {
return hydrogen()->argument_count() - 1; }
1832 class LCallWithDescriptor
V8_FINAL :
public LTemplateResultInstruction<1> {
1837 : inputs_(descriptor->environment_length() + 1, zone) {
1839 inputs_.AddAll(operands, zone);
1848 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1850 int arity()
const {
return hydrogen()->argument_count() - 1; }
1852 ZoneList<LOperand*> inputs_;
1855 virtual int InputCount()
V8_FINAL V8_OVERRIDE {
return inputs_.length(); }
1856 virtual LOperand* InputAt(
int i)
V8_FINAL V8_OVERRIDE {
return inputs_[i]; }
1858 virtual int TempCount()
V8_FINAL V8_OVERRIDE {
return 0; }
1859 virtual LOperand* TempAt(
int i)
V8_FINAL V8_OVERRIDE {
return NULL; }
1863 class LInvokeFunction
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1866 inputs_[0] = context;
1867 inputs_[1] =
function;
1876 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1878 int arity()
const {
return hydrogen()->argument_count() - 1; }
1882 class LCallFunction
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1885 inputs_[0] = context;
1886 inputs_[1] =
function;
1894 int arity()
const {
return hydrogen()->argument_count() - 1; }
1898 class LCallNew
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1901 inputs_[0] = context;
1902 inputs_[1] = constructor;
1911 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1913 int arity()
const {
return hydrogen()->argument_count() - 1; }
1917 class LCallNewArray
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
1920 inputs_[0] = context;
1921 inputs_[1] = constructor;
1930 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
1932 int arity()
const {
return hydrogen()->argument_count() - 1; }
1936 class LCallRuntime
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1939 inputs_[0] = context;
1947 virtual
bool ClobbersDoubleRegisters() const V8_OVERRIDE {
1952 int arity()
const {
return hydrogen()->argument_count(); }
1957 class LInteger32ToDouble
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1969 class LUint32ToDouble
V8_FINAL :
public LTemplateInstruction<1, 1, 1> {
1983 class LNumberTagI
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
1995 class LNumberTagU
V8_FINAL :
public LTemplateInstruction<1, 1, 2> {
2011 class LNumberTagD
V8_FINAL :
public LTemplateInstruction<1, 1, 1> {
2027 class LDoubleToI
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2038 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2042 class LDoubleToSmi
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2056 class LTaggedToI
V8_FINAL : public LTemplateInstruction<1, 1, 1> {
2069 bool truncating() {
return hydrogen()->CanTruncateToInt32(); }
2073 class LSmiTag
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2086 class LNumberUntagD
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2099 class LSmiUntag
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2102 : needs_check_(needs_check) {
2116 class LStoreNamedField
V8_FINAL : public LTemplateInstruction<0, 2, 1> {
2119 inputs_[0] = object;
2131 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2133 Handle<
Map> transition()
const {
return hydrogen()->transition_map(); }
2135 return hydrogen()->field_representation();
2140 class LStoreNamedGeneric
V8_FINAL :
public LTemplateInstruction<0, 3, 0> {
2143 inputs_[0] = context;
2144 inputs_[1] = object;
2155 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2162 class LStoreKeyed
V8_FINAL :
public LTemplateInstruction<0, 3, 0> {
2165 inputs_[0] = object;
2172 return hydrogen()->is_fixed_typed_array();
2175 return is_external() || is_fixed_typed_array();
2185 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2186 bool NeedsCanonicalization() {
return hydrogen()->NeedsCanonicalization(); }
2191 class LStoreKeyedGeneric
V8_FINAL :
public LTemplateInstruction<0, 4, 0> {
2197 inputs_[0] = context;
2198 inputs_[1] = object;
2211 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2217 class LTransitionElementsKind
V8_FINAL :
public LTemplateInstruction<0, 2, 2> {
2223 inputs_[0] = object;
2224 inputs_[1] = context;
2225 temps_[0] = new_map_temp;
2235 "transition-elements-kind")
2238 virtual
void PrintDataTo(
StringStream* stream) V8_OVERRIDE;
2240 Handle<
Map> original_map() {
return hydrogen()->original_map().handle(); }
2242 return hydrogen()->transitioned_map().handle();
2249 class LTrapAllocationMemento
V8_FINAL :
public LTemplateInstruction<0, 1, 1> {
2253 inputs_[0] = object;
2261 "trap-allocation-memento")
2265 class LStringAdd
V8_FINAL :
public LTemplateInstruction<1, 3, 0> {
2268 inputs_[0] = context;
2282 class LStringCharCodeAt
V8_FINAL : public LTemplateInstruction<1, 3, 0> {
2285 inputs_[0] = context;
2286 inputs_[1] = string;
2299 class LStringCharFromCode
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2302 inputs_[0] = context;
2303 inputs_[1] = char_code;
2314 class LCheckValue
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2327 class LCheckInstanceType
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2340 class LCheckMaps
V8_FINAL : public LTemplateInstruction<0, 1, 0> {
2353 class LCheckSmi
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2365 class LClampDToUint8
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2368 inputs_[0] = unclamped;
2377 class LClampIToUint8
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2380 inputs_[0] = unclamped;
2389 class LClampTToUint8
V8_FINAL :
public LTemplateInstruction<1, 1, 1> {
2393 inputs_[0] = unclamped;
2394 temps_[0] = temp_xmm;
2404 class LCheckNonSmi
V8_FINAL :
public LTemplateInstruction<0, 1, 0> {
2417 class LDoubleBits
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2430 class LConstructDouble
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2444 class LAllocate
V8_FINAL :
public LTemplateInstruction<1, 2, 1> {
2447 inputs_[0] = context;
2461 class LRegExpLiteral
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2464 inputs_[0] = context;
2474 class LFunctionLiteral
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2477 inputs_[0] = context;
2487 class LToFastProperties
V8_FINAL : public LTemplateInstruction<1, 1, 0> {
2500 class LTypeof
V8_FINAL : public LTemplateInstruction<1, 2, 0> {
2503 inputs_[0] = context;
2514 class LTypeofIsAndBranch
V8_FINAL :
public LControlInstruction<1, 0> {
2531 class LIsConstructCallAndBranch
V8_FINAL :
public LControlInstruction<0, 1> {
2540 "is-construct-call-and-branch")
2545 class LOsrEntry
V8_FINAL : public LTemplateInstruction<0, 0, 0> {
2556 class LStackCheck
V8_FINAL :
public LTemplateInstruction<0, 1, 0> {
2559 inputs_[0] = context;
2567 Label* done_label() {
return &done_label_; }
2574 class LForInPrepareMap
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2577 inputs_[0] = context;
2578 inputs_[1] = object;
2588 class LForInCacheArray
V8_FINAL :
public LTemplateInstruction<1, 1, 0> {
2599 return HForInCacheArray::cast(this->hydrogen_value())->idx();
2604 class LCheckMapValue
V8_FINAL :
public LTemplateInstruction<0, 2, 0> {
2618 class LLoadFieldByIndex
V8_FINAL :
public LTemplateInstruction<1, 2, 0> {
2621 inputs_[0] = object;
2632 class LChunkBuilder;
2633 class LPlatformChunk
V8_FINAL :
public LChunk {
2637 dehoisted_key_ids_(graph->GetMaximumValueID(), graph->zone()) { }
2643 return dehoisted_key_ids_.Contains(value->
id());
2651 class LChunkBuilder
V8_FINAL :
public LChunkBuilderBase {
2654 : LChunkBuilderBase(graph->zone()),
2659 current_instruction_(
NULL),
2660 current_block_(
NULL),
2662 allocator_(allocator) { }
2665 LPlatformChunk* Build();
2670 #define DECLARE_DO(type) LInstruction* Do##type(H##type* node);
2674 LInstruction* DoMathFloor(HUnaryMathOperation* instr);
2675 LInstruction* DoMathRound(HUnaryMathOperation* instr);
2676 LInstruction* DoMathAbs(HUnaryMathOperation* instr);
2677 LInstruction* DoMathLog(HUnaryMathOperation* instr);
2678 LInstruction* DoMathExp(HUnaryMathOperation* instr);
2679 LInstruction* DoMathSqrt(HUnaryMathOperation* instr);
2680 LInstruction* DoMathPowHalf(HUnaryMathOperation* instr);
2681 LInstruction* DoMathClz32(HUnaryMathOperation* instr);
2682 LInstruction* DoDivByPowerOf2I(HDiv* instr);
2683 LInstruction* DoDivByConstI(HDiv* instr);
2684 LInstruction* DoDivI(HBinaryOperation* instr);
2685 LInstruction* DoModByPowerOf2I(HMod* instr);
2686 LInstruction* DoModByConstI(HMod* instr);
2687 LInstruction* DoModI(HMod* instr);
2688 LInstruction* DoFlooringDivByPowerOf2I(HMathFloorOfDiv* instr);
2689 LInstruction* DoFlooringDivByConstI(HMathFloorOfDiv* instr);
2699 LPlatformChunk* chunk()
const {
return chunk_; }
2700 CompilationInfo*
info()
const {
return info_; }
2701 HGraph* graph()
const {
return graph_; }
2703 bool is_unused()
const {
return status_ == UNUSED; }
2704 bool is_building()
const {
return status_ == BUILDING; }
2705 bool is_done()
const {
return status_ ==
DONE; }
2706 bool is_aborted()
const {
return status_ == ABORTED; }
2711 LUnallocated* ToUnallocated(Register reg);
2712 LUnallocated* ToUnallocated(XMMRegister reg);
2716 MUST_USE_RESULT LOperand* UseFixed(HValue* value, Register fixed_register);
2718 XMMRegister fixed_register);
2747 MUST_USE_RESULT LOperand* UseRegisterOrConstantAtStart(HValue* value);
2763 LInstruction* Define(LTemplateResultInstruction<1>* instr,
2764 LUnallocated* result);
2765 LInstruction* DefineAsRegister(LTemplateResultInstruction<1>* instr);
2766 LInstruction* DefineAsSpilled(LTemplateResultInstruction<1>* instr,
2768 LInstruction* DefineSameAsFirst(LTemplateResultInstruction<1>* instr);
2769 LInstruction* DefineFixed(LTemplateResultInstruction<1>* instr,
2771 LInstruction* DefineFixedDouble(LTemplateResultInstruction<1>* instr,
2775 LInstruction* AssignEnvironment(LInstruction* instr);
2778 LInstruction* AssignPointerMap(LInstruction* instr);
2780 enum CanDeoptimize { CAN_DEOPTIMIZE_EAGERLY, CANNOT_DEOPTIMIZE_EAGERLY };
2785 LInstruction* MarkAsCall(
2786 LInstruction* instr,
2787 HInstruction* hinstr,
2788 CanDeoptimize can_deoptimize = CANNOT_DEOPTIMIZE_EAGERLY);
2790 void VisitInstruction(HInstruction* current);
2792 void DoBasicBlock(HBasicBlock* block, HBasicBlock* next_block);
2793 LInstruction* DoShift(
Token::Value op, HBitwiseBinaryOperation* instr);
2795 HArithmeticBinaryOperation* instr);
2797 HBinaryOperation* instr);
2798 void FindDehoistedKeyDefinitions(HValue* candidate);
2800 LPlatformChunk* chunk_;
2801 CompilationInfo* info_;
2802 HGraph*
const graph_;
2804 HInstruction* current_instruction_;
2805 HBasicBlock* current_block_;
2806 HBasicBlock* next_block_;
2807 LAllocator* allocator_;
2812 #undef DECLARE_HYDROGEN_ACCESSOR
2813 #undef DECLARE_CONCRETE_INSTRUCTION
2817 #endif // V8_X64_LITHIUM_X64_H_
LCallFunction(LOperand *context, LOperand *function)
LSeqStringSetChar(LOperand *context, LOperand *string, LOperand *index, 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)
LModByConstI(LOperand *dividend, int32_t divisor, LOperand *temp1, LOperand *temp2)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env) V8_OVERRIDE
virtual Opcode opcode() const V8_OVERRIDE
LCmpObjectEqAndBranch(LOperand *left, LOperand *right)
friend class TempIterator
static LGap * cast(LInstruction *instr)
LClampTToUint8(LOperand *unclamped, LOperand *temp_xmm)
virtual void SetDeferredLazyDeoptimizationEnvironment(LEnvironment *env)
LPower(LOperand *left, LOperand *right)
void set_pointer_map(LPointerMap *p)
bool IsMarkedAsCall() const
virtual bool HasInterestingComment(LCodeGen *gen) const V8_OVERRIDE
LModI(LOperand *left, LOperand *right, LOperand *temp)
LCheckInstanceType(LOperand *value)
LMathFloor(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 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)
virtual void PrintDataTo(StringStream *stream) V8_OVERRIDE
virtual void PrintOutputOperandTo(StringStream *stream)
EmbeddedContainer< LOperand *, T > temps_
LMathClz32(LOperand *value)
LForInCacheArray(LOperand *map)
static Smi * FromInt(int value)
LInstanceOf(LOperand *context, LOperand *left, LOperand *right)
LFlooringDivByConstI(LOperand *dividend, int32_t divisor, LOperand *temp1, LOperand *temp2, LOperand *temp3)
LParallelMove * GetOrCreateParallelMove(InnerPosition pos, Zone *zone)
#define DECLARE_OPCODE(type)
bool is_loop_header() const
virtual bool MustSignExtendResult(LPlatformChunk *chunk) const
LStringAdd(LOperand *context, LOperand *left, LOperand *right)
LDummyUse(LOperand *value)
int environment_length() const
LLabel(HBasicBlock *block)
LStoreNamedGeneric(LOperand *context, LOperand *object, LOperand *value)
Handle< Object > name() const
LConstantD(LOperand *temp)
LBoundsCheck(LOperand *index, LOperand *length)
LMathPowHalf(LOperand *value)
LIsConstructCallAndBranch(LOperand *temp)
LEnvironment * environment() const
LArithmeticD(Token::Value op, LOperand *left, LOperand *right)
#define ASSERT(condition)
LArithmeticT(Token::Value op, LOperand *context, LOperand *left, LOperand *right)
LCompareMinusZeroAndBranch(LOperand *value)
bool is_typed_elements() const
LConstantOperand * constant_parameter_count()
virtual bool IsGap() const V8_FINAL V8_OVERRIDE
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)
LTypeofIsAndBranch(LOperand *value)
EmbeddedContainer< LOperand *, R > results_
LCmpT(LOperand *context, LOperand *left, LOperand *right)
virtual void PrintDataTo(StringStream *stream)
LCheckMapValue(LOperand *value, LOperand *map)
#define LITHIUM_CONCRETE_INSTRUCTION_LIST(V)
LFlooringDivByPowerOf2I(LOperand *dividend, int32_t divisor)
LNumberTagD(LOperand *value, LOperand *temp)
LCheckMaps(LOperand *value)
LCallNewArray(LOperand *context, LOperand *constructor)
LOperand * parameter_count()
friend class InputIterator
virtual bool ClobbersDoubleRegisters() const
LCallJSFunction(LOperand *function)
Label * FalseLabel(LChunk *chunk)
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)
LClassOfTestAndBranch(LOperand *value, LOperand *temp, LOperand *temp2)
LAccessArgumentsAt(LOperand *arguments, LOperand *length, LOperand *index)
LDoubleToSmi(LOperand *value)
bool has_constant_parameter_count()
LClampDToUint8(LOperand *unclamped)
#define DECLARE_PREDICATE(type)
LDivByConstI(LOperand *dividend, int32_t divisor, LOperand *temp1, LOperand *temp2)
void set_hydrogen_value(HValue *value)
LMathExp(LOperand *value, LOperand *temp1, LOperand *temp2)
#define HYDROGEN_CONCRETE_INSTRUCTION_LIST(V)
LLoadContextSlot(LOperand *context)
LIsSmiAndBranch(LOperand *value)
LCmpHoleAndBranch(LOperand *object)
virtual bool HasResult() const =0
LDoubleToI(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 size
LOperand * base_object() const
virtual Opcode opcode() const =0
LTypeof(LOperand *context, LOperand *value)
LModByPowerOf2I(LOperand *dividend, int32_t divisor)
LCallNew(LOperand *context, LOperand *constructor)
LMathAbs(LOperand *context, LOperand *value)
LCheckValue(LOperand *value)
LPlatformChunk(CompilationInfo *info, HGraph *graph)
int TrueDestination(LChunk *chunk)
LCmpMapAndBranch(LOperand *value)
LOperand * new_map_temp()
HBasicBlock * SuccessorAt(int i)
virtual bool IsControl() const V8_FINAL V8_OVERRIDE
int gap_instructions_size()
LDeclareGlobals(LOperand *context)
LDivI(LOperand *left, LOperand *right, LOperand *temp)
LNumberTagI(LOperand *value)
bool HasEnvironment() const
LArgumentsLength(LOperand *elements)
LCompareNumericAndBranch(LOperand *left, LOperand *right)
ElementsKind elements_kind() const
LIsObjectAndBranch(LOperand *value)
#define DISALLOW_COPY_AND_ASSIGN(TypeName)
LTaggedToI(LOperand *value, LOperand *temp)
bool HasReplacement() const
LMathSqrt(LOperand *value)
LIsUndetectableAndBranch(LOperand *value, LOperand *temp)
LToFastProperties(LOperand *value)
LLoadKeyedGeneric(LOperand *context, LOperand *obj, LOperand *key)
DECLARE_CONCRETE_INSTRUCTION(CompareNumericAndBranch,"compare-numeric-and-branch") Token bool is_double() const
LMapEnumLength(LOperand *value)
HBasicBlock * block() const
virtual void PrintTo(StringStream *stream)
LOperand * global_object()
LLoadKeyed(LOperand *elements, LOperand *key)
LStoreKeyedGeneric(LOperand *context, LOperand *object, LOperand *key, LOperand *value)
#define DECLARE_HYDROGEN_ACCESSOR(type)
#define T(name, string, precedence)
LReturn(LOperand *value, LOperand *context, LOperand *parameter_count)
STATIC_ASSERT(R==0||R==1)
LMathMinMax(LOperand *left, LOperand *right)
bool ClobbersTemps() const
LAllocate(LOperand *context, LOperand *size, LOperand *temp)
virtual bool IsControl() const
LPointerMap * pointer_map() const
void set_replacement(LLabel *label)
LStoreCodeEntry(LOperand *function, LOperand *code_object)
LStoreContextSlot(LOperand *context, LOperand *value, 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
LMathLog(LOperand *value)
LSeqStringGetChar(LOperand *string, LOperand *index)
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)
LHasInstanceTypeAndBranch(LOperand *value)
LCheckSmi(LOperand *value)
virtual bool MustSignExtendResult(LPlatformChunk *chunk) const V8_FINAL V8_OVERRIDE
Label * TrueLabel(LChunk *chunk)
LShiftI(Token::Value op, LOperand *left, LOperand *right, bool can_deopt)
LCallWithDescriptor(const CallInterfaceDescriptor *descriptor, ZoneList< LOperand * > &operands, Zone *zone)
LNumberUntagD(LOperand *value)
virtual void CompileToNative(LCodeGen *generator)=0
LLabel * replacement() const
LStoreGlobalCell(LOperand *value, LOperand *temp)
LDoubleBits(LOperand *value)
Handle< Map > transitioned_map()
LEnvironment * GetDeferredLazyDeoptimizationEnvironment()
virtual bool HasResult() const V8_FINAL V8_OVERRIDE
uint32_t additional_index() const
LLoadNamedGeneric(LOperand *context, LOperand *object)
LMathRound(LOperand *value, LOperand *temp)
bool IsDehoistedKey(HValue *value)
LWrapReceiver(LOperand *receiver, LOperand *function)
LCheckNonSmi(LOperand *value)
LParallelMove * GetParallelMove(InnerPosition pos)
bool ClobbersRegisters() const
LStringCompareAndBranch(LOperand *context, LOperand *left, LOperand *right)
LForInPrepareMap(LOperand *context, LOperand *object)
Label * GetAssemblyLabel(int block_id) const
LTransitionElementsKind(LOperand *object, LOperand *context, LOperand *new_map_temp, LOperand *temp)
bool is_fixed_typed_array() const
void set_result(LOperand *operand)
bool HasPointerMap() const
LInstructionGap(HBasicBlock *block)
LPushArgument(LOperand *value)
LOperand * string() const
LStoreKeyed(LOperand *object, LOperand *key, LOperand *value)
LFunctionLiteral(LOperand *context)
LInvokeFunction(LOperand *context, LOperand *function)
LMulI(LOperand *left, LOperand *right)
LStackCheck(LOperand *context)
int LookupDestination(int block_id) const
LInstanceOfKnownGlobal(LOperand *context, LOperand *value, LOperand *temp)
LStringCharFromCode(LOperand *context, LOperand *char_code)
LInnerAllocatedObject(LOperand *base_object, LOperand *offset)
LStoreNamedField(LOperand *object, LOperand *value, 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 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
static HValue * cast(HValue *value)
LLoadFunctionPrototype(LOperand *function)
LSmiUntag(LOperand *value, bool needs_check)
HValue * hydrogen_value() const
LDivByPowerOf2I(LOperand *dividend, int32_t divisor)
DECLARE_CONCRETE_INSTRUCTION(InstanceOfKnownGlobal,"instance-of-known-global") Handle< JSFunction > function() const
LUint32ToDouble(LOperand *value, LOperand *temp)
SaveFPRegsMode save_doubles() const
int FalseDestination(LChunk *chunk)
LLoadGlobalGeneric(LOperand *context, LOperand *global_object)
BitVector * GetDehoistedKeyIds()
LRegExpLiteral(LOperand *context)
LTrapAllocationMemento(LOperand *object, LOperand *temp)
LInteger32ToDouble(LOperand *value)
static bool UseLea(HAdd *add)
#define DECLARE_CONCRETE_INSTRUCTION(type, mnemonic)
LHasCachedArrayIndexAndBranch(LOperand *value)
LConstructDouble(LOperand *hi, LOperand *lo)