mirror of
https://github.com/DarkPlacesEngine/gmqcc.git
synced 2025-03-22 18:51:24 +00:00
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
This commit is contained in:
parent
9ed62eee58
commit
86adb94d7d
1 changed files with 16 additions and 7 deletions
23
fold.c
23
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;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue