8158012: Use SW prefetch instructions instead of BIS for allocation prefetches on SPARC Core S4
authorkvn
Wed, 07 Dec 2016 09:29:28 -0800
changeset 42642 99eb9fb61a27
parent 42641 0fc484157397
child 42643 f4b39e85487d
child 42644 6c6bdb0d227c
8158012: Use SW prefetch instructions instead of BIS for allocation prefetches on SPARC Core S4 Reviewed-by: kvn Contributed-by: shrinivas.joshi@oracle.com
hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp
hotspot/src/share/vm/opto/macro.cpp
--- a/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp	Tue Dec 06 16:42:42 2016 +0300
+++ b/hotspot/src/cpu/sparc/vm/vm_version_sparc.cpp	Wed Dec 07 09:29:28 2016 -0800
@@ -89,8 +89,18 @@
     if (is_niagara_plus()) {
       if (has_blk_init() && (cache_line_size > 0) && UseTLAB &&
           FLAG_IS_DEFAULT(AllocatePrefetchInstr)) {
-        // Use BIS instruction for TLAB allocation prefetch.
-        FLAG_SET_DEFAULT(AllocatePrefetchInstr, 1);
+        if (!has_sparc5_instr()) {
+          // Use BIS instruction for TLAB allocation prefetch
+          // on Niagara plus processors other than those based on CoreS4
+          FLAG_SET_DEFAULT(AllocatePrefetchInstr, 1);
+        } else {
+          // On CoreS4 processors use prefetch instruction
+          // to avoid partial RAW issue, also use prefetch style 3
+          FLAG_SET_DEFAULT(AllocatePrefetchInstr, 0);
+          if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) {
+            FLAG_SET_DEFAULT(AllocatePrefetchStyle, 3);
+          }
+        }
       }
       if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
         if (AllocatePrefetchInstr == 0) {
--- a/hotspot/src/share/vm/opto/macro.cpp	Tue Dec 06 16:42:42 2016 +0300
+++ b/hotspot/src/share/vm/opto/macro.cpp	Wed Dec 07 09:29:28 2016 -0800
@@ -1952,7 +1952,7 @@
       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.
+      // This code is used to generate 1 prefetch instruction per cache line.
 
       // Generate several prefetch instructions.
       uint lines = (length != NULL) ? AllocatePrefetchLines : AllocateInstancePrefetchLines;
@@ -1965,11 +1965,8 @@
       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.
+      // 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);