diff options
Diffstat (limited to 'parse.c')
| -rw-r--r-- | parse.c | 245 |
1 files changed, 128 insertions, 117 deletions
@@ -19,7 +19,8 @@ internparsev(Parsev* p) const Parsev* interned; static const Parsev* cache[4096] = { 0 }; - idx = murmurhash64a((char*)p, sizeof(Parsev)) % sizeof(cache) / sizeof(cache[0]); + idx = murmurhash64a((char*)p, sizeof(Parsev)) % sizeof(cache) + / sizeof(cache[0]); interned = cache[idx]; if (interned && memcmp(p, interned, sizeof(Parsev)) == 0) return interned; @@ -103,150 +104,160 @@ needsmovabs(Imm* imm) return (maskedc != mask && maskedc != 0); } -#define OP(OPCODE) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_OP, .prefix = -1, .opcode = OPCODE, \ - } \ +#define OP(OPCODE) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_OP, .prefix = -1, \ + .opcode = OPCODE, \ + } \ } -#define OPREG(REX, PREFIX, OPCODE, REG, A1) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_OPREG, .prefix = PREFIX, .rex = (Rex)REX, \ - .fixedreg = REG, .opcode = OPCODE, .arg1 = internparsev(&A1) \ - } \ +#define OPREG(REX, PREFIX, OPCODE, REG, A1) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_OPREG, .prefix = PREFIX, \ + .rex = (Rex)REX, .fixedreg = REG, .opcode = OPCODE, \ + .arg1 = internparsev(&A1) \ + } \ } -#define OPMEM(REX, PREFIX, OPCODE, REG, A1) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_OPMEM, .prefix = PREFIX, .rex = (Rex)REX, \ - .fixedreg = REG, .opcode = OPCODE, .arg1 = internparsev(&A1) \ - } \ +#define OPMEM(REX, PREFIX, OPCODE, REG, A1) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_OPMEM, .prefix = PREFIX, \ + .rex = (Rex)REX, .fixedreg = REG, .opcode = OPCODE, \ + .arg1 = internparsev(&A1) \ + } \ } -#define R(REX, PREFIX, OPCODE, A1) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_R, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), \ - } \ +#define R(REX, PREFIX, OPCODE, A1) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_R, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + } \ } -#define IMM(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_IMM, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define IMM(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_IMM, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define RIMM(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_RIMM, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define RIMM(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_RIMM, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define IMMREG(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_IMMREG, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .fixedreg = IMMREG, .arg1 = internparsev(&A1), \ - .arg2 = internparsev(&A2) \ - } \ +#define IMMREG(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_IMMREG, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .fixedreg = IMMREG, \ + .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ + } \ } -#define IMMMEM(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_IMMMEM, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .fixedreg = IMMREG, .arg1 = internparsev(&A1), \ - .arg2 = internparsev(&A2) \ - } \ +#define IMMMEM(REX, PREFIX, OPCODE, IMMREG, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_IMMMEM, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .fixedreg = IMMREG, \ + .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ + } \ } -#define REGMEM(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_REGMEM, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define REGMEM(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_REGMEM, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define MEMREG(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_MEMREG, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define MEMREG(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_MEMREG, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define REGREG(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_REGREG, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define REGREG(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_REGREG, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define REGREG2(REX, PREFIX, OPCODE, A1, A2) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_REGREG2, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2) \ - } \ +#define REGREG2(REX, PREFIX, OPCODE, A1, A2) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_REGREG2, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2) \ + } \ } -#define IMMREGREG2(REX, PREFIX, OPCODE, A1, A2, A3) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_IMMREGREG2, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \ - .arg3 = internparsev(&A3) \ - } \ +#define IMMREGREG2(REX, PREFIX, OPCODE, A1, A2, A3) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_IMMREGREG2, \ + .prefix = PREFIX, .opcode = OPCODE, .rex = (Rex)REX, \ + .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \ + .arg3 = internparsev(&A3) \ + } \ } -#define IMMMEMREG(REX, PREFIX, OPCODE, A1, A2, A3) \ - (Parsev) \ - { \ - .instr = (Instr) \ - { \ - .kind = ASM_INSTR, .encoder = ENCODER_IMMMEMREG, .prefix = PREFIX, .opcode = OPCODE, \ - .rex = (Rex)REX, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \ - .arg3 = internparsev(&A3) \ - } \ +#define IMMMEMREG(REX, PREFIX, OPCODE, A1, A2, A3) \ + (Parsev) \ + { \ + .instr = (Instr) \ + { \ + .kind = ASM_INSTR, .encoder = ENCODER_IMMMEMREG, .prefix = PREFIX, \ + .opcode = OPCODE, .rex = (Rex)REX, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2), .arg3 = internparsev(&A3) \ + } \ } -#define REG(K) \ +#define REG(K) \ (Parsev) { .kind = ASM_##K } #define YYSTYPE Parsev |
