| Index: src/mips/lithium-codegen-mips.cc
|
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc
|
| index e640b53e8df0c4e06e351d9b5e132b7ff7a99c1e..56d07fa0945006c65ebb2ca7baaf58386e474077 100644
|
| --- a/src/mips/lithium-codegen-mips.cc
|
| +++ b/src/mips/lithium-codegen-mips.cc
|
| @@ -1728,6 +1728,36 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
| }
|
|
|
|
|
| +Condition LCodeGen::EmitIsString(Register input,
|
| + Register temp1,
|
| + Label* is_not_string,
|
| + Label* is_string) {
|
| + __ JumpIfSmi(input, is_not_string);
|
| + __ GetObjectType(input, temp1, temp1);
|
| + __ Branch(is_not_string, ge, temp1, Operand(FIRST_NONSTRING_TYPE));
|
| +
|
| + return lt;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
|
| + Register reg = ToRegister(instr->InputAt(0));
|
| + Register temp1 = ToRegister(instr->TempAt(0));
|
| + Register temp2 = scratch0();
|
| +
|
| + int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| + int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| + Label* true_label = chunk_->GetAssemblyLabel(true_block);
|
| + Label* false_label = chunk_->GetAssemblyLabel(false_block);
|
| +
|
| + Condition true_cond =
|
| + EmitIsString(reg, temp1, false_label, true_label);
|
| +
|
| + EmitBranch(true_block, false_block, true_cond, temp2,
|
| + Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE));
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
|
| int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| @@ -1753,6 +1783,42 @@ void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
|
| }
|
|
|
|
|
| +static Condition ComputeCompareCondition(Token::Value op) {
|
| + switch (op) {
|
| + case Token::EQ_STRICT:
|
| + case Token::EQ:
|
| + return eq;
|
| + case Token::LT:
|
| + return lt;
|
| + case Token::GT:
|
| + return gt;
|
| + case Token::LTE:
|
| + return le;
|
| + case Token::GTE:
|
| + return ge;
|
| + default:
|
| + UNREACHABLE();
|
| + return kNoCondition;
|
| + }
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoStringCompareAndBranch(LStringCompareAndBranch* instr) {
|
| + Token::Value op = instr->op();
|
| + int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| + int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| +
|
| + Handle<Code> ic = CompareIC::GetUninitialized(op);
|
| + CallCode(ic, RelocInfo::CODE_TARGET, instr);
|
| + // On MIPS there is no need for a "no inlined smi code" marker (nop).
|
| +
|
| + Condition condition = ComputeCompareCondition(op);
|
| +
|
| + EmitBranch(true_block, false_block, condition, at,
|
| + Operand(LAST_NONCALLABLE_SPEC_OBJECT_TYPE));
|
| +}
|
| +
|
| +
|
| static InstanceType TestType(HHasInstanceTypeAndBranch* instr) {
|
| InstanceType from = instr->from();
|
| InstanceType to = instr->to();
|
| @@ -2050,26 +2116,6 @@ void LCodeGen::DoDeferredLInstanceOfKnownGlobal(LInstanceOfKnownGlobal* instr,
|
| }
|
|
|
|
|
| -static Condition ComputeCompareCondition(Token::Value op) {
|
| - switch (op) {
|
| - case Token::EQ_STRICT:
|
| - case Token::EQ:
|
| - return eq;
|
| - case Token::LT:
|
| - return lt;
|
| - case Token::GT:
|
| - return gt;
|
| - case Token::LTE:
|
| - return le;
|
| - case Token::GTE:
|
| - return ge;
|
| - default:
|
| - UNREACHABLE();
|
| - return kNoCondition;
|
| - }
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoCmpT(LCmpT* instr) {
|
| Token::Value op = instr->op();
|
|
|
|
|