8296916: RISC-V: Move some small macro-assembler functions to header file

Reviewed-by: fjiang, yadongwang, shade
This commit is contained in:
Fei Yang 2022-11-16 12:01:42 +00:00
parent 720c3d08c6
commit c3b285a8ac
3 changed files with 146 additions and 186 deletions

View file

@ -670,96 +670,6 @@ void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0, Reg
MacroAssembler::call_VM_leaf_base(entry_point, 4);
}
void MacroAssembler::nop() {
addi(x0, x0, 0);
}
void MacroAssembler::mv(Register Rd, Register Rs) {
if (Rd != Rs) {
addi(Rd, Rs, 0);
}
}
void MacroAssembler::notr(Register Rd, Register Rs) {
xori(Rd, Rs, -1);
}
void MacroAssembler::neg(Register Rd, Register Rs) {
sub(Rd, x0, Rs);
}
void MacroAssembler::negw(Register Rd, Register Rs) {
subw(Rd, x0, Rs);
}
void MacroAssembler::sext_w(Register Rd, Register Rs) {
addiw(Rd, Rs, 0);
}
void MacroAssembler::zext_b(Register Rd, Register Rs) {
andi(Rd, Rs, 0xFF);
}
void MacroAssembler::seqz(Register Rd, Register Rs) {
sltiu(Rd, Rs, 1);
}
void MacroAssembler::snez(Register Rd, Register Rs) {
sltu(Rd, x0, Rs);
}
void MacroAssembler::sltz(Register Rd, Register Rs) {
slt(Rd, Rs, x0);
}
void MacroAssembler::sgtz(Register Rd, Register Rs) {
slt(Rd, x0, Rs);
}
void MacroAssembler::fmv_s(FloatRegister Rd, FloatRegister Rs) {
if (Rd != Rs) {
fsgnj_s(Rd, Rs, Rs);
}
}
void MacroAssembler::fabs_s(FloatRegister Rd, FloatRegister Rs) {
fsgnjx_s(Rd, Rs, Rs);
}
void MacroAssembler::fneg_s(FloatRegister Rd, FloatRegister Rs) {
fsgnjn_s(Rd, Rs, Rs);
}
void MacroAssembler::fmv_d(FloatRegister Rd, FloatRegister Rs) {
if (Rd != Rs) {
fsgnj_d(Rd, Rs, Rs);
}
}
void MacroAssembler::fabs_d(FloatRegister Rd, FloatRegister Rs) {
fsgnjx_d(Rd, Rs, Rs);
}
void MacroAssembler::fneg_d(FloatRegister Rd, FloatRegister Rs) {
fsgnjn_d(Rd, Rs, Rs);
}
void MacroAssembler::vmnot_m(VectorRegister vd, VectorRegister vs) {
vmnand_mm(vd, vs, vs);
}
void MacroAssembler::vncvt_x_x_w(VectorRegister vd, VectorRegister vs, VectorMask vm) {
vnsrl_wx(vd, vs, x0, vm);
}
void MacroAssembler::vneg_v(VectorRegister vd, VectorRegister vs) {
vrsub_vx(vd, vs, x0);
}
void MacroAssembler::vfneg_v(VectorRegister vd, VectorRegister vs) {
vfsgnjn_vv(vd, vs, vs);
}
void MacroAssembler::baseOffset32(Register Rd, const Address &adr, int32_t &offset) {
assert(Rd != noreg, "Rd must not be empty register!");
guarantee(Rd != adr.base(), "should use different registers!");
@ -1625,21 +1535,6 @@ void MacroAssembler::reinit_heapbase() {
}
}
void MacroAssembler::mv(Register Rd, Address dest) {
assert(dest.getMode() == Address::literal, "Address mode should be Address::literal");
relocate(dest.rspec(), [&] {
movptr(Rd, dest.target());
});
}
void MacroAssembler::mv(Register Rd, RegisterOrConstant src) {
if (src.is_register()) {
mv(Rd, src.as_register());
} else {
mv(Rd, src.as_constant());
}
}
void MacroAssembler::movptr(Register Rd, address addr, int32_t &offset) {
int64_t imm64 = (int64_t)addr;
#ifndef PRODUCT
@ -1669,16 +1564,6 @@ void MacroAssembler::movptr(Register Rd, address addr, int32_t &offset) {
offset = imm64 & 0x3f;
}
void MacroAssembler::movptr(Register Rd, uintptr_t imm64) {
movptr(Rd, (address)imm64);
}
void MacroAssembler::movptr(Register Rd, address addr) {
int offset = 0;
movptr(Rd, addr, offset);
addi(Rd, Rd, offset);
}
void MacroAssembler::add(Register Rd, Register Rn, int64_t increment, Register temp) {
if (is_imm_in_range(increment, 12, 0)) {
addi(Rd, Rn, increment);
@ -3357,8 +3242,7 @@ void MacroAssembler::load_method_holder(Register holder, Register method) {
void MacroAssembler::compute_index(Register haystack, Register trailing_zeros,
Register match_mask, Register result,
Register ch2, Register tmp,
bool haystack_isL)
{
bool haystack_isL) {
int haystack_chr_shift = haystack_isL ? 0 : 1;
srl(match_mask, match_mask, trailing_zeros);
srli(match_mask, match_mask, 1);
@ -3379,8 +3263,7 @@ void MacroAssembler::compute_index(Register haystack, Register trailing_zeros,
// - 0x8000800080008000 (UTF16)
// - 3 2 1 0 (match index)
void MacroAssembler::compute_match_mask(Register src, Register pattern, Register match_mask,
Register mask1, Register mask2)
{
Register mask1, Register mask2) {
xorr(src, pattern, src);
sub(match_mask, src, mask1);
orr(src, src, mask2);
@ -3464,24 +3347,21 @@ void MacroAssembler::cad(Register dst, Register src1, Register src2, Register ca
}
// add two input with carry
void MacroAssembler::adc(Register dst, Register src1, Register src2, Register carry)
{
void MacroAssembler::adc(Register dst, Register src1, Register src2, Register carry) {
assert_different_registers(dst, carry);
add(dst, src1, src2);
add(dst, dst, carry);
}
// add two unsigned input with carry and output carry
void MacroAssembler::cadc(Register dst, Register src1, Register src2, Register carry)
{
void MacroAssembler::cadc(Register dst, Register src1, Register src2, Register carry) {
assert_different_registers(dst, src2);
adc(dst, src1, src2, carry);
sltu(carry, dst, src2);
}
void MacroAssembler::add2_with_carry(Register final_dest_hi, Register dest_hi, Register dest_lo,
Register src1, Register src2, Register carry)
{
Register src1, Register src2, Register carry) {
cad(dest_lo, dest_lo, src1, carry);
add(dest_hi, dest_hi, carry);
cad(dest_lo, dest_lo, src2, carry);
@ -3494,8 +3374,7 @@ void MacroAssembler::add2_with_carry(Register final_dest_hi, Register dest_hi, R
void MacroAssembler::multiply_32_x_32_loop(Register x, Register xstart, Register x_xstart,
Register y, Register y_idx, Register z,
Register carry, Register product,
Register idx, Register kdx)
{
Register idx, Register kdx) {
// jlong carry, x[], y[], z[];
// for (int idx=ystart, kdx=ystart+1+xstart; idx >= 0; idx--, kdx--) {
// long product = y[idx] * x[xstart] + carry;
@ -3531,8 +3410,7 @@ void MacroAssembler::multiply_32_x_32_loop(Register x, Register xstart, Register
void MacroAssembler::multiply_64_x_64_loop(Register x, Register xstart, Register x_xstart,
Register y, Register y_idx, Register z,
Register carry, Register product,
Register idx, Register kdx)
{
Register idx, Register kdx) {
//
// jlong carry, x[], y[], z[];
// for (int idx=ystart, kdx=ystart+1+xstart; idx >= 0; idx--, kdx--) {
@ -3596,8 +3474,7 @@ void MacroAssembler::multiply_128_x_128_loop(Register y, Register z,
Register idx, Register jdx,
Register yz_idx1, Register yz_idx2,
Register tmp, Register tmp3, Register tmp4,
Register tmp6, Register product_hi)
{
Register tmp6, Register product_hi) {
// jlong carry, x[], y[], z[];
// int kdx = xstart+1;
// for (int idx=ystart-2; idx >= 0; idx -= 2) { // Third loop
@ -3732,8 +3609,7 @@ void MacroAssembler::multiply_128_x_128_loop(Register y, Register z,
void MacroAssembler::multiply_to_len(Register x, Register xlen, Register y, Register ylen,
Register z, Register zlen,
Register tmp1, Register tmp2, Register tmp3, Register tmp4,
Register tmp5, Register tmp6, Register product_hi)
{
Register tmp5, Register tmp6, Register product_hi) {
assert_different_registers(x, xlen, y, ylen, z, zlen, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6);
const Register idx = tmp1;
@ -3897,8 +3773,7 @@ void MacroAssembler::multiply_to_len(Register x, Register xlen, Register y, Regi
// Count bits of trailing zero chars from lsb to msb until first non-zero element.
// For LL case, one byte for one element, so shift 8 bits once, and for other case,
// shift 16 bits once.
void MacroAssembler::ctzc_bit(Register Rd, Register Rs, bool isLL, Register tmp1, Register tmp2)
{
void MacroAssembler::ctzc_bit(Register Rd, Register Rs, bool isLL, Register tmp1, Register tmp2) {
if (UseZbb) {
assert_different_registers(Rd, Rs, tmp1);
int step = isLL ? 8 : 16;
@ -3907,6 +3782,7 @@ void MacroAssembler::ctzc_bit(Register Rd, Register Rs, bool isLL, Register tmp1
sub(Rd, Rd, tmp1);
return;
}
assert_different_registers(Rd, Rs, tmp1, tmp2);
Label Loop;
int step = isLL ? 8 : 16;
@ -3924,13 +3800,12 @@ void MacroAssembler::ctzc_bit(Register Rd, Register Rs, bool isLL, Register tmp1
// inflate into a register, for example:
// Rs: A7A6A5A4A3A2A1A0
// Rd: 00A300A200A100A0
void MacroAssembler::inflate_lo32(Register Rd, Register Rs, Register tmp1, Register tmp2)
{
void MacroAssembler::inflate_lo32(Register Rd, Register Rs, Register tmp1, Register tmp2) {
assert_different_registers(Rd, Rs, tmp1, tmp2);
mv(tmp1, 0xFF);
mv(Rd, zr);
for (int i = 0; i <= 3; i++)
{
for (int i = 0; i <= 3; i++) {
andr(tmp2, Rs, tmp1);
if (i) {
slli(tmp2, tmp2, i * 8);
@ -3946,13 +3821,12 @@ void MacroAssembler::inflate_lo32(Register Rd, Register Rs, Register tmp1, Regis
// inflate into a register, for example:
// Rs: A7A6A5A4A3A2A1A0
// Rd: 00A700A600A500A4
void MacroAssembler::inflate_hi32(Register Rd, Register Rs, Register tmp1, Register tmp2)
{
void MacroAssembler::inflate_hi32(Register Rd, Register Rs, Register tmp1, Register tmp2) {
assert_different_registers(Rd, Rs, tmp1, tmp2);
mv(tmp1, 0xFF00000000);
mv(Rd, zr);
for (int i = 0; i <= 3; i++)
{
for (int i = 0; i <= 3; i++) {
andr(tmp2, Rs, tmp1);
orr(Rd, Rd, tmp2);
srli(Rd, Rd, 8);
@ -3975,13 +3849,13 @@ const int MacroAssembler::zero_words_block_size = 8;
// cnt: Count in HeapWords.
//
// ptr, cnt, and t0 are clobbered.
address MacroAssembler::zero_words(Register ptr, Register cnt)
{
address MacroAssembler::zero_words(Register ptr, Register cnt) {
assert(is_power_of_2(zero_words_block_size), "adjust this");
assert(ptr == x28 && cnt == x29, "mismatch in register usage");
assert_different_registers(cnt, t0);
BLOCK_COMMENT("zero_words {");
mv(t0, zero_words_block_size);
Label around, done, done16;
bltu(cnt, t0, around);
@ -4017,6 +3891,7 @@ address MacroAssembler::zero_words(Register ptr, Register cnt)
sd(zr, Address(ptr, 0));
bind(l);
}
BLOCK_COMMENT("} zero_words");
postcond(pc() != badAddress);
return pc();
@ -4026,8 +3901,7 @@ address MacroAssembler::zero_words(Register ptr, Register cnt)
// base: Address of a buffer to be zeroed, 8 bytes aligned.
// cnt: Immediate count in HeapWords.
void MacroAssembler::zero_words(Register base, uint64_t cnt)
{
void MacroAssembler::zero_words(Register base, uint64_t cnt) {
assert_different_registers(base, t0, t1);
BLOCK_COMMENT("zero_words {");
@ -4065,8 +3939,7 @@ void MacroAssembler::zero_words(Register base, uint64_t cnt)
// cnt: Count in 8-byte unit.
// value: Value to be filled with.
// base will point to the end of the buffer after filling.
void MacroAssembler::fill_words(Register base, Register cnt, Register value)
{
void MacroAssembler::fill_words(Register base, Register cnt, Register value) {
// Algorithm:
//
// t0 = cnt & 7
@ -4413,6 +4286,7 @@ void MacroAssembler::object_move(OopMap* map,
bool is_receiver,
int* receiver_offset) {
assert_cond(map != NULL && receiver_offset != NULL);
// must pass a handle. First figure out the location we use as a handle
Register rHandle = dst.first()->is_stack() ? t1 : dst.first()->as_Register();