]> git.rm.cloudns.org Git - xonotic/gmqcc.git/commitdiff
fixed vector ops constant folding.
authorDale Weiler <killfieldengine@gmail.com>
Wed, 31 Jul 2013 17:05:43 +0000 (17:05 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Wed, 31 Jul 2013 17:05:43 +0000 (17:05 +0000)
fold.c
parser.c

diff --git a/fold.c b/fold.c
index 6a8cec232e1e31d5b5d43129cc83e01473bba494..5352b78f531b801fd5c9f97b6853388d6067a07a 100644 (file)
--- a/fold.c
+++ b/fold.c
@@ -323,7 +323,7 @@ static GMQCC_INLINE ast_expression *fold_op_mul_vec(fold_t *fold, vec3_t vec, as
         out                        = (ast_expression*)ast_member_new(fold_ctx(fold), (ast_expression*)sel, set[0]-'x', NULL);
         out->node.keep             = false;
         ((ast_member*)out)->rvalue = true;
-        if (!x != -1)
+        if (x != -1)
             return (ast_expression*)ast_binary_new(fold_ctx(fold), INSTR_MUL_F, fold_constgen_float(fold, x), out);
     }
     return NULL;
@@ -416,8 +416,21 @@ static GMQCC_INLINE ast_expression *fold_op_div(fold_t *fold, ast_value *a, ast_
     } else if (isvector(a)) {
         if (fold_can_2(a, b))
             return fold_constgen_vector(fold, vec3_mulvf(fold_immvalue_vector(a), 1.0f / fold_immvalue_float(b)));
-        else if (fold_can_1(b))
-            return fold_constgen_float (fold, 1.0f / fold_immvalue_float(b));
+        else {
+            return (ast_expression*)ast_binary_new(
+                fold_ctx(fold),
+                INSTR_MUL_VF,
+                (ast_expression*)a,
+                (fold_can_1(b))
+                    ? (ast_expression*)fold_constgen_float(fold, 1.0f / fold_immvalue_float(b))
+                    : (ast_expression*)ast_binary_new(
+                                            fold_ctx(fold),
+                                            INSTR_DIV_F,
+                                            (ast_expression*)fold->imm_float[1],
+                                            (ast_expression*)b
+                    )
+            );
+        }
     }
     return NULL;
 }
@@ -478,8 +491,8 @@ static GMQCC_INLINE ast_expression *fold_op_andor(fold_t *fold, ast_value *a, as
                 fold, 
                 ((or) ? (fold_immediate_true(fold, a) || fold_immediate_true(fold, b))
                       : (fold_immediate_true(fold, a) && fold_immediate_true(fold, b)))
-                            ? 1.0f
-                            : 0.0f
+                            ? 1
+                            : 0
             );
         }
     }
index fc2ef35de879a5cb58d49793984650ff6332f3c5..16613908e3034ac6a3b3599e33a8c0c7a38be941 100644 (file)
--- a/parser.c
+++ b/parser.c
@@ -587,6 +587,7 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
                 }
             }
             break;
+
         case opid1('/'):
             if (exprs[1]->vtype != TYPE_FLOAT) {
                 ast_type_to_string(exprs[0], ty1, sizeof(ty1));
@@ -595,21 +596,9 @@ static bool parser_sy_apply_operator(parser_t *parser, shunt *sy)
                 return false;
             }
             if (!(out = fold_op(parser->fold, op, exprs))) {
-                if (exprs[0]->vtype == TYPE_FLOAT) 
+                if (exprs[0]->vtype == TYPE_FLOAT)
                     out = (ast_expression*)ast_binary_new(ctx, INSTR_DIV_F, exprs[0], exprs[1]);
-                else if (exprs[0]->vtype == TYPE_VECTOR) {
-                    out = (ast_expression*)ast_binary_new (
-                                ctx,
-                                INSTR_MUL_VF,
-                                exprs[0],
-                                (ast_expression*)ast_binary_new(
-                                    ctx,
-                                    INSTR_DIV_F,
-                                    (ast_expression*)parser->fold->imm_float[1],
-                                    exprs[1]
-                                )
-                    );
-                } else {
+                else {
                     ast_type_to_string(exprs[0], ty1, sizeof(ty1));
                     ast_type_to_string(exprs[1], ty2, sizeof(ty2));
                     compile_error(ctx, "invalid types used in expression: cannot divide types %s and %s", ty1, ty2);