8346235: RISC-V: Optimize bitwise AND with mask values

Reviewed-by: gcao, rehn, fjiang
This commit is contained in:
Fei Yang 2024-12-17 00:12:39 +00:00
parent 929d4a5099
commit a7631ccf18
11 changed files with 120 additions and 120 deletions

View File

@ -64,7 +64,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
if (Assembler::is_simm12(c - 1)) {
__ andi(t1, t1, c - 1);
} else {
__ zero_extend(t1, t1, shift);
__ zext(t1, t1, shift);
}
__ subw(dreg, t1, t0);
}
@ -78,7 +78,7 @@ void LIR_Assembler::arithmetic_idiv(LIR_Code code, LIR_Opr left, LIR_Opr right,
if (Assembler::is_simm12(c - 1)) {
__ andi(t0, t0, c - 1);
} else {
__ zero_extend(t0, t0, shift);
__ zext(t0, t0, shift);
}
__ addw(dreg, t0, lreg);
__ sraiw(dreg, dreg, shift);
@ -205,7 +205,7 @@ void LIR_Assembler::arith_op_double_cpu(LIR_Code code, LIR_Opr left, LIR_Opr rig
if (Assembler::is_simm12(c - 1)) {
__ andi(t0, t0, c - 1);
} else {
__ zero_extend(t0, t0, shift);
__ zext(t0, t0, shift);
}
__ add(dreg, t0, lreg_lo);
__ srai(dreg, dreg, shift);
@ -224,7 +224,7 @@ void LIR_Assembler::arith_op_double_cpu(LIR_Code code, LIR_Opr left, LIR_Opr rig
if (Assembler::is_simm12(c - 1)) {
__ andi(t1, t1, c - 1);
} else {
__ zero_extend(t1, t1, shift);
__ zext(t1, t1, shift);
}
__ sub(dreg, t1, t0);
}

View File

@ -952,15 +952,15 @@ void LIR_Assembler::emit_opConvert(LIR_OpConvert* op) {
case Bytecodes::_d2f:
__ fcvt_s_d(dest->as_float_reg(), src->as_double_reg()); break;
case Bytecodes::_i2c:
__ zero_extend(dest->as_register(), src->as_register(), 16); break;
__ zext(dest->as_register(), src->as_register(), 16); break;
case Bytecodes::_i2l:
__ sign_extend(dest->as_register_lo(), src->as_register(), 32); break;
__ sext(dest->as_register_lo(), src->as_register(), 32); break;
case Bytecodes::_i2s:
__ sign_extend(dest->as_register(), src->as_register(), 16); break;
__ sext(dest->as_register(), src->as_register(), 16); break;
case Bytecodes::_i2b:
__ sign_extend(dest->as_register(), src->as_register(), 8); break;
__ sext(dest->as_register(), src->as_register(), 8); break;
case Bytecodes::_l2i:
__ sign_extend(dest->as_register(), src->as_register_lo(), 32); break;
__ sext(dest->as_register(), src->as_register_lo(), 32); break;
case Bytecodes::_d2l:
__ fcvt_l_d_safe(dest->as_register_lo(), src->as_double_reg()); break;
case Bytecodes::_f2i:
@ -1288,7 +1288,7 @@ void LIR_Assembler::logic_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr
int right_const = right->as_jint();
if (Assembler::is_simm12(right_const)) {
logic_op_imm(Rdst, Rleft, right_const, code);
__ sign_extend(Rdst, Rdst, 32);
__ sext(Rdst, Rdst, 32);
} else {
__ mv(t0, right_const);
logic_op_reg32(Rdst, Rleft, t0, code);
@ -1609,7 +1609,7 @@ void LIR_Assembler::emit_updatecrc32(LIR_OpUpdateCRC32* op) {
__ la(res, ExternalAddress(StubRoutines::crc_table_addr()));
__ notr(crc, crc); // ~crc
__ zero_extend(crc, crc, 32);
__ zext(crc, crc, 32);
__ update_byte_crc32(crc, val, res);
__ notr(res, crc); // ~crc
}

View File

@ -1027,7 +1027,7 @@ void C2_MacroAssembler::string_indexof(Register haystack, Register needle,
srli(ch2, ch2, XLEN - 8); // pattern[m-2], 0x0000000b
slli(ch1, tmp6, XLEN - 16);
srli(ch1, ch1, XLEN - 8); // pattern[m-3], 0x0000000c
andi(tmp6, tmp6, 0xff); // pattern[m-4], 0x0000000d
zext(tmp6, tmp6, 8); // pattern[m-4], 0x0000000d
slli(ch2, ch2, 16);
orr(ch2, ch2, ch1); // 0x00000b0c
slli(result, tmp3, 48); // use result as temp register
@ -1540,11 +1540,11 @@ void C2_MacroAssembler::string_compare(Register str1, Register str2,
srl(tmp1, tmp1, result);
srl(tmp2, tmp2, result);
if (isLL) {
andi(tmp1, tmp1, 0xFF);
andi(tmp2, tmp2, 0xFF);
zext(tmp1, tmp1, 8);
zext(tmp2, tmp2, 8);
} else {
andi(tmp1, tmp1, 0xFFFF);
andi(tmp2, tmp2, 0xFFFF);
zext(tmp1, tmp1, 16);
zext(tmp2, tmp2, 16);
}
sub(result, tmp1, tmp2);
j(DONE);

View File

@ -70,20 +70,20 @@ void InterpreterMacroAssembler::narrow(Register result) {
bind(notBool);
mv(t1, T_BYTE);
bne(t0, t1, notByte);
sign_extend(result, result, 8);
sext(result, result, 8);
j(done);
bind(notByte);
mv(t1, T_CHAR);
bne(t0, t1, notChar);
zero_extend(result, result, 16);
zext(result, result, 16);
j(done);
bind(notChar);
sign_extend(result, result, 16);
sext(result, result, 16);
bind(done);
sign_extend(result, result, 32);
sext(result, result, 32);
}
void InterpreterMacroAssembler::jump_to_entry(address entry) {
@ -276,7 +276,7 @@ void InterpreterMacroAssembler::push_ptr(Register r) {
void InterpreterMacroAssembler::push_i(Register r) {
addi(esp, esp, -wordSize);
sign_extend(r, r, 32);
sext(r, r, 32);
sd(r, Address(esp, 0));
}

View File

@ -1536,9 +1536,6 @@ int MacroAssembler::pop_fp(unsigned int bitset, Register stack) {
return count;
}
static const int64_t right_32_bits = right_n_bits(32);
static const int64_t right_8_bits = right_n_bits(8);
/**
* Emits code to update CRC-32 with a byte value according to constants in table
*
@ -1555,7 +1552,7 @@ void MacroAssembler::update_byte_crc32(Register crc, Register val, Register tabl
assert_different_registers(crc, val, table);
xorr(val, val, crc);
andi(val, val, right_8_bits);
zext(val, val, 8);
shadd(val, val, table, val, 2);
lwu(val, Address(val));
srli(crc, crc, 8);
@ -1585,7 +1582,7 @@ void MacroAssembler::update_word_crc32(Register crc, Register v, Register tmp1,
srli(v, v, 32);
xorr(v, v, crc);
andi(tmp1, v, right_8_bits);
zext(tmp1, v, 8);
shadd(tmp1, tmp1, table3, tmp2, 2);
lwu(crc, Address(tmp1));
@ -2086,7 +2083,11 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
const int64_t single_table_size = 256;
const int64_t unroll = 16;
const int64_t unroll_words = unroll*wordSize;
mv(tmp5, right_32_bits);
// tmp5 = 0xffffffff
notr(tmp5, zr);
srli(tmp5, tmp5, 32);
andn(crc, tmp5, crc);
const ExternalAddress table_addr = StubRoutines::crc_table_addr();
@ -2110,7 +2111,7 @@ void MacroAssembler::kernel_crc32(Register crc, Register buf, Register len,
subw(len, len, 2);
lhu(tmp1, Address(buf));
add(buf, buf, 2);
andi(tmp2, tmp1, right_8_bits);
zext(tmp2, tmp1, 8);
update_byte_crc32(crc, tmp2, table0);
srli(tmp2, tmp1, 8);
update_byte_crc32(crc, tmp2, table0);
@ -2634,17 +2635,17 @@ void MacroAssembler::subw(Register Rd, Register Rn, int32_t decrement, Register
void MacroAssembler::andrw(Register Rd, Register Rs1, Register Rs2) {
andr(Rd, Rs1, Rs2);
sign_extend(Rd, Rd, 32);
sext(Rd, Rd, 32);
}
void MacroAssembler::orrw(Register Rd, Register Rs1, Register Rs2) {
orr(Rd, Rs1, Rs2);
sign_extend(Rd, Rd, 32);
sext(Rd, Rd, 32);
}
void MacroAssembler::xorrw(Register Rd, Register Rs1, Register Rs2) {
xorr(Rd, Rs1, Rs2);
sign_extend(Rd, Rd, 32);
sext(Rd, Rd, 32);
}
// Rd = Rs1 & (~Rd2)
@ -2832,18 +2833,18 @@ void MacroAssembler::revbw(Register Rd, Register Rs, Register tmp1, Register tmp
}
assert_different_registers(Rs, tmp1, tmp2);
assert_different_registers(Rd, tmp1, tmp2);
andi(tmp1, Rs, 0xFF);
zext(tmp1, Rs, 8);
slli(tmp1, tmp1, 8);
for (int step = 8; step < 24; step += 8) {
srli(tmp2, Rs, step);
andi(tmp2, tmp2, 0xFF);
zext(tmp2, tmp2, 8);
orr(tmp1, tmp1, tmp2);
slli(tmp1, tmp1, 8);
}
srli(Rd, Rs, 24);
andi(Rd, Rd, 0xFF);
zext(Rd, Rd, 8);
orr(Rd, tmp1, Rd);
sign_extend(Rd, Rd, 32);
sext(Rd, Rd, 32);
}
// reverse bytes in doubleword
@ -2855,16 +2856,16 @@ void MacroAssembler::revb(Register Rd, Register Rs, Register tmp1, Register tmp2
}
assert_different_registers(Rs, tmp1, tmp2);
assert_different_registers(Rd, tmp1, tmp2);
andi(tmp1, Rs, 0xFF);
zext(tmp1, Rs, 8);
slli(tmp1, tmp1, 8);
for (int step = 8; step < 56; step += 8) {
srli(tmp2, Rs, step);
andi(tmp2, tmp2, 0xFF);
zext(tmp2, tmp2, 8);
orr(tmp1, tmp1, tmp2);
slli(tmp1, tmp1, 8);
}
srli(Rd, Rs, 56);
andi(Rd, Rd, 0xFF);
zext(Rd, Rd, 8);
orr(Rd, tmp1, Rd);
}
@ -3237,7 +3238,7 @@ void MacroAssembler::encode_klass_not_null(Register dst, Register src, Register
if (((uint64_t)CompressedKlassPointers::base() & 0xffffffff) == 0 &&
CompressedKlassPointers::shift() == 0) {
zero_extend(dst, src, 32);
zext(dst, src, 32);
return;
}
@ -3690,7 +3691,7 @@ void MacroAssembler::load_reserved(Register dst,
break;
case uint32:
lr_w(dst, addr, acquire);
zero_extend(dst, dst, 32);
zext(dst, dst, 32);
break;
default:
ShouldNotReachHere();
@ -3731,7 +3732,7 @@ void MacroAssembler::cmpxchg_narrow_value_helper(Register addr, Register expecte
} else {
// size == int16 case
mv(mask, -1);
zero_extend(mask, mask, 16);
zext(mask, mask, 16);
}
sll(mask, mask, shift);
@ -3808,10 +3809,10 @@ void MacroAssembler::cmpxchg_narrow_value(Register addr, Register expected,
srl(result, scratch0, shift);
if (size == int8) {
sign_extend(result, result, 8);
sext(result, result, 8);
} else {
// size == int16 case
sign_extend(result, result, 16);
sext(result, result, 16);
}
}
}
@ -4005,7 +4006,7 @@ ATOMIC_XCHG(xchgalw, amoswap_w, Assembler::aq, Assembler::rl)
#define ATOMIC_XCHGU(OP1, OP2) \
void MacroAssembler::atomic_##OP1(Register prev, Register newv, Register addr) { \
atomic_##OP2(prev, newv, addr); \
zero_extend(prev, prev, 32); \
zext(prev, prev, 32); \
return; \
}
@ -4025,7 +4026,7 @@ void MacroAssembler::atomic_cas(Register prev, Register newv, Register addr,
break;
case uint32:
amocas_w(prev, addr, newv, (Assembler::Aqrl)(acquire | release));
zero_extend(prev, prev, 32);
zext(prev, prev, 32);
break;
default:
ShouldNotReachHere();
@ -4614,7 +4615,7 @@ void MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
relocate(oop_Relocation::spec(oop_index), [&] {
li32(dst, 0xDEADBEEF);
});
zero_extend(dst, dst, 32);
zext(dst, dst, 32);
}
void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
@ -4627,7 +4628,7 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
relocate(metadata_Relocation::spec(index), [&] {
li32(dst, nk);
});
zero_extend(dst, dst, 32);
zext(dst, dst, 32);
}
address MacroAssembler::reloc_call(Address entry, Register tmp) {
@ -4902,7 +4903,7 @@ void MacroAssembler::mul_add(Register out, Register in, Register offset,
mv(tmp, out);
mv(out, zr);
blez(len, L_end);
zero_extend(k, k, 32);
zext(k, k, 32);
slliw(t0, offset, LogBytesPerInt);
add(offset, tmp, t0);
slliw(t0, len, LogBytesPerInt);
@ -5436,7 +5437,7 @@ void MacroAssembler::inflate_lo32(Register Rd, Register Rs, Register tmp1, Regis
orr(Rd, Rd, tmp2);
}
slli(Rd, Rd, wordSize);
andi(tmp2, Rs, 0xFF); // last byte mask at lower word
zext(tmp2, Rs, 8); // last byte mask at lower word
orr(Rd, Rd, tmp2);
}
@ -5838,7 +5839,7 @@ void MacroAssembler::shadd(Register Rd, Register Rs1, Register Rs2, Register tmp
}
}
void MacroAssembler::zero_extend(Register dst, Register src, int bits) {
void MacroAssembler::zext(Register dst, Register src, int bits) {
switch (bits) {
case 32:
if (UseZba) {
@ -5853,19 +5854,17 @@ void MacroAssembler::zero_extend(Register dst, Register src, int bits) {
}
break;
case 8:
if (UseZbb) {
zext_b(dst, src);
return;
}
break;
zext_b(dst, src);
return;
default:
break;
}
slli(dst, src, XLEN - bits);
srli(dst, dst, XLEN - bits);
}
void MacroAssembler::sign_extend(Register dst, Register src, int bits) {
void MacroAssembler::sext(Register dst, Register src, int bits) {
switch (bits) {
case 32:
sext_w(dst, src);
@ -5885,6 +5884,7 @@ void MacroAssembler::sign_extend(Register dst, Register src, int bits) {
default:
break;
}
slli(dst, src, XLEN - bits);
srai(dst, dst, XLEN - bits);
}
@ -5977,7 +5977,7 @@ void MacroAssembler::move32_64(VMRegPair src, VMRegPair dst, Register tmp) {
sd(src.first()->as_Register(), Address(sp, reg2offset_out(dst.first())));
} else {
if (dst.first() != src.first()) {
sign_extend(dst.first()->as_Register(), src.first()->as_Register(), 32);
sext(dst.first()->as_Register(), src.first()->as_Register(), 32);
}
}
}

View File

@ -1518,16 +1518,16 @@ public:
sltu(Rt, zr, Rt);
break;
case T_CHAR :
zero_extend(Rt, Rt, 16);
zext(Rt, Rt, 16);
break;
case T_BYTE :
sign_extend(Rt, Rt, 8);
sext(Rt, Rt, 8);
break;
case T_SHORT :
sign_extend(Rt, Rt, 16);
sext(Rt, Rt, 16);
break;
case T_INT :
sign_extend(Rt, Rt, 32);
sext(Rt, Rt, 32);
break;
case T_LONG : /* nothing to do */ break;
case T_VOID : /* nothing to do */ break;
@ -1542,8 +1542,8 @@ public:
void double_compare(Register result, FloatRegister Rs1, FloatRegister Rs2, int unordered_result);
// Zero/Sign-extend
void zero_extend(Register dst, Register src, int bits);
void sign_extend(Register dst, Register src, int bits);
void zext(Register dst, Register src, int bits);
void sext(Register dst, Register src, int bits);
private:
void cmp_x2i(Register dst, Register src1, Register src2, Register tmp, bool is_signed = true);

View File

@ -1626,7 +1626,7 @@ uint MachSpillCopyNode::implementation(C2_MacroAssembler *masm, PhaseRegAlloc *r
case rc_int:
if (dst_lo_rc == rc_int) { // gpr --> gpr copy
if (!is64 && this->ideal_reg() != Op_RegI) { // zero extended for narrow oop or klass
__ zero_extend(as_Register(Matcher::_regEncode[dst_lo]), as_Register(Matcher::_regEncode[src_lo]), 32);
__ zext(as_Register(Matcher::_regEncode[dst_lo]), as_Register(Matcher::_regEncode[src_lo]), 32);
} else {
__ mv(as_Register(Matcher::_regEncode[dst_lo]), as_Register(Matcher::_regEncode[src_lo]));
}
@ -8079,7 +8079,7 @@ instruct convI2L_reg_reg(iRegLNoSp dst, iRegIorL2I src)
ins_cost(ALU_COST);
format %{ "addw $dst, $src, zr\t#@convI2L_reg_reg" %}
ins_encode %{
__ sign_extend(as_Register($dst$$reg), as_Register($src$$reg), 32);
__ sext(as_Register($dst$$reg), as_Register($src$$reg), 32);
%}
ins_pipe(ialu_reg);
%}
@ -8091,7 +8091,7 @@ instruct convL2I_reg(iRegINoSp dst, iRegL src) %{
format %{ "addw $dst, $src, zr\t#@convL2I_reg" %}
ins_encode %{
__ sign_extend(as_Register($dst$$reg), as_Register($src$$reg), 32);
__ sext(as_Register($dst$$reg), as_Register($src$$reg), 32);
%}
ins_pipe(ialu_reg);
@ -8103,10 +8103,10 @@ instruct convI2UL_reg_reg(iRegLNoSp dst, iRegIorL2I src, immL_32bits mask)
match(Set dst (AndL (ConvI2L src) mask));
ins_cost(ALU_COST * 2);
format %{ "zero_extend $dst, $src, 32\t# i2ul, #@convI2UL_reg_reg" %}
format %{ "zext $dst, $src, 32\t# i2ul, #@convI2UL_reg_reg" %}
ins_encode %{
__ zero_extend(as_Register($dst$$reg), as_Register($src$$reg), 32);
__ zext(as_Register($dst$$reg), as_Register($src$$reg), 32);
%}
ins_pipe(ialu_reg_shift);
@ -8283,10 +8283,10 @@ instruct convP2I(iRegINoSp dst, iRegP src) %{
match(Set dst (ConvL2I (CastP2X src)));
ins_cost(ALU_COST * 2);
format %{ "zero_extend $dst, $src, 32\t# ptr -> int, #@convP2I" %}
format %{ "zext $dst, $src, 32\t# ptr -> int, #@convP2I" %}
ins_encode %{
__ zero_extend($dst$$Register, $src$$Register, 32);
__ zext($dst$$Register, $src$$Register, 32);
%}
ins_pipe(ialu_reg);

View File

@ -82,7 +82,7 @@ void OptoRuntime::generate_uncommon_trap_blob() {
#endif
// compiler left unloaded_class_index in j_rarg0 move to where the
// runtime expects it.
__ sign_extend(c_rarg1, j_rarg0, 32);
__ sext(c_rarg1, j_rarg0, 32);
// we need to set the past SP to the stack pointer of the stub frame
// and the pc to the address where this runtime call will return

View File

@ -1643,8 +1643,8 @@ class StubGenerator: public StubCodeGenerator {
__ bgtu(temp, t0, L_failed);
// Have to clean up high 32 bits of 'src_pos' and 'dst_pos'.
__ zero_extend(src_pos, src_pos, 32);
__ zero_extend(dst_pos, dst_pos, 32);
__ zext(src_pos, src_pos, 32);
__ zext(dst_pos, dst_pos, 32);
BLOCK_COMMENT("arraycopy_range_checks done");
}
@ -1767,14 +1767,14 @@ class StubGenerator: public StubCodeGenerator {
__ beqz(src, L_failed);
// if [src_pos < 0] then return -1
__ sign_extend(t0, src_pos, 32);
__ sext(t0, src_pos, 32);
__ bltz(t0, L_failed);
// if dst is null then return -1
__ beqz(dst, L_failed);
// if [dst_pos < 0] then return -1
__ sign_extend(t0, dst_pos, 32);
__ sext(t0, dst_pos, 32);
__ bltz(t0, L_failed);
// registers used as temp
@ -1783,7 +1783,7 @@ class StubGenerator: public StubCodeGenerator {
const Register lh = x30; // layout helper
// if [length < 0] then return -1
__ sign_extend(scratch_length, length, 32); // length (elements count, 32-bits value)
__ sext(scratch_length, length, 32); // length (elements count, 32-bits value)
__ bltz(scratch_length, L_failed);
__ load_klass(scratch_src_klass, src);
@ -1879,13 +1879,13 @@ class StubGenerator: public StubCodeGenerator {
__ bnez(t0, L_copy_shorts);
__ add(from, src, src_pos); // src_addr
__ add(to, dst, dst_pos); // dst_addr
__ sign_extend(count, scratch_length, 32); // length
__ sext(count, scratch_length, 32); // length
__ j(RuntimeAddress(byte_copy_entry));
__ BIND(L_copy_shorts);
__ shadd(from, src_pos, src, t0, 1); // src_addr
__ shadd(to, dst_pos, dst, t0, 1); // dst_addr
__ sign_extend(count, scratch_length, 32); // length
__ sext(count, scratch_length, 32); // length
__ j(RuntimeAddress(short_copy_entry));
__ BIND(L_copy_ints);
@ -1893,7 +1893,7 @@ class StubGenerator: public StubCodeGenerator {
__ bnez(t0, L_copy_longs);
__ shadd(from, src_pos, src, t0, 2); // src_addr
__ shadd(to, dst_pos, dst, t0, 2); // dst_addr
__ sign_extend(count, scratch_length, 32); // length
__ sext(count, scratch_length, 32); // length
__ j(RuntimeAddress(int_copy_entry));
__ BIND(L_copy_longs);
@ -1902,7 +1902,7 @@ class StubGenerator: public StubCodeGenerator {
BLOCK_COMMENT("assert long copy {");
Label L;
__ andi(lh, lh, Klass::_lh_log2_element_size_mask); // lh -> x30_elsize
__ sign_extend(lh, lh, 32);
__ sext(lh, lh, 32);
__ mv(t0, LogBytesPerLong);
__ beq(x30_elsize, t0, L);
__ stop("must be long copy, but elsize is wrong");
@ -1912,7 +1912,7 @@ class StubGenerator: public StubCodeGenerator {
#endif
__ shadd(from, src_pos, src, t0, 3); // src_addr
__ shadd(to, dst_pos, dst, t0, 3); // dst_addr
__ sign_extend(count, scratch_length, 32); // length
__ sext(count, scratch_length, 32); // length
__ j(RuntimeAddress(long_copy_entry));
// ObjArrayKlass
@ -1932,7 +1932,7 @@ class StubGenerator: public StubCodeGenerator {
__ add(from, from, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
__ shadd(to, dst_pos, dst, t0, LogBytesPerHeapOop);
__ add(to, to, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
__ sign_extend(count, scratch_length, 32); // length
__ sext(count, scratch_length, 32); // length
__ BIND(L_plain_copy);
__ j(RuntimeAddress(oop_copy_entry));
@ -1955,8 +1955,8 @@ class StubGenerator: public StubCodeGenerator {
__ add(from, from, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
__ shadd(to, dst_pos, dst, t0, LogBytesPerHeapOop);
__ add(to, to, arrayOopDesc::base_offset_in_bytes(T_OBJECT));
__ sign_extend(count, length, 32); // length (reloaded)
const Register sco_temp = c_rarg3; // this register is free now
__ sext(count, length, 32); // length (reloaded)
const Register sco_temp = c_rarg3; // this register is free now
assert_different_registers(from, to, count, sco_temp,
dst_klass, scratch_src_klass);
@ -2022,7 +2022,7 @@ class StubGenerator: public StubCodeGenerator {
// Zero extend value
// 8 bit -> 16 bit
__ andi(value, value, 0xff);
__ zext(value, value, 8);
__ mv(tmp_reg, value);
__ slli(tmp_reg, tmp_reg, 8);
__ orr(value, value, tmp_reg);
@ -2039,7 +2039,7 @@ class StubGenerator: public StubCodeGenerator {
shift = 1;
// Zero extend value
// 16 bit -> 32 bit
__ andi(value, value, 0xffff);
__ zext(value, value, 16);
__ mv(tmp_reg, value);
__ slli(tmp_reg, tmp_reg, 16);
__ orr(value, value, tmp_reg);
@ -2099,9 +2099,8 @@ class StubGenerator: public StubCodeGenerator {
__ srliw(cnt_words, count, 3 - shift); // number of words
// 32 bit -> 64 bit
__ andi(value, value, 0xffffffff);
__ mv(tmp_reg, value);
__ slli(tmp_reg, tmp_reg, 32);
__ zext(value, value, 32);
__ slli(tmp_reg, value, 32);
__ orr(value, value, tmp_reg);
__ slli(tmp_reg, cnt_words, 3 - shift);
@ -2572,8 +2571,8 @@ class StubGenerator: public StubCodeGenerator {
__ ctzc_bit(tmp4, tmp3);
__ srl(tmp1, tmp1, tmp4);
__ srl(tmp2, tmp2, tmp4);
__ andi(tmp1, tmp1, 0xFFFF);
__ andi(tmp2, tmp2, 0xFFFF);
__ zext(tmp1, tmp1, 16);
__ zext(tmp2, tmp2, 16);
__ sub(result, tmp1, tmp2);
__ bind(DONE);
__ ret();
@ -2708,11 +2707,11 @@ class StubGenerator: public StubCodeGenerator {
__ srl(tmp5, tmp5, tmp3);
__ srl(cnt1, cnt1, tmp3);
if (isLL) {
__ andi(tmp5, tmp5, 0xFF);
__ andi(cnt1, cnt1, 0xFF);
__ zext(tmp5, tmp5, 8);
__ zext(cnt1, cnt1, 8);
} else {
__ andi(tmp5, tmp5, 0xFFFF);
__ andi(cnt1, cnt1, 0xFFFF);
__ zext(tmp5, tmp5, 16);
__ zext(cnt1, cnt1, 16);
}
__ sub(result, tmp5, cnt1);
__ j(LENGTH_DIFF);
@ -2721,11 +2720,11 @@ class StubGenerator: public StubCodeGenerator {
__ srl(tmp1, tmp1, tmp3);
__ srl(tmp2, tmp2, tmp3);
if (isLL) {
__ andi(tmp1, tmp1, 0xFF);
__ andi(tmp2, tmp2, 0xFF);
__ zext(tmp1, tmp1, 8);
__ zext(tmp2, tmp2, 8);
} else {
__ andi(tmp1, tmp1, 0xFFFF);
__ andi(tmp2, tmp2, 0xFFFF);
__ zext(tmp1, tmp1, 16);
__ zext(tmp2, tmp2, 16);
}
__ sub(result, tmp1, tmp2);
__ j(LENGTH_DIFF);
@ -2787,7 +2786,8 @@ class StubGenerator: public StubCodeGenerator {
__ sub(haystack_len, haystack_len, needle_len);
// first is needle[0]
__ andi(first, ch1, needle_isL ? 0xFF : 0xFFFF, first);
__ zext(first, ch1, needle_isL ? 8 : 16);
uint64_t mask0101 = UCONST64(0x0101010101010101);
uint64_t mask0001 = UCONST64(0x0001000100010001);
__ mv(mask1, haystack_isL ? mask0101 : mask0001);
@ -2963,7 +2963,7 @@ class StubGenerator: public StubCodeGenerator {
__ andi(result, result, haystack_isL ? -8 : -4);
__ slli(tmp, match_mask, haystack_chr_shift);
__ sub(haystack, haystack, tmp);
__ sign_extend(haystack_len, haystack_len, 32);
__ sext(haystack_len, haystack_len, 32);
__ j(L_LOOP_PROCEED);
__ align(OptoLoopAlignment);
@ -5044,7 +5044,7 @@ class StubGenerator: public StubCodeGenerator {
__ rolw_imm(cur_w, cur_w, 1, t0);
// copy the cur_w value to ws[8]
__ zero_extend(cur_w, cur_w, 32);
__ zext(cur_w, cur_w, 32);
__ orr(ws[idx/2], ws[idx/2], cur_w);
// shift the w't registers, so they start from ws[0] again.
@ -5151,11 +5151,11 @@ class StubGenerator: public StubCodeGenerator {
assert_different_registers(a, b, c, d, e, prev_ab, prev_cd, prev_e, t0);
__ slli(t0, b, 32);
__ zero_extend(prev_ab, a, 32);
__ zext(prev_ab, a, 32);
__ orr(prev_ab, prev_ab, t0);
__ slli(t0, d, 32);
__ zero_extend(prev_cd, c, 32);
__ zext(prev_cd, c, 32);
__ orr(prev_cd, prev_cd, t0);
__ mv(prev_e, e);
@ -5285,11 +5285,11 @@ class StubGenerator: public StubCodeGenerator {
}
// store back the state.
__ zero_extend(a, a, 32);
__ zext(a, a, 32);
__ slli(b, b, 32);
__ orr(a, a, b);
__ sd(a, Address(state, 0));
__ zero_extend(c, c, 32);
__ zext(c, c, 32);
__ slli(d, d, 32);
__ orr(c, c, d);
__ sd(c, Address(state, 8));
@ -5963,7 +5963,7 @@ class StubGenerator: public StubCodeGenerator {
// s1 is initialized to the lower 16 bits of adler
// s2 is initialized to the upper 16 bits of adler
__ srliw(s2, adler, 16); // s2 = ((adler >> 16) & 0xffff)
__ zero_extend(s1, adler, 16); // s1 = (adler & 0xffff)
__ zext(s1, adler, 16); // s1 = (adler & 0xffff)
// The pipelined loop needs at least 16 elements for 1 iteration
// It does check this, but it is more effective to skip to the cleanup loop

View File

@ -361,7 +361,7 @@ address TemplateInterpreterGenerator::generate_ArrayIndexOutOfBounds_handler() {
// setup parameters
// convention: expect aberrant index in register x11
__ zero_extend(c_rarg2, x11, 32);
__ zext(c_rarg2, x11, 32);
// convention: expect array in register x13
__ mv(c_rarg1, x13);
__ call_VM(noreg,

View File

@ -722,7 +722,7 @@ void TemplateTable::index_check(Register array, Register index) {
__ mv(x11, index);
}
Label ok;
__ sign_extend(index, index, 32);
__ sext(index, index, 32);
__ bltu(index, length, ok);
__ mv(x13, array);
__ mv(t1, Interpreter::_throw_ArrayIndexOutOfBoundsException_entry);
@ -740,7 +740,7 @@ void TemplateTable::iaload() {
__ add(x11, x11, arrayOopDesc::base_offset_in_bytes(T_INT) >> 2);
__ shadd(x10, x11, x10, t0, 2);
__ access_load_at(T_INT, IN_HEAP | IS_ARRAY, x10, Address(x10), noreg, noreg);
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
}
void TemplateTable::laload() {
@ -1545,7 +1545,7 @@ void TemplateTable::convert() {
// Conversion
switch (bytecode()) {
case Bytecodes::_i2l:
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
break;
case Bytecodes::_i2f:
__ fcvt_s_w(f10, x10);
@ -1554,16 +1554,16 @@ void TemplateTable::convert() {
__ fcvt_d_w(f10, x10);
break;
case Bytecodes::_i2b:
__ sign_extend(x10, x10, 8);
__ sext(x10, x10, 8);
break;
case Bytecodes::_i2c:
__ zero_extend(x10, x10, 16);
__ zext(x10, x10, 16);
break;
case Bytecodes::_i2s:
__ sign_extend(x10, x10, 16);
__ sext(x10, x10, 16);
break;
case Bytecodes::_l2i:
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
break;
case Bytecodes::_l2f:
__ fcvt_s_l(f10, x10);
@ -1783,7 +1783,7 @@ void TemplateTable::if_0cmp(Condition cc) {
// assume branch is more often taken than not (loops use backward branches)
Label not_taken;
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
switch (cc) {
case equal:
__ bnez(x10, not_taken);
@ -1817,7 +1817,7 @@ void TemplateTable::if_icmp(Condition cc) {
// assume branch is more often taken than not (loops use backward branches)
Label not_taken;
__ pop_i(x11);
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
switch (cc) {
case equal:
__ bne(x11, x10, not_taken);
@ -2573,7 +2573,7 @@ void TemplateTable::getfield_or_static(int byte_no, bool is_static, RewriteContr
__ bnez(t0, notInt);
// itos
__ access_load_at(T_INT, IN_HEAP, x10, field, noreg, noreg);
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
__ push(itos);
// Rewrite bytecode to be faster
if (rc == may_rewrite) {
@ -3137,7 +3137,7 @@ void TemplateTable::fast_accessfield(TosState state) {
break;
case Bytecodes::_fast_igetfield:
__ access_load_at(T_INT, IN_HEAP, x10, field, noreg, noreg);
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
break;
case Bytecodes::_fast_bgetfield:
__ access_load_at(T_BYTE, IN_HEAP, x10, field, noreg, noreg);
@ -3183,7 +3183,7 @@ void TemplateTable::fast_xaccess(TosState state) {
case itos:
__ add(x10, x10, x11);
__ access_load_at(T_INT, IN_HEAP, x10, Address(x10, 0), noreg, noreg);
__ sign_extend(x10, x10, 32);
__ sext(x10, x10, 32);
break;
case atos:
__ add(x10, x10, x11);