---
 software/libfpvm/fpvm.c |   31 ++++++++++++++++---------------
 1 files changed, 16 insertions(+), 15 deletions(-)

diff --git a/software/libfpvm/fpvm.c b/software/libfpvm/fpvm.c
index cd06046..4ad48c2 100644
--- a/software/libfpvm/fpvm.c
+++ b/software/libfpvm/fpvm.c
@@ -277,21 +277,27 @@ static int operator2opcode(const char *operator)
 #define        REG_ALLOC(reg) \
        reg = fragment->next_sur--
 
+#define        REG_CONST_RET(reg, val, ret)                            \
+       reg = ({ int tmp = const_to_reg(fragment, val);         \
+                if(tmp == FPVM_INVALID_REG) return ret;        \
+                tmp; })
+
+#define        REG_CONST_0(reg, val) \
+       REG_CONST_RET(reg, val, 0)
+
+#define        REG_CONST(reg, val) \
+       REG_CONST_RET(reg, val, FPVM_INVALID_REG)
+
 static int add_inv_sqrt_step(struct fpvm_fragment *fragment,
     int reg_y, int reg_x, int reg_out)
 {
-       int reg_onehalf;
-       int reg_twohalf;
+       int REG_CONST_0(reg_onehalf, 0.5f);
+       int REG_CONST(reg_twohalf, 1.5f);
        int REG_ALLOC(reg_yy);
        int REG_ALLOC(reg_hx);
        int REG_ALLOC(reg_hxyy);
        int REG_ALLOC(reg_sub);
 
-       reg_onehalf = const_to_reg(fragment, 0.5f);
-       if(reg_onehalf == FPVM_INVALID_REG) return 0;
-       reg_twohalf = const_to_reg(fragment, 1.5f);
-       if(reg_twohalf == FPVM_INVALID_REG) return 0;
-
        ADD_ISN_0(FPVM_OPCODE_FMUL, reg_y, reg_y, reg_yy);
        ADD_ISN_0(FPVM_OPCODE_FMUL, reg_onehalf, reg_x, reg_hx);
        ADD_ISN_0(FPVM_OPCODE_FMUL, reg_hx, reg_yy, reg_hxyy);
@@ -336,8 +342,7 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
 
        if(node->label[0] == 0) {
                /* AST node is a constant */
-               opa = const_to_reg(fragment, node->contents.constant);
-               if(opa == FPVM_INVALID_REG) return FPVM_INVALID_REG;
+               REG_CONST(opa, node->contents.constant);
                if(reg != FPVM_INVALID_REG)
                        ADD_ISN(FPVM_OPCODE_COPY, opa, 0, reg);
                else
@@ -371,8 +376,7 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
                struct ast_node *n;
 
                n = node->contents.branches.a;
-               opa = const_to_reg(fragment, -n->contents.constant);
-               if(opa == FPVM_INVALID_REG) return FPVM_INVALID_REG;
+               REG_CONST(opa, -n->contents.constant);
                if(reg != FPVM_INVALID_REG)
                        ADD_ISN(FPVM_OPCODE_COPY, opa, 0, reg);
                else
@@ -417,7 +421,7 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
                 * We must convert the floating point argument in radians
                 * to an integer expressed in 1/8192 turns for FPVM.
                 */
-               int reg_const;
+               int REG_CONST(reg_const, FPVM_TRIG_CONV);
                int REG_ALLOC(reg_mul);
                int REG_ALLOC(reg_f2i);
 
@@ -426,9 +430,6 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
                else
                        opcode = FPVM_OPCODE_COS;
 
-               reg_const = const_to_reg(fragment, FPVM_TRIG_CONV);
-               if(reg_const == FPVM_INVALID_REG) return FPVM_INVALID_REG;
-
                ADD_ISN(FPVM_OPCODE_FMUL, reg_const, opa, reg_mul);
                ADD_ISN(FPVM_OPCODE_F2I, reg_mul, 0, reg_f2i);
                ADD_ISN(opcode, reg_f2i, 0, reg);
-- 
1.7.1

_______________________________________________
http://lists.milkymist.org/listinfo.cgi/devel-milkymist.org
IRC: #milkymist@Freenode

Reply via email to