28 #ifndef V8_X64_MACRO_ASSEMBLER_X64_H_
29 #define V8_X64_MACRO_ASSEMBLER_X64_H_
79 :
reg(index_register),
100 : variable_(&assembler->root_array_available_),
101 old_value_(assembler->root_array_available_) {
102 assembler->root_array_available_ =
false;
105 *variable_ = old_value_;
126 void Load(
Register destination, ExternalReference source);
184 Label* condition_met,
185 Label::Distance condition_met_distance = Label::kFar);
189 Label* if_deprecated);
196 Label::Distance distance = Label::kFar) {
197 InNewSpace(
object, scratch,
not_equal, branch, distance);
205 Label::Distance distance = Label::kFar) {
206 InNewSpace(
object, scratch,
equal, branch, distance);
214 Label::Distance on_black_distance = Label::kFar);
220 Label* not_data_object,
221 Label::Distance not_data_object_distance);
231 Label* object_is_white_and_not_data,
232 Label::Distance distance);
263 remembered_set_action,
294 #ifdef ENABLE_DEBUGGER_SUPPORT
311 void EnterExitFrame(
int arg_stack_space = 0,
bool save_doubles =
false);
336 ExternalReference roots_array_start =
337 ExternalReference::roots_array_start(
isolate());
347 const ParameterCount& expected,
348 const ParameterCount& actual,
355 const ParameterCount& actual,
360 const ParameterCount& expected,
361 const ParameterCount& actual,
366 const ParameterCount& expected,
367 const ParameterCount& actual,
440 Label::Distance near_jump = Label::kFar);
499 Label::Distance near_jump = Label::kFar);
503 Label::Distance near_jump = Label::kFar);
508 Label::Distance near_jump = Label::kFar);
513 Label::Distance near_jump = Label::kFar);
518 Label::Distance near_jump = Label::kFar);
525 Label::Distance near_jump = Label::kFar);
530 Label* on_not_both_smi,
531 Label::Distance near_jump = Label::kFar);
535 Label* on_not_both_smi,
536 Label::Distance near_jump = Label::kFar);
557 Label* bailout_label,
558 Label::Distance near_jump = Label::kFar);
571 Label* bailout_label,
572 Label::Distance near_jump = Label::kFar);
578 Label* on_smi_result,
579 Label::Distance near_jump = Label::kFar);
587 Label* on_not_smi_result,
588 Label::Distance near_jump = Label::kFar);
592 Label* on_not_smi_result,
593 Label::Distance near_jump = Label::kFar);
605 Label* on_not_smi_result,
606 Label::Distance near_jump = Label::kFar);
610 Label* on_not_smi_result,
611 Label::Distance near_jump = Label::kFar);
628 Label* on_not_smi_result,
629 Label::Distance near_jump = Label::kFar);
636 Label* on_not_smi_result,
637 Label::Distance near_jump = Label::kFar);
644 Label* on_not_smi_result,
645 Label::Distance near_jump = Label::kFar);
662 Label* on_not_smi_result,
663 Label::Distance near_jump = Label::kFar);
679 Label* on_not_smi_result,
680 Label::Distance near_jump = Label::kFar);
698 Label::Distance near_jump = Label::kFar);
719 LoadSmiConstant(dst, source);
723 Register constant = GetSmiConstant(source);
757 Label::Distance near_jump = Label::kFar);
765 Label* on_not_both_flat_ascii,
766 Label::Distance near_jump = Label::kFar);
774 Label*on_not_flat_ascii_string,
775 Label::Distance near_jump = Label::kFar);
778 Register first_object_instance_type,
779 Register second_object_instance_type,
783 Label::Distance near_jump = Label::kFar);
788 uint32_t encoding_mask);
792 Label::Distance distance = Label::kFar);
794 Label::Distance distance = Label::kFar);
837 void Drop(
int stack_elements);
842 void Push(Immediate value);
849 movp(dst, reinterpret_cast<void*>(ext.address()),
850 RelocInfo::EXTERNAL_REFERENCE);
857 ASSERT(rmode > RelocInfo::LAST_GCED_ENUM);
858 movp(dst, ptr, rmode);
863 ASSERT(!RelocInfo::IsNone(rmode));
864 ASSERT(value->IsHeapObject());
866 movp(dst, reinterpret_cast<void*>(value.location()), rmode);
870 void Jump(
Address destination, RelocInfo::Mode rmode);
871 void Jump(ExternalReference ext);
875 void Call(
Address destination, RelocInfo::Mode rmode);
876 void Call(ExternalReference ext);
879 RelocInfo::Mode rmode,
886 int CallSize(ExternalReference ext);
893 return (target.
high_bit() != 0) ? 3 : 2;
897 return (target.requires_rex() ? 2 : 1) + target.operand_size();
903 Call(
self, RelocInfo::CODE_TARGET);
930 Label::Distance distance = Label::kFar);
936 Label::Distance distance = Label::kFar);
942 Label::Distance distance = Label::kFar);
953 int elements_offset = 0);
1013 Label* conversion_failed, Label::Distance dst = Label::kFar);
1017 Label::Distance dst = Label::kFar);
1025 template<
typename Field>
1027 static const int shift = Field::kShift + kSmiShift;
1028 static const int mask = Field::kMask >> Field::kShift;
1029 shr(reg, Immediate(shift));
1030 andp(reg, Immediate(mask));
1031 shl(reg, Immediate(kSmiShift));
1155 Label* gc_required);
1164 Label* gc_required);
1170 Label* gc_required);
1177 Label* gc_required);
1181 Label* gc_required);
1188 Label* gc_required);
1192 Label* gc_required);
1204 JumpTarget* then_target);
1209 Register scratch, Label* then_label);
1219 bool miss_on_bound_function =
false);
1243 Label* no_map_match);
1317 Operand* context_restore_operand);
1333 void CallCFunction(ExternalReference
function,
int num_arguments);
1350 ASSERT(!code_object_.is_null());
1351 return code_object_;
1412 return SafepointRegisterStackIndex(reg.
code());
1422 Label* call_runtime);
1432 Label* no_memento_found);
1436 Label* memento_found) {
1437 Label no_memento_found;
1441 bind(&no_memento_found);
1452 static const int kNumSafepointSavedRegisters = 11;
1455 bool generating_stub_;
1457 bool root_array_available_;
1463 intptr_t RootRegisterDelta(ExternalReference other);
1472 void InvokePrologue(
const ParameterCount& expected,
1473 const ParameterCount& actual,
1477 bool* definitely_mismatches,
1479 Label::Distance near_jump = Label::kFar,
1482 void EnterExitFramePrologue(
bool save_rax);
1486 void EnterExitFrameEpilogue(
int arg_stack_space,
bool save_doubles);
1488 void LeaveExitFrameEpilogue(
bool restore_context);
1494 void LoadAllocationTopHelper(
Register result,
1500 void UpdateAllocationTopHelper(
Register result_end,
1516 Label::Distance distance = Label::kFar);
1522 inline void GetMarkBits(
Register addr_reg,
1528 void JumpToHandlerEntry();
1532 static int SafepointRegisterStackIndex(
int reg_code) {
1566 inline Operand
FieldOperand(Register
object,
int offset) {
1593 const int kShaddowSpace = 4;
1606 #ifdef GENERATED_CODE_COVERAGE
1607 extern void LogGeneratedCodeCoverage(
const char* file_line);
1608 #define CODE_COVERAGE_STRINGIFY(x) #x
1609 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1610 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1611 #define ACCESS_MASM(masm) { \
1612 Address x64_coverage_function = FUNCTION_ADDR(LogGeneratedCodeCoverage); \
1615 masm->Push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \
1616 masm->Call(x64_coverage_function, RelocInfo::EXTERNAL_REFERENCE); \
1623 #define ACCESS_MASM(masm) masm->
1628 #endif // V8_X64_MACRO_ASSEMBLER_X64_H_
void LoadUint32(XMMRegister dst, Register src, XMMRegister scratch)
static RelocInfo::Mode RelocInfoNone()
void SlowTruncateToI(Register result_reg, Register input_reg, int offset=HeapNumber::kValueOffset-kHeapObjectTag)
void JumpIfSmiEqualsConstant(Register src, Smi *constant, Label *on_equals, Label::Distance near_jump=Label::kFar)
void ClampUint8(Register output_reg, Register input_reg)
Isolate * isolate() const
void JumpIfNotString(Register object, Register object_map, Label *not_string, Label::Distance near_jump=Label::kFar)
void PushSafepointRegisters()
void CheckStackAlignment()
void SmiShiftArithmeticRight(Register dst, Register src1, Register src2)
void JumpIfNotValidSmiValue(Register src, Label *on_invalid, Label::Distance near_jump=Label::kFar)
static int SlotOffset(int index)
void LoadRootIndexed(Register destination, Register variable_offset, int fixed_offset)
void InvokeFunction(Register function, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
int LoadAddressSize(ExternalReference source)
void AssertRootValue(Register src, Heap::RootListIndex root_value_index, BailoutReason reason)
void RecordWriteContextSlot(Register context, int offset, Register value, Register scratch, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift)
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 SmiDiv(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
CodePatcher(byte *address, int instructions, FlushICache flush_cache=FLUSH)
void SmiOrIfSmis(Register dst, Register src1, Register src2, Label *on_not_smis, Label::Distance near_jump=Label::kFar)
void SmiOr(Register dst, Register src1, Register src2)
Condition IsObjectStringType(Register obj, Register type, Condition cond=al)
void AllocateTwoByteSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void PushInt64AsTwoSmis(Register src, Register scratch=kScratchRegister)
void Cvtlsi2sd(XMMRegister dst, Register src)
Condition CheckUInteger32ValidSmiValue(Register src)
static Smi * FromInt(int value)
void AssertString(Register object)
static TypeFeedbackId None()
void RecordWriteArray(Register array, Register value, Register index, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
void JumpToExternalReference(const ExternalReference &builtin)
void LoadInstanceDescriptors(Register map, Register descriptors)
void AllocateAsciiString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void JumpIfNotBothSequentialAsciiStrings(Register first, Register second, Register scratch1, Register scratch2, Label *not_flat_ascii_strings)
void LoadFromNumberDictionary(Label *miss, Register elements, Register key, Register result, Register t0, Register t1, Register t2)
int CallSize(Register target)
void JumpIfDictionaryInPrototypeChain(Register object, Register scratch0, Register scratch1, Label *found)
void CheckMap(Register obj, Register scratch, Handle< Map > map, Label *fail, SmiCheckType smi_check_type)
void SmiAdd(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void Store(Register src, const MemOperand &dst, Representation r)
void Move(Register dst, ExternalReference ext)
void GetBuiltinEntry(Register target, Builtins::JavaScript id)
void JumpIfSmi(Register value, Label *smi_label)
void DispatchMap(Register obj, Register scratch, Handle< Map > map, Handle< Code > success, SmiCheckType smi_check_type)
TypeImpl< ZoneTypeConfig > Type
bool AllowThisStubCall(CodeStub *stub)
int CallSize(Address destination)
void EnterFrame(StackFrame::Type type, bool load_constant_pool=false)
void StoreToSafepointRegisterSlot(Register src, Register dst)
void LeaveExitFrame(bool save_doubles, Register argument_count, bool restore_context)
void CheckSmiToIndicator(Register dst, Register src)
void CheckFastObjectElements(Register map, Register scratch, Label *fail)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
static const Function * FunctionForId(FunctionId id)
void InvokeCode(Register code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
SmiIndex SmiToIndex(Register dst, Register src, int shift)
void ThrowIf(Condition cc, BailoutReason reason)
#define ASSERT(condition)
void CompareMap(Register obj, Register scratch, Handle< Map > map, Label *early_success)
void AssertNotSmi(Register object)
void RecordWriteField(Register object, int offset, Register value, Register scratch, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
static const int kShortCallInstructionLength
Condition CheckIsMinSmi(Register src)
SmiOperationExecutionMode(byte bits)
void PushTryHandler(StackHandler::Kind kind, int handler_index)
void LoadTransitionedArrayMapConditional(ElementsKind expected_kind, ElementsKind transitioned_kind, Register map_in_out, Register scratch, Label *no_map_match)
void NumberOfOwnDescriptors(Register dst, Register map)
void SmiAndConstant(Register dst, Register src1, Smi *constant)
void SmiOrConstant(Register dst, Register src1, Smi *constant)
MemOperand GlobalObjectOperand()
void IncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
bool IsUnsafeInt(const int32_t x)
void SmiSub(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void Load(Register dst, const MemOperand &src, Representation r)
MemOperand ContextOperand(Register context, int index)
void SmiMod(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
Condition CheckBothSmi(Register first, Register second)
void AssertSmi(Register object)
void CompareRoot(Register obj, Heap::RootListIndex index)
void JumpIfNotUniqueName(Register reg, Label *not_unique_name)
void DecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
static int SafepointRegisterStackIndex(Register reg)
static const int kNumRegisters
void TruncatingDiv(Register result, Register dividend, int32_t divisor)
void EmitSeqStringSetCharCheck(Register string, Register index, Register value, uint32_t encoding_mask)
void Move(Register dst, Smi *source)
kInstanceClassNameOffset flag
void pushq(Immediate value)
Handle< Object > CodeObject()
void Abort(BailoutReason msg)
const Register kRootRegister
void PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void IsObjectNameType(Register object, Register scratch, Label *fail)
void JumpIfInNewSpace(Register object, Register scratch, Label *branch, Label::Distance distance=Label::kFar)
void JumpIfInstanceTypeIsNotSequentialAscii(Register type, Register scratch, Label *failure)
void PopReturnAddressTo(Register dst)
int CallSize(const Operand &target)
void LeaveApiExitFrame(bool restore_context)
void SmiToInteger64(Register dst, Register src)
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 mode(MIPS only)") DEFINE_string(expose_natives_as
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
void TestJSArrayForAllocationMemento(Register receiver_reg, Register scratch_reg, Label *no_memento_found)
void EnumLength(Register dst, Register map)
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
void CheckFastElements(Register map, Register scratch, Label *fail)
static const int kValueOffset
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 only print modified registers Don t break for ASM_UNIMPLEMENTED_BREAK macros print stack trace when an illegal exception is thrown randomize hashes to avoid predictable hash Fixed seed to use to hash property Print the time it takes to deserialize the snapshot testing_bool_flag testing_int_flag string flag tmp file in which to serialize heap Print the time it takes to lazily compile hydrogen code stubs concurrent_recompilation concurrent_sweeping Print usage including flags
void movp(Register dst, void *ptr, RelocInfo::Mode rmode)
void LoadGlobalFunction(int index, Register function)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met)
void Integer64PlusConstantToSmi(Register dst, Register src, int constant)
void TryGetFunctionPrototype(Register function, Register result, Register scratch, Label *miss, bool miss_on_bound_function=false)
void SmiMul(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void CallStub(CodeStub *stub, TypeFeedbackId ast_id=TypeFeedbackId::None(), Condition cond=al)
void SmiShiftLogicalRight(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void CallCFunction(ExternalReference function, int num_arguments)
void SafePush(const Immediate &x)
void DecodeField(Register reg)
void AllocateAsciiConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
Operand FieldOperand(Register object, int offset)
void SmiShiftLeftConstant(Register dst, Register src, int shift_value)
void CheckFastSmiElements(Register map, Register scratch, Label *fail)
void Jump(Register target, Condition cond=al)
void RecordWrite(Register object, Register address, Register value, LinkRegisterStatus lr_status, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK)
void JumpIfDataObject(Register value, Register scratch, Label *not_data_object)
void TruncateHeapNumberToI(Register result, Register object)
void SmiXorConstant(Register dst, Register src1, Smi *constant)
Operand ExternalOperand(ExternalReference reference, Register scratch=kScratchRegister)
friend class StandardFrame
void Allocate(int object_size, Register result, Register scratch1, Register scratch2, Label *gc_required, AllocationFlags flags)
void AllocateHeapNumber(Register result, Register scratch1, Register scratch2, Register heap_number_map, Label *gc_required, TaggingMode tagging_mode=TAG_RESULT)
void CopyBytes(Register src, Register dst, Register length, Register scratch)
void SmiXor(Register dst, Register src1, Register src2)
void SmiShiftLeft(Register dst, Register src1, Register src2)
void Throw(Register value)
Condition CheckInteger32ValidSmiValue(Register src)
void Move(Register dst, Handle< Object > 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 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 code(assertions) for debugging") DEFINE_bool(code_comments
void shl(Register dst, uint8_t imm8)
Operand StackSpaceOperand(int index)
void EnterApiExitFrame(int argc)
void PrepareCallApiFunction(int argc)
void set_has_frame(bool value)
void SetCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
SmiIndex(Register index_register, ScaleFactor scale)
void NegativeZeroTest(Register result, Register op, Label *then_label)
const int kRootRegisterBias
MacroAssembler(Isolate *isolate, void *buffer, int size)
void SmiCompareInteger32(const Operand &dst, Register src)
void LoadContext(Register dst, int context_chain_length)
void CallExternalReference(const ExternalReference &ext, int num_arguments)
static int CallSize(Register target, Condition cond=al)
void CallApiFunctionAndReturn(Register function_address, ExternalReference thunk_ref, int stack_space, MemOperand return_value_operand, MemOperand *context_restore_operand)
void JumpIfNotInNewSpace(Register object, Register scratch, Label *branch, Label::Distance distance=Label::kFar)
void AssertFastElements(Register elements)
void LoadAddress(Register destination, ExternalReference source)
void CheckMapDeprecated(Handle< Map > map, Register scratch, Label *if_deprecated)
void JumpIfNotBothSmi(Register reg1, Register reg2, Label *on_not_both_smi)
SmiOperationExecutionMode()
void JumpIfBlack(Register object, Register scratch0, Register scratch1, Label *on_black)
void ClampDoubleToUint8(Register result_reg, DwVfpRegister input_reg, LowDwVfpRegister double_scratch)
void SmiSubConstant(Register dst, Register src, Smi *constant)
void AllocateTwoByteConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void Move(Register dst, Handle< Object > value, RelocInfo::Mode rmode)
void SmiAnd(Register dst, Register src1, Register src2)
void Drop(int count, Condition cond=al)
void Integer32ToSmiField(const Operand &dst, Register src)
void JumpIfUIntNotValidSmiValue(Register src, Label *on_invalid, Label::Distance near_jump=Label::kFar)
void GetBuiltinFunction(Register target, Builtins::JavaScript id)
void IllegalOperation(int num_arguments)
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 shift
static const int kCallSequenceLength
void CheckAccessGlobalProxy(Register holder_reg, Register scratch, Label *miss)
void LookupNumberStringCache(Register object, Register result, Register scratch1, Register scratch2, Register scratch3, Label *not_found)
void DoubleToI(Register result_reg, XMMRegister input_reg, XMMRegister scratch, MinusZeroMode minus_zero_mode, Label *conversion_failed, Label::Distance dst=Label::kFar)
void TruncateDoubleToI(Register result, DwVfpRegister double_input)
NoRootArrayScope(MacroAssembler *assembler)
void AssertZeroExtended(Register reg)
void TaggedToI(Register result_reg, Register input_reg, XMMRegister temp, MinusZeroMode minus_zero_mode, Label *lost_precision)
void SmiTest(Register src)
void SmiShiftArithmeticRightConstant(Register dst, Register src, int shift_value)
void InitializeSmiConstantRegister()
void CallRuntimeSaveDoubles(Runtime::FunctionId id)
void ThrowUncatchable(Register value)
void StoreRoot(Register source, Heap::RootListIndex index, Condition cond=al)
void SmiCompare(Register smi1, Register smi2)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers, Register scratch)
const int kNumSafepointRegisters
void PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
const Register kScratchRegister
void LoadGlobalFunctionInitialMap(Register function, Register map, Register scratch)
void GetNumberHash(Register t0, Register scratch)
void CallRuntime(const Runtime::Function *f, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
Handle< Object > CodeObject()
void PositiveSmiDivPowerOfTwoToInteger32(Register dst, Register src, int power)
void JumpIfBothInstanceTypesAreNotSequentialAscii(Register first_object_instance_type, Register second_object_instance_type, Register scratch1, Register scratch2, Label *failure)
void MoveHeapObject(Register result, Handle< Object > object)
void Cmp(const Register &rn, const Operand &operand)
void SmiToInteger32(Register dst, Register src)
void UndoAllocationInNewSpace(Register object, Register scratch)
void Prologue(PrologueFrameMode frame_mode)
void SmiNot(Register dst, Register src)
void LoadFromSafepointRegisterSlot(Register dst, Register src)
void JumpIfJSArrayHasAllocationMemento(Register receiver_reg, Register scratch_reg, Label *memento_found)
void shr(Register dst, uint8_t imm8)
void Call(Register target, Condition cond=al)
void SmiShiftLogicalRightConstant(Register dst, Register src, int shift_value, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
Operand StackOperandForReturnAddress(int32_t disp)
void AllocateAsciiSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
Condition CheckNonNegativeSmi(Register src)
void set_generating_stub(bool value)
void Check(Condition cond, BailoutReason reason)
void CallRuntime(Runtime::FunctionId id, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void SmiAddConstant(Register dst, Register src, Smi *constant)
void JumpIfNotSmi(Register value, Label *not_smi_label)
void PopInt64AsTwoSmis(Register dst, Register scratch=kScratchRegister)
Condition CheckEitherSmi(Register first, Register second, Register scratch=kScratchRegister)
void SmiNeg(Register dst, Register src, Label *on_smi_result, Label::Distance near_jump=Label::kFar)
void Assert(Condition cond, BailoutReason reason)
void LoadGlobalCell(Register dst, Handle< Cell > cell)
const int kSmiConstantRegisterValue
void Move(Register dst, void *ptr, RelocInfo::Mode rmode)
void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag, const CallWrapper &call_wrapper=NullCallWrapper())
void AddSmiField(Register dst, const Operand &src)
void TestBit(const Operand &dst, int bit_index)
Condition CheckSmi(Register src)
void SelectNonSmi(Register dst, Register src1, Register src2, Label *on_not_smis, Label::Distance near_jump=Label::kFar)
void StoreNumberToDoubleElements(Register value_reg, Register key_reg, Register elements_reg, Register scratch1, LowDwVfpRegister double_scratch, Label *fail, int elements_offset=0)
void TailCallStub(CodeStub *stub, Condition cond=al)
void AssertName(Register object)
void EnsureNotWhite(Register object, Register scratch1, Register scratch2, Register scratch3, Label *object_is_white_and_not_data)
void InitializeRootRegister()
void Integer32ToSmi(Register dst, Register src)
int LeaveFrame(StackFrame::Type type)
const Register kSmiConstantRegister
void IndexFromHash(Register hash, Register index)
void TailCallExternalReference(const ExternalReference &ext, int num_arguments, int result_size)
Condition CheckBothNonNegativeSmi(Register first, Register second)
int ArgumentStackSlotsForCFunctionCall(int num_arguments)
void EnterExitFrame(bool save_doubles, int stack_space=0)
void InitializeFieldsWithFiller(Register start_offset, Register end_offset, Register filler)
int CallSize(Handle< Code > code_object)
void TailCallRuntime(Runtime::FunctionId fid, int num_arguments, int result_size)
void AllocateTwoByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void LoadRoot(Register destination, Heap::RootListIndex index, Condition cond=al)
void RememberedSetHelper(Register object, Register addr, Register scratch, SaveFPRegsMode save_fp, RememberedSetFinalAction and_then)
void JumpUnlessBothNonNegativeSmi(Register src1, Register src2, Label *on_not_both_smi, Label::Distance near_jump=Label::kFar)
void PositiveSmiTimesPowerOfTwoToInteger64(Register dst, Register src, int power)
void Test(const Operand &dst, Smi *source)
void Set(Register dst, int64_t x)
void PushRoot(Heap::RootListIndex index)
void SafeMove(Register dst, const Immediate &x)
void CmpObjectType(Register heap_object, InstanceType type, Register map)
void PushReturnAddressFrom(Register src)
void CmpInstanceType(Register map, InstanceType type)
void JumpUnlessNonNegativeSmi(Register src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
void PushAddress(ExternalReference source)
bool AreAliased(const CPURegister ®1, const CPURegister ®2, const CPURegister ®3=NoReg, const CPURegister ®4=NoReg, const CPURegister ®5=NoReg, const CPURegister ®6=NoReg, const CPURegister ®7=NoReg, const CPURegister ®8=NoReg)
void PushImm32(int32_t imm32)
void CheckEnumCache(Register null_value, Label *call_runtime)
void PopSafepointRegisters()
void AssertUndefinedOrAllocationSite(Register object, Register scratch)
void StubReturn(int argc)
void AssertNumber(Register object)
void Move(const Operand &dst, Smi *source)