Revision f230a1cf deps/v8/src/ia32/full-codegen-ia32.cc

View differences:

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