| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "v8.h" | 5 #include "v8.h" |
| 6 | 6 |
| 7 #include "arm/lithium-codegen-arm.h" | 7 #include "arm/lithium-codegen-arm.h" |
| 8 #include "arm/lithium-gap-resolver-arm.h" | 8 #include "arm/lithium-gap-resolver-arm.h" |
| 9 #include "code-stubs.h" | 9 #include "code-stubs.h" |
| 10 #include "stub-cache.h" | 10 #include "stub-cache.h" |
| (...skipping 2510 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2521 | 2521 |
| 2522 return lt; | 2522 return lt; |
| 2523 } | 2523 } |
| 2524 | 2524 |
| 2525 | 2525 |
| 2526 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { | 2526 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { |
| 2527 Register reg = ToRegister(instr->value()); | 2527 Register reg = ToRegister(instr->value()); |
| 2528 Register temp1 = ToRegister(instr->temp()); | 2528 Register temp1 = ToRegister(instr->temp()); |
| 2529 | 2529 |
| 2530 SmiCheck check_needed = | 2530 SmiCheck check_needed = |
| 2531 instr->hydrogen()->value()->IsHeapObject() | 2531 instr->hydrogen()->value()->type().IsHeapObject() |
| 2532 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 2532 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 2533 Condition true_cond = | 2533 Condition true_cond = |
| 2534 EmitIsString(reg, temp1, instr->FalseLabel(chunk_), check_needed); | 2534 EmitIsString(reg, temp1, instr->FalseLabel(chunk_), check_needed); |
| 2535 | 2535 |
| 2536 EmitBranch(instr, true_cond); | 2536 EmitBranch(instr, true_cond); |
| 2537 } | 2537 } |
| 2538 | 2538 |
| 2539 | 2539 |
| 2540 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { | 2540 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { |
| 2541 Register input_reg = EmitLoadRegister(instr->value(), ip); | 2541 Register input_reg = EmitLoadRegister(instr->value(), ip); |
| 2542 __ SmiTst(input_reg); | 2542 __ SmiTst(input_reg); |
| 2543 EmitBranch(instr, eq); | 2543 EmitBranch(instr, eq); |
| 2544 } | 2544 } |
| 2545 | 2545 |
| 2546 | 2546 |
| 2547 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { | 2547 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { |
| 2548 Register input = ToRegister(instr->value()); | 2548 Register input = ToRegister(instr->value()); |
| 2549 Register temp = ToRegister(instr->temp()); | 2549 Register temp = ToRegister(instr->temp()); |
| 2550 | 2550 |
| 2551 if (!instr->hydrogen()->value()->IsHeapObject()) { | 2551 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 2552 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); | 2552 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
| 2553 } | 2553 } |
| 2554 __ ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset)); | 2554 __ ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset)); |
| 2555 __ ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset)); | 2555 __ ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset)); |
| 2556 __ tst(temp, Operand(1 << Map::kIsUndetectable)); | 2556 __ tst(temp, Operand(1 << Map::kIsUndetectable)); |
| 2557 EmitBranch(instr, ne); | 2557 EmitBranch(instr, ne); |
| 2558 } | 2558 } |
| 2559 | 2559 |
| 2560 | 2560 |
| 2561 static Condition ComputeCompareCondition(Token::Value op) { | 2561 static Condition ComputeCompareCondition(Token::Value op) { |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2610 if (from == FIRST_TYPE) return ls; | 2610 if (from == FIRST_TYPE) return ls; |
| 2611 UNREACHABLE(); | 2611 UNREACHABLE(); |
| 2612 return eq; | 2612 return eq; |
| 2613 } | 2613 } |
| 2614 | 2614 |
| 2615 | 2615 |
| 2616 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { | 2616 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { |
| 2617 Register scratch = scratch0(); | 2617 Register scratch = scratch0(); |
| 2618 Register input = ToRegister(instr->value()); | 2618 Register input = ToRegister(instr->value()); |
| 2619 | 2619 |
| 2620 if (!instr->hydrogen()->value()->IsHeapObject()) { | 2620 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 2621 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); | 2621 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
| 2622 } | 2622 } |
| 2623 | 2623 |
| 2624 __ CompareObjectType(input, scratch, scratch, TestType(instr->hydrogen())); | 2624 __ CompareObjectType(input, scratch, scratch, TestType(instr->hydrogen())); |
| 2625 EmitBranch(instr, BranchCondition(instr->hydrogen())); | 2625 EmitBranch(instr, BranchCondition(instr->hydrogen())); |
| 2626 } | 2626 } |
| 2627 | 2627 |
| 2628 | 2628 |
| 2629 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) { | 2629 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) { |
| 2630 Register input = ToRegister(instr->value()); | 2630 Register input = ToRegister(instr->value()); |
| (...skipping 381 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3012 if (instr->hydrogen()->DeoptimizesOnHole()) { | 3012 if (instr->hydrogen()->DeoptimizesOnHole()) { |
| 3013 DeoptimizeIf(eq, instr->environment()); | 3013 DeoptimizeIf(eq, instr->environment()); |
| 3014 } else { | 3014 } else { |
| 3015 __ b(ne, &skip_assignment); | 3015 __ b(ne, &skip_assignment); |
| 3016 } | 3016 } |
| 3017 } | 3017 } |
| 3018 | 3018 |
| 3019 __ str(value, target); | 3019 __ str(value, target); |
| 3020 if (instr->hydrogen()->NeedsWriteBarrier()) { | 3020 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 3021 SmiCheck check_needed = | 3021 SmiCheck check_needed = |
| 3022 instr->hydrogen()->value()->IsHeapObject() | 3022 instr->hydrogen()->value()->type().IsHeapObject() |
| 3023 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 3023 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 3024 __ RecordWriteContextSlot(context, | 3024 __ RecordWriteContextSlot(context, |
| 3025 target.offset(), | 3025 target.offset(), |
| 3026 value, | 3026 value, |
| 3027 scratch, | 3027 scratch, |
| 3028 GetLinkRegisterState(), | 3028 GetLinkRegisterState(), |
| 3029 kSaveFPRegs, | 3029 kSaveFPRegs, |
| 3030 EMIT_REMEMBERED_SET, | 3030 EMIT_REMEMBERED_SET, |
| 3031 check_needed); | 3031 check_needed); |
| 3032 } | 3032 } |
| (...skipping 1285 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4318 if (instr->hydrogen()->key()->representation().IsSmi()) { | 4318 if (instr->hydrogen()->key()->representation().IsSmi()) { |
| 4319 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key)); | 4319 __ add(scratch, elements, Operand::PointerOffsetFromSmiKey(key)); |
| 4320 } else { | 4320 } else { |
| 4321 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2)); | 4321 __ add(scratch, elements, Operand(key, LSL, kPointerSizeLog2)); |
| 4322 } | 4322 } |
| 4323 } | 4323 } |
| 4324 __ str(value, MemOperand(store_base, offset)); | 4324 __ str(value, MemOperand(store_base, offset)); |
| 4325 | 4325 |
| 4326 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4326 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4327 SmiCheck check_needed = | 4327 SmiCheck check_needed = |
| 4328 instr->hydrogen()->value()->IsHeapObject() | 4328 instr->hydrogen()->value()->type().IsHeapObject() |
| 4329 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4329 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4330 // Compute address of modified element and store it into key register. | 4330 // Compute address of modified element and store it into key register. |
| 4331 __ add(key, store_base, Operand(offset)); | 4331 __ add(key, store_base, Operand(offset)); |
| 4332 __ RecordWrite(elements, | 4332 __ RecordWrite(elements, |
| 4333 key, | 4333 key, |
| 4334 value, | 4334 value, |
| 4335 GetLinkRegisterState(), | 4335 GetLinkRegisterState(), |
| 4336 kSaveFPRegs, | 4336 kSaveFPRegs, |
| 4337 EMIT_REMEMBERED_SET, | 4337 EMIT_REMEMBERED_SET, |
| 4338 check_needed); | 4338 check_needed); |
| (...skipping 676 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5015 | 5015 |
| 5016 | 5016 |
| 5017 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { | 5017 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { |
| 5018 LOperand* input = instr->value(); | 5018 LOperand* input = instr->value(); |
| 5019 __ SmiTst(ToRegister(input)); | 5019 __ SmiTst(ToRegister(input)); |
| 5020 DeoptimizeIf(ne, instr->environment()); | 5020 DeoptimizeIf(ne, instr->environment()); |
| 5021 } | 5021 } |
| 5022 | 5022 |
| 5023 | 5023 |
| 5024 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { | 5024 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { |
| 5025 if (!instr->hydrogen()->value()->IsHeapObject()) { | 5025 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 5026 LOperand* input = instr->value(); | 5026 LOperand* input = instr->value(); |
| 5027 __ SmiTst(ToRegister(input)); | 5027 __ SmiTst(ToRegister(input)); |
| 5028 DeoptimizeIf(eq, instr->environment()); | 5028 DeoptimizeIf(eq, instr->environment()); |
| 5029 } | 5029 } |
| 5030 } | 5030 } |
| 5031 | 5031 |
| 5032 | 5032 |
| 5033 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { | 5033 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { |
| 5034 Register input = ToRegister(instr->value()); | 5034 Register input = ToRegister(instr->value()); |
| 5035 Register scratch = scratch0(); | 5035 Register scratch = scratch0(); |
| (...skipping 784 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5820 __ ldr(result, FieldMemOperand(scratch, | 5820 __ ldr(result, FieldMemOperand(scratch, |
| 5821 FixedArray::kHeaderSize - kPointerSize)); | 5821 FixedArray::kHeaderSize - kPointerSize)); |
| 5822 __ bind(deferred->exit()); | 5822 __ bind(deferred->exit()); |
| 5823 __ bind(&done); | 5823 __ bind(&done); |
| 5824 } | 5824 } |
| 5825 | 5825 |
| 5826 | 5826 |
| 5827 #undef __ | 5827 #undef __ |
| 5828 | 5828 |
| 5829 } } // namespace v8::internal | 5829 } } // namespace v8::internal |
| OLD | NEW |