MIPS: Unify some PlatformCodeStubs.
Port r23631 (87d82e2) BUG= R=dusan.milosavljevic@imgtec.com Review URL: https://codereview.chromium.org/529203003 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@23654 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
01b9f4e2d3
commit
25efa1e88c
@ -875,20 +875,10 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
|
||||
__ IncrementCounter(isolate()->counters()->string_compare_native(), 1, a2,
|
||||
a3);
|
||||
if (cc == eq) {
|
||||
StringCompareStub::GenerateFlatAsciiStringEquals(masm,
|
||||
lhs,
|
||||
rhs,
|
||||
a2,
|
||||
a3,
|
||||
t0);
|
||||
StringHelper::GenerateFlatAsciiStringEquals(masm, lhs, rhs, a2, a3, t0);
|
||||
} else {
|
||||
StringCompareStub::GenerateCompareFlatAsciiStrings(masm,
|
||||
lhs,
|
||||
rhs,
|
||||
a2,
|
||||
a3,
|
||||
t0,
|
||||
t1);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, lhs, rhs, a2, a3, t0,
|
||||
t1);
|
||||
}
|
||||
// Never falls through to here.
|
||||
|
||||
@ -943,7 +933,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) {
|
||||
// store the registers in any particular way, but we do have to store and
|
||||
// restore them.
|
||||
__ MultiPush(kJSCallerSaved | ra.bit());
|
||||
if (save_doubles_ == kSaveFPRegs) {
|
||||
if (save_doubles()) {
|
||||
__ MultiPushFPU(kCallerSavedFPU);
|
||||
}
|
||||
const int argument_count = 1;
|
||||
@ -956,7 +946,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) {
|
||||
__ CallCFunction(
|
||||
ExternalReference::store_buffer_overflow_function(isolate()),
|
||||
argument_count);
|
||||
if (save_doubles_ == kSaveFPRegs) {
|
||||
if (save_doubles()) {
|
||||
__ MultiPopFPU(kCallerSavedFPU);
|
||||
}
|
||||
|
||||
@ -3467,12 +3457,11 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3) {
|
||||
void StringHelper::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left, Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3) {
|
||||
Register length = scratch1;
|
||||
|
||||
// Compare lengths.
|
||||
@ -3507,13 +3496,9 @@ void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4) {
|
||||
void StringHelper::GenerateCompareFlatAsciiStrings(
|
||||
MacroAssembler* masm, Register left, Register right, Register scratch1,
|
||||
Register scratch2, Register scratch3, Register scratch4) {
|
||||
Label result_not_equal, compare_lengths;
|
||||
// Find minimum length and length difference.
|
||||
__ lw(scratch1, FieldMemOperand(left, String::kLengthOffset));
|
||||
@ -3552,14 +3537,9 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
||||
MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
void StringHelper::GenerateAsciiCharsCompareLoop(
|
||||
MacroAssembler* masm, Register left, Register right, Register length,
|
||||
Register scratch1, Register scratch2, Register scratch3,
|
||||
Label* chars_not_equal) {
|
||||
// Change index to run from -length to -1 by adding length to string
|
||||
// start. This means that loop ends when index reaches zero, which
|
||||
@ -3613,7 +3593,7 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
|
||||
// Compare flat ASCII strings natively. Remove arguments from stack first.
|
||||
__ IncrementCounter(counters->string_compare_native(), 1, a2, a3);
|
||||
__ Addu(sp, sp, Operand(2 * kPointerSize));
|
||||
GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, t0, t1);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, t0, t1);
|
||||
|
||||
__ bind(&runtime);
|
||||
__ TailCallRuntime(Runtime::kStringCompare, 2, 1);
|
||||
@ -3913,11 +3893,11 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) {
|
||||
|
||||
// Compare flat ASCII strings. Returns when done.
|
||||
if (equality) {
|
||||
StringCompareStub::GenerateFlatAsciiStringEquals(
|
||||
masm, left, right, tmp1, tmp2, tmp3);
|
||||
StringHelper::GenerateFlatAsciiStringEquals(masm, left, right, tmp1, tmp2,
|
||||
tmp3);
|
||||
} else {
|
||||
StringCompareStub::GenerateCompareFlatAsciiStrings(
|
||||
masm, left, right, tmp1, tmp2, tmp3, tmp4);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, left, right, tmp1, tmp2,
|
||||
tmp3, tmp4);
|
||||
}
|
||||
|
||||
// Handle more complex cases in runtime.
|
||||
|
@ -15,24 +15,6 @@ namespace internal {
|
||||
void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code);
|
||||
|
||||
|
||||
class StoreBufferOverflowStub: public PlatformCodeStub {
|
||||
public:
|
||||
StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp)
|
||||
: PlatformCodeStub(isolate), save_doubles_(save_fp) {}
|
||||
|
||||
void Generate(MacroAssembler* masm);
|
||||
|
||||
static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate);
|
||||
virtual bool SometimesSetsUpAFrame() { return false; }
|
||||
|
||||
private:
|
||||
SaveFPRegsMode save_doubles_;
|
||||
|
||||
Major MajorKey() const { return StoreBufferOverflow; }
|
||||
uint32_t MinorKey() const { return (save_doubles_ == kSaveFPRegs) ? 1 : 0; }
|
||||
};
|
||||
|
||||
|
||||
class StringHelper : public AllStatic {
|
||||
public:
|
||||
// Generate code for copying a large number of characters. This function
|
||||
@ -59,23 +41,37 @@ class StringHelper : public AllStatic {
|
||||
static void GenerateHashGetHash(MacroAssembler* masm,
|
||||
Register hash);
|
||||
|
||||
// Compare two flat ASCII strings and returns result in v0.
|
||||
static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4);
|
||||
|
||||
// Compares two flat ASCII strings for equality and returns result in v0.
|
||||
static void GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3);
|
||||
|
||||
private:
|
||||
static void GenerateAsciiCharsCompareLoop(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Label* chars_not_equal);
|
||||
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper);
|
||||
};
|
||||
|
||||
|
||||
class SubStringStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
|
||||
|
||||
private:
|
||||
Major MajorKey() const { return SubString; }
|
||||
uint32_t MinorKey() const { return 0; }
|
||||
|
||||
void Generate(MacroAssembler* masm);
|
||||
};
|
||||
|
||||
|
||||
class StoreRegistersStateStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit StoreRegistersStateStub(Isolate* isolate)
|
||||
@ -102,43 +98,6 @@ class RestoreRegistersStateStub: public PlatformCodeStub {
|
||||
void Generate(MacroAssembler* masm);
|
||||
};
|
||||
|
||||
class StringCompareStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
|
||||
|
||||
// Compare two flat ASCII strings and returns result in v0.
|
||||
static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4);
|
||||
|
||||
// Compares two flat ASCII strings for equality and returns result
|
||||
// in v0.
|
||||
static void GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3);
|
||||
|
||||
private:
|
||||
virtual Major MajorKey() const { return StringCompare; }
|
||||
virtual uint32_t MinorKey() const { return 0; }
|
||||
virtual void Generate(MacroAssembler* masm);
|
||||
|
||||
static void GenerateAsciiCharsCompareLoop(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Label* chars_not_equal);
|
||||
};
|
||||
|
||||
|
||||
// This stub can convert a signed int32 to a heap number (double). It does
|
||||
// not work for int32s that are in Smi range! No GC occurs during this stub
|
||||
|
@ -868,20 +868,10 @@ void ICCompareStub::GenerateGeneric(MacroAssembler* masm) {
|
||||
__ IncrementCounter(isolate()->counters()->string_compare_native(), 1, a2,
|
||||
a3);
|
||||
if (cc == eq) {
|
||||
StringCompareStub::GenerateFlatAsciiStringEquals(masm,
|
||||
lhs,
|
||||
rhs,
|
||||
a2,
|
||||
a3,
|
||||
a4);
|
||||
StringHelper::GenerateFlatAsciiStringEquals(masm, lhs, rhs, a2, a3, a4);
|
||||
} else {
|
||||
StringCompareStub::GenerateCompareFlatAsciiStrings(masm,
|
||||
lhs,
|
||||
rhs,
|
||||
a2,
|
||||
a3,
|
||||
a4,
|
||||
a5);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, lhs, rhs, a2, a3, a4,
|
||||
a5);
|
||||
}
|
||||
// Never falls through to here.
|
||||
|
||||
@ -936,7 +926,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) {
|
||||
// store the registers in any particular way, but we do have to store and
|
||||
// restore them.
|
||||
__ MultiPush(kJSCallerSaved | ra.bit());
|
||||
if (save_doubles_ == kSaveFPRegs) {
|
||||
if (save_doubles()) {
|
||||
__ MultiPushFPU(kCallerSavedFPU);
|
||||
}
|
||||
const int argument_count = 1;
|
||||
@ -949,7 +939,7 @@ void StoreBufferOverflowStub::Generate(MacroAssembler* masm) {
|
||||
__ CallCFunction(
|
||||
ExternalReference::store_buffer_overflow_function(isolate()),
|
||||
argument_count);
|
||||
if (save_doubles_ == kSaveFPRegs) {
|
||||
if (save_doubles()) {
|
||||
__ MultiPopFPU(kCallerSavedFPU);
|
||||
}
|
||||
|
||||
@ -3502,12 +3492,11 @@ void SubStringStub::Generate(MacroAssembler* masm) {
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3) {
|
||||
void StringHelper::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left, Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3) {
|
||||
Register length = scratch1;
|
||||
|
||||
// Compare lengths.
|
||||
@ -3542,13 +3531,9 @@ void StringCompareStub::GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4) {
|
||||
void StringHelper::GenerateCompareFlatAsciiStrings(
|
||||
MacroAssembler* masm, Register left, Register right, Register scratch1,
|
||||
Register scratch2, Register scratch3, Register scratch4) {
|
||||
Label result_not_equal, compare_lengths;
|
||||
// Find minimum length and length difference.
|
||||
__ ld(scratch1, FieldMemOperand(left, String::kLengthOffset));
|
||||
@ -3587,14 +3572,9 @@ void StringCompareStub::GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
}
|
||||
|
||||
|
||||
void StringCompareStub::GenerateAsciiCharsCompareLoop(
|
||||
MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
void StringHelper::GenerateAsciiCharsCompareLoop(
|
||||
MacroAssembler* masm, Register left, Register right, Register length,
|
||||
Register scratch1, Register scratch2, Register scratch3,
|
||||
Label* chars_not_equal) {
|
||||
// Change index to run from -length to -1 by adding length to string
|
||||
// start. This means that loop ends when index reaches zero, which
|
||||
@ -3648,7 +3628,7 @@ void StringCompareStub::Generate(MacroAssembler* masm) {
|
||||
// Compare flat ASCII strings natively. Remove arguments from stack first.
|
||||
__ IncrementCounter(counters->string_compare_native(), 1, a2, a3);
|
||||
__ Daddu(sp, sp, Operand(2 * kPointerSize));
|
||||
GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, a4, a5);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, a1, a0, a2, a3, a4, a5);
|
||||
|
||||
__ bind(&runtime);
|
||||
__ TailCallRuntime(Runtime::kStringCompare, 2, 1);
|
||||
@ -3948,11 +3928,11 @@ void ICCompareStub::GenerateStrings(MacroAssembler* masm) {
|
||||
|
||||
// Compare flat ASCII strings. Returns when done.
|
||||
if (equality) {
|
||||
StringCompareStub::GenerateFlatAsciiStringEquals(
|
||||
masm, left, right, tmp1, tmp2, tmp3);
|
||||
StringHelper::GenerateFlatAsciiStringEquals(masm, left, right, tmp1, tmp2,
|
||||
tmp3);
|
||||
} else {
|
||||
StringCompareStub::GenerateCompareFlatAsciiStrings(
|
||||
masm, left, right, tmp1, tmp2, tmp3, tmp4);
|
||||
StringHelper::GenerateCompareFlatAsciiStrings(masm, left, right, tmp1, tmp2,
|
||||
tmp3, tmp4);
|
||||
}
|
||||
|
||||
// Handle more complex cases in runtime.
|
||||
|
@ -15,24 +15,6 @@ namespace internal {
|
||||
void ArrayNativeCode(MacroAssembler* masm, Label* call_generic_code);
|
||||
|
||||
|
||||
class StoreBufferOverflowStub: public PlatformCodeStub {
|
||||
public:
|
||||
StoreBufferOverflowStub(Isolate* isolate, SaveFPRegsMode save_fp)
|
||||
: PlatformCodeStub(isolate), save_doubles_(save_fp) {}
|
||||
|
||||
void Generate(MacroAssembler* masm);
|
||||
|
||||
static void GenerateFixedRegStubsAheadOfTime(Isolate* isolate);
|
||||
virtual bool SometimesSetsUpAFrame() { return false; }
|
||||
|
||||
private:
|
||||
SaveFPRegsMode save_doubles_;
|
||||
|
||||
Major MajorKey() const { return StoreBufferOverflow; }
|
||||
uint32_t MinorKey() const { return (save_doubles_ == kSaveFPRegs) ? 1 : 0; }
|
||||
};
|
||||
|
||||
|
||||
class StringHelper : public AllStatic {
|
||||
public:
|
||||
// Generate code for copying a large number of characters. This function
|
||||
@ -58,23 +40,38 @@ class StringHelper : public AllStatic {
|
||||
static void GenerateHashGetHash(MacroAssembler* masm,
|
||||
Register hash);
|
||||
|
||||
// Compare two flat ASCII strings and returns result in v0.
|
||||
static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4);
|
||||
|
||||
// Compares two flat ASCII strings for equality and returns result in v0.
|
||||
static void GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3);
|
||||
|
||||
private:
|
||||
static void GenerateAsciiCharsCompareLoop(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Label* chars_not_equal);
|
||||
|
||||
private:
|
||||
DISALLOW_IMPLICIT_CONSTRUCTORS(StringHelper);
|
||||
};
|
||||
|
||||
|
||||
class SubStringStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit SubStringStub(Isolate* isolate) : PlatformCodeStub(isolate) {}
|
||||
|
||||
private:
|
||||
Major MajorKey() const { return SubString; }
|
||||
uint32_t MinorKey() const { return 0; }
|
||||
|
||||
void Generate(MacroAssembler* masm);
|
||||
};
|
||||
|
||||
|
||||
class StoreRegistersStateStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit StoreRegistersStateStub(Isolate* isolate)
|
||||
@ -101,44 +98,6 @@ class RestoreRegistersStateStub: public PlatformCodeStub {
|
||||
void Generate(MacroAssembler* masm);
|
||||
};
|
||||
|
||||
class StringCompareStub: public PlatformCodeStub {
|
||||
public:
|
||||
explicit StringCompareStub(Isolate* isolate) : PlatformCodeStub(isolate) { }
|
||||
|
||||
// Compare two flat ASCII strings and returns result in v0.
|
||||
static void GenerateCompareFlatAsciiStrings(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Register scratch4);
|
||||
|
||||
// Compares two flat ASCII strings for equality and returns result
|
||||
// in v0.
|
||||
static void GenerateFlatAsciiStringEquals(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3);
|
||||
|
||||
private:
|
||||
virtual Major MajorKey() const { return StringCompare; }
|
||||
virtual uint32_t MinorKey() const { return 0; }
|
||||
virtual void Generate(MacroAssembler* masm);
|
||||
|
||||
static void GenerateAsciiCharsCompareLoop(MacroAssembler* masm,
|
||||
Register left,
|
||||
Register right,
|
||||
Register length,
|
||||
Register scratch1,
|
||||
Register scratch2,
|
||||
Register scratch3,
|
||||
Label* chars_not_equal);
|
||||
};
|
||||
|
||||
|
||||
// This stub can convert a signed int32 to a heap number (double). It does
|
||||
// not work for int32s that are in Smi range! No GC occurs during this stub
|
||||
// so you don't have to set up the frame.
|
||||
|
Loading…
Reference in New Issue
Block a user