folding for lteqgt (less than equal to or greater than) operator a.k.a <=> which...
authorDale Weiler <killfieldengine@gmail.com>
Wed, 31 Jul 2013 12:59:34 +0000 (12:59 +0000)
committerDale Weiler <killfieldengine@gmail.com>
Wed, 31 Jul 2013 12:59:34 +0000 (12:59 +0000)
fold.c

diff --git a/fold.c b/fold.c
index f2ec7457ad3d48c3045ddc645ff862b2b5c66fe4..d7de3ae85458a19eeb223d0740fac85bad791f99 100644 (file)
--- a/fold.c
+++ b/fold.c
@@ -399,6 +399,17 @@ static GMQCC_INLINE ast_expression *fold_op_andor(fold_t *fold, ast_value *a, as
     return NULL;
 }
 
     return NULL;
 }
 
+static GMQCC_INLINE ast_expression *fold_op_lteqgt(fold_t *fold, ast_value *a, ast_value *b) {
+    if (!isfloats(a, b))
+        return NULL;
+
+    if (fold_immvalue_float(a)  < fold_immvalue_float(b)) return (ast_expression*)fold->imm_float[2];/* -1 */
+    if (fold_immvalue_float(a) == fold_immvalue_float(b)) return (ast_expression*)fold->imm_float[0];/* 0  */
+    if (fold_immvalue_float(a)  > fold_immvalue_float(b)) return (ast_expression*)fold->imm_float[1];/* 1  */
+
+    return NULL;
+}
+
 ast_expression *fold_op(fold_t *fold, const oper_info *info, ast_expression **opexprs) {
     ast_value *a = (ast_value*)opexprs[0];
     ast_value *b = (ast_value*)opexprs[1];
 ast_expression *fold_op(fold_t *fold, const oper_info *info, ast_expression **opexprs) {
     ast_value *a = (ast_value*)opexprs[0];
     ast_value *b = (ast_value*)opexprs[1];
@@ -464,16 +475,14 @@ ast_expression *fold_op(fold_t *fold, const oper_info *info, ast_expression **op
             return isfloat(a)              ? fold_constgen_float (fold, ~(qcint_t)fold_immvalue_float(a))
                  : NULL;
 
             return isfloat(a)              ? fold_constgen_float (fold, ~(qcint_t)fold_immvalue_float(a))
                  : NULL;
 
-        case opid1('*'):     return fold_op_mul  (fold, a, b);
-        case opid1('/'):     return fold_op_div  (fold, a, b);
-        case opid2('|','|'): return fold_op_andor(fold, a, b, true);
-        case opid2('&','&'): return fold_op_andor(fold, a, b, false);
+        case opid1('*'):         return fold_op_mul  (fold, a, b);
+        case opid1('/'):         return fold_op_div  (fold, a, b);
+        case opid2('|','|'):     return fold_op_andor(fold, a, b, true);
+        case opid2('&','&'):     return fold_op_andor(fold, a, b, false);
+        case opid3('<','=','>'): return fold_op_lteqgt(fold, a, b);
         case opid2('?',':'):
             /* TODO: seperate function for this case */
             return NULL;
         case opid2('?',':'):
             /* TODO: seperate function for this case */
             return NULL;
-        case opid3('<','=','>'):
-            /* TODO: seperate function for this case */
-            return NULL;
     }
     return NULL;
 }
     }
     return NULL;
 }