| 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 #if V8_TARGET_ARCH_IA32 | 7 #if V8_TARGET_ARCH_IA32 |
| 8 | 8 |
| 9 #include "ia32/lithium-codegen-ia32.h" | 9 #include "ia32/lithium-codegen-ia32.h" |
| 10 #include "ic.h" | 10 #include "ic.h" |
| (...skipping 2380 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2391 | 2391 |
| 2392 return cond; | 2392 return cond; |
| 2393 } | 2393 } |
| 2394 | 2394 |
| 2395 | 2395 |
| 2396 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { | 2396 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { |
| 2397 Register reg = ToRegister(instr->value()); | 2397 Register reg = ToRegister(instr->value()); |
| 2398 Register temp = ToRegister(instr->temp()); | 2398 Register temp = ToRegister(instr->temp()); |
| 2399 | 2399 |
| 2400 SmiCheck check_needed = | 2400 SmiCheck check_needed = |
| 2401 instr->hydrogen()->value()->IsHeapObject() | 2401 instr->hydrogen()->value()->type().IsHeapObject() |
| 2402 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 2402 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 2403 | 2403 |
| 2404 Condition true_cond = EmitIsString( | 2404 Condition true_cond = EmitIsString( |
| 2405 reg, temp, instr->FalseLabel(chunk_), check_needed); | 2405 reg, temp, instr->FalseLabel(chunk_), check_needed); |
| 2406 | 2406 |
| 2407 EmitBranch(instr, true_cond); | 2407 EmitBranch(instr, true_cond); |
| 2408 } | 2408 } |
| 2409 | 2409 |
| 2410 | 2410 |
| 2411 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { | 2411 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { |
| 2412 Operand input = ToOperand(instr->value()); | 2412 Operand input = ToOperand(instr->value()); |
| 2413 | 2413 |
| 2414 __ test(input, Immediate(kSmiTagMask)); | 2414 __ test(input, Immediate(kSmiTagMask)); |
| 2415 EmitBranch(instr, zero); | 2415 EmitBranch(instr, zero); |
| 2416 } | 2416 } |
| 2417 | 2417 |
| 2418 | 2418 |
| 2419 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { | 2419 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { |
| 2420 Register input = ToRegister(instr->value()); | 2420 Register input = ToRegister(instr->value()); |
| 2421 Register temp = ToRegister(instr->temp()); | 2421 Register temp = ToRegister(instr->temp()); |
| 2422 | 2422 |
| 2423 if (!instr->hydrogen()->value()->IsHeapObject()) { | 2423 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 2424 STATIC_ASSERT(kSmiTag == 0); | 2424 STATIC_ASSERT(kSmiTag == 0); |
| 2425 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); | 2425 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
| 2426 } | 2426 } |
| 2427 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset)); | 2427 __ mov(temp, FieldOperand(input, HeapObject::kMapOffset)); |
| 2428 __ test_b(FieldOperand(temp, Map::kBitFieldOffset), | 2428 __ test_b(FieldOperand(temp, Map::kBitFieldOffset), |
| 2429 1 << Map::kIsUndetectable); | 2429 1 << Map::kIsUndetectable); |
| 2430 EmitBranch(instr, not_zero); | 2430 EmitBranch(instr, not_zero); |
| 2431 } | 2431 } |
| 2432 | 2432 |
| 2433 | 2433 |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2481 if (from == FIRST_TYPE) return below_equal; | 2481 if (from == FIRST_TYPE) return below_equal; |
| 2482 UNREACHABLE(); | 2482 UNREACHABLE(); |
| 2483 return equal; | 2483 return equal; |
| 2484 } | 2484 } |
| 2485 | 2485 |
| 2486 | 2486 |
| 2487 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { | 2487 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { |
| 2488 Register input = ToRegister(instr->value()); | 2488 Register input = ToRegister(instr->value()); |
| 2489 Register temp = ToRegister(instr->temp()); | 2489 Register temp = ToRegister(instr->temp()); |
| 2490 | 2490 |
| 2491 if (!instr->hydrogen()->value()->IsHeapObject()) { | 2491 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 2492 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); | 2492 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); |
| 2493 } | 2493 } |
| 2494 | 2494 |
| 2495 __ CmpObjectType(input, TestType(instr->hydrogen()), temp); | 2495 __ CmpObjectType(input, TestType(instr->hydrogen()), temp); |
| 2496 EmitBranch(instr, BranchCondition(instr->hydrogen())); | 2496 EmitBranch(instr, BranchCondition(instr->hydrogen())); |
| 2497 } | 2497 } |
| 2498 | 2498 |
| 2499 | 2499 |
| 2500 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) { | 2500 void LCodeGen::DoGetCachedArrayIndex(LGetCachedArrayIndex* instr) { |
| 2501 Register input = ToRegister(instr->value()); | 2501 Register input = ToRegister(instr->value()); |
| (...skipping 385 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2887 if (instr->hydrogen()->DeoptimizesOnHole()) { | 2887 if (instr->hydrogen()->DeoptimizesOnHole()) { |
| 2888 DeoptimizeIf(equal, instr->environment()); | 2888 DeoptimizeIf(equal, instr->environment()); |
| 2889 } else { | 2889 } else { |
| 2890 __ j(not_equal, &skip_assignment, Label::kNear); | 2890 __ j(not_equal, &skip_assignment, Label::kNear); |
| 2891 } | 2891 } |
| 2892 } | 2892 } |
| 2893 | 2893 |
| 2894 __ mov(target, value); | 2894 __ mov(target, value); |
| 2895 if (instr->hydrogen()->NeedsWriteBarrier()) { | 2895 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 2896 SmiCheck check_needed = | 2896 SmiCheck check_needed = |
| 2897 instr->hydrogen()->value()->IsHeapObject() | 2897 instr->hydrogen()->value()->type().IsHeapObject() |
| 2898 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 2898 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 2899 Register temp = ToRegister(instr->temp()); | 2899 Register temp = ToRegister(instr->temp()); |
| 2900 int offset = Context::SlotOffset(instr->slot_index()); | 2900 int offset = Context::SlotOffset(instr->slot_index()); |
| 2901 __ RecordWriteContextSlot(context, | 2901 __ RecordWriteContextSlot(context, |
| 2902 offset, | 2902 offset, |
| 2903 value, | 2903 value, |
| 2904 temp, | 2904 temp, |
| 2905 kSaveFPRegs, | 2905 kSaveFPRegs, |
| 2906 EMIT_REMEMBERED_SET, | 2906 EMIT_REMEMBERED_SET, |
| 2907 check_needed); | 2907 check_needed); |
| (...skipping 1295 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4203 Handle<Object> handle_value = ToHandle(operand_value); | 4203 Handle<Object> handle_value = ToHandle(operand_value); |
| 4204 __ mov(operand, handle_value); | 4204 __ mov(operand, handle_value); |
| 4205 } | 4205 } |
| 4206 } | 4206 } |
| 4207 | 4207 |
| 4208 if (instr->hydrogen()->NeedsWriteBarrier()) { | 4208 if (instr->hydrogen()->NeedsWriteBarrier()) { |
| 4209 ASSERT(instr->value()->IsRegister()); | 4209 ASSERT(instr->value()->IsRegister()); |
| 4210 Register value = ToRegister(instr->value()); | 4210 Register value = ToRegister(instr->value()); |
| 4211 ASSERT(!instr->key()->IsConstantOperand()); | 4211 ASSERT(!instr->key()->IsConstantOperand()); |
| 4212 SmiCheck check_needed = | 4212 SmiCheck check_needed = |
| 4213 instr->hydrogen()->value()->IsHeapObject() | 4213 instr->hydrogen()->value()->type().IsHeapObject() |
| 4214 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; | 4214 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; |
| 4215 // Compute address of modified element and store it into key register. | 4215 // Compute address of modified element and store it into key register. |
| 4216 __ lea(key, operand); | 4216 __ lea(key, operand); |
| 4217 __ RecordWrite(elements, | 4217 __ RecordWrite(elements, |
| 4218 key, | 4218 key, |
| 4219 value, | 4219 value, |
| 4220 kSaveFPRegs, | 4220 kSaveFPRegs, |
| 4221 EMIT_REMEMBERED_SET, | 4221 EMIT_REMEMBERED_SET, |
| 4222 check_needed); | 4222 check_needed); |
| 4223 } | 4223 } |
| (...skipping 630 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4854 | 4854 |
| 4855 | 4855 |
| 4856 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { | 4856 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { |
| 4857 LOperand* input = instr->value(); | 4857 LOperand* input = instr->value(); |
| 4858 __ test(ToOperand(input), Immediate(kSmiTagMask)); | 4858 __ test(ToOperand(input), Immediate(kSmiTagMask)); |
| 4859 DeoptimizeIf(not_zero, instr->environment()); | 4859 DeoptimizeIf(not_zero, instr->environment()); |
| 4860 } | 4860 } |
| 4861 | 4861 |
| 4862 | 4862 |
| 4863 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { | 4863 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { |
| 4864 if (!instr->hydrogen()->value()->IsHeapObject()) { | 4864 if (!instr->hydrogen()->value()->type().IsHeapObject()) { |
| 4865 LOperand* input = instr->value(); | 4865 LOperand* input = instr->value(); |
| 4866 __ test(ToOperand(input), Immediate(kSmiTagMask)); | 4866 __ test(ToOperand(input), Immediate(kSmiTagMask)); |
| 4867 DeoptimizeIf(zero, instr->environment()); | 4867 DeoptimizeIf(zero, instr->environment()); |
| 4868 } | 4868 } |
| 4869 } | 4869 } |
| 4870 | 4870 |
| 4871 | 4871 |
| 4872 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { | 4872 void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { |
| 4873 Register input = ToRegister(instr->value()); | 4873 Register input = ToRegister(instr->value()); |
| 4874 Register temp = ToRegister(instr->temp()); | 4874 Register temp = ToRegister(instr->temp()); |
| (...skipping 783 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5658 __ bind(deferred->exit()); | 5658 __ bind(deferred->exit()); |
| 5659 __ bind(&done); | 5659 __ bind(&done); |
| 5660 } | 5660 } |
| 5661 | 5661 |
| 5662 | 5662 |
| 5663 #undef __ | 5663 #undef __ |
| 5664 | 5664 |
| 5665 } } // namespace v8::internal | 5665 } } // namespace v8::internal |
| 5666 | 5666 |
| 5667 #endif // V8_TARGET_ARCH_IA32 | 5667 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |