< prev index next >

src/cpu/ppc/vm/c1_LIRGenerator_ppc.cpp

Print this page




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:


< prev index next >