Browse Source

Accept Zba, Zbb, Zbc, Zbs ISA strings

The B extension still implies the presence of Zba/Zbb/Zbc/Zbs.
pull/721/head
Andrew Waterman 5 years ago
parent
commit
cb7805a968
  1. 2
      riscv/insns/add_uw.h
  2. 2
      riscv/insns/andn.h
  3. 2
      riscv/insns/bclr.h
  4. 2
      riscv/insns/bclri.h
  5. 2
      riscv/insns/bext.h
  6. 2
      riscv/insns/bexti.h
  7. 2
      riscv/insns/binv.h
  8. 2
      riscv/insns/binvi.h
  9. 2
      riscv/insns/bset.h
  10. 2
      riscv/insns/bseti.h
  11. 2
      riscv/insns/clmul.h
  12. 2
      riscv/insns/clmulh.h
  13. 2
      riscv/insns/clmulr.h
  14. 2
      riscv/insns/clz.h
  15. 2
      riscv/insns/clzw.h
  16. 2
      riscv/insns/cpop.h
  17. 2
      riscv/insns/cpopw.h
  18. 2
      riscv/insns/ctz.h
  19. 2
      riscv/insns/ctzw.h
  20. 7
      riscv/insns/gorci.h
  21. 7
      riscv/insns/grevi.h
  22. 2
      riscv/insns/max.h
  23. 2
      riscv/insns/maxu.h
  24. 2
      riscv/insns/min.h
  25. 2
      riscv/insns/minu.h
  26. 2
      riscv/insns/orn.h
  27. 7
      riscv/insns/pack.h
  28. 7
      riscv/insns/packw.h
  29. 2
      riscv/insns/rol.h
  30. 2
      riscv/insns/rolw.h
  31. 2
      riscv/insns/ror.h
  32. 2
      riscv/insns/rori.h
  33. 2
      riscv/insns/roriw.h
  34. 2
      riscv/insns/rorw.h
  35. 2
      riscv/insns/sext_b.h
  36. 2
      riscv/insns/sext_h.h
  37. 2
      riscv/insns/sh1add.h
  38. 2
      riscv/insns/sh1add_uw.h
  39. 2
      riscv/insns/sh2add.h
  40. 2
      riscv/insns/sh2add_uw.h
  41. 2
      riscv/insns/sh3add.h
  42. 2
      riscv/insns/sh3add_uw.h
  43. 2
      riscv/insns/slli_uw.h
  44. 2
      riscv/insns/xnor.h
  45. 16
      riscv/processor.cc
  46. 6
      riscv/processor.h

2
riscv/insns/add_uw.h

@ -1,3 +1,3 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen(zext32(RS1) + RS2));

2
riscv/insns/andn.h

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

2
riscv/insns/bclr.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = RS2 & (xlen-1);
WRITE_RD(sext_xlen(RS1 & ~(1LL << shamt)));

2
riscv/insns/bclri.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = SHAMT & (xlen-1);
WRITE_RD(sext_xlen(RS1 & ~(1LL << shamt)));

2
riscv/insns/bext.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = RS2 & (xlen-1);
WRITE_RD(sext_xlen(1 & (RS1 >> shamt)));

2
riscv/insns/bexti.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = SHAMT & (xlen-1);
WRITE_RD(sext_xlen(1 & (RS1 >> shamt)));

2
riscv/insns/binv.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = RS2 & (xlen-1);
WRITE_RD(sext_xlen(RS1 ^ (1LL << shamt)));

2
riscv/insns/binvi.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = SHAMT & (xlen-1);
WRITE_RD(sext_xlen(RS1 ^ (1LL << shamt)));

2
riscv/insns/bset.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = RS2 & (xlen-1);
WRITE_RD(sext_xlen(RS1 | (1LL << shamt)));

2
riscv/insns/bseti.h

@ -1,3 +1,3 @@
require_extension('B');
require_extension(EXT_ZBS);
int shamt = SHAMT & (xlen-1);
WRITE_RD(sext_xlen(RS1 | (1LL << shamt)));

2
riscv/insns/clmul.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBC);
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('B');
require_extension(EXT_ZBC);
reg_t a = zext_xlen(RS1), b = zext_xlen(RS2), x = 0;
for (int i = 1; i < xlen; i++)
if ((b >> i) & 1)

2
riscv/insns/clmulr.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBC);
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/clz.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = xlen;
for (int i = 0; i < xlen; i++)
if (1 & (RS1 >> (xlen-i-1))) { x = i; break; }

2
riscv/insns/clzw.h

@ -1,5 +1,5 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = 32;
for (int i = 0; i < 32; i++)
if (1 & (RS1 >> (31-i))) { x = i; break; }

2
riscv/insns/cpop.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = 0;
for (int i = 0; i < xlen; i++)
if (1 & (RS1 >> i)) x++;

2
riscv/insns/cpopw.h

@ -1,5 +1,5 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = 0;
for (int i = 0; i < 32; i++)
if (1 & (RS1 >> i)) x++;

2
riscv/insns/ctz.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = xlen;
for (int i = 0; i < xlen; i++)
if (1 & (RS1 >> i)) { x = i; break; }

2
riscv/insns/ctzw.h

@ -1,5 +1,5 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBB);
reg_t x = 32;
for (int i = 0; i < 32; i++)
if (1 & (RS1 >> i)) { x = i; break; }

7
riscv/insns/gorci.h

@ -1,4 +1,9 @@
require_extension('B');
// Zbb contains orc.b but not general gorci
if (SHAMT == 7)
require_extension(EXT_ZBB);
else
require_extension('B');
require(SHAMT < xlen);
reg_t x = RS1;
int shamt = SHAMT;

7
riscv/insns/grevi.h

@ -1,4 +1,9 @@
require_extension('B');
// Zbb contains rev8 but not general grevi
if (SHAMT == xlen - 8)
require_extension(EXT_ZBB);
else
require_extension('B');
require(SHAMT < xlen);
reg_t x = RS1;
int shamt = SHAMT;

2
riscv/insns/max.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD(sext_xlen(sreg_t(RS1) > sreg_t(RS2) ? RS1 : RS2));

2
riscv/insns/maxu.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD(sext_xlen(RS1 > RS2 ? RS1 : RS2));

2
riscv/insns/min.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD(sext_xlen(sreg_t(RS1) < sreg_t(RS2) ? RS1 : RS2));

2
riscv/insns/minu.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD(sext_xlen(RS1 < RS2 ? RS1 : RS2));

2
riscv/insns/orn.h

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

7
riscv/insns/pack.h

@ -1,4 +1,9 @@
require_extension('B');
// RV32Zbb contains zext.h but not general pack
if (insn.rs2() == 0 && xlen == 32)
require_extension(EXT_ZBB);
else
require_extension('B');
reg_t lo = zext_xlen(RS1 << (xlen/2)) >> (xlen/2);
reg_t hi = zext_xlen(RS2 << (xlen/2));
WRITE_RD(sext_xlen(lo | hi));

7
riscv/insns/packw.h

@ -1,5 +1,10 @@
// RV64Zbb contains zext.h but not general packw
if (insn.rs2() == 0)
require_extension(EXT_ZBB);
else
require_extension('B');
require_rv64;
require_extension('B');
reg_t lo = zext32(RS1 << 16) >> 16;
reg_t hi = zext32(RS2 << 16);
WRITE_RD(sext32(lo | hi));

2
riscv/insns/rol.h

@ -1,4 +1,4 @@
require_extension('B');
require_extension(EXT_ZBB);
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('B');
require_extension(EXT_ZBB);
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('B');
require_extension(EXT_ZBB);
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('B');
require_extension(EXT_ZBB);
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('B');
require_extension(EXT_ZBB);
require(SHAMT < 32);
int shamt = SHAMT & 31;
int rshamt = -shamt & 31;

2
riscv/insns/rorw.h

@ -1,5 +1,5 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBB);
int shamt = RS2 & 31;
int rshamt = -shamt & 31;
WRITE_RD(sext32((RS1 << rshamt) | (zext32(RS1) >> shamt)));

2
riscv/insns/sext_b.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD((sreg_t)(int8_t)(RS1));

2
riscv/insns/sext_h.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBB);
WRITE_RD((sreg_t)(int16_t)(RS1));

2
riscv/insns/sh1add.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((RS1 << 1) + RS2));

2
riscv/insns/sh1add_uw.h

@ -1,3 +1,3 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((zext32(RS1) << 1) + RS2));

2
riscv/insns/sh2add.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((RS1 << 2) + RS2));

2
riscv/insns/sh2add_uw.h

@ -1,3 +1,3 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((zext32(RS1) << 2) + RS2));

2
riscv/insns/sh3add.h

@ -1,2 +1,2 @@
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((RS1 << 3) + RS2));

2
riscv/insns/sh3add_uw.h

@ -1,3 +1,3 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen((zext32(RS1) << 3) + RS2));

2
riscv/insns/slli_uw.h

@ -1,3 +1,3 @@
require_rv64;
require_extension('B');
require_extension(EXT_ZBA);
WRITE_RD(sext_xlen(zext32(RS1) << SHAMT));

2
riscv/insns/xnor.h

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

16
riscv/processor.cc

@ -269,6 +269,14 @@ void processor_t::parse_isa_string(const char* str)
auto ext_str = std::string(ext, end - ext);
if (ext_str == "zfh") {
extension_table[EXT_ZFH] = true;
} else if (ext_str == "zba") {
extension_table[EXT_ZBA] = true;
} else if (ext_str == "zbb") {
extension_table[EXT_ZBB] = true;
} else if (ext_str == "zbc") {
extension_table[EXT_ZBC] = true;
} else if (ext_str == "zbs") {
extension_table[EXT_ZBS] = true;
} else {
sprintf(error_msg, "unsupported extension '%s'", ext_str.c_str());
bad_isa_string(str, error_msg);
@ -283,6 +291,14 @@ void processor_t::parse_isa_string(const char* str)
state.misa = max_isa;
if (supports_extension('B')) {
// B implies Zba, Zbb, Zbc, Zbs
extension_table[EXT_ZBA] = true;
extension_table[EXT_ZBB] = true;
extension_table[EXT_ZBC] = true;
extension_table[EXT_ZBS] = true;
}
if (!supports_extension('I'))
bad_isa_string(str, "'I' extension is required");

6
riscv/processor.h

@ -243,7 +243,11 @@ typedef enum {
typedef enum {
// 65('A') ~ 90('Z') is reserved for standard isa in misa
EXT_ZFH = 0,
EXT_ZFH,
EXT_ZBA,
EXT_ZBB,
EXT_ZBC,
EXT_ZBS,
} isa_extension_t;
typedef enum {

Loading…
Cancel
Save