< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page

        

@@ -5263,10 +5263,63 @@
     __ ret(0);
 
     return start;
   }
 
+  address generate_setBit() {
+    StubCodeMark mark(this, "StubRoutines", "setBit");
+
+    return generate_bit(true);
+  }
+
+  address generate_clrBit() {
+    StubCodeMark mark(this, "StubRoutines", "clrBit");
+
+    return generate_bit(false);
+  }
+
+  /**
+   *  Arguments:
+   *
+   * Inputs:
+   *   c_rarg0   - byte[] bits
+   *   c_rarg1   - int index
+   */
+  address generate_bit(bool set) {
+    address start = __ pc();
+
+    __ enter(); // required for proper stackwalking of RuntimeStub frame
+
+    const Register bits  = c_rarg0;
+    const Register index = c_rarg1;
+
+    Label L_return;
+
+    __ movl(rbx, index);
+    __ movptr(rdx, bits);
+
+    __ movl(rcx, rbx);
+    __ shrl(rbx, 3); // hi
+    __ andl(rcx, 0x7); // lo
+
+    __ null_check(rdx, arrayOopDesc::length_offset_in_bytes());
+    __ cmpl(rbx, Address(rdx, arrayOopDesc::length_offset_in_bytes()));
+    __ jccb(Assembler::aboveEqual, L_return); // TODO throw exception?
+
+    __ lock();
+    if (set)
+      __ btsl(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), rcx);
+    else
+      __ btrl(Address(rdx, rbx, Address::times_1, arrayOopDesc::base_offset_in_bytes(T_BYTE)), rcx);
+
+    __ bind(L_return);
+    __ leave(); // required for proper stackwalking of RuntimeStub frame
+    __ ret(0);
+
+    return start;
+  }
+
   address generate_libmExp() {
     StubCodeMark mark(this, "StubRoutines", "libmExp");
 
     address start = __ pc();
 

@@ -5734,10 +5787,16 @@
         StubRoutines::_dcos = generate_libmCos();
       }
       if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_dtan)) {
         StubRoutines::_dtan = generate_libmTan();
       }
+      if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_setBit)) {
+        StubRoutines::_setBit = generate_setBit();
+      }
+      if (vmIntrinsics::is_intrinsic_available(vmIntrinsics::_clrBit)) {
+        StubRoutines::_clrBit = generate_clrBit();
+      }
     }
   }
 
   void generate_all() {
     // Generates all stubs and initializes the entry points
< prev index next >