< prev index next >

src/hotspot/cpu/x86/c1_LIRGenerator_x86.cpp

Print this page

        

*** 723,732 **** --- 723,762 ---- default: ShouldNotReachHere(); } } + void LIRGenerator::do_BitIntrinsic(Intrinsic* x) { + address routine = NULL; + + if (x->id() == vmIntrinsics::_setBit) + routine = StubRoutines::setBit(); + else if (x->id() == vmIntrinsics::_clrBit) + routine = StubRoutines::clrBit(); + + assert(routine != NULL, "bit intrinsic not available"); + + LIRItem bits(x->argument_at(0), this); + LIRItem index(x->argument_at(1), this); + + bits.load_item(); + LIR_Address* a = new LIR_Address(bits.result(), T_BYTE); + + BasicTypeList signature(2); + signature.append(T_ADDRESS); + signature.append(T_INT); + + CallingConvention* cc = frame_map()->c_calling_convention(&signature); + + LIR_Opr addr = new_pointer_register(); + __ leal(LIR_OprFact::address(a), addr); + __ move(addr, cc->at(0)); + + index.load_item_force(cc->at(1)); + + __ call_runtime_leaf(routine, getThreadTemp(), LIR_OprFact::illegalOpr, cc->args()); + } void LIRGenerator::do_MathIntrinsic(Intrinsic* x) { assert(x->number_of_arguments() == 1 || (x->number_of_arguments() == 2 && x->id() == vmIntrinsics::_dpow), "wrong type"); if (x->id() == vmIntrinsics::_dexp || x->id() == vmIntrinsics::_dlog ||
< prev index next >