harec

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit c5cdb1df0719262e16c64e7efd8d41fbd97bec75
parent 453901edc02420bda841f892b60169340a9f999b
Author: Drew DeVault <sir@cmpwn.com>
Date:   Sun,  2 May 2021 13:58:05 -0400

Revert "eval_binarithm: implement floats"

This reverts commit 74d160f5cb767bc96a62fb7f33c07472680b46d9.

Diffstat:
Msrc/eval.c | 134+++++++++++++++++++++++++++++--------------------------------------------------
Mtests/10-binarithms.ha | 11-----------
2 files changed, 49 insertions(+), 96 deletions(-)

diff --git a/src/eval.c b/src/eval.c @@ -106,17 +106,6 @@ itrunc(const struct type *type, uintmax_t val) assert(0); } -static double -ftrunc(const struct type *type, double val) -{ - if (type->storage == STORAGE_F32) { - return (float)val; - } else if (type->storage == STORAGE_F64) { - return val; - } - assert(0); -} - enum eval_result eval_binarithm(struct context *ctx, struct expression *in, struct expression *out) { @@ -131,107 +120,90 @@ eval_binarithm(struct context *ctx, struct expression *in, struct expression *ou } bool blval = lvalue.constant.bval, brval = rvalue.constant.bval, bval; - intmax_t ilval = lvalue.constant.ival, irval = rvalue.constant.ival, ival; - uintmax_t ulval = lvalue.constant.uval, urval = rvalue.constant.uval, uval; - double flval = lvalue.constant.fval, frval = rvalue.constant.fval, fval; + intmax_t ilval = itrunc(lvalue.result, lvalue.constant.ival), + irval = itrunc(rvalue.result, rvalue.constant.ival), ival; + uintmax_t ulval = itrunc(lvalue.result, lvalue.constant.uval), + urval = itrunc(rvalue.result, rvalue.constant.uval), uval; // Type promotion is lowered in check assert(lvalue.result->storage == rvalue.result->storage); switch (in->binarithm.op) { case BIN_BAND: - assert(!type_is_float(lvalue.result)); if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) & itrunc(rvalue.result, irval); + ival = ilval & irval; } else { - uval = itrunc(lvalue.result, ulval) & itrunc(rvalue.result, urval); + uval = ulval & urval; } break; case BIN_BOR: - assert(!type_is_float(lvalue.result)); if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) | itrunc(rvalue.result, irval); + ival = ilval | irval; } else { - uval = itrunc(lvalue.result, ulval) | itrunc(rvalue.result, frval); + uval = ulval | urval; } break; case BIN_DIV: - if (type_is_float(lvalue.result)) { - fval = ftrunc(lvalue.result, flval) / ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) / itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + ival = ilval / irval; } else { - uval = itrunc(lvalue.result, ulval) / itrunc(rvalue.result, urval); + uval = ulval / urval; } break; case BIN_LSHIFT: assert(!type_is_signed(rvalue.result)); - assert(!type_is_float(lvalue.result)); - uval = itrunc(lvalue.result, ulval) << itrunc(rvalue.result, urval); + uval = ulval << urval; break; case BIN_MINUS: - if (type_is_float(lvalue.result)) { - fval = ftrunc(lvalue.result, flval) - ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) - itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + ival = ilval - irval; } else { - uval = itrunc(lvalue.result, ulval) - itrunc(rvalue.result, urval); + uval = ulval - urval; } break; case BIN_MODULO: - assert(!type_is_float(lvalue.result)); if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) % itrunc(rvalue.result, irval); + ival = ilval % irval; } else { - uval = itrunc(lvalue.result, ulval) % itrunc(rvalue.result, urval); + uval = ulval % urval; } break; case BIN_PLUS: - if (type_is_float(lvalue.result)) { - fval = ftrunc(lvalue.result, flval) + ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) + itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + ival = ilval + irval; } else { - uval = itrunc(lvalue.result, ulval) + itrunc(rvalue.result, urval); + uval = ulval + urval; } break; case BIN_RSHIFT: assert(!type_is_signed(rvalue.result)); - assert(!type_is_float(lvalue.result)); - uval = itrunc(lvalue.result, ulval) >> itrunc(rvalue.result, urval); + uval = ulval >> urval; break; case BIN_TIMES: - if (type_is_float(lvalue.result)) { - fval = ftrunc(lvalue.result, flval) * ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) * itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + ival = ilval * irval; } else { - uval = itrunc(lvalue.result, ulval) * itrunc(rvalue.result, urval); + uval = ulval * urval; } break; case BIN_BXOR: - assert(!type_is_float(lvalue.result)); if (type_is_signed(lvalue.result)) { - ival = itrunc(lvalue.result, ilval) ^ itrunc(rvalue.result, irval); + ival = ilval ^ irval; } else { - uval = itrunc(lvalue.result, ulval) ^ itrunc(rvalue.result, urval); + uval = ulval ^ urval; } break; // Logical arithmetic case BIN_GREATER: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) > ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) > itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval > irval; } else { - bval = itrunc(lvalue.result, ulval) > itrunc(rvalue.result, urval); + bval = ulval > urval; } break; case BIN_GREATEREQ: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) >= ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) >= itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval >= irval; } else { - bval = itrunc(lvalue.result, ulval) >= itrunc(rvalue.result, urval); + bval = ulval >= urval; } break; case BIN_LAND: @@ -240,30 +212,24 @@ eval_binarithm(struct context *ctx, struct expression *in, struct expression *ou bval = blval && brval; break; case BIN_LEQUAL: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) == ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) == itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval == irval; } else { - bval = itrunc(lvalue.result, ulval) == itrunc(rvalue.result, urval); + bval = ulval == urval; } break; case BIN_LESS: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) < ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) < itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval < irval; } else { - bval = itrunc(lvalue.result, ulval) < itrunc(rvalue.result, urval); + bval = ulval < urval; } break; case BIN_LESSEQ: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) <= ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) <= itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval <= irval; } else { - bval = itrunc(lvalue.result, ulval) <= itrunc(rvalue.result, urval); + bval = ulval <= urval; } break; case BIN_LOR: @@ -277,25 +243,23 @@ eval_binarithm(struct context *ctx, struct expression *in, struct expression *ou bval = blval != brval; break; case BIN_NEQUAL: - if (type_is_float(lvalue.result)) { - bval = ftrunc(lvalue.result, flval) != ftrunc(rvalue.result, frval); - } else if (type_is_signed(lvalue.result)) { - bval = itrunc(lvalue.result, ilval) != itrunc(rvalue.result, irval); + if (type_is_signed(lvalue.result)) { + bval = ilval != irval; } else { - bval = itrunc(lvalue.result, ulval) != itrunc(rvalue.result, urval); + bval = ulval != urval; } break; } + uval = itrunc(in->result, uval); + ival = itrunc(in->result, ival); out->type = EXPR_CONSTANT; out->result = in->result; - if (type_is_float(in->result)) { - out->constant.fval = fval; - } else if (type_is_signed(in->result)) { - out->constant.ival = itrunc(in->result, ival); + if (type_is_signed(in->result)) { + out->constant.ival = ival; } else if (type_dealias(in->result)->storage == STORAGE_BOOL) { out->constant.bval = bval; } else { - out->constant.uval = itrunc(in->result, uval); + out->constant.uval = uval; } return EVAL_OK; } diff --git a/tests/10-binarithms.ha b/tests/10-binarithms.ha @@ -89,19 +89,8 @@ fn sar_shr() void = { assert(h1 == -189203912); }; -def FLOAT: f64 = 6.0 * 7.0; -def I8: i8 = 127 * 2; -def U8: u8 = 128 * 2; - -fn eval() void = { - assert(FLOAT == 42.0); - assert(I8 == 126); - assert(U8 == 0); -}; - export fn main() void = { // TODO: other binarithms andorxor(); sar_shr(); - eval(); };