< prev index next >

src/cpu/aarch64/vm/templateTable_aarch64.cpp

Print this page
rev 11463 : Backport Traversal GC


  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  *
  25  */
  26 
  27 #include "precompiled.hpp"
  28 #include "asm/macroAssembler.hpp"
  29 #include "interpreter/interpreter.hpp"
  30 #include "interpreter/interpreterRuntime.hpp"
  31 #include "interpreter/templateTable.hpp"
  32 #include "memory/universe.inline.hpp"
  33 #include "oops/methodData.hpp"
  34 #include "oops/method.hpp"
  35 #include "oops/objArrayKlass.hpp"
  36 #include "oops/oop.inline.hpp"
  37 #include "prims/methodHandles.hpp"
  38 #include "runtime/sharedRuntime.hpp"
  39 #include "runtime/stubRoutines.hpp"
  40 #include "runtime/synchronizer.hpp"



  41 
  42 #ifndef CC_INTERP
  43 
  44 #define __ _masm->
  45 
  46 // Platform-dependent initialization
  47 
  48 void TemplateTable::pd_initialize() {
  49   // No amd64 specific initialization
  50 }
  51 
  52 // Address computation: local variables
  53 
  54 static inline Address iaddress(int n) {
  55   return Address(rlocals, Interpreter::local_offset_in_bytes(n));
  56 }
  57 
  58 static inline Address laddress(int n) {
  59   return iaddress(n + 1);
  60 }


 135   case TemplateTable::greater_equal: return Assembler::LT;
 136   }
 137   ShouldNotReachHere();
 138   return Assembler::EQ;
 139 }
 140 
 141 
 142 // Miscelaneous helper routines
 143 // Store an oop (or NULL) at the Address described by obj.
 144 // If val == noreg this means store a NULL
 145 static void do_oop_store(InterpreterMacroAssembler* _masm,
 146                          Address obj,
 147                          Register val,
 148                          BarrierSet::Name barrier,
 149                          bool precise) {
 150   assert(val == noreg || val == r0, "parameter is just for looks");
 151   switch (barrier) {
 152 #if INCLUDE_ALL_GCS
 153     case BarrierSet::G1SATBCT:
 154     case BarrierSet::G1SATBCTLogging:
 155     case BarrierSet::ShenandoahBarrierSet:
 156       {
 157         // flatten object address if needed
 158         if (obj.index() == noreg && obj.offset() == 0) {
 159           if (obj.base() != r3) {
 160             __ mov(r3, obj.base());
 161           }
 162         } else {
 163           __ lea(r3, obj);
 164         }
 165         __ g1_write_barrier_pre(r3 /* obj */,
 166                                 r1 /* pre_val */,
 167                                 rthread /* thread */,
 168                                 r10  /* tmp */,
 169                                 val != noreg /* tosca_live */,
 170                                 false /* expand_call */);
 171         if (val == noreg) {
 172           __ store_heap_oop_null(Address(r3, 0));
 173         } else {
 174           // G1 barrier needs uncompressed oop for region cross check.
 175           Register new_val = val;
 176           if (UseCompressedOops) {
 177             new_val = rscratch2;
 178             __ mov(new_val, val);
 179           }
 180 
 181           __ store_heap_oop(Address(r3, 0), val);
 182 
 183           __ g1_write_barrier_post(r3 /* store_adr */,
 184                                    new_val /* new_val */,
 185                                    rthread /* thread */,
 186                                    r10 /* tmp */,
 187                                    r1 /* tmp2 */);





























 188         }
 189 
 190       }
 191       break;
 192 #endif // INCLUDE_ALL_GCS
 193     case BarrierSet::CardTableModRef:
 194     case BarrierSet::CardTableExtension:
 195       {
 196         if (val == noreg) {
 197           __ store_heap_oop_null(obj);
 198         } else {
 199           __ store_heap_oop(obj, val);
 200           // flatten object address if needed
 201           if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
 202             __ store_check(obj.base());
 203           } else {
 204             __ lea(r3, obj);
 205             __ store_check(r3);
 206           }
 207         }




  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  *
  25  */
  26 
  27 #include "precompiled.hpp"
  28 #include "asm/macroAssembler.hpp"
  29 #include "interpreter/interpreter.hpp"
  30 #include "interpreter/interpreterRuntime.hpp"
  31 #include "interpreter/templateTable.hpp"
  32 #include "memory/universe.inline.hpp"
  33 #include "oops/methodData.hpp"
  34 #include "oops/method.hpp"
  35 #include "oops/objArrayKlass.hpp"
  36 #include "oops/oop.inline.hpp"
  37 #include "prims/methodHandles.hpp"
  38 #include "runtime/sharedRuntime.hpp"
  39 #include "runtime/stubRoutines.hpp"
  40 #include "runtime/synchronizer.hpp"
  41 #if INCLUDE_ALL_GCS
  42 #include "shenandoahBarrierSetAssembler_aarch64.hpp"
  43 #endif
  44 
  45 #ifndef CC_INTERP
  46 
  47 #define __ _masm->
  48 
  49 // Platform-dependent initialization
  50 
  51 void TemplateTable::pd_initialize() {
  52   // No amd64 specific initialization
  53 }
  54 
  55 // Address computation: local variables
  56 
  57 static inline Address iaddress(int n) {
  58   return Address(rlocals, Interpreter::local_offset_in_bytes(n));
  59 }
  60 
  61 static inline Address laddress(int n) {
  62   return iaddress(n + 1);
  63 }


 138   case TemplateTable::greater_equal: return Assembler::LT;
 139   }
 140   ShouldNotReachHere();
 141   return Assembler::EQ;
 142 }
 143 
 144 
 145 // Miscelaneous helper routines
 146 // Store an oop (or NULL) at the Address described by obj.
 147 // If val == noreg this means store a NULL
 148 static void do_oop_store(InterpreterMacroAssembler* _masm,
 149                          Address obj,
 150                          Register val,
 151                          BarrierSet::Name barrier,
 152                          bool precise) {
 153   assert(val == noreg || val == r0, "parameter is just for looks");
 154   switch (barrier) {
 155 #if INCLUDE_ALL_GCS
 156     case BarrierSet::G1SATBCT:
 157     case BarrierSet::G1SATBCTLogging:

 158       {
 159         // flatten object address if needed
 160         if (obj.index() == noreg && obj.offset() == 0) {
 161           if (obj.base() != r3) {
 162             __ mov(r3, obj.base());
 163           }
 164         } else {
 165           __ lea(r3, obj);
 166         }
 167         __ g1_write_barrier_pre(r3 /* obj */,
 168                                 r1 /* pre_val */,
 169                                 rthread /* thread */,
 170                                 r10  /* tmp */,
 171                                 val != noreg /* tosca_live */,
 172                                 false /* expand_call */);
 173         if (val == noreg) {
 174           __ store_heap_oop_null(Address(r3, 0));
 175         } else {
 176           // G1 barrier needs uncompressed oop for region cross check.
 177           Register new_val = val;
 178           if (UseCompressedOops) {
 179             new_val = rscratch2;
 180             __ mov(new_val, val);
 181           }
 182 
 183           __ store_heap_oop(Address(r3, 0), val);
 184 
 185           __ g1_write_barrier_post(r3 /* store_adr */,
 186                                    new_val /* new_val */,
 187                                    rthread /* thread */,
 188                                    r10 /* tmp */,
 189                                    r1 /* tmp2 */);
 190         }
 191 
 192       }
 193       break;
 194     case BarrierSet::ShenandoahBarrierSet:
 195       {
 196         // flatten object address if needed
 197         if (obj.index() == noreg && obj.offset() == 0) {
 198           if (obj.base() != r3) {
 199             __ mov(r3, obj.base());
 200           }
 201         } else {
 202           __ lea(r3, obj);
 203         }
 204         if (ShenandoahSATBBarrier) {
 205           __ g1_write_barrier_pre(r3 /* obj */,
 206                                   r1 /* pre_val */,
 207                                   rthread /* thread */,
 208                                   r10  /* tmp */,
 209                                   val != noreg /* tosca_live */,
 210                                   false /* expand_call */);
 211         }
 212         if (val == noreg) {
 213           __ store_heap_oop_null(Address(r3, 0));
 214         } else {
 215           if (ShenandoahStoreValEnqueueBarrier) {
 216             ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r10);
 217           }
 218           __ store_heap_oop(Address(r3, 0), val);
 219         }
 220 
 221       }
 222       break;
 223 #endif // INCLUDE_ALL_GCS
 224     case BarrierSet::CardTableModRef:
 225     case BarrierSet::CardTableExtension:
 226       {
 227         if (val == noreg) {
 228           __ store_heap_oop_null(obj);
 229         } else {
 230           __ store_heap_oop(obj, val);
 231           // flatten object address if needed
 232           if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
 233             __ store_check(obj.base());
 234           } else {
 235             __ lea(r3, obj);
 236             __ store_check(r3);
 237           }
 238         }


< prev index next >