// file : arch/v1/arch_spec.h // project : Salis-VM // author : Paul Oliver #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, };