diff options
Diffstat (limited to 'ops.h')
-rw-r--r-- | ops.h | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/ops.h b/ops.h new file mode 100644 index 0000000..9b357a5 --- /dev/null +++ b/ops.h @@ -0,0 +1,167 @@ +#ifndef X /* amd64 */ + #define X(NMemArgs, SetsZeroFlag, LeavesFlags) +#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) +O(sub, T(w,l,s,d, w,l,s,d), 1) X(2, 1, 0) +O(div, T(w,l,s,d, w,l,s,d), 1) X(0, 0, 0) +O(rem, T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) +O(udiv, T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) +O(urem, T(w,l,e,e, w,l,e,e), 1) X(0, 0, 0) +O(mul, T(w,l,s,d, w,l,s,d), 1) X(2, 0, 0) +O(and, T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) +O(or, T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) +O(xor, T(w,l,e,e, w,l,e,e), 1) X(2, 1, 0) +O(sar, T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) +O(shr, T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) +O(shl, T(w,l,e,e, w,w,e,e), 1) X(1, 1, 0) + +/* Comparisons */ +O(ceqw, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(cnew, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(csgew, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(csgtw, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(cslew, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(csltw, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(cugew, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(cugtw, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(culew, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) +O(cultw, T(w,w,e,e, w,w,e,e), 1) X(0, 1, 0) + +O(ceql, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(cnel, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(csgel, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(csgtl, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(cslel, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(csltl, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(cugel, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(cugtl, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(culel, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) +O(cultl, T(l,l,e,e, l,l,e,e), 1) X(0, 1, 0) + +O(ceqs, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cges, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cgts, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cles, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(clts, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cnes, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cos, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) +O(cuos, T(s,s,e,e, s,s,e,e), 1) X(0, 1, 0) + +O(ceqd, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cged, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cgtd, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cled, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cltd, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cned, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cod, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) +O(cuod, T(d,d,e,e, d,d,e,e), 1) X(0, 1, 0) + +/* Memory */ +O(storeb, T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) +O(storeh, T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) +O(storew, T(w,e,e,e, m,e,e,e), 0) X(0, 0, 1) +O(storel, T(l,e,e,e, m,e,e,e), 0) X(0, 0, 1) +O(stores, T(s,e,e,e, m,e,e,e), 0) X(0, 0, 1) +O(stored, T(d,e,e,e, m,e,e,e), 0) X(0, 0, 1) + +O(loadsb, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(loadub, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(loadsh, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(loaduh, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(loadsw, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(loaduw, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(load, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 1) + +/* Extensions and Truncations */ +O(extsb, T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) +O(extub, T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) +O(extsh, T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) +O(extuh, T(w,w,e,e, x,x,e,e), 1) X(0, 0, 1) +O(extsw, T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) +O(extuw, T(e,w,e,e, e,x,e,e), 1) X(0, 0, 1) + +O(exts, T(e,e,e,s, e,e,e,x), 1) X(0, 0, 1) +O(truncd, T(e,e,d,e, e,e,x,e), 1) X(0, 0, 1) +O(stosi, T(s,s,e,e, x,x,e,e), 1) X(0, 0, 1) +O(dtosi, T(d,d,e,e, x,x,e,e), 1) X(0, 0, 1) +O(swtof, T(e,e,w,w, e,e,x,x), 1) X(0, 0, 1) +O(sltof, T(e,e,l,l, e,e,x,x), 1) X(0, 0, 1) +O(cast, T(s,d,w,l, x,x,x,x), 1) X(0, 0, 1) + +/* Stack Allocation */ +O(alloc4, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) +O(alloc8, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) +O(alloc16, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) + +/* Variadic Function Helpers */ +O(vaarg, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) +O(vastart, T(m,e,e,e, x,e,e,e), 0) X(0, 0, 0) + +O(copy, T(w,l,s,d, x,x,x,x), 0) X(0, 0, 1) + + +/****************************************/ +/* 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) +O(addr, T(m,m,e,e, x,x,e,e), 0) X(0, 0, 1) +O(swap, T(w,l,s,d, w,l,s,d), 0) X(1, 0, 0) +O(sign, T(w,l,e,e, x,x,e,e), 0) X(0, 0, 0) +O(salloc, T(e,l,e,e, e,x,e,e), 0) X(0, 0, 0) +O(xidiv, T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) +O(xdiv, T(w,l,e,e, x,x,e,e), 0) X(1, 0, 0) +O(xcmp, T(w,l,s,d, w,l,s,d), 0) X(1, 1, 0) +O(xtest, T(w,l,e,e, w,l,e,e), 0) X(1, 1, 0) + +/* Arguments, Parameters, and Calls */ +O(par, T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) +O(parc, T(e,x,e,e, e,x,e,e), 0) X(0, 0, 0) +O(pare, T(x,x,x,x, x,x,x,x), 0) X(0, 0, 0) +O(arg, T(w,l,s,d, x,x,x,x), 0) X(0, 0, 0) +O(argc, T(e,x,e,e, e,l,e,e), 0) X(0, 0, 0) +O(arge, T(w,l,s,d, x,x,x,x), 0) X(0, 0, 0) +O(call, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) +O(vacall, T(m,m,m,m, x,x,x,x), 0) X(0, 0, 0) + +/* Flags Setting */ +O(flagieq, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagine, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagisge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagisgt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagisle, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagislt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagiuge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagiugt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagiule, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagiult, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfeq, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfge, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfgt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfle, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagflt, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfne, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfo, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) +O(flagfuo, T(x,x,e,e, x,x,e,e), 0) X(0, 0, 1) + + +#undef T +#undef X +#undef O + +/* +| column -t -o ' ' +*/ |