diff options
| -rw-r--r-- | asm.peg | 6 | ||||
| -rw-r--r-- | parse.c | 22 |
2 files changed, 15 insertions, 13 deletions
@@ -445,8 +445,8 @@ r64-or-rip = ( ) { $$ = r; } m = - d:value ws? sib:opt-scale-index-base { $$ = sib; $$.memarg.disp = d.value; } - | sib:scale-index-base { $$ = sib; } + d:value ws? sib:opt-scale-index-base { $$ = (Parsev){ .memarg=sib.memarg }; $$.memarg.disp = d.value; } + | sib:scale-index-base { $$ = (Parsev){ .memarg=sib.memarg }; } opt-scale-index-base = sib:scale-index-base { $$ = sib; } @@ -466,7 +466,7 @@ imm32 = i:imm { i.imm.nbytes = 4; $$ = i; } imm = '$' ws? val:value - { $$.imm = (Imm){ .kind = ASM_IMM, .v = val.value, .nbytes = 0}; } + { $$ = (Parsev) { .imm = (Imm){ .kind = ASM_IMM, .v = val.value, .nbytes = 0} }; } al = "%al" { $$ = REG(ASM_AL); } cl = "%cl" { $$ = REG(ASM_CL); } @@ -1,6 +1,6 @@ #include "minias.h" -/* Maintain a direct mapped cache of Parsev* to avoid duplication. */ +/* Maintain a direct mapped cache of Parsev*. */ static const Parsev *internparsev(Parsev *p) { /* An extremely simple direct mapped cache of *Parsev, It relies on direct pointer comparison, which @@ -9,23 +9,24 @@ static const Parsev *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; - interned = (const Parsev *)xmemdup((char*)p, sizeof(Parsev)); + interned = (const Parsev *)xmemdup((char *)p, sizeof(Parsev)); cache[idx] = interned; return interned; } -/* Maintain a direct cache of strings to avoid duplication. */ +/* Maintain a direct cache of strings. */ const char *internstring(const char *s) { size_t idx, len; const char *interned; static const char *cache[4096] = {0}; len = strlen(s); - idx = murmurhash64a(s, len) % sizeof(cache)/sizeof(cache[0]); + idx = murmurhash64a(s, len) % sizeof(cache) / sizeof(cache[0]); interned = cache[idx]; if (interned && strcmp(s, cache[idx]) == 0) return interned; @@ -78,21 +79,22 @@ static String decodestring(char *s) { #define INSTR1(V, A1) \ (Parsev) { \ .instr = (Instr) { \ - .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = NULL, .arg3 = NULL \ + .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = NULL, \ + .arg3 = NULL \ } \ } #define INSTR2(V, A1, A2) \ (Parsev) { \ .instr = (Instr) { \ - .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \ - .arg3 = NULL \ + .kind = 0, .variant = V, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2), .arg3 = NULL \ } \ } #define INSTR3(V, A1, A2, A3) \ (Parsev) { \ .instr = (Instr) { \ - .kind = 0, .variant = V, .arg1 = internparsev(&A1), .arg2 = internparsev(&A2), \ - .arg3 = internparsev(&A3) \ + .kind = 0, .variant = V, .arg1 = internparsev(&A1), \ + .arg2 = internparsev(&A2), .arg3 = internparsev(&A3) \ } \ } |
