Mercurial > hg > Members > anatofuz > MoarVM
diff src/jit/expr_ops.h @ 0:2cf249471370
convert mercurial for git
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 08 May 2018 16:09:12 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/jit/expr_ops.h Tue May 08 16:09:12 2018 +0900 @@ -0,0 +1,73 @@ +/* This defines a macro that defines a list which will use a macro to + define a list. It's a little trick I've gained from the luajit + source code - the big advantage of course is that it keeps the list + consistent across multiple definitions. + + The first argument is the name, the second the number of children, the third + the number of parameters - together they define the size of the node. The + fourth argument defines the result type. This is strictly redundant for code + generation, although it is used by the template compiler. The fifth argument + determines how to generate a cast for mixed-sized oeprands. + + NB: This file is parsed by tools/expr_ops.pm *AND* included by + src/jit/expr.h, so keep it in order! +*/ +#define MVM_JIT_EXPR_OPS(_) \ + /* invalid operator */ \ + _(NOOP, 0, 0, VOID, NO_CAST), \ + /* memory access */ \ + _(LOAD, 1, 1, REG, NO_CAST), \ + _(STORE, 2, 1, VOID, NO_CAST), \ + _(CONST, 0, 2, REG, NO_CAST), \ + _(ADDR, 1, 1, REG, UNSIGNED), \ + _(IDX, 2, 1, REG, UNSIGNED), \ + _(COPY, 1, 0, REG, NO_CAST), \ + /* integer comparison */ \ + _(LT, 2, 0, FLAG, SIGNED), \ + _(LE, 2, 0, FLAG, SIGNED), \ + _(EQ, 2, 0, FLAG, SIGNED), \ + _(NE, 2, 0, FLAG, SIGNED), \ + _(GE, 2, 0, FLAG, SIGNED), \ + _(GT, 2, 0, FLAG, SIGNED), \ + _(NZ, 1, 0, FLAG, UNSIGNED), \ + _(ZR, 1, 0, FLAG, UNSIGNED), \ + /* flag value */ \ + _(FLAGVAL, 1, 0, REG, NO_CAST), \ + /* force compilation but discard result */ \ + _(DISCARD, 1, 0, VOID, NO_CAST), \ + /* type conversion */ \ + _(CAST, 1, 3, REG, NO_CAST), \ + /* integer arithmetic */ \ + _(ADD, 2, 0, REG, SIGNED), \ + _(SUB, 2, 0, REG, SIGNED), \ + /* binary operations */ \ + _(AND, 2, 0, REG, UNSIGNED), \ + _(OR, 2, 0, REG, UNSIGNED), \ + _(XOR, 2, 0, REG, UNSIGNED), \ + _(NOT, 1, 0, REG, UNSIGNED), \ + /* boolean logic */ \ + _(ALL, -1, 0, FLAG, NO_CAST), \ + _(ANY, -1, 0, FLAG, NO_CAST), \ + /* control operators */ \ + _(DO, -1, 0, REG, NO_CAST), \ + _(DOV, -1, 0, VOID, NO_CAST), \ + _(WHEN, 2, 0, VOID, NO_CAST), \ + _(IF, 3, 0, REG, NO_CAST), \ + _(IFV, 3, 0, VOID, NO_CAST), \ + _(BRANCH, 1, 0, VOID, NO_CAST), \ + _(LABEL, 0, 1, REG, NO_CAST), \ + _(MARK, 0, 1, VOID, NO_CAST), \ + /* call c functions */ \ + _(CALL, 2, 1, REG, NO_CAST), \ + _(CALLV, 2, 0, VOID, NO_CAST), \ + _(ARGLIST, -1, 0, C_ARGS, NO_CAST), \ + _(CARG, 1, 1, VOID, NO_CAST), \ + /* special constrol structures */ \ + _(GUARD, 1, 2, VOID, NO_CAST), \ + /* interpreter special variables */ \ + _(TC, 0, 0, REG, NO_CAST), \ + _(CU, 0, 0, REG, NO_CAST), \ + _(LOCAL, 0, 0, REG, NO_CAST), \ + _(STACK, 0, 0, REG, NO_CAST), \ + /* End of list marker */ \ + _(MAX_NODES, 0, 0, VOID, NO_CAST)