< prev index next >

src/hotspot/cpu/s390/gc/g1/g1BarrierSetAssembler_s390.cpp

Print this page
rev 54116 : 8220660: [s390]: debug build broken after JDK-8220301
Reviewed-by:


 292   } else {
 293     __ z_ltgr(Rnew_val, Rnew_val);
 294     __ z_bre(filtered);
 295   }
 296 
 297   Rnew_val = noreg; // end of lifetime
 298 
 299   // Storing region crossing non-NULL, is card already dirty?
 300   assert_different_registers(Rtmp1, Rtmp2, Rtmp3);
 301   // Make sure not to use Z_R0 for any of these registers.
 302   Register Rcard_addr = (Rtmp1 != Z_R0_scratch) ? Rtmp1 : Rtmp3;
 303   Register Rbase      = (Rtmp2 != Z_R0_scratch) ? Rtmp2 : Rtmp3;
 304 
 305   // calculate address of card
 306   __ load_const_optimized(Rbase, (address)ct->card_table()->byte_map_base());      // Card table base.
 307   __ z_srlg(Rcard_addr, Rstore_addr, CardTable::card_shift);         // Index into card table.
 308   __ z_algr(Rcard_addr, Rbase);                                      // Explicit calculation needed for cli.
 309   Rbase = noreg; // end of lifetime
 310 
 311   // Filter young.
 312   assert((unsigned int)G1CardTable::g1_young_card_val() <= 255, "otherwise check this code");
 313   __ z_cli(0, Rcard_addr, G1CardTable::g1_young_card_val());
 314   __ z_bre(filtered);
 315 
 316   // Check the card value. If dirty, we're done.
 317   // This also avoids false sharing of the (already dirty) card.
 318   __ z_sync(); // Required to support concurrent cleaning.
 319   assert((unsigned int)G1CardTable::dirty_card_val() <= 255, "otherwise check this code");
 320   __ z_cli(0, Rcard_addr, G1CardTable::dirty_card_val()); // Reload after membar.
 321   __ z_bre(filtered);
 322 
 323   // Storing a region crossing, non-NULL oop, card is clean.
 324   // Dirty card and log.
 325   __ z_mvi(0, Rcard_addr, G1CardTable::dirty_card_val());
 326 
 327   Register Rcard_addr_x = Rcard_addr;
 328   Register Rqueue_index = (Rtmp2 != Z_R0_scratch) ? Rtmp2 : Rtmp1;
 329   Register Rqueue_buf   = (Rtmp3 != Z_R0_scratch) ? Rtmp3 : Rtmp1;
 330   const int qidx_off    = in_bytes(G1ThreadLocalData::dirty_card_queue_index_offset());
 331   const int qbuf_off    = in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset());
 332   if ((Rcard_addr == Rqueue_buf) || (Rcard_addr == Rqueue_index)) {
 333     Rcard_addr_x = Z_R0_scratch;  // Register shortage. We have to use Z_R0.
 334   }
 335   __ lgr_if_needed(Rcard_addr_x, Rcard_addr);
 336 
 337   __ load_and_test_long(Rqueue_index, Address(Z_thread, qidx_off));
 338   __ z_bre(callRuntime); // Index == 0 then jump to runtime.
 339 




 292   } else {
 293     __ z_ltgr(Rnew_val, Rnew_val);
 294     __ z_bre(filtered);
 295   }
 296 
 297   Rnew_val = noreg; // end of lifetime
 298 
 299   // Storing region crossing non-NULL, is card already dirty?
 300   assert_different_registers(Rtmp1, Rtmp2, Rtmp3);
 301   // Make sure not to use Z_R0 for any of these registers.
 302   Register Rcard_addr = (Rtmp1 != Z_R0_scratch) ? Rtmp1 : Rtmp3;
 303   Register Rbase      = (Rtmp2 != Z_R0_scratch) ? Rtmp2 : Rtmp3;
 304 
 305   // calculate address of card
 306   __ load_const_optimized(Rbase, (address)ct->card_table()->byte_map_base());      // Card table base.
 307   __ z_srlg(Rcard_addr, Rstore_addr, CardTable::card_shift);         // Index into card table.
 308   __ z_algr(Rcard_addr, Rbase);                                      // Explicit calculation needed for cli.
 309   Rbase = noreg; // end of lifetime
 310 
 311   // Filter young.

 312   __ z_cli(0, Rcard_addr, G1CardTable::g1_young_card_val());
 313   __ z_bre(filtered);
 314 
 315   // Check the card value. If dirty, we're done.
 316   // This also avoids false sharing of the (already dirty) card.
 317   __ z_sync(); // Required to support concurrent cleaning.

 318   __ z_cli(0, Rcard_addr, G1CardTable::dirty_card_val()); // Reload after membar.
 319   __ z_bre(filtered);
 320 
 321   // Storing a region crossing, non-NULL oop, card is clean.
 322   // Dirty card and log.
 323   __ z_mvi(0, Rcard_addr, G1CardTable::dirty_card_val());
 324 
 325   Register Rcard_addr_x = Rcard_addr;
 326   Register Rqueue_index = (Rtmp2 != Z_R0_scratch) ? Rtmp2 : Rtmp1;
 327   Register Rqueue_buf   = (Rtmp3 != Z_R0_scratch) ? Rtmp3 : Rtmp1;
 328   const int qidx_off    = in_bytes(G1ThreadLocalData::dirty_card_queue_index_offset());
 329   const int qbuf_off    = in_bytes(G1ThreadLocalData::dirty_card_queue_buffer_offset());
 330   if ((Rcard_addr == Rqueue_buf) || (Rcard_addr == Rqueue_index)) {
 331     Rcard_addr_x = Z_R0_scratch;  // Register shortage. We have to use Z_R0.
 332   }
 333   __ lgr_if_needed(Rcard_addr_x, Rcard_addr);
 334 
 335   __ load_and_test_long(Rqueue_index, Address(Z_thread, qidx_off));
 336   __ z_bre(callRuntime); // Index == 0 then jump to runtime.
 337 


< prev index next >