< prev index next >

src/hotspot/share/opto/library_call.cpp

Print this page

        

@@ -306,10 +306,12 @@
                                  Node* src_start, Node* ofs, Node* limit);
   Node* get_state_from_sha_object(Node *sha_object);
   Node* get_state_from_sha5_object(Node *sha_object);
   Node* inline_digestBase_implCompressMB_predicate(int predicate);
   bool inline_encodeISOArray();
+  bool inline_setBit();
+  bool inline_clrBit();
   bool inline_updateCRC32();
   bool inline_updateBytesCRC32();
   bool inline_updateByteBufferCRC32();
   Node* get_table_from_crc32c_class(ciInstanceKlass *crc32c_class);
   bool inline_updateBytesCRC32C();

@@ -839,10 +841,15 @@
 
   case vmIntrinsics::_encodeISOArray:
   case vmIntrinsics::_encodeByteISOArray:
     return inline_encodeISOArray();
 
+  case vmIntrinsics::_setBit:
+    return inline_setBit();
+  case vmIntrinsics::_clrBit:
+    return inline_clrBit();
+
   case vmIntrinsics::_updateCRC32:
     return inline_updateCRC32();
   case vmIntrinsics::_updateBytesCRC32:
     return inline_updateBytesCRC32();
   case vmIntrinsics::_updateByteBufferCRC32:

@@ -5380,10 +5387,43 @@
   result = _gvn.transform(new XorINode(result, M1));
   set_result(result);
   return true;
 }
 
+bool LibraryCallKit::inline_setBit() {
+  Node* bits = argument(0); // type: oop
+  Node* index = argument(1); // type: int
+
+  Node* hi = _gvn.transform(new RShiftINode(index, intcon(3)));
+  Node* bit = array_element_address(bits, hi, T_BYTE);
+
+  Node* lo = _gvn.transform(new AndINode(index, intcon(7)));
+  Node* value = _gvn.transform(new LShiftINode(intcon(1), lo));
+
+  store_to_memory(control(), bit, value, T_BYTE, TypeAryPtr::BYTES, MemNode::unordered,
+                  false, false, false, 1);
+
+  return true;
+}
+
+bool LibraryCallKit::inline_clrBit() {
+  Node* bits = argument(0); // type: oop
+  Node* index = argument(1); // type: int
+
+  Node* hi = _gvn.transform(new RShiftINode(index, intcon(3)));
+  Node* bit = array_element_address(bits, hi, T_BYTE);
+
+  Node* lo = _gvn.transform(new AndINode(index, intcon(7)));
+  Node* value = _gvn.transform(new LShiftINode(intcon(1), lo));
+  value = _gvn.transform(new XorINode(value, intcon(-1)));
+
+  store_to_memory(control(), bit, value, T_BYTE, TypeAryPtr::BYTES, MemNode::unordered,
+                  false, false, false, 0);
+
+  return true;
+}
+
 /**
  * Calculate CRC32 for byte[] array.
  * int java.util.zip.CRC32.updateBytes(int crc, byte[] buf, int off, int len)
  */
 bool LibraryCallKit::inline_updateBytesCRC32() {
< prev index next >