Skip to content

Commit 4726960

Browse files
committedAug 7, 2023
8313779: RISC-V: use andn / orn in the MD5 instrinsic
Reviewed-by: luhenry, fyang
1 parent bbbfa21 commit 4726960

File tree

3 files changed

+32
-9
lines changed

3 files changed

+32
-9
lines changed
 

‎src/hotspot/cpu/riscv/macroAssembler_riscv.cpp

+22
Original file line numberDiff line numberDiff line change
@@ -1654,6 +1654,28 @@ void MacroAssembler::xorrw(Register Rd, Register Rs1, Register Rs2) {
16541654
sign_extend(Rd, Rd, 32);
16551655
}
16561656

1657+
// Rd = Rs1 & (~Rd2)
1658+
void MacroAssembler::andn(Register Rd, Register Rs1, Register Rs2) {
1659+
if (UseZbb) {
1660+
Assembler::andn(Rd, Rs1, Rs2);
1661+
return;
1662+
}
1663+
1664+
notr(Rd, Rs2);
1665+
andr(Rd, Rs1, Rd);
1666+
}
1667+
1668+
// Rd = Rs1 | (~Rd2)
1669+
void MacroAssembler::orn(Register Rd, Register Rs1, Register Rs2) {
1670+
if (UseZbb) {
1671+
Assembler::orn(Rd, Rs1, Rs2);
1672+
return;
1673+
}
1674+
1675+
notr(Rd, Rs2);
1676+
orr(Rd, Rs1, Rd);
1677+
}
1678+
16571679
// Note: load_unsigned_short used to be called load_unsigned_word.
16581680
int MacroAssembler::load_unsigned_short(Register dst, Address src) {
16591681
int off = offset();

‎src/hotspot/cpu/riscv/macroAssembler_riscv.hpp

+4
Original file line numberDiff line numberDiff line change
@@ -763,6 +763,10 @@ class MacroAssembler: public Assembler {
763763
void orrw(Register Rd, Register Rs1, Register Rs2);
764764
void xorrw(Register Rd, Register Rs1, Register Rs2);
765765

766+
// logic with negate
767+
void andn(Register Rd, Register Rs1, Register Rs2);
768+
void orn(Register Rd, Register Rs1, Register Rs2);
769+
766770
// revb
767771
void revb_h_h(Register Rd, Register Rs, Register tmp = t0); // reverse bytes in halfword in lower 16 bits, sign-extend
768772
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

+6-9
Original file line numberDiff line numberDiff line change
@@ -3960,7 +3960,7 @@ class StubGenerator: public StubCodeGenerator {
39603960
// rtmp1 = rtmp1 + x + ac
39613961
reg_cache.get_u32(rtmp2, k, rmask32);
39623962
__ addw(rtmp1, rtmp1, rtmp2);
3963-
__ li(rtmp2, t);
3963+
__ mv(rtmp2, t);
39643964
__ addw(rtmp1, rtmp1, rtmp2);
39653965

39663966
// a += rtmp1 + x + ac
@@ -3981,8 +3981,7 @@ class StubGenerator: public StubCodeGenerator {
39813981
__ andr(rtmp1, b, c);
39823982

39833983
// rtmp2 = (~b) & d
3984-
__ notr(rtmp2, b);
3985-
__ andr(rtmp2, rtmp2, d);
3984+
__ andn(rtmp2, d, b);
39863985

39873986
// rtmp1 = (b & c) | ((~b) & d)
39883987
__ orr(rtmp1, rtmp1, rtmp2);
@@ -4000,9 +3999,8 @@ class StubGenerator: public StubCodeGenerator {
40003999
// rtmp1 = b & d
40014000
__ andr(rtmp1, b, d);
40024001

4003-
// rtmp2 = (c & (~d))
4004-
__ notr(rtmp2, d);
4005-
__ andr(rtmp2, rtmp2, c);
4002+
// rtmp2 = c & (~d)
4003+
__ andn(rtmp2, c, d);
40064004

40074005
// rtmp1 = (b & d) | (c & (~d))
40084006
__ orr(rtmp1, rtmp1, rtmp2);
@@ -4032,8 +4030,7 @@ class StubGenerator: public StubCodeGenerator {
40324030
int k, int s, int t,
40334031
Register rtmp1, Register rtmp2, Register rmask32) {
40344032
// rtmp1 = c ^ (b | (~d))
4035-
__ notr(rtmp2, d);
4036-
__ orr(rtmp1, b, rtmp2);
4033+
__ orn(rtmp1, b, d);
40374034
__ xorr(rtmp1, c, rtmp1);
40384035

40394036
m5_FF_GG_HH_II_epilogue(reg_cache, a, b, c, d, k, s, t,
@@ -4156,7 +4153,7 @@ class StubGenerator: public StubCodeGenerator {
41564153
__ mv(ofs, ofs_arg);
41574154
__ mv(limit, limit_arg);
41584155
}
4159-
__ li(rmask32, MASK_32);
4156+
__ mv(rmask32, MASK_32);
41604157

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

0 commit comments

Comments
 (0)
Failed to load comments.