src/cpu/sparc/vm/vm_version_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File
*** old/src/cpu/sparc/vm/vm_version_sparc.cpp	Thu Apr 28 11:48:50 2016
--- new/src/cpu/sparc/vm/vm_version_sparc.cpp	Thu Apr 28 11:48:50 2016

*** 47,59 **** --- 47,61 ---- AllocatePrefetchStepSize = cache_line_size; AllocatePrefetchDistance = allocate_prefetch_distance(); AllocatePrefetchStyle = allocate_prefetch_style(); - if (AllocatePrefetchStyle == 3 && !has_blk_init()) { warning("BIS instructions are not available on this CPU"); ! FLAG_SET_DEFAULT(AllocatePrefetchStyle, 1); + if (AllocatePrefetchInstr == 1) { ! warning("BIS instructions required for AllocatePrefetchInstr 1 unavailable"); + FLAG_SET_DEFAULT(AllocatePrefetchInstr, 0); + } } UseSSE = 0; // Only on x86 and x64 _supports_cx8 = has_v9();
*** 86,100 **** --- 88,104 ---- } if (is_niagara_plus()) { if (has_blk_init() && UseTLAB && FLAG_IS_DEFAULT(AllocatePrefetchInstr)) { // Use BIS instruction for TLAB allocation prefetch. ! FLAG_SET_ERGO(intx, AllocatePrefetchInstr, 1); if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) { FLAG_SET_ERGO(intx, AllocatePrefetchStyle, 3); ! FLAG_SET_DEFAULT(AllocatePrefetchInstr, 1); } if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { + if (AllocatePrefetchInstr == 0) { + // Use different prefetch distance without BIS + FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256); + } else { // Use smaller prefetch distance with BIS FLAG_SET_DEFAULT(AllocatePrefetchDistance, 64); } } if (is_T4()) {
*** 105,133 **** --- 109,126 ---- } if (FLAG_IS_DEFAULT(AllocateInstancePrefetchLines)) { FLAG_SET_ERGO(intx, AllocateInstancePrefetchLines, AllocateInstancePrefetchLines*2); } } if (AllocatePrefetchStyle != 3 && FLAG_IS_DEFAULT(AllocatePrefetchDistance)) { // Use different prefetch distance without BIS FLAG_SET_DEFAULT(AllocatePrefetchDistance, 256); } + if (AllocatePrefetchInstr == 1) { // Need extra space at the end of TLAB for BIS, otherwise prefetching ! // instructions will fault (due to accessing memory outside of heap). // The amount of space is the max of the number of lines to // prefetch for array and for instance allocations. (Extra space must be // reserved to accomodate both types of allocations.) // +1 for rounding up to next cache line, +1 to be safe int lines = MAX2(AllocatePrefetchLines, AllocateInstancePrefetchLines) + 2; int step_size = AllocatePrefetchStepSize; int distance = AllocatePrefetchDistance; _reserve_for_allocation_prefetch = (distance + step_size*lines)/(int)HeapWordSize; } + // Use allocation prefetch style 3 because BIS instructions ! // require aligned memory addresses. + FLAG_SET_DEFAULT(AllocatePrefetchStyle, 3); } ! #endif /* COMPILER2 */ } // Use hardware population count instruction if available. if (has_hardware_popc()) { if (FLAG_IS_DEFAULT(UsePopCountInstruction)) {

src/cpu/sparc/vm/vm_version_sparc.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File