---
software/libfpvm/fpvm.c | 24 ++++++++++++++++++------
1 files changed, 18 insertions(+), 6 deletions(-)
diff --git a/software/libfpvm/fpvm.c b/software/libfpvm/fpvm.c
index 4ad48c2..0b1c112 100644
--- a/software/libfpvm/fpvm.c
+++ b/software/libfpvm/fpvm.c
@@ -274,6 +274,18 @@ static int operator2opcode(const char *operator)
#define ADD_ISN(op, opa, opb, dest) \
do { ADD_ISN_RET(op, opa, opb, dest) FPVM_INVALID_REG; } while (0)
+#define ADD_INV_SQRT(in, out) \
+ do { \
+ if(!add_inv_sqrt(fragment, in, out)) \
+ return FPVM_INVALID_REG; \
+ } while (0)
+
+#define ADD_INT(in, out) \
+ do { \
+ if(!add_int(fragment, in, out)) \
+ return FPVM_INVALID_REG; \
+ } while (0)
+
#define REG_ALLOC(reg) \
reg = fragment->next_sur--
@@ -441,10 +453,10 @@ static int compile(struct fpvm_fragment *fragment, int
reg, struct ast_node *nod
*/
int REG_ALLOC(reg_invsqrt);
- if(!add_inv_sqrt(fragment, opa, reg_invsqrt)) return
FPVM_INVALID_REG;
+ ADD_INV_SQRT(opa, reg_invsqrt);
ADD_ISN(FPVM_OPCODE_FMUL, opa, reg_invsqrt, reg);
} else if(strcmp(node->label, "invsqrt") == 0) {
- if(!add_inv_sqrt(fragment, opa, reg)) return FPVM_INVALID_REG;
+ ADD_INV_SQRT(opa, reg);
} else if(strcmp(node->label, "/") == 0) {
/*
* Floating point division is implemented as
@@ -459,7 +471,7 @@ static int compile(struct fpvm_fragment *fragment, int reg,
struct ast_node *nod
ADD_ISN(FPVM_OPCODE_TSIGN, opa, opb, reg_a2);
ADD_ISN(FPVM_OPCODE_FABS, opb, 0, reg_b2);
- if(!add_inv_sqrt(fragment, reg_b2, reg_invsqrt)) return
FPVM_INVALID_REG;
+ ADD_INV_SQRT(reg_b2, reg_invsqrt);
ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt, reg_invsqrt,
reg_invsqrt2);
ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt2, reg_a2, reg);
@@ -470,11 +482,11 @@ static int compile(struct fpvm_fragment *fragment, int
reg, struct ast_node *nod
int REG_ALLOC(reg_idiv);
int REG_ALLOC(reg_bidiv);
- if(!add_inv_sqrt(fragment, opb, reg_invsqrt)) return
FPVM_INVALID_REG;
+ ADD_INV_SQRT(opb, reg_invsqrt);
ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt, reg_invsqrt,
reg_invsqrt2);
ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt2, opa, reg_div);
- if(!add_int(fragment, reg_div, reg_idiv)) return
FPVM_INVALID_REG;
+ ADD_INT(reg_div, reg_idiv);
ADD_ISN(FPVM_OPCODE_FMUL, opb, reg_idiv, reg_bidiv);
ADD_ISN(FPVM_OPCODE_FSUB, opa, reg_bidiv, reg);
} else if(strcmp(node->label, "min") == 0) {
@@ -486,7 +498,7 @@ static int compile(struct fpvm_fragment *fragment, int reg,
struct ast_node *nod
} else if(strcmp(node->label, "sqr") == 0) {
ADD_ISN(FPVM_OPCODE_FMUL, opa, opa, reg);
} else if(strcmp(node->label, "int") == 0) {
- if(!add_int(fragment, opa, reg)) return FPVM_INVALID_REG;
+ ADD_INT(opa, reg);
} else if(strcmp(node->label, "!") == 0) {
opb = find_negative_constant(fragment);
if(opb == FPVM_INVALID_REG) return FPVM_INVALID_REG;
--
1.7.1
_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode