diff options
Diffstat (limited to 'deps/v8/src/arm/macro-assembler-arm.h')
-rw-r--r-- | deps/v8/src/arm/macro-assembler-arm.h | 127 |
1 files changed, 88 insertions, 39 deletions
diff --git a/deps/v8/src/arm/macro-assembler-arm.h b/deps/v8/src/arm/macro-assembler-arm.h index efc5bfae7..98cea1638 100644 --- a/deps/v8/src/arm/macro-assembler-arm.h +++ b/deps/v8/src/arm/macro-assembler-arm.h @@ -33,10 +33,18 @@ namespace v8 { namespace internal { +// ---------------------------------------------------------------------------- +// Static helper functions + +// Generate a MemOperand for loading a field from an object. +static inline MemOperand FieldMemOperand(Register object, int offset) { + return MemOperand(object, offset - kHeapObjectTag); +} + // Give alias names to registers const Register cp = { 8 }; // JavaScript context pointer - +const Register roots = { 10 }; // Roots array pointer. enum InvokeJSFlags { CALL_JS, @@ -49,14 +57,7 @@ class MacroAssembler: public Assembler { public: MacroAssembler(void* buffer, int size); - // --------------------------------------------------------------------------- - // Low-level helpers for compiler - - // Jump, Call, and Ret pseudo instructions implementing inter-working - private: - void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = al); - void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = al); - public: + // Jump, Call, and Ret pseudo instructions implementing inter-working. void Jump(Register target, Condition cond = al); void Jump(byte* target, RelocInfo::Mode rmode, Condition cond = al); void Jump(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al); @@ -134,6 +135,10 @@ class MacroAssembler: public Assembler { const ParameterCount& actual, InvokeFlag flag); + void InvokeFunction(JSFunction* function, + const ParameterCount& actual, + InvokeFlag flag); + #ifdef ENABLE_DEBUGGER_SUPPORT // --------------------------------------------------------------------------- @@ -145,6 +150,7 @@ class MacroAssembler: public Assembler { void CopyRegistersFromStackToMemory(Register base, Register scratch, RegList regs); + void DebugBreak(); #endif // --------------------------------------------------------------------------- @@ -209,6 +215,31 @@ class MacroAssembler: public Assembler { // allocation is undone. void UndoAllocationInNewSpace(Register object, Register scratch); + + void AllocateTwoByteString(Register result, + Register length, + Register scratch1, + Register scratch2, + Register scratch3, + Label* gc_required); + void AllocateAsciiString(Register result, + Register length, + Register scratch1, + Register scratch2, + Register scratch3, + Label* gc_required); + void AllocateTwoByteConsString(Register result, + Register length, + Register scratch1, + Register scratch2, + Label* gc_required); + void AllocateAsciiConsString(Register result, + Register length, + Register scratch1, + Register scratch2, + Label* gc_required); + + // --------------------------------------------------------------------------- // Support functions. @@ -243,6 +274,29 @@ class MacroAssembler: public Assembler { Register type_reg, InstanceType type); + + // Check if the map of an object is equal to a specified map and + // branch to label if not. Skip the smi check if not required + // (object is known to be a heap object) + void CheckMap(Register obj, + Register scratch, + Handle<Map> map, + Label* fail, + bool is_heap_object); + + // Load and check the instance type of an object for being a string. + // Loads the type into the second argument register. + // Returns a condition that will be enabled if the object was a string. + Condition IsObjectStringType(Register obj, + Register type) { + ldr(type, FieldMemOperand(obj, HeapObject::kMapOffset)); + ldrb(type, FieldMemOperand(type, Map::kInstanceTypeOffset)); + tst(type, Operand(kIsNotStringMask)); + ASSERT_EQ(0, kStringTag); + return eq; + } + + inline void BranchOnSmi(Register value, Label* smi_label) { tst(value, Operand(kSmiTagMask)); b(eq, smi_label); @@ -257,6 +311,9 @@ class MacroAssembler: public Assembler { // occurred. void IllegalOperation(int num_arguments); + // Get the number of least significant bits from a register + void GetLeastBitsFromSmi(Register dst, Register src, int num_least_bits); + // Uses VFP instructions to Convert a Smi to a double. void IntegerToDoubleConversionWithVFP3(Register inReg, Register outHighReg, @@ -269,6 +326,9 @@ class MacroAssembler: public Assembler { // Call a code stub. void CallStub(CodeStub* stub, Condition cond = al); + // Call a code stub. + void TailCallStub(CodeStub* stub, Condition cond = al); + // Return from a code stub after popping its arguments. void StubReturn(int argc); @@ -279,6 +339,10 @@ class MacroAssembler: public Assembler { // Convenience function: Same as above, but takes the fid instead. void CallRuntime(Runtime::FunctionId fid, int num_arguments); + // Convenience function: call an external reference. + void CallExternalReference(const ExternalReference& ext, + int num_arguments); + // Tail call of a runtime routine (jump). // Like JumpToRuntime, but also takes care of passing the number // of parameters. @@ -297,13 +361,6 @@ class MacroAssembler: public Assembler { // setup the function in r1. void GetBuiltinEntry(Register target, Builtins::JavaScript id); - struct Unresolved { - int pc; - uint32_t flags; // see Bootstrapper::FixupFlags decoders/encoders. - const char* name; - }; - List<Unresolved>* unresolved() { return &unresolved_; } - Handle<Object> CodeObject() { return code_object_; } @@ -338,6 +395,14 @@ class MacroAssembler: public Assembler { bool allow_stub_calls() { return allow_stub_calls_; } // --------------------------------------------------------------------------- + // Smi utilities + + // Jump if either of the registers contain a non-smi. + void JumpIfNotBothSmi(Register reg1, Register reg2, Label* on_not_both_smi); + // Jump if either of the registers contain a smi. + void JumpIfEitherSmi(Register reg1, Register reg2, Label* on_either_smi); + + // --------------------------------------------------------------------------- // String utilities // Checks if both objects are sequential ASCII strings and jumps to label @@ -357,11 +422,8 @@ class MacroAssembler: public Assembler { Label* not_flat_ascii_strings); private: - List<Unresolved> unresolved_; - bool generating_stub_; - bool allow_stub_calls_; - Handle<Object> code_object_; // This handle will be patched with the code - // object on installation. + void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = al); + void Call(intptr_t target, RelocInfo::Mode rmode, Condition cond = al); // Helper functions for generating invokes. void InvokePrologue(const ParameterCount& expected, @@ -371,21 +433,14 @@ class MacroAssembler: public Assembler { Label* done, InvokeFlag flag); - // Prepares for a call or jump to a builtin by doing two things: - // 1. Emits code that fetches the builtin's function object from the context - // at runtime, and puts it in the register rdi. - // 2. Fetches the builtin's code object, and returns it in a handle, at - // compile time, so that later code can emit instructions to jump or call - // the builtin directly. If the code object has not yet been created, it - // returns the builtin code object for IllegalFunction, and sets the - // output parameter "resolved" to false. Code that uses the return value - // should then add the address and the builtin name to the list of fixups - // called unresolved_, which is fixed up by the bootstrapper. - Handle<Code> ResolveBuiltin(Builtins::JavaScript id, bool* resolved); - // Activation support. void EnterFrame(StackFrame::Type type); void LeaveFrame(StackFrame::Type type); + + bool generating_stub_; + bool allow_stub_calls_; + // This handle will be patched with the code object on installation. + Handle<Object> code_object_; }; @@ -421,12 +476,6 @@ class CodePatcher { // ----------------------------------------------------------------------------- // Static helper functions. -// Generate a MemOperand for loading a field from an object. -static inline MemOperand FieldMemOperand(Register object, int offset) { - return MemOperand(object, offset - kHeapObjectTag); -} - - #ifdef GENERATED_CODE_COVERAGE #define CODE_COVERAGE_STRINGIFY(x) #x #define CODE_COVERAGE_TOSTRING(x) CODE_COVERAGE_STRINGIFY(x) |