| Index: src/arm/lithium-codegen-arm.cc
|
| diff --git a/src/arm/lithium-codegen-arm.cc b/src/arm/lithium-codegen-arm.cc
|
| index 0ad42db4f3f925290a9713028e9734cfe1031954..d4b90869fbcfd85afb8b88f1071a0ec18f9e1f91 100644
|
| --- a/src/arm/lithium-codegen-arm.cc
|
| +++ b/src/arm/lithium-codegen-arm.cc
|
| @@ -1846,13 +1846,6 @@ void LCodeGen::DoConstantT(LConstantT* instr) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoFixedArrayBaseLength(LFixedArrayBaseLength* instr) {
|
| - Register result = ToRegister(instr->result());
|
| - Register array = ToRegister(instr->value());
|
| - __ ldr(result, FieldMemOperand(array, FixedArrayBase::kLengthOffset));
|
| -}
|
| -
|
| -
|
| void LCodeGen::DoMapEnumLength(LMapEnumLength* instr) {
|
| Register result = ToRegister(instr->result());
|
| Register map = ToRegister(instr->value());
|
| @@ -2137,12 +2130,12 @@ int LCodeGen::GetNextEmittedBlock() const {
|
|
|
| template<class InstrType>
|
| void LCodeGen::EmitBranch(InstrType instr, Condition cc) {
|
| - int right_block = instr->FalseDestination(chunk_);
|
| int left_block = instr->TrueDestination(chunk_);
|
| + int right_block = instr->FalseDestination(chunk_);
|
|
|
| int next_block = GetNextEmittedBlock();
|
|
|
| - if (right_block == left_block) {
|
| + if (right_block == left_block || cc == al) {
|
| EmitGoto(left_block);
|
| } else if (left_block == next_block) {
|
| __ b(NegateCondition(cc), chunk_->GetAssemblyLabel(right_block));
|
| @@ -2160,6 +2153,25 @@ void LCodeGen::DoDebugBreak(LDebugBreak* instr) {
|
| }
|
|
|
|
|
| +void LCodeGen::DoIsNumberAndBranch(LIsNumberAndBranch* instr) {
|
| + Representation r = instr->hydrogen()->value()->representation();
|
| + if (r.IsSmiOrInteger32() || r.IsDouble()) {
|
| + EmitBranch(instr, al);
|
| + } else {
|
| + ASSERT(r.IsTagged());
|
| + Register reg = ToRegister(instr->value());
|
| + HType type = instr->hydrogen()->value()->type();
|
| + if (type.IsTaggedNumber()) {
|
| + EmitBranch(instr, al);
|
| + }
|
| + __ JumpIfSmi(reg, instr->TrueLabel(chunk_));
|
| + __ ldr(scratch0(), FieldMemOperand(reg, HeapObject::kMapOffset));
|
| + __ CompareRoot(scratch0(), Heap::kHeapNumberMapRootIndex);
|
| + EmitBranch(instr, eq);
|
| + }
|
| +}
|
| +
|
| +
|
| void LCodeGen::DoBranch(LBranch* instr) {
|
| Representation r = instr->hydrogen()->value()->representation();
|
| if (r.IsInteger32() || r.IsSmi()) {
|
| @@ -2336,7 +2348,7 @@ Condition LCodeGen::TokenToCondition(Token::Value op, bool is_unsigned) {
|
| }
|
|
|
|
|
| -void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) {
|
| +void LCodeGen::DoCompareNumericAndBranch(LCompareNumericAndBranch* instr) {
|
| LOperand* left = instr->left();
|
| LOperand* right = instr->right();
|
| Condition cond = TokenToCondition(instr->op(), false);
|
| @@ -4129,11 +4141,14 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
| __ mov(r0, Operand(instr->arity()));
|
| __ mov(r2, Operand(instr->hydrogen()->property_cell()));
|
| ElementsKind kind = instr->hydrogen()->elements_kind();
|
| - bool disable_allocation_sites =
|
| - (AllocationSiteInfo::GetMode(kind) == TRACK_ALLOCATION_SITE);
|
| + AllocationSiteOverrideMode override_mode =
|
| + (AllocationSite::GetMode(kind) == TRACK_ALLOCATION_SITE)
|
| + ? DISABLE_ALLOCATION_SITES
|
| + : DONT_OVERRIDE;
|
| + ContextCheckMode context_mode = CONTEXT_CHECK_NOT_REQUIRED;
|
|
|
| if (instr->arity() == 0) {
|
| - ArrayNoArgumentConstructorStub stub(kind, disable_allocation_sites);
|
| + ArrayNoArgumentConstructorStub stub(kind, context_mode, override_mode);
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| } else if (instr->arity() == 1) {
|
| Label done;
|
| @@ -4146,18 +4161,18 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) {
|
| __ b(eq, &packed_case);
|
|
|
| ElementsKind holey_kind = GetHoleyElementsKind(kind);
|
| - ArraySingleArgumentConstructorStub stub(holey_kind,
|
| - disable_allocation_sites);
|
| + ArraySingleArgumentConstructorStub stub(holey_kind, context_mode,
|
| + override_mode);
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| __ jmp(&done);
|
| __ bind(&packed_case);
|
| }
|
|
|
| - ArraySingleArgumentConstructorStub stub(kind, disable_allocation_sites);
|
| + ArraySingleArgumentConstructorStub stub(kind, context_mode, override_mode);
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| __ bind(&done);
|
| } else {
|
| - ArrayNArgumentsConstructorStub stub(kind, disable_allocation_sites);
|
| + ArrayNArgumentsConstructorStub stub(kind, context_mode, override_mode);
|
| CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr);
|
| }
|
| }
|
|
|