summaryrefslogtreecommitdiff
path: root/arch/v1/arch_spec.h
diff options
context:
space:
mode:
authorPaul Oliver <contact@pauloliver.dev>2026-07-14 17:29:02 +0200
committerPaul Oliver <contact@pauloliver.dev>2026-08-30 16:24:48 +0200
commit1961b4b237083f4cfac9ca6b249c1d6cb665d149 (patch)
treefd9fc8260360e2ac30be9747ca558bcfc824a4c4 /arch/v1/arch_spec.h
Initial (refactor)HEADmaster
Diffstat (limited to 'arch/v1/arch_spec.h')
-rw-r--r--arch/v1/arch_spec.h140
1 files changed, 140 insertions, 0 deletions
diff --git a/arch/v1/arch_spec.h b/arch/v1/arch_spec.h
new file mode 100644
index 0000000..a904206
--- /dev/null
+++ b/arch/v1/arch_spec.h
@@ -0,0 +1,140 @@
+// file : arch/v1/arch_spec.h
+// project : Salis-VM
+// author : Paul Oliver <contact@pauloliver.dev>
+
+#pragma once
+
+// index:
+// [section] arch-specific core fields
+// [section] arch-specific process fields
+// [section] instruction set
+// [section] instruction enum
+
+// V1 has 64 instructions - 1 unused bit
+#define ARCH_SPEC_INST_BITS 6
+
+// ----------------------------------------------------------------------------
+// [section] arch-specific core fields
+// ----------------------------------------------------------------------------
+#define ARCH_SPEC_CORE_FIELDS \
+ ARCH_SPEC_CORE_FIELD(thrd_t, ipop_thrd) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, ipop[ARCH_INST_COUNT]) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, iexe[ARCH_INST_COUNT]) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, iwrt[ARCH_INST_COUNT]) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, wmb0) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, wmb1) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, wdea) \
+ ARCH_SPEC_CORE_FIELD(uint64_t, hlts) \
+ ARCH_SPEC_CORE_FIELD(struct EventArray, weva) \
+ ARCH_SPEC_CORE_FIELD(struct EventArray, xeva)
+
+// ----------------------------------------------------------------------------
+// [section] arch-specific process fields
+// ----------------------------------------------------------------------------
+#define ARCH_SPEC_PROC_FIELDS \
+ ARCH_SPEC_PROC_FIELD(uint64_t, ip) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, sp) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, mb0a) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, mb0s) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, mb1a) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, mb1s) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, r0x) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, r1x) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, r2x) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, r3x) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s0) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s1) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s2) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s3) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s4) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s5) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s6) \
+ ARCH_SPEC_PROC_FIELD(uint64_t, s7)
+
+// ----------------------------------------------------------------------------
+// [section] instruction set
+// ----------------------------------------------------------------------------
+// Extra core argument allows calling macro recursively
+// within calls to FOR_CORES. See arch_push_data_header in arch/v1/arch.c
+// for an example of what I mean.
+#define ARCH_SPEC_INST_SET(core) \
+ ARCH_SPEC_INST(noop, L'⢀', core) \
+ ARCH_SPEC_INST(nop0, L'0', core) \
+ ARCH_SPEC_INST(nop1, L'1', core) \
+ ARCH_SPEC_INST(nop2, L'2', core) \
+ ARCH_SPEC_INST(nop3, L'3', core) \
+ \
+ ARCH_SPEC_INST(jmpb, L'❨', core) \
+ ARCH_SPEC_INST(jmpf, L'❩', core) \
+ ARCH_SPEC_INST(adrb, L'⟦', core) \
+ ARCH_SPEC_INST(adrf, L'⟧', core) \
+ ARCH_SPEC_INST(malb, L'❴', core) \
+ ARCH_SPEC_INST(malf, L'❵', core) \
+ \
+ ARCH_SPEC_INST(ifnz, L'?', core) \
+ ARCH_SPEC_INST(bswp, L'%', core) \
+ ARCH_SPEC_INST(bclr, L'∅', core) \
+ ARCH_SPEC_INST(bspl, L'$', core) \
+ \
+ ARCH_SPEC_INST(addn, L'+', core) \
+ ARCH_SPEC_INST(subn, L'−', core) \
+ ARCH_SPEC_INST(muln, L'×', core) \
+ ARCH_SPEC_INST(divn, L'/', core) \
+ ARCH_SPEC_INST(incn, L'△', core) \
+ ARCH_SPEC_INST(decn, L'▽', core) \
+ ARCH_SPEC_INST(notn, L'¬', core) \
+ ARCH_SPEC_INST(shfl, L'«', core) \
+ ARCH_SPEC_INST(shfr, L'»', core) \
+ ARCH_SPEC_INST(zero, L'z', core) \
+ ARCH_SPEC_INST(unit, L'u', core) \
+ \
+ ARCH_SPEC_INST(rloa, L'↓', core) \
+ ARCH_SPEC_INST(rwrt, L'↑', core) \
+ ARCH_SPEC_INST(rdup, L':', core) \
+ ARCH_SPEC_INST(rswp, L'↔', core) \
+ ARCH_SPEC_INST(rpsh, L'↥', core) \
+ ARCH_SPEC_INST(rpop, L'↧', core) \
+ \
+ ARCH_SPEC_INST(keya, L'a', core) \
+ ARCH_SPEC_INST(keyb, L'b', core) \
+ ARCH_SPEC_INST(keyc, L'c', core) \
+ ARCH_SPEC_INST(keyd, L'd', core) \
+ ARCH_SPEC_INST(keye, L'e', core) \
+ ARCH_SPEC_INST(keyf, L'f', core) \
+ ARCH_SPEC_INST(keyg, L'g', core) \
+ ARCH_SPEC_INST(keyh, L'h', core) \
+ ARCH_SPEC_INST(keyi, L'i', core) \
+ ARCH_SPEC_INST(keyj, L'j', core) \
+ ARCH_SPEC_INST(keyk, L'k', core) \
+ ARCH_SPEC_INST(keyl, L'l', core) \
+ ARCH_SPEC_INST(keym, L'm', core) \
+ ARCH_SPEC_INST(keyn, L'n', core) \
+ ARCH_SPEC_INST(keyo, L'o', core) \
+ ARCH_SPEC_INST(keyp, L'p', core) \
+ \
+ ARCH_SPEC_INST(loka, L'A', core) \
+ ARCH_SPEC_INST(lokb, L'B', core) \
+ ARCH_SPEC_INST(lokc, L'C', core) \
+ ARCH_SPEC_INST(lokd, L'D', core) \
+ ARCH_SPEC_INST(loke, L'E', core) \
+ ARCH_SPEC_INST(lokf, L'F', core) \
+ ARCH_SPEC_INST(lokg, L'G', core) \
+ ARCH_SPEC_INST(lokh, L'H', core) \
+ ARCH_SPEC_INST(loki, L'I', core) \
+ ARCH_SPEC_INST(lokj, L'J', core) \
+ ARCH_SPEC_INST(lokk, L'K', core) \
+ ARCH_SPEC_INST(lokl, L'L', core) \
+ ARCH_SPEC_INST(lokm, L'M', core) \
+ ARCH_SPEC_INST(lokn, L'N', core) \
+ ARCH_SPEC_INST(loko, L'O', core) \
+ ARCH_SPEC_INST(lokp, L'P', core)
+
+// ----------------------------------------------------------------------------
+// [section] instruction enum
+// ----------------------------------------------------------------------------
+enum {
+#define ARCH_SPEC_INST(label, symbol, core) label,
+ ARCH_SPEC_INST_SET(core)
+#undef ARCH_SPEC_INST
+ inst_enum_count,
+};