| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index db1a365b948156b17ce25c3233d4ccece1aba1c0..61bdf68a13a0998600954aa377b5418e4fe125a8 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -1812,6 +1812,31 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
|
| }
|
|
|
|
|
| +Condition LCodeGen::EmitIsString(Register input,
|
| + Register temp1,
|
| + Label* is_not_string) {
|
| + __ JumpIfSmi(input, is_not_string);
|
| + __ CompareObjectType(input, temp1, temp1, FIRST_NONSTRING_TYPE);
|
| +
|
| + return lt;
|
| +}
|
| +
|
| +
|
| +void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
|
| + Register reg = ToRegister(instr->InputAt(0));
|
| + Register temp1 = ToRegister(instr->TempAt(0));
|
| +
|
| + 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);
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
|
| int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| @@ -1837,6 +1862,41 @@ 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);
|
| + __ cmp(r0, Operand(0)); // This instruction also signals no smi code inlined.
|
| +
|
| + Condition condition = ComputeCompareCondition(op);
|
| +
|
| + EmitBranch(true_block, false_block, condition);
|
| +}
|
| +
|
| +
|
| static InstanceType TestType(HHasInstanceTypeAndBranch* instr) {
|
| InstanceType from = instr->from();
|
| InstanceType to = instr->to();
|
| @@ -2125,26 +2185,6 @@ void LCodeGen::DoDeferredInstanceOfKnownGlobal(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();
|
|
|
|
|