| OLD | NEW | 
|---|
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. | 
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without | 
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are | 
| 4 // met: | 4 // met: | 
| 5 // | 5 // | 
| 6 //     * Redistributions of source code must retain the above copyright | 6 //     * Redistributions of source code must retain the above copyright | 
| 7 //       notice, this list of conditions and the following disclaimer. | 7 //       notice, this list of conditions and the following disclaimer. | 
| 8 //     * Redistributions in binary form must reproduce the above | 8 //     * Redistributions in binary form must reproduce the above | 
| 9 //       copyright notice, this list of conditions and the following | 9 //       copyright notice, this list of conditions and the following | 
| 10 //       disclaimer in the documentation and/or other materials provided | 10 //       disclaimer in the documentation and/or other materials provided | 
| (...skipping 2478 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2489   Label done; | 2489   Label done; | 
| 2490   __ j(not_zero, &load_false); | 2490   __ j(not_zero, &load_false); | 
| 2491   __ LoadRoot(rax, Heap::kTrueValueRootIndex); | 2491   __ LoadRoot(rax, Heap::kTrueValueRootIndex); | 
| 2492   __ jmp(&done); | 2492   __ jmp(&done); | 
| 2493   __ bind(&load_false); | 2493   __ bind(&load_false); | 
| 2494   __ LoadRoot(rax, Heap::kFalseValueRootIndex); | 2494   __ LoadRoot(rax, Heap::kFalseValueRootIndex); | 
| 2495   __ bind(&done); | 2495   __ bind(&done); | 
| 2496 } | 2496 } | 
| 2497 | 2497 | 
| 2498 | 2498 | 
|  | 2499 void LCodeGen::DoInstanceSize(LInstanceSize* instr) { | 
|  | 2500   Register object = ToRegister(instr->object()); | 
|  | 2501   Register result = ToRegister(instr->result()); | 
|  | 2502   __ movq(result, FieldOperand(object, HeapObject::kMapOffset)); | 
|  | 2503   __ movzxbq(result, FieldOperand(result, Map::kInstanceSizeOffset)); | 
|  | 2504 } | 
|  | 2505 | 
|  | 2506 | 
| 2499 void LCodeGen::DoCmpT(LCmpT* instr) { | 2507 void LCodeGen::DoCmpT(LCmpT* instr) { | 
| 2500   Token::Value op = instr->op(); | 2508   Token::Value op = instr->op(); | 
| 2501 | 2509 | 
| 2502   Handle<Code> ic = CompareIC::GetUninitialized(op); | 2510   Handle<Code> ic = CompareIC::GetUninitialized(op); | 
| 2503   CallCode(ic, RelocInfo::CODE_TARGET, instr); | 2511   CallCode(ic, RelocInfo::CODE_TARGET, instr); | 
| 2504 | 2512 | 
| 2505   Condition condition = TokenToCondition(op, false); | 2513   Condition condition = TokenToCondition(op, false); | 
| 2506   Label true_value, done; | 2514   Label true_value, done; | 
| 2507   __ testq(rax, rax); | 2515   __ testq(rax, rax); | 
| 2508   __ j(condition, &true_value, Label::kNear); | 2516   __ j(condition, &true_value, Label::kNear); | 
| (...skipping 2535 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5044         : LDeferredCode(codegen), instr_(instr) { } | 5052         : LDeferredCode(codegen), instr_(instr) { } | 
| 5045     virtual void Generate() { codegen()->DoDeferredAllocate(instr_); } | 5053     virtual void Generate() { codegen()->DoDeferredAllocate(instr_); } | 
| 5046     virtual LInstruction* instr() { return instr_; } | 5054     virtual LInstruction* instr() { return instr_; } | 
| 5047    private: | 5055    private: | 
| 5048     LAllocate* instr_; | 5056     LAllocate* instr_; | 
| 5049   }; | 5057   }; | 
| 5050 | 5058 | 
| 5051   DeferredAllocate* deferred = | 5059   DeferredAllocate* deferred = | 
| 5052       new(zone()) DeferredAllocate(this, instr); | 5060       new(zone()) DeferredAllocate(this, instr); | 
| 5053 | 5061 | 
| 5054   Register size = ToRegister(instr->size()); |  | 
| 5055   Register result = ToRegister(instr->result()); | 5062   Register result = ToRegister(instr->result()); | 
| 5056   Register temp = ToRegister(instr->temp()); | 5063   Register temp = ToRegister(instr->temp()); | 
| 5057 | 5064 | 
| 5058   HAllocate* original_instr = instr->hydrogen(); | 5065   // Allocate memory for the object. | 
| 5059   if (original_instr->size()->IsConstant()) { | 5066   AllocationFlags flags = TAG_OBJECT; | 
| 5060     UNREACHABLE(); | 5067   if (instr->hydrogen()->MustAllocateDoubleAligned()) { | 
|  | 5068     flags = static_cast<AllocationFlags>(flags | DOUBLE_ALIGNMENT); | 
|  | 5069   } | 
|  | 5070   if (instr->size()->IsConstantOperand()) { | 
|  | 5071     int32_t size = ToInteger32(LConstantOperand::cast(instr->size())); | 
|  | 5072     __ AllocateInNewSpace(size, result, temp, no_reg, deferred->entry(), flags); | 
| 5061   } else { | 5073   } else { | 
| 5062     // Allocate memory for the object. | 5074     Register size = ToRegister(instr->size()); | 
| 5063     AllocationFlags flags = TAG_OBJECT; | 5075     __ AllocateInNewSpace(size, result, temp, no_reg, deferred->entry(), flags); | 
| 5064     if (original_instr->MustAllocateDoubleAligned()) { |  | 
| 5065       flags = static_cast<AllocationFlags>(flags | DOUBLE_ALIGNMENT); |  | 
| 5066     } |  | 
| 5067     __ AllocateInNewSpace(size, result, temp, no_reg, |  | 
| 5068                           deferred->entry(), flags); |  | 
| 5069   } | 5076   } | 
| 5070 | 5077 | 
| 5071   __ bind(deferred->exit()); | 5078   __ bind(deferred->exit()); | 
| 5072 } | 5079 } | 
| 5073 | 5080 | 
| 5074 | 5081 | 
| 5075 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 5082 void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 
| 5076   Register size = ToRegister(instr->size()); | 5083   Register size = ToRegister(instr->size()); | 
| 5077   Register result = ToRegister(instr->result()); | 5084   Register result = ToRegister(instr->result()); | 
| 5078 | 5085 | 
| (...skipping 218 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5297                instr->hydrogen()->allocation_site_mode()); | 5304                instr->hydrogen()->allocation_site_mode()); | 
| 5298   ASSERT_EQ(size, offset); | 5305   ASSERT_EQ(size, offset); | 
| 5299 } | 5306 } | 
| 5300 | 5307 | 
| 5301 | 5308 | 
| 5302 void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) { | 5309 void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) { | 
| 5303   Handle<FixedArray> literals(instr->environment()->closure()->literals()); | 5310   Handle<FixedArray> literals(instr->environment()->closure()->literals()); | 
| 5304   Handle<FixedArray> constant_properties = | 5311   Handle<FixedArray> constant_properties = | 
| 5305       instr->hydrogen()->constant_properties(); | 5312       instr->hydrogen()->constant_properties(); | 
| 5306 | 5313 | 
| 5307   // Set up the parameters to the stub/runtime call. |  | 
| 5308   __ PushHeapObject(literals); |  | 
| 5309   __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); |  | 
| 5310   __ Push(constant_properties); |  | 
| 5311   int flags = instr->hydrogen()->fast_elements() | 5314   int flags = instr->hydrogen()->fast_elements() | 
| 5312       ? ObjectLiteral::kFastElements | 5315       ? ObjectLiteral::kFastElements | 
| 5313       : ObjectLiteral::kNoFlags; | 5316       : ObjectLiteral::kNoFlags; | 
| 5314   flags |= instr->hydrogen()->has_function() | 5317   flags |= instr->hydrogen()->has_function() | 
| 5315       ? ObjectLiteral::kHasFunction | 5318       ? ObjectLiteral::kHasFunction | 
| 5316       : ObjectLiteral::kNoFlags; | 5319       : ObjectLiteral::kNoFlags; | 
| 5317   __ Push(Smi::FromInt(flags)); |  | 
| 5318 | 5320 | 
| 5319   // Pick the right runtime function or stub to call. | 5321   // Set up the parameters to the stub/runtime call and pick the right | 
|  | 5322   // runtime function or stub to call. | 
| 5320   int properties_count = constant_properties->length() / 2; | 5323   int properties_count = constant_properties->length() / 2; | 
| 5321   if (instr->hydrogen()->depth() > 1) { | 5324   if (instr->hydrogen()->depth() > 1) { | 
|  | 5325     __ PushHeapObject(literals); | 
|  | 5326     __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); | 
|  | 5327     __ Push(constant_properties); | 
|  | 5328     __ Push(Smi::FromInt(flags)); | 
| 5322     CallRuntime(Runtime::kCreateObjectLiteral, 4, instr); | 5329     CallRuntime(Runtime::kCreateObjectLiteral, 4, instr); | 
| 5323   } else if (flags != ObjectLiteral::kFastElements || | 5330   } else if (flags != ObjectLiteral::kFastElements || | 
| 5324       properties_count > FastCloneShallowObjectStub::kMaximumClonedProperties) { | 5331       properties_count > FastCloneShallowObjectStub::kMaximumClonedProperties) { | 
|  | 5332     __ PushHeapObject(literals); | 
|  | 5333     __ Push(Smi::FromInt(instr->hydrogen()->literal_index())); | 
|  | 5334     __ Push(constant_properties); | 
|  | 5335     __ Push(Smi::FromInt(flags)); | 
| 5325     CallRuntime(Runtime::kCreateObjectLiteralShallow, 4, instr); | 5336     CallRuntime(Runtime::kCreateObjectLiteralShallow, 4, instr); | 
| 5326   } else { | 5337   } else { | 
|  | 5338     __ LoadHeapObject(rax, literals); | 
|  | 5339     __ Move(rbx, Smi::FromInt(instr->hydrogen()->literal_index())); | 
|  | 5340     __ Move(rcx, constant_properties); | 
|  | 5341     __ Move(rdx, Smi::FromInt(flags)); | 
| 5327     FastCloneShallowObjectStub stub(properties_count); | 5342     FastCloneShallowObjectStub stub(properties_count); | 
| 5328     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 5343     CallCode(stub.GetCode(), RelocInfo::CODE_TARGET, instr); | 
| 5329   } | 5344   } | 
| 5330 } | 5345 } | 
| 5331 | 5346 | 
| 5332 | 5347 | 
| 5333 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 5348 void LCodeGen::DoToFastProperties(LToFastProperties* instr) { | 
| 5334   ASSERT(ToRegister(instr->value()).is(rax)); | 5349   ASSERT(ToRegister(instr->value()).is(rax)); | 
| 5335   __ push(rax); | 5350   __ push(rax); | 
| 5336   CallRuntime(Runtime::kToFastProperties, 1, instr); | 5351   CallRuntime(Runtime::kToFastProperties, 1, instr); | 
| (...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 5770                                FixedArray::kHeaderSize - kPointerSize)); | 5785                                FixedArray::kHeaderSize - kPointerSize)); | 
| 5771   __ bind(&done); | 5786   __ bind(&done); | 
| 5772 } | 5787 } | 
| 5773 | 5788 | 
| 5774 | 5789 | 
| 5775 #undef __ | 5790 #undef __ | 
| 5776 | 5791 | 
| 5777 } }  // namespace v8::internal | 5792 } }  // namespace v8::internal | 
| 5778 | 5793 | 
| 5779 #endif  // V8_TARGET_ARCH_X64 | 5794 #endif  // V8_TARGET_ARCH_X64 | 
| OLD | NEW | 
|---|