diff options
author | Cyrill Gorcunov <gorcunov@gmail.com> | 2009-10-31 20:02:14 +0300 |
---|---|---|
committer | Cyrill Gorcunov <gorcunov@gmail.com> | 2009-10-31 20:02:14 +0300 |
commit | bafd877d48b25e576a4c905a14f1301502cca69c (patch) | |
tree | 31dc41dbd7cb24d3020dd6a092797f410d50d231 | |
parent | 41208028ff52d190044ee7532bf14c5aca0f899a (diff) | |
download | nasm-bafd877d48b25e576a4c905a14f1301502cca69c.tar.gz nasm-bafd877d48b25e576a4c905a14f1301502cca69c.tar.bz2 nasm-bafd877d48b25e576a4c905a14f1301502cca69c.zip |
nasmlib: Introduce idata_bytes helper
This allow us to eliminate code duplication
Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
-rw-r--r-- | assemble.c | 58 | ||||
-rw-r--r-- | nasmlib.c | 38 | ||||
-rw-r--r-- | nasmlib.h | 2 | ||||
-rw-r--r-- | parser.c | 55 |
4 files changed, 63 insertions, 90 deletions
@@ -344,40 +344,16 @@ int64_t assemble(int32_t segment, int64_t offset, int bits, uint32_t cp, int64_t insn_end; int32_t itimes; int64_t start = offset; - int64_t wsize = 0; /* size for DB etc. */ + int64_t wsize; /* size for DB etc. */ errfunc = error; /* to pass to other functions */ cpu = cp; outfmt = output; /* likewise */ list = listgen; /* and again */ - switch (instruction->opcode) { - case -1: + wsize = idata_bytes(instruction->opcode); + if (wsize == -1) return 0; - case I_DB: - wsize = 1; - break; - case I_DW: - wsize = 2; - break; - case I_DD: - wsize = 4; - break; - case I_DQ: - wsize = 8; - break; - case I_DT: - wsize = 10; - break; - case I_DO: - wsize = 16; - break; - case I_DY: - wsize = 32; - break; - default: - break; - } if (wsize) { extop *e; @@ -684,34 +660,10 @@ int64_t insn_size(int32_t segment, int64_t offset, int bits, uint32_t cp, instruction->opcode == I_DT || instruction->opcode == I_DO || instruction->opcode == I_DY) { extop *e; - int32_t isize, osize, wsize = 0; /* placate gcc */ + int32_t isize, osize, wsize; isize = 0; - switch (instruction->opcode) { - case I_DB: - wsize = 1; - break; - case I_DW: - wsize = 2; - break; - case I_DD: - wsize = 4; - break; - case I_DQ: - wsize = 8; - break; - case I_DT: - wsize = 10; - break; - case I_DO: - wsize = 16; - break; - case I_DY: - wsize = 32; - break; - default: - break; - } + wsize = idata_bytes(instruction->opcode); list_for_each(e, instruction->eops) { int32_t align; @@ -689,3 +689,41 @@ char *nasm_zap_spaces_rev(char *p) *p-- = 0x0; return p; } + +/* + * initialized data bytes length from opcode + */ +int idata_bytes(int opcode) +{ + int ret; + switch (opcode) { + case I_DB: + ret = 1; + break; + case I_DW: + ret = 2; + break; + case I_DD: + ret = 4; + break; + case I_DQ: + ret = 8; + break; + case I_DT: + ret = 10; + break; + case I_DO: + ret = 16; + break; + case I_DY: + ret = 32; + break; + case I_none: + ret = -1; + break; + default: + ret = 0; + break; + } + return ret; +} @@ -415,4 +415,6 @@ static inline bool overflow_unsigned(int64_t value, int bytes) return value < vmin || value > vmax; } +int idata_bytes(int opcode); + #endif @@ -429,44 +429,25 @@ restart_parse: goto is_float; } } else if (i == TOKEN_FLOAT) { - is_float: +is_float: eop->type = EOT_DB_STRING; result->eops_float = true; - switch (result->opcode) { - case I_DB: - eop->stringlen = 1; - break; - case I_DW: - eop->stringlen = 2; - break; - case I_DD: - eop->stringlen = 4; - break; - case I_DQ: - eop->stringlen = 8; - break; - case I_DT: - eop->stringlen = 10; - break; - case I_DO: - eop->stringlen = 16; - break; - case I_DY: - nasm_error(ERR_NONFATAL, "floating-point constant" - " encountered in DY instruction"); - eop->stringlen = 0; - break; - default: - nasm_error(ERR_NONFATAL, "floating-point constant" - " encountered in unknown instruction"); - /* - * fix suggested by Pedro Gimeno... original line - * was: - * eop->type = EOT_NOTHING; - */ - eop->stringlen = 0; - break; - } + + eop->stringlen = idata_bytes(result->opcode); + if (eop->stringlen > 16) { + nasm_error(ERR_NONFATAL, "floating-point constant" + " encountered in DY instruction"); + eop->stringlen = 0; + } else if (eop->stringlen < 1) { + nasm_error(ERR_NONFATAL, "floating-point constant" + " encountered in unknown instruction"); + /* + * fix suggested by Pedro Gimeno... original line was: + * eop->type = EOT_NOTHING; + */ + eop->stringlen = 0; + } + eop = nasm_realloc(eop, sizeof(extop) + eop->stringlen); tail = &eop->next; *fixptr = eop; @@ -481,7 +462,7 @@ restart_parse: /* anything else, assume it is an expression */ expr *value; - is_expression: +is_expression: value = evaluate(stdscan, NULL, &tokval, NULL, critical, nasm_error, NULL); i = tokval.t_type; |