mirror of
https://github.com/netwide-assembler/nasm.git
synced 2025-04-12 18:40:23 +08:00
nasmlib: Introduce idata_bytes helper
This allow us to eliminate code duplication Signed-off-by: Cyrill Gorcunov <gorcunov@gmail.com>
This commit is contained in:
parent
41208028ff
commit
bafd877d48
58
assemble.c
58
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;
|
||||
|
38
nasmlib.c
38
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;
|
||||
}
|
||||
|
@ -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
|
||||
|
55
parser.c
55
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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user