---
 software/libfpvm/fpvm.c |   64 +++++++++++++++++------------------------------
 1 files changed, 23 insertions(+), 41 deletions(-)

diff --git a/software/libfpvm/fpvm.c b/software/libfpvm/fpvm.c
index 2de105c..cd06046 100644
--- a/software/libfpvm/fpvm.c
+++ b/software/libfpvm/fpvm.c
@@ -274,20 +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        REG_ALLOC(reg) \
+       reg = fragment->next_sur--
+
 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_yy;
-       int reg_hx;
-       int reg_hxyy;
-       int reg_sub;
-
-       reg_yy = fragment->next_sur--;
-       reg_hx = fragment->next_sur--;
-       reg_hxyy = fragment->next_sur--;
-       reg_sub = fragment->next_sur--;
+       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;
@@ -305,10 +303,8 @@ static int add_inv_sqrt_step(struct fpvm_fragment 
*fragment,
 
 static int add_inv_sqrt(struct fpvm_fragment *fragment, int reg_in, int 
reg_out)
 {
-       int reg_y, reg_y2;
-
-       reg_y = fragment->next_sur--;
-       reg_y2 = fragment->next_sur--;
+       int REG_ALLOC(reg_y);
+       int REG_ALLOC(reg_y2);
 
        ADD_ISN_0(FPVM_OPCODE_QUAKE, reg_in, 0, reg_y);
        if(!add_inv_sqrt_step(fragment, reg_y, reg_in, reg_y2)) return 0;
@@ -319,9 +315,8 @@ static int add_inv_sqrt(struct fpvm_fragment *fragment, int 
reg_in, int reg_out)
 
 static int add_int(struct fpvm_fragment *fragment, int reg_in, int reg_out)
 {
-       int reg_i;
+       int REG_ALLOC(reg_i);
 
-       reg_i = fragment->next_sur--;
        ADD_ISN(FPVM_OPCODE_F2I, reg_in, 0, reg_i);
        ADD_ISN(FPVM_OPCODE_I2F, reg_i, 0, reg_out);
        return 1;
@@ -423,8 +418,8 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
                 * to an integer expressed in 1/8192 turns for FPVM.
                 */
                int reg_const;
-               int reg_mul;
-               int reg_f2i;
+               int REG_ALLOC(reg_mul);
+               int REG_ALLOC(reg_f2i);
 
                if(strcmp(node->label, "sin") == 0)
                        opcode = FPVM_OPCODE_SIN;
@@ -433,8 +428,6 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
 
                reg_const = const_to_reg(fragment, FPVM_TRIG_CONV);
                if(reg_const == FPVM_INVALID_REG) return FPVM_INVALID_REG;
-               reg_mul = fragment->next_sur--;
-               reg_f2i = fragment->next_sur--;
 
                ADD_ISN(FPVM_OPCODE_FMUL, reg_const, opa, reg_mul);
                ADD_ISN(FPVM_OPCODE_F2I, reg_mul, 0, reg_f2i);
@@ -445,8 +438,8 @@ static int compile(struct fpvm_fragment *fragment, int reg, 
struct ast_node *nod
                 * See http://en.wikipedia.org/wiki/Fast_inverse_square_root
                 * sqrt(x) = x*(1/sqrt(x))
                 */
-               int reg_invsqrt;
-               reg_invsqrt = fragment->next_sur--;
+               int REG_ALLOC(reg_invsqrt);
+
                if(!add_inv_sqrt(fragment, opa, reg_invsqrt)) return 
FPVM_INVALID_REG;
                ADD_ISN(FPVM_OPCODE_FMUL, opa, reg_invsqrt, reg);
        } else if(strcmp(node->label, "invsqrt") == 0) {
@@ -456,15 +449,10 @@ static int compile(struct fpvm_fragment *fragment, int 
reg, struct ast_node *nod
                 * Floating point division is implemented as
                 * a/b = a*(1/sqrt(b))*(1/sqrt(b))
                 */
-               int reg_a2;
-               int reg_b2;
-               int reg_invsqrt;
-               int reg_invsqrt2;
-
-               reg_a2 = fragment->next_sur--;
-               reg_b2 = fragment->next_sur--;
-               reg_invsqrt = fragment->next_sur--;
-               reg_invsqrt2 = fragment->next_sur--;
+               int REG_ALLOC(reg_a2);
+               int REG_ALLOC(reg_b2);
+               int REG_ALLOC(reg_invsqrt);
+               int REG_ALLOC(reg_invsqrt2);
 
                /* Transfer the sign of the result to a and make b positive */
                ADD_ISN(FPVM_OPCODE_TSIGN, opa, opb, reg_a2);
@@ -475,17 +463,11 @@ static int compile(struct fpvm_fragment *fragment, int 
reg, struct ast_node *nod
                    reg_invsqrt2);
                ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt2, reg_a2, reg);
        } else if(strcmp(node->label, "%") == 0) {
-               int reg_invsqrt;
-               int reg_invsqrt2;
-               int reg_div;
-               int reg_idiv;
-               int reg_bidiv;
-
-               reg_invsqrt = fragment->next_sur--;
-               reg_invsqrt2 = fragment->next_sur--;
-               reg_div = fragment->next_sur--;
-               reg_idiv = fragment->next_sur--;
-               reg_bidiv = fragment->next_sur--;
+               int REG_ALLOC(reg_invsqrt);
+               int REG_ALLOC(reg_invsqrt2);
+               int REG_ALLOC(reg_div);
+               int REG_ALLOC(reg_idiv);
+               int REG_ALLOC(reg_bidiv);
 
                if(!add_inv_sqrt(fragment, opb, reg_invsqrt)) return 
FPVM_INVALID_REG;
                ADD_ISN(FPVM_OPCODE_FMUL, reg_invsqrt, reg_invsqrt,
-- 
1.7.1

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

Reply via email to