Skip to content

Commit c8c1c6a

Browse files
Ilya GavrilinVladimir Kempik
authored andcommitted
8313779: RISC-V: use andn / orn in the MD5 instrinsic
Backport-of: 4726960fcdc9489fb8f9c7e1a100828f1347c30c
1 parent 8853be6 commit c8c1c6a

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed

src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,28 @@ void MacroAssembler::xorrw(Register Rd, Register Rs1, Register Rs2) {
15711571
sign_extend(Rd, Rd, 32);
15721572
}
15731573

1574+
// Rd = Rs1 & (~Rd2)
1575+
void MacroAssembler::andn(Register Rd, Register Rs1, Register Rs2) {
1576+
if (UseZbb) {
1577+
Assembler::andn(Rd, Rs1, Rs2);
1578+
return;
1579+
}
1580+
1581+
notr(Rd, Rs2);
1582+
andr(Rd, Rs1, Rd);
1583+
}
1584+
1585+
// Rd = Rs1 | (~Rd2)
1586+
void MacroAssembler::orn(Register Rd, Register Rs1, Register Rs2) {
1587+
if (UseZbb) {
1588+
Assembler::orn(Rd, Rs1, Rs2);
1589+
return;
1590+
}
1591+
1592+
notr(Rd, Rs2);
1593+
orr(Rd, Rs1, Rd);
1594+
}
1595+
15741596
// Note: load_unsigned_short used to be called load_unsigned_word.
15751597
int MacroAssembler::load_unsigned_short(Register dst, Address src) {
15761598
int off = offset();

src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -736,6 +736,10 @@ class MacroAssembler: public Assembler {
736736
void orrw(Register Rd, Register Rs1, Register Rs2);
737737
void xorrw(Register Rd, Register Rs1, Register Rs2);
738738

739+
// logic with negate
740+
void andn(Register Rd, Register Rs1, Register Rs2);
741+
void orn(Register Rd, Register Rs1, Register Rs2);
742+
739743
// revb
740744
void revb_h_h(Register Rd, Register Rs, Register tmp = t0); // reverse bytes in halfword in lower 16 bits, sign-extend
741745
void revb_w_w(Register Rd, Register Rs, Register tmp1 = t0, Register tmp2 = t1); // reverse bytes in lower word, sign-extend

src/hotspot/cpu/riscv/stubGenerator_riscv.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3733,7 +3733,7 @@ class StubGenerator: public StubCodeGenerator {
37333733
// rtmp1 = rtmp1 + x + ac
37343734
reg_cache.get_u32(rtmp2, k, rmask32);
37353735
__ addw(rtmp1, rtmp1, rtmp2);
3736-
__ li(rtmp2, t);
3736+
__ mv(rtmp2, t);
37373737
__ addw(rtmp1, rtmp1, rtmp2);
37383738

37393739
// a += rtmp1 + x + ac
@@ -3754,8 +3754,7 @@ class StubGenerator: public StubCodeGenerator {
37543754
__ andr(rtmp1, b, c);
37553755

37563756
// rtmp2 = (~b) & d
3757-
__ notr(rtmp2, b);
3758-
__ andr(rtmp2, rtmp2, d);
3757+
__ andn(rtmp2, d, b);
37593758

37603759
// rtmp1 = (b & c) | ((~b) & d)
37613760
__ orr(rtmp1, rtmp1, rtmp2);
@@ -3773,9 +3772,8 @@ class StubGenerator: public StubCodeGenerator {
37733772
// rtmp1 = b & d
37743773
__ andr(rtmp1, b, d);
37753774

3776-
// rtmp2 = (c & (~d))
3777-
__ notr(rtmp2, d);
3778-
__ andr(rtmp2, rtmp2, c);
3775+
// rtmp2 = c & (~d)
3776+
__ andn(rtmp2, c, d);
37793777

37803778
// rtmp1 = (b & d) | (c & (~d))
37813779
__ orr(rtmp1, rtmp1, rtmp2);
@@ -3805,8 +3803,7 @@ class StubGenerator: public StubCodeGenerator {
38053803
int k, int s, int t,
38063804
Register rtmp1, Register rtmp2, Register rmask32) {
38073805
// rtmp1 = c ^ (b | (~d))
3808-
__ notr(rtmp2, d);
3809-
__ orr(rtmp1, b, rtmp2);
3806+
__ orn(rtmp1, b, d);
38103807
__ xorr(rtmp1, c, rtmp1);
38113808

38123809
m5_FF_GG_HH_II_epilogue(reg_cache, a, b, c, d, k, s, t,
@@ -3929,7 +3926,7 @@ class StubGenerator: public StubCodeGenerator {
39293926
__ mv(ofs, ofs_arg);
39303927
__ mv(limit, limit_arg);
39313928
}
3932-
__ li(rmask32, MASK_32);
3929+
__ mv(rmask32, MASK_32);
39333930

39343931
// to minimize the number of memory operations:
39353932
// read the 4 state 4-byte values in pairs, with a single ld,

0 commit comments

Comments
 (0)