OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 1147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1158 int32_t arg3, | 1158 int32_t arg3, |
1159 int32_t arg4, | 1159 int32_t arg4, |
1160 int32_t arg5); | 1160 int32_t arg5); |
1161 typedef double (*SimulatorRuntimeFPCall)(int32_t arg0, | 1161 typedef double (*SimulatorRuntimeFPCall)(int32_t arg0, |
1162 int32_t arg1, | 1162 int32_t arg1, |
1163 int32_t arg2, | 1163 int32_t arg2, |
1164 int32_t arg3); | 1164 int32_t arg3); |
1165 | 1165 |
1166 // This signature supports direct call in to API function native callback | 1166 // This signature supports direct call in to API function native callback |
1167 // (refer to InvocationCallback in v8.h). | 1167 // (refer to InvocationCallback in v8.h). |
1168 typedef v8::Handle<v8::Value> (*SimulatorRuntimeApiCall)(int32_t arg0); | 1168 typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectApiCall)(int32_t arg0); |
| 1169 |
| 1170 // This signature supports direct call to accessor getter callback. |
| 1171 typedef v8::Handle<v8::Value> (*SimulatorRuntimeDirectGetterCall)(int32_t arg0, |
| 1172 int32_t arg1); |
1169 | 1173 |
1170 // Software interrupt instructions are used by the simulator to call into the | 1174 // Software interrupt instructions are used by the simulator to call into the |
1171 // C-based V8 runtime. They are also used for debugging with simulator. | 1175 // C-based V8 runtime. They are also used for debugging with simulator. |
1172 void Simulator::SoftwareInterrupt(Instruction* instr) { | 1176 void Simulator::SoftwareInterrupt(Instruction* instr) { |
1173 // There are several instructions that could get us here, | 1177 // There are several instructions that could get us here, |
1174 // the break_ instruction, or several variants of traps. All | 1178 // the break_ instruction, or several variants of traps. All |
1175 // Are "SPECIAL" class opcode, and are distinuished by function. | 1179 // Are "SPECIAL" class opcode, and are distinuished by function. |
1176 int32_t func = instr->FunctionFieldRaw(); | 1180 int32_t func = instr->FunctionFieldRaw(); |
1177 int32_t code = (func == BREAK) ? instr->Bits(25, 6) : -1; | 1181 int32_t code = (func == BREAK) ? instr->Bits(25, 6) : -1; |
1178 | 1182 |
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1233 arg2, | 1237 arg2, |
1234 arg3); | 1238 arg3); |
1235 } | 1239 } |
1236 double result = target(arg0, arg1, arg2, arg3); | 1240 double result = target(arg0, arg1, arg2, arg3); |
1237 // fp result -> registers v0 and v1. | 1241 // fp result -> registers v0 and v1. |
1238 int32_t gpreg_pair[2]; | 1242 int32_t gpreg_pair[2]; |
1239 memcpy(&gpreg_pair[0], &result, 2 * sizeof(int32_t)); | 1243 memcpy(&gpreg_pair[0], &result, 2 * sizeof(int32_t)); |
1240 set_register(v0, gpreg_pair[0]); | 1244 set_register(v0, gpreg_pair[0]); |
1241 set_register(v1, gpreg_pair[1]); | 1245 set_register(v1, gpreg_pair[1]); |
1242 } else if (redirection->type() == ExternalReference::DIRECT_API_CALL) { | 1246 } else if (redirection->type() == ExternalReference::DIRECT_API_CALL) { |
1243 SimulatorRuntimeApiCall target = | 1247 // See DirectCEntryStub::GenerateCall for explanation of register usage. |
1244 reinterpret_cast<SimulatorRuntimeApiCall>(external); | 1248 SimulatorRuntimeDirectApiCall target = |
| 1249 reinterpret_cast<SimulatorRuntimeDirectApiCall>(external); |
1245 if (::v8::internal::FLAG_trace_sim) { | 1250 if (::v8::internal::FLAG_trace_sim) { |
1246 PrintF("Call to host function at %p args %08x\n", | 1251 PrintF("Call to host function at %p args %08x\n", |
1247 FUNCTION_ADDR(target), | 1252 FUNCTION_ADDR(target), arg1); |
1248 arg0); | |
1249 } | 1253 } |
1250 v8::Handle<v8::Value> result = target(arg0); | 1254 v8::Handle<v8::Value> result = target(arg1); |
1251 set_register(v0, (int32_t) *result); | 1255 *(reinterpret_cast<int*>(arg0)) = (int32_t) *result; |
| 1256 set_register(v0, arg0); |
| 1257 } else if (redirection->type() == ExternalReference::DIRECT_GETTER_CALL) { |
| 1258 // See DirectCEntryStub::GenerateCall for explanation of register usage. |
| 1259 SimulatorRuntimeDirectGetterCall target = |
| 1260 reinterpret_cast<SimulatorRuntimeDirectGetterCall>(external); |
| 1261 if (::v8::internal::FLAG_trace_sim) { |
| 1262 PrintF("Call to host function at %p args %08x %08x\n", |
| 1263 FUNCTION_ADDR(target), arg1, arg2); |
| 1264 } |
| 1265 v8::Handle<v8::Value> result = target(arg1, arg2); |
| 1266 *(reinterpret_cast<int*>(arg0)) = (int32_t) *result; |
| 1267 set_register(v0, arg0); |
1252 } else { | 1268 } else { |
1253 SimulatorRuntimeCall target = | 1269 SimulatorRuntimeCall target = |
1254 reinterpret_cast<SimulatorRuntimeCall>(external); | 1270 reinterpret_cast<SimulatorRuntimeCall>(external); |
1255 if (::v8::internal::FLAG_trace_sim) { | 1271 if (::v8::internal::FLAG_trace_sim) { |
1256 PrintF( | 1272 PrintF( |
1257 "Call to host function at %p " | 1273 "Call to host function at %p " |
1258 "args %08x, %08x, %08x, %08x, %08x, %08x\n", | 1274 "args %08x, %08x, %08x, %08x, %08x, %08x\n", |
1259 FUNCTION_ADDR(target), | 1275 FUNCTION_ADDR(target), |
1260 arg0, | 1276 arg0, |
1261 arg1, | 1277 arg1, |
(...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2446 } | 2462 } |
2447 | 2463 |
2448 | 2464 |
2449 #undef UNSUPPORTED | 2465 #undef UNSUPPORTED |
2450 | 2466 |
2451 } } // namespace v8::internal | 2467 } } // namespace v8::internal |
2452 | 2468 |
2453 #endif // USE_SIMULATOR | 2469 #endif // USE_SIMULATOR |
2454 | 2470 |
2455 #endif // V8_TARGET_ARCH_MIPS | 2471 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |