Mercurial > hg > truffle
comparison src/cpu/sparc/vm/c1_LIRGenerator_sparc.cpp @ 6795:7eca5de9e0b6
7023898: Intrinsify AtomicLongFieldUpdater.getAndIncrement()
Summary: use shorter instruction sequences for atomic add and atomic exchange when possible.
Reviewed-by: kvn, jrose
author | roland |
---|---|
date | Thu, 20 Sep 2012 16:49:17 +0200 |
parents | 8a02ca5e5576 |
children | 46f6f063b272 |
comparison
equal
deleted
inserted
replaced
6794:8ae8f9dd7099 | 6795:7eca5de9e0b6 |
---|---|
1202 { | 1202 { |
1203 LIR_Address* addr = new LIR_Address(src, offset, type); | 1203 LIR_Address* addr = new LIR_Address(src, offset, type); |
1204 __ load(addr, dst); | 1204 __ load(addr, dst); |
1205 } | 1205 } |
1206 } | 1206 } |
1207 | |
1208 void LIRGenerator::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) { | |
1209 BasicType type = x->basic_type(); | |
1210 LIRItem src(x->object(), this); | |
1211 LIRItem off(x->offset(), this); | |
1212 LIRItem value(x->value(), this); | |
1213 | |
1214 src.load_item(); | |
1215 value.load_item(); | |
1216 off.load_nonconstant(); | |
1217 | |
1218 LIR_Opr dst = rlock_result(x, type); | |
1219 LIR_Opr data = value.result(); | |
1220 bool is_obj = (type == T_ARRAY || type == T_OBJECT); | |
1221 LIR_Opr offset = off.result(); | |
1222 | |
1223 if (data != dst) { | |
1224 __ move(data, dst); | |
1225 data = dst; | |
1226 } | |
1227 | |
1228 assert (!x->is_add() && (type == T_INT || (is_obj LP64_ONLY(&& UseCompressedOops))), "unexpected type"); | |
1229 LIR_Address* addr; | |
1230 if (offset->is_constant()) { | |
1231 | |
1232 #ifdef _LP64 | |
1233 jlong l = offset->as_jlong(); | |
1234 assert((jlong)((jint)l) == l, "offset too large for constant"); | |
1235 jint c = (jint)l; | |
1236 #else | |
1237 jint c = offset->as_jint(); | |
1238 #endif | |
1239 addr = new LIR_Address(src.result(), c, type); | |
1240 } else { | |
1241 addr = new LIR_Address(src.result(), offset, type); | |
1242 } | |
1243 | |
1244 LIR_Opr tmp = LIR_OprFact::illegalOpr; | |
1245 LIR_Opr ptr = LIR_OprFact::illegalOpr; | |
1246 | |
1247 if (is_obj) { | |
1248 // Do the pre-write barrier, if any. | |
1249 // barriers on sparc don't work with a base + index address | |
1250 tmp = FrameMap::G3_opr; | |
1251 ptr = new_pointer_register(); | |
1252 __ add(src.result(), off.result(), ptr); | |
1253 pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */, | |
1254 true /* do_load */, false /* patch */, NULL); | |
1255 } | |
1256 __ xchg(LIR_OprFact::address(addr), data, dst, tmp); | |
1257 if (is_obj) { | |
1258 // Seems to be a precise address | |
1259 post_barrier(ptr, data); | |
1260 } | |
1261 } |