Browse Source

Added insn overlapping (bitmanip / krypto) (#801)

pull/802/head
marcfedorow 5 years ago
committed by GitHub
parent
commit
7fe7ba8419
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      riscv/insns/andn.h
  2. 2
      riscv/insns/clmul.h
  3. 2
      riscv/insns/clmulh.h
  4. 7
      riscv/insns/gorci.h
  5. 9
      riscv/insns/grevi.h
  6. 2
      riscv/insns/orn.h
  7. 9
      riscv/insns/pack.h
  8. 2
      riscv/insns/packh.h
  9. 9
      riscv/insns/packw.h
  10. 2
      riscv/insns/rol.h
  11. 2
      riscv/insns/rolw.h
  12. 2
      riscv/insns/ror.h
  13. 2
      riscv/insns/rori.h
  14. 2
      riscv/insns/roriw.h
  15. 2
      riscv/insns/rorw.h
  16. 4
      riscv/insns/shfli.h
  17. 4
      riscv/insns/unshfli.h
  18. 2
      riscv/insns/xnor.h
  19. 2
      riscv/insns/xperm_b.h
  20. 2
      riscv/insns/xperm_n.h

2
riscv/insns/andn.h

@ -1,2 +1,2 @@
require_extension(EXT_ZBB);
require_either_extension(EXT_ZBB, EXT_ZBKB);
WRITE_RD(RS1 & ~RS2);

2
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)

2
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)

7
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;

9
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;

2
riscv/insns/orn.h

@ -1,2 +1,2 @@
require_extension(EXT_ZBB);
require_either_extension(EXT_ZBB, EXT_ZBKB);
WRITE_RD(RS1 | ~RS2);

9
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));

2
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));

9
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);

2
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)));

2
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)));

2
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)));

2
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);

2
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;

2
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)));

4
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);

4
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);

2
riscv/insns/xnor.h

@ -1,2 +1,2 @@
require_extension(EXT_ZBB);
require_either_extension(EXT_ZBB, EXT_ZBKB);
WRITE_RD(RS1 ^ ~RS2);

2
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)));

2
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)));

Loading…
Cancel
Save