5 #ifndef V8_X87_MACRO_ASSEMBLER_X87_H_
6 #define V8_X87_MACRO_ASSEMBLER_X87_H_
47 class MacroAssembler:
public Assembler {
87 Label::Distance condition_met_distance = Label::kFar);
94 Label::Distance condition_met_distance = Label::kFar);
98 Label* if_deprecated);
105 Label::Distance distance = Label::kFar) {
114 Label::Distance distance = Label::kFar) {
123 Label::Distance has_color_distance,
131 Label::Distance on_black_distance = Label::kFar);
141 Label* object_is_white_and_not_data,
142 Label::Distance distance);
167 remembered_set_action, smi_check,
168 pointers_to_here_check_for_value);
240 Label* no_map_match);
264 if (object->IsHeapObject()) {
273 if (object->IsHeapObject()) {
285 const ParameterCount& expected,
286 const ParameterCount& actual,
293 const ParameterCount& expected,
294 const ParameterCount& actual,
301 const ParameterCount& actual,
306 const ParameterCount& expected,
307 const ParameterCount& actual,
312 const ParameterCount& expected,
313 const ParameterCount& actual,
346 Label::Distance distance = Label::kFar);
352 Label::Distance distance = Label::kFar);
358 Label::Distance distance = Label::kFar);
439 Label* lost_precision, Label* is_nan, Label* minus_zero,
440 Label::Distance dst = Label::kFar);
465 Label::Distance distance = Label::kFar) {
467 j(
zero, smi_label, distance);
472 Label::Distance distance = Label::kFar) {
474 j(
zero, smi_label, distance);
478 Label* not_smi_label,
479 Label::Distance distance = Label::kFar) {
488 template<
typename Field>
490 static const int shift = Field::kShift;
491 static const int mask = Field::kMask >> Field::kShift;
498 template<
typename Field>
500 static const int shift = Field::kShift;
501 static const int mask = (Field::kMask >> Field::kShift) <<
kSmiTagSize;
631 Register scratch3, Label* gc_required);
633 Register scratch2, Label* gc_required);
642 Register scratch2, Label* gc_required);
651 Register scratch2, Label* gc_required);
680 Register scratch, Label* then_label);
691 bool miss_on_bound_function =
false);
769 ExternalReference thunk_ref,
773 Operand* context_restore_operand);
878 Label* on_not_flat_one_byte_string);
884 Label* on_not_flat_one_byte_strings);
888 Label::Distance distance = Label::kFar) {
893 Label::Distance distance = Label::kFar);
920 Label* no_memento_found);
924 Label* memento_found) {
925 Label no_memento_found;
929 bind(&no_memento_found);
944 const ParameterCount& actual,
948 bool* definitely_mismatches,
950 Label::Distance done_distance,
971 Label* condition_met,
972 Label::Distance condition_met_distance = Label::kFar);
1020 inline Operand
FieldOperand(Register
object,
int offset) {
1035 Register index_as_smi,
1036 int additional_offset = 0) {
1056 #ifdef GENERATED_CODE_COVERAGE
1057 extern void LogGeneratedCodeCoverage(
const char* file_line);
1058 #define CODE_COVERAGE_STRINGIFY(x) #x
1059 #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x)
1060 #define __FILE_LINE__ __FILE__ ":" CODE_COVERAGE_TOSTRING(__LINE__)
1061 #define ACCESS_MASM(masm) { \
1062 byte* ia32_coverage_function = \
1063 reinterpret_cast<byte*>(FUNCTION_ADDR(LogGeneratedCodeCoverage)); \
1066 masm->push(Immediate(reinterpret_cast<int>(&__FILE_LINE__))); \
1067 masm->call(ia32_coverage_function, RelocInfo::RUNTIME_ENTRY); \
1074 #define ACCESS_MASM(masm) masm->
Isolate * isolate() const
void and_(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void sar(Register dst, uint8_t imm8)
void j(Condition cc, Label *L, Label::Distance distance=Label::kFar)
void add(Register dst, Register src1, const Operand &src2, SBit s=LeaveCC, Condition cond=al)
void cmp(Register src1, const Operand &src2, Condition cond=al)
void shl(Register dst, uint8_t imm8)
void shift(Register dst, Immediate shift_amount, int subcode, int size)
void test(Register reg, const Immediate &imm)
CodePatcher(byte *address, int size)
static int SlotOffset(int index)
static const int kHeaderSize
static const int kValueOffset
void DecrementCounter(Condition cc, StatsCounter *counter, int value)
void CallStub(CodeStub *stub, TypeFeedbackId ast_id=TypeFeedbackId::None())
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 CallApiFunctionAndReturn(Register function_address, ExternalReference thunk_ref, Operand thunk_last_arg, int stack_space, Operand return_value_operand, Operand *context_restore_operand)
void ClampTOSToUint8(Register result_reg)
void LoadAllocationTopHelper(Register result, Register scratch, AllocationFlags flags)
void NegativeZeroTest(Register result, Register op1, Register op2, Register scratch, Label *then_label)
void IncrementCounter(StatsCounter *counter, int value)
void StubReturn(int argc)
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 EnterExitFramePrologue()
void UpdateAllocationTopHelper(Register result_end, Register scratch, AllocationFlags flags)
void JumpIfSmi(Operand value, Label *smi_label, Label::Distance distance=Label::kFar)
void PushTryHandler(StackHandler::Kind kind, int handler_index)
void DecodeFieldToSmi(Register reg)
void CheckFastSmiElements(Register map, Label *fail, Label::Distance distance=Label::kFar)
void DecodeField(Register reg)
Operand SafepointRegisterSlot(Register reg)
void LoadObject(Register result, Handle< Object > object)
void AllocateOneByteSlicedString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void EnterExitFrameEpilogue(int argc, bool save_doubles)
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 LeaveExitFrame(bool save_doubles)
void InvokeFunction(Handle< JSFunction > function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void PrepareCallCFunction(int num_arguments, Register scratch)
void AllocateOneByteString(Register result, Register length, Register scratch1, Register scratch2, Register scratch3, Label *gc_required)
void EnterFrame(StackFrame::Type type)
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)
Handle< Object > CodeObject()
void VerifyX87StackDepth(uint32_t depth)
void StoreNumberToDoubleElements(Register maybe_number, Register elements, Register key, Register scratch, Label *fail, int offset=0)
void LoadRoot(Register destination, Heap::RootListIndex index)
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 LoadHeapObject(Register dst, Handle< HeapObject > object)
void JumpIfNotUniqueNameInstanceType(Register reg, Label *not_unique_name)
void CallRuntime(const Runtime::Function *f, int num_arguments, SaveFPRegsMode save_doubles=kDontSaveFPRegs)
void CompareMap(Register obj, Handle< Map > map)
void AssertNumber(Register object)
void TruncateX87TOSToI(Register result_reg)
void InvokeFunction(Register function, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void CheckPageFlagForMap(Handle< Map > map, int mask, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
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)
void AllocateHeapNumber(Register result, Register scratch1, Register scratch2, Label *gc_required, MutableMode mode=IMMUTABLE)
void InNewSpace(Register object, Register scratch, Condition cond, Label *branch)
void SafePush(const Immediate &x)
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 JumpToExternalReference(const ExternalReference &ext)
void CheckMapDeprecated(Handle< Map > map, Register scratch, Label *if_deprecated)
void CheckMap(Register obj, Handle< Map > map, Label *fail, SmiCheckType smi_check_type)
void BooleanBitTest(Register object, int field_offset, int bit_index)
void TryGetFunctionPrototype(Register function, Register result, Register scratch, Label *miss, bool miss_on_bound_function=false)
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 JumpIfInstanceTypeIsNotSequentialOneByte(Register instance_type, Register scratch, Label *on_not_flat_one_byte_string)
void EnumLength(Register dst, Register map)
void TailCallStub(CodeStub *stub)
void EnterApiExitFrame(int argc)
void CheckPageFlag(Register object, Register scratch, int mask, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void InvokePrologue(const ParameterCount &expected, const ParameterCount &actual, Handle< Code > code_constant, const Operand &code_operand, Label *done, bool *definitely_mismatches, InvokeFlag flag, Label::Distance done_distance, const CallWrapper &call_wrapper=NullCallWrapper())
static int SafepointRegisterStackIndex(int reg_code)
void StoreRoot(Register source, Register scratch, Heap::RootListIndex index)
STATIC_ASSERT((reg_zero==(reg_not_zero ^ 1)) &&(reg_bit_clear==(reg_bit_set ^ 1)) &&(always==(never ^ 1)))
void CopyBytes(Register source, Register destination, Register length, Register scratch)
void CompareRoot(const Operand &with, Heap::RootListIndex index)
void Throw(Register value)
void NegativeZeroTest(Register result, Register op, Label *then_label)
void StoreToSafepointRegisterSlot(Register dst, Immediate src)
void Move(Register dst, Handle< Object > value)
void IsInstanceJSObjectType(Register map, Register scratch, Label *fail)
void AssertString(Register object)
void AssertFastElements(Register elements)
void SmiUntag(Register reg, Label *is_smi)
bool AllowThisStubCall(CodeStub *stub)
void JumpIfNotSmi(Register value, Label *not_smi_label, Label::Distance distance=Label::kFar)
void Allocate(Register object_size, Register result, Register result_end, Register scratch, Label *gc_required, AllocationFlags flags)
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 CheckAccessGlobalProxy(Register holder_reg, Register scratch1, Register scratch2, Label *miss)
void IndexFromHash(Register hash, Register index)
void GetBuiltinFunction(Register target, Builtins::JavaScript id)
void Abort(BailoutReason reason)
void LeaveFrame(StackFrame::Type type)
void ClampUint8(Register reg)
void SafeMove(Register dst, const Immediate &x)
void TruncatingDiv(Register dividend, int32_t divisor)
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 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 InNewSpace(Register object, Register scratch, Condition cc, Label *condition_met, Label::Distance condition_met_distance=Label::kFar)
void AllocateTwoByteSlicedString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void CompareRoot(Register with, Register scratch, Heap::RootListIndex index)
void EmitSeqStringSetCharCheck(Register string, Register index, Register value, uint32_t encoding_mask)
void set_generating_stub(bool value)
void InvokeCode(Register code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void CmpHeapObject(Register reg, Handle< HeapObject > object)
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 HasColor(Register object, Register scratch0, Register scratch1, Label *has_color, Label::Distance has_color_distance, int first_bit, int second_bit)
void Ret(int bytes_dropped, Register scratch)
void JumpIfSmi(Register value, Label *smi_label, Label::Distance distance=Label::kFar)
void CheckEnumCache(Label *call_runtime)
void SmiUntag(Register reg)
void CallCFunction(Register function, int num_arguments)
void CmpInstanceType(Register map, InstanceType type)
void GetNumberHash(Register r0, Register scratch)
void TailCallRuntime(Runtime::FunctionId fid, int num_arguments, int result_size)
void EnterExitFrame(bool save_doubles)
void CallExternalReference(ExternalReference ref, int num_arguments)
void LeaveExitFrameEpilogue(bool restore_context)
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 LeaveApiExitFrame(bool restore_context)
void RecordWriteForMap(Register object, Handle< Map > map, Register scratch1, Register scratch2, SaveFPRegsMode save_fp)
void CheckStackAlignment()
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)
void InvokeCode(const Operand &code, const ParameterCount &expected, const ParameterCount &actual, InvokeFlag flag, const CallWrapper &call_wrapper)
void Drop(int element_count)
Condition IsObjectNameType(Register heap_object, Register map, Register instance_type)
void Store(Register src, const Operand &dst, Representation r)
void DecrementCounter(StatsCounter *counter, int value)
MacroAssembler(Isolate *isolate, void *buffer, int size)
void X87TOSToI(Register result_reg, MinusZeroMode minus_zero_mode, Label *lost_precision, Label *is_nan, Label *minus_zero, Label::Distance dst=Label::kFar)
void Allocate(int header_size, ScaleFactor element_size, Register element_count, RegisterValueType element_count_type, Register result, Register result_end, Register scratch, Label *gc_required, AllocationFlags flags)
void LoadFromSafepointRegisterSlot(Register dst, Register src)
void CmpObject(Register reg, Handle< Object > object)
void IsObjectJSObjectType(Register heap_object, Register map, Register scratch, Label *fail)
void LookupNumberStringCache(Register object, Register result, Register scratch1, Register scratch2, Label *not_found)
void IncrementCounter(Condition cc, StatsCounter *counter, int value)
void LoadGlobalFunction(int index, Register function)
void PushSafepointRegisters()
void AssertSmi(Register object)
void PushHeapObject(Handle< HeapObject > object)
void AllocateOneByteConsString(Register result, Register scratch1, Register scratch2, Label *gc_required)
void PopSafepointRegisters()
void SetCounter(StatsCounter *counter, int value)
void SmiTag(Register reg)
void LoadHeapObject(Register result, Handle< HeapObject > object)
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 LoadUint32NoSSE2(Register src)
void AssertUndefinedOrAllocationSite(Register object)
void JumpIfNotBothSequentialOneByteStrings(Register object1, Register object2, Register scratch1, Register scratch2, Label *on_not_flat_one_byte_strings)
void CheckFastObjectElements(Register map, Label *fail, Label::Distance distance=Label::kFar)
void ThrowUncatchable(Register value)
void RememberedSetHelper(Register object, Register addr, Register scratch, SaveFPRegsMode save_fp, RememberedSetFinalAction and_then)
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 Move(Register dst, const Immediate &x)
void Move(const Operand &dst, const Immediate &x)
void Assert(Condition cc, BailoutReason reason)
void StoreToSafepointRegisterSlot(Register dst, Register src)
void NumberOfOwnDescriptors(Register dst, Register map)
void PrepareCallApiFunction(int argc)
bool IsUnsafeImmediate(const Immediate &x)
void AllocateOneByteString(Register result, int length, Register scratch1, Register scratch2, Label *gc_required)
Condition IsObjectStringType(Register heap_object, Register map, Register instance_type)
void Check(Condition cc, BailoutReason reason)
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)
Handle< Object > CodeObject()
void SlowTruncateToI(Register result_reg, Register input_reg, int offset=HeapNumber::kValueOffset - kHeapObjectTag)
void CallRuntimeSaveDoubles(Runtime::FunctionId id)
void Push(Handle< Object > handle)
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
#define DCHECK(condition)
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
Operand FieldOperand(Register object, int offset)
Handle< T > handle(T *t, Isolate *isolate)
@ times_half_pointer_size
Operand FixedArrayElementOperand(Register array, Register index_as_smi, int additional_offset=0)
kFeedbackVectorOffset flag
MemOperand GlobalObjectOperand()
const intptr_t kSmiTagMask
@ REGISTER_VALUE_IS_INT32
Operand ApiParameterOperand(int index)
@ kPointersToHereMaybeInteresting
@ kPointersToHereAreAlwaysInteresting
Debugger support for the V8 JavaScript engine.