branching, if-else-then; test arm compile

main
Clyne 4 weeks ago
parent 3776fbcb74
commit b8446c8687
Signed by: clyne
GPG Key ID: 3267C8EBF3F9AFC7

@ -1,6 +1,9 @@
#CC := arm-none-eabi-gcc -mcpu=cortex-m4 -mthumb
CC := gcc CC := gcc
CFLAGS := -O3 -ggdb -g3 -Wall -Wextra CFLAGS := -O3 -ggdb -g3 -Wall -Wextra
all: all: foci
$(CC) $(CFLAGS) -c foci.c
$(CC) $(CFLAGS) main.c foci.o -o main $(CC) $(CFLAGS) main.c foci.o -o main
foci:
$(CC) $(CFLAGS) -c foci.c

@ -101,7 +101,13 @@ W(colon, ":", &w_align) FTH(here), LIT(0), comma, FTH(latest), comma,
poke, comp, END poke, comp, END
I(semic, ";", &w_colon) LIT(fexit), comma, LIT(&latest), poke, intr, END I(semic, ";", &w_colon) LIT(fexit), comma, LIT(&latest), poke, intr, END
I(literal, "literal", &w_semic) LIT(push), comma, comma, END I(literal, "literal", &w_semic) LIT(push), comma, comma, END
#define LATEST &w_literal N(b, "_b", &w_literal) { ++pp; pp = (intptr_t **)*pp; NEXT; }
N(bz, "_bz", &w_literal) { ++pp; if (!*sp++) { pp = (intptr_t **)*pp; } NEXT; }
I(fif, "if", &w_b) LIT(bz), comma, FTH(here), LIT(0), comma, END
I(then, "then", &w_fif) FTH(here), LIT(sizeof(intptr_t)), sub, swap, poke, END
I(felse, "else", &w_then) LIT(b), comma, FTH(here), LIT(0), comma, swap,
FTH(here), LIT(sizeof(intptr_t)), sub, swap, poke, END
#define LATEST &w_felse
void call(void *ptr) void call(void *ptr)
{ {

@ -49,8 +49,6 @@
#define N(name, tname, prev) NATIVE(name, tname, prev, 0) #define N(name, tname, prev) NATIVE(name, tname, prev, 0)
#define C(name, tname, prev) NATIVE(name, tname, prev, ATTR_IMMEDIATE) #define C(name, tname, prev) NATIVE(name, tname, prev, ATTR_IMMEDIATE)
#define STASH asm("push %r12; push %r13; push %r14; push %r15")
#define RESTORE asm("pop %r15; pop %r14; pop %r13; pop %r12")
#define NEXT { goto *(*++pp); } #define NEXT { goto *(*++pp); }
struct word_t struct word_t
@ -61,10 +59,21 @@ struct word_t
char name[]; char name[];
} __attribute__ ((packed)); } __attribute__ ((packed));
register intptr_t tmp asm("r12"); // ARM Cortex-M:
register intptr_t * sp asm("r13"); // pointer to stack cells //register intptr_t * sp asm("r0"); // pointer to stack cells
register intptr_t *** rp asm("r14"); // stack of pp //register intptr_t *** rp asm("r1"); // stack of pp
register intptr_t ** pp asm("r15"); // pointer to ip //register intptr_t ** pp asm("r2"); // pointer to ip
//register intptr_t tmp asm("r8");
//#define STASH asm("push {r0-r2,r8}")
//#define RESTORE asm("pop {r0-r2,r8}")
// x86_64
register intptr_t * sp asm("r12"); // pointer to stack cells
register intptr_t *** rp asm("r13"); // stack of pp
register intptr_t ** pp asm("r14"); // pointer to ip
register intptr_t tmp asm("r15");
#define STASH asm("push %r12; push %r13; push %r14")
#define RESTORE asm("pop %r14; pop %r13; pop %r12")
void init(void); void init(void);
int depth(void); int depth(void);

Loading…
Cancel
Save