1*0957b409SSimon J. Gerraty /* Automatically generated code; do not modify directly. */
2*0957b409SSimon J. Gerraty
3*0957b409SSimon J. Gerraty #include <stddef.h>
4*0957b409SSimon J. Gerraty #include <stdint.h>
5*0957b409SSimon J. Gerraty
6*0957b409SSimon J. Gerraty typedef struct {
7*0957b409SSimon J. Gerraty uint32_t *dp;
8*0957b409SSimon J. Gerraty uint32_t *rp;
9*0957b409SSimon J. Gerraty const unsigned char *ip;
10*0957b409SSimon J. Gerraty } t0_context;
11*0957b409SSimon J. Gerraty
12*0957b409SSimon J. Gerraty static uint32_t
t0_parse7E_unsigned(const unsigned char ** p)13*0957b409SSimon J. Gerraty t0_parse7E_unsigned(const unsigned char **p)
14*0957b409SSimon J. Gerraty {
15*0957b409SSimon J. Gerraty uint32_t x;
16*0957b409SSimon J. Gerraty
17*0957b409SSimon J. Gerraty x = 0;
18*0957b409SSimon J. Gerraty for (;;) {
19*0957b409SSimon J. Gerraty unsigned y;
20*0957b409SSimon J. Gerraty
21*0957b409SSimon J. Gerraty y = *(*p) ++;
22*0957b409SSimon J. Gerraty x = (x << 7) | (uint32_t)(y & 0x7F);
23*0957b409SSimon J. Gerraty if (y < 0x80) {
24*0957b409SSimon J. Gerraty return x;
25*0957b409SSimon J. Gerraty }
26*0957b409SSimon J. Gerraty }
27*0957b409SSimon J. Gerraty }
28*0957b409SSimon J. Gerraty
29*0957b409SSimon J. Gerraty static int32_t
t0_parse7E_signed(const unsigned char ** p)30*0957b409SSimon J. Gerraty t0_parse7E_signed(const unsigned char **p)
31*0957b409SSimon J. Gerraty {
32*0957b409SSimon J. Gerraty int neg;
33*0957b409SSimon J. Gerraty uint32_t x;
34*0957b409SSimon J. Gerraty
35*0957b409SSimon J. Gerraty neg = ((**p) >> 6) & 1;
36*0957b409SSimon J. Gerraty x = (uint32_t)-neg;
37*0957b409SSimon J. Gerraty for (;;) {
38*0957b409SSimon J. Gerraty unsigned y;
39*0957b409SSimon J. Gerraty
40*0957b409SSimon J. Gerraty y = *(*p) ++;
41*0957b409SSimon J. Gerraty x = (x << 7) | (uint32_t)(y & 0x7F);
42*0957b409SSimon J. Gerraty if (y < 0x80) {
43*0957b409SSimon J. Gerraty if (neg) {
44*0957b409SSimon J. Gerraty return -(int32_t)~x - 1;
45*0957b409SSimon J. Gerraty } else {
46*0957b409SSimon J. Gerraty return (int32_t)x;
47*0957b409SSimon J. Gerraty }
48*0957b409SSimon J. Gerraty }
49*0957b409SSimon J. Gerraty }
50*0957b409SSimon J. Gerraty }
51*0957b409SSimon J. Gerraty
52*0957b409SSimon J. Gerraty #define T0_VBYTE(x, n) (unsigned char)((((uint32_t)(x) >> (n)) & 0x7F) | 0x80)
53*0957b409SSimon J. Gerraty #define T0_FBYTE(x, n) (unsigned char)(((uint32_t)(x) >> (n)) & 0x7F)
54*0957b409SSimon J. Gerraty #define T0_SBYTE(x) (unsigned char)((((uint32_t)(x) >> 28) + 0xF8) ^ 0xF8)
55*0957b409SSimon J. Gerraty #define T0_INT1(x) T0_FBYTE(x, 0)
56*0957b409SSimon J. Gerraty #define T0_INT2(x) T0_VBYTE(x, 7), T0_FBYTE(x, 0)
57*0957b409SSimon J. Gerraty #define T0_INT3(x) T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
58*0957b409SSimon J. Gerraty #define T0_INT4(x) T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
59*0957b409SSimon J. Gerraty #define T0_INT5(x) T0_SBYTE(x), T0_VBYTE(x, 21), T0_VBYTE(x, 14), T0_VBYTE(x, 7), T0_FBYTE(x, 0)
60*0957b409SSimon J. Gerraty
61*0957b409SSimon J. Gerraty /* static const unsigned char t0_datablock[]; */
62*0957b409SSimon J. Gerraty
63*0957b409SSimon J. Gerraty
64*0957b409SSimon J. Gerraty void br_pem_decoder_init_main(void *t0ctx);
65*0957b409SSimon J. Gerraty
66*0957b409SSimon J. Gerraty void br_pem_decoder_run(void *t0ctx);
67*0957b409SSimon J. Gerraty
68*0957b409SSimon J. Gerraty
69*0957b409SSimon J. Gerraty
70*0957b409SSimon J. Gerraty #include "inner.h"
71*0957b409SSimon J. Gerraty
72*0957b409SSimon J. Gerraty #define CTX ((br_pem_decoder_context *)(void *)((unsigned char *)t0ctx - offsetof(br_pem_decoder_context, cpu)))
73*0957b409SSimon J. Gerraty
74*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
75*0957b409SSimon J. Gerraty void
br_pem_decoder_init(br_pem_decoder_context * ctx)76*0957b409SSimon J. Gerraty br_pem_decoder_init(br_pem_decoder_context *ctx)
77*0957b409SSimon J. Gerraty {
78*0957b409SSimon J. Gerraty memset(ctx, 0, sizeof *ctx);
79*0957b409SSimon J. Gerraty ctx->cpu.dp = &ctx->dp_stack[0];
80*0957b409SSimon J. Gerraty ctx->cpu.rp = &ctx->rp_stack[0];
81*0957b409SSimon J. Gerraty br_pem_decoder_init_main(&ctx->cpu);
82*0957b409SSimon J. Gerraty br_pem_decoder_run(&ctx->cpu);
83*0957b409SSimon J. Gerraty }
84*0957b409SSimon J. Gerraty
85*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
86*0957b409SSimon J. Gerraty size_t
br_pem_decoder_push(br_pem_decoder_context * ctx,const void * data,size_t len)87*0957b409SSimon J. Gerraty br_pem_decoder_push(br_pem_decoder_context *ctx,
88*0957b409SSimon J. Gerraty const void *data, size_t len)
89*0957b409SSimon J. Gerraty {
90*0957b409SSimon J. Gerraty if (ctx->event) {
91*0957b409SSimon J. Gerraty return 0;
92*0957b409SSimon J. Gerraty }
93*0957b409SSimon J. Gerraty ctx->hbuf = data;
94*0957b409SSimon J. Gerraty ctx->hlen = len;
95*0957b409SSimon J. Gerraty br_pem_decoder_run(&ctx->cpu);
96*0957b409SSimon J. Gerraty return len - ctx->hlen;
97*0957b409SSimon J. Gerraty }
98*0957b409SSimon J. Gerraty
99*0957b409SSimon J. Gerraty /* see bearssl_pem.h */
100*0957b409SSimon J. Gerraty int
br_pem_decoder_event(br_pem_decoder_context * ctx)101*0957b409SSimon J. Gerraty br_pem_decoder_event(br_pem_decoder_context *ctx)
102*0957b409SSimon J. Gerraty {
103*0957b409SSimon J. Gerraty int event;
104*0957b409SSimon J. Gerraty
105*0957b409SSimon J. Gerraty event = ctx->event;
106*0957b409SSimon J. Gerraty ctx->event = 0;
107*0957b409SSimon J. Gerraty return event;
108*0957b409SSimon J. Gerraty }
109*0957b409SSimon J. Gerraty
110*0957b409SSimon J. Gerraty
111*0957b409SSimon J. Gerraty
112*0957b409SSimon J. Gerraty static const unsigned char t0_datablock[] = {
113*0957b409SSimon J. Gerraty 0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x2D, 0x42, 0x45, 0x47, 0x49, 0x4E, 0x20,
114*0957b409SSimon J. Gerraty 0x00, 0x2D, 0x2D, 0x2D, 0x2D, 0x45, 0x4E, 0x44, 0x20, 0x00
115*0957b409SSimon J. Gerraty };
116*0957b409SSimon J. Gerraty
117*0957b409SSimon J. Gerraty static const unsigned char t0_codeblock[] = {
118*0957b409SSimon J. Gerraty 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x01, 0x01, 0x07, 0x00, 0x00, 0x01,
119*0957b409SSimon J. Gerraty 0x01, 0x08, 0x00, 0x00, 0x13, 0x13, 0x00, 0x00, 0x01,
120*0957b409SSimon J. Gerraty T0_INT2(offsetof(br_pem_decoder_context, event)), 0x00, 0x00, 0x01,
121*0957b409SSimon J. Gerraty T0_INT2(offsetof(br_pem_decoder_context, name)), 0x00, 0x00, 0x05,
122*0957b409SSimon J. Gerraty 0x14, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x03, 0x13, 0x04, 0x76, 0x01,
123*0957b409SSimon J. Gerraty 0x2D, 0x0C, 0x06, 0x05, 0x2E, 0x01, 0x03, 0x2D, 0x00, 0x01, 0x0D, 0x27,
124*0957b409SSimon J. Gerraty 0x05, 0x04, 0x01, 0x03, 0x2D, 0x00, 0x15, 0x2E, 0x01, 0x02, 0x2D, 0x00,
125*0957b409SSimon J. Gerraty 0x01, 0x01, 0x7F, 0x03, 0x00, 0x25, 0x01, 0x00, 0x18, 0x0D, 0x06, 0x03,
126*0957b409SSimon J. Gerraty 0x13, 0x04, 0x3C, 0x01, 0x7F, 0x18, 0x0D, 0x06, 0x13, 0x13, 0x02, 0x00,
127*0957b409SSimon J. Gerraty 0x05, 0x06, 0x2E, 0x01, 0x03, 0x2D, 0x04, 0x03, 0x01, 0x7F, 0x23, 0x01,
128*0957b409SSimon J. Gerraty 0x00, 0x00, 0x04, 0x23, 0x01, 0x01, 0x18, 0x0D, 0x06, 0x09, 0x13, 0x01,
129*0957b409SSimon J. Gerraty 0x00, 0x23, 0x01, 0x00, 0x00, 0x04, 0x14, 0x01, 0x02, 0x18, 0x0D, 0x06,
130*0957b409SSimon J. Gerraty 0x06, 0x13, 0x01, 0x7F, 0x00, 0x04, 0x08, 0x13, 0x01, 0x03, 0x2D, 0x01,
131*0957b409SSimon J. Gerraty 0x00, 0x00, 0x13, 0x01, 0x00, 0x03, 0x00, 0x04, 0xFF, 0x33, 0x01, 0x2C,
132*0957b409SSimon J. Gerraty 0x14, 0x01, 0x2D, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x7F, 0x00, 0x14, 0x31,
133*0957b409SSimon J. Gerraty 0x06, 0x02, 0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01,
134*0957b409SSimon J. Gerraty 0x02, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00,
135*0957b409SSimon J. Gerraty 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03,
136*0957b409SSimon J. Gerraty 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02,
137*0957b409SSimon J. Gerraty 0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D,
138*0957b409SSimon J. Gerraty 0x06, 0x04, 0x13, 0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x2E,
139*0957b409SSimon J. Gerraty 0x13, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13, 0x01, 0x03, 0x00,
140*0957b409SSimon J. Gerraty 0x2F, 0x05, 0x04, 0x13, 0x01, 0x03, 0x00, 0x01, 0x3D, 0x0C, 0x06, 0x03,
141*0957b409SSimon J. Gerraty 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x0F, 0x10, 0x06, 0x03, 0x01, 0x03,
142*0957b409SSimon J. Gerraty 0x00, 0x02, 0x00, 0x01, 0x04, 0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14,
143*0957b409SSimon J. Gerraty 0x1D, 0x06, 0x05, 0x13, 0x2E, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06,
144*0957b409SSimon J. Gerraty 0x0A, 0x07, 0x03, 0x00, 0x29, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x04, 0x13,
145*0957b409SSimon J. Gerraty 0x01, 0x03, 0x00, 0x14, 0x01, 0x3D, 0x0D, 0x06, 0x20, 0x13, 0x2F, 0x05,
146*0957b409SSimon J. Gerraty 0x03, 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x03, 0x10, 0x06, 0x03, 0x01,
147*0957b409SSimon J. Gerraty 0x03, 0x00, 0x02, 0x00, 0x01, 0x0A, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x02,
148*0957b409SSimon J. Gerraty 0x0F, 0x1C, 0x01, 0x01, 0x00, 0x16, 0x14, 0x1D, 0x06, 0x05, 0x13, 0x2E,
149*0957b409SSimon J. Gerraty 0x01, 0x03, 0x00, 0x02, 0x00, 0x01, 0x06, 0x0A, 0x07, 0x03, 0x00, 0x02,
150*0957b409SSimon J. Gerraty 0x00, 0x01, 0x10, 0x0F, 0x1C, 0x02, 0x00, 0x01, 0x08, 0x0F, 0x1C, 0x02,
151*0957b409SSimon J. Gerraty 0x00, 0x1C, 0x01, 0x00, 0x00, 0x00, 0x28, 0x01, 0x01, 0x2D, 0x24, 0x06,
152*0957b409SSimon J. Gerraty 0x02, 0x04, 0x7B, 0x04, 0x75, 0x00, 0x14, 0x12, 0x2A, 0x14, 0x05, 0x04,
153*0957b409SSimon J. Gerraty 0x20, 0x01, 0x7F, 0x00, 0x2C, 0x2A, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x05,
154*0957b409SSimon J. Gerraty 0x13, 0x20, 0x01, 0x00, 0x00, 0x0D, 0x05, 0x05, 0x13, 0x2E, 0x01, 0x00,
155*0957b409SSimon J. Gerraty 0x00, 0x1E, 0x04, 0x5E, 0x00, 0x01, 0x01, 0x27, 0x06, 0x0B, 0x22, 0x01,
156*0957b409SSimon J. Gerraty 0x80, 0x7F, 0x2B, 0x14, 0x06, 0x02, 0x30, 0x00, 0x13, 0x04, 0x6E, 0x00,
157*0957b409SSimon J. Gerraty 0x2C, 0x14, 0x31, 0x05, 0x01, 0x00, 0x13, 0x04, 0x77, 0x00, 0x14, 0x14,
158*0957b409SSimon J. Gerraty 0x01, 0x80, 0x61, 0x0E, 0x1B, 0x01, 0x80, 0x7A, 0x0B, 0x10, 0x06, 0x03,
159*0957b409SSimon J. Gerraty 0x01, 0x20, 0x08, 0x00, 0x01, 0x14, 0x03, 0x00, 0x1B, 0x18, 0x05, 0x05,
160*0957b409SSimon J. Gerraty 0x20, 0x2E, 0x01, 0x00, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0D, 0x06, 0x06,
161*0957b409SSimon J. Gerraty 0x20, 0x02, 0x00, 0x1B, 0x08, 0x00, 0x14, 0x01, 0x0D, 0x0D, 0x06, 0x03,
162*0957b409SSimon J. Gerraty 0x13, 0x04, 0x03, 0x2A, 0x18, 0x1A, 0x1E, 0x1B, 0x1F, 0x1B, 0x04, 0x59,
163*0957b409SSimon J. Gerraty 0x00, 0x19, 0x14, 0x1D, 0x05, 0x01, 0x00, 0x13, 0x11, 0x04, 0x76, 0x00,
164*0957b409SSimon J. Gerraty 0x21, 0x1A, 0x11, 0x00, 0x00, 0x2C, 0x01, 0x0A, 0x0C, 0x06, 0x02, 0x04,
165*0957b409SSimon J. Gerraty 0x78, 0x00, 0x01, 0x01, 0x7F, 0x03, 0x00, 0x2C, 0x14, 0x01, 0x0A, 0x0C,
166*0957b409SSimon J. Gerraty 0x06, 0x09, 0x31, 0x05, 0x04, 0x01, 0x00, 0x03, 0x00, 0x04, 0x70, 0x13,
167*0957b409SSimon J. Gerraty 0x02, 0x00, 0x00, 0x00, 0x14, 0x06, 0x14, 0x1F, 0x14, 0x22, 0x07, 0x17,
168*0957b409SSimon J. Gerraty 0x01, 0x2D, 0x0C, 0x06, 0x08, 0x22, 0x07, 0x1E, 0x01, 0x00, 0x1B, 0x1A,
169*0957b409SSimon J. Gerraty 0x00, 0x04, 0x69, 0x22, 0x1A, 0x00, 0x00, 0x14, 0x01, 0x0A, 0x0C, 0x1B,
170*0957b409SSimon J. Gerraty 0x01, 0x20, 0x0B, 0x10, 0x00
171*0957b409SSimon J. Gerraty };
172*0957b409SSimon J. Gerraty
173*0957b409SSimon J. Gerraty static const uint16_t t0_caddr[] = {
174*0957b409SSimon J. Gerraty 0,
175*0957b409SSimon J. Gerraty 5,
176*0957b409SSimon J. Gerraty 10,
177*0957b409SSimon J. Gerraty 15,
178*0957b409SSimon J. Gerraty 19,
179*0957b409SSimon J. Gerraty 24,
180*0957b409SSimon J. Gerraty 29,
181*0957b409SSimon J. Gerraty 67,
182*0957b409SSimon J. Gerraty 149,
183*0957b409SSimon J. Gerraty 384,
184*0957b409SSimon J. Gerraty 396,
185*0957b409SSimon J. Gerraty 431,
186*0957b409SSimon J. Gerraty 450,
187*0957b409SSimon J. Gerraty 460,
188*0957b409SSimon J. Gerraty 479,
189*0957b409SSimon J. Gerraty 523,
190*0957b409SSimon J. Gerraty 534,
191*0957b409SSimon J. Gerraty 539,
192*0957b409SSimon J. Gerraty 549,
193*0957b409SSimon J. Gerraty 574,
194*0957b409SSimon J. Gerraty 601
195*0957b409SSimon J. Gerraty };
196*0957b409SSimon J. Gerraty
197*0957b409SSimon J. Gerraty #define T0_INTERPRETED 29
198*0957b409SSimon J. Gerraty
199*0957b409SSimon J. Gerraty #define T0_ENTER(ip, rp, slot) do { \
200*0957b409SSimon J. Gerraty const unsigned char *t0_newip; \
201*0957b409SSimon J. Gerraty uint32_t t0_lnum; \
202*0957b409SSimon J. Gerraty t0_newip = &t0_codeblock[t0_caddr[(slot) - T0_INTERPRETED]]; \
203*0957b409SSimon J. Gerraty t0_lnum = t0_parse7E_unsigned(&t0_newip); \
204*0957b409SSimon J. Gerraty (rp) += t0_lnum; \
205*0957b409SSimon J. Gerraty *((rp) ++) = (uint32_t)((ip) - &t0_codeblock[0]) + (t0_lnum << 16); \
206*0957b409SSimon J. Gerraty (ip) = t0_newip; \
207*0957b409SSimon J. Gerraty } while (0)
208*0957b409SSimon J. Gerraty
209*0957b409SSimon J. Gerraty #define T0_DEFENTRY(name, slot) \
210*0957b409SSimon J. Gerraty void \
211*0957b409SSimon J. Gerraty name(void *ctx) \
212*0957b409SSimon J. Gerraty { \
213*0957b409SSimon J. Gerraty t0_context *t0ctx = ctx; \
214*0957b409SSimon J. Gerraty t0ctx->ip = &t0_codeblock[0]; \
215*0957b409SSimon J. Gerraty T0_ENTER(t0ctx->ip, t0ctx->rp, slot); \
216*0957b409SSimon J. Gerraty }
217*0957b409SSimon J. Gerraty
218*0957b409SSimon J. Gerraty T0_DEFENTRY(br_pem_decoder_init_main, 38)
219*0957b409SSimon J. Gerraty
220*0957b409SSimon J. Gerraty #define T0_NEXT(t0ipp) (*(*(t0ipp)) ++)
221*0957b409SSimon J. Gerraty
222*0957b409SSimon J. Gerraty void
br_pem_decoder_run(void * t0ctx)223*0957b409SSimon J. Gerraty br_pem_decoder_run(void *t0ctx)
224*0957b409SSimon J. Gerraty {
225*0957b409SSimon J. Gerraty uint32_t *dp, *rp;
226*0957b409SSimon J. Gerraty const unsigned char *ip;
227*0957b409SSimon J. Gerraty
228*0957b409SSimon J. Gerraty #define T0_LOCAL(x) (*(rp - 2 - (x)))
229*0957b409SSimon J. Gerraty #define T0_POP() (*-- dp)
230*0957b409SSimon J. Gerraty #define T0_POPi() (*(int32_t *)(-- dp))
231*0957b409SSimon J. Gerraty #define T0_PEEK(x) (*(dp - 1 - (x)))
232*0957b409SSimon J. Gerraty #define T0_PEEKi(x) (*(int32_t *)(dp - 1 - (x)))
233*0957b409SSimon J. Gerraty #define T0_PUSH(v) do { *dp = (v); dp ++; } while (0)
234*0957b409SSimon J. Gerraty #define T0_PUSHi(v) do { *(int32_t *)dp = (v); dp ++; } while (0)
235*0957b409SSimon J. Gerraty #define T0_RPOP() (*-- rp)
236*0957b409SSimon J. Gerraty #define T0_RPOPi() (*(int32_t *)(-- rp))
237*0957b409SSimon J. Gerraty #define T0_RPUSH(v) do { *rp = (v); rp ++; } while (0)
238*0957b409SSimon J. Gerraty #define T0_RPUSHi(v) do { *(int32_t *)rp = (v); rp ++; } while (0)
239*0957b409SSimon J. Gerraty #define T0_ROLL(x) do { \
240*0957b409SSimon J. Gerraty size_t t0len = (size_t)(x); \
241*0957b409SSimon J. Gerraty uint32_t t0tmp = *(dp - 1 - t0len); \
242*0957b409SSimon J. Gerraty memmove(dp - t0len - 1, dp - t0len, t0len * sizeof *dp); \
243*0957b409SSimon J. Gerraty *(dp - 1) = t0tmp; \
244*0957b409SSimon J. Gerraty } while (0)
245*0957b409SSimon J. Gerraty #define T0_SWAP() do { \
246*0957b409SSimon J. Gerraty uint32_t t0tmp = *(dp - 2); \
247*0957b409SSimon J. Gerraty *(dp - 2) = *(dp - 1); \
248*0957b409SSimon J. Gerraty *(dp - 1) = t0tmp; \
249*0957b409SSimon J. Gerraty } while (0)
250*0957b409SSimon J. Gerraty #define T0_ROT() do { \
251*0957b409SSimon J. Gerraty uint32_t t0tmp = *(dp - 3); \
252*0957b409SSimon J. Gerraty *(dp - 3) = *(dp - 2); \
253*0957b409SSimon J. Gerraty *(dp - 2) = *(dp - 1); \
254*0957b409SSimon J. Gerraty *(dp - 1) = t0tmp; \
255*0957b409SSimon J. Gerraty } while (0)
256*0957b409SSimon J. Gerraty #define T0_NROT() do { \
257*0957b409SSimon J. Gerraty uint32_t t0tmp = *(dp - 1); \
258*0957b409SSimon J. Gerraty *(dp - 1) = *(dp - 2); \
259*0957b409SSimon J. Gerraty *(dp - 2) = *(dp - 3); \
260*0957b409SSimon J. Gerraty *(dp - 3) = t0tmp; \
261*0957b409SSimon J. Gerraty } while (0)
262*0957b409SSimon J. Gerraty #define T0_PICK(x) do { \
263*0957b409SSimon J. Gerraty uint32_t t0depth = (x); \
264*0957b409SSimon J. Gerraty T0_PUSH(T0_PEEK(t0depth)); \
265*0957b409SSimon J. Gerraty } while (0)
266*0957b409SSimon J. Gerraty #define T0_CO() do { \
267*0957b409SSimon J. Gerraty goto t0_exit; \
268*0957b409SSimon J. Gerraty } while (0)
269*0957b409SSimon J. Gerraty #define T0_RET() goto t0_next
270*0957b409SSimon J. Gerraty
271*0957b409SSimon J. Gerraty dp = ((t0_context *)t0ctx)->dp;
272*0957b409SSimon J. Gerraty rp = ((t0_context *)t0ctx)->rp;
273*0957b409SSimon J. Gerraty ip = ((t0_context *)t0ctx)->ip;
274*0957b409SSimon J. Gerraty goto t0_next;
275*0957b409SSimon J. Gerraty for (;;) {
276*0957b409SSimon J. Gerraty uint32_t t0x;
277*0957b409SSimon J. Gerraty
278*0957b409SSimon J. Gerraty t0_next:
279*0957b409SSimon J. Gerraty t0x = T0_NEXT(&ip);
280*0957b409SSimon J. Gerraty if (t0x < T0_INTERPRETED) {
281*0957b409SSimon J. Gerraty switch (t0x) {
282*0957b409SSimon J. Gerraty int32_t t0off;
283*0957b409SSimon J. Gerraty
284*0957b409SSimon J. Gerraty case 0: /* ret */
285*0957b409SSimon J. Gerraty t0x = T0_RPOP();
286*0957b409SSimon J. Gerraty rp -= (t0x >> 16);
287*0957b409SSimon J. Gerraty t0x &= 0xFFFF;
288*0957b409SSimon J. Gerraty if (t0x == 0) {
289*0957b409SSimon J. Gerraty ip = NULL;
290*0957b409SSimon J. Gerraty goto t0_exit;
291*0957b409SSimon J. Gerraty }
292*0957b409SSimon J. Gerraty ip = &t0_codeblock[t0x];
293*0957b409SSimon J. Gerraty break;
294*0957b409SSimon J. Gerraty case 1: /* literal constant */
295*0957b409SSimon J. Gerraty T0_PUSHi(t0_parse7E_signed(&ip));
296*0957b409SSimon J. Gerraty break;
297*0957b409SSimon J. Gerraty case 2: /* read local */
298*0957b409SSimon J. Gerraty T0_PUSH(T0_LOCAL(t0_parse7E_unsigned(&ip)));
299*0957b409SSimon J. Gerraty break;
300*0957b409SSimon J. Gerraty case 3: /* write local */
301*0957b409SSimon J. Gerraty T0_LOCAL(t0_parse7E_unsigned(&ip)) = T0_POP();
302*0957b409SSimon J. Gerraty break;
303*0957b409SSimon J. Gerraty case 4: /* jump */
304*0957b409SSimon J. Gerraty t0off = t0_parse7E_signed(&ip);
305*0957b409SSimon J. Gerraty ip += t0off;
306*0957b409SSimon J. Gerraty break;
307*0957b409SSimon J. Gerraty case 5: /* jump if */
308*0957b409SSimon J. Gerraty t0off = t0_parse7E_signed(&ip);
309*0957b409SSimon J. Gerraty if (T0_POP()) {
310*0957b409SSimon J. Gerraty ip += t0off;
311*0957b409SSimon J. Gerraty }
312*0957b409SSimon J. Gerraty break;
313*0957b409SSimon J. Gerraty case 6: /* jump if not */
314*0957b409SSimon J. Gerraty t0off = t0_parse7E_signed(&ip);
315*0957b409SSimon J. Gerraty if (!T0_POP()) {
316*0957b409SSimon J. Gerraty ip += t0off;
317*0957b409SSimon J. Gerraty }
318*0957b409SSimon J. Gerraty break;
319*0957b409SSimon J. Gerraty case 7: {
320*0957b409SSimon J. Gerraty /* + */
321*0957b409SSimon J. Gerraty
322*0957b409SSimon J. Gerraty uint32_t b = T0_POP();
323*0957b409SSimon J. Gerraty uint32_t a = T0_POP();
324*0957b409SSimon J. Gerraty T0_PUSH(a + b);
325*0957b409SSimon J. Gerraty
326*0957b409SSimon J. Gerraty }
327*0957b409SSimon J. Gerraty break;
328*0957b409SSimon J. Gerraty case 8: {
329*0957b409SSimon J. Gerraty /* - */
330*0957b409SSimon J. Gerraty
331*0957b409SSimon J. Gerraty uint32_t b = T0_POP();
332*0957b409SSimon J. Gerraty uint32_t a = T0_POP();
333*0957b409SSimon J. Gerraty T0_PUSH(a - b);
334*0957b409SSimon J. Gerraty
335*0957b409SSimon J. Gerraty }
336*0957b409SSimon J. Gerraty break;
337*0957b409SSimon J. Gerraty case 9: {
338*0957b409SSimon J. Gerraty /* < */
339*0957b409SSimon J. Gerraty
340*0957b409SSimon J. Gerraty int32_t b = T0_POPi();
341*0957b409SSimon J. Gerraty int32_t a = T0_POPi();
342*0957b409SSimon J. Gerraty T0_PUSH(-(uint32_t)(a < b));
343*0957b409SSimon J. Gerraty
344*0957b409SSimon J. Gerraty }
345*0957b409SSimon J. Gerraty break;
346*0957b409SSimon J. Gerraty case 10: {
347*0957b409SSimon J. Gerraty /* << */
348*0957b409SSimon J. Gerraty
349*0957b409SSimon J. Gerraty int c = (int)T0_POPi();
350*0957b409SSimon J. Gerraty uint32_t x = T0_POP();
351*0957b409SSimon J. Gerraty T0_PUSH(x << c);
352*0957b409SSimon J. Gerraty
353*0957b409SSimon J. Gerraty }
354*0957b409SSimon J. Gerraty break;
355*0957b409SSimon J. Gerraty case 11: {
356*0957b409SSimon J. Gerraty /* <= */
357*0957b409SSimon J. Gerraty
358*0957b409SSimon J. Gerraty int32_t b = T0_POPi();
359*0957b409SSimon J. Gerraty int32_t a = T0_POPi();
360*0957b409SSimon J. Gerraty T0_PUSH(-(uint32_t)(a <= b));
361*0957b409SSimon J. Gerraty
362*0957b409SSimon J. Gerraty }
363*0957b409SSimon J. Gerraty break;
364*0957b409SSimon J. Gerraty case 12: {
365*0957b409SSimon J. Gerraty /* <> */
366*0957b409SSimon J. Gerraty
367*0957b409SSimon J. Gerraty uint32_t b = T0_POP();
368*0957b409SSimon J. Gerraty uint32_t a = T0_POP();
369*0957b409SSimon J. Gerraty T0_PUSH(-(uint32_t)(a != b));
370*0957b409SSimon J. Gerraty
371*0957b409SSimon J. Gerraty }
372*0957b409SSimon J. Gerraty break;
373*0957b409SSimon J. Gerraty case 13: {
374*0957b409SSimon J. Gerraty /* = */
375*0957b409SSimon J. Gerraty
376*0957b409SSimon J. Gerraty uint32_t b = T0_POP();
377*0957b409SSimon J. Gerraty uint32_t a = T0_POP();
378*0957b409SSimon J. Gerraty T0_PUSH(-(uint32_t)(a == b));
379*0957b409SSimon J. Gerraty
380*0957b409SSimon J. Gerraty }
381*0957b409SSimon J. Gerraty break;
382*0957b409SSimon J. Gerraty case 14: {
383*0957b409SSimon J. Gerraty /* >= */
384*0957b409SSimon J. Gerraty
385*0957b409SSimon J. Gerraty int32_t b = T0_POPi();
386*0957b409SSimon J. Gerraty int32_t a = T0_POPi();
387*0957b409SSimon J. Gerraty T0_PUSH(-(uint32_t)(a >= b));
388*0957b409SSimon J. Gerraty
389*0957b409SSimon J. Gerraty }
390*0957b409SSimon J. Gerraty break;
391*0957b409SSimon J. Gerraty case 15: {
392*0957b409SSimon J. Gerraty /* >> */
393*0957b409SSimon J. Gerraty
394*0957b409SSimon J. Gerraty int c = (int)T0_POPi();
395*0957b409SSimon J. Gerraty int32_t x = T0_POPi();
396*0957b409SSimon J. Gerraty T0_PUSHi(x >> c);
397*0957b409SSimon J. Gerraty
398*0957b409SSimon J. Gerraty }
399*0957b409SSimon J. Gerraty break;
400*0957b409SSimon J. Gerraty case 16: {
401*0957b409SSimon J. Gerraty /* and */
402*0957b409SSimon J. Gerraty
403*0957b409SSimon J. Gerraty uint32_t b = T0_POP();
404*0957b409SSimon J. Gerraty uint32_t a = T0_POP();
405*0957b409SSimon J. Gerraty T0_PUSH(a & b);
406*0957b409SSimon J. Gerraty
407*0957b409SSimon J. Gerraty }
408*0957b409SSimon J. Gerraty break;
409*0957b409SSimon J. Gerraty case 17: {
410*0957b409SSimon J. Gerraty /* co */
411*0957b409SSimon J. Gerraty T0_CO();
412*0957b409SSimon J. Gerraty }
413*0957b409SSimon J. Gerraty break;
414*0957b409SSimon J. Gerraty case 18: {
415*0957b409SSimon J. Gerraty /* data-get8 */
416*0957b409SSimon J. Gerraty
417*0957b409SSimon J. Gerraty size_t addr = T0_POP();
418*0957b409SSimon J. Gerraty T0_PUSH(t0_datablock[addr]);
419*0957b409SSimon J. Gerraty
420*0957b409SSimon J. Gerraty }
421*0957b409SSimon J. Gerraty break;
422*0957b409SSimon J. Gerraty case 19: {
423*0957b409SSimon J. Gerraty /* drop */
424*0957b409SSimon J. Gerraty (void)T0_POP();
425*0957b409SSimon J. Gerraty }
426*0957b409SSimon J. Gerraty break;
427*0957b409SSimon J. Gerraty case 20: {
428*0957b409SSimon J. Gerraty /* dup */
429*0957b409SSimon J. Gerraty T0_PUSH(T0_PEEK(0));
430*0957b409SSimon J. Gerraty }
431*0957b409SSimon J. Gerraty break;
432*0957b409SSimon J. Gerraty case 21: {
433*0957b409SSimon J. Gerraty /* flush-buf */
434*0957b409SSimon J. Gerraty
435*0957b409SSimon J. Gerraty if (CTX->ptr > 0) {
436*0957b409SSimon J. Gerraty if (CTX->dest) {
437*0957b409SSimon J. Gerraty CTX->dest(CTX->dest_ctx, CTX->buf, CTX->ptr);
438*0957b409SSimon J. Gerraty }
439*0957b409SSimon J. Gerraty CTX->ptr = 0;
440*0957b409SSimon J. Gerraty }
441*0957b409SSimon J. Gerraty
442*0957b409SSimon J. Gerraty }
443*0957b409SSimon J. Gerraty break;
444*0957b409SSimon J. Gerraty case 22: {
445*0957b409SSimon J. Gerraty /* from-base64 */
446*0957b409SSimon J. Gerraty
447*0957b409SSimon J. Gerraty uint32_t c = T0_POP();
448*0957b409SSimon J. Gerraty uint32_t p, q, r, z;
449*0957b409SSimon J. Gerraty p = c - 0x41;
450*0957b409SSimon J. Gerraty q = c - 0x61;
451*0957b409SSimon J. Gerraty r = c - 0x30;
452*0957b409SSimon J. Gerraty
453*0957b409SSimon J. Gerraty z = ((p + 2) & -LT(p, 26))
454*0957b409SSimon J. Gerraty | ((q + 28) & -LT(q, 26))
455*0957b409SSimon J. Gerraty | ((r + 54) & -LT(r, 10))
456*0957b409SSimon J. Gerraty | (64 & -EQ(c, 0x2B))
457*0957b409SSimon J. Gerraty | (65 & -EQ(c, 0x2F))
458*0957b409SSimon J. Gerraty | EQ(c, 0x3D);
459*0957b409SSimon J. Gerraty T0_PUSHi((int32_t)z - 2);
460*0957b409SSimon J. Gerraty
461*0957b409SSimon J. Gerraty }
462*0957b409SSimon J. Gerraty break;
463*0957b409SSimon J. Gerraty case 23: {
464*0957b409SSimon J. Gerraty /* get8 */
465*0957b409SSimon J. Gerraty
466*0957b409SSimon J. Gerraty size_t addr = T0_POP();
467*0957b409SSimon J. Gerraty T0_PUSH(*((unsigned char *)CTX + addr));
468*0957b409SSimon J. Gerraty
469*0957b409SSimon J. Gerraty }
470*0957b409SSimon J. Gerraty break;
471*0957b409SSimon J. Gerraty case 24: {
472*0957b409SSimon J. Gerraty /* over */
473*0957b409SSimon J. Gerraty T0_PUSH(T0_PEEK(1));
474*0957b409SSimon J. Gerraty }
475*0957b409SSimon J. Gerraty break;
476*0957b409SSimon J. Gerraty case 25: {
477*0957b409SSimon J. Gerraty /* read8-native */
478*0957b409SSimon J. Gerraty
479*0957b409SSimon J. Gerraty if (CTX->hlen > 0) {
480*0957b409SSimon J. Gerraty T0_PUSH(*CTX->hbuf ++);
481*0957b409SSimon J. Gerraty CTX->hlen --;
482*0957b409SSimon J. Gerraty } else {
483*0957b409SSimon J. Gerraty T0_PUSHi(-1);
484*0957b409SSimon J. Gerraty }
485*0957b409SSimon J. Gerraty
486*0957b409SSimon J. Gerraty }
487*0957b409SSimon J. Gerraty break;
488*0957b409SSimon J. Gerraty case 26: {
489*0957b409SSimon J. Gerraty /* set8 */
490*0957b409SSimon J. Gerraty
491*0957b409SSimon J. Gerraty size_t addr = T0_POP();
492*0957b409SSimon J. Gerraty unsigned x = T0_POP();
493*0957b409SSimon J. Gerraty *((unsigned char *)CTX + addr) = x;
494*0957b409SSimon J. Gerraty
495*0957b409SSimon J. Gerraty }
496*0957b409SSimon J. Gerraty break;
497*0957b409SSimon J. Gerraty case 27: {
498*0957b409SSimon J. Gerraty /* swap */
499*0957b409SSimon J. Gerraty T0_SWAP();
500*0957b409SSimon J. Gerraty }
501*0957b409SSimon J. Gerraty break;
502*0957b409SSimon J. Gerraty case 28: {
503*0957b409SSimon J. Gerraty /* write8 */
504*0957b409SSimon J. Gerraty
505*0957b409SSimon J. Gerraty unsigned char x = (unsigned char)T0_POP();
506*0957b409SSimon J. Gerraty CTX->buf[CTX->ptr ++] = x;
507*0957b409SSimon J. Gerraty if (CTX->ptr == sizeof CTX->buf) {
508*0957b409SSimon J. Gerraty if (CTX->dest) {
509*0957b409SSimon J. Gerraty CTX->dest(CTX->dest_ctx, CTX->buf, sizeof CTX->buf);
510*0957b409SSimon J. Gerraty }
511*0957b409SSimon J. Gerraty CTX->ptr = 0;
512*0957b409SSimon J. Gerraty }
513*0957b409SSimon J. Gerraty
514*0957b409SSimon J. Gerraty }
515*0957b409SSimon J. Gerraty break;
516*0957b409SSimon J. Gerraty }
517*0957b409SSimon J. Gerraty
518*0957b409SSimon J. Gerraty } else {
519*0957b409SSimon J. Gerraty T0_ENTER(ip, rp, t0x);
520*0957b409SSimon J. Gerraty }
521*0957b409SSimon J. Gerraty }
522*0957b409SSimon J. Gerraty t0_exit:
523*0957b409SSimon J. Gerraty ((t0_context *)t0ctx)->dp = dp;
524*0957b409SSimon J. Gerraty ((t0_context *)t0ctx)->rp = rp;
525*0957b409SSimon J. Gerraty ((t0_context *)t0ctx)->ip = ip;
526*0957b409SSimon J. Gerraty }
527