Mercurial > hg-old > index.cgi
diff src/pragma.c @ 0:57495da01900
Initial checking of LWASM
author | lost |
---|---|
date | Fri, 03 Oct 2008 02:44:20 +0000 |
parents | |
children | 34568fab6058 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/pragma.c Fri Oct 03 02:44:20 2008 +0000 @@ -0,0 +1,85 @@ +/* + * pragma.c + * + * stuff associated with lwasm specific strangeness + */ + +#include <ctype.h> +#include <stdlib.h> +#include <string.h> +#include "lwasm.h" + +/* +A pragma is a means of controlling code generation. + +The pseudo op "*pragma" which will be treated as a comment by an assembler +that doesn't recognize it and thus will not cause assembly errors. This is +the preferred way of flagging a pragma if it will not cause incorrect +execution of the program. + +The pseudo op "pragma" which will cause an error on an assembler that does +not understand it. + +In the case of "*pragma", unrecognized pragmas MUST be silently ignored. In +the case of "pragma", unrecognized pragmas should raise an error. + +LWASM understands the following pragmas: + +index0tonone +noindex0tonone + +When set (index0tonone), an expression that evaluates to 0, other than a +bare constant, in a <offset>,r operand will cause the code for ",r" to be +emitted rather than "0,r". If not set (noindex0tonone), the "0,r" output +will be emitted. The default is to perform the optimization. + +This particular optimization will save a cycle for a direct operation. For +an indirect operation, however, it will save several cycles and a program byte +which may be very useful. +*/ + +void pseudo_pragma_real(asmstate_t *as, sourceline_t *cl, char **optr, int error) +{ + char pragma[128]; + int c = 0; + + while (isspace(**optr)) + (*optr)++; + + while (c < 127 && **optr && !isspace(**optr)) + { + pragma[c++] = **optr; + (*optr)++; + } + + if (c == 0 || (**optr && !isspace(**optr))) + { + if (error) + errorp1(ERR_PRAGMA); + return; + } + pragma[c] = 0; + if (!strcmp(pragma, "noindex0tonone")) + { + as -> pragmas |= PRAGMA_NOINDEX0TONONE; + } + else if (!strcmp(pragma, "index0tonone")) + { + as -> pragmas &= ~PRAGMA_NOINDEX0TONONE; + } + else + { + if (error) + errorp1(ERR_PRAGMA); + } +} + +void pseudo_pragma(asmstate_t *as, sourceline_t *cl, char **optr) +{ + pseudo_pragma_real(as, cl, optr, 1); +} + +void pseudo_starpragma(asmstate_t *as, sourceline_t *cl, char **optr) +{ + pseudo_pragma_real(as, cl, optr, 0); +}