< prev index next >

src/cpu/aarch64/vm/templateTable_aarch64.cpp

Print this page




  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 }


 165                                 r1 /* pre_val */,
 166                                 rthread /* thread */,
 167                                 r10  /* tmp */,
 168                                 val != noreg /* tosca_live */,
 169                                 false /* expand_call */);
 170         if (val == noreg) {
 171           __ store_heap_oop_null(Address(r3, 0));
 172         } else {
 173           // G1 barrier needs uncompressed oop for region cross check.
 174           Register new_val = val;
 175           if (UseCompressedOops) {
 176             new_val = rscratch2;
 177             __ mov(new_val, val);
 178           }
 179           __ store_heap_oop(Address(r3, 0), val);
 180           __ g1_write_barrier_post(r3 /* store_adr */,
 181                                    new_val /* new_val */,
 182                                    rthread /* thread */,
 183                                    r10 /* tmp */,
 184                                    r1 /* tmp2 */);





























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




  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 }


 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           __ store_heap_oop(Address(r3, 0), val);
 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     case BarrierSet::ShenandoahBarrierSet:
 193       {
 194         // flatten object address if needed
 195         if (obj.index() == noreg && obj.offset() == 0) {
 196           if (obj.base() != r3) {
 197             __ mov(r3, obj.base());
 198           }
 199         } else {
 200           __ lea(r3, obj);
 201         }
 202         if (ShenandoahSATBBarrier) {
 203           __ g1_write_barrier_pre(r3 /* obj */,
 204                                   r1 /* pre_val */,
 205                                   rthread /* thread */,
 206                                   r10  /* tmp */,
 207                                   val != noreg /* tosca_live */,
 208                                   false /* expand_call */);
 209         }
 210         if (val == noreg) {
 211           __ store_heap_oop_null(Address(r3, 0));
 212         } else {
 213           if (ShenandoahStoreValEnqueueBarrier) {
 214             ShenandoahBarrierSetAssembler::bsasm()->storeval_barrier(_masm, val, r10);
 215           }
 216           __ store_heap_oop(Address(r3, 0), val);
 217         }
 218 
 219       }
 220       break;
 221 #endif // INCLUDE_ALL_GCS
 222     case BarrierSet::CardTableModRef:
 223     case BarrierSet::CardTableExtension:
 224       {
 225         if (val == noreg) {
 226           __ store_heap_oop_null(obj);
 227         } else {
 228           __ store_heap_oop(obj, val);
 229           // flatten object address if needed
 230           if (!precise || (obj.index() == noreg && obj.offset() == 0)) {
 231             __ store_check(obj.base());
 232           } else {
 233             __ lea(r3, obj);
 234             __ store_check(r3);
 235           }
 236         }


< prev index next >