summaryrefslogtreecommitdiff
path: root/examples/jit/ojprogram.c
diff options
context:
space:
mode:
Diffstat (limited to 'examples/jit/ojprogram.c')
-rw-r--r--examples/jit/ojprogram.c190
1 files changed, 46 insertions, 144 deletions
diff --git a/examples/jit/ojprogram.c b/examples/jit/ojprogram.c
index aac03c8..44cbea3 100644
--- a/examples/jit/ojprogram.c
+++ b/examples/jit/ojprogram.c
@@ -9,18 +9,6 @@
#include "ojprogram.h"
-const OJOpcode opcode_list[] = {
- { "load", 2 },
- { "store", 2 },
- { "add", 3 }
-};
-#define N_OPCODES 3
-
-#define ARG_REG 0
-#define ARG_SRC 1
-#define ARG_DEST 2
-
-
OJProgram *
oj_program_new (void)
{
@@ -30,167 +18,81 @@ oj_program_new (void)
}
int
-oj_opcode_lookup (const char *s, int len)
+oj_program_add_temporary (OJProgram *program, OJType *type)
{
- int i;
- for(i=0;i<N_OPCODES;i++){
- if (strlen (opcode_list[i].name) != len) continue;
- if (strncmp (opcode_list[i].name, s, len) == 0) {
- return i;
- }
- }
- return -1;
+ return 0;
}
-static gboolean
-get_opcode (OJProgram *p)
+int
+oj_program_add_source (OJProgram *program, const char *type)
{
- char *s;
- char *opcode;
- int opcode_len;
- int i;
-
- if (p->error) return FALSE;
-
- g_print("looking for opcode at \"%s\"\n", p->s);
-
- s = p->s;
- while (g_ascii_isspace (s[0])) s++;
- opcode = s;
- while (g_ascii_isalnum (s[0])) s++;
- opcode_len = s - opcode;
- if (opcode_len == 0) {
- p->error = g_strdup ("expected opcode");
- return FALSE;
- }
-
- p->insn->opcode = oj_opcode_lookup (opcode, opcode_len);
-
- for(i=0;i<N_OPCODES;i++){
- if (strlen (opcode_list[i].name) != opcode_len) continue;
- if (strncmp (opcode_list[i].name, opcode, opcode_len) == 0) {
- break;
- }
- }
- if (i == N_OPCODES) {
- p->error = g_strdup ("unknown opcode");
- return FALSE;
- }
-
- p->insn->opcode = i;
- p->s = s;
- return TRUE;
+ return 0;
}
-static gboolean
-get_arg (OJProgram *p, int i)
+int
+oj_program_add_destination (OJProgram *program, const char *type)
{
- char *s;
- char *end;
-
- if (p->error) return FALSE;
-
- g_print("looking for arg at \"%s\"\n", p->s);
-
- s = p->s;
- while (g_ascii_isspace (s[0])) s++;
-
- switch (s[0]) {
- case 'r':
- p->insn->args[i].type = ARG_REG;
- break;
- case 's':
- p->insn->args[i].type = ARG_SRC;
- break;
- case 'd':
- p->insn->args[i].type = ARG_DEST;
- break;
- default:
- p->s = s;
- p->error = g_strdup ("expected argument");
- return FALSE;
- }
- s++;
- p->insn->args[i].index = strtoul (s, &end, 10);
- if (s == end) {
- p->s = s;
- p->error = strdup ("expected number");
- return FALSE;
- }
-
- s = end;
-
- p->s = s;
- return TRUE;
+ return 0;
}
-static gboolean
-skip_comma (OJProgram *p)
+int
+oj_program_add_constant (OJProgram *program, OJType *type, int value)
{
- char *s;
- if (p->error) return FALSE;
-
- g_print("looking for comma at \"%s\"\n", p->s);
+ return 0;
+}
- s = p->s;
- while (g_ascii_isspace (s[0])) s++;
- if (s[0] != ',') {
- p->error = g_strdup ("expected comma");
- return FALSE;
- }
- s++;
- while (g_ascii_isspace (s[0])) s++;
+int
+oj_program_add_parameter (OJProgram *program, OJType *type, int value)
+{
- p->s = s;
- return TRUE;
+ return 0;
}
void
-oj_program_parse (OJProgram *p, const char *program)
+oj_program_append (OJProgram *program, const char *opcode, int arg0,
+ int arg1, int arg2)
{
- char **lines;
- char *line;
- char *s;
- int i;
- lines = g_strsplit(program, "\n", 0);
- for(i=0;lines[i];i++){
- p->insn = p->insns + p->n_insns;
- line = lines[i];
-
- s = line;
+}
- g_print("looking at \"%s\"\n", s);
- while (g_ascii_isspace (s[0])) s++;
- if (s[0] == 0 || s[0] == '#') continue;
- p->s = s;
- get_opcode (p);
+OJType *types;
+static int n_types;
+static int n_alloc_types;
- get_arg (p, 0);
- if (opcode_list[p->insn->opcode].n_args >= 2) {
- skip_comma (p);
- get_arg (p, 1);
- if (opcode_list[p->insn->opcode].n_args >= 3) {
- skip_comma (p);
- get_arg (p, 2);
- }
+OJType *
+oj_type_get (const char *name)
+{
+ int i;
+ for(i=0;i<n_types;i++){
+ if (!strcmp (types[i].name, name)) {
+ return types + i;
}
+ }
+ return NULL;
+}
- if (p->error) {
- g_print("error on line %d: %s at \"%s\"\n", i, p->error, p->s);
- g_free(p->error);
- p->error = NULL;
- }
+void
+oj_type_register (const char *name, int size)
+{
+ OJType *type;
- p->n_insns++;
+ if (n_types == n_alloc_types) {
+ n_alloc_types += 100;
+ types = realloc (types, sizeof(OJType) * n_alloc_types);
}
- g_strfreev (lines);
+
+ type = types + n_types;
+ type->name = strdup (name);
+ type->size = size;
+
+ n_types++;
}
+