@@ -277,6 +277,65 @@ void MMTkBarrierSetC2::expand_allocate(PhaseMacroExpand* x,
277277 fast_oop_ctrl = needgc_false; // No contention, so this is the fast path
278278 fast_oop_rawmem = store_eden_top;
279279
280+ #ifdef MMTK_ENABLE_GLOBAL_ALLOC_BIT
281+ // set the alloc bit:
282+ // intptr_t addr = (intptr_t) (void*) fast_oop;
283+ // uint8_t* meta_addr = (uint8_t*) (ALLOC_BIT_BASE_ADDRESS + (addr >> 6));
284+ // intptr_t shift = (addr >> 3) & 0b111;
285+ // uint8_t byte_val = *meta_addr;
286+ // uint8_t new_byte_val = byte_val | (1 << shift);
287+ // *meta_addr = new_byte_val;
288+ Node *obj_addr = new CastP2XNode (fast_oop_ctrl, fast_oop);
289+ x->transform_later (obj_addr);
290+
291+ Node *addr_shift = ConINode::make (6 );
292+ x->transform_later (addr_shift);
293+
294+ Node *meta_offset = new URShiftLNode (obj_addr, addr_shift);
295+ x->transform_later (meta_offset);
296+
297+ Node *meta_base = ConLNode::make (ALLOC_BIT_BASE_ADDRESS);
298+ x->transform_later (meta_base);
299+
300+ Node *meta_addr = new AddLNode (meta_base, meta_offset);
301+ x->transform_later (meta_addr);
302+
303+ Node *meta_addr_p = new CastX2PNode (meta_addr);
304+ x->transform_later (meta_addr_p);
305+
306+ Node *meta_val = new LoadUBNode (fast_oop_ctrl, fast_oop_rawmem, meta_addr_p, TypePtr::BOTTOM, TypeInt::BYTE, MemNode::unordered);
307+ x->transform_later (meta_val);
308+
309+ Node *meta_val_shift = ConINode::make (3 );
310+ x->transform_later (meta_val_shift);
311+
312+ Node *shifted_addr = new URShiftLNode (obj_addr, meta_val_shift);
313+ x->transform_later (shifted_addr);
314+
315+ Node *meta_val_mask = ConLNode::make (0b111 );
316+ x->transform_later (meta_val_mask);
317+
318+ Node *shifted_masked_addr = new AndLNode (shifted_addr, meta_val_mask);
319+ x->transform_later (shifted_masked_addr);
320+
321+ Node *const_one = ConINode::make (1 );
322+ x->transform_later (const_one);
323+
324+ Node *shifted_masked_addr_i = new ConvL2INode (shifted_masked_addr);
325+ x->transform_later (shifted_masked_addr_i);
326+
327+ Node *set_bit = new LShiftINode (const_one, shifted_masked_addr_i);
328+ x->transform_later (set_bit);
329+
330+ Node *new_meta_val = new OrINode (meta_val, set_bit);
331+ x->transform_later (new_meta_val);
332+
333+ Node *set_alloc_bit = new StoreBNode (fast_oop_ctrl, fast_oop_rawmem, meta_addr_p, TypeRawPtr::BOTTOM, new_meta_val, MemNode::unordered);
334+ x->transform_later (set_alloc_bit);
335+
336+ fast_oop_rawmem = set_alloc_bit;
337+ #endif
338+
280339 InitializeNode* init = alloc->initialization ();
281340 fast_oop_rawmem = x->initialize_object (alloc,
282341 fast_oop_ctrl, fast_oop_rawmem, fast_oop,
0 commit comments