src/cpu/mips/vm/macroAssembler_mips.cpp

changeset 9705
0b27fc8adf1b
parent 9644
3089aa0aa0ee
child 9808
a9451177555c
     1.1 --- a/src/cpu/mips/vm/macroAssembler_mips.cpp	Wed Sep 11 12:40:06 2019 +0800
     1.2 +++ b/src/cpu/mips/vm/macroAssembler_mips.cpp	Fri Sep 27 11:31:13 2019 +0800
     1.3 @@ -4241,3 +4241,44 @@
     1.4  
     1.5    return code_offset;
     1.6  }
     1.7 +
     1.8 +void MacroAssembler::clear_jweak_tag(Register possibly_jweak) {
     1.9 +  const int32_t inverted_jweak_mask = ~static_cast<int32_t>(JNIHandles::weak_tag_mask);
    1.10 +  STATIC_ASSERT(inverted_jweak_mask == -2); // otherwise check this code
    1.11 +  // The inverted mask is sign-extended
    1.12 +  move(AT, inverted_jweak_mask);
    1.13 +  andr(possibly_jweak, AT, possibly_jweak);
    1.14 +}
    1.15 +
    1.16 +void MacroAssembler::resolve_jobject(Register value,
    1.17 +                                     Register thread,
    1.18 +                                     Register tmp) {
    1.19 +  assert_different_registers(value, thread, tmp);
    1.20 +  Label done, not_weak;
    1.21 +  beq(value, R0, done);                // Use NULL as-is.
    1.22 +  delayed()->nop();
    1.23 +  move(AT, JNIHandles::weak_tag_mask); // Test for jweak tag.
    1.24 +  andr(AT, value, AT);
    1.25 +  beq(AT, R0, not_weak);
    1.26 +  delayed()->nop();
    1.27 +  // Resolve jweak.
    1.28 +  ld(value, value, -JNIHandles::weak_tag_value);
    1.29 +  verify_oop(value);
    1.30 +  #if INCLUDE_ALL_GCS
    1.31 +    if (UseG1GC) {
    1.32 +      g1_write_barrier_pre(noreg /* obj */,
    1.33 +                           value /* pre_val */,
    1.34 +                           thread /* thread */,
    1.35 +                           tmp /* tmp */,
    1.36 +                           true /* tosca_live */,
    1.37 +                           true /* expand_call */);
    1.38 +    }
    1.39 +  #endif // INCLUDE_ALL_GCS
    1.40 +  b(done);
    1.41 +  delayed()->nop();
    1.42 +  bind(not_weak);
    1.43 +  // Resolve (untagged) jobject.
    1.44 +  ld(value, value, 0);
    1.45 +  verify_oop(value);
    1.46 +  bind(done);
    1.47 +}

mercurial