Mercurial > hg > graal-compiler
comparison src/share/vm/opto/macro.cpp @ 1367:9e321dcfa5b7
6940726: Use BIS instruction for allocation prefetch on Sparc
Summary: Use BIS instruction for allocation prefetch on Sparc
Reviewed-by: twisti
author | kvn |
---|---|
date | Wed, 07 Apr 2010 12:39:27 -0700 |
parents | f96a1a986f7b |
children | c18cbe5936b8 |
comparison
equal
deleted
inserted
replaced
1366:b9d85fcdf743 | 1367:9e321dcfa5b7 |
---|---|
1485 // Generate prefetch instructions for next allocations. | 1485 // Generate prefetch instructions for next allocations. |
1486 Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false, | 1486 Node* PhaseMacroExpand::prefetch_allocation(Node* i_o, Node*& needgc_false, |
1487 Node*& contended_phi_rawmem, | 1487 Node*& contended_phi_rawmem, |
1488 Node* old_eden_top, Node* new_eden_top, | 1488 Node* old_eden_top, Node* new_eden_top, |
1489 Node* length) { | 1489 Node* length) { |
1490 enum { fall_in_path = 1, pf_path = 2 }; | |
1490 if( UseTLAB && AllocatePrefetchStyle == 2 ) { | 1491 if( UseTLAB && AllocatePrefetchStyle == 2 ) { |
1491 // Generate prefetch allocation with watermark check. | 1492 // Generate prefetch allocation with watermark check. |
1492 // As an allocation hits the watermark, we will prefetch starting | 1493 // As an allocation hits the watermark, we will prefetch starting |
1493 // at a "distance" away from watermark. | 1494 // at a "distance" away from watermark. |
1494 enum { fall_in_path = 1, pf_path = 2 }; | |
1495 | 1495 |
1496 Node *pf_region = new (C, 3) RegionNode(3); | 1496 Node *pf_region = new (C, 3) RegionNode(3); |
1497 Node *pf_phi_rawmem = new (C, 3) PhiNode( pf_region, Type::MEMORY, | 1497 Node *pf_phi_rawmem = new (C, 3) PhiNode( pf_region, Type::MEMORY, |
1498 TypeRawPtr::BOTTOM ); | 1498 TypeRawPtr::BOTTOM ); |
1499 // I/O is used for Prefetch | 1499 // I/O is used for Prefetch |
1568 transform_later(pf_phi_abio); | 1568 transform_later(pf_phi_abio); |
1569 | 1569 |
1570 needgc_false = pf_region; | 1570 needgc_false = pf_region; |
1571 contended_phi_rawmem = pf_phi_rawmem; | 1571 contended_phi_rawmem = pf_phi_rawmem; |
1572 i_o = pf_phi_abio; | 1572 i_o = pf_phi_abio; |
1573 } else if( UseTLAB && AllocatePrefetchStyle == 3 ) { | |
1574 // Insert a prefetch for each allocation only on the fast-path | |
1575 Node *pf_region = new (C, 3) RegionNode(3); | |
1576 Node *pf_phi_rawmem = new (C, 3) PhiNode( pf_region, Type::MEMORY, | |
1577 TypeRawPtr::BOTTOM ); | |
1578 | |
1579 // Generate several prefetch instructions only for arrays. | |
1580 uint lines = (length != NULL) ? AllocatePrefetchLines : 1; | |
1581 uint step_size = AllocatePrefetchStepSize; | |
1582 uint distance = AllocatePrefetchDistance; | |
1583 | |
1584 // Next cache address. | |
1585 Node *cache_adr = new (C, 4) AddPNode(old_eden_top, old_eden_top, | |
1586 _igvn.MakeConX(distance)); | |
1587 transform_later(cache_adr); | |
1588 cache_adr = new (C, 2) CastP2XNode(needgc_false, cache_adr); | |
1589 transform_later(cache_adr); | |
1590 Node* mask = _igvn.MakeConX(~(intptr_t)(step_size-1)); | |
1591 cache_adr = new (C, 3) AndXNode(cache_adr, mask); | |
1592 transform_later(cache_adr); | |
1593 cache_adr = new (C, 2) CastX2PNode(cache_adr); | |
1594 transform_later(cache_adr); | |
1595 | |
1596 // Prefetch | |
1597 Node *prefetch = new (C, 3) PrefetchWriteNode( contended_phi_rawmem, cache_adr ); | |
1598 prefetch->set_req(0, needgc_false); | |
1599 transform_later(prefetch); | |
1600 contended_phi_rawmem = prefetch; | |
1601 Node *prefetch_adr; | |
1602 distance = step_size; | |
1603 for ( uint i = 1; i < lines; i++ ) { | |
1604 prefetch_adr = new (C, 4) AddPNode( cache_adr, cache_adr, | |
1605 _igvn.MakeConX(distance) ); | |
1606 transform_later(prefetch_adr); | |
1607 prefetch = new (C, 3) PrefetchWriteNode( contended_phi_rawmem, prefetch_adr ); | |
1608 transform_later(prefetch); | |
1609 distance += step_size; | |
1610 contended_phi_rawmem = prefetch; | |
1611 } | |
1573 } else if( AllocatePrefetchStyle > 0 ) { | 1612 } else if( AllocatePrefetchStyle > 0 ) { |
1574 // Insert a prefetch for each allocation only on the fast-path | 1613 // Insert a prefetch for each allocation only on the fast-path |
1575 Node *prefetch_adr; | 1614 Node *prefetch_adr; |
1576 Node *prefetch; | 1615 Node *prefetch; |
1577 // Generate several prefetch instructions only for arrays. | 1616 // Generate several prefetch instructions only for arrays. |