Commit 5312bfb9 authored by mbrandy's avatar mbrandy Committed by Commit bot

PPC: [wasm] Fixes for embedded constant pools.

R=titzer@chromium.org, bradnelson@chromium.org, ahaas@chromium.org
BUG=

Review URL: https://codereview.chromium.org/1575103002

Cr-Commit-Position: refs/heads/master@{#33310}
parent 92e6f7a3
......@@ -1545,7 +1545,12 @@ void CodeGenerator::AssemblePrologue() {
} else if (descriptor->IsJSFunctionCall()) {
__ Prologue(this->info()->GeneratePreagedPrologue(), ip);
} else if (frame()->needs_frame()) {
__ StubPrologue(ip);
if (!ABI_CALL_VIA_IP && info()->output_code_kind() == Code::WASM_FUNCTION) {
// TODO(mbrandy): Restrict only to the wasm wrapper case.
__ StubPrologue();
} else {
__ StubPrologue(ip);
}
} else {
frame()->SetElidedFrameSizeInSlots(0);
}
......
......@@ -56,8 +56,11 @@
#define ABI_RETURNS_OBJECT_PAIRS_IN_REGS \
(!V8_HOST_ARCH_PPC || !V8_TARGET_ARCH_PPC64 || V8_TARGET_LITTLE_ENDIAN)
#define ABI_TOC_ADDRESSABILITY_VIA_IP \
(V8_HOST_ARCH_PPC && V8_TARGET_ARCH_PPC64 && V8_TARGET_LITTLE_ENDIAN)
#if !V8_HOST_ARCH_PPC || (V8_TARGET_ARCH_PPC64 && V8_TARGET_LITTLE_ENDIAN)
#define ABI_CALL_VIA_IP 1
#else
#define ABI_CALL_VIA_IP 0
#endif
#if !V8_HOST_ARCH_PPC || V8_OS_AIX || V8_TARGET_ARCH_PPC64
#define ABI_TOC_REGISTER Register::kCode_r2
......
......@@ -1091,16 +1091,15 @@ void CEntryStub::Generate(MacroAssembler* masm) {
// Call C built-in.
__ mov(isolate_reg, Operand(ExternalReference::isolate_address(isolate())));
Register target = r15;
#if ABI_USES_FUNCTION_DESCRIPTORS && !defined(USE_SIMULATOR)
// Native AIX/PPC64 Linux use a function descriptor.
__ LoadP(ToRegister(ABI_TOC_REGISTER), MemOperand(r15, kPointerSize));
__ LoadP(ip, MemOperand(r15, 0)); // Instruction address
Register target = ip;
#elif ABI_TOC_ADDRESSABILITY_VIA_IP
target = ip;
#elif ABI_CALL_VIA_IP
__ Move(ip, r15);
Register target = ip;
#else
Register target = r15;
target = ip;
#endif
// To let the GC traverse the return address of the exit frames, we need to
......@@ -3827,7 +3826,7 @@ void DirectCEntryStub::GenerateCall(MacroAssembler* masm, Register target) {
__ LoadP(ip, MemOperand(target, 0)); // Instruction address
#else
// ip needs to be set for DirectCEentryStub::Generate, and also
// for ABI_TOC_ADDRESSABILITY_VIA_IP.
// for ABI_CALL_VIA_IP.
__ Move(ip, target);
#endif
......@@ -4798,7 +4797,7 @@ void ProfileEntryHookStub::Generate(MacroAssembler* masm) {
// Function descriptor
__ LoadP(ToRegister(ABI_TOC_REGISTER), MemOperand(ip, kPointerSize));
__ LoadP(ip, MemOperand(ip, 0));
#elif ABI_TOC_ADDRESSABILITY_VIA_IP
#elif ABI_CALL_VIA_IP
// ip set above, so nothing to do.
#endif
......
......@@ -3090,17 +3090,16 @@ void MacroAssembler::CallCFunctionHelper(Register function,
// Just call directly. The function called cannot cause a GC, or
// allow preemption, so the return address in the link register
// stays correct.
Register dest = function;
#if ABI_USES_FUNCTION_DESCRIPTORS && !defined(USE_SIMULATOR)
// AIX uses a function descriptor. When calling C code be aware
// of this descriptor and pick up values from it
LoadP(ToRegister(ABI_TOC_REGISTER), MemOperand(function, kPointerSize));
LoadP(ip, MemOperand(function, 0));
Register dest = ip;
#elif ABI_TOC_ADDRESSABILITY_VIA_IP
dest = ip;
#elif ABI_CALL_VIA_IP
Move(ip, function);
Register dest = ip;
#else
Register dest = function;
dest = ip;
#endif
Call(dest);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment