94
95 LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value) {
96 LIRGenerator* gen = access.gen();
97 BasicType type = access.type();
98
99 LIR_Opr result = gen->new_register(type);
100 value.load_item();
101 LIR_Opr value_opr = value.result();
102
103 if (access.is_oop()) {
104 value_opr = storeval_barrier(access.gen(), value_opr, access.access_emit_info(), access.decorators());
105 }
106
107 // Because we want a 2-arg form of xchg and xadd
108 __ move(value_opr, result);
109
110 assert(type == T_INT || is_reference_type(type) LP64_ONLY( || type == T_LONG ), "unexpected type");
111 __ xchg(access.resolved_addr(), result, result, LIR_OprFact::illegalOpr);
112
113 if (access.is_oop()) {
114 result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0));
115 LIR_Opr tmp = gen->new_register(type);
116 __ move(result, tmp);
117 result = tmp;
118 if (ShenandoahSATBBarrier) {
119 pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
120 result /* pre_val */);
121 }
122 }
123
124 return result;
125 }
|
94
95 LIR_Opr ShenandoahBarrierSetC1::atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value) {
96 LIRGenerator* gen = access.gen();
97 BasicType type = access.type();
98
99 LIR_Opr result = gen->new_register(type);
100 value.load_item();
101 LIR_Opr value_opr = value.result();
102
103 if (access.is_oop()) {
104 value_opr = storeval_barrier(access.gen(), value_opr, access.access_emit_info(), access.decorators());
105 }
106
107 // Because we want a 2-arg form of xchg and xadd
108 __ move(value_opr, result);
109
110 assert(type == T_INT || is_reference_type(type) LP64_ONLY( || type == T_LONG ), "unexpected type");
111 __ xchg(access.resolved_addr(), result, result, LIR_OprFact::illegalOpr);
112
113 if (access.is_oop()) {
114 result = load_reference_barrier(access.gen(), result, LIR_OprFact::addressConst(0), false);
115 LIR_Opr tmp = gen->new_register(type);
116 __ move(result, tmp);
117 result = tmp;
118 if (ShenandoahSATBBarrier) {
119 pre_barrier(access.gen(), access.access_emit_info(), access.decorators(), LIR_OprFact::illegalOpr,
120 result /* pre_val */);
121 }
122 }
123
124 return result;
125 }
|