1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
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,
};
|