< prev index next >

src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp

Print this page
rev 12202 : AArch64: Add remaining (weak / exchange) CAS-obj intrinsics for Shenandoah.


1600 }
1601 
1602 
1603 void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
1604   Register addr = as_reg(op->addr());
1605   Register newval = as_reg(op->new_value());
1606   Register cmpval = as_reg(op->cmp_value());
1607   Register res = op->result_opr()->as_register();
1608 
1609   if (op->code() == lir_cas_obj) {
1610     assert(op->tmp1()->is_valid(), "must be");
1611     Register t1 = op->tmp1()->as_register();
1612     if (UseCompressedOops) {
1613       if (UseShenandoahGC) {
1614         __ encode_heap_oop(t1, cmpval);
1615         cmpval = t1;
1616         assert(op->tmp2()->is_valid(), "must be");
1617         Register t2 = op->tmp2()->as_register();
1618         __ encode_heap_oop(t2, newval);
1619         newval = t2;
1620         __ cmpxchg_oop_shenandoah(res, addr, cmpval, newval, true, true, true);

1621       } else {
1622         __ encode_heap_oop(t1, cmpval);
1623         cmpval = t1;
1624         __ encode_heap_oop(rscratch2, newval);
1625         newval = rscratch2;
1626         casw(addr, newval, cmpval);
1627         __ eorw (res, r8, 1);
1628       }
1629     } else {
1630       if (UseShenandoahGC) {
1631         __ cmpxchg_oop_shenandoah(res, addr, cmpval, newval, false, true, true);

1632       } else {
1633         casl(addr, newval, cmpval);
1634         __ eorw (res, r8, 1);
1635       }
1636     }
1637   } else if (op->code() == lir_cas_int) {
1638     casw(addr, newval, cmpval);
1639     __ eorw (res, r8, 1);
1640   } else {
1641     casl(addr, newval, cmpval);
1642     __ eorw (res, r8, 1);
1643   }
1644 }
1645 
1646 
1647 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) {
1648 
1649   Assembler::Condition acond, ncond;
1650   switch (condition) {
1651   case lir_cond_equal:        acond = Assembler::EQ; ncond = Assembler::NE; break;




1600 }
1601 
1602 
1603 void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
1604   Register addr = as_reg(op->addr());
1605   Register newval = as_reg(op->new_value());
1606   Register cmpval = as_reg(op->cmp_value());
1607   Register res = op->result_opr()->as_register();
1608 
1609   if (op->code() == lir_cas_obj) {
1610     assert(op->tmp1()->is_valid(), "must be");
1611     Register t1 = op->tmp1()->as_register();
1612     if (UseCompressedOops) {
1613       if (UseShenandoahGC) {
1614         __ encode_heap_oop(t1, cmpval);
1615         cmpval = t1;
1616         assert(op->tmp2()->is_valid(), "must be");
1617         Register t2 = op->tmp2()->as_register();
1618         __ encode_heap_oop(t2, newval);
1619         newval = t2;
1620         __ cmpxchg_oop_shenandoah(addr, cmpval, newval, Assembler::word, true, true, false);
1621         __ csetw(res, Assembler::EQ);
1622       } else {
1623         __ encode_heap_oop(t1, cmpval);
1624         cmpval = t1;
1625         __ encode_heap_oop(rscratch2, newval);
1626         newval = rscratch2;
1627         casw(addr, newval, cmpval);
1628         __ eorw (res, r8, 1);
1629       }
1630     } else {
1631       if (UseShenandoahGC) {
1632         __ cmpxchg_oop_shenandoah(addr, cmpval, newval, Assembler::xword, true, true, false);
1633         __ csetw(res, Assembler::EQ);
1634       } else {
1635         casl(addr, newval, cmpval);
1636         __ eorw (res, r8, 1);
1637       }
1638     }
1639   } else if (op->code() == lir_cas_int) {
1640     casw(addr, newval, cmpval);
1641     __ eorw (res, r8, 1);
1642   } else {
1643     casl(addr, newval, cmpval);
1644     __ eorw (res, r8, 1);
1645   }
1646 }
1647 
1648 
1649 void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result, BasicType type) {
1650 
1651   Assembler::Condition acond, ncond;
1652   switch (condition) {
1653   case lir_cond_equal:        acond = Assembler::EQ; ncond = Assembler::NE; break;


< prev index next >