diff options
Diffstat (limited to 'gas/config/tc-vax.c')
-rw-r--r-- | gas/config/tc-vax.c | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/gas/config/tc-vax.c b/gas/config/tc-vax.c index fef859e..ac1b94d 100644 --- a/gas/config/tc-vax.c +++ b/gas/config/tc-vax.c @@ -348,6 +348,60 @@ md_chars_to_number (con, nbytes) } return retval; } + +/* + * Copy a bignum from in to out. + * If the output is shorter than the input, copy lower-order + * littlenums. Return 0 or the number of significant littlenums + * dropped. Assumes littlenum arrays are densely packed: no unused + * chars between the littlenums. Uses memcpy() to move littlenums, and + * wants to know length (in chars) of the input bignum. + */ + +static int +bignum_copy (register LITTLENUM_TYPE *in, + register int in_length, /* in sizeof(littlenum)s */ + register LITTLENUM_TYPE *out, + register int out_length /* in sizeof(littlenum)s */) +{ + int significant_littlenums_dropped; + + if (out_length < in_length) + { + LITTLENUM_TYPE *p; /* -> most significant (non-zero) input + littlenum. */ + + memcpy ((void *) out, (void *) in, + (unsigned int) out_length << LITTLENUM_SHIFT); + for (p = in + in_length - 1; p >= in; --p) + { + if (*p) + break; + } + significant_littlenums_dropped = p - in - in_length + 1; + + if (significant_littlenums_dropped < 0) + { + significant_littlenums_dropped = 0; + } + } + else + { + memcpy ((char *) out, (char *) in, + (unsigned int) in_length << LITTLENUM_SHIFT); + + if (out_length > in_length) + { + memset ((char *) (out + in_length), + '\0', + (unsigned int) (out_length - in_length) << LITTLENUM_SHIFT); + } + + significant_littlenums_dropped = 0; + } + + return (significant_littlenums_dropped); +} /* vax:md_assemble() emit frags for 1 instruction */ |