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? |