src/share/vm/c1/c1_LinearScan.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File
8076276 Cdiff src/share/vm/c1/c1_LinearScan.cpp
src/share/vm/c1/c1_LinearScan.cpp
Print this page
rev 8344 : 8076276: Add support for AVX512
Reviewed-by: kvn, roland
Contributed-by: michael.c.berg@intel.com
*** 1288,1298 ****
caller_save_registers[num_caller_save_registers++] = reg_num(opr);
}
#ifdef X86
}
if (UseSSE > 0) {
! for (i = 0; i < FrameMap::nof_caller_save_xmm_regs; i++) {
LIR_Opr opr = FrameMap::caller_save_xmm_reg_at(i);
assert(opr->is_valid() && opr->is_register(), "FrameMap should not return invalid operands");
assert(reg_numHi(opr) == -1, "missing addition of range for hi-register");
caller_save_registers[num_caller_save_registers++] = reg_num(opr);
}
--- 1288,1299 ----
caller_save_registers[num_caller_save_registers++] = reg_num(opr);
}
#ifdef X86
}
if (UseSSE > 0) {
! int num_caller_save_xmm_regs = FrameMap::get_num_caller_save_xmms();
! for (i = 0; i < num_caller_save_xmm_regs; i ++) {
LIR_Opr opr = FrameMap::caller_save_xmm_reg_at(i);
assert(opr->is_valid() && opr->is_register(), "FrameMap should not return invalid operands");
assert(reg_numHi(opr) == -1, "missing addition of range for hi-register");
caller_save_registers[num_caller_save_registers++] = reg_num(opr);
}
*** 2096,2106 ****
#ifndef __SOFTFP__
case T_FLOAT: {
#ifdef X86
if (UseSSE >= 1) {
! assert(assigned_reg >= pd_first_xmm_reg && assigned_reg <= pd_last_xmm_reg, "no xmm register");
assert(interval->assigned_regHi() == any_reg, "must not have hi register");
return LIR_OprFact::single_xmm(assigned_reg - pd_first_xmm_reg);
}
#endif
--- 2097,2113 ----
#ifndef __SOFTFP__
case T_FLOAT: {
#ifdef X86
if (UseSSE >= 1) {
! 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
! assert(assigned_reg >= pd_first_xmm_reg && assigned_reg <= last_xmm_reg, "no xmm register");
assert(interval->assigned_regHi() == any_reg, "must not have hi register");
return LIR_OprFact::single_xmm(assigned_reg - pd_first_xmm_reg);
}
#endif
*** 2110,2120 ****
}
case T_DOUBLE: {
#ifdef X86
if (UseSSE >= 2) {
! assert(assigned_reg >= pd_first_xmm_reg && assigned_reg <= pd_last_xmm_reg, "no xmm register");
assert(interval->assigned_regHi() == any_reg, "must not have hi register (double xmm values are stored in one register)");
return LIR_OprFact::double_xmm(assigned_reg - pd_first_xmm_reg);
}
#endif
--- 2117,2133 ----
}
case T_DOUBLE: {
#ifdef X86
if (UseSSE >= 2) {
! 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
! assert(assigned_reg >= pd_first_xmm_reg && assigned_reg <= last_xmm_reg, "no xmm register");
assert(interval->assigned_regHi() == any_reg, "must not have hi register (double xmm values are stored in one register)");
return LIR_OprFact::double_xmm(assigned_reg - pd_first_xmm_reg);
}
#endif
*** 3598,3608 ****
for (j = 0; j < FrameMap::nof_caller_save_fpu_regs; j++) {
state_put(input_state, reg_num(FrameMap::caller_save_fpu_reg_at(j)), NULL);
}
#ifdef X86
! for (j = 0; j < FrameMap::nof_caller_save_xmm_regs; j++) {
state_put(input_state, reg_num(FrameMap::caller_save_xmm_reg_at(j)), NULL);
}
#endif
}
--- 3611,3622 ----
for (j = 0; j < FrameMap::nof_caller_save_fpu_regs; j++) {
state_put(input_state, reg_num(FrameMap::caller_save_fpu_reg_at(j)), NULL);
}
#ifdef X86
! int num_caller_save_xmm_regs = FrameMap::get_num_caller_save_xmms();
! for (j = 0; j < num_caller_save_xmm_regs; j++) {
state_put(input_state, reg_num(FrameMap::caller_save_xmm_reg_at(j)), NULL);
}
#endif
}
*** 4512,4527 ****
const char* type_name;
LIR_Opr opr = LIR_OprFact::illegal();
if (reg_num() < LIR_OprDesc::vreg_base) {
type_name = "fixed";
// need a temporary operand for fixed intervals because type() cannot be called
if (assigned_reg() >= pd_first_cpu_reg && assigned_reg() <= pd_last_cpu_reg) {
opr = LIR_OprFact::single_cpu(assigned_reg());
} else if (assigned_reg() >= pd_first_fpu_reg && assigned_reg() <= pd_last_fpu_reg) {
opr = LIR_OprFact::single_fpu(assigned_reg() - pd_first_fpu_reg);
#ifdef X86
! } else if (assigned_reg() >= pd_first_xmm_reg && assigned_reg() <= pd_last_xmm_reg) {
opr = LIR_OprFact::single_xmm(assigned_reg() - pd_first_xmm_reg);
#endif
} else {
ShouldNotReachHere();
}
--- 4526,4549 ----
const char* type_name;
LIR_Opr opr = LIR_OprFact::illegal();
if (reg_num() < LIR_OprDesc::vreg_base) {
type_name = "fixed";
// need a temporary operand for fixed intervals because type() cannot be called
+ #ifdef X86
+ 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
+ #endif
if (assigned_reg() >= pd_first_cpu_reg && assigned_reg() <= pd_last_cpu_reg) {
opr = LIR_OprFact::single_cpu(assigned_reg());
} else if (assigned_reg() >= pd_first_fpu_reg && assigned_reg() <= pd_last_fpu_reg) {
opr = LIR_OprFact::single_fpu(assigned_reg() - pd_first_fpu_reg);
#ifdef X86
! } else if (assigned_reg() >= pd_first_xmm_reg && assigned_reg() <= last_xmm_reg) {
opr = LIR_OprFact::single_xmm(assigned_reg() - pd_first_xmm_reg);
#endif
} else {
ShouldNotReachHere();
}
src/share/vm/c1/c1_LinearScan.cpp
Index
Unified diffs
Context diffs
Sdiffs
Wdiffs
Patch
New
Old
Previous File
Next File