Revision f230a1cf deps/v8/src/ia32/full-codegen-ia32.cc
deps/v8/src/ia32/full-codegen-ia32.cc | ||
---|---|---|
158 | 158 |
FrameScope frame_scope(masm_, StackFrame::MANUAL); |
159 | 159 |
|
160 | 160 |
info->set_prologue_offset(masm_->pc_offset()); |
161 |
__ push(ebp); // Caller's frame pointer. |
|
162 |
__ mov(ebp, esp); |
|
163 |
__ push(esi); // Callee's context. |
|
164 |
__ push(edi); // Callee's JS Function. |
|
161 |
__ Prologue(BUILD_FUNCTION_FRAME); |
|
165 | 162 |
info->AddNoFrameRange(0, masm_->pc_offset()); |
166 | 163 |
|
167 | 164 |
{ Comment cmnt(masm_, "[ Allocate locals"); |
... | ... | |
1586 | 1583 |
: ObjectLiteral::kNoFlags; |
1587 | 1584 |
int properties_count = constant_properties->length() / 2; |
1588 | 1585 |
if ((FLAG_track_double_fields && expr->may_store_doubles()) || |
1589 |
expr->depth() > 1) { |
|
1590 |
__ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
|
1591 |
__ push(FieldOperand(edi, JSFunction::kLiteralsOffset)); |
|
1592 |
__ push(Immediate(Smi::FromInt(expr->literal_index()))); |
|
1593 |
__ push(Immediate(constant_properties)); |
|
1594 |
__ push(Immediate(Smi::FromInt(flags))); |
|
1595 |
__ CallRuntime(Runtime::kCreateObjectLiteral, 4); |
|
1596 |
} else if (Serializer::enabled() || flags != ObjectLiteral::kFastElements || |
|
1586 |
expr->depth() > 1 || Serializer::enabled() || |
|
1587 |
flags != ObjectLiteral::kFastElements || |
|
1597 | 1588 |
properties_count > FastCloneShallowObjectStub::kMaximumClonedProperties) { |
1598 | 1589 |
__ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
1599 | 1590 |
__ push(FieldOperand(edi, JSFunction::kLiteralsOffset)); |
1600 | 1591 |
__ push(Immediate(Smi::FromInt(expr->literal_index()))); |
1601 | 1592 |
__ push(Immediate(constant_properties)); |
1602 | 1593 |
__ push(Immediate(Smi::FromInt(flags))); |
1603 |
__ CallRuntime(Runtime::kCreateObjectLiteralShallow, 4);
|
|
1594 |
__ CallRuntime(Runtime::kCreateObjectLiteral, 4); |
|
1604 | 1595 |
} else { |
1605 | 1596 |
__ mov(edi, Operand(ebp, JavaScriptFrameConstants::kFunctionOffset)); |
1606 | 1597 |
__ mov(eax, FieldOperand(edi, JSFunction::kLiteralsOffset)); |
... | ... | |
3316 | 3307 |
__ cvtss2sd(xmm1, xmm1); |
3317 | 3308 |
__ xorps(xmm0, xmm1); |
3318 | 3309 |
__ subsd(xmm0, xmm1); |
3319 |
__ movdbl(FieldOperand(edi, HeapNumber::kValueOffset), xmm0);
|
|
3310 |
__ movsd(FieldOperand(edi, HeapNumber::kValueOffset), xmm0);
|
|
3320 | 3311 |
} else { |
3321 | 3312 |
// 0x4130000000000000 is 1.0 x 2^20 as a double. |
3322 | 3313 |
__ mov(FieldOperand(edi, HeapNumber::kExponentOffset), |
... | ... | |
3555 | 3546 |
ZoneList<Expression*>* args = expr->arguments(); |
3556 | 3547 |
ASSERT_EQ(args->length(), 1); |
3557 | 3548 |
|
3558 |
// Load the argument on the stack and call the stub.
|
|
3559 |
VisitForStackValue(args->at(0));
|
|
3549 |
// Load the argument into eax and call the stub.
|
|
3550 |
VisitForAccumulatorValue(args->at(0));
|
|
3560 | 3551 |
|
3561 | 3552 |
NumberToStringStub stub; |
3562 | 3553 |
__ CallStub(&stub); |
... | ... | |
4897 | 4888 |
|
4898 | 4889 |
#undef __ |
4899 | 4890 |
|
4891 |
|
|
4892 |
static const byte kJnsInstruction = 0x79; |
|
4893 |
static const byte kJnsOffset = 0x11; |
|
4894 |
static const byte kCallInstruction = 0xe8; |
|
4895 |
static const byte kNopByteOne = 0x66; |
|
4896 |
static const byte kNopByteTwo = 0x90; |
|
4897 |
|
|
4898 |
|
|
4899 |
void BackEdgeTable::PatchAt(Code* unoptimized_code, |
|
4900 |
Address pc, |
|
4901 |
BackEdgeState target_state, |
|
4902 |
Code* replacement_code) { |
|
4903 |
Address call_target_address = pc - kIntSize; |
|
4904 |
Address jns_instr_address = call_target_address - 3; |
|
4905 |
Address jns_offset_address = call_target_address - 2; |
|
4906 |
|
|
4907 |
switch (target_state) { |
|
4908 |
case INTERRUPT: |
|
4909 |
// sub <profiling_counter>, <delta> ;; Not changed |
|
4910 |
// jns ok |
|
4911 |
// call <interrupt stub> |
|
4912 |
// ok: |
|
4913 |
*jns_instr_address = kJnsInstruction; |
|
4914 |
*jns_offset_address = kJnsOffset; |
|
4915 |
break; |
|
4916 |
case ON_STACK_REPLACEMENT: |
|
4917 |
case OSR_AFTER_STACK_CHECK: |
|
4918 |
// sub <profiling_counter>, <delta> ;; Not changed |
|
4919 |
// nop |
|
4920 |
// nop |
|
4921 |
// call <on-stack replacment> |
|
4922 |
// ok: |
|
4923 |
*jns_instr_address = kNopByteOne; |
|
4924 |
*jns_offset_address = kNopByteTwo; |
|
4925 |
break; |
|
4926 |
} |
|
4927 |
|
|
4928 |
Assembler::set_target_address_at(call_target_address, |
|
4929 |
replacement_code->entry()); |
|
4930 |
unoptimized_code->GetHeap()->incremental_marking()->RecordCodeTargetPatch( |
|
4931 |
unoptimized_code, call_target_address, replacement_code); |
|
4932 |
} |
|
4933 |
|
|
4934 |
|
|
4935 |
BackEdgeTable::BackEdgeState BackEdgeTable::GetBackEdgeState( |
|
4936 |
Isolate* isolate, |
|
4937 |
Code* unoptimized_code, |
|
4938 |
Address pc) { |
|
4939 |
Address call_target_address = pc - kIntSize; |
|
4940 |
Address jns_instr_address = call_target_address - 3; |
|
4941 |
ASSERT_EQ(kCallInstruction, *(call_target_address - 1)); |
|
4942 |
|
|
4943 |
if (*jns_instr_address == kJnsInstruction) { |
|
4944 |
ASSERT_EQ(kJnsOffset, *(call_target_address - 2)); |
|
4945 |
ASSERT_EQ(isolate->builtins()->InterruptCheck()->entry(), |
|
4946 |
Assembler::target_address_at(call_target_address)); |
|
4947 |
return INTERRUPT; |
|
4948 |
} |
|
4949 |
|
|
4950 |
ASSERT_EQ(kNopByteOne, *jns_instr_address); |
|
4951 |
ASSERT_EQ(kNopByteTwo, *(call_target_address - 2)); |
|
4952 |
|
|
4953 |
if (Assembler::target_address_at(call_target_address) == |
|
4954 |
isolate->builtins()->OnStackReplacement()->entry()) { |
|
4955 |
return ON_STACK_REPLACEMENT; |
|
4956 |
} |
|
4957 |
|
|
4958 |
ASSERT_EQ(isolate->builtins()->OsrAfterStackCheck()->entry(), |
|
4959 |
Assembler::target_address_at(call_target_address)); |
|
4960 |
return OSR_AFTER_STACK_CHECK; |
|
4961 |
} |
|
4962 |
|
|
4963 |
|
|
4900 | 4964 |
} } // namespace v8::internal |
4901 | 4965 |
|
4902 | 4966 |
#endif // V8_TARGET_ARCH_IA32 |
Also available in: Unified diff