Index: src/mips/lithium-codegen-mips.cc |
diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc |
index ca1d2b5bb524b0e8d01fca52e55c88703578a9fb..08843b48e1aa88d1253e6294c44e5c07942319e5 100644 |
--- a/src/mips/lithium-codegen-mips.cc |
+++ b/src/mips/lithium-codegen-mips.cc |
@@ -1728,6 +1728,34 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) { |
} |
+Condition LCodeGen::EmitIsString(Register input, |
+ Register temp1, |
+ Label* is_not_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* false_label = chunk_->GetAssemblyLabel(false_block); |
+ |
+ Condition true_cond = |
+ EmitIsString(reg, temp1, false_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 +1781,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 +2114,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(); |