block_of_code: Add vzeroupper instructions where AVX-SSE transitions may occur
This commit is contained in:
parent
60d9392b5c
commit
19dcdde90b
2 changed files with 12 additions and 0 deletions
|
@ -86,6 +86,12 @@ void BlockOfCode::GenRunCode() {
|
||||||
align();
|
align();
|
||||||
run_code = getCurr<RunCodeFuncType>();
|
run_code = getCurr<RunCodeFuncType>();
|
||||||
|
|
||||||
|
// As we currently do not emit AVX instructions, AVX-SSE transition may occur.
|
||||||
|
// We avoid the transition penalty by calling vzeroupper.
|
||||||
|
if (DoesCpuSupport(Xbyak::util::Cpu::tAVX)) {
|
||||||
|
vzeroupper();
|
||||||
|
}
|
||||||
|
|
||||||
// This serves two purposes:
|
// This serves two purposes:
|
||||||
// 1. It saves all the registers we as a callee need to save.
|
// 1. It saves all the registers we as a callee need to save.
|
||||||
// 2. It aligns the stack so that the code the JIT emits can assume
|
// 2. It aligns the stack so that the code the JIT emits can assume
|
||||||
|
|
|
@ -49,6 +49,12 @@ public:
|
||||||
const u64 address = reinterpret_cast<u64>(fn);
|
const u64 address = reinterpret_cast<u64>(fn);
|
||||||
const u64 distance = address - (getCurr<u64>() + 5);
|
const u64 distance = address - (getCurr<u64>() + 5);
|
||||||
|
|
||||||
|
// As we do not know if user-code is AVX or SSE, an AVX-SSE transition may occur.
|
||||||
|
// We avoid the transition penalty by calling vzeroupper.
|
||||||
|
if (DoesCpuSupport(Xbyak::util::Cpu::tAVX)) {
|
||||||
|
vzeroupper();
|
||||||
|
}
|
||||||
|
|
||||||
if (distance >= 0x0000000080000000ULL && distance < 0xFFFFFFFF80000000ULL) {
|
if (distance >= 0x0000000080000000ULL && distance < 0xFFFFFFFF80000000ULL) {
|
||||||
// Far call
|
// Far call
|
||||||
mov(rax, address);
|
mov(rax, address);
|
||||||
|
|
Loading…
Reference in a new issue