From 7fe7ba8419df6a00aa8512fb5cf7e3897ffe03fc Mon Sep 17 00:00:00 2001 From: marcfedorow Date: Tue, 14 Sep 2021 13:34:24 +0300 Subject: [PATCH] Added insn overlapping (bitmanip / krypto) (#801) --- riscv/insns/andn.h | 2 +- riscv/insns/clmul.h | 2 +- riscv/insns/clmulh.h | 2 +- riscv/insns/gorci.h | 7 ++----- riscv/insns/grevi.h | 9 ++++----- riscv/insns/orn.h | 2 +- riscv/insns/pack.h | 9 ++++----- riscv/insns/packh.h | 2 +- riscv/insns/packw.h | 9 ++++----- riscv/insns/rol.h | 2 +- riscv/insns/rolw.h | 2 +- riscv/insns/ror.h | 2 +- riscv/insns/rori.h | 2 +- riscv/insns/roriw.h | 2 +- riscv/insns/rorw.h | 2 +- riscv/insns/shfli.h | 4 +++- riscv/insns/unshfli.h | 4 +++- riscv/insns/xnor.h | 2 +- riscv/insns/xperm_b.h | 2 +- riscv/insns/xperm_n.h | 2 +- 20 files changed, 34 insertions(+), 36 deletions(-) diff --git a/riscv/insns/andn.h b/riscv/insns/andn.h index cb544cc9..8add1919 100644 --- a/riscv/insns/andn.h +++ b/riscv/insns/andn.h @@ -1,2 +1,2 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); WRITE_RD(RS1 & ~RS2); diff --git a/riscv/insns/clmul.h b/riscv/insns/clmul.h index 7299f69d..b8e6d6d4 100644 --- a/riscv/insns/clmul.h +++ b/riscv/insns/clmul.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZBC); +require_either_extension(EXT_ZBC, EXT_ZBKC); reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0; for (int i = 0; i < xlen; i++) if ((b >> i) & 1) diff --git a/riscv/insns/clmulh.h b/riscv/insns/clmulh.h index dbc5ac9c..dfee94e2 100644 --- a/riscv/insns/clmulh.h +++ b/riscv/insns/clmulh.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZBC); +require_either_extension(EXT_ZBC, EXT_ZBKC); reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0; for (int i = 1; i < xlen; i++) if ((b >> i) & 1) diff --git a/riscv/insns/gorci.h b/riscv/insns/gorci.h index b2e8fe85..30575f70 100644 --- a/riscv/insns/gorci.h +++ b/riscv/insns/gorci.h @@ -1,9 +1,6 @@ // Zbb contains orc.b but not general gorci -if (SHAMT == 7) - require_extension(EXT_ZBB); -else - require_extension(EXT_XBITMANIP); - +require(((SHAMT == 7) && p->extension_enabled(EXT_ZBB)) + || p->extension_enabled(EXT_XBITMANIP)); require(SHAMT < xlen); reg_t x = RS1; int shamt = SHAMT; diff --git a/riscv/insns/grevi.h b/riscv/insns/grevi.h index c225176a..79374fa2 100644 --- a/riscv/insns/grevi.h +++ b/riscv/insns/grevi.h @@ -1,9 +1,8 @@ // Zbb contains rev8 but not general grevi -if (SHAMT == xlen - 8) - require_extension(EXT_ZBB); -else - require_extension(EXT_XBITMANIP); - +// Zbkb contains rev8 and brev8 (a.k.a. rev.b) but not general grevi +require(((SHAMT == xlen - 8) && (p->extension_enabled(EXT_ZBB) || p->extension_enabled(EXT_ZBKB))) + || ((SHAMT == 8) && p->extension_enabled(EXT_ZBKB)) + || p->extension_enabled(EXT_XBITMANIP)); require(SHAMT < xlen); reg_t x = RS1; int shamt = SHAMT; diff --git a/riscv/insns/orn.h b/riscv/insns/orn.h index 1421ff8d..c1c9fd4d 100644 --- a/riscv/insns/orn.h +++ b/riscv/insns/orn.h @@ -1,2 +1,2 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); WRITE_RD(RS1 | ~RS2); diff --git a/riscv/insns/pack.h b/riscv/insns/pack.h index c567f739..2b09e7ed 100644 --- a/riscv/insns/pack.h +++ b/riscv/insns/pack.h @@ -1,9 +1,8 @@ // RV32Zbb contains zext.h but not general pack -if (insn.rs2() == 0 && xlen == 32) - require_extension(EXT_ZBB); -else - require_extension(EXT_XBITMANIP); - +require(((xlen == 32) && (insn.rs2() == 0) && p->extension_enabled(EXT_ZBB)) + || p->extension_enabled(EXT_ZBKB) + || p->extension_enabled(EXT_XBITMANIP)); +require(SHAMT < (xlen/2)); reg_t lo = zext_xlen(RS1 << (xlen/2)) >> (xlen/2); reg_t hi = zext_xlen(RS2 << (xlen/2)); WRITE_RD(sext_xlen(lo | hi)); diff --git a/riscv/insns/packh.h b/riscv/insns/packh.h index 4198d24f..b5bb7042 100644 --- a/riscv/insns/packh.h +++ b/riscv/insns/packh.h @@ -1,4 +1,4 @@ -require_extension(EXT_XBITMANIP); +require_either_extension(EXT_ZBKB, EXT_XBITMANIP); reg_t lo = zext_xlen(RS1 << (xlen-8)) >> (xlen-8); reg_t hi = zext_xlen(RS2 << (xlen-8)) >> (xlen-16); WRITE_RD(sext_xlen(lo | hi)); diff --git a/riscv/insns/packw.h b/riscv/insns/packw.h index 4cf2c124..520650a1 100644 --- a/riscv/insns/packw.h +++ b/riscv/insns/packw.h @@ -1,9 +1,8 @@ // RV64Zbb contains zext.h but not general packw -if (insn.rs2() == 0) - require_extension(EXT_ZBB); -else - require_extension(EXT_XBITMANIP); - +require(((insn.rs2() == 0) && p->extension_enabled(EXT_ZBB)) + || p->extension_enabled(EXT_ZBKB) + || p->extension_enabled(EXT_XBITMANIP)); +require(SHAMT < (xlen/2)); require_rv64; reg_t lo = zext32(RS1 << 16) >> 16; reg_t hi = zext32(RS2 << 16); diff --git a/riscv/insns/rol.h b/riscv/insns/rol.h index a86447df..07735a1b 100644 --- a/riscv/insns/rol.h +++ b/riscv/insns/rol.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); int shamt = RS2 & (xlen-1); int rshamt = -shamt & (xlen-1); WRITE_RD(sext_xlen((RS1 << shamt) | (zext_xlen(RS1) >> rshamt))); diff --git a/riscv/insns/rolw.h b/riscv/insns/rolw.h index f5d365b6..4d5eeb19 100644 --- a/riscv/insns/rolw.h +++ b/riscv/insns/rolw.h @@ -1,5 +1,5 @@ require_rv64; -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); int shamt = RS2 & 31; int rshamt = -shamt & 31; WRITE_RD(sext32((RS1 << shamt) | (zext32(RS1) >> rshamt))); diff --git a/riscv/insns/ror.h b/riscv/insns/ror.h index 925e1446..61b5ff8f 100644 --- a/riscv/insns/ror.h +++ b/riscv/insns/ror.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); int shamt = RS2 & (xlen-1); int rshamt = -shamt & (xlen-1); WRITE_RD(sext_xlen((RS1 << rshamt) | (zext_xlen(RS1) >> shamt))); diff --git a/riscv/insns/rori.h b/riscv/insns/rori.h index 408ed50e..6585b60f 100644 --- a/riscv/insns/rori.h +++ b/riscv/insns/rori.h @@ -1,4 +1,4 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); require(SHAMT < xlen); int shamt = SHAMT & (xlen-1); int rshamt = -shamt & (xlen-1); diff --git a/riscv/insns/roriw.h b/riscv/insns/roriw.h index 35df883a..331d2264 100644 --- a/riscv/insns/roriw.h +++ b/riscv/insns/roriw.h @@ -1,5 +1,5 @@ require_rv64; -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); require(SHAMT < 32); int shamt = SHAMT & 31; int rshamt = -shamt & 31; diff --git a/riscv/insns/rorw.h b/riscv/insns/rorw.h index 53e98b23..65f0078c 100644 --- a/riscv/insns/rorw.h +++ b/riscv/insns/rorw.h @@ -1,5 +1,5 @@ require_rv64; -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); int shamt = RS2 & 31; int rshamt = -shamt & 31; WRITE_RD(sext32((RS1 << rshamt) | (zext32(RS1) >> shamt))); diff --git a/riscv/insns/shfli.h b/riscv/insns/shfli.h index e24f1bc0..75bcff2c 100644 --- a/riscv/insns/shfli.h +++ b/riscv/insns/shfli.h @@ -1,4 +1,6 @@ -require_extension(EXT_XBITMANIP); +// Zbkb contains zip but not general packw +require(((insn.rs2() == (xlen / 2 - 1)) && p->extension_enabled(EXT_ZBKB)) + || p->extension_enabled(EXT_XBITMANIP)); require(SHAMT < (xlen/2)); reg_t x = RS1; int shamt = SHAMT & ((xlen-1) >> 1); diff --git a/riscv/insns/unshfli.h b/riscv/insns/unshfli.h index 2c8c5f96..966e5006 100644 --- a/riscv/insns/unshfli.h +++ b/riscv/insns/unshfli.h @@ -1,4 +1,6 @@ -require_extension(EXT_XBITMANIP); +// Zbkb contains unzip but not general packw +require(((insn.rs2() == (xlen / 2 - 1)) && p->extension_enabled(EXT_ZBKB)) + || p->extension_enabled(EXT_XBITMANIP)); require(SHAMT < (xlen/2)); reg_t x = RS1; int shamt = SHAMT & ((xlen-1) >> 1); diff --git a/riscv/insns/xnor.h b/riscv/insns/xnor.h index a7a89baf..ccf1c9f7 100644 --- a/riscv/insns/xnor.h +++ b/riscv/insns/xnor.h @@ -1,2 +1,2 @@ -require_extension(EXT_ZBB); +require_either_extension(EXT_ZBB, EXT_ZBKB); WRITE_RD(RS1 ^ ~RS2); diff --git a/riscv/insns/xperm_b.h b/riscv/insns/xperm_b.h index 37036ff6..c0bd0587 100644 --- a/riscv/insns/xperm_b.h +++ b/riscv/insns/xperm_b.h @@ -1,2 +1,2 @@ -require_extension(EXT_XBITMANIP); +require_either_extension(EXT_ZBKX, EXT_XBITMANIP); WRITE_RD(sext_xlen(xperm(RS1, RS2, 3, xlen))); diff --git a/riscv/insns/xperm_n.h b/riscv/insns/xperm_n.h index f42537ee..dab6c4a4 100644 --- a/riscv/insns/xperm_n.h +++ b/riscv/insns/xperm_n.h @@ -1,2 +1,2 @@ -require_extension(EXT_XBITMANIP); +require_either_extension(EXT_ZBKX, EXT_XBITMANIP); WRITE_RD(sext_xlen(xperm(RS1, RS2, 2, xlen)));