aboutsummaryrefslogtreecommitdiff
path: root/ir.h
diff options
context:
space:
mode:
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);