refactor/condense; add literal

main
Clyne 1 month ago
parent 9f2e4a21f2
commit 1d3ef290df
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

184
main.c

@ -1,13 +1,7 @@
#include <stdint.h> #include <stdint.h>
#define NAKED __attribute__((naked)) #define NAKED __attribute__((naked))
#define END_OF(arr) ((arr) + (sizeof((arr)) / sizeof(*(arr)))) #define END_OF(arr) ((arr) + (sizeof((arr)) / sizeof(*(arr))))
#define NEXT { goto *(*++pp); }
#define LIT(x) push, (void *)(x)
#define FTH(w) enter, (w##_body)
#define EXIT doexit
#define ATTR_NATIVE (1 << 7) #define ATTR_NATIVE (1 << 7)
#define ATTR_IMMEDIATE (1 << 6) #define ATTR_IMMEDIATE (1 << 6)
@ -19,24 +13,25 @@
name##_body, prev, attr + sizeof(tname) - 1, tname \ name##_body, prev, attr + sizeof(tname) - 1, tname \
}; \ }; \
const void *name##_body[] = { const void *name##_body[] = {
#define END EXIT, }; #define LIT(x) push, (void *)(x)
#define FTH(w) enter, (w##_body)
#define W(name, tname, prev) WORD(name, tname, prev, 0) #define END fexit, };
#define I(name, tname, prev) WORD(name, tname, prev, ATTR_IMMEDIATE) #define NATIVE(name, tname, prev, attr) \
#define N(name, tname, prev) \
extern const void *name##_body[]; \
struct word_t w_##name = { \
name##_body, prev, \
ATTR_NATIVE + sizeof(tname) - 1, tname \
}; \
const void *name##_body[] = { name, EXIT };
#define C(name, tname, prev) \
extern const void *name##_body[]; \ extern const void *name##_body[]; \
NAKED void name(void); \
struct word_t w_##name = { \ struct word_t w_##name = { \
name##_body, prev, \ name##_body, prev, \
(ATTR_NATIVE | ATTR_IMMEDIATE) + sizeof(tname) - 1, tname \ (attr | ATTR_NATIVE) + sizeof(tname) - 1, tname \
}; \ }; \
const void *name##_body[] = { name, EXIT }; const void *name##_body[] = { name, fexit }; \
NAKED void name(void)
#define W(name, tname, prev) WORD(name, tname, prev, 0)
#define I(name, tname, prev) WORD(name, tname, prev, ATTR_IMMEDIATE)
#define N(name, tname, prev) NATIVE(name, tname, prev, 0)
#define C(name, tname, prev) NATIVE(name, tname, prev, ATTR_IMMEDIATE)
#define NEXT { goto *(*++pp); }
struct word_t struct word_t
{ {
@ -46,12 +41,16 @@ struct word_t
char name[]; char name[];
} __attribute__ ((packed)); } __attribute__ ((packed));
intptr_t dstack[32]; static intptr_t dstack[32];
intptr_t **rstack[32]; static intptr_t **rstack[32];
intptr_t dict[8192]; static intptr_t dict[8192] = {
struct word_t *latest; 0, 10
//char inbuf [ 128]; };
//intptr_t inpos; #define state dict[0]
#define base dict[1]
#define begin dict[2]
static intptr_t *here = &begin;
static struct word_t *latest;
register intptr_t tmp asm("r12"); register intptr_t tmp asm("r12");
register intptr_t * sp asm("r13"); // pointer to stack cells register intptr_t * sp asm("r13"); // pointer to stack cells
@ -61,46 +60,10 @@ register intptr_t ** pp asm("r15"); // pointer to ip
#define STASH asm("push %r12; push %r13; push %r14; push %r15") #define STASH asm("push %r12; push %r13; push %r14; push %r15")
#define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12") #define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12")
NAKED
void enter(void)
{
*--rp = ++pp;
pp = (intptr_t **)*pp;
goto *(*pp);
}
void doexit(void)
{
if (rp < END_OF(rstack)) {
pp = *rp++;
NEXT;
}
}
intptr_t state = 0;
intptr_t *here = dict;
NAKED void dot(void); NAKED void dot(void);
NAKED void enter(void) { *--rp = ++pp; pp = (intptr_t **)*pp; goto *(*pp); }
NAKED void push(void) { *--sp = (intptr_t)*++pp; NEXT; } NAKED void push(void) { *--sp = (intptr_t)*++pp; NEXT; }
NAKED void dup(void) { --sp; sp[0] = sp[1]; NEXT; } void fexit(void) { if (rp < END_OF(rstack)) { pp = *rp++; NEXT; } }
NAKED void drop(void) { ++sp; NEXT; }
NAKED void swap(void) { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; }
NAKED void rot(void) { tmp = sp[0]; sp[0] = sp[2]; sp[2] = sp[1]; sp[1] = tmp; NEXT; }
NAKED void add(void) { sp[1] += sp[0]; ++sp; NEXT; }
NAKED void sub(void) { sp[1] -= sp[0]; ++sp; NEXT; }
NAKED void mul(void) { sp[1] *= sp[0]; ++sp; NEXT; }
NAKED void div(void) { sp[1] /= sp[0]; ++sp; NEXT; }
NAKED void mod(void) { sp[1] %= sp[0]; ++sp; NEXT; }
NAKED void and(void) { sp[1] &= sp[0]; ++sp; NEXT; }
NAKED void or(void) { sp[1] |= sp[0]; ++sp; NEXT; }
NAKED void xor(void) { sp[1] ^= sp[0]; ++sp; NEXT; }
NAKED void peek(void) { *sp = *(intptr_t *)*sp; NEXT; }
NAKED void poke(void) { *(intptr_t *)sp[0] = sp[1]; sp += 2; NEXT; }
NAKED void cpeek(void) { *sp = *(char *)*sp; NEXT; }
NAKED void cpoke(void) { *(char *)sp[0] = (char)sp[1]; sp += 2; NEXT; }
NAKED void comp(void) { state = -1; NEXT; }
NAKED void intr(void) { state = 0; NEXT; }
NAKED void comma(void) { *here++ = *sp++; NEXT; }
NAKED void compname(void) NAKED void compname(void)
{ {
@ -123,71 +86,70 @@ NAKED void compname(void)
NEXT; NEXT;
} }
N(dup, "dup", 0) N(dup, "dup", 0) { --sp; sp[0] = sp[1]; NEXT; }
N(drop, "drop", &w_dup) N(drop, "drop", &w_dup) { ++sp; NEXT; }
N(swap, "swap", &w_drop) N(swap, "swap", &w_drop) { tmp = sp[0]; sp[0] = sp[1]; sp[1] = tmp; NEXT; }
N(rot, "rot", &w_swap) N(rot, "rot", &w_swap) { tmp = sp[0]; sp[0] = sp[2]; sp[2] = sp[1];
N(peek, "@", &w_rot) sp[1] = tmp; NEXT; }
N(poke, "!", &w_peek) N(peek, "@", &w_rot) { *sp = *(intptr_t *)*sp; NEXT; }
N(cpeek, "c@", &w_poke) N(poke, "!", &w_peek) { *(intptr_t *)sp[0] = sp[1]; sp += 2; NEXT; }
N(cpoke, "c!", &w_cpeek) N(cpeek, "c@", &w_poke) { *sp = *(char *)*sp; NEXT; }
N(add, "+", &w_cpoke) N(cpoke, "c!", &w_cpeek) { *(char *)sp[0] = (char)sp[1]; sp += 2; NEXT; }
N(sub, "-", &w_add) N(add, "+", &w_cpoke) { sp[1] += sp[0]; ++sp; NEXT; }
N(mul, "*", &w_sub) N(sub, "-", &w_add) { sp[1] -= sp[0]; ++sp; NEXT; }
N(div, "/", &w_mul) N(mul, "*", &w_sub) { sp[1] *= sp[0]; ++sp; NEXT; }
N(mod, "mod", &w_div) N(div, "/", &w_mul) { sp[1] /= sp[0]; ++sp; NEXT; }
N(and, "and", &w_mod) N(mod, "mod", &w_div) { sp[1] %= sp[0]; ++sp; NEXT; }
N(or, "or", &w_and) N(and, "and", &w_mod) { sp[1] &= sp[0]; ++sp; NEXT; }
N(xor, "xor", &w_or) N(or, "or", &w_and) { sp[1] |= sp[0]; ++sp; NEXT; }
W(cell, "cell", &w_xor) LIT(sizeof(*sp)), END N(xor, "xor", &w_or) { sp[1] ^= sp[0]; ++sp; NEXT; }
C(intr, "[", &w_xor) { state = 0; NEXT; }
N(comp, "]", &w_intr) { state = -1; NEXT; }
N(comma, ",", &w_comp) { *here++ = *sp++; NEXT; }
W(cell, "cell", &w_comma) LIT(sizeof(*sp)), END
W(cellp, "cell+", &w_cell) FTH(cell), add, END W(cellp, "cell+", &w_cell) FTH(cell), add, END
W(cells, "cells", &w_cellp) FTH(cell), mul, END W(cells, "cells", &w_cellp) FTH(cell), mul, END
W(dict, "_d", &w_cells) LIT(dict), END W(dict, "_d", &w_cells) LIT(dict), END
W(here, "here", &w_dict) LIT(&here), peek, END W(here, "here", &w_dict) LIT(&here), peek, END
W(latest, "latest", &w_here) LIT(&latest), peek, END W(latest, "latest", &w_here) LIT(&latest), peek, END
C(intr, "[", &w_latest) N(dot, ".", &w_latest) ;
N(comp, "]", &w_intr)
N(dot, ".", &w_comp)
W(negate, "negate", &w_dot) LIT(-1), mul, END W(negate, "negate", &w_dot) LIT(-1), mul, END
W(invert, "invert", &w_negate) LIT(-1), xor, END W(invert, "invert", &w_negate) LIT(-1), xor, END
W(dec, "1-", &w_invert) LIT(1), sub, END W(dec, "1-", &w_invert) LIT(1), sub, END
W(inc, "1+", &w_dec) LIT(1), add, END W(inc, "1+", &w_dec) LIT(1), add, END
W(aligned, "aligned", &w_inc) LIT(sizeof(*sp) - 1), add, LIT(~(sizeof(*sp) - 1)), and, END W(aligned, "aligned", &w_inc) LIT(sizeof(*sp) - 1), add, LIT(~(sizeof(*sp) - 1)),
and, END
W(align, "align", &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END W(align, "align", &w_aligned) FTH(here), FTH(aligned), LIT(&here), poke, END
N(comma, ",", &w_align) W(colon, ":", &w_align) FTH(here), LIT(0), comma, FTH(latest), comma,
W(colon, ":", &w_comma) compname, FTH(align), dup, FTH(here), swap,
FTH(here), LIT(0), comma, FTH(latest), comma, poke, comp, END
compname, FTH(align), dup, FTH(here), swap, poke, comp, END I(semic, ";", &w_colon) LIT(fexit), comma, LIT(&latest), poke, intr, END
I(semic, ";", &w_colon) LIT(doexit), comma, LIT(&latest), poke, intr, END I(literal, "literal", &w_semic) LIT(push), comma, comma, END
#define LATEST &w_semic #define LATEST &w_literal
#include <ctype.h> #include <ctype.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
extern long strtol(char *, char **, int);
NAKED void dot() { NAKED void dot() {
STASH; STASH;
printf("%ld ", *sp++); printf("%ld ", *sp);
RESTORE; RESTORE;
++sp;
NEXT; NEXT;
} }
extern long strtol(char *, char **, int);
static void call(void *ptr); static void call(void *ptr);
//static void dump(void);
static void init(void); static void init(void);
int base = 10;
int main() int main()
{
char buf[128]; char buf[128];
init(); init();
for (;;) { for (;;) {
//dump();
char c; char c;
do c = getchar(); do c = getchar();
while (!isgraph(c)); while (!isgraph(c));
@ -236,7 +198,8 @@ int main()
} }
} }
puts(state ? "compiled" : "ok"); printf(state ? "compiled <%ld>\n" : "ok <%ld>\n",
(END_OF(dstack) - sp));
} }
return 0; return 0;
@ -251,27 +214,6 @@ void init(void)
latest = LATEST; latest = LATEST;
} }
//void dump(void)
//{
// //printf("IP: %ld\n", (intptr_t)pp);
//
// printf("DS: ");
// intptr_t *it = END_OF(dstack) - 1;
// while (it >= sp) {
// printf("%ld ", *it);
// --it;
// }
// putchar('\n');
//
// //printf("RS: ");
// //intptr_t ***rt = END_OF(rstack) - 1;
// //while (rt >= rp) {
// // printf("%ld ", (intptr_t)*rt);
// // --rt;
// //}
// //putchar('\n');
//}
void call(void *ptr) void call(void *ptr)
{ {
pp = ptr; pp = ptr;

Loading…
Cancel
Save