From: Dale Weiler Date: Wed, 31 Jul 2013 12:59:34 +0000 (+0000) Subject: folding for lteqgt (less than equal to or greater than) operator a.k.a <=> which... X-Git-Tag: v0.3.0~48 X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=86adb94d7da365a5092d1866c37f71b0d89dae3b;p=xonotic%2Fgmqcc.git folding for lteqgt (less than equal to or greater than) operator a.k.a <=> which maps values to -1,0,1 depending on the result (think of the result as a troolan) .. it's a perl thing :P --- diff --git a/fold.c b/fold.c index f2ec745..d7de3ae 100644 --- 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; } +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]; @@ -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; - 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 opid3('<','=','>'): - /* TODO: seperate function for this case */ - return NULL; } return NULL; }