Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(380)

Unified Diff: src/ppc/simulator-ppc.cc

Issue 1607663004: PPC: Cleanup ABI-specifc code. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/ppc/macro-assembler-ppc.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/ppc/simulator-ppc.cc
diff --git a/src/ppc/simulator-ppc.cc b/src/ppc/simulator-ppc.cc
index 75074317a6d258c1b0b60cf2336121fba3021ef9..20c741c8bd0a7569d36b5579fe6cf1deb3c6ed91 100644
--- a/src/ppc/simulator-ppc.cc
+++ b/src/ppc/simulator-ppc.cc
@@ -856,10 +856,19 @@ class Redirection {
isolate->simulator_i_cache(),
reinterpret_cast<void*>(&swi_instruction_), Instruction::kInstrSize);
isolate->set_simulator_redirection(this);
+ if (ABI_USES_FUNCTION_DESCRIPTORS) {
+ function_descriptor_[0] = reinterpret_cast<intptr_t>(&swi_instruction_);
+ function_descriptor_[1] = 0;
+ function_descriptor_[2] = 0;
+ }
}
- void* address_of_swi_instruction() {
- return reinterpret_cast<void*>(&swi_instruction_);
+ void* address() {
+ if (ABI_USES_FUNCTION_DESCRIPTORS) {
+ return reinterpret_cast<void*>(function_descriptor_);
+ } else {
+ return reinterpret_cast<void*>(&swi_instruction_);
+ }
}
void* external_function() { return external_function_; }
@@ -884,9 +893,16 @@ class Redirection {
return reinterpret_cast<Redirection*>(addr_of_redirection);
}
+ static Redirection* FromAddress(void* address) {
+ int delta = ABI_USES_FUNCTION_DESCRIPTORS
+ ? offsetof(Redirection, function_descriptor_)
+ : offsetof(Redirection, swi_instruction_);
+ char* addr_of_redirection = reinterpret_cast<char*>(address) - delta;
+ return reinterpret_cast<Redirection*>(addr_of_redirection);
+ }
+
static void* ReverseRedirection(intptr_t reg) {
- Redirection* redirection = FromSwiInstruction(
- reinterpret_cast<Instruction*>(reinterpret_cast<void*>(reg)));
+ Redirection* redirection = FromAddress(reinterpret_cast<void*>(reg));
return redirection->external_function();
}
@@ -903,6 +919,7 @@ class Redirection {
uint32_t swi_instruction_;
ExternalReference::Type type_;
Redirection* next_;
+ intptr_t function_descriptor_[3];
};
@@ -923,7 +940,7 @@ void* Simulator::RedirectExternalReference(Isolate* isolate,
void* external_function,
ExternalReference::Type type) {
Redirection* redirection = Redirection::Get(isolate, external_function, type);
- return redirection->address_of_swi_instruction();
+ return redirection->address();
}
@@ -1386,9 +1403,9 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
CHECK(stack_aligned);
SimulatorRuntimeDirectGetterCall target =
reinterpret_cast<SimulatorRuntimeDirectGetterCall>(external);
-#if !ABI_PASSES_HANDLES_IN_REGS
- arg[0] = *(reinterpret_cast<intptr_t*>(arg[0]));
-#endif
+ if (!ABI_PASSES_HANDLES_IN_REGS) {
+ arg[0] = *(reinterpret_cast<intptr_t*>(arg[0]));
+ }
target(arg[0], arg[1]);
} else if (redirection->type() ==
ExternalReference::PROFILING_GETTER_CALL) {
@@ -1405,9 +1422,9 @@ void Simulator::SoftwareInterrupt(Instruction* instr) {
CHECK(stack_aligned);
SimulatorRuntimeProfilingGetterCall target =
reinterpret_cast<SimulatorRuntimeProfilingGetterCall>(external);
-#if !ABI_PASSES_HANDLES_IN_REGS
- arg[0] = *(reinterpret_cast<intptr_t*>(arg[0]));
-#endif
+ if (!ABI_PASSES_HANDLES_IN_REGS) {
+ arg[0] = *(reinterpret_cast<intptr_t*>(arg[0]));
+ }
target(arg[0], arg[1], Redirection::ReverseRedirection(arg[2]));
} else {
// builtin call.
@@ -3866,17 +3883,19 @@ void Simulator::CallInternal(byte* entry) {
// Adjust JS-based stack limit to C-based stack limit.
isolate_->stack_guard()->AdjustStackLimitForSimulator();
-// Prepare to execute the code at entry
-#if ABI_USES_FUNCTION_DESCRIPTORS
- // entry is the function descriptor
- set_pc(*(reinterpret_cast<intptr_t*>(entry)));
-#else
- // entry is the instruction address
- set_pc(reinterpret_cast<intptr_t>(entry));
-#endif
+ // Prepare to execute the code at entry
+ if (ABI_USES_FUNCTION_DESCRIPTORS) {
+ // entry is the function descriptor
+ set_pc(*(reinterpret_cast<intptr_t*>(entry)));
+ } else {
+ // entry is the instruction address
+ set_pc(reinterpret_cast<intptr_t>(entry));
+ }
- // Put target address in ip (for JS prologue).
- set_register(r12, get_pc());
+ if (ABI_CALL_VIA_IP) {
+ // Put target address in ip (for JS prologue).
+ set_register(r12, get_pc());
+ }
// Put down marker for end of simulation. The simulator will stop simulation
// when the PC reaches this value. By saving the "end simulation" value into
@@ -3933,8 +3952,12 @@ void Simulator::CallInternal(byte* entry) {
Execute();
// Check that the non-volatile registers have been preserved.
- CHECK_EQ(callee_saved_value, get_register(r2));
- CHECK_EQ(callee_saved_value, get_register(r13));
+ if (ABI_TOC_REGISTER != 2) {
+ CHECK_EQ(callee_saved_value, get_register(r2));
+ }
+ if (ABI_TOC_REGISTER != 13) {
+ CHECK_EQ(callee_saved_value, get_register(r13));
+ }
CHECK_EQ(callee_saved_value, get_register(r14));
CHECK_EQ(callee_saved_value, get_register(r15));
CHECK_EQ(callee_saved_value, get_register(r16));
« no previous file with comments | « src/ppc/macro-assembler-ppc.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698