@@ -683,6 +683,10 @@ void MacroAssembler::sext_w(Register Rd, Register Rs) {
683683 addiw (Rd, Rs, 0 );
684684}
685685
686+ void MacroAssembler::zext_b (Register Rd, Register Rs) {
687+ andi (Rd, Rs, 0xFF );
688+ }
689+
686690void MacroAssembler::seqz (Register Rd, Register Rs) {
687691 sltiu (Rd, Rs, 1 );
688692}
@@ -1902,7 +1906,7 @@ void MacroAssembler::encode_klass_not_null(Register dst, Register src, Register
19021906
19031907 if (((uint64_t )(uintptr_t )CompressedKlassPointers::base () & 0xffffffff ) == 0 &&
19041908 CompressedKlassPointers::shift () == 0 ) {
1905- zero_ext (dst, src, 32 ); // clear upper 32 bits
1909+ zero_extend (dst, src, 32 );
19061910 return ;
19071911 }
19081912
@@ -2219,7 +2223,7 @@ void MacroAssembler::load_reserved(Register addr,
22192223 break ;
22202224 case uint32:
22212225 lr_w (t0, addr, acquire);
2222- clear_upper_bits ( t0, 32 );
2226+ zero_extend (t0, t0, 32 );
22232227 break ;
22242228 default :
22252229 ShouldNotReachHere ();
@@ -2262,7 +2266,7 @@ void MacroAssembler::cmpxchg_narrow_value_helper(Register addr, Register expecte
22622266 } else {
22632267 // size == int16 case
22642268 addi (mask, zr, -1 );
2265- zero_ext (mask, mask, registerSize - 16 );
2269+ zero_extend (mask, mask, 16 );
22662270 }
22672271 sll (mask, mask, shift);
22682272
@@ -2315,10 +2319,10 @@ void MacroAssembler::cmpxchg_narrow_value(Register addr, Register expected,
23152319 srl (result, tmp, shift);
23162320
23172321 if (size == int8) {
2318- sign_ext (result, result, registerSize - 8 );
2322+ sign_extend (result, result, 8 );
23192323 } else {
23202324 // size == int16 case
2321- sign_ext (result, result, registerSize - 16 );
2325+ sign_extend (result, result, 16 );
23222326 }
23232327 }
23242328}
@@ -2448,7 +2452,7 @@ ATOMIC_XCHG(xchgalw, amoswap_w, Assembler::aq, Assembler::rl)
24482452#define ATOMIC_XCHGU (OP1, OP2 ) \
24492453void MacroAssembler::atomic_##OP1(Register prev, Register newv, Register addr) { \
24502454 atomic_##OP2 (prev, newv, addr); \
2451- clear_upper_bits (prev, 32 ); \
2455+ zero_extend (prev, prev, 32 ); \
24522456 return ; \
24532457}
24542458
@@ -2827,7 +2831,7 @@ void MacroAssembler::set_narrow_oop(Register dst, jobject obj) {
28272831 RelocationHolder rspec = oop_Relocation::spec (oop_index);
28282832 code_section ()->relocate (inst_mark (), rspec);
28292833 li32 (dst, 0xDEADBEEF );
2830- clear_upper_bits (dst, 32 ); // clear upper 32bit, do not sign extend.
2834+ zero_extend (dst, dst, 32 );
28312835}
28322836
28332837void MacroAssembler::set_narrow_klass (Register dst, Klass* k) {
@@ -2841,7 +2845,7 @@ void MacroAssembler::set_narrow_klass(Register dst, Klass* k) {
28412845 code_section ()->relocate (inst_mark (), rspec);
28422846 narrowKlass nk = CompressedKlassPointers::encode (k);
28432847 li32 (dst, nk);
2844- clear_upper_bits (dst, 32 ); // clear upper 32bit, do not sign extend.
2848+ zero_extend (dst, dst, 32 );
28452849}
28462850
28472851// Maybe emit a call via a trampoline. If the code cache is small
@@ -3050,7 +3054,7 @@ void MacroAssembler::mul_add(Register out, Register in, Register offset,
30503054 mv (tmp, out);
30513055 mv (out, zr);
30523056 beqz (len, L_end);
3053- zero_ext (k, k, 32 );
3057+ zero_extend (k, k, 32 );
30543058 slli (t0, offset, LogBytesPerInt);
30553059 add (offset, tmp, t0);
30563060 slli (t0, len, LogBytesPerInt);
@@ -3427,14 +3431,42 @@ void MacroAssembler::zero_memory(Register addr, Register len, Register tmp1) {
34273431 bnez (len, loop);
34283432}
34293433
3430- void MacroAssembler::zero_ext (Register dst, Register src, int clear_bits) {
3431- slli (dst, src, clear_bits);
3432- srli (dst, dst, clear_bits);
3434+ void MacroAssembler::zero_extend (Register dst, Register src, int bits) {
3435+ if (UseRVB) {
3436+ if (bits == 16 ) {
3437+ zext_h (dst, src);
3438+ return ;
3439+ } else if (bits == 32 ) {
3440+ zext_w (dst, src);
3441+ return ;
3442+ }
3443+ }
3444+
3445+ if (bits == 8 ) {
3446+ zext_b (dst, src);
3447+ } else {
3448+ slli (dst, src, XLEN - bits);
3449+ srli (dst, dst, XLEN - bits);
3450+ }
34333451}
34343452
3435- void MacroAssembler::sign_ext (Register dst, Register src, int clear_bits) {
3436- slli (dst, src, clear_bits);
3437- srai (dst, dst, clear_bits);
3453+ void MacroAssembler::sign_extend (Register dst, Register src, int bits) {
3454+ if (UseRVB) {
3455+ if (bits == 8 ) {
3456+ sext_b (dst, src);
3457+ return ;
3458+ } else if (bits == 16 ) {
3459+ sext_h (dst, src);
3460+ return ;
3461+ }
3462+ }
3463+
3464+ if (bits == 32 ) {
3465+ sext_w (dst, src);
3466+ } else {
3467+ slli (dst, src, XLEN - bits);
3468+ srai (dst, dst, XLEN - bits);
3469+ }
34383470}
34393471
34403472void MacroAssembler::cmp_l2i (Register dst, Register src1, Register src2, Register tmp)
0 commit comments