Commit 6a2f4e24 authored by Julian Kranz's avatar Julian Kranz

Gdrr

- Continued to implement gdrr
parent 46a9a839
......@@ -44,12 +44,54 @@ struct gddr_sem_stmt_callbacks {
gdrr_sem_address_t *target);
};
struct gddr_sem_op_callbacks {
gdrr_sem_op_t *(*sem_lin)(__word size, gdrr_sem_linear_t *opnd1);
gdrr_sem_op_t *(*sem_mul)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_div)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_divs)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_mod)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_shl)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_shr)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_shrs)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_and)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_or)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_xor)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_sx)(__word size, __word fromsize,
gdrr_sem_linear_t *opnd1);
gdrr_sem_op_t *(*sem_zx)(__word size, __word fromsize,
gdrr_sem_linear_t *opnd1);
gdrr_sem_op_t *(*sem_cmpeq)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_cmpneq)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_cmples)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_cmpleu)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_cmplts)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_cmpltu)(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2);
gdrr_sem_op_t *(*sem_arb)(__word size);
};
struct gddr_callbacks {
union {
struct gddr_sem_stmts_callbacks sem_stmts;
struct gddr_sem_stmts_list_callbacks sem_stmts_list;
};
struct gddr_sem_stmt_callbacks sem_stmt;
struct gddr_sem_op_callbacks sem_op;
};
gdrr_sem_stmt_t *gdrr_convert(__obj semantics, struct gddr_callbacks *callbacks);
......
......@@ -11,36 +11,146 @@
#include <dis.h>
#include "gdrr.h"
static gdrr_sem_op_t *gdrr_convert_sem_op(__obj sem_op_obj,
struct gddr_callbacks *callbacks) {
gdrr_sem_op_t *sem_op = NULL;
switch(__CASETAGCON(sem_op_obj)) {
case __SEM_LIN: {
sem_op = callbacks->sem_op.sem_lin(0, NULL);
break;
}
case __SEM_MUL: {
sem_op = callbacks->sem_op.sem_mul(0, NULL, NULL);
break;
}
case __SEM_DIV: {
sem_op = callbacks->sem_op.sem_div(0, NULL, NULL);
break;
}
case __SEM_DIVS: {
sem_op = callbacks->sem_op.sem_divs(0, NULL, NULL);
break;
}
case __SEM_MOD: {
sem_op = callbacks->sem_op.sem_mod(0, NULL, NULL);
break;
}
case __SEM_SHL: {
sem_op = callbacks->sem_op.sem_shl(0, NULL, NULL);
break;
}
case __SEM_SHR: {
sem_op = callbacks->sem_op.sem_shr(0, NULL, NULL);
break;
}
case __SEM_SHRS: {
sem_op = callbacks->sem_op.sem_shrs(0, NULL, NULL);
break;
}
case __SEM_AND: {
sem_op = callbacks->sem_op.sem_and(0, NULL, NULL);
break;
}
case __SEM_OR: {
sem_op = callbacks->sem_op.sem_or(0, NULL, NULL);
break;
}
case __SEM_XOR: {
sem_op = callbacks->sem_op.sem_xor(0, NULL, NULL);
break;
}
case __SEM_SX: {
sem_op = callbacks->sem_op.sem_sx(0, 0, NULL);
break;
}
case __SEM_ZX: {
sem_op = callbacks->sem_op.sem_zx(0, 0, NULL);
break;
}
case __SEM_CMPEQ: {
sem_op = callbacks->sem_op.sem_cmpeq(0, NULL, NULL);
break;
}
case __SEM_CMPNEQ: {
sem_op = callbacks->sem_op.sem_cmpneq(0, NULL, NULL);
break;
}
case __SEM_CMPLES: {
sem_op = callbacks->sem_op.sem_cmples(0, NULL, NULL);
break;
}
case __SEM_CMPLEU: {
sem_op = callbacks->sem_op.sem_cmpleu(0, NULL, NULL);
break;
}
case __SEM_CMPLTS: {
sem_op = callbacks->sem_op.sem_cmplts(0, NULL, NULL);
break;
}
case __SEM_CMPLTU: {
sem_op = callbacks->sem_op.sem_cmpltu(0, NULL, NULL);
break;
}
case __SEM_ARB: {
sem_op = callbacks->sem_op.sem_arb(0);
break;
}
}
return sem_op;
}
static gdrr_sem_stmt_t *gdrr_convert_sem_stmt(__obj sem_stmt_obj,
struct gddr_callbacks *callbacks) {
gdrr_sem_stmt_t *sem_stmt = NULL;
__obj rec = __DECON(sem_stmt_obj);
switch(__CASETAGCON(sem_stmt_obj)) {
case __SEM_ASSIGN: {
sem_stmt = callbacks->sem_stmt.sem_assign(NULL, NULL);
__obj lhs = __RECORD_SELECT(rec, ___lhs);
__obj rhs = __RECORD_SELECT(rec, ___rhs);
sem_stmt = callbacks->sem_stmt.sem_assign(NULL,
gdrr_convert_sem_op(rhs, callbacks));
break;
}
case __SEM_LOAD: {
__obj lhs = __RECORD_SELECT(rec, ___lhs);
__obj size = __RECORD_SELECT(rec, ___size);
__obj address = __RECORD_SELECT(rec, ___address);
sem_stmt = callbacks->sem_stmt.sem_load(NULL, 0, NULL);
break;
}
case __SEM_STORE: {
sem_stmt = callbacks->sem_stmt.sem_store(NULL, NULL);
__obj address = __RECORD_SELECT(rec, ___address);
__obj rhs = __RECORD_SELECT(rec, ___rhs);
sem_stmt = callbacks->sem_stmt.sem_store(NULL,
gdrr_convert_sem_op(rhs, callbacks));
break;
}
case __SEM_ITE: {
__obj cond = __RECORD_SELECT(rec, ___cond);
__obj then_branch = __RECORD_SELECT(rec, ___then_branch);
__obj else_branch = __RECORD_SELECT(rec, ___else_branch);
sem_stmt = callbacks->sem_stmt.sem_ite(NULL, NULL, NULL);
break;
}
case __SEM_WHILE: {
__obj cond = __RECORD_SELECT(rec, ___cond);
__obj body = __RECORD_SELECT(rec, ___body);
sem_stmt = callbacks->sem_stmt.sem_while(NULL, NULL);
break;
}
case __SEM_CBRANCH: {
__obj cond = __RECORD_SELECT(rec, ___cond);
__obj target_true = __RECORD_SELECT(rec, ___target_true);
__obj target_false = __RECORD_SELECT(rec, ___target_false);
sem_stmt = callbacks->sem_stmt.sem_cbranch(NULL, NULL, NULL);
break;
}
case __SEM_BRANCH: {
__obj hint = __RECORD_SELECT(rec, ___hint);
__obj target = __RECORD_SELECT(rec, ___target);
sem_stmt = callbacks->sem_stmt.sem_branch(NULL, NULL);
break;
}
......
......@@ -11,7 +11,6 @@ gdrr_sem_stmts_t *list_next(gdrr_sem_stmt_t *next, gdrr_sem_stmts_t *list) {
return NULL;
}
gdrr_sem_stmts_t *list_init() {
printf("init\n");
......@@ -23,38 +22,32 @@ gdrr_sem_stmt_t *sem_assign(gdrr_sem_var_t *lhs, gdrr_sem_op_t *rhs) {
return NULL;
}
gdrr_sem_stmt_t *sem_load(gdrr_sem_var_t *lhs, __word size, gdrr_sem_address_t *address) {
printf("load\n");
return NULL;
}
gdrr_sem_stmt_t *sem_store(gdrr_sem_var_t *lhs, gdrr_sem_op_t *rhs) {
printf("store\n");
return NULL;
}
gdrr_sem_stmt_t *sem_ite(gdrr_sem_linear_t *cond, gdrr_sem_stmts_t *then_branch, gdrr_sem_stmts_t *else_branch) {
printf("ite\n");
return NULL;
}
gdrr_sem_stmt_t *sem_while(gdrr_sem_linear_t *cond, gdrr_sem_stmts_t *body) {
printf("while\n");
return NULL;
}
gdrr_sem_stmt_t *sem_cbranch(gdrr_sem_linear_t *cond,
gdrr_sem_address_t *target_true, gdrr_sem_address_t *target_false) {
printf("cbranch\n");
return NULL;
}
gdrr_sem_stmt_t *sem_branch(gdrr_branch_hint *branch_hint,
gdrr_sem_address_t *target) {
printf("branch\n");
......@@ -62,6 +55,125 @@ gdrr_sem_stmt_t *sem_branch(gdrr_branch_hint *branch_hint,
return NULL;
}
gdrr_sem_op_t *sem_lin(__word size, gdrr_sem_linear_t *opnd1) {
printf("=> lin\n");
return NULL;
}
gdrr_sem_op_t *sem_mul(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> mul\n");
return NULL;
}
gdrr_sem_op_t *sem_div(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> div\n");
return NULL;
}
gdrr_sem_op_t *sem_divs(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> divs\n");
return NULL;
}
gdrr_sem_op_t *sem_mod(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> mod\n");
return NULL;
}
gdrr_sem_op_t *sem_shl(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> shl\n");
return NULL;
}
gdrr_sem_op_t *sem_shr(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> shr\n");
return NULL;
}
gdrr_sem_op_t *sem_shrs(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> shrs\n");
return NULL;
}
gdrr_sem_op_t *sem_and(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> and\n");
return NULL;
}
gdrr_sem_op_t *sem_or(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> or\n");
return NULL;
}
gdrr_sem_op_t *sem_xor(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> xor\n");
return NULL;
}
gdrr_sem_op_t *sem_sx(__word size, __word fromsize,
gdrr_sem_linear_t *opnd1) {
printf("=> sx\n");
return NULL;
}
gdrr_sem_op_t *sem_zx(__word size, __word fromsize,
gdrr_sem_linear_t *opnd1) {
printf("=> zx\n");
return NULL;
}
gdrr_sem_op_t *sem_cmpeq(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmpeq\n");
return NULL;
}
gdrr_sem_op_t *sem_cmpneq(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmpneq\n");
return NULL;
}
gdrr_sem_op_t *sem_cmples(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmples\n");
return NULL;
}
gdrr_sem_op_t *sem_cmpleu(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmpleu\n");
return NULL;
}
gdrr_sem_op_t *sem_cmplts(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmplts\n");
return NULL;
}
gdrr_sem_op_t *sem_cmpltu(__word size, gdrr_sem_linear_t *opnd1,
gdrr_sem_linear_t *opnd2) {
printf("=> cmpltu\n");
return NULL;
}
gdrr_sem_op_t *sem_arb(__word size) {
printf("=> arb\n");
return NULL;
}
int main (int argc, char** argv) {
__char blob[15];
char fmt[1024];
......@@ -107,6 +219,26 @@ done:
callbacks.sem_stmt.sem_cbranch = &sem_cbranch;
callbacks.sem_stmt.sem_branch = &sem_branch;
callbacks.sem_op.sem_lin = &sem_lin;
callbacks.sem_op.sem_mul = &sem_mul;
callbacks.sem_op.sem_div = &sem_div;
callbacks.sem_op.sem_divs = &sem_divs;
callbacks.sem_op.sem_mod = &sem_mod;
callbacks.sem_op.sem_shl = &sem_shl;
callbacks.sem_op.sem_shr = &sem_shr;
callbacks.sem_op.sem_shrs = &sem_shrs;
callbacks.sem_op.sem_and = &sem_and;
callbacks.sem_op.sem_or = &sem_or;
callbacks.sem_op.sem_xor = &sem_xor;
callbacks.sem_op.sem_sx = &sem_sx;
callbacks.sem_op.sem_zx = &sem_zx;
callbacks.sem_op.sem_cmpeq = &sem_cmpeq;
callbacks.sem_op.sem_cmpneq = &sem_cmpneq;
callbacks.sem_op.sem_cmples = &sem_cmpleu;
callbacks.sem_op.sem_cmplts = &sem_cmplts;
callbacks.sem_op.sem_cmpltu = &sem_cmpltu;
callbacks.sem_op.sem_arb = &sem_arb;
gdrr_convert(r, &callbacks);
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment