aboutsummaryrefslogtreecommitdiff
path: root/parse_opcodes
diff options
context:
space:
mode:
authorBen Marshall <ben.marshall@bristol.ac.uk>2021-02-19 10:02:53 +0000
committerBen Marshall <ben.marshall@bristol.ac.uk>2021-02-19 10:02:53 +0000
commit9b802ad797cab9584c1fbdeeb9866eae92fa07e3 (patch)
tree4bce097e817967d52b8e2962486ad151b3fb2ead /parse_opcodes
parent03be826f17faedcaee7f60223f402850e254df0a (diff)
downloadriscv-opcodes-9b802ad797cab9584c1fbdeeb9866eae92fa07e3.zip
riscv-opcodes-9b802ad797cab9584c1fbdeeb9866eae92fa07e3.tar.gz
riscv-opcodes-9b802ad797cab9584c1fbdeeb9866eae92fa07e3.tar.bz2
scalar-crypto: Add opcodes for RV32K, RV64K
- Adds opcodes for RV32 and RV64 scalar crypto. - opcodes-rvk contains encodings which are for RV32 and RV64 base ISAs - opcodes-rv32/64k contains encodings which are for RV32 or RV64 - parse_opcodes has been modified: - Wnable instructions to be listed as either RV32 or RV64 only, allowing these opcodes to overlap. - The C backend has been modifed to emit the "DECLARE_RV32_ONLY" or "DECLARE_RV64_ONLY" macros as needed. - The other backends have not been modified, and may need to be in the future. On branch scalar-crypto Changes to be committed: modified: Makefile new file: opcodes-rv32k new file: opcodes-rv64k new file: opcodes-rvk modified: parse_opcodes
Diffstat (limited to 'parse_opcodes')
-rwxr-xr-xparse_opcodes73
1 files changed, 71 insertions, 2 deletions
diff --git a/parse_opcodes b/parse_opcodes
index 1118e18..52d069a 100755
--- a/parse_opcodes
+++ b/parse_opcodes
@@ -16,6 +16,7 @@ arguments = {}
arglut = {}
arglut['rd'] = (11,7)
+arglut['rt'] = (19,15) # source+dest register address. Overlaps rs1.
arglut['rs1'] = (19,15)
arglut['rs2'] = (24,20)
arglut['rs3'] = (31,27)
@@ -35,6 +36,8 @@ arglut['bimm12lo'] = (11,7)
arglut['zimm'] = (19,15)
arglut['shamt'] = (25,20)
arglut['shamtw'] = (24,20)
+arglut['bs'] = (31,30) # byte select for RV32K AES
+arglut['rcon'] = (23,20) # round constant for RV64 AES
# for vectors
arglut['vd'] = (11,7)
@@ -48,7 +51,54 @@ arglut['nf'] = (31,29)
arglut['simm5'] = (19,15)
arglut['zimm11'] = (30,20)
+#
+# These lists allow instructions which only appear in either the RV32 or
+# RV64 base architectures to overlap their opcodes.
+
+# Instructions which are _only_ in RV32
+rv32_only = [
+ "aes32esmi",
+ "aes32esi",
+ "aes32dsmi",
+ "aes32dsi",
+ "sha512sum0r",
+ "sha512sum1r",
+ "sha512sig0l",
+ "sha512sig0h",
+ "sha512sig1l",
+ "sha512sig1h"
+]
+
+# Instructions which are _only_ in RV64
+rv64_only = [
+ "aes64ks1i",
+ "aes64im",
+ "aes64ks2",
+ "aes64esm",
+ "aes64es",
+ "aes64dsm",
+ "aes64ds",
+ "sha512sum0",
+ "sha512sum1",
+ "sha512sig0",
+ "sha512sig1"
+]
+# Check rv32_only and rv64_only don't have shared elements.
+for a in rv32_only:
+ assert (not a in rv64_only), ("Instruction '%s' marked as both RV32 only, and RV64 only." % a)
+
+def different_base_isa(name1, name2):
+ """
+ Check if the two supplied instructions are mutually exclusive on
+ the base ISA they depend on. That is, they can never both be decoded
+ under the same XLEN.
+ """
+ return (name1 in rv32_only) and (name2 in rv64_only) or \
+ (name2 in rv32_only) and (name1 in rv64_only)
+
+#
+# Trap cause codes
causes = [
(0x00, 'misaligned fetch'),
(0x01, 'fetch access'),
@@ -295,6 +345,9 @@ csrs = [
(0xF12, 'marchid'),
(0xF13, 'mimpid'),
(0xF14, 'mhartid'),
+ (0xF15, 'mentropy'), # crypto ext
+
+ (0x7A9, 'mnoise'),
]
csrs32 = [
@@ -397,7 +450,18 @@ def make_c(match,mask):
for name in namelist:
name2 = name.replace('.','_')
print('DECLARE_INSN(%s, MATCH_%s, MASK_%s)' % (name2, name2.upper(), name2.upper()))
- print('#endif')
+ print("#ifdef DECLARE_RV32_ONLY")
+ for name in namelist:
+ if name in rv32_only:
+ print("DECLARE_RV32_ONLY(%s)" % name)
+ print("#endif") #ifdef DECLARE_RV32_ONLY
+
+ print("#ifdef DECLARE_RV64_ONLY")
+ for name in namelist:
+ if name in rv64_only:
+ print("DECLARE_RV64_ONLY(%s)" % name)
+ print("#endif") # #ifdef DECLARE_RV64_ONLY
+ print('#endif') # #ifdef DECLARE_INSN
print('#ifdef DECLARE_CSR')
for num, name in csrs+csrs32:
@@ -1100,7 +1164,12 @@ def parse_inputs(args):
else:
for name2,match2 in match.items():
if name2 not in pseudos and (match2 & mymask) == mymatch:
- sys.exit("%s and %s overlap" % (name,name2))
+ if(different_base_isa(name, name2)):
+ # The instructions cannot collide, as they exist under
+ # different base ISAs.
+ continue
+ else:
+ sys.exit("%s and %s overlap" % (name,name2))
mask[name] = mymask
match[name] = mymatch