summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCyrill Gorcunov <gorcunov@gmail.com>2009-10-31 20:02:14 +0300
committerCyrill Gorcunov <gorcunov@gmail.com>2009-10-31 20:02:14 +0300
commitbafd877d48b25e576a4c905a14f1301502cca69c (patch)
tree31dc41dbd7cb24d3020dd6a092797f410d50d231
parent41208028ff52d190044ee7532bf14c5aca0f899a (diff)
downloadnasm-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.c58
-rw-r--r--nasmlib.c38
-rw-r--r--nasmlib.h2
-rw-r--r--parser.c55
4 files changed, 63 insertions, 90 deletions
diff --git a/assemble.c b/assemble.c
index ca2b909..5fceea3 100644
--- a/assemble.c
+++ b/assemble.c
@@ -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;
diff --git a/nasmlib.c b/nasmlib.c
index 0dea39e..b4ca34e 100644
--- a/nasmlib.c
+++ b/nasmlib.c
@@ -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;
+}
diff --git a/nasmlib.h b/nasmlib.h
index 2b30ef4..9d39117 100644
--- a/nasmlib.h
+++ b/nasmlib.h
@@ -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
diff --git a/parser.c b/parser.c
index 34fcf47..adf181c 100644
--- a/parser.c
+++ b/parser.c
@@ -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;