X-Git-Url: https://git.xonotic.org/?a=blobdiff_plain;ds=sidebyside;f=fold.c;h=f064f29fa5d599c48dfda5e49342e32aaee3b98b;hb=8c0a280a3e0db2e50998a6bf9623dd7f4cb6fb8c;hp=84b01c772e707c2b8e86fc5633b99120e0c678a4;hpb=43e9885a085b307d720ef7e8e327a094ec89f45b;p=xonotic%2Fgmqcc.git diff --git a/fold.c b/fold.c index 84b01c7..f064f29 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; } @@ -609,11 +609,11 @@ static GMQCC_INLINE ast_expression *fold_op_cmp(fold_t *fold, ast_value *a, ast_ 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)]; + 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 (ast_expression*)fold->imm_float[!(ne ? vec3_cmp(la, lb) : !vec3_cmp(la, lb))]; } } return NULL; @@ -729,7 +729,7 @@ static GMQCC_INLINE ast_expression *fold_intrin_asinh(fold_t *fold, ast_value *a return fold_constgen_float(fold, asinhf(fold_immvalue_float(a))); } static GMQCC_INLINE ast_expression *fold_intrin_atanh(fold_t *fold, ast_value *a) { - return fold_constgen_float(fold, atanhf(fold_immvalue_float(a))); + return fold_constgen_float(fold, (float)atanh(fold_immvalue_float(a))); } static GMQCC_INLINE ast_expression *fold_intrin_exp(fold_t *fold, ast_value *a) { return fold_constgen_float(fold, expf(fold_immvalue_float(a)));