< prev index next >

src/hotspot/share/c1/c1_LIRGenerator.cpp

Print this page




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);
< prev index next >