< 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 >