< prev index next >
src/cpu/ppc/vm/macroAssembler_ppc.hpp
Print this page
rev 11436 : 8159976: PPC64: Add missing intrinsics for sub-word atomics
Reviewed-by: simonis
*** 429,442 ****
MemBarNone = 0,
MemBarRel = 1,
MemBarAcq = 2,
MemBarFenceAfter = 4 // use powers of 2
};
void cmpxchgw(ConditionRegister flag,
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
int semantics, bool cmpxchgx_hint = false,
! Register int_flag_success = noreg, bool contention_hint = false, bool weak = false);
void cmpxchgd(ConditionRegister flag,
Register dest_current_value, RegisterOrConstant compare_value, Register exchange_value,
Register addr_base, int semantics, bool cmpxchgx_hint = false,
Register int_flag_success = noreg, Label* failed = NULL, bool contention_hint = false, bool weak = false);
--- 429,509 ----
MemBarNone = 0,
MemBarRel = 1,
MemBarAcq = 2,
MemBarFenceAfter = 4 // use powers of 2
};
+ private:
+ // Helper functions for word/sub-word atomics.
+ void atomic_get_and_modify_generic(Register dest_current_value, Register exchange_value,
+ Register addr_base, Register tmp1, Register tmp2, Register tmp3,
+ bool cmpxchgx_hint, bool is_add, int size);
+ void cmpxchg_loop_body(ConditionRegister flag, Register dest_current_value,
+ Register compare_value, Register exchange_value,
+ Register addr_base, Register tmp1, Register tmp2,
+ Label &retry, Label &failed, bool cmpxchgx_hint, int size);
+ void cmpxchg_generic(ConditionRegister flag,
+ Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
+ Register tmp1, Register tmp2,
+ int semantics, bool cmpxchgx_hint, Register int_flag_success, bool contention_hint, bool weak, int size);
+ public:
+ // Temps and addr_base are killed if processor does not support Power 8 instructions.
+ void getandsetb(Register dest_current_value, Register exchange_value, Register addr_base,
+ Register tmp1, Register tmp2, Register tmp3, bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, exchange_value, addr_base, tmp1, tmp2, tmp3, cmpxchgx_hint, false, 1);
+ }
+ // Temps and addr_base are killed if processor does not support Power 8 instructions.
+ void getandseth(Register dest_current_value, Register exchange_value, Register addr_base,
+ Register tmp1, Register tmp2, Register tmp3, bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, exchange_value, addr_base, tmp1, tmp2, tmp3, cmpxchgx_hint, false, 2);
+ }
+ void getandsetw(Register dest_current_value, Register exchange_value, Register addr_base,
+ bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, exchange_value, addr_base, noreg, noreg, noreg, cmpxchgx_hint, false, 4);
+ }
+ void getandsetd(Register dest_current_value, Register exchange_value, Register addr_base,
+ bool cmpxchgx_hint);
+ // tmp2/3 and addr_base are killed if processor does not support Power 8 instructions (tmp1 is always needed).
+ void getandaddb(Register dest_current_value, Register inc_value, Register addr_base,
+ Register tmp1, Register tmp2, Register tmp3, bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, inc_value, addr_base, tmp1, tmp2, tmp3, cmpxchgx_hint, true, 1);
+ }
+ // tmp2/3 and addr_base are killed if processor does not support Power 8 instructions (tmp1 is always needed).
+ void getandaddh(Register dest_current_value, Register inc_value, Register addr_base,
+ Register tmp1, Register tmp2, Register tmp3, bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, inc_value, addr_base, tmp1, tmp2, tmp3, cmpxchgx_hint, true, 2);
+ }
+ void getandaddw(Register dest_current_value, Register inc_value, Register addr_base,
+ Register tmp1, bool cmpxchgx_hint) {
+ atomic_get_and_modify_generic(dest_current_value, inc_value, addr_base, tmp1, noreg, noreg, cmpxchgx_hint, true, 4);
+ }
+ void getandaddd(Register dest_current_value, Register exchange_value, Register addr_base,
+ Register tmp, bool cmpxchgx_hint);
+ // Temps, addr_base and exchange_value are killed if processor does not support Power 8 instructions.
+ // compare_value must be at least 32 bit sign extended.
+ void cmpxchgb(ConditionRegister flag,
+ Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
+ Register tmp1, Register tmp2, int semantics, bool cmpxchgx_hint = false,
+ Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
+ cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, tmp1, tmp2,
+ semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 1);
+ }
+ // Temps, addr_base and exchange_value are killed if processor does not support Power 8 instructions.
+ // compare_value must be at least 32 bit sign extended.
+ void cmpxchgh(ConditionRegister flag,
+ Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
+ Register tmp1, Register tmp2, int semantics, bool cmpxchgx_hint = false,
+ Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
+ cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, tmp1, tmp2,
+ semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 2);
+ }
void cmpxchgw(ConditionRegister flag,
Register dest_current_value, Register compare_value, Register exchange_value, Register addr_base,
int semantics, bool cmpxchgx_hint = false,
! Register int_flag_success = noreg, bool contention_hint = false, bool weak = false) {
! cmpxchg_generic(flag, dest_current_value, compare_value, exchange_value, addr_base, noreg, noreg,
! semantics, cmpxchgx_hint, int_flag_success, contention_hint, weak, 4);
! }
void cmpxchgd(ConditionRegister flag,
Register dest_current_value, RegisterOrConstant compare_value, Register exchange_value,
Register addr_base, int semantics, bool cmpxchgx_hint = false,
Register int_flag_success = noreg, Label* failed = NULL, bool contention_hint = false, bool weak = false);
*** 715,741 ****
void string_indexof_char(Register result, Register haystack, Register haycnt,
Register needle, jchar needleChar, Register tmp1, Register tmp2, bool is_byte);
void has_negatives(Register src, Register cnt, Register result, Register tmp1, Register tmp2);
-
- // Intrinsics for non-CompactStrings
- // Needle of length 1.
- void string_indexof_1(Register result, Register haystack, Register haycnt,
- Register needle, jchar needleChar,
- Register tmp1, Register tmp2);
- // General indexof, eventually with constant needle length.
- void string_indexof(Register result, Register haystack, Register haycnt,
- Register needle, ciTypeArray* needle_values, Register needlecnt, int needlecntval,
- Register tmp1, Register tmp2, Register tmp3, Register tmp4);
- void string_compare(Register str1_reg, Register str2_reg, Register cnt1_reg, Register cnt2_reg,
- Register result_reg, Register tmp_reg);
- void char_arrays_equals(Register str1_reg, Register str2_reg, Register cnt_reg, Register result_reg,
- Register tmp1_reg, Register tmp2_reg, Register tmp3_reg, Register tmp4_reg,
- Register tmp5_reg);
- void char_arrays_equalsImm(Register str1_reg, Register str2_reg, int cntval, Register result_reg,
- Register tmp1_reg, Register tmp2_reg);
#endif
// Emitters for BigInteger.multiplyToLen intrinsic.
inline void multiply64(Register dest_hi, Register dest_lo,
Register x, Register y);
--- 782,791 ----
< prev index next >