8283494: Factor out calculation of actual number of XMM registers

Reviewed-by: dlong, kvn
This commit is contained in:
Thomas Schatzl 2022-03-30 18:13:54 +00:00
parent e61ccfba7f
commit ce27d9dd5e
8 changed files with 30 additions and 51 deletions

@ -152,14 +152,8 @@
return range;
}
static int get_num_caller_save_xmms(void) {
int num_caller_save_xmm_regs = nof_caller_save_xmm_regs;
#ifdef _LP64
if (UseAVX < 3) {
num_caller_save_xmm_regs = num_caller_save_xmm_regs / 2;
}
#endif
return num_caller_save_xmm_regs;
static int get_num_caller_save_xmms() {
return XMMRegisterImpl::available_xmm_registers();
}
static int nof_caller_save_cpu_regs() { return adjust_reg_range(pd_nof_caller_save_cpu_regs_frame_map); }

@ -101,12 +101,7 @@ inline void LinearScan::pd_add_temps(LIR_Op* op) {
// Implementation of LinearScanWalker
inline bool LinearScanWalker::pd_init_regs_for_alloc(Interval* cur) {
int last_xmm_reg = pd_last_xmm_reg;
#ifdef _LP64
if (UseAVX < 3) {
last_xmm_reg = pd_first_xmm_reg + (pd_nof_xmm_regs_frame_map / 2) - 1;
}
#endif
int last_xmm_reg = pd_first_xmm_reg + XMMRegisterImpl::available_xmm_registers() - 1;
if (allocator()->gen()->is_vreg_flag_set(cur->reg_num(), LIRGenerator::byte_reg)) {
assert(cur->type() != T_FLOAT && cur->type() != T_DOUBLE, "cpu regs only");
_first_reg = pd_first_byte_reg;

@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "asm/assembler.hpp"
#include "c1/c1_Defs.hpp"
#include "c1/c1_FrameMap.hpp"
#include "c1/c1_MacroAssembler.hpp"
#include "c1/c1_Runtime1.hpp"
#include "ci/ciUtilities.hpp"
@ -369,12 +370,7 @@ static OopMap* generate_oop_map(StubAssembler* sasm, int num_rt_args,
map->set_callee_saved(VMRegImpl::stack2reg(r15H_off + num_rt_args), r15->as_VMReg()->next());
#endif // _LP64
int xmm_bypass_limit = FrameMap::nof_xmm_regs;
#ifdef _LP64
if (UseAVX < 3) {
xmm_bypass_limit = xmm_bypass_limit / 2;
}
#endif
int xmm_bypass_limit = FrameMap::get_num_caller_save_xmms();
if (save_fpu_registers) {
#ifndef _LP64
@ -487,13 +483,8 @@ void C1_MacroAssembler::save_live_registers_no_oop_map(bool save_fpu_registers)
// so always save them as doubles.
// note that float values are _not_ converted automatically, so for float values
// the second word contains only garbage data.
int xmm_bypass_limit = FrameMap::nof_xmm_regs;
int xmm_bypass_limit = FrameMap::get_num_caller_save_xmms();
int offset = 0;
#ifdef _LP64
if (UseAVX < 3) {
xmm_bypass_limit = xmm_bypass_limit / 2;
}
#endif
for (int n = 0; n < xmm_bypass_limit; n++) {
XMMRegister xmm_name = as_XMMRegister(n);
__ movdbl(Address(rsp, xmm_regs_as_doubles_off * VMRegImpl::stack_slot_size + offset), xmm_name);
@ -513,10 +504,7 @@ static void restore_fpu(C1_MacroAssembler* sasm, bool restore_fpu_registers) {
#ifdef _LP64
if (restore_fpu_registers) {
// restore XMM registers
int xmm_bypass_limit = FrameMap::nof_xmm_regs;
if (UseAVX < 3) {
xmm_bypass_limit = xmm_bypass_limit / 2;
}
int xmm_bypass_limit = FrameMap::get_num_caller_save_xmms();
int offset = 0;
for (int n = 0; n < xmm_bypass_limit; n++) {
XMMRegister xmm_name = as_XMMRegister(n);

@ -26,7 +26,6 @@
#include "jvm.h"
#include "asm/assembler.hpp"
#include "asm/assembler.inline.hpp"
#include "c1/c1_FrameMap.hpp"
#include "compiler/compiler_globals.hpp"
#include "compiler/disassembler.hpp"
#include "gc/shared/barrierSet.hpp"
@ -3594,14 +3593,15 @@ RegSet MacroAssembler::call_clobbered_gp_registers() {
}
XMMRegSet MacroAssembler::call_clobbered_xmm_registers() {
int num_xmm_registers = XMMRegisterImpl::available_xmm_registers();
#if defined(WINDOWS) && defined(_LP64)
XMMRegSet result = XMMRegSet::range(xmm0, xmm5);
if (FrameMap::get_num_caller_save_xmms() > 16) {
result += XMMRegSet::range(xmm16, as_XMMRegister(FrameMap::get_num_caller_save_xmms() - 1));
if (num_xmm_registers > 16) {
result += XMMRegSet::range(xmm16, as_XMMRegister(num_xmm_registers - 1));
}
return result;
#else
return XMMRegSet::range(xmm0, as_XMMRegister(FrameMap::get_num_caller_save_xmms() - 1));
return XMMRegSet::range(xmm0, as_XMMRegister(num_xmm_registers - 1));
#endif
}

@ -23,6 +23,7 @@
*/
#include "precompiled.hpp"
#include "register_x86.hpp"
#ifndef AMD64

@ -26,6 +26,7 @@
#define CPU_X86_REGISTER_X86_HPP
#include "asm/register.hpp"
#include "runtime/globals.hpp"
#include "utilities/count_leading_zeros.hpp"
#include "utilities/powerOfTwo.hpp"
@ -163,6 +164,18 @@ class XMMRegisterImpl: public AbstractRegisterImpl {
bool is_valid() const { return 0 <= (intptr_t)this && (intptr_t)this < number_of_registers; }
const char* name() const;
const char* sub_word_name(int offset) const;
// Actually available XMM registers for use, depending on actual CPU capabilities
// and flags.
static int available_xmm_registers() {
int num_xmm_regs = XMMRegisterImpl::number_of_registers;
#ifdef _LP64
if (UseAVX < 3) {
num_xmm_regs /= 2;
}
#endif
return num_xmm_regs;
}
};

@ -174,10 +174,7 @@ PRAGMA_DIAG_PUSH
PRAGMA_NONNULL_IGNORED
OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_frame_words, int* total_frame_words, bool save_vectors) {
int off = 0;
int num_xmm_regs = XMMRegisterImpl::number_of_registers;
if (UseAVX < 3) {
num_xmm_regs = num_xmm_regs/2;
}
int num_xmm_regs = XMMRegisterImpl::available_xmm_registers();
#if COMPILER2_OR_JVMCI
if (save_vectors && UseAVX == 0) {
save_vectors = false; // vectors larger than 16 byte long are supported only with AVX
@ -367,10 +364,7 @@ OopMap* RegisterSaver::save_live_registers(MacroAssembler* masm, int additional_
PRAGMA_DIAG_POP
void RegisterSaver::restore_live_registers(MacroAssembler* masm, bool restore_vectors) {
int num_xmm_regs = XMMRegisterImpl::number_of_registers;
if (UseAVX < 3) {
num_xmm_regs = num_xmm_regs/2;
}
int num_xmm_regs = XMMRegisterImpl::available_xmm_registers();
if (frame::arg_reg_save_area_bytes != 0) {
// Pop arg register save area
__ addptr(rsp, frame::arg_reg_save_area_bytes);

@ -25,7 +25,7 @@
#ifndef CPU_X86_VMREG_X86_HPP
#define CPU_X86_VMREG_X86_HPP
#include "register_x86.hpp"
inline bool is_Register() {
return (unsigned int) value() < (unsigned int) ConcreteRegisterImpl::max_gpr;
@ -36,14 +36,8 @@ inline bool is_FloatRegister() {
}
inline bool is_XMMRegister() {
int uarch_max_xmm = ConcreteRegisterImpl::max_xmm;
#ifdef _LP64
if (UseAVX < 3) {
int half_xmm = (XMMRegisterImpl::max_slots_per_register * XMMRegisterImpl::number_of_registers) / 2;
uarch_max_xmm -= half_xmm;
}
#endif
int uarch_max_xmm = ConcreteRegisterImpl::max_fpr +
(XMMRegisterImpl::max_slots_per_register * XMMRegisterImpl::available_xmm_registers());
return (value() >= ConcreteRegisterImpl::max_fpr && value() < uarch_max_xmm);
}