-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | check/collatz.tst | 80 | ||||
-rw-r--r-- | check/lightning.c | 25 |
@@ -1,3 +1,12 @@ +2022年10月05日 Paulo Andrade <pcpa@gnu.org> + + * check/lightning.c: Remove -Dmacro=value from usage and attempt + to parse it. It was buggy and not properly implemented. Now + it pass any extra options to the generated jit. To pass any + option starting with '-' need to also use '--'. + * check/collatz.e: New sample file showing an example of jit + generation. + 2022年10月04日 Paulo Andrade <pcpa@gnu.org> * include/lightning/jit_private.h: Add new flag to jit_block_t. diff --git a/check/collatz.tst b/check/collatz.tst new file mode 100644 index 0000000..41a11dc --- /dev/null +++ b/check/collatz.tst @@ -0,0 +1,80 @@ +.data 32 +str: +.c "%lu\n" +.code + jmpi main +/* + * unsigned long collatz(long n) { + * unsigned long r = n; + * if (!(r & 1)) { + * r = r / 2; + * return r; + * } + * r = r * 3; + * r = r + 1; + * return r; + * } + */ +collatz: + prolog + arg $n + getarg %r0 $n + bmsi odd %r0 1 + //divi_u %r0 %r0 2 + rshi_u %r0 %r0 1 + retr %r0 +odd: + muli %r0 %r0 3 + addi %r0 %r0 1 + retr %r0 + epilog + +/* + * int main(int argc, char *argv[]) { + * unsigned long v; + * if (argc == 2) + * v = strtoul(argv[1], NULL, 0); + * else + * v = (1L << __WORDSIZE / 2) - 1; + * while (1) { + * printf("%ld\n", v); + * if (v <= 1) + * break; + * v = collatz(v); + * } + * return 0; + * } + */ +main: + prolog + arg $argc + arg $argv + getarg %r0 $argc + bnei default %r0 2 + getarg %v0 $argv + ldxi %r0 %v0 $(__WORDSIZE >> 3) + prepare + pushargr %r0 + pushargi 0 + pushargi 0 + finishi @strtoul + retval %v0 + jmpi loop +default: + movi %v0 $((1 << __WORDSIZE / 2) - 1) +loop: + prepare + pushargi str + ellipsis + pushargr %v0 + finishi @printf + blei_u done %v0 1 +call: + prepare + pushargr %v0 + finishi collatz + retval %v0 + jmpi loop +done: + reti 0 + epilog diff --git a/check/lightning.c b/check/lightning.c index 34b5440..f55620b 100644 --- a/check/lightning.c +++ b/check/lightning.c @@ -3829,6 +3829,11 @@ execute(int argc, char *argv[]) jit_disassemble(); fprintf(stderr, " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n"); } + if (flag_verbose && argc) { + for (result = 0; result < argc; result++) + printf("argv[%d] = %s\n", result, argv[result]); + fprintf(stderr, " - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\n"); + } jit_clear_state(); if (flag_disasm) @@ -4028,12 +4033,11 @@ usage(void) { #if HAVE_GETOPT_LONG_ONLY fprintf(stderr, "\ -Usage: %s [jit assembler options] file [jit program options]\n\ +Usage: %s [jit assembler options] file [--] [jit program options]\n\ Jit assembler options:\n\ -help Display this information\n\ -v[0-3] Verbose output level\n\ - -d Do not use a data buffer\n\ - -D<macro>[=<val>] Preprocessor options\n" + -d Do not use a data buffer\n" # if defined(__i386__) && __WORDSIZE == 32 " -mx87=1 Force using x87 when sse2 available\n" # endif @@ -4049,11 +4053,10 @@ Jit assembler options:\n\ , progname); #else fprintf(stderr, "\ -Usage: %s [jit assembler options] file [jit program options]\n\ +Usage: %s [jit assembler options] file [--] [jit program options]\n\ Jit assembler options:\n\ -h Display this information\n\ - -v Verbose output level\n\ - -D<macro>[=<val>] Preprocessor options\n", progname); + -v Verbose output level\n", progname); #endif finish_jit(); exit(1); @@ -4228,16 +4231,6 @@ main(int argc, char *argv[]) # define cc "gcc" #endif opt_short = snprintf(cmdline, sizeof(cmdline), cc " -E -x c %s", argv[opt_index]); - for (++opt_index; opt_index < argc; opt_index++) { - if (argv[opt_index][0] == '-') - opt_short += snprintf(cmdline + opt_short, - sizeof(cmdline) - opt_short, - " %s", argv[opt_index]); - else { - --opt_index; - break; - } - } opt_short += snprintf(cmdline + opt_short, sizeof(cmdline) - opt_short, " -D__WORDSIZE=%d", __WORDSIZE); |