hotspot/src/share/vm/opto/graphKit.cpp
changeset 2027 a980915cf495
parent 1404 4a969f79e3e6
child 2029 4ba79339bc0c
equal deleted inserted replaced
2026:d15da7324f58 2027:a980915cf495
  1834          "Only one we handle so far.");
  1834          "Only one we handle so far.");
  1835   CardTableModRefBS* ct =
  1835   CardTableModRefBS* ct =
  1836     (CardTableModRefBS*)(Universe::heap()->barrier_set());
  1836     (CardTableModRefBS*)(Universe::heap()->barrier_set());
  1837   Node *b = _gvn.transform(new (C, 3) URShiftXNode( cast, _gvn.intcon(CardTableModRefBS::card_shift) ));
  1837   Node *b = _gvn.transform(new (C, 3) URShiftXNode( cast, _gvn.intcon(CardTableModRefBS::card_shift) ));
  1838   // We store into a byte array, so do not bother to left-shift by zero
  1838   // We store into a byte array, so do not bother to left-shift by zero
  1839   // Get base of card map
  1839   Node *c = byte_map_base_node();
  1840   assert(sizeof(*ct->byte_map_base) == sizeof(jbyte),
       
  1841          "adjust this code");
       
  1842   Node *c = makecon(TypeRawPtr::make((address)ct->byte_map_base));
       
  1843   // Combine
  1840   // Combine
  1844   Node *sb_ctl = control();
  1841   Node *sb_ctl = control();
  1845   Node *sb_adr = _gvn.transform(new (C, 4) AddPNode( top()/*no base ptr*/, c, b ));
  1842   Node *sb_adr = _gvn.transform(new (C, 4) AddPNode( top()/*no base ptr*/, c, b ));
  1846   Node *sb_val = _gvn.intcon(0);
  1843   Node *sb_val = _gvn.intcon(0);
  1847   // Smash zero into card
  1844   // Smash zero into card
  3363   // Get the alias_index for raw card-mark memory
  3360   // Get the alias_index for raw card-mark memory
  3364   const TypePtr* card_type = TypeRawPtr::BOTTOM;
  3361   const TypePtr* card_type = TypeRawPtr::BOTTOM;
  3365 
  3362 
  3366   const TypeFunc *tf = OptoRuntime::g1_wb_post_Type();
  3363   const TypeFunc *tf = OptoRuntime::g1_wb_post_Type();
  3367 
  3364 
  3368   // Get the address of the card table
       
  3369   CardTableModRefBS* ct =
       
  3370     (CardTableModRefBS*)(Universe::heap()->barrier_set());
       
  3371   Node *card_table = __ makecon(TypeRawPtr::make((address)ct->byte_map_base));
       
  3372   // Get base of card map
       
  3373   assert(sizeof(*ct->byte_map_base) == sizeof(jbyte), "adjust this code");
       
  3374 
       
  3375 
       
  3376   // Offsets into the thread
  3365   // Offsets into the thread
  3377   const int index_offset  = in_bytes(JavaThread::dirty_card_queue_offset() +
  3366   const int index_offset  = in_bytes(JavaThread::dirty_card_queue_offset() +
  3378                                      PtrQueue::byte_offset_of_index());
  3367                                      PtrQueue::byte_offset_of_index());
  3379   const int buffer_offset = in_bytes(JavaThread::dirty_card_queue_offset() +
  3368   const int buffer_offset = in_bytes(JavaThread::dirty_card_queue_offset() +
  3380                                      PtrQueue::byte_offset_of_buf());
  3369                                      PtrQueue::byte_offset_of_buf());
  3400 
  3389 
  3401   // Divide pointer by card size
  3390   // Divide pointer by card size
  3402   Node* card_offset = __ URShiftX( cast, __ ConI(CardTableModRefBS::card_shift) );
  3391   Node* card_offset = __ URShiftX( cast, __ ConI(CardTableModRefBS::card_shift) );
  3403 
  3392 
  3404   // Combine card table base and card offset
  3393   // Combine card table base and card offset
  3405   Node *card_adr = __ AddP(no_base, card_table, card_offset );
  3394   Node *card_adr = __ AddP(no_base, byte_map_base_node(), card_offset );
  3406 
  3395 
  3407   // If we know the value being stored does it cross regions?
  3396   // If we know the value being stored does it cross regions?
  3408 
  3397 
  3409   if (val != NULL) {
  3398   if (val != NULL) {
  3410     // Does the store cause us to cross regions?
  3399     // Does the store cause us to cross regions?