src/hotspot/cpu/aarch64/aarch64.ad
changeset 59053 ba6c248cae19
parent 58852 674131501e98
child 59303 1d6e62764eee
equal deleted inserted replaced
59051:f0312c7d5b37 59053:ba6c248cae19
  1189   bool unnecessary_volatile(const Node *barrier);
  1189   bool unnecessary_volatile(const Node *barrier);
  1190   bool needs_releasing_store(const Node *store);
  1190   bool needs_releasing_store(const Node *store);
  1191 
  1191 
  1192   // predicate controlling translation of CompareAndSwapX
  1192   // predicate controlling translation of CompareAndSwapX
  1193   bool needs_acquiring_load_exclusive(const Node *load);
  1193   bool needs_acquiring_load_exclusive(const Node *load);
  1194 
       
  1195   // predicate controlling translation of StoreCM
       
  1196   bool unnecessary_storestore(const Node *storecm);
       
  1197 
  1194 
  1198   // predicate controlling addressing modes
  1195   // predicate controlling addressing modes
  1199   bool size_fits_all_mem_uses(AddPNode* addp, int shift);
  1196   bool size_fits_all_mem_uses(AddPNode* addp, int shift);
  1200 %}
  1197 %}
  1201 
  1198 
  1581 
  1578 
  1582   // so we can just return true here
  1579   // so we can just return true here
  1583   return true;
  1580   return true;
  1584 }
  1581 }
  1585 
  1582 
  1586 // predicate controlling translation of StoreCM
       
  1587 //
       
  1588 // returns true if a StoreStore must precede the card write otherwise
       
  1589 // false
       
  1590 
       
  1591 bool unnecessary_storestore(const Node *storecm)
       
  1592 {
       
  1593   assert(storecm->Opcode()  == Op_StoreCM, "expecting a StoreCM");
       
  1594 
       
  1595   // we need to generate a dmb ishst between an object put and the
       
  1596   // associated card mark when we are using CMS without conditional
       
  1597   // card marking
       
  1598 
       
  1599   if (UseConcMarkSweepGC && !UseCondCardMark) {
       
  1600     return false;
       
  1601   }
       
  1602 
       
  1603   // a storestore is unnecesary in all other cases
       
  1604 
       
  1605   return true;
       
  1606 }
       
  1607 
       
  1608 
       
  1609 #define __ _masm.
  1583 #define __ _masm.
  1610 
  1584 
  1611 // advance declarations for helper functions to convert register
  1585 // advance declarations for helper functions to convert register
  1612 // indices to register objects
  1586 // indices to register objects
  1613 
  1587 
  7218 
  7192 
  7219 // Store CMS card-mark Immediate
  7193 // Store CMS card-mark Immediate
  7220 instruct storeimmCM0(immI0 zero, memory mem)
  7194 instruct storeimmCM0(immI0 zero, memory mem)
  7221 %{
  7195 %{
  7222   match(Set mem (StoreCM mem zero));
  7196   match(Set mem (StoreCM mem zero));
  7223   predicate(unnecessary_storestore(n));
       
  7224 
  7197 
  7225   ins_cost(INSN_COST);
  7198   ins_cost(INSN_COST);
  7226   format %{ "storestore (elided)\n\t"
  7199   format %{ "storestore (elided)\n\t"
  7227             "strb zr, $mem\t# byte" %}
  7200             "strb zr, $mem\t# byte" %}
  7228 
  7201