aboutsummaryrefslogtreecommitdiff
path: root/parse.c
diff options
context:
space:
mode:
Diffstat (limited to 'parse.c')
-rw-r--r--parse.c245
1 files changed, 128 insertions, 117 deletions
diff --git a/parse.c b/parse.c
index 3e60b62..3137447 100644
--- a/parse.c
+++ b/parse.c
@@ -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