5 #ifndef V8_X64_MACRO_ASSEMBLER_X64_H_
6 #define V8_X64_MACRO_ASSEMBLER_X64_H_
70 :
reg(index_register),
96 *variable_ = old_value_;
175 Label* condition_met,
176 Label::Distance condition_met_distance = Label::kFar);
180 Label* if_deprecated);
187 Label::Distance distance = Label::kFar) {
196 Label::Distance distance = Label::kFar) {
205 Label::Distance on_black_distance = Label::kFar);
211 Label* not_data_object,
212 Label::Distance not_data_object_distance);
222 Label* object_is_white_and_not_data,
223 Label::Distance distance);
258 remembered_set_action,
260 pointers_to_here_check_for_value);
341 ExternalReference roots_array_start =
342 ExternalReference::roots_array_start(
isolate());
352 const ParameterCount& expected,
353 const ParameterCount& actual,
360 const ParameterCount& actual,
365 const ParameterCount& expected,
366 const ParameterCount& actual,
371 const ParameterCount& expected,
372 const ParameterCount& actual,
445 Label::Distance near_jump = Label::kFar);
504 Label::Distance near_jump = Label::kFar);
508 Label::Distance near_jump = Label::kFar);
512 Label::Distance near_jump = Label::kFar);
516 Label::Distance near_jump = Label::kFar);
521 Label::Distance near_jump = Label::kFar);
526 Label::Distance near_jump = Label::kFar);
531 Label::Distance near_jump = Label::kFar);
538 Label::Distance near_jump = Label::kFar);
543 Label* on_not_both_smi,
544 Label::Distance near_jump = Label::kFar);
548 Label* on_not_both_smi,
549 Label::Distance near_jump = Label::kFar);
570 Label* bailout_label,
571 Label::Distance near_jump = Label::kFar);
584 Label* bailout_label,
585 Label::Distance near_jump = Label::kFar);
591 Label* on_smi_result,
592 Label::Distance near_jump = Label::kFar);
600 Label* on_not_smi_result,
601 Label::Distance near_jump = Label::kFar);
605 Label* on_not_smi_result,
606 Label::Distance near_jump = Label::kFar);
618 Label* on_not_smi_result,
619 Label::Distance near_jump = Label::kFar);
623 Label* on_not_smi_result,
624 Label::Distance near_jump = Label::kFar);
641 Label* on_not_smi_result,
642 Label::Distance near_jump = Label::kFar);
649 Label* on_not_smi_result,
650 Label::Distance near_jump = Label::kFar);
657 Label* on_not_smi_result,
658 Label::Distance near_jump = Label::kFar);
672 Label* on_not_smi_result =
NULL,
673 Label::Distance near_jump = Label::kFar);
677 Label* on_not_smi_result,
678 Label::Distance near_jump = Label::kFar);
688 Label* on_not_smi_result =
NULL,
689 Label::Distance near_jump = Label::kFar);
696 Label* on_not_smi_result,
697 Label::Distance near_jump = Label::kFar);
715 Label::Distance near_jump = Label::kFar);
774 Label::Distance near_jump = Label::kFar);
779 Register scratch2, Label* on_not_both_flat_one_byte,
780 Label::Distance near_jump = Label::kFar);
787 Label* on_not_flat_one_byte_string,
788 Label::Distance near_jump = Label::kFar);
793 Label::Distance near_jump = Label::kFar);
802 Label::Distance distance = Label::kFar);
804 Label::Distance distance = Label::kFar);
871 movp(dst,
reinterpret_cast<void*
>(ext.address()),
880 movp(dst, ptr, rmode);
886 DCHECK(value->IsHeapObject());
888 movp(dst,
reinterpret_cast<void*
>(value.location()), rmode);
893 void Jump(ExternalReference ext);
898 void Call(ExternalReference ext);
915 return (target.
high_bit() != 0) ? 3 : 2;
919 return (target.requires_rex() ? 2 : 1) + target.operand_size();
952 Label::Distance distance = Label::kFar);
958 Label::Distance distance = Label::kFar);
964 Label::Distance distance = Label::kFar);
975 int elements_offset = 0);
1035 Label* lost_precision, Label* is_nan, Label* minus_zero,
1036 Label::Distance dst = Label::kFar);
1044 template<
typename Field>
1046 static const int shift = Field::kShift;
1047 static const int mask = Field::kMask >> Field::kShift;
1054 template<
typename Field>
1060 static const int shift = Field::kShift;
1061 static const int mask = (Field::kMask >> Field::kShift) <<
kSmiTagSize;
1064 DCHECK((mask & 0x80000000u) == 0);
1199 Label* gc_required);
1202 Register scratch3, Label* gc_required);
1209 Label* gc_required);
1211 Register scratch2, Label* gc_required);
1218 Label* gc_required);
1220 Register scratch2, Label* gc_required);
1232 JumpTarget* then_target);
1237 Register scratch, Label* then_label);
1247 bool miss_on_bound_function =
false);
1267 Label* no_map_match);
1337 ExternalReference thunk_ref,
1341 Operand* context_restore_operand);
1446 Label* call_runtime);
1456 Label* no_memento_found);
1460 Label* memento_found) {
1461 Label no_memento_found;
1465 bind(&no_memento_found);
1497 const ParameterCount& actual,
1501 bool* definitely_mismatches,
1503 Label::Distance near_jump = Label::kFar,
1538 Label::Distance distance = Label::kFar);
1588 inline Operand
FieldOperand(Register
object,
int offset) {
1615 const int kShaddowSpace = 4;
1628 #ifdef GENERATED_CODE_COVERAGE
1629 extern void LogGeneratedCodeCoverage(
const char* file_line);
1630 #define CODE_COVERAGE_STRINGIFY(x) #x
1631 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1632 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1633 #define ACCESS_MASM(masm) { \
1634 Address x64_coverage_function = FUNCTION_ADDR(LogGeneratedCodeCoverage); \
1637 masm->Push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \
1638 masm->Call(x64_coverage_function, RelocInfo::EXTERNAL_REFERENCE); \
1645 #define ACCESS_MASM(masm) masm->
Isolate * isolate() const
static const int kShortCallInstructionLength
static const int kCallSequenceLength
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void movp(Register dst, void *ptr, RelocInfo::Mode rmode)
void shift(Register dst, Immediate shift_amount, int subcode, int size)
void pushq(Immediate value)
static RelocInfo::Mode RelocInfoNone()
CodePatcher(byte *address, int size)
static int SlotOffset(int index)
static const int kValueOffset
NoRootArrayScope(MacroAssembler *assembler)
void Move(Register dst, Handle< Object > value, RelocInfo::Mode rmode)
void Move(const Operand &dst, Handle< Object > source)
void SmiOr(Register dst, Register src1, Register src2)
void CallStub(CodeStub *stub, TypeFeedbackId ast_id=TypeFeedbackId::None())
void Test(const Operand &dst, Smi *source)
void Move(Register target, Register source)
void JumpIfNotUniqueNameInstanceType(Operand operand, Label *not_unique_name, Label::Distance distance=Label::kFar)
void JumpIfNotUniqueNameInstanceType(Register reg, Label *not_unique_name, Label::Distance distance=Label::kFar)
void PushRoot(Heap::RootListIndex index)
void Push(Immediate value)
void EnterExitFramePrologue(bool save_rax)
void LeaveExitFrame(bool save_doubles=false)
void SmiCompare(Register dst, const Operand &src)
void LoadAllocationTopHelper(Register result, Register scratch, AllocationFlags flags)
void NegativeZeroTest(Register result, Register op1, Register op2, Register scratch, Label *then_label)
void SmiAddConstant(const Operand &dst, Smi *constant)
void InitializeRootRegister()
void IncrementCounter(StatsCounter *counter, int value)
void StubReturn(int argc)
void JumpIfNotValidSmiValue(Register src, Label *on_invalid, Label::Distance near_jump=Label::kFar)
void Call(Register target, Condition cond=al)
void SmiMul(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void SmiShiftLeft(Register dst, Register src1, Register src2, Label *on_not_smi_result=NULL, Label::Distance near_jump=Label::kFar)
void CheckSmiToIndicator(Register dst, Register src)
void RecordWriteField(Register object, int offset, Register value, Register scratch, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK, PointersToHereCheck pointers_to_here_check_for_value=kPointersToHereMaybeInteresting)
void Cmp(Register dst, Handle< Object > source)
void UpdateAllocationTopHelper(Register result_end, Register scratch, AllocationFlags flags)
void LoadAddress(Register destination, ExternalReference source)
void PushTryHandler(StackHandler::Kind kind, int handler_index)
void PushAddress(ExternalReference source)
void DecodeFieldToSmi(Register reg)
void CheckFastSmiElements(Register map, Label *fail, Label::Distance distance=Label::kFar)
void DecodeField(Register reg)
Operand SafepointRegisterSlot(Register reg)
void AllocateOneByteSlicedString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void JumpToHandlerEntry()
void EnsureNotWhite(Register object, Register scratch1, Register scratch2, Label *object_is_white_and_not_data, Label::Distance distance)
void CallCFunction(ExternalReference function, int num_arguments)
void AssertName(Register object)
void AddSmiField(Register dst, const Operand &src)
void JumpUnlessBothNonNegativeSmi(Register src1, Register src2, Label *on_not_both_smi, Label::Distance near_jump=Label::kFar)
void InvokePrologue(const ParameterCount &expected, const ParameterCount &actual, Handle< Code > code_constant, Register code_register, Label *done, bool *definitely_mismatches, InvokeFlag flag, Label::Distance near_jump=Label::kFar, const CallWrapper &call_wrapper=NullCallWrapper())
void InvokeFunction(Handle< JSFunction > function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void StoreNumberToDoubleElements(Register maybe_number, Register elements, Register index, XMMRegister xmm_scratch, Label *fail, int elements_offset=0)
void AllocateOneByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void SmiSub(Register dst, Register src1, const Operand &src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void MoveHeapObject(Register result, Handle< Object > object)
void EnterFrame(StackFrame::Type type)
void SmiAdd(Register dst, Register src1, const Operand &src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void LoadContext(Register dst, int context_chain_length)
void LoadTransitionedArrayMapConditional(ElementsKind expected_kind, ElementsKind transitioned_kind, Register map_in_out, Register scratch, Label *no_map_match)
void TryGetFunctionPrototype(Register function, Register result, Label *miss, bool miss_on_bound_function=false)
void JumpIfValidSmiValue(Register src, Label *on_valid, Label::Distance near_jump=Label::kFar)
Handle< Object > CodeObject()
void Move(Register dst, void *ptr, RelocInfo::Mode rmode)
void SmiNeg(Register dst, Register src, Label *on_smi_result, Label::Distance near_jump=Label::kFar)
void Push(Handle< Object > source)
void LoadRoot(Register destination, Heap::RootListIndex index)
void Move(Register dst, Handle< Object > source)
Handle< Object > code_object_
void InitializeFieldsWithFiller(Register start_offset, Register end_offset, Register filler)
void CallRuntime(Runtime::FunctionId id, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void SmiXor(Register dst, Register src1, Register src2)
void PopRegisterAsTwoSmis(Register dst, Register scratch=kScratchRegister)
static const int kSmiShift
void JumpUnlessNonNegativeSmi(Register src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
void AssertSmi(const Operand &object)
void CallRuntime(const Runtime::Function *f, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void Store(ExternalReference destination, Register source)
void JumpIfSmiEqualsConstant(Register src, Smi *constant, Label *on_equals, Label::Distance near_jump=Label::kFar)
void CompareMap(Register obj, Handle< Map > map)
void AssertNumber(Register object)
Condition CheckEitherSmi(Register first, Register second, Register scratch=kScratchRegister)
void Move(Register dst, Smi *source)
void JumpIfDataObject(Register value, Register scratch, Label *not_data_object, Label::Distance not_data_object_distance)
void InvokeFunction(Register function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void AssertZeroExtended(Register reg)
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, PointersToHereCheck pointers_to_here_check_for_value=kPointersToHereMaybeInteresting)
int LoadAddressSize(ExternalReference source)
void CopyBytes(Register destination, Register source, Register length, int min_length=0, Register scratch=kScratchRegister)
void SmiNot(Register dst, Register src)
void SmiShiftLogicalRightConstant(Register dst, Register src, int shift_value, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void InNewSpace(Register object, Register scratch, Condition cond, Label *branch)
void JumpIfNotSmi(Register src, Label *on_not_smi, Label::Distance near_jump=Label::kFar)
void JumpIfNotBothSmi(Register src1, Register src2, Label *on_not_both_smi, Label::Distance near_jump=Label::kFar)
void PopQuad(const Operand &dst)
void Jump(Address destination, RelocInfo::Mode rmode)
void CompareRoot(Register with, Heap::RootListIndex index)
void RecordWriteArray(Register array, Register value, Register index, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK, PointersToHereCheck pointers_to_here_check_for_value=kPointersToHereMaybeInteresting)
void CheckMapDeprecated(Handle< Map > map, Register scratch, Label *if_deprecated)
void CheckMap(Register obj, Handle< Map > map, Label *fail, SmiCheckType smi_check_type)
void CheckSmiToIndicator(Register dst, const Operand &src)
Condition CheckUInteger32ValidSmiValue(Register src)
void Cmp(const Operand &dst, Smi *src)
void AllocateTwoByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag, const CallWrapper &call_wrapper=NullCallWrapper())
void PushCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
void EnumLength(Register dst, Register map)
void TailCallStub(CodeStub *stub)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void SelectNonSmi(Register dst, Register src1, Register src2, Label *on_not_smis, Label::Distance near_jump=Label::kFar)
void PositiveSmiTimesPowerOfTwoToInteger64(Register dst, Register src, int power)
void SmiSubConstant(Register dst, Register src, Smi *constant, SmiOperationExecutionMode mode, Label *bailout_label, Label::Distance near_jump=Label::kFar)
static int SafepointRegisterStackIndex(int reg_code)
static const int kSafepointPushRegisterIndices[Register::kNumRegisters]
void JumpIfBothInstanceTypesAreNotSequentialOneByte(Register first_object_instance_type, Register second_object_instance_type, Register scratch1, Register scratch2, Label *on_fail, Label::Distance near_jump=Label::kFar)
void CheckEnumCache(Register null_value, Label *call_runtime)
int CallSize(Register target)
void SmiAddConstant(Register dst, Register src, Smi *constant, SmiOperationExecutionMode mode, Label *bailout_label, Label::Distance near_jump=Label::kFar)
void Load(Register destination, ExternalReference source)
void CompareRoot(const Operand &with, Heap::RootListIndex index)
void SmiAddConstant(Register dst, Register src, Smi *constant)
void Throw(Register value)
void NegativeZeroTest(Register result, Register op, Label *then_label)
void StoreRoot(Register source, Heap::RootListIndex index)
static const int kNumSafepointSavedRegisters
void PushQuad(const Operand &src)
void Integer64PlusConstantToSmi(Register dst, Register src, int constant)
void SmiDiv(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void Move(Register dst, Handle< Object > value)
void SmiAdd(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void SmiSub(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void PushRegisterAsTwoSmis(Register src, Register scratch=kScratchRegister)
void SmiMod(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void JumpIfNotBothSequentialOneByteStrings(Register first_object, Register second_object, Register scratch1, Register scratch2, Label *on_not_both_flat_one_byte, Label::Distance near_jump=Label::kFar)
SmiIndex SmiToIndex(Register dst, Register src, int shift)
void Cvtlsi2sd(XMMRegister dst, const Operand &src)
void AssertString(Register object)
int ArgumentStackSlotsForCFunctionCall(int num_arguments)
int CallSize(const Operand &target)
void InitializeSmiConstantRegister()
void AssertFastElements(Register elements)
void SmiAndConstant(Register dst, Register src1, Smi *constant)
void Call(ExternalReference ext)
bool AllowThisStubCall(CodeStub *stub)
void Allocate(Register object_size, Register result, Register result_end, Register scratch, Label *gc_required, AllocationFlags flags)
void Abort(BailoutReason msg)
void Call(Address destination, RelocInfo::Mode rmode)
void JumpIfNotInNewSpace(Register object, Register scratch, Label *branch, Label::Distance distance=Label::kFar)
void LoadFromNumberDictionary(Label *miss, Register elements, Register key, Register r0, Register r1, Register r2, Register result)
void CmpObjectType(Register heap_object, InstanceType type, Register map)
void SmiToInteger32(Register dst, Register src)
void Integer32ToSmi(Register dst, Register src)
void IndexFromHash(Register hash, Register index)
void GetBuiltinFunction(Register target, Builtins::JavaScript id)
void Allocate(int header_size, ScaleFactor element_size, Register element_count, Register result, Register result_end, Register scratch, Label *gc_required, AllocationFlags flags)
void LeaveFrame(StackFrame::Type type)
void ClampUint8(Register reg)
void Jump(ExternalReference ext)
void EnterExitFrameEpilogue(int arg_stack_space, bool save_doubles)
void TruncatingDiv(Register dividend, int32_t divisor)
Condition CheckInteger32ValidSmiValue(Register src)
void CheckFastElements(Register map, Label *fail, Label::Distance distance=Label::kFar)
void DispatchMap(Register obj, Register unused, Handle< Map > map, Handle< Code > success, SmiCheckType smi_check_type)
void TailCallExternalReference(const ExternalReference &ext, int num_arguments, int result_size)
void LoadGlobalCell(Register dst, Handle< Cell > cell)
void Allocate(int object_size, Register result, Register result_end, Register scratch, Label *gc_required, AllocationFlags flags)
void InvokeFunction(Register function, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
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, PointersToHereCheck pointers_to_here_check_for_value=kPointersToHereMaybeInteresting)
void CheckAccessGlobalProxy(Register holder_reg, Register scratch, Label *miss)
void AllocateTwoByteSlicedString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void SmiSub(Register dst, Register src1, const Operand &src2)
void SmiCompare(Register dst, Smi *src)
void EmitSeqStringSetCharCheck(Register string, Register index, Register value, uint32_t encoding_mask)
void set_generating_stub(bool value)
Condition CheckNonNegativeSmi(Register src)
void InvokeCode(Register code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void JumpIfInstanceTypeIsNotSequentialOneByte(Register instance_type, Register scratch, Label *on_not_flat_one_byte_string, Label::Distance near_jump=Label::kFar)
void TruncateDoubleToI(Register result_reg, XMMRegister input_reg)
void DropUnderReturnAddress(int stack_elements, Register scratch=kScratchRegister)
void Set(Register dst, int64_t x)
void Drop(int stack_elements)
void SmiToInteger32(Register dst, const Operand &src)
void DoubleToI(Register result_reg, XMMRegister input_reg, XMMRegister scratch, MinusZeroMode minus_zero_mode, Label *lost_precision, Label *is_nan, Label *minus_zero, Label::Distance dst=Label::kFar)
void PrepareCallApiFunction(int arg_stack_space)
void JumpIfBlack(Register object, Register scratch0, Register scratch1, Label *on_black, Label::Distance on_black_distance=Label::kFar)
void LoadInstanceDescriptors(Register map, Register descriptors)
void set_has_frame(bool value)
void InNewSpace(Register object, Register scratch, Condition cc, Label *branch, Label::Distance distance=Label::kFar)
void Integer32ToSmiField(const Operand &dst, Register src)
void SmiSub(Register dst, Register src1, Register src2)
void Cvtlsi2sd(XMMRegister dst, Register src)
void Ret(int bytes_dropped, Register scratch)
void ClampDoubleToUint8(XMMRegister input_reg, XMMRegister temp_xmm_reg, Register result_reg)
void MakeSureDoubleAlignedHelper(Register result, Register scratch, Label *gc_required, AllocationFlags flags)
void PushImm32(int32_t imm32)
void CallCFunction(Register function, int num_arguments)
void EnterExitFrame(int arg_stack_space=0, bool save_doubles=false)
void AllocateHeapNumber(Register result, Register scratch, Label *gc_required, MutableMode mode=IMMUTABLE)
void Push(const Operand &src)
void CmpInstanceType(Register map, InstanceType type)
void GetNumberHash(Register r0, Register scratch)
void TailCallRuntime(Runtime::FunctionId fid, int num_arguments, int result_size)
void Set(const Operand &dst, intptr_t x)
void LeaveExitFrameEpilogue(bool restore_context)
void SafeMove(Register dst, Smi *src)
void SmiXorConstant(Register dst, Register src1, Smi *constant)
void AllocateTwoByteConsString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void JumpIfInNewSpace(Register object, Register scratch, Label *branch, Label::Distance distance=Label::kFar)
void Move(Register dst, ExternalReference ext)
SmiIndex SmiToNegativeIndex(Register dst, Register src, int shift)
void LeaveApiExitFrame(bool restore_context)
void Jump(const Operand &op)
void CheckStackAlignment()
void CallApiFunctionAndReturn(Register function_address, ExternalReference thunk_ref, Register thunk_last_arg, int stack_space, Operand return_value_operand, Operand *context_restore_operand)
void SmiShiftArithmeticRightConstant(Register dst, Register src, int shift_value)
void Prologue(bool code_pre_aging)
void GetMarkBits(Register addr_reg, Register bitmap_reg, Register mask_reg)
void TruncateHeapNumberToI(Register result_reg, Register input_reg)
void UndoAllocationInNewSpace(Register object)
Register GetSmiConstant(Smi *value)
Condition IsObjectNameType(Register heap_object, Register map, Register instance_type)
void DecrementCounter(StatsCounter *counter, int value)
MacroAssembler(Isolate *isolate, void *buffer, int size)
void StoreToSafepointRegisterSlot(Register dst, const Immediate &imm)
void SmiAnd(Register dst, Register src1, Register src2)
void SmiCompare(const Operand &dst, Smi *src)
Condition CheckBothNonNegativeSmi(Register first, Register second)
void SmiShiftArithmeticRight(Register dst, Register src1, Register src2)
void LoadFromSafepointRegisterSlot(Register dst, Register src)
Condition CheckIsMinSmi(Register src)
void Jump(Handle< Code > code_object, RelocInfo::Mode rmode)
void CallExternalReference(const ExternalReference &ext, int num_arguments)
void TestBitSharedFunctionInfoSpecialField(Register base, int offset, int bit_index)
int CallSize(Handle< Code > code_object)
void SmiTest(Register src)
void SmiToInteger64(Register dst, const Operand &src)
void PushReturnAddressFrom(Register src)
void LookupNumberStringCache(Register object, Register result, Register scratch1, Register scratch2, Label *not_found)
bool IsUnsafeInt(const int32_t x)
void Call(Handle< Code > code_object, RelocInfo::Mode rmode, TypeFeedbackId ast_id=TypeFeedbackId::None())
Condition CheckSmi(const Operand &src)
void SmiCompareInteger32(const Operand &dst, Register src)
void LoadGlobalFunction(int index, Register function)
void PushSafepointRegisters()
void AssertSmi(Register object)
void Call(const Operand &op)
int CallSize(Address destination)
void AllocateOneByteConsString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void JumpToExternalReference(const ExternalReference &ext, int result_size)
void JumpIfNotString(Register object, Register object_map, Label *not_string, Label::Distance near_jump=Label::kFar)
void PopSafepointRegisters()
void SetCounter(StatsCounter *counter, int value)
void RecordWrite(Register object, Register address, Register value, SaveFPRegsMode save_fp, RememberedSetAction remembered_set_action=EMIT_REMEMBERED_SET, SmiCheck smi_check=INLINE_SMI_CHECK, PointersToHereCheck pointers_to_here_check_for_value=kPointersToHereMaybeInteresting)
void Load(Register dst, const Operand &src, Representation r)
void AssertUndefinedOrAllocationSite(Register object)
void SmiCompare(const Operand &dst, Register src)
void PrepareCallCFunction(int num_arguments)
void JumpIfUIntValidSmiValue(Register src, Label *on_valid, Label::Distance near_jump=Label::kFar)
void PositiveSmiDivPowerOfTwoToInteger32(Register dst, Register src, int power)
void Cmp(Register dst, Smi *src)
void SmiOrIfSmis(Register dst, Register src1, Register src2, Label *on_not_smis, Label::Distance near_jump=Label::kFar)
void JumpIfUIntNotValidSmiValue(Register src, Label *on_invalid, Label::Distance near_jump=Label::kFar)
void SmiSubConstant(Register dst, Register src, Smi *constant)
void CheckFastObjectElements(Register map, Label *fail, Label::Distance distance=Label::kFar)
void SmiOrConstant(Register dst, Register src1, Smi *constant)
void ThrowUncatchable(Register value)
void RememberedSetHelper(Register object, Register addr, Register scratch, SaveFPRegsMode save_fp, RememberedSetFinalAction and_then)
void LoadSmiConstant(Register dst, Smi *value)
void EnterApiExitFrame(int arg_stack_space)
void GetBuiltinEntry(Register target, Builtins::JavaScript id)
Operand ExternalOperand(ExternalReference reference, Register scratch=kScratchRegister)
bool root_array_available_
void TestJSArrayForAllocationMemento(Register receiver_reg, Register scratch_reg, Label *no_memento_found)
void SmiShiftLogicalRight(Register dst, Register src1, Register src2, Label *on_not_smi_result, Label::Distance near_jump=Label::kFar)
void JumpIfJSArrayHasAllocationMemento(Register receiver_reg, Register scratch_reg, Label *memento_found)
void SmiCompare(Register smi1, Register smi2)
void NegativeZeroTest(CodeGenerator *cgen, Register result, Register op, JumpTarget *then_target)
void Assert(Condition cc, BailoutReason reason)
void StoreToSafepointRegisterSlot(Register dst, Register src)
void SmiAdd(Register dst, Register src1, Register src2)
Condition CheckBothSmi(Register first, Register second)
void LoadSharedFunctionInfoSpecialField(Register dst, Register base, int offset)
Condition CheckSmi(Register src)
void LoadUint32(XMMRegister dst, Register src)
int64_t RootRegisterDelta(ExternalReference other)
void NumberOfOwnDescriptors(Register dst, Register map)
void RecordWriteForMap(Register object, Register map, Register dst, SaveFPRegsMode save_fp)
void SmiShiftLeftConstant(Register dst, Register src, int shift_value, Label *on_not_smi_result=NULL, Label::Distance near_jump=Label::kFar)
void JumpIfSmi(Register src, Label *on_smi, Label::Distance near_jump=Label::kFar)
int CallSize(ExternalReference ext)
void SmiToInteger64(Register dst, Register src)
void Cmp(const Operand &dst, Handle< Object > source)
void PopCallerSaved(SaveFPRegsMode fp_mode, Register exclusion1=no_reg, Register exclusion2=no_reg, Register exclusion3=no_reg)
Condition IsObjectStringType(Register heap_object, Register map, Register instance_type)
void Check(Condition cc, BailoutReason reason)
void PopReturnAddressTo(Register dst)
void JumpIfDictionaryInPrototypeChain(Register object, Register scratch0, Register scratch1, Label *found)
void AssertNotSmi(Register object)
static int SafepointRegisterStackIndex(Register reg)
void LoadGlobalFunctionInitialMap(Register function, Register map)
void Pop(const Operand &dst)
void Move(const Operand &dst, Smi *source)
void Store(const Operand &dst, Register src, Representation r)
Handle< Object > CodeObject()
void SlowTruncateToI(Register result_reg, Register input_reg, int offset=HeapNumber::kValueOffset - kHeapObjectTag)
void AssertRootValue(Register src, Heap::RootListIndex root_value_index, BailoutReason reason)
void LoadRootIndexed(Register destination, Register variable_offset, int fixed_offset)
void CallRuntimeSaveDoubles(Runtime::FunctionId id)
static bool IsNone(Mode mode)
static const Function * FunctionForId(FunctionId id)
SmiOperationExecutionMode(byte bits)
SmiOperationExecutionMode()
static Smi * FromInt(int value)
static TypeFeedbackId None()
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf map
enable harmony numeric enable harmony object literal extensions Optimize object size
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long mode(MIPS only)") DEFINE_BOOL(enable_always_align_csp
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
#define DCHECK(condition)
const Register kRootRegister
MemOperand ContextOperand(Register context, int index)
Operand StackOperandForReturnAddress(int32_t disp)
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)
TypeImpl< ZoneTypeConfig > Type
const Register kScratchRegister
Operand StackSpaceOperand(int index)
const int kSmiConstantRegisterValue
const int kNumSafepointRegisters
Operand FieldOperand(Register object, int offset)
const Register kSmiConstantRegister
static bool SmiValuesAre32Bits()
const int kRootRegisterBias
kFeedbackVectorOffset flag
static bool SmiValuesAre31Bits()
MemOperand GlobalObjectOperand()
STATIC_ASSERT(sizeof(CPURegister)==sizeof(Register))
@ PRESERVE_SOURCE_REGISTER
@ kPointersToHereMaybeInteresting
@ kPointersToHereAreAlwaysInteresting
Debugger support for the V8 JavaScript engine.
static const int kNumRegisters
SmiIndex(Register index_register, ScaleFactor scale)