aboutsummaryrefslogtreecommitdiff
path: root/ir.h
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2018-01-05 23:42:24 +0100
committertomsmeding <tom.smeding@gmail.com>2018-01-05 23:42:24 +0100
commit3272b5d83d2e2167eed24748557df88bd66584ee (patch)
tree6b8f1574f6d6a44e11b74903516286f6249cb0b7 /ir.h
parenta298cb75c4f586b83b304c7dc66cb555693ea1b8 (diff)
There's actually a chance that, correctly stringified, this will work
Diffstat (limited to 'ir.h')
-rw-r--r--ir.h19
1 files changed, 14 insertions, 5 deletions
diff --git a/ir.h b/ir.h
index e732a3d..5d92eed 100644
--- a/ir.h
+++ b/ir.h
@@ -26,6 +26,7 @@ enum instype {
INS_RET, // return
INS_RETV, // return r1
INS_MOV, // r0 = r1
+ INS_BRK, // halt
};
enum condcode {
@@ -64,8 +65,11 @@ struct ref {
struct irins {
enum instype type;
- struct ref r0, r1, r2;
- char *name;
+ union {
+ struct ref three_refs[3];
+ struct {struct ref r0, r1, r2;};
+ };
+ const char *name; // should be a return value from ir_str()
enum condcode condcode;
};
@@ -82,22 +86,27 @@ void ir_delete(struct ir *ir);
void ir_print(struct ir *ir, FILE *f);
void irins_print(struct irins *ins, FILE *f);
+const char* ir_str(const char *str); // returns interned string
+
// returns offset in .data segment
struct ref ir_reserve_global(struct ir *ir, int size);
+void ir_insert_before(struct ir *ir, int pos, struct irins *ins);
void ir_append(struct ir *ir, struct irins *ins);
struct irins* irins_make(enum instype type);
-struct irins* irins_make_name(enum instype type, char *name);
+struct irins* irins_make_name(enum instype type, const char *name);
struct irins* irins_make_0(enum instype type, struct ref r0);
struct irins* irins_make_01(enum instype type, struct ref r0, struct ref r1);
struct irins* irins_make_012(enum instype type, struct ref r0, struct ref r1, struct ref r2);
struct irins* irins_make_1(enum instype type, struct ref r1);
struct irins* irins_make_12(enum instype type, struct ref r1, struct ref r2);
-struct irins* irins_make_jcc(char *name, enum condcode condcode);
+struct irins* irins_make_jcc(const char *name, enum condcode condcode);
void irins_delete(struct irins *ins);
-char* gen_label_name(void);
+void irins_which_refs(const struct irins *ins, bool haveref[3]);
+
+const char* gen_label_name(void);
struct ref ref_reg(int reg);
struct ref ref_mem(int reg, int offset, enum refrel rel);