X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=fold.c;h=d90887da2ae2012ab17f55fe193a7b70d8866e9b;hb=1bf9ebabcce7731b83c302e8416bba41c3cdf5da;hp=40580e45a168216482d39b2f15cbbc0b34a9652c;hpb=ac7e1a557d6dde0fc201e74c23446a65d5b8a142;p=xonotic%2Fgmqcc.git diff --git a/fold.c b/fold.c index 40580e4..d90887d 100644 --- a/fold.c +++ b/fold.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2013 + * Copyright (C) 2012, 2013, 2014 * Dale Weiler * * Permission is hereby granted, free of charge, to any person obtaining a copy of @@ -550,13 +550,13 @@ static GMQCC_INLINE ast_expression *fold_op_xor(fold_t *fold, ast_value *a, ast_ static GMQCC_INLINE ast_expression *fold_op_lshift(fold_t *fold, ast_value *a, ast_value *b) { if (fold_can_2(a, b) && isfloats(a, b)) - return fold_constgen_float(fold, (qcfloat_t)((qcuint_t)(fold_immvalue_float(a)) << (qcuint_t)(fold_immvalue_float(b)))); + return fold_constgen_float(fold, (qcfloat_t)(((qcuint_t)(floorf(fold_immvalue_float(a) * powf(2.0f, fold_immvalue_float(b))))) & 0xFFFFFF)); return NULL; } static GMQCC_INLINE ast_expression *fold_op_rshift(fold_t *fold, ast_value *a, ast_value *b) { if (fold_can_2(a, b) && isfloats(a, b)) - return fold_constgen_float(fold, (qcfloat_t)((qcuint_t)(fold_immvalue_float(a)) >> (qcuint_t)(fold_immvalue_float(b)))); + return fold_constgen_float(fold, (qcfloat_t)(((qcuint_t)(floorf(fold_immvalue_float(a) / powf(2.0f, fold_immvalue_float(b))))) & 0xFFFFFF)); return NULL; } @@ -606,10 +606,15 @@ static GMQCC_INLINE ast_expression *fold_op_lteqgt(fold_t *fold, ast_value *a, a static GMQCC_INLINE ast_expression *fold_op_cmp(fold_t *fold, ast_value *a, ast_value *b, bool ne) { if (fold_can_2(a, b)) { - if (isfloat(a) && isfloat(b)) - return fold_constgen_float(fold, ne != (fold_immvalue_float(a) == fold_immvalue_float(b))); - if (isvector(a) && isvector(b)) - return fold_constgen_float(fold, ne != vec3_cmp(fold_immvalue_vector(a), fold_immvalue_vector(b))); + if (isfloat(a) && isfloat(b)) { + float la = fold_immvalue_float(a); + float lb = fold_immvalue_float(b); + return (ast_expression*)fold->imm_float[!(ne ? la == lb : la != lb)]; + } if (isvector(a) && isvector(b)) { + vec3_t la = fold_immvalue_vector(a); + vec3_t lb = fold_immvalue_vector(b); + return (ast_expression*)fold->imm_float[!(ne ? vec3_cmp(la, lb) : !vec3_cmp(la, lb))]; + } } return NULL; }