< prev index next >

src/hotspot/cpu/aarch64/jniFastGetField_aarch64.cpp

Print this page
8248238: Adding Windows support to OpenJDK on AArch64

Summary: LP64 vs LLP64 changes to add Windows support

Contributed-by: Monica Beckwith <monica.beckwith@microsoft.com>, Ludovic Henry <luhenry@microsoft.com>
Reviewed-by:


  56   switch (type) {
  57     case T_BOOLEAN: name = "jni_fast_GetBooleanField"; break;
  58     case T_BYTE:    name = "jni_fast_GetByteField";    break;
  59     case T_CHAR:    name = "jni_fast_GetCharField";    break;
  60     case T_SHORT:   name = "jni_fast_GetShortField";   break;
  61     case T_INT:     name = "jni_fast_GetIntField";     break;
  62     case T_LONG:    name = "jni_fast_GetLongField";    break;
  63     case T_FLOAT:   name = "jni_fast_GetFloatField";   break;
  64     case T_DOUBLE:  name = "jni_fast_GetDoubleField";  break;
  65     default:        ShouldNotReachHere();
  66       name = NULL;  // unreachable
  67   }
  68   ResourceMark rm;
  69   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
  70   CodeBuffer cbuf(blob);
  71   MacroAssembler* masm = new MacroAssembler(&cbuf);
  72   address fast_entry = __ pc();
  73 
  74   Label slow;
  75 
  76   unsigned long offset;
  77   __ adrp(rcounter_addr,
  78           SafepointSynchronize::safepoint_counter_addr(), offset);
  79   Address safepoint_counter_addr(rcounter_addr, offset);
  80   __ ldrw(rcounter, safepoint_counter_addr);
  81   __ tbnz(rcounter, 0, slow);
  82 
  83   // It doesn't need to issue a full barrier here even if the field
  84   // is volatile, since it has already used "ldar" for it.
  85   if (JvmtiExport::can_post_field_access()) {
  86     // Using barrier to order wrt. JVMTI check and load of result.
  87     __ membar(Assembler::LoadLoad);
  88 
  89     // Check to see if a field access watch has been set before we
  90     // take the fast path.
  91     unsigned long offset2;
  92     __ adrp(result,
  93             ExternalAddress((address) JvmtiExport::get_field_access_count_addr()),
  94             offset2);
  95     __ ldrw(result, Address(result, offset2));
  96     __ cbnzw(result, slow);
  97 
  98     __ mov(robj, c_rarg1);
  99   } else {
 100     // Using address dependency to order wrt. load of result.
 101     __ eor(robj, c_rarg1, rcounter);
 102     __ eor(robj, robj, rcounter);         // obj, since
 103                                           // robj ^ rcounter ^ rcounter == robj
 104                                           // robj is address dependent on rcounter.
 105   }
 106 
 107   // Both robj and rscratch1 are clobbered by try_resolve_jobject_in_native.
 108   BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
 109   bs->try_resolve_jobject_in_native(masm, c_rarg0, robj, rscratch1, slow);
 110 
 111   __ lsr(roffset, c_rarg2, 2);                // offset




  56   switch (type) {
  57     case T_BOOLEAN: name = "jni_fast_GetBooleanField"; break;
  58     case T_BYTE:    name = "jni_fast_GetByteField";    break;
  59     case T_CHAR:    name = "jni_fast_GetCharField";    break;
  60     case T_SHORT:   name = "jni_fast_GetShortField";   break;
  61     case T_INT:     name = "jni_fast_GetIntField";     break;
  62     case T_LONG:    name = "jni_fast_GetLongField";    break;
  63     case T_FLOAT:   name = "jni_fast_GetFloatField";   break;
  64     case T_DOUBLE:  name = "jni_fast_GetDoubleField";  break;
  65     default:        ShouldNotReachHere();
  66       name = NULL;  // unreachable
  67   }
  68   ResourceMark rm;
  69   BufferBlob* blob = BufferBlob::create(name, BUFFER_SIZE);
  70   CodeBuffer cbuf(blob);
  71   MacroAssembler* masm = new MacroAssembler(&cbuf);
  72   address fast_entry = __ pc();
  73 
  74   Label slow;
  75 
  76   uint64_t offset;
  77   __ adrp(rcounter_addr,
  78           SafepointSynchronize::safepoint_counter_addr(), offset);
  79   Address safepoint_counter_addr(rcounter_addr, offset);
  80   __ ldrw(rcounter, safepoint_counter_addr);
  81   __ tbnz(rcounter, 0, slow);
  82 
  83   // It doesn't need to issue a full barrier here even if the field
  84   // is volatile, since it has already used "ldar" for it.
  85   if (JvmtiExport::can_post_field_access()) {
  86     // Using barrier to order wrt. JVMTI check and load of result.
  87     __ membar(Assembler::LoadLoad);
  88 
  89     // Check to see if a field access watch has been set before we
  90     // take the fast path.
  91     uint64_t offset2;
  92     __ adrp(result,
  93             ExternalAddress((address) JvmtiExport::get_field_access_count_addr()),
  94             offset2);
  95     __ ldrw(result, Address(result, offset2));
  96     __ cbnzw(result, slow);
  97 
  98     __ mov(robj, c_rarg1);
  99   } else {
 100     // Using address dependency to order wrt. load of result.
 101     __ eor(robj, c_rarg1, rcounter);
 102     __ eor(robj, robj, rcounter);         // obj, since
 103                                           // robj ^ rcounter ^ rcounter == robj
 104                                           // robj is address dependent on rcounter.
 105   }
 106 
 107   // Both robj and rscratch1 are clobbered by try_resolve_jobject_in_native.
 108   BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
 109   bs->try_resolve_jobject_in_native(masm, c_rarg0, robj, rscratch1, slow);
 110 
 111   __ lsr(roffset, c_rarg2, 2);                // offset


< prev index next >