| Index: src/arm/macro-assembler-arm.h
|
| ===================================================================
|
| --- src/arm/macro-assembler-arm.h (revision 7180)
|
| +++ src/arm/macro-assembler-arm.h (working copy)
|
| @@ -34,7 +34,7 @@
|
| namespace internal {
|
|
|
| // Forward declaration.
|
| -class PostCallGenerator;
|
| +class CallWrapper;
|
|
|
| // ----------------------------------------------------------------------------
|
| // Static helper functions
|
| @@ -96,8 +96,11 @@
|
| 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);
|
| + int CallSize(Register target, Condition cond = al);
|
| void Call(Register target, Condition cond = al);
|
| + int CallSize(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
| void Call(byte* target, RelocInfo::Mode rmode, Condition cond = al);
|
| + int CallSize(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
| void Call(Handle<Code> code, RelocInfo::Mode rmode, Condition cond = al);
|
| void Ret(Condition cond = al);
|
|
|
| @@ -121,6 +124,15 @@
|
| Condition cond = al);
|
| void Sbfx(Register dst, Register src, int lsb, int width,
|
| Condition cond = al);
|
| + // The scratch register is not used for ARMv7.
|
| + // scratch can be the same register as src (in which case it is trashed), but
|
| + // not the same as dst.
|
| + void Bfi(Register dst,
|
| + Register src,
|
| + Register scratch,
|
| + int lsb,
|
| + int width,
|
| + Condition cond = al);
|
| void Bfc(Register dst, int lsb, int width, Condition cond = al);
|
| void Usat(Register dst, int satpos, const Operand& src,
|
| Condition cond = al);
|
| @@ -235,18 +247,30 @@
|
| }
|
| }
|
|
|
| + // Pop two registers. Pops rightmost register first (from lower address).
|
| + void Pop(Register src1, Register src2, Condition cond = al) {
|
| + ASSERT(!src1.is(src2));
|
| + if (src1.code() > src2.code()) {
|
| + ldm(ia_w, sp, src1.bit() | src2.bit(), cond);
|
| + } else {
|
| + ldr(src2, MemOperand(sp, 4, PostIndex), cond);
|
| + ldr(src1, MemOperand(sp, 4, PostIndex), cond);
|
| + }
|
| + }
|
| +
|
| // Push and pop the registers that can hold pointers, as defined by the
|
| // RegList constant kSafepointSavedRegisters.
|
| void PushSafepointRegisters();
|
| void PopSafepointRegisters();
|
| void PushSafepointRegistersAndDoubles();
|
| void PopSafepointRegistersAndDoubles();
|
| - void StoreToSafepointRegisterSlot(Register reg);
|
| - void StoreToSafepointRegistersAndDoublesSlot(Register reg);
|
| - void LoadFromSafepointRegisterSlot(Register reg);
|
| - static int SafepointRegisterStackIndex(int reg_code);
|
| - static MemOperand SafepointRegisterSlot(Register reg);
|
| - static MemOperand SafepointRegistersAndDoublesSlot(Register reg);
|
| + // Store value in register src in the safepoint stack slot for
|
| + // register dst.
|
| + void StoreToSafepointRegisterSlot(Register src, Register dst);
|
| + void StoreToSafepointRegistersAndDoublesSlot(Register src, Register dst);
|
| + // Load the value of the src register from its safepoint stack slot
|
| + // into register dst.
|
| + void LoadFromSafepointRegisterSlot(Register dst, Register src);
|
|
|
| // Load two consecutive registers with two consecutive memory locations.
|
| void Ldrd(Register dst1,
|
| @@ -323,7 +347,7 @@
|
| const ParameterCount& expected,
|
| const ParameterCount& actual,
|
| InvokeFlag flag,
|
| - PostCallGenerator* post_call_generator = NULL);
|
| + CallWrapper* call_wrapper = NULL);
|
|
|
| void InvokeCode(Handle<Code> code,
|
| const ParameterCount& expected,
|
| @@ -336,7 +360,7 @@
|
| void InvokeFunction(Register function,
|
| const ParameterCount& actual,
|
| InvokeFlag flag,
|
| - PostCallGenerator* post_call_generator = NULL);
|
| + CallWrapper* call_wrapper = NULL);
|
|
|
| void InvokeFunction(JSFunction* function,
|
| const ParameterCount& actual,
|
| @@ -497,6 +521,14 @@
|
| // Copies a fixed number of fields of heap objects from src to dst.
|
| void CopyFields(Register dst, Register src, RegList temps, int field_count);
|
|
|
| + // Copies a number of bytes from src to dst. All registers are clobbered. On
|
| + // exit src and dst will point to the place just after where the last byte was
|
| + // read or written and length will be zero.
|
| + void CopyBytes(Register src,
|
| + Register dst,
|
| + Register length,
|
| + Register scratch);
|
| +
|
| // ---------------------------------------------------------------------------
|
| // Support functions.
|
|
|
| @@ -549,6 +581,11 @@
|
| bool is_heap_object);
|
|
|
|
|
| + // Compare the object in a register to a value from the root list.
|
| + // Uses the ip register as scratch.
|
| + void CompareRoot(Register obj, Heap::RootListIndex index);
|
| +
|
| +
|
| // 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.
|
| @@ -613,6 +650,40 @@
|
| DwVfpRegister double_scratch,
|
| Label *not_int32);
|
|
|
| + // Truncates a double using a specific rounding mode.
|
| + // Clears the z flag (ne condition) if an overflow occurs.
|
| + // If exact_conversion is true, the z flag is also cleared if the conversion
|
| + // was inexact, ie. if the double value could not be converted exactly
|
| + // to a 32bit integer.
|
| + void EmitVFPTruncate(VFPRoundingMode rounding_mode,
|
| + SwVfpRegister result,
|
| + DwVfpRegister double_input,
|
| + Register scratch1,
|
| + Register scratch2,
|
| + CheckForInexactConversion check
|
| + = kDontCheckForInexactConversion);
|
| +
|
| + // Helper for EmitECMATruncate.
|
| + // This will truncate a floating-point value outside of the singed 32bit
|
| + // integer range to a 32bit signed integer.
|
| + // Expects the double value loaded in input_high and input_low.
|
| + // Exits with the answer in 'result'.
|
| + // Note that this code does not work for values in the 32bit range!
|
| + void EmitOutOfInt32RangeTruncate(Register result,
|
| + Register input_high,
|
| + Register input_low,
|
| + Register scratch);
|
| +
|
| + // Performs a truncating conversion of a floating point number as used by
|
| + // the JS bitwise operations. See ECMA-262 9.5: ToInt32.
|
| + // Exits with 'result' holding the answer and all other registers clobbered.
|
| + void EmitECMATruncate(Register result,
|
| + DwVfpRegister double_input,
|
| + SwVfpRegister single_scratch,
|
| + Register scratch,
|
| + Register scratch2,
|
| + Register scratch3);
|
| +
|
| // Count leading zeros in a 32 bit word. On ARM5 and later it uses the clz
|
| // instruction. On pre-ARM5 hardware this routine gives the wrong answer
|
| // for 0 (31 instead of 32). Source and scratch can be the same in which case
|
| @@ -684,11 +755,13 @@
|
| void CallCFunction(ExternalReference function, int num_arguments);
|
| void CallCFunction(Register function, int num_arguments);
|
|
|
| + void GetCFunctionDoubleResult(const DoubleRegister dst);
|
| +
|
| // Calls an API function. Allocates HandleScope, extracts returned value
|
| // from handle and propagates exceptions. Restores context.
|
| // stack_space - space to be unwound on exit (includes the call js
|
| // arguments space and the additional space allocated for the fast call).
|
| - MaybeObject* TryCallApiFunctionAndReturn(ApiFunction* function,
|
| + MaybeObject* TryCallApiFunctionAndReturn(ExternalReference function,
|
| int stack_space);
|
|
|
| // Jump to a runtime routine.
|
| @@ -700,7 +773,7 @@
|
| // the unresolved list if the name does not resolve.
|
| void InvokeBuiltin(Builtins::JavaScript id,
|
| InvokeJSFlags flags,
|
| - PostCallGenerator* post_call_generator = NULL);
|
| + CallWrapper* call_wrapper = NULL);
|
|
|
| // Store the code object for the given builtin in the target register and
|
| // setup the function in r1.
|
| @@ -775,11 +848,11 @@
|
| mov(reg, scratch);
|
| }
|
|
|
| - void SmiUntag(Register reg) {
|
| - mov(reg, Operand(reg, ASR, kSmiTagSize));
|
| + void SmiUntag(Register reg, SBit s = LeaveCC) {
|
| + mov(reg, Operand(reg, ASR, kSmiTagSize), s);
|
| }
|
| - void SmiUntag(Register dst, Register src) {
|
| - mov(dst, Operand(src, ASR, kSmiTagSize));
|
| + void SmiUntag(Register dst, Register src, SBit s = LeaveCC) {
|
| + mov(dst, Operand(src, ASR, kSmiTagSize), s);
|
| }
|
|
|
| // Jump the register contains a smi.
|
| @@ -863,6 +936,7 @@
|
|
|
| private:
|
| void Jump(intptr_t target, RelocInfo::Mode rmode, Condition cond = al);
|
| + int CallSize(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.
|
| @@ -872,7 +946,7 @@
|
| Register code_reg,
|
| Label* done,
|
| InvokeFlag flag,
|
| - PostCallGenerator* post_call_generator = NULL);
|
| + CallWrapper* call_wrapper = NULL);
|
|
|
| // Activation support.
|
| void EnterFrame(StackFrame::Type type);
|
| @@ -884,10 +958,19 @@
|
| Register scratch1,
|
| Register scratch2);
|
|
|
| + // Compute memory operands for safepoint stack slots.
|
| + static int SafepointRegisterStackIndex(int reg_code);
|
| + MemOperand SafepointRegisterSlot(Register reg);
|
| + MemOperand SafepointRegistersAndDoublesSlot(Register reg);
|
| +
|
| bool generating_stub_;
|
| bool allow_stub_calls_;
|
| // This handle will be patched with the code object on installation.
|
| Handle<Object> code_object_;
|
| +
|
| + // Needs access to SafepointRegisterStackIndex for optimized frame
|
| + // traversal.
|
| + friend class OptimizedFrame;
|
| };
|
|
|
|
|
| @@ -927,11 +1010,15 @@
|
| // Helper class for generating code or data associated with the code
|
| // right after a call instruction. As an example this can be used to
|
| // generate safepoint data after calls for crankshaft.
|
| -class PostCallGenerator {
|
| +class CallWrapper {
|
| public:
|
| - PostCallGenerator() { }
|
| - virtual ~PostCallGenerator() { }
|
| - virtual void Generate() = 0;
|
| + CallWrapper() { }
|
| + virtual ~CallWrapper() { }
|
| + // Called just before emitting a call. Argument is the size of the generated
|
| + // call code.
|
| + virtual void BeforeCall(int call_size) = 0;
|
| + // Called just after emitting a call, i.e., at the return site for the call.
|
| + virtual void AfterCall() = 0;
|
| };
|
|
|
|
|
|
|