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/register-configuration.h"
|
||||||
#include "src/runtime/runtime.h"
|
#include "src/runtime/runtime.h"
|
||||||
#include "src/snapshot/serializer-common.h"
|
#include "src/snapshot/serializer-common.h"
|
||||||
|
#include "src/snapshot/snapshot.h"
|
||||||
|
|
||||||
#include "src/ppc/macro-assembler-ppc.h"
|
#include "src/ppc/macro-assembler-ppc.h"
|
||||||
|
|
||||||
@ -226,6 +227,22 @@ void TurboAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode,
|
|||||||
Jump(scratch);
|
Jump(scratch);
|
||||||
bind(&skip);
|
bind(&skip);
|
||||||
return;
|
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
|
#endif // V8_EMBEDDED_BUILTINS
|
||||||
Jump(static_cast<intptr_t>(code.address()), rmode, cond, cr);
|
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);
|
Call(ip);
|
||||||
bind(&skip);
|
bind(&skip);
|
||||||
return;
|
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
|
#endif // V8_EMBEDDED_BUILTINS
|
||||||
Call(code.address(), rmode, cond);
|
Call(code.address(), rmode, cond);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
#include "src/register-configuration.h"
|
#include "src/register-configuration.h"
|
||||||
#include "src/runtime/runtime.h"
|
#include "src/runtime/runtime.h"
|
||||||
#include "src/snapshot/serializer-common.h"
|
#include "src/snapshot/serializer-common.h"
|
||||||
|
#include "src/snapshot/snapshot.h"
|
||||||
|
|
||||||
#include "src/s390/macro-assembler-s390.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));
|
la(scratch, MemOperand(scratch, Code::kHeaderSize - kHeapObjectTag));
|
||||||
b(cond, scratch);
|
b(cond, scratch);
|
||||||
return;
|
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
|
#endif // V8_EMBEDDED_BUILTINS
|
||||||
jump(code, rmode, cond);
|
jump(code, rmode, cond);
|
||||||
@ -300,6 +314,20 @@ void TurboAssembler::Call(Handle<Code> code, RelocInfo::Mode rmode,
|
|||||||
la(ip, MemOperand(ip, Code::kHeaderSize - kHeapObjectTag));
|
la(ip, MemOperand(ip, Code::kHeaderSize - kHeapObjectTag));
|
||||||
Call(ip);
|
Call(ip);
|
||||||
return;
|
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
|
#endif // V8_EMBEDDED_BUILTINS
|
||||||
call(code, rmode);
|
call(code, rmode);
|
||||||
|
Loading…
Reference in New Issue
Block a user