< prev index next >
src/share/vm/opto/macro.cpp
Print this page
*** 1950,1960 ****
needgc_false = pf_region;
contended_phi_rawmem = pf_phi_rawmem;
i_o = pf_phi_abio;
} else if( UseTLAB && AllocatePrefetchStyle == 3 ) {
// Insert a prefetch instruction for each allocation.
! // This code is used for SPARC with BIS.
// Generate several prefetch instructions.
uint lines = (length != NULL) ? AllocatePrefetchLines : AllocateInstancePrefetchLines;
uint step_size = AllocatePrefetchStepSize;
uint distance = AllocatePrefetchDistance;
--- 1950,1960 ----
needgc_false = pf_region;
contended_phi_rawmem = pf_phi_rawmem;
i_o = pf_phi_abio;
} else if( UseTLAB && AllocatePrefetchStyle == 3 ) {
// Insert a prefetch instruction for each allocation.
! // This code is used to generate 1 prefetch instruction per cache line.
// Generate several prefetch instructions.
uint lines = (length != NULL) ? AllocatePrefetchLines : AllocateInstancePrefetchLines;
uint step_size = AllocatePrefetchStepSize;
uint distance = AllocatePrefetchDistance;
*** 1963,1977 ****
Node *cache_adr = new AddPNode(old_eden_top, old_eden_top,
_igvn.MakeConX(step_size + distance));
transform_later(cache_adr);
cache_adr = new CastP2XNode(needgc_false, cache_adr);
transform_later(cache_adr);
! // For BIS instructions to be emitted, the address must be aligned at cache line size.
! // (The VM sets AllocatePrefetchStepSize to the cache line size, unless a value is
! // specified at the command line.) If the address is not aligned at cache line size
! // boundary, a standard store instruction is triggered (instead of the BIS). For the
! // latter, 8-byte alignment is necessary.
Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1));
cache_adr = new AndXNode(cache_adr, mask);
transform_later(cache_adr);
cache_adr = new CastX2PNode(cache_adr);
transform_later(cache_adr);
--- 1963,1974 ----
Node *cache_adr = new AddPNode(old_eden_top, old_eden_top,
_igvn.MakeConX(step_size + distance));
transform_later(cache_adr);
cache_adr = new CastP2XNode(needgc_false, cache_adr);
transform_later(cache_adr);
! // Address is aligned to execute prefetch to the beginning of cache line size
! // (it is important when BIS instruction is used on SPARC as prefetch).
Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1));
cache_adr = new AndXNode(cache_adr, mask);
transform_later(cache_adr);
cache_adr = new CastX2PNode(cache_adr);
transform_later(cache_adr);
< prev index next >