| Index: src/arm/simulator-arm.cc
|
| ===================================================================
|
| --- src/arm/simulator-arm.cc (revision 7180)
|
| +++ src/arm/simulator-arm.cc (working copy)
|
| @@ -1005,7 +1005,9 @@
|
| intptr_t* ptr = reinterpret_cast<intptr_t*>(addr);
|
| return *ptr;
|
| }
|
| - PrintF("Unaligned read at 0x%08x, pc=%p\n", addr, instr);
|
| + PrintF("Unaligned read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| UNIMPLEMENTED();
|
| return 0;
|
| #endif
|
| @@ -1023,7 +1025,9 @@
|
| *ptr = value;
|
| return;
|
| }
|
| - PrintF("Unaligned write at 0x%08x, pc=%p\n", addr, instr);
|
| + PrintF("Unaligned write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| UNIMPLEMENTED();
|
| #endif
|
| }
|
| @@ -1038,7 +1042,9 @@
|
| uint16_t* ptr = reinterpret_cast<uint16_t*>(addr);
|
| return *ptr;
|
| }
|
| - PrintF("Unaligned unsigned halfword read at 0x%08x, pc=%p\n", addr, instr);
|
| + PrintF("Unaligned unsigned halfword read at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| UNIMPLEMENTED();
|
| return 0;
|
| #endif
|
| @@ -1072,7 +1078,9 @@
|
| *ptr = value;
|
| return;
|
| }
|
| - PrintF("Unaligned unsigned halfword write at 0x%08x, pc=%p\n", addr, instr);
|
| + PrintF("Unaligned unsigned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| UNIMPLEMENTED();
|
| #endif
|
| }
|
| @@ -1089,7 +1097,9 @@
|
| *ptr = value;
|
| return;
|
| }
|
| - PrintF("Unaligned halfword write at 0x%08x, pc=%p\n", addr, instr);
|
| + PrintF("Unaligned halfword write at 0x%08x, pc=0x%08" V8PRIxPTR "\n",
|
| + addr,
|
| + reinterpret_cast<intptr_t>(instr));
|
| UNIMPLEMENTED();
|
| #endif
|
| }
|
| @@ -1531,8 +1541,12 @@
|
|
|
| // This signature supports direct call in to API function native callback
|
| // (refer to InvocationCallback in v8.h).
|
| -typedef v8::Handle<v8::Value> (*SimulatorRuntimeApiCall)(int32_t arg0);
|
| +typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0);
|
|
|
| +// This signature supports direct call to accessor getter callback.
|
| +typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0,
|
| + int32_t arg1);
|
| +
|
| // Software interrupt instructions are used by the simulator to call into the
|
| // C-based V8 runtime.
|
| void Simulator::SoftwareInterrupt(Instruction* instr) {
|
| @@ -1572,14 +1586,12 @@
|
| CHECK(stack_aligned);
|
| double result = target(arg0, arg1, arg2, arg3);
|
| SetFpResult(result);
|
| - } else if (redirection->type() == ExternalReference::DIRECT_CALL) {
|
| - SimulatorRuntimeApiCall target =
|
| - reinterpret_cast<SimulatorRuntimeApiCall>(external);
|
| + } else if (redirection->type() == ExternalReference::DIRECT_API_CALL) {
|
| + SimulatorRuntimeDirectApiCall target =
|
| + reinterpret_cast<SimulatorRuntimeDirectApiCall>(external);
|
| if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| - PrintF(
|
| - "Call to host function at %p args %08x",
|
| - FUNCTION_ADDR(target),
|
| - arg0);
|
| + PrintF("Call to host function at %p args %08x",
|
| + FUNCTION_ADDR(target), arg0);
|
| if (!stack_aligned) {
|
| PrintF(" with unaligned stack %08x\n", get_register(sp));
|
| }
|
| @@ -1591,6 +1603,23 @@
|
| PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
| }
|
| set_register(r0, (int32_t) *result);
|
| + } else if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) {
|
| + SimulatorRuntimeDirectGetterCall target =
|
| + reinterpret_cast<SimulatorRuntimeDirectGetterCall>(external);
|
| + if (::v8::internal::FLAG_trace_sim || !stack_aligned) {
|
| + PrintF("Call to host function at %p args %08x %08x",
|
| + FUNCTION_ADDR(target), arg0, arg1);
|
| + if (!stack_aligned) {
|
| + PrintF(" with unaligned stack %08x\n", get_register(sp));
|
| + }
|
| + PrintF("\n");
|
| + }
|
| + CHECK(stack_aligned);
|
| + v8::Handle<v8::Value> result = target(arg0, arg1);
|
| + if (::v8::internal::FLAG_trace_sim) {
|
| + PrintF("Returned %p\n", reinterpret_cast<void *>(*result));
|
| + }
|
| + set_register(r0, (int32_t) *result);
|
| } else {
|
| // builtin call.
|
| ASSERT(redirection->type() == ExternalReference::BUILTIN_CALL);
|
| @@ -2438,6 +2467,8 @@
|
| // vmov :Rt = Sn
|
| // vcvt: Dd = Sm
|
| // vcvt: Sd = Dm
|
| +// Dd = vabs(Dm)
|
| +// Dd = vneg(Dm)
|
| // Dd = vadd(Dn, Dm)
|
| // Dd = vsub(Dn, Dm)
|
| // Dd = vmul(Dn, Dm)
|
| @@ -2473,6 +2504,11 @@
|
| double dm_value = get_double_from_d_register(vm);
|
| double dd_value = fabs(dm_value);
|
| set_d_register_from_double(vd, dd_value);
|
| + } else if ((instr->Opc2Value() == 0x1) && (instr->Opc3Value() == 0x1)) {
|
| + // vneg
|
| + double dm_value = get_double_from_d_register(vm);
|
| + double dd_value = -dm_value;
|
| + set_d_register_from_double(vd, dd_value);
|
| } else if ((instr->Opc2Value() == 0x7) && (instr->Opc3Value() == 0x3)) {
|
| DecodeVCVTBetweenDoubleAndSingle(instr);
|
| } else if ((instr->Opc2Value() == 0x8) && (instr->Opc3Value() & 0x1)) {
|
| @@ -2535,6 +2571,7 @@
|
| double dn_value = get_double_from_d_register(vn);
|
| double dm_value = get_double_from_d_register(vm);
|
| double dd_value = dn_value / dm_value;
|
| + div_zero_vfp_flag_ = (dm_value == 0);
|
| set_d_register_from_double(vd, dd_value);
|
| } else {
|
| UNIMPLEMENTED(); // Not used by V8.
|
| @@ -2769,14 +2806,17 @@
|
|
|
| inv_op_vfp_flag_ = get_inv_op_vfp_flag(mode, val, unsigned_integer);
|
|
|
| + double abs_diff =
|
| + unsigned_integer ? fabs(val - static_cast<uint32_t>(temp))
|
| + : fabs(val - temp);
|
| +
|
| + inexact_vfp_flag_ = (abs_diff != 0);
|
| +
|
| if (inv_op_vfp_flag_) {
|
| temp = VFPConversionSaturate(val, unsigned_integer);
|
| } else {
|
| switch (mode) {
|
| case RN: {
|
| - double abs_diff =
|
| - unsigned_integer ? fabs(val - static_cast<uint32_t>(temp))
|
| - : fabs(val - temp);
|
| int val_sign = (val > 0) ? 1 : -1;
|
| if (abs_diff > 0.5) {
|
| temp += val_sign;
|
|
|