1336 if (x->is_add()) { 1337 __ xadd(ptr, data, dst, tmp); 1338 } else { 1339 const bool can_move_barrier = true; // TODO: port GraphKit::can_move_pre_barrier() from C2 1340 if (!can_move_barrier && is_obj) { 1341 // Do the pre-write barrier, if any. 1342 pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */, 1343 true /* do_load */, false /* patch */, NULL); 1344 } 1345 __ xchg(ptr, data, dst, tmp); 1346 if (is_obj) { 1347 // Seems to be a precise address. 1348 post_barrier(ptr, data); 1349 if (can_move_barrier) { 1350 pre_barrier(LIR_OprFact::illegalOpr, dst /* pre_val */, 1351 false /* do_load */, false /* patch */, NULL); 1352 } 1353 } 1354 } 1355 1356 __ membar(); 1357 } 1358 1359 1360 void LIRGenerator::do_update_CRC32(Intrinsic* x) { 1361 assert(UseCRC32Intrinsics, "or should not be here"); 1362 LIR_Opr result = rlock_result(x); 1363 1364 switch (x->id()) { 1365 case vmIntrinsics::_updateCRC32: { 1366 LIRItem crc(x->argument_at(0), this); 1367 LIRItem val(x->argument_at(1), this); 1368 // Registers destroyed by update_crc32. 1369 crc.set_destroys_register(); 1370 val.set_destroys_register(); 1371 crc.load_item(); 1372 val.load_item(); 1373 __ update_crc32(crc.result(), val.result(), result); 1374 break; 1375 } 1376 case vmIntrinsics::_updateBytesCRC32: | 1336 if (x->is_add()) { 1337 __ xadd(ptr, data, dst, tmp); 1338 } else { 1339 const bool can_move_barrier = true; // TODO: port GraphKit::can_move_pre_barrier() from C2 1340 if (!can_move_barrier && is_obj) { 1341 // Do the pre-write barrier, if any. 1342 pre_barrier(ptr, LIR_OprFact::illegalOpr /* pre_val */, 1343 true /* do_load */, false /* patch */, NULL); 1344 } 1345 __ xchg(ptr, data, dst, tmp); 1346 if (is_obj) { 1347 // Seems to be a precise address. 1348 post_barrier(ptr, data); 1349 if (can_move_barrier) { 1350 pre_barrier(LIR_OprFact::illegalOpr, dst /* pre_val */, 1351 false /* do_load */, false /* patch */, NULL); 1352 } 1353 } 1354 } 1355 1356 if (support_IRIW_for_not_multiple_copy_atomic_cpu) { 1357 __ membar_acquire(); 1358 } else { 1359 __ membar(); 1360 } 1361 } 1362 1363 1364 void LIRGenerator::do_update_CRC32(Intrinsic* x) { 1365 assert(UseCRC32Intrinsics, "or should not be here"); 1366 LIR_Opr result = rlock_result(x); 1367 1368 switch (x->id()) { 1369 case vmIntrinsics::_updateCRC32: { 1370 LIRItem crc(x->argument_at(0), this); 1371 LIRItem val(x->argument_at(1), this); 1372 // Registers destroyed by update_crc32. 1373 crc.set_destroys_register(); 1374 val.set_destroys_register(); 1375 crc.load_item(); 1376 val.load_item(); 1377 __ update_crc32(crc.result(), val.result(), result); 1378 break; 1379 } 1380 case vmIntrinsics::_updateBytesCRC32: |