5 #ifndef V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
6 #define V8_MIPS_MACRO_ASSEMBLER_MIPS_H_
127 class MacroAssembler:
public Assembler {
136 #define COND_TYPED_ARGS Condition cond, Register r1, const Operand& r2
137 #define COND_ARGS cond, r1, r2
140 #define DECLARE_NORELOC_PROTOTYPE(Name, target_type) \
141 void Name(target_type target, BranchDelaySlot bd = PROTECT); \
142 inline void Name(BranchDelaySlot bd, target_type target) { \
145 void Name(target_type target, \
147 BranchDelaySlot bd = PROTECT); \
148 inline void Name(BranchDelaySlot bd, \
149 target_type target, \
151 Name(target, COND_ARGS, bd); \
154 #define DECLARE_BRANCH_PROTOTYPES(Name) \
155 DECLARE_NORELOC_PROTOTYPE(Name, Label*) \
156 DECLARE_NORELOC_PROTOTYPE(Name, int16_t)
162 #undef DECLARE_BRANCH_PROTOTYPES
163 #undef COND_TYPED_ARGS
168 #define COND_ARGS Condition cond = al, Register rs = zero_reg, \
169 const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
190 Ret(cond, rs, rt, bd);
237 Mfhc1(dst_high, src);
241 Mfhc1(dst_high, src);
250 Mthc1(src_high, dst);
314 Label* condition_met);
318 Label* if_deprecated);
358 Label* object_is_white_and_not_data);
364 Label* not_data_object);
402 remembered_set_action,
404 pointers_to_here_check_for_value);
460 return IsNop(instr, type);
472 bool sllzz = (opcode ==
SLL &&
523 Register scratch3, Label* gc_required);
560 #define DEFINE_INSTRUCTION(instr) \
561 void instr(Register rd, Register rs, const Operand& rt); \
562 void instr(Register rd, Register rs, Register rt) { \
563 instr(rd, rs, Operand(rt)); \
565 void instr(Register rs, Register rt, int32_t j) { \
566 instr(rs, rt, Operand(j)); \
569 #define DEFINE_INSTRUCTION2(instr) \
570 void instr(Register rs, const Operand& rt); \
571 void instr(Register rs, Register rt) { \
572 instr(rs, Operand(rt)); \
574 void instr(Register rs, int32_t j) { \
575 instr(rs, Operand(j)); \
578 #define DEFINE_INSTRUCTION3(instr) \
579 void instr(Register rd_hi, Register rd_lo, Register rs, const Operand& rt); \
580 void instr(Register rd_hi, Register rd_lo, Register rs, Register rt) { \
581 instr(rd_hi, rd_lo, rs, Operand(rt)); \
583 void instr(Register rd_hi, Register rd_lo, Register rs, int32_t j) { \
584 instr(rd_hi, rd_lo, rs, Operand(j)); \
615 #undef DEFINE_INSTRUCTION
616 #undef DEFINE_INSTRUCTION2
784 BranchF(target, nan,
cc, cmp1, cmp2, bd);
872 int stack_space = 0);
877 bool restore_context,
897 Label* no_map_match);
908 ExternalReference roots_array_start =
909 ExternalReference::roots_array_start(
isolate());
918 const ParameterCount& expected,
919 const ParameterCount& actual,
926 const ParameterCount& actual,
931 const ParameterCount& expected,
932 const ParameterCount& actual,
937 const ParameterCount& expected,
938 const ParameterCount& actual,
1012 bool miss_on_bound_function =
false);
1046 int elements_offset = 0);
1055 Label* early_success,
1063 Label* early_success,
1192 #define COND_ARGS Condition cond = al, Register rs = zero_reg, \
1193 const Operand& rt = Operand(zero_reg), BranchDelaySlot bd = PROTECT
1241 int num_double_arguments);
1253 int num_double_registers,
1270 int num_reg_arguments,
1271 int num_double_arguments);
1273 int num_reg_arguments,
1274 int num_double_arguments);
1291 ExternalReference thunk_ref,
1369 Label* not_power_of_two_or_zero);
1375 Addu(reg, reg, reg);
1383 Addu(dst, src, src);
1390 TrySmiTag(reg, reg, scratch, not_a_smi);
1433 Label* not_smi_label,
1466 Label* on_not_heap_number);
1515 Label* not_flat_one_byte_strings);
1528 template<
typename Field>
1530 Ext(dst, src, Field::kShift, Field::kSize);
1533 template<
typename Field>
1535 DecodeField<Field>(reg, reg);
1538 template<
typename Field>
1540 static const int shift = Field::kShift;
1555 template<
typename Field>
1557 DecodeField<Field>(reg, reg);
1590 Label* no_memento_found,
1592 Label* allocation_memento_present =
NULL);
1596 Label* memento_found) {
1597 Label no_memento_found;
1599 &no_memento_found,
eq, memento_found);
1600 bind(&no_memento_found);
1609 int num_reg_arguments,
1610 int num_double_arguments);
1626 const ParameterCount& actual,
1630 bool* definitely_mismatches,
1716 #ifdef GENERATED_CODE_COVERAGE
1717 #define CODE_COVERAGE_STRINGIFY(x) #x
1718 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1719 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1720 #define ACCESS_MASM(masm) masm->stop(__FILE_LINE__); masm->
1722 #define ACCESS_MASM(masm) masm->
Isolate * isolate() const
void lbu(Register rd, const MemOperand &rs)
void hint(SystemHint code)
void mov_d(FPURegister fd, FPURegister fs)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
static bool IsNop(Instr instr, int type=NON_MARKING_NOP)
void mtc1(Register rt, FPURegister fs)
void lw(Register rd, const MemOperand &rs)
void shift(Register dst, Immediate shift_amount, int subcode, int size)
void or_(Register dst, int32_t imm32)
void srl(Register rd, Register rt, uint16_t sa)
void sll(Register rd, Register rt, uint16_t sa, bool coming_from_nop=false)
void mfc1(Register rt, FPURegister fs)
void sw(Register rd, const MemOperand &rs)
void sra(Register rt, Register rd, uint16_t sa)
void ChangeBranchCondition(Condition cond)
CodePatcher(byte *address, int instructions, FlushICache flush_cache=FLUSH)
static int SlotOffset(int index)
static const int kMapOffset
void Clz(Register rd, Register rs)
void Mul(const Register &rd, const Register &rn, const Register &rm)
void Trunc_uw_d(FPURegister fd, Register rs, FPURegister scratch)
void MovToFloatParameters(DoubleRegister src1, DoubleRegister src2)
void Ret(BranchDelaySlot bd, Condition cond=al, Register rs=zero_reg, const Operand &rt=Operand(zero_reg))
void CopyBytes(Register src, Register dst, Register length, Register scratch)
void Pop(Register src1, Register src2, Register src3)
void InitializeRootRegister()
void GetObjectType(Register function, Register map, Register type_reg)
void JumpIfDataObject(Register value, Register scratch, Label *not_data_object)
void CompareMapAndBranch(Register obj_map, Handle< Map > map, Label *early_success, Condition cond, Label *branch_to)
void Store(Register src, const MemOperand &dst, Representation r)
void Check(Condition cc, BailoutReason reason, Register rs, Operand rt)
void BranchAndLinkShort(int16_t offset, Condition cond, Register rs, const Operand &rt, BranchDelaySlot bdslot=PROTECT)
void RetOnNoOverflow(Register overflow_check, BranchDelaySlot bd=PROTECT)
void BranchAndLinkShort(Label *L, BranchDelaySlot bdslot=PROTECT)
void JumpIfBothInstanceTypesAreNotSequentialOneByte(Register first_object_instance_type, Register second_object_instance_type, Register scratch1, Register scratch2, Label *failure)
void GetLeastBitsFromInt32(Register dst, Register src, int mun_least_bits)
void PushTryHandler(StackHandler::Kind kind, int handler_index)
void DecodeFieldToSmi(Register reg)
void TrySmiTag(Register dst, Register src, Register scratch, Label *not_a_smi)
void DecodeField(Register reg)
void Jalr(Label *L, BranchDelaySlot bdslot)
void LoadRoot(Register destination, Heap::RootListIndex index, Condition cond, Register src1, const Operand &src2)
void InitializeNewString(Register string, Register length, Heap::RootListIndex map_index, Register scratch1, Register scratch2)
void Move(FPURegister dst, FPURegister src)
void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits)
void JumpToHandlerEntry()
void Swap(Register reg1, Register reg2, Register scratch=no_reg)
void CallCFunction(ExternalReference function, int num_arguments)
void AssertName(Register object)
int CalculateStackPassedWords(int num_reg_arguments, int num_double_arguments)
void GetRelocatedValue(Register li_location, Register value, Register scratch)
void InvokeFunction(Handle< JSFunction > function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void Neg(const Register &rd, const Operand &operand)
void AllocateOneByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void TruncateDoubleToI(Register result, DoubleRegister double_input)
void RecordWriteForMap(Register object, Register map, Register dst, RAStatus ra_status, SaveFPRegsMode save_fp)
void EnterFrame(StackFrame::Type type)
void IsObjectNameType(Register object, Register scratch, Label *fail)
void CheckFastSmiElements(Register map, Register scratch, Label *fail)
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 MultiPushReversedFPU(RegList regs)
void LoadNumberAsInt32(Register object, Register dst, Register heap_number_map, Register scratch1, Register scratch2, FPURegister double_scratch0, FPURegister double_scratch1, Label *not_int32)
void Move(FPURegister dst, double imm)
void IsObjectJSStringType(Register object, Register scratch, Label *fail)
void DecodeField(Register dst, Register src)
void LeaveExitFrame(bool save_doubles, Register arg_count, bool restore_context, bool do_return=NO_EMIT_RETURN)
void AllocateHeapNumberWithValue(Register result, FPURegister value, Register scratch1, Register scratch2, Label *gc_required)
Handle< Object > CodeObject()
void Call(Register target, COND_ARGS)
int CallSize(Handle< Code > code, RelocInfo::Mode rmode=RelocInfo::CODE_TARGET, TypeFeedbackId ast_id=TypeFeedbackId::None(), COND_ARGS)
void LoadRoot(Register destination, Heap::RootListIndex index)
Handle< Object > code_object_
void InitializeFieldsWithFiller(Register start_offset, Register end_offset, Register filler)
void li(Register rd, int32_t j, LiFlags mode=OPTIMIZE_SIZE)
void CallRuntime(Runtime::FunctionId id, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void Movz(Register rd, Register rs, Register rt)
void PatchRelocatedValue(Register li_location, Register scratch, Register new_value)
void ClampUint8(Register output_reg, Register input_reg)
void JumpIfNotUniqueNameInstanceType(Register reg, Label *not_unique_name)
void MultiPushFPU(RegList regs)
void UndoAllocationInNewSpace(Register object, Register scratch)
void CallRuntime(const Runtime::Function *f, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void Call(Handle< Code > code, RelocInfo::Mode rmode=RelocInfo::CODE_TARGET, TypeFeedbackId ast_id=TypeFeedbackId::None(), COND_ARGS)
void Move(Register dst, Register src)
void EnsureNotWhite(Register object, Register scratch1, Register scratch2, Register scratch3, Label *object_is_white_and_not_data)
void InvokeFunction(Register function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void Jr(Label *L, BranchDelaySlot bdslot)
void Jump(intptr_t target, RelocInfo::Mode rmode, COND_ARGS)
void StoreRoot(Register source, Heap::RootListIndex index, Condition cond, Register src1, const Operand &src2)
void JumpIfInNewSpace(Register object, Register scratch, Label *branch)
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)
Condition IsObjectStringType(Register obj, Register type, Register result)
void InNewSpace(Register object, Register scratch, Condition cond, Label *branch)
static bool IsMarkedCode(Instr instr, int type)
void mov(Register rd, Register rt)
void CheckMapDeprecated(Handle< Map > map, Register scratch, Label *if_deprecated)
void TryGetFunctionPrototype(Register function, Register result, Register scratch, Label *miss, bool miss_on_bound_function=false)
void SmiTagCheckOverflow(Register dst, Register src, Register overflow)
void UntagAndJumpIfNotSmi(Register dst, Register src, Label *non_smi_case)
static int ActivationFrameAlignment()
void AllocateTwoByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void PrepareCallCFunction(int num_reg_arguments, Register scratch)
void MultiPush(RegList regs)
void InvokeBuiltin(Builtins::JavaScript id, InvokeFlag flag, const CallWrapper &call_wrapper=NullCallWrapper())
void BranchAndLinkShort(int16_t offset, BranchDelaySlot bdslot=PROTECT)
void JumpIfNotInNewSpace(Register object, Register scratch, Label *branch)
void Jump(Register target, COND_ARGS)
void FmoveHigh(Register dst_high, FPURegister src)
void EnumLength(Register dst, Register map)
void Ror(const Register &rd, const Register &rs, unsigned shift)
void BranchF(BranchDelaySlot bd, Label *target, Label *nan, Condition cc, FPURegister cmp1, FPURegister cmp2)
void SmiUntag(Register dst, Register src)
void Move(FPURegister dst, Register src_low, Register src_high)
void CallJSExitStub(CodeStub *stub)
void MultiPopReversed(RegList regs)
void AllocateOneByteSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void RecordWriteContextSlot(Register context, int offset, Register value, Register scratch, RAStatus ra_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)
static int SafepointRegisterStackIndex(int reg_code)
void Trunc_w_d(FPURegister fd, FPURegister fs)
void AssertStackIsAligned()
Handle< Code > ResolveBuiltin(Builtins::JavaScript id, bool *resolved)
void NonNegativeSmiTst(Register value, Register scratch)
STATIC_ASSERT((reg_zero==(reg_not_zero ^ 1)) &&(reg_bit_clear==(reg_bit_set ^ 1)) &&(always==(never ^ 1)))
void LoadGlobalFunctionInitialMap(Register function, Register map, Register scratch)
void CheckEnumCache(Register null_value, Label *call_runtime)
void TailCallStub(CodeStub *stub, COND_ARGS)
void JumpToExternalReference(const ExternalReference &builtin, BranchDelaySlot bd=PROTECT)
void JumpIfNotSmi(Register value, Label *not_smi_label, Register scratch=at, BranchDelaySlot bd=PROTECT)
static int GetCodeMarker(Instr instr)
void Assert(Condition cc, BailoutReason reason, Register rs, Operand rt)
void Throw(Register value)
void Allocate(int object_size, Register result, Register scratch1, Register scratch2, Label *gc_required, AllocationFlags flags)
void SubuAndCheckForOverflow(Register dst, Register left, const Operand &right, Register overflow_dst, Register scratch=at)
void StoreRoot(Register source, Heap::RootListIndex index)
void Branch(Label *L, Condition cond, Register rs, Heap::RootListIndex index, BranchDelaySlot bdslot=PROTECT)
void DropAndRet(int drop)
void Push(Register src1, Register src2, Register src3)
void Call(Address target, RelocInfo::Mode rmode, COND_ARGS)
void MultiPopFPU(RegList regs)
void IsInstanceJSObjectType(Register map, Register scratch, Label *fail)
void Drop(int count, Condition cond=cc_always, Register reg=no_reg, const Operand &op=Operand(no_reg))
void Allocate(Register object_size, Register result, Register scratch1, Register scratch2, Label *gc_required, AllocationFlags flags)
void AssertString(Register object)
void SmiTag(Register dst, Register src)
void CheckFastObjectElements(Register map, Register scratch, Label *fail)
void StoreToSafepointRegisterSlot(Register src, Register dst)
void AssertFastElements(Register elements)
void AllocateTwoByteConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
bool AllowThisStubCall(CodeStub *stub)
void JumpIfEitherSmi(Register reg1, Register reg2, Label *on_either_smi)
void Abort(BailoutReason msg)
void CallApiFunctionAndReturn(Register function_address, ExternalReference thunk_ref, int stack_space, MemOperand return_value_operand, MemOperand *context_restore_operand)
void IncrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void DropAndRet(int drop, Condition cond, Register reg, const Operand &op)
void Pop(uint32_t count=1)
void TruncateNumberToI(Register object, Register result, Register heap_number_map, Register scratch, Label *not_int32)
void MovFromFloatParameter(DoubleRegister dst)
void IndexFromHash(Register hash, Register index)
void GetNumberHash(Register reg0, Register scratch)
void GetBuiltinFunction(Register target, Builtins::JavaScript id)
void LeaveFrame(StackFrame::Type type)
void li(Register rd, Operand j, LiFlags mode=OPTIMIZE_SIZE)
void CallExternalReference(const ExternalReference &ext, int num_arguments, BranchDelaySlot bd=PROTECT)
void Movt(Register rd, Register rs, uint16_t cc=0)
void And(Register dst, Register src1, const Operand &src2, Condition cond=al)
void Mthc1(Register rt, FPURegister fs)
void BranchAndLinkShort(Label *L, Condition cond, Register rs, const Operand &rt, BranchDelaySlot bdslot=PROTECT)
void TailCallExternalReference(const ExternalReference &ext, int num_arguments, int result_size)
void Cvt_d_uw(FPURegister fd, Register rs, FPURegister scratch)
void InvokeFunction(Register function, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void RetOnOverflow(Register overflow_check, BranchDelaySlot bd=PROTECT)
void StoreNumberToDoubleElements(Register value_reg, Register key_reg, Register elements_reg, Register scratch1, Register scratch2, Register scratch3, Label *fail, int elements_offset=0)
void CheckAccessGlobalProxy(Register holder_reg, Register scratch, Label *miss)
void DispatchMap(Register obj, Register scratch, Handle< Map > map, Handle< Code > success, SmiCheckType smi_check_type)
static int CallSize(Register target, COND_ARGS)
void MultiPop(RegList regs)
void set_generating_stub(bool value)
void BranchOnOverflow(Label *label, Register overflow_check, BranchDelaySlot bd=PROTECT)
void JumpIfNotBothSmi(Register reg1, Register reg2, Label *on_not_both_smi)
void InvokeCode(Register code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void FmoveLow(Register dst_low, FPURegister src)
void MovToFloatParameter(DoubleRegister src)
void Push(Register src, Condition cond, Register tst1, Register tst2)
void SmiTagCheckOverflow(Register reg, Register overflow)
void Usw(Register rd, const MemOperand &rs)
void MovToFloatResult(DoubleRegister src)
void SubuAndCheckForOverflow(Register dst, Register left, Register right, Register overflow_dst, Register scratch=at)
void TrySmiTag(Register reg, Register scratch, Label *not_a_smi)
void Pop(Register src1, Register src2)
void PrepareCEntryArgs(int num_args)
void CallCFunctionHelper(Register function, int num_reg_arguments, int num_double_arguments)
void LoadInstanceDescriptors(Register map, Register descriptors)
void Trunc_uw_d(FPURegister fd, FPURegister fs, FPURegister scratch)
void set_has_frame(bool value)
void Ceil_w_d(FPURegister fd, FPURegister fs)
void CallCFunction(ExternalReference function, int num_reg_arguments, int num_double_arguments)
void Load(Register dst, const MemOperand &src, Representation r)
void DecrementCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void Ext(Register rt, Register rs, uint16_t pos, uint16_t size)
void CheckMap(Register obj, Register scratch, Heap::RootListIndex index, Label *fail, SmiCheckType smi_check_type)
void UntagAndJumpIfSmi(Register dst, Register src, Label *smi_case)
void SmiUntag(Register reg)
void CallCFunction(Register function, int num_arguments)
void LoadFromNumberDictionary(Label *miss, Register elements, Register key, Register result, Register reg0, Register reg1, Register reg2)
void TailCallRuntime(Runtime::FunctionId fid, int num_arguments, int result_size)
void PrepareCEntryFunction(const ExternalReference &ref)
void AllocateTwoByteSlicedString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void Ins(Register rt, Register rs, uint16_t pos, uint16_t size)
void JumpIfInstanceTypeIsNotSequentialOneByte(Register type, Register scratch, Label *failure)
void Jump(Handle< Code > code, RelocInfo::Mode rmode, COND_ARGS)
void DecodeFieldToSmi(Register dst, Register src)
DEFINE_INSTRUCTION2(Mult)
void SmiTst(Register value, Register scratch)
void LookupNumberStringCache(Register object, Register result, Register scratch1, Register scratch2, Register scratch3, Label *not_found)
void Prologue(bool code_pre_aging)
void CheckFastElements(Register map, Register scratch, Label *fail)
void SetCounter(StatsCounter *counter, int value, Register scratch1, Register scratch2)
void GetMarkBits(Register addr_reg, Register bitmap_reg, Register mask_reg)
void BranchOnNoOverflow(Label *label, Register overflow_check, BranchDelaySlot bd=PROTECT)
void TestJSArrayForAllocationMemento(Register receiver_reg, Register scratch_reg, Label *no_memento_found, Condition cond=al, Label *allocation_memento_present=NULL)
void TruncatingDiv(Register result, Register dividend, int32_t divisor)
void CallStub(CodeStub *stub, TypeFeedbackId ast_id=TypeFeedbackId::None(), COND_ARGS)
void EnterExitFrame(bool save_doubles, int stack_space=0)
MacroAssembler(Isolate *isolate, void *buffer, int size)
MemOperand SafepointRegisterSlot(Register reg)
void J(Label *L, BranchDelaySlot bdslot)
void LoadFromSafepointRegisterSlot(Register dst, Register src)
void IncrementalMarkingRecordWriteHelper(Register object, Register value, Register address)
void JumpIfNotHeapNumber(Register object, Register heap_number_map, Register scratch, Label *on_not_heap_number)
void RecordWrite(Register object, Register address, Register value, RAStatus ra_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)
void AdduAndCheckForOverflow(Register dst, Register left, const Operand &right, Register overflow_dst, Register scratch=at)
void Cvt_d_uw(FPURegister fd, FPURegister fs, FPURegister scratch)
void IsObjectJSObjectType(Register heap_object, Register map, Register scratch, Label *fail)
void InvokePrologue(const ParameterCount &expected, const ParameterCount &actual, Handle< Code > code_constant, Register code_reg, Label *done, bool *definitely_mismatches, InvokeFlag flag, const CallWrapper &call_wrapper)
void AssertIsRoot(Register reg, Heap::RootListIndex index)
void AssertUndefinedOrAllocationSite(Register object, Register scratch)
void CallCFunction(Register function, int num_reg_arguments, int num_double_arguments)
void LoadGlobalFunction(int index, Register function)
static int CallSize(Address target, RelocInfo::Mode rmode, COND_ARGS)
void AllocateOneByteConsString(Register result, Register length, Register scratch1, Register scratch2, Label *gc_required)
void PushSafepointRegisters()
void AssertSmi(Register object)
void Push(Register src1, Register src2, Register src3, Register src4)
void Jump(Address target, RelocInfo::Mode rmode, COND_ARGS)
void PopSafepointRegisters()
void LoadNumber(Register object, FPURegister dst, Register heap_number_map, Register scratch, Label *not_number)
void EmitSeqStringSetCharCheck(Register string, Register index, Register value, Register scratch, uint32_t encoding_mask)
void FlushICache(Register address, unsigned instructions)
void LoadNumberAsInt32Double(Register object, DoubleRegister double_dst, Register heap_number_map, Register scratch1, Register scratch2, FPURegister double_scratch, Label *not_int32)
void SmiTag(Register reg)
void RecordWriteField(Register object, int offset, Register value, Register scratch, RAStatus ra_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)
MemOperand SafepointRegistersAndDoublesSlot(Register reg)
void JumpIfSmi(Register value, Label *smi_label, Register scratch=at, BranchDelaySlot bd=PROTECT)
void TruncateHeapNumberToI(Register result, Register object)
void Movn(Register rd, Register rs, Register rt)
void Ulw(Register rd, const MemOperand &rs)
void li(Register dst, Handle< Object > value, LiFlags mode=OPTIMIZE_SIZE)
void Movf(Register rd, Register rs, uint16_t cc=0)
void ClampDoubleToUint8(Register result_reg, DoubleRegister input_reg, DoubleRegister temp_double_reg)
DEFINE_INSTRUCTION2(Multu)
void MarkCode(NopMarkerTypes type)
void ThrowUncatchable(Register value)
void RememberedSetHelper(Register object, Register addr, Register scratch, SaveFPRegsMode save_fp, RememberedSetFinalAction and_then)
void PrepareCallCFunction(int num_reg_arguments, int num_double_registers, Register scratch)
void GetBuiltinEntry(Register target, Builtins::JavaScript id)
void TestJSArrayForAllocationMemento(Register receiver_reg, Register scratch_reg, Label *no_memento_found)
void JumpIfJSArrayHasAllocationMemento(Register receiver_reg, Register scratch_reg, Label *memento_found)
void BranchF(Label *target, Label *nan, Condition cc, FPURegister cmp1, FPURegister cmp2, BranchDelaySlot bd=PROTECT)
void Pref(int32_t hint, const MemOperand &rs)
void Round_w_d(FPURegister fd, FPURegister fs)
void JumpIfNotPowerOfTwoOrZero(Register reg, Register scratch, Label *not_power_of_two_or_zero)
void JumpIfNonSmisNotBothSequentialOneByteStrings(Register first, Register second, Register scratch1, Register scratch2, Label *failure)
void JumpIfNotBothSequentialOneByteStrings(Register first, Register second, Register scratch1, Register scratch2, Label *not_flat_one_byte_strings)
void TrySmiTag(Register reg, Label *not_a_smi)
void Push(Register src1, Register src2)
void NumberOfOwnDescriptors(Register dst, Register map)
void MovFromFloatResult(DoubleRegister dst)
void AllocateHeapNumber(Register result, Register scratch1, Register scratch2, Register heap_number_map, Label *gc_required, TaggingMode tagging_mode=TAG_RESULT, MutableMode mode=IMMUTABLE)
void SmiToDoubleFPURegister(Register smi, FPURegister value, Register scratch1)
void HasColor(Register object, Register scratch0, Register scratch1, Label *has_color, int first_bit, int second_bit)
void TryInlineTruncateDoubleToI(Register result, DoubleRegister input, Label *done)
void CompareMapAndBranch(Register obj, Register scratch, Handle< Map > map, Label *early_success, Condition cond, Label *branch_to)
void ObjectToDoubleFPURegister(Register object, FPURegister value, Register scratch1, Register scratch2, Register heap_number_map, Label *not_number, ObjectToDoubleFlags flags=NO_OBJECT_TO_DOUBLE_FLAGS)
void JumpIfDictionaryInPrototypeChain(Register object, Register scratch0, Register scratch1, Label *found)
void AssertNotSmi(Register object)
void Floor_w_d(FPURegister fd, FPURegister fs)
void AdduAndCheckForOverflow(Register dst, Register left, Register right, Register overflow_dst, Register scratch=at)
void Move(Register dst_low, Register dst_high, FPURegister src)
void EmitFPUTruncate(FPURoundingMode rounding_mode, Register result, DoubleRegister double_input, Register scratch, DoubleRegister double_scratch, Register except_flag, CheckForInexactConversion check_inexact=kDontCheckForInexactConversion)
DEFINE_INSTRUCTION2(Divu)
void JumpIfBlack(Register object, Register scratch0, Register scratch1, Label *on_black)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met)
void CheckMap(Register obj, Register scratch, Handle< Map > map, Label *fail, SmiCheckType smi_check_type)
void MultiPopReversedFPU(RegList regs)
void MultiPushReversed(RegList regs)
void CallRuntimeSaveDoubles(Runtime::FunctionId id)
void Push(Handle< Object > handle)
void CopyFields(Register dst, Register src, RegList temps, int field_count)
void Mfhc1(Register rt, FPURegister fs)
static const int kInstanceTypeOffset
static const Function * FunctionForId(FunctionId id)
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)
#define DCHECK_EQ(v1, v2)
#define DECLARE_BRANCH_PROTOTYPES(Name)
const Register kRootRegister
MemOperand ContextOperand(Register context, int index)
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
CheckForInexactConversion
@ kDontCheckForInexactConversion
const intptr_t kSmiSignMask
@ NO_OBJECT_TO_DOUBLE_FLAGS
@ AVOID_NANS_AND_INFINITIES
int ToNumber(Register reg)
const uint32_t kStringTag
Handle< T > handle(T *t, Isolate *isolate)
MemOperand FieldMemOperand(Register object, int offset)
MemOperand CFunctionArgumentOperand(int index)
const int kCArgsSlotsSize
kFeedbackVectorOffset flag
MemOperand GlobalObjectOperand()
const intptr_t kSmiTagMask
Register GetRegisterThatIsNotOneOf(Register reg1, Register reg2=no_reg, Register reg3=no_reg, Register reg4=no_reg, Register reg5=no_reg, Register reg6=no_reg)
const uint32_t kIsNotStringMask
@ kPointersToHereMaybeInteresting
@ kPointersToHereAreAlwaysInteresting
Debugger support for the V8 JavaScript engine.
bool is(FPURegister creg) const
bool is(Register reg) const