3051 case vmIntrinsics::_dpow : do_MathIntrinsic(x); break; 3052 case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break; 3053 3054 case vmIntrinsics::_fmaD: do_FmaIntrinsic(x); break; 3055 case vmIntrinsics::_fmaF: do_FmaIntrinsic(x); break; 3056 3057 // java.nio.Buffer.checkIndex 3058 case vmIntrinsics::_checkIndex: do_NIOCheckIndex(x); break; 3059 3060 case vmIntrinsics::_compareAndSetObject: 3061 do_CompareAndSwap(x, objectType); 3062 break; 3063 case vmIntrinsics::_compareAndSetInt: 3064 do_CompareAndSwap(x, intType); 3065 break; 3066 case vmIntrinsics::_compareAndSetLong: 3067 do_CompareAndSwap(x, longType); 3068 break; 3069 3070 case vmIntrinsics::_loadFence : 3071 if (os::is_MP()) __ membar_acquire(); 3072 break; 3073 case vmIntrinsics::_storeFence: 3074 if (os::is_MP()) __ membar_release(); 3075 break; 3076 case vmIntrinsics::_fullFence : 3077 if (os::is_MP()) __ membar(); 3078 break; 3079 case vmIntrinsics::_onSpinWait: 3080 __ on_spin_wait(); 3081 break; 3082 case vmIntrinsics::_Reference_get: 3083 do_Reference_get(x); 3084 break; 3085 3086 case vmIntrinsics::_updateCRC32: 3087 case vmIntrinsics::_updateBytesCRC32: 3088 case vmIntrinsics::_updateByteBufferCRC32: 3089 do_update_CRC32(x); 3090 break; 3091 3092 case vmIntrinsics::_updateBytesCRC32C: 3093 case vmIntrinsics::_updateDirectByteBufferCRC32C: 3094 do_update_CRC32C(x); 3095 break; 3096 3097 case vmIntrinsics::_vectorizedMismatch: 3606 if (addr->type() == T_LONG || addr->type() == T_DOUBLE) { 3607 __ unaligned_move(arg->result(), addr); 3608 } else { 3609 __ move(arg->result(), addr); 3610 } 3611 } 3612 } 3613 3614 if (info) { 3615 __ call_runtime(entry, getThreadTemp(), phys_reg, cc->args(), info); 3616 } else { 3617 __ call_runtime_leaf(entry, getThreadTemp(), phys_reg, cc->args()); 3618 } 3619 if (result->is_valid()) { 3620 __ move(phys_reg, result); 3621 } 3622 return result; 3623 } 3624 3625 void LIRGenerator::do_MemBar(MemBar* x) { 3626 if (os::is_MP()) { 3627 LIR_Code code = x->code(); 3628 switch(code) { 3629 case lir_membar_acquire : __ membar_acquire(); break; 3630 case lir_membar_release : __ membar_release(); break; 3631 case lir_membar : __ membar(); break; 3632 case lir_membar_loadload : __ membar_loadload(); break; 3633 case lir_membar_storestore: __ membar_storestore(); break; 3634 case lir_membar_loadstore : __ membar_loadstore(); break; 3635 case lir_membar_storeload : __ membar_storeload(); break; 3636 default : ShouldNotReachHere(); break; 3637 } 3638 } 3639 } 3640 3641 LIR_Opr LIRGenerator::mask_boolean(LIR_Opr array, LIR_Opr value, CodeEmitInfo*& null_check_info) { 3642 LIR_Opr value_fixed = rlock_byte(T_BYTE); 3643 if (TwoOperandLIRForm) { 3644 __ move(value, value_fixed); 3645 __ logical_and(value_fixed, LIR_OprFact::intConst(1), value_fixed); 3646 } else { 3647 __ logical_and(value, LIR_OprFact::intConst(1), value_fixed); 3648 } 3649 LIR_Opr klass = new_register(T_METADATA); 3650 __ move(new LIR_Address(array, oopDesc::klass_offset_in_bytes(), T_ADDRESS), klass, null_check_info); 3651 null_check_info = NULL; 3652 LIR_Opr layout = new_register(T_INT); 3653 __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout); 3654 int diffbit = Klass::layout_helper_boolean_diffbit(); 3655 __ logical_and(layout, LIR_OprFact::intConst(diffbit), layout); 3656 __ cmp(lir_cond_notEqual, layout, LIR_OprFact::intConst(0)); 3657 __ cmove(lir_cond_notEqual, value_fixed, value, value_fixed, T_BYTE); | 3051 case vmIntrinsics::_dpow : do_MathIntrinsic(x); break; 3052 case vmIntrinsics::_arraycopy: do_ArrayCopy(x); break; 3053 3054 case vmIntrinsics::_fmaD: do_FmaIntrinsic(x); break; 3055 case vmIntrinsics::_fmaF: do_FmaIntrinsic(x); break; 3056 3057 // java.nio.Buffer.checkIndex 3058 case vmIntrinsics::_checkIndex: do_NIOCheckIndex(x); break; 3059 3060 case vmIntrinsics::_compareAndSetObject: 3061 do_CompareAndSwap(x, objectType); 3062 break; 3063 case vmIntrinsics::_compareAndSetInt: 3064 do_CompareAndSwap(x, intType); 3065 break; 3066 case vmIntrinsics::_compareAndSetLong: 3067 do_CompareAndSwap(x, longType); 3068 break; 3069 3070 case vmIntrinsics::_loadFence : 3071 __ membar_acquire(); 3072 break; 3073 case vmIntrinsics::_storeFence: 3074 __ membar_release(); 3075 break; 3076 case vmIntrinsics::_fullFence : 3077 __ membar(); 3078 break; 3079 case vmIntrinsics::_onSpinWait: 3080 __ on_spin_wait(); 3081 break; 3082 case vmIntrinsics::_Reference_get: 3083 do_Reference_get(x); 3084 break; 3085 3086 case vmIntrinsics::_updateCRC32: 3087 case vmIntrinsics::_updateBytesCRC32: 3088 case vmIntrinsics::_updateByteBufferCRC32: 3089 do_update_CRC32(x); 3090 break; 3091 3092 case vmIntrinsics::_updateBytesCRC32C: 3093 case vmIntrinsics::_updateDirectByteBufferCRC32C: 3094 do_update_CRC32C(x); 3095 break; 3096 3097 case vmIntrinsics::_vectorizedMismatch: 3606 if (addr->type() == T_LONG || addr->type() == T_DOUBLE) { 3607 __ unaligned_move(arg->result(), addr); 3608 } else { 3609 __ move(arg->result(), addr); 3610 } 3611 } 3612 } 3613 3614 if (info) { 3615 __ call_runtime(entry, getThreadTemp(), phys_reg, cc->args(), info); 3616 } else { 3617 __ call_runtime_leaf(entry, getThreadTemp(), phys_reg, cc->args()); 3618 } 3619 if (result->is_valid()) { 3620 __ move(phys_reg, result); 3621 } 3622 return result; 3623 } 3624 3625 void LIRGenerator::do_MemBar(MemBar* x) { 3626 LIR_Code code = x->code(); 3627 switch(code) { 3628 case lir_membar_acquire : __ membar_acquire(); break; 3629 case lir_membar_release : __ membar_release(); break; 3630 case lir_membar : __ membar(); break; 3631 case lir_membar_loadload : __ membar_loadload(); break; 3632 case lir_membar_storestore: __ membar_storestore(); break; 3633 case lir_membar_loadstore : __ membar_loadstore(); break; 3634 case lir_membar_storeload : __ membar_storeload(); break; 3635 default : ShouldNotReachHere(); break; 3636 } 3637 } 3638 3639 LIR_Opr LIRGenerator::mask_boolean(LIR_Opr array, LIR_Opr value, CodeEmitInfo*& null_check_info) { 3640 LIR_Opr value_fixed = rlock_byte(T_BYTE); 3641 if (TwoOperandLIRForm) { 3642 __ move(value, value_fixed); 3643 __ logical_and(value_fixed, LIR_OprFact::intConst(1), value_fixed); 3644 } else { 3645 __ logical_and(value, LIR_OprFact::intConst(1), value_fixed); 3646 } 3647 LIR_Opr klass = new_register(T_METADATA); 3648 __ move(new LIR_Address(array, oopDesc::klass_offset_in_bytes(), T_ADDRESS), klass, null_check_info); 3649 null_check_info = NULL; 3650 LIR_Opr layout = new_register(T_INT); 3651 __ move(new LIR_Address(klass, in_bytes(Klass::layout_helper_offset()), T_INT), layout); 3652 int diffbit = Klass::layout_helper_boolean_diffbit(); 3653 __ logical_and(layout, LIR_OprFact::intConst(diffbit), layout); 3654 __ cmp(lir_cond_notEqual, layout, LIR_OprFact::intConst(0)); 3655 __ cmove(lir_cond_notEqual, value_fixed, value, value_fixed, T_BYTE); |