Skip to content

Commit ac58b61

Browse files
committed
8339416: [s390x] Provide implementation for resolve_global_jobject
Reviewed-by: mdoerr, lucy
1 parent 537447f commit ac58b61

File tree

6 files changed

+77
-11
lines changed

6 files changed

+77
-11
lines changed

src/hotspot/cpu/s390/gc/shared/barrierSetAssembler_s390.cpp

Lines changed: 50 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -105,16 +105,60 @@ void BarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet decorators
105105
}
106106
}
107107

108+
// Generic implementation. GCs can provide an optimized one.
108109
void BarrierSetAssembler::resolve_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2) {
109-
NearLabel Ldone;
110-
__ z_ltgr(tmp1, value);
111-
__ z_bre(Ldone); // Use null result as-is.
112110

113-
__ z_nill(value, ~JNIHandles::tag_mask);
114-
__ z_lg(value, 0, value); // Resolve (untagged) jobject.
111+
assert_different_registers(value, tmp1, tmp2);
112+
NearLabel done, weak_tag, verify, tagged;
113+
__ z_ltgr(value, value);
114+
__ z_bre(done); // Use null result as-is.
115115

116+
__ z_tmll(value, JNIHandles::tag_mask);
117+
__ z_btrue(tagged); // not zero
118+
119+
// Resolve Local handle
120+
__ access_load_at(T_OBJECT, IN_NATIVE | AS_RAW, Address(value, 0), value, tmp1, tmp2);
121+
__ z_bru(verify);
122+
123+
__ bind(tagged);
124+
__ testbit(value, exact_log2(JNIHandles::TypeTag::weak_global)); // test for weak tag
125+
__ z_btrue(weak_tag);
126+
127+
// resolve global handle
128+
__ access_load_at(T_OBJECT, IN_NATIVE, Address(value, -JNIHandles::TypeTag::global), value, tmp1, tmp2);
129+
__ z_bru(verify);
130+
131+
__ bind(weak_tag);
132+
// resolve jweak.
133+
__ access_load_at(T_OBJECT, IN_NATIVE | ON_PHANTOM_OOP_REF,
134+
Address(value, -JNIHandles::TypeTag::weak_global), value, tmp1, tmp2);
135+
__ bind(verify);
136+
__ verify_oop(value, FILE_AND_LINE);
137+
__ bind(done);
138+
}
139+
140+
// Generic implementation. GCs can provide an optimized one.
141+
void BarrierSetAssembler::resolve_global_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2) {
142+
assert_different_registers(value, tmp1, tmp2);
143+
NearLabel done;
144+
145+
__ z_ltgr(value, value);
146+
__ z_bre(done); // use null as-is.
147+
148+
#ifdef ASSERT
149+
{
150+
NearLabel valid_global_tag;
151+
__ testbit(value, exact_log2(JNIHandles::TypeTag::global)); // test for global tag
152+
__ z_btrue(valid_global_tag);
153+
__ stop("non global jobject using resolve_global_jobject");
154+
__ bind(valid_global_tag);
155+
}
156+
#endif // ASSERT
157+
158+
// Resolve global handle
159+
__ access_load_at(T_OBJECT, IN_NATIVE, Address(value, -JNIHandles::TypeTag::global), value, tmp1, tmp2);
116160
__ verify_oop(value, FILE_AND_LINE);
117-
__ bind(Ldone);
161+
__ bind(done);
118162
}
119163

120164
void BarrierSetAssembler::try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,

src/hotspot/cpu/s390/gc/shared/barrierSetAssembler_s390.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class BarrierSetAssembler: public CHeapObj<mtGC> {
5151
const Address& addr, Register val, Register tmp1, Register tmp2, Register tmp3);
5252

5353
virtual void resolve_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2);
54+
virtual void resolve_global_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2);
5455

5556
virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env,
5657
Register obj, Register tmp, Label& slowpath);

src/hotspot/cpu/s390/gc/shared/modRefBarrierSetAssembler_s390.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
3-
* Copyright (c) 2018, 2019 SAP SE. All rights reserved.
2+
* Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2018, 2024 SAP SE. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
66
* This code is free software; you can redistribute it and/or modify it
@@ -26,6 +26,7 @@
2626
#include "precompiled.hpp"
2727
#include "asm/macroAssembler.inline.hpp"
2828
#include "gc/shared/modRefBarrierSetAssembler.hpp"
29+
#include "runtime/jniHandles.hpp"
2930

3031
#define __ masm->
3132

@@ -58,3 +59,16 @@ void ModRefBarrierSetAssembler::store_at(MacroAssembler* masm, DecoratorSet deco
5859
BarrierSetAssembler::store_at(masm, decorators, type, dst, val, tmp1, tmp2, tmp3);
5960
}
6061
}
62+
63+
void ModRefBarrierSetAssembler::resolve_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2) {
64+
NearLabel done;
65+
66+
__ z_ltgr(value, value);
67+
__ z_bre(done); // use null as-is.
68+
69+
__ z_nill(value, ~JNIHandles::tag_mask);
70+
__ z_lg(value, 0, value); // Resolve (untagged) jobject.
71+
72+
__ verify_oop(value, FILE_AND_LINE);
73+
__ bind(done);
74+
}

src/hotspot/cpu/s390/gc/shared/modRefBarrierSetAssembler_s390.hpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
2-
* Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
3-
* Copyright (c) 2018 SAP SE. All rights reserved.
2+
* Copyright (c) 2018, 2024, Oracle and/or its affiliates. All rights reserved.
3+
* Copyright (c) 2018, 2024 SAP SE. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
66
* This code is free software; you can redistribute it and/or modify it
@@ -48,6 +48,8 @@ class ModRefBarrierSetAssembler: public BarrierSetAssembler {
4848

4949
virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type,
5050
const Address& dst, Register val, Register tmp1, Register tmp2, Register tmp3);
51+
52+
virtual void resolve_jobject(MacroAssembler* masm, Register value, Register tmp1, Register tmp2);
5153
};
5254

5355
#endif // CPU_S390_GC_SHARED_MODREFBARRIERSETASSEMBLER_S390_HPP

src/hotspot/cpu/s390/macroAssembler_s390.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3674,6 +3674,11 @@ void MacroAssembler::resolve_jobject(Register value, Register tmp1, Register tmp
36743674
bs->resolve_jobject(this, value, tmp1, tmp2);
36753675
}
36763676

3677+
void MacroAssembler::resolve_global_jobject(Register value, Register tmp1, Register tmp2) {
3678+
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
3679+
bs->resolve_global_jobject(this, value, tmp1, tmp2);
3680+
}
3681+
36773682
// Last_Java_sp must comply to the rules in frame_s390.hpp.
36783683
void MacroAssembler::set_last_Java_frame(Register last_Java_sp, Register last_Java_pc, bool allow_relocation) {
36793684
BLOCK_COMMENT("set_last_Java_frame {");

src/hotspot/cpu/s390/macroAssembler_s390.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ class MacroAssembler: public Assembler {
758758
void compiler_fast_unlock_lightweight_object(Register obj, Register tmp1, Register tmp2);
759759

760760
void resolve_jobject(Register value, Register tmp1, Register tmp2);
761+
void resolve_global_jobject(Register value, Register tmp1, Register tmp2);
761762

762763
// Support for last Java frame (but use call_VM instead where possible).
763764
private:
@@ -819,7 +820,6 @@ class MacroAssembler: public Assembler {
819820
void compare_klass_ptr(Register Rop1, int64_t disp, Register Rbase, bool maybenull);
820821

821822
// Access heap oop, handle encoding and GC barriers.
822-
private:
823823
void access_store_at(BasicType type, DecoratorSet decorators,
824824
const Address& addr, Register val,
825825
Register tmp1, Register tmp2, Register tmp3);

0 commit comments

Comments
 (0)