arch-riscv: seperate RV32 and RV64 Zk extensions

1. If the instruction is RV64 only, such as zknd(aes64ds, aes64dsm,
   aes64im, aes64ks1i, and aes64ks2), zkne(aes64es, aes64esm,
   aes64ks1i, aes64ks2), Zknh(sha512sig0, sha512sig1, sha512sum0,
   sha512sum1). The decoder should check rv_type before returning
   the instruction.

2. For the Zbkx(xperm8 and xperm4), I seperate them with RV32 and
   RV64 respectively, since the xperm function has individual
   implement for handling different size of integer.

3. Add the brev8(zbkb) instruction

Change-Id: Id0b7ab2772fd1b21c1ee41075df44a5b6dbe5b47
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66191
Reviewed-by: Hoa Nguyen <hoanguyen@ucdavis.edu>
Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
Maintainer: Jason Lowe-Power <power.jg@gmail.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Roger Chang
2022-11-29 16:29:01 +08:00
parent dd5b1a674e
commit 2dafebb4b9

View File

@@ -537,18 +537,26 @@ decode QUADRANT default Unknown::unknown() {
0x3: sha256sig1({{
Rd_sw = _rvk_emu_sha256sig1(Rs1_sw);
}});
0x4: sha512sum0({{
Rd_sd = _rvk_emu_sha512sum0(Rs1_sd);
}});
0x5: sha512sum1({{
Rd_sd = _rvk_emu_sha512sum1(Rs1_sd);
}});
0x6: sha512sig0({{
Rd_sd = _rvk_emu_sha512sig0(Rs1_sd);
}});
0x7: sha512sig1({{
Rd_sd = _rvk_emu_sha512sig1(Rs1_sd);
}});
0x4: decode RVTYPE {
0x1: sha512sum0({{
Rd_sd = _rvk_emu_sha512sum0(Rs1_sd);
}});
}
0x5: decode RVTYPE {
0x1: sha512sum1({{
Rd_sd = _rvk_emu_sha512sum1(Rs1_sd);
}});
}
0x6: decode RVTYPE {
0x1: sha512sig0({{
Rd_sd = _rvk_emu_sha512sig0(Rs1_sd);
}});
}
0x7: decode RVTYPE {
0x1: sha512sig1({{
Rd_sd = _rvk_emu_sha512sig1(Rs1_sd);
}});
}
0x8: sm3p0({{
Rd_sw = _rvk_emu_sm3p0(Rs1_sw);
}});
@@ -565,12 +573,16 @@ decode QUADRANT default Unknown::unknown() {
Rd = rvSext(Rs1 | (UINT64_C(1) << index));
}}, imm_type = uint64_t, imm_code = {{ imm = SHAMT6; }});
0x06: decode BIT24 {
0x0: aes64im({{
Rd_sd = _rvk_emu_aes64im(Rs1_sd);
}});
0x1: aes64ks1i({{
Rd_sd = _rvk_emu_aes64ks1i(Rs1_sd, imm);
}}, imm_type = int32_t, imm_code={{ imm = RNUM; }});
0x0: decode RVTYPE {
0x1: aes64im({{
Rd_sd = _rvk_emu_aes64im(Rs1_sd);
}});
}
0x1: decode RVTYPE {
0x1: aes64ks1i({{
Rd_sd = _rvk_emu_aes64ks1i(Rs1_sd, imm);
}}, imm_type = int32_t, imm_code={{ imm = RNUM; }});
}
}
0x09: bclri({{
if (rvSelect((bool)SHAMT6BIT5, false)) {
@@ -698,6 +710,14 @@ decode QUADRANT default Unknown::unknown() {
}},
imm_type = uint64_t, imm_code = {{ imm = SHAMT6; }});
}
0x07: decode RVTYPE {
0x0: rv32_brev8({{
Rd_sw = _rvk_emu_brev8_32(Rs1_sw);
}}, imm_code = {{ imm = SHAMT5; }});
0x1: brev8({{
Rd = _rvk_emu_brev8_64(Rs1);
}}, imm_code = {{ imm = SHAMT6; }});
}
}
}
0x6: ori({{
@@ -972,33 +992,43 @@ decode QUADRANT default Unknown::unknown() {
}}, IntMultOp);
}
0x18: sm4ed({{
Rd_sd = _rvk_emu_sm4ed(Rs1_sd, Rs2_sd, (uint8_t)BS);
Rd_sw = _rvk_emu_sm4ed(Rs1_sw, Rs2_sw, (uint8_t)BS);
}});
0x19: decode BS {
0x0: aes64es({{
Rd_sd = _rvk_emu_aes64es(Rs1_sd, Rs2_sd);
}});
0x0: decode RVTYPE {
0x1: aes64es({{
Rd_sd = _rvk_emu_aes64es(Rs1_sd, Rs2_sd);
}});
}
}
0x1a: sm4ks({{
Rd_sd = _rvk_emu_sm4ks(Rs1_sd, Rs2_sd, (uint8_t)BS);
Rd_sw = _rvk_emu_sm4ks(Rs1_sw, Rs2_sw, (uint8_t)BS);
}});
0x1b: decode BS {
0x0: aes64esm({{
Rd_sd = _rvk_emu_aes64esm(Rs1_sd, Rs2_sd);
}});
0x0: decode RVTYPE {
0x1: aes64esm({{
Rd_sd = _rvk_emu_aes64esm(Rs1_sd, Rs2_sd);
}});
}
}
0x1d: decode BS {
0x0: aes64ds({{
Rd_sd = _rvk_emu_aes64ds(Rs1_sd, Rs2_sd);
}});
0x0: decode RVTYPE {
0x1: aes64ds({{
Rd_sd = _rvk_emu_aes64ds(Rs1_sd, Rs2_sd);
}});
}
}
0x1f: decode BS{
0x0: aes64dsm({{
Rd_sd = _rvk_emu_aes64dsm(Rs1_sd, Rs2_sd);
}});
0x1: aes64ks2({{
Rd_sd = _rvk_emu_aes64ks2(Rs1_sd, Rs2_sd);
}});
0x1f: decode BS {
0x0: decode RVTYPE {
0x1: aes64dsm({{
Rd_sd = _rvk_emu_aes64dsm(Rs1_sd, Rs2_sd);
}});
}
0x1: decode RVTYPE {
0x1: aes64ks2({{
Rd_sd = _rvk_emu_aes64ks2(Rs1_sd, Rs2_sd);
}});
}
}
}
0x1: decode FUNCT7 {
@@ -1105,9 +1135,14 @@ decode QUADRANT default Unknown::unknown() {
0x10: sh1add({{
Rd = rvSext((Rs1 << 1) + Rs2);
}});
0x14: xperm4({{
Rd_sd = _rvk_emu_xperm4_64(Rs1_sd, Rs2_sd);
}});
0x14: decode RVTYPE {
0x0: xperm4_32({{
Rd_sw = _rvk_emu_xperm4_32(Rs1_sw, Rs2_sw);
}});
0x1: xperm4_64({{
Rd_sd = _rvk_emu_xperm4_64(Rs1_sd, Rs2_sd);
}});
}
}
0x3: decode FUNCT7 {
0x0: sltu({{
@@ -1186,9 +1221,14 @@ decode QUADRANT default Unknown::unknown() {
0x10: sh2add({{
Rd = rvSext((Rs1 << 2) + Rs2);
}});
0x14: xperm8({{
Rd_sd = _rvk_emu_xperm8_64(Rs1_sd, Rs2_sd);
}});
0x14: decode RVTYPE {
0x0: xperm8_32({{
Rd_sw = _rvk_emu_xperm8_32(Rs1_sw, Rs2_sw);
}});
0x1: xperm8_64({{
Rd_sd = _rvk_emu_xperm8_64(Rs1_sd, Rs2_sd);
}});
}
0x20: xnor({{
Rd = rvSext(~(Rs1 ^ Rs2));
}});