summary refs log tree commit diff
path: root/ops.h
blob: b6b148ae887c51d627847dd2c36fbcfb179ef437 (plain) (blame)
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#ifndef X /* amd64 */
	#define X(NMemArgs, SetsZeroFlag, LeavesFlags)
#endif

#ifndef V /* riscv64 */
	#define V(Imm)
#endif


#define T(a,b,c,d,e,f,g,h) {                          \
	{[Kw]=K##a, [Kl]=K##b, [Ks]=K##c, [Kd]=K##d}, \
	{[Kw]=K##e, [Kl]=K##f, [Ks]=K##g, [Kd]=K##h}  \
}


/*********************/
/* PUBLIC OPERATIONS */
/*********************/

/* Arithmetic and Bits */
O(add,     T(w,l,s,d, w,l,s,d), 1) X(2, 1, 0) V(1)
O(sub,     T(w,l,s,d, w,l,s,d), 1) X(2, 1, 0) V(0)
O(neg,     T(w,l,s,d, x,x,x,x), 1) X(1, 1, 0) V(0)
O(div,     T(w,l,s,d, w,l,s,d), 1) X(0, 0, 0) V(0)
O(rem,     T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
O(udiv,    T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
O(urem,    T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) V(0)
O(mul,     T(w,l,s,d, w,l,s,d), 1) X(2, 0, 0) V(0)
O(and,     T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
O(or,      T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
O(xor,     T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) V(1)
O(sar,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)
O(shr,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)
O(shl,     T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) V(1)

/* Comparisons */
O(ceqw,    T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(cnew,    T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(csgew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(csgtw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(cslew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(csltw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(1)
O(cugew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(cugtw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(culew,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(0)
O(cultw,   T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) V(1)

O(ceql,    T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(cnel,    T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(csgel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(csgtl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(cslel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(csltl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(1)
O(cugel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(cugtl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(culel,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(0)
O(cultl,   T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) V(1)

O(ceqs,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cges,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cgts,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cles,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(clts,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cnes,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cos,     T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)
O(cuos,    T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) V(0)

O(ceqd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cged,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cgtd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cled,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cltd,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cned,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cod,     T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)
O(cuod,    T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) V(0)

/* Memory */
O(storeb,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
O(storeh,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
O(storew,  T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
O(storel,  T(l,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
O(stores,  T(s,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)
O(stored,  T(d,e,e,e, m,e,e,e), 0) X(0, 0, 1) V(0)

O(loadsb,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(loadub,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(loadsh,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(loaduh,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(loadsw,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(loaduw,  T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(load,    T(m,m,m,m, x,x,x,x), 0) X(0, 0, 1) V(0)

/* Extensions and Truncations */
O(extsb,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(extub,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(extsh,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(extuh,   T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(extsw,   T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) V(0)
O(extuw,   T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) V(0)

O(exts,    T(e,e,e,s, e,e,e,x), 1) X(0, 0, 1) V(0)
O(truncd,  T(e,e,d,e, e,e,x,e), 1) X(0, 0, 1) V(0)
O(stosi,   T(s,s,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(stoui,   T(s,s,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(dtosi,   T(d,d,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(dtoui,   T(d,d,e,e, x,x,e,e), 1) X(0, 0, 1) V(0)
O(swtof,   T(e,e,w,w, e,e,x,x), 1) X(0, 0, 1) V(0)
O(uwtof,   T(e,e,w,w, e,e,x,x), 1) X(0, 0, 1) V(0)
O(sltof,   T(e,e,l,l, e,e,x,x), 1) X(0, 0, 1) V(0)
O(ultof,   T(e,e,l,l, e,e,x,x), 1) X(0, 0, 1) V(0)
O(cast,    T(s,d,w,l, x,x,x,x), 1) X(0, 0, 1) V(0)

/* Stack Allocation */
O(alloc4,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(alloc8,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(alloc16, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)

/* Variadic Function Helpers */
O(vaarg,   T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) V(0)
O(vastart, T(m,e,e,e, x,e,e,e), 0) X(0, 0, 0) V(0)

O(copy,    T(w,l,s,d, x,x,x,x), 0) X(0, 0, 1) V(0)

/* Debug */
O(dbgloc,  T(w,l,s,d, x,x,x,x), 0) X(0, 0, 1) V(0)

/****************************************/
/* INTERNAL OPERATIONS (keep nop first) */
/****************************************/

/* Miscellaneous and Architecture-Specific Operations */
O(nop,     T(x,x,x,x, x,x,x,x), 0) X(0, 0, 1) V(0)
O(addr,    T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(blit0,   T(m,e,e,e, m,e,e,e), 0) X(0, 1, 0) V(0)
O(blit1,   T(w,e,e,e, x,e,e,e), 0) X(0, 1, 0) V(0)
O(swap,    T(w,l,s,d, w,l,s,d), 0) X(1, 0, 0) V(0)
O(sign,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)
O(salloc,  T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(xidiv,   T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) V(0)
O(xdiv,    T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) V(0)
O(xcmp,    T(w,l,s,d, w,l,s,d), 0) X(1, 1, 0) V(0)
O(xtest,   T(w,l,e,e, w,l,e,e), 0) X(1, 1, 0) V(0)
O(acmp,    T(w,l,e,e, w,l,e,e), 0) X(0, 0, 0) V(0)
O(acmn,    T(w,l,e,e, w,l,e,e), 0) X(0, 0, 0) V(0)
O(afcmp,   T(e,e,s,d, e,e,s,d), 0) X(0, 0, 0) V(0)
O(reqz,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)
O(rnez,    T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) V(0)

/* Arguments, Parameters, and Calls */
O(par,     T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(parsb,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(parub,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(parsh,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(paruh,   T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(parc,    T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(pare,    T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(arg,     T(w,l,s,d, x,x,x,x), 0) X(0, 0, 0) V(0)
O(argsb,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
O(argub,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
O(argsh,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
O(arguh,   T(w,e,e,e, x,x,x,x), 0) X(0, 0, 0) V(0)
O(argc,    T(e,x,e,e, e,l,e,e), 0) X(0, 0, 0) V(0)
O(arge,    T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) V(0)
O(argv,    T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) V(0)
O(call,    T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) V(0)

/* Flags Setting */
O(flagieq,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagine,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagisge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagisgt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagisle, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagislt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagiuge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagiugt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagiule, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagiult, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfeq,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfge,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfgt,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfle,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagflt,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfne,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfo,   T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)
O(flagfuo,  T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) V(0)


#undef T
#undef X
#undef V
#undef O

/*
| column -t -o ' '
*/