src/share/vm/c1/c1_LinearScan.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File
*** old/src/share/vm/c1/c1_LinearScan.cpp	Fri May  8 11:59:34 2015
--- new/src/share/vm/c1/c1_LinearScan.cpp	Fri May  8 11:59:34 2015

*** 1288,1298 **** --- 1288,1299 ---- 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++) { + 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 **** --- 2097,2113 ---- #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"); ! 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 **** --- 2117,2133 ---- } case T_DOUBLE: { #ifdef X86 if (UseSSE >= 2) { ! assert(assigned_reg >= pd_first_xmm_reg && assigned_reg <= pd_last_xmm_reg, "no xmm register"); ! 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 **** --- 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 for (j = 0; j < FrameMap::nof_caller_save_xmm_regs; j++) { + 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 **** --- 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() <= pd_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