aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/qbt/abi.h162
-rw-r--r--include/qbt/nodes.h168
-rw-r--r--include/qbt/parser.h12
-rw-r--r--include/qbt/vec.h8
4 files changed, 181 insertions, 169 deletions
diff --git a/include/qbt/abi.h b/include/qbt/abi.h
index cc33dfc..2a915b2 100644
--- a/include/qbt/abi.h
+++ b/include/qbt/abi.h
@@ -170,87 +170,87 @@ enum {
RS24,
};
-#define FOREACH_REG(M)\
- M(RX0)\
- M(RX1)\
- M(RX2)\
- M(RX3)\
- M(RX4)\
- M(RX5)\
- M(RX6)\
- M(RX7)\
- M(RX8)\
- M(RX9)\
- M(RX10)\
- M(RX11)\
- M(RX12)\
- M(RX13)\
- M(RX14)\
- M(RX15)\
- M(RX16)\
- M(RX17)\
- M(RX18)\
- M(RX19)\
- M(RX20)\
- M(RX21)\
- M(RX22)\
- M(RX23)\
- M(RX24)\
- M(RX25)\
- M(RX26)\
- M(RX27)\
- M(RX28)\
- M(RX29)\
- M(RX30)\
- M(RX31)\
- M(RX32)\
- M(RX33)\
- M(RX34)\
- M(RX35)\
- M(RX36)\
- M(RX37)\
- M(RX38)\
- M(RX39)\
- M(RX40)\
- M(RX41)\
- M(RX42)\
- M(RX43)\
- M(RX44)\
- M(RX45)\
- M(RX46)\
- M(RX47)\
- M(RX48)\
- M(RX49)\
- M(RX50)\
- M(RX51)\
- M(RX52)\
- M(RX53)\
- M(RX54)\
- M(RX55)\
- M(RX56)\
- M(RX57)\
- M(RX58)\
- M(RX59)\
- M(RX60)\
- M(RX61)\
- M(RX62)\
- M(RX63)\
- M(RX64)\
- M(RX65)\
- M(RX66)\
- M(RX67)\
- M(RX68)\
- M(RX69)\
- M(RX70)\
- M(RX71)\
- M(RX72)\
- M(RX73)\
- M(RX74)\
- M(RX75)\
- M(RX76)\
- M(RX77)\
- M(RX78)\
- M(RX79)\
+#define FOREACH_REG(M) \
+ M(RX0) \
+ M(RX1) \
+ M(RX2) \
+ M(RX3) \
+ M(RX4) \
+ M(RX5) \
+ M(RX6) \
+ M(RX7) \
+ M(RX8) \
+ M(RX9) \
+ M(RX10) \
+ M(RX11) \
+ M(RX12) \
+ M(RX13) \
+ M(RX14) \
+ M(RX15) \
+ M(RX16) \
+ M(RX17) \
+ M(RX18) \
+ M(RX19) \
+ M(RX20) \
+ M(RX21) \
+ M(RX22) \
+ M(RX23) \
+ M(RX24) \
+ M(RX25) \
+ M(RX26) \
+ M(RX27) \
+ M(RX28) \
+ M(RX29) \
+ M(RX30) \
+ M(RX31) \
+ M(RX32) \
+ M(RX33) \
+ M(RX34) \
+ M(RX35) \
+ M(RX36) \
+ M(RX37) \
+ M(RX38) \
+ M(RX39) \
+ M(RX40) \
+ M(RX41) \
+ M(RX42) \
+ M(RX43) \
+ M(RX44) \
+ M(RX45) \
+ M(RX46) \
+ M(RX47) \
+ M(RX48) \
+ M(RX49) \
+ M(RX50) \
+ M(RX51) \
+ M(RX52) \
+ M(RX53) \
+ M(RX54) \
+ M(RX55) \
+ M(RX56) \
+ M(RX57) \
+ M(RX58) \
+ M(RX59) \
+ M(RX60) \
+ M(RX61) \
+ M(RX62) \
+ M(RX63) \
+ M(RX64) \
+ M(RX65) \
+ M(RX66) \
+ M(RX67) \
+ M(RX68) \
+ M(RX69) \
+ M(RX70) \
+ M(RX71) \
+ M(RX72) \
+ M(RX73) \
+ M(RX74) \
+ M(RX75) \
+ M(RX76) \
+ M(RX77) \
+ M(RX78) \
+ M(RX79) \
M(RX80)
void abi0(struct fn *f);
diff --git a/include/qbt/nodes.h b/include/qbt/nodes.h
index d3ddc5f..ff30b12 100644
--- a/include/qbt/nodes.h
+++ b/include/qbt/nodes.h
@@ -43,46 +43,46 @@ enum insn_type {
RETVAL,
};
-#define FOREACH_INSN_TYPE(M)\
- M(ADD)\
- M(SUB)\
- M(MUL)\
- M(DIV)\
- M(REM)\
- M(CALL)\
- M(LABEL)\
- M(STORE)\
- M(LOAD)\
- M(ALLOC)\
- M(COPY)\
- M(MOVE)\
- M(EQ)\
- M(NE)\
- M(LE)\
- M(GE)\
- M(LT)\
- M(GT)\
- M(NOT)\
- M(NEG)\
- M(LSHIFT)\
- M(RSHIFT)\
- M(BEQ)\
- M(BNE)\
- M(BLE)\
- M(BGE)\
- M(BLT)\
- M(BGT)\
- M(J)\
- M(ARG)\
- M(RETARG)\
- M(PARAM)\
- M(RET)\
- M(RETVAL)\
+#define FOREACH_INSN_TYPE(M) \
+ M(ADD) \
+ M(SUB) \
+ M(MUL) \
+ M(DIV) \
+ M(REM) \
+ M(CALL) \
+ M(LABEL) \
+ M(STORE) \
+ M(LOAD) \
+ M(ALLOC) \
+ M(COPY) \
+ M(MOVE) \
+ M(EQ) \
+ M(NE) \
+ M(LE) \
+ M(GE) \
+ M(LT) \
+ M(GT) \
+ M(NOT) \
+ M(NEG) \
+ M(LSHIFT) \
+ M(RSHIFT) \
+ M(BEQ) \
+ M(BNE) \
+ M(BLE) \
+ M(BGE) \
+ M(BLT) \
+ M(BGT) \
+ M(J) \
+ M(ARG) \
+ M(RETARG) \
+ M(PARAM) \
+ M(RET) \
+ M(RETVAL) \
static inline const char *op_str(enum insn_type n) {
#define CASE(I) case I: return #I;
switch (n) {
- FOREACH_INSN_TYPE(CASE);
+ FOREACH_INSN_TYPE(CASE);
}
#undef CASE
return "unknown";
@@ -105,8 +105,8 @@ struct val {
enum val_class class;
int64_t r;
union {
- int64_t v;
- const char *s;
+ int64_t v;
+ const char *s;
};
};
@@ -162,53 +162,53 @@ static inline bool hasnoclass(struct val v)
static inline struct val noclass()
{
return (struct val){
- .class = NOCLASS,
- .r = 0,
- .v = 0,
+ .class = NOCLASS,
+ .r = 0,
+ .v = 0,
};
}
static inline struct val reg_val(int64_t r)
{
return (struct val){
- .class = REG,
- .r = r
+ .class = REG,
+ .r = r
};
}
static inline struct val imm_ref(const char *s)
{
return (struct val){
- .class = REF,
- .r = 0,
- .s = s,
+ .class = REF,
+ .r = 0,
+ .s = s,
};
}
static inline struct val mem_val(int64_t base, int64_t offset)
{
return (struct val){
- .class = MEM,
- .r = base,
- .v = offset,
+ .class = MEM,
+ .r = base,
+ .v = offset,
};
}
static inline struct val imm_val(int64_t imm, int64_t type)
{
return (struct val) {
- .class = IMM,
- .r = type,
- .v = imm,
+ .class = IMM,
+ .r = type,
+ .v = imm,
};
}
static inline struct val tmp_val(int64_t t)
{
return (struct val) {
- .class = TMP,
- .r = t,
- .v = 0,
+ .class = TMP,
+ .r = t,
+ .v = 0,
};
}
@@ -218,34 +218,38 @@ static inline bool same_val(struct val v1, struct val v2)
return false;
switch (v1.class) {
- case REG: return v1.r == v2.r;
- case TMP: return v1.r == v2.r;
- case IMM: return v1.v == v2.v;
- case MEM: return v1.v == v2.v;
- case REF: return v1.r == v2.r && v1.v == v2.v;
- case NOCLASS: return true;
+ case REG: return v1.r == v2.r;
+ case TMP: return v1.r == v2.r;
+ case IMM: return v1.v == v2.v;
+ case MEM: return v1.v == v2.v;
+ case REF: return v1.r == v2.r && v1.v == v2.v;
+ case NOCLASS: return true;
}
/* shouldn't be reachable */
return false;
}
-static inline struct insn insn_create(enum insn_type o, enum val_type t, struct val r, struct val a0, struct val a1)
+static inline struct insn insn_create(enum insn_type o, enum val_type t,
+ struct val r, struct val a0,
+ struct val a1)
{
return (struct insn) {
- .type = o,
- .vtype = t,
- .out = r,
- .in = {a0, a1}
+ .type = o,
+ .vtype = t,
+ .out = r,
+ .in = {a0, a1}
};
}
int64_t idalloc(struct fn *f, const char *id);
int64_t idmatch(struct fn *f, const char *id);
-void insadd(struct blk *b, enum insn_type o, enum val_type t, struct val r, struct val a0, struct val a1);
+void insadd(struct blk *b, enum insn_type o, enum val_type t, struct val r,
+ struct val a0, struct val a1);
-void finish_block(struct blk *b, enum insn_type cmp, struct val a0, struct val a1, const char *label);
+void finish_block(struct blk *b, enum insn_type cmp, struct val a0,
+ struct val a1, const char *label);
struct blk *new_block(struct fn *f);
void destroy_block(struct blk *b);
@@ -270,40 +274,46 @@ struct label_map {
struct blk *b;
};
-#define tmp_at(v, i)\
+#define val_at(v, i) \
+ vect_at(struct val, v, i)
+
+#define foreach_val(iter, vals) \
+ foreach_vec(iter, vals)
+
+#define tmp_at(v, i) \
vect_at(struct tmp_map, v, i)
#define foreach_tmp(iter, tmps) \
foreach_vec(iter, tmps)
-#define blk_at(v, i)\
+#define blk_at(v, i) \
vect_at(struct blk *, v, i)
-#define blk_back(v)\
+#define blk_back(v) \
vect_at(struct blk *, v, vec_len(&v) - 1)
-#define blk_pop(v)\
+#define blk_pop(v) \
vect_pop(struct blk *, v)
-#define foreach_blk(iter, blocks)\
+#define foreach_blk(iter, blocks) \
foreach_vec(iter, blocks)
-#define foreach_blk_param(iter, block_params)\
+#define foreach_blk_param(iter, block_params) \
foreach_vec(iter, block_params)
-#define blk_param_at(v, i)\
+#define blk_param_at(v, i) \
vect_at(struct val, v, i)
-#define label_at(v, i)\
+#define label_at(v, i) \
vect_at(struct label_map, v, i)
-#define foreach_label(iter, labels)\
+#define foreach_label(iter, labels) \
foreach_vec(iter, labels)
-#define insn_at(v, i)\
+#define insn_at(v, i) \
vect_at(struct insn, v, i)
-#define foreach_insn(iter, insns)\
+#define foreach_insn(iter, insns) \
foreach_vec(iter, insns)
#endif /* NODES_H */
diff --git a/include/qbt/parser.h b/include/qbt/parser.h
index 34912c9..df17bea 100644
--- a/include/qbt/parser.h
+++ b/include/qbt/parser.h
@@ -44,22 +44,22 @@ struct parser *create_parser();
void parse(struct parser *p, const char *fname, const char *buf);
void destroy_parser(struct parser *p);
-#define foreach_fn(iter, v)\
+#define foreach_fn(iter, v) \
foreach_vec(iter, v)
-#define foreach_data(iter, v)\
+#define foreach_data(iter, v) \
foreach_vec(iter, v)
-#define foreach_str(iter, v)\
+#define foreach_str(iter, v) \
foreach_vec(iter, v)
-#define fn_at(v, i)\
+#define fn_at(v, i) \
vect_at(struct fn_map, v, i)
-#define data_at(v, i)\
+#define data_at(v, i) \
vect_at(struct data_map, v, i)
-#define str_at(v, i)\
+#define str_at(v, i) \
vect_at(char *, v, i)
#endif /* PARSER_H */
diff --git a/include/qbt/vec.h b/include/qbt/vec.h
index 727c110..471e127 100644
--- a/include/qbt/vec.h
+++ b/include/qbt/vec.h
@@ -12,18 +12,20 @@ struct vec {
struct vec vec_create(size_t s);
void vec_destroy(struct vec *v);
+void vec_reset(struct vec *v);
+
size_t vec_len(struct vec *v);
void *vec_at(struct vec *v, size_t i);
void *vec_pop(struct vec *v);
void vec_append(struct vec *v, void *n);
-#define foreach_vec(iter, v)\
+#define foreach_vec(iter, v) \
for (size_t iter = 0, __n = vec_len(&v); iter < __n; ++iter)
-#define vect_at(type, v, i)\
+#define vect_at(type, v, i) \
*(type *)vec_at(&v, i)
-#define vect_pop(type, v)\
+#define vect_pop(type, v) \
*(type *)vec_pop(&v)
#endif /* VEC_H */