< prev index next >

src/hotspot/cpu/x86/stubGenerator_x86_64.cpp

Print this page

        

*** 5263,5272 **** --- 5263,5325 ---- __ 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,5743 **** --- 5787,5802 ---- 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 >