-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathcore-ext.m4
136 lines (110 loc) · 2.07 KB
/
core-ext.m4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
primary(pick)
sp[-1] = sp[-2 - sp[-1].i];
dnl ( a -- )
secondary(again,, .immediate=1, LIT, BRANCH, COMMA, COMMA)
dnl -- 0
secondary(case,, .immediate=1,
ZERO, LIT, RTO, COMMA)
dnl n -- ofpad n+1
secondary(of,, .immediate=1, l(
PLUS1
LIT RLOAD COMMA LIT EQ COMMA
IF SWAP
))
dnl ofpad n -- endofpad n
secondary(endof,, .immediate=1, l(
RTO ELSE RFROM
))
dnl pad1 ... padn n --
secondary(endcase,, .immediate=1, l(
QDUP ZBRANCH self[8]
MINUS1 SWAP
THEN
BRANCH self[0]
LIT RFROM COMMA LIT DROP COMMA
))
dnl -- pad xt
secondary(try,, .immediate=1, l(
AHEAD HERE
LIT &&enter COMMA
))
dnl pad xt -- pad
secondary(catchfrom, catch>, .immediate=1, l(
LIT EXIT COMMA
SWAP THEN
LITERAL
LIT CATCH COMMA
LIT QDUP COMMA
IF))
dnl pad --
secondary(endtry,,.immediate=1, l(
THEN EXIT
))
primary(dotparen, `.(', immediate)
while ((t.i = my_getchar()) != ')')
putchar(t.i);
dnl ( 1 2 -- 2 1 2 )
primary(tuck)
sp[0] = sp[-1];
sp[-1] = sp[-2];
sp[-2] = sp[0];
sp++;
dnl ( 1 2 -- 2 )
primary(nip)
sp[-2] = sp[-1];
sp--;
primary(celladd, cell+)
sp[-1].aa++;
primary(zne, 0<>)
sp[-1].i = sp[-1].i != 0 ;
primary(ne, <>)
sp[-2].i = sp[-1].i != sp[-2].i ;
sp--;
primary(zgt, 0>)
sp[-1].i = sp[-1].i > 0 ;
primary(twotor, 2>r)
*rp++ = *--sp;
*rp++ = *--sp;
primary(tworto, 2r>)
*sp++ = *--rp;
*sp++ = *--rp;
primary(tworload, 2r@)
*sp++ = rp[-2];
*sp++ = rp[-1];
primary(within)
{
uvmint u1 = sp[-3].u;
uvmint u2 = sp[-2].u;
uvmint u3 = sp[-1].u;
sp[-3].u = (u1-u2) < (u3-u2);
sp-=2;
}
ubinop(ugt, >, u>)
constant(true,,.i=-1)
constant(false,,.i=0)
primary(backslash, `\\', immediate)
while((t.i = my_getchar()) != '\n') {
if (t.i < 0) cthrow(-39, unexpected end of file);
}
secondary(marker,,, l(
CONTEXT LOAD DP LOAD
BUILDS COMMA COMMA
DOES DUP LOAD DP STORE CELL ADD
LOAD CONTEXT STORE))
static void *pad;
primary(pad)
if (!pad)
pad = __builtin_alloca(PAD_SIZE);
sp[0].a = pad;
sp++;
dnl ( xu xu-1 ... x0 u -- xu-1 ... x0 xu )
primary(roll)
{
int u = -sp[-1].u - 1;
sp--;
t = sp[u];
int i;
for(i = u; i < -1; i++)
sp[i] = sp[i+1];
sp[-1] = t;
}