Mercurial > hg > graal-jvmci-8
comparison src/cpu/x86/vm/c1_LIRGenerator_x86.cpp @ 6143:8b0a4867acf0
7174218: remove AtomicLongCSImpl intrinsics
Reviewed-by: kvn, twisti
Contributed-by: Krystal Mok <sajia@taobao.com>
author | twisti |
---|---|
date | Tue, 12 Jun 2012 14:31:44 -0700 |
parents | 6759698e3140 |
children | e2fe93124108 |
comparison
equal
deleted
inserted
replaced
6142:121e5708ae96 | 6143:8b0a4867acf0 |
---|---|
716 Unimplemented(); | 716 Unimplemented(); |
717 } | 717 } |
718 } | 718 } |
719 | 719 |
720 | 720 |
721 void LIRGenerator::do_AttemptUpdate(Intrinsic* x) { | |
722 assert(x->number_of_arguments() == 3, "wrong type"); | |
723 LIRItem obj (x->argument_at(0), this); // AtomicLong object | |
724 LIRItem cmp_value (x->argument_at(1), this); // value to compare with field | |
725 LIRItem new_value (x->argument_at(2), this); // replace field with new_value if it matches cmp_value | |
726 | |
727 // compare value must be in rdx,eax (hi,lo); may be destroyed by cmpxchg8 instruction | |
728 cmp_value.load_item_force(FrameMap::long0_opr); | |
729 | |
730 // new value must be in rcx,ebx (hi,lo) | |
731 new_value.load_item_force(FrameMap::long1_opr); | |
732 | |
733 // object pointer register is overwritten with field address | |
734 obj.load_item(); | |
735 | |
736 // generate compare-and-swap; produces zero condition if swap occurs | |
737 int value_offset = sun_misc_AtomicLongCSImpl::value_offset(); | |
738 LIR_Opr addr = new_pointer_register(); | |
739 __ leal(LIR_OprFact::address(new LIR_Address(obj.result(), value_offset, T_LONG)), addr); | |
740 LIR_Opr t1 = LIR_OprFact::illegalOpr; // no temp needed | |
741 LIR_Opr t2 = LIR_OprFact::illegalOpr; // no temp needed | |
742 __ cas_long(addr, cmp_value.result(), new_value.result(), t1, t2); | |
743 | |
744 // generate conditional move of boolean result | |
745 LIR_Opr result = rlock_result(x); | |
746 __ cmove(lir_cond_equal, LIR_OprFact::intConst(1), LIR_OprFact::intConst(0), result, T_LONG); | |
747 } | |
748 | |
749 | |
750 void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { | 721 void LIRGenerator::do_CompareAndSwap(Intrinsic* x, ValueType* type) { |
751 assert(x->number_of_arguments() == 4, "wrong type"); | 722 assert(x->number_of_arguments() == 4, "wrong type"); |
752 LIRItem obj (x->argument_at(0), this); // object | 723 LIRItem obj (x->argument_at(0), this); // object |
753 LIRItem offset(x->argument_at(1), this); // offset of field | 724 LIRItem offset(x->argument_at(1), this); // offset of field |
754 LIRItem cmp (x->argument_at(2), this); // value to compare with field | 725 LIRItem cmp (x->argument_at(2), this); // value to compare with field |