PPC/s390: [builtins] Inline the off-heap trampoline at callsites
Port 5674812cfb
Original Commit Message:
At runtime, calls to embedded builtins do not need to take the
indirection through the off-heap trampoline. We can simply inline the
trampoline instead.
R=jgruber@chromium.org, joransiu@ca.ibm.com, michael_dawson@ca.ibm.com
BUG=
LOG=N
Change-Id: I4b18f3a957a41af28da34b503015271573949888
Reviewed-on: https://chromium-review.googlesource.com/1073193
Reviewed-by: Joran Siu <joransiu@ca.ibm.com>
Commit-Queue: Junliang Yan <jyan@ca.ibm.com>
Cr-Commit-Position: refs/heads/master@{#53366}
This commit is contained in:
parent
249e494925
commit
8b5510c30a
@ -21,6 +21,7 @@
|
||||
#include "src/register-configuration.h"
|
||||
#include "src/runtime/runtime.h"
|
||||
#include "src/snapshot/serializer-common.h"
|
||||
#include "src/snapshot/snapshot.h"
|
||||
|
||||
#include "src/ppc/macro-assembler-ppc.h"
|
||||
|
||||
@ -226,6 +227,22 @@ void TurboAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode,
|
||||
Jump(scratch);
|
||||
bind(&skip);
|
||||
return;
|
||||
} else if (!isolate()->serializer_enabled()) {
|
||||
int builtin_index = Builtins::kNoBuiltinId;
|
||||
if (isolate()->builtins()->IsBuiltinHandle(code, &builtin_index) &&
|
||||
Builtins::IsIsolateIndependent(builtin_index)) {
|
||||
// Inline the trampoline.
|
||||
EmbeddedData d = EmbeddedData::FromBlob();
|
||||
Address entry = d.InstructionStartOfBuiltin(builtin_index);
|
||||
// Use ip directly instead of using UseScratchRegisterScope, as we do not
|
||||
// preserve scratch registers across calls.
|
||||
mov(ip, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
|
||||
Label skip;
|
||||
if (cond != al) b(NegateCondition(cond), &skip, cr);
|
||||
Jump(ip);
|
||||
bind(&skip);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // V8_EMBEDDED_BUILTINS
|
||||
Jump(static_cast<intptr_t>(code.address()), rmode, cond, cr);
|
||||
@ -308,6 +325,23 @@ void TurboAssembler::Call(Handle<Code> code, RelocInfo::Mode rmode,
|
||||
Call(ip);
|
||||
bind(&skip);
|
||||
return;
|
||||
} else if (!isolate()->serializer_enabled()) {
|
||||
int builtin_index = Builtins::kNoBuiltinId;
|
||||
if (isolate()->builtins()->IsBuiltinHandle(code, &builtin_index) &&
|
||||
Builtins::IsIsolateIndependent(builtin_index)) {
|
||||
// Inline the trampoline.
|
||||
DCHECK(Builtins::IsBuiltinId(builtin_index));
|
||||
EmbeddedData d = EmbeddedData::FromBlob();
|
||||
Address entry = d.InstructionStartOfBuiltin(builtin_index);
|
||||
// Use ip directly instead of using UseScratchRegisterScope, as we do not
|
||||
// preserve scratch registers across calls.
|
||||
mov(ip, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
|
||||
Label skip;
|
||||
if (cond != al) b(NegateCondition(cond), &skip);
|
||||
Call(ip);
|
||||
bind(&skip);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // V8_EMBEDDED_BUILTINS
|
||||
Call(code.address(), rmode, cond);
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "src/register-configuration.h"
|
||||
#include "src/runtime/runtime.h"
|
||||
#include "src/snapshot/serializer-common.h"
|
||||
#include "src/snapshot/snapshot.h"
|
||||
|
||||
#include "src/s390/macro-assembler-s390.h"
|
||||
|
||||
@ -218,6 +219,19 @@ void TurboAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode,
|
||||
la(scratch, MemOperand(scratch, Code::kHeaderSize - kHeapObjectTag));
|
||||
b(cond, scratch);
|
||||
return;
|
||||
} else if (!isolate()->serializer_enabled()) {
|
||||
int builtin_index = Builtins::kNoBuiltinId;
|
||||
if (isolate()->builtins()->IsBuiltinHandle(code, &builtin_index) &&
|
||||
Builtins::IsIsolateIndependent(builtin_index)) {
|
||||
// Inline the trampoline.
|
||||
EmbeddedData d = EmbeddedData::FromBlob();
|
||||
Address entry = d.InstructionStartOfBuiltin(builtin_index);
|
||||
// Use ip directly instead of using UseScratchRegisterScope, as we do not
|
||||
// preserve scratch registers across calls.
|
||||
mov(ip, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
|
||||
Jump(ip, cond);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // V8_EMBEDDED_BUILTINS
|
||||
jump(code, rmode, cond);
|
||||
@ -300,6 +314,20 @@ void TurboAssembler::Call(Handle<Code> code, RelocInfo::Mode rmode,
|
||||
la(ip, MemOperand(ip, Code::kHeaderSize - kHeapObjectTag));
|
||||
Call(ip);
|
||||
return;
|
||||
} else if (!isolate()->serializer_enabled()) {
|
||||
int builtin_index = Builtins::kNoBuiltinId;
|
||||
if (isolate()->builtins()->IsBuiltinHandle(code, &builtin_index) &&
|
||||
Builtins::IsIsolateIndependent(builtin_index)) {
|
||||
// Inline the trampoline.
|
||||
DCHECK(Builtins::IsBuiltinId(builtin_index));
|
||||
EmbeddedData d = EmbeddedData::FromBlob();
|
||||
Address entry = d.InstructionStartOfBuiltin(builtin_index);
|
||||
// Use ip directly instead of using UseScratchRegisterScope, as we do not
|
||||
// preserve scratch registers across calls.
|
||||
mov(ip, Operand(entry, RelocInfo::OFF_HEAP_TARGET));
|
||||
Call(ip);
|
||||
return;
|
||||
}
|
||||
}
|
||||
#endif // V8_EMBEDDED_BUILTINS
|
||||
call(code, rmode);
|
||||
|
Loading…
Reference in New Issue
Block a user