Blame simple/bytebeat/funcs.c

Ivan Mahonin 744572
Ivan Mahonin 744572
#include "lexer.c"
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef enum {
Ivan Mahonin 744572
  T_U32,
Ivan Mahonin 744572
  T_F32,
Ivan Mahonin 744572
} Type;
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef enum {
Ivan Mahonin 744572
  M_VALUE = 0,
Ivan Mahonin 9e60e5
  M_FUNC,
Ivan Mahonin 9e60e5
  M_FUNC2,
Ivan Mahonin 744572
  M_ARRAY,
Ivan Mahonin 744572
  M_INDEX,
Ivan Mahonin 744572
  M_PREFIX,
Ivan Mahonin 744572
  M_BINARY,
Ivan Mahonin 744572
  M_TERNARY,
Ivan Mahonin 744572
} Mode;
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef struct {
Ivan Mahonin 744572
  Type type;
Ivan Mahonin 744572
  union {
Ivan Mahonin 744572
    U32 u;
Ivan Mahonin 744572
    F32 f;
Ivan Mahonin 744572
  };
Ivan Mahonin 744572
} Var;
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef struct {
Ivan Mahonin 744572
  U32 t;
Ivan Mahonin 744572
  Var a, b, c;
Ivan Mahonin 744572
} Params;
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef Var (*Func)(Params p);
Ivan Mahonin 744572
Ivan Mahonin 744572
typedef struct {
Ivan Mahonin 744572
  Mode mode;
Ivan Mahonin 744572
  int priority;
Ivan Mahonin 744572
  const char *key;
Ivan Mahonin 744572
  Func func;
Ivan Mahonin 744572
  U32 k;
Ivan Mahonin 744572
} OpDesc;
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
static inline Var vari(U32 u)
Ivan Mahonin 744572
  { Var v; v.type = T_U32; v.u = u; return v; }
Ivan Mahonin 744572
static inline Var varf(F32 f)
Ivan Mahonin 744572
  { Var v; v.type = T_F32; v.f = f; return v; }
Ivan Mahonin 744572
Ivan Mahonin 744572
static inline int isint(Var v)
Ivan Mahonin 744572
  { return v.type == T_U32; }
Ivan Mahonin 744572
static inline int isflt(Var v)
Ivan Mahonin 744572
  { return v.type == T_F32; }
Ivan Mahonin 744572
static inline int isflt2(Var a, Var b)
Ivan Mahonin 744572
  { return isflt(a) || isflt(b); }
Ivan Mahonin 744572
Ivan Mahonin 744572
static inline U32 asint(Var v)
Ivan Mahonin 9e60e5
  { return isflt(v) ? (U32)(I32)v.f : v.u; }
Ivan Mahonin 744572
static inline F32 asflt(Var v)
Ivan Mahonin 9e60e5
  { return isflt(v) ? v.f : (F32)(I32)v.u; }
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_var(Params p)
Ivan Mahonin 744572
  { return vari(p.t); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_neg(Params p)
Ivan Mahonin 744572
  { return isflt(p.a) ? varf(-p.a.f) : vari(-p.a.u); }
Ivan Mahonin 744572
Var f_pos(Params p)
Ivan Mahonin 744572
  { return p.a; }
Ivan Mahonin 744572
Var f_not(Params p)
Ivan Mahonin 744572
  { return vari(~p.a.u); }
Ivan Mahonin 744572
Var f_boolnot(Params p)
Ivan Mahonin 744572
  { return vari(!p.a.u); }
Ivan Mahonin 744572
Var f_casti(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a)); }
Ivan Mahonin 744572
Var f_castf(Params p)
Ivan Mahonin 744572
  { return vari(asflt(p.a)); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_mul(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? varf(asflt(p.a) * asflt(p.b)) : vari(asint(p.a) * asint(p.b)); }
Ivan Mahonin 744572
Var f_div(Params p)
Ivan Mahonin 744572
  { F32 a = asflt(p.a), b = asflt(p.b); return varf(b ? a/b : a); }
Ivan Mahonin 744572
Var f_mod(Params p)
Ivan Mahonin 744572
  { U32 a = asint(p.a), b = asint(p.b); return vari(b ? a%b : a); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_add(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? varf(asflt(p.a) + asflt(p.b)) : vari(asint(p.a) + asint(p.b)); }
Ivan Mahonin 744572
Var f_sub(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? varf(asflt(p.a) - asflt(p.b)) : vari(asint(p.a) - asint(p.b)); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_shl(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a) << asint(p.b)); }
Ivan Mahonin 744572
Var f_shr(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a) >> asint(p.b)); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_lt(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? vari(asflt(p.a) < asflt(p.b)) : vari(asint(p.a) < asint(p.b)); }
Ivan Mahonin 744572
Var f_gt(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? vari(asflt(p.a) > asflt(p.b)) : vari(asint(p.a) > asint(p.b)); }
Ivan Mahonin 744572
Var f_leq(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? vari(asflt(p.a) <= asflt(p.b)) : vari(asint(p.a) <= asint(p.b)); }
Ivan Mahonin 744572
Var f_geq(Params p)
Ivan Mahonin 744572
  { return isflt2(p.a, p.b) ? vari(asflt(p.a) >= asflt(p.b)) : vari(asint(p.a) >= asint(p.b)); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_eq(Params p)
Ivan Mahonin 744572
  { return vari(p.a.u == p.b.u); }
Ivan Mahonin 744572
Var f_neq(Params p)
Ivan Mahonin 744572
  { return vari(p.a.u != p.b.u); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_and(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a) & asint(p.b)); }
Ivan Mahonin 744572
Var f_xor(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a) ^ asint(p.b)); }
Ivan Mahonin 744572
Var f_or(Params p)
Ivan Mahonin 744572
  { return vari(asint(p.a) | asint(p.b)); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_booland(Params p)
Ivan Mahonin 744572
  { return vari(p.a.u && p.b.u); }
Ivan Mahonin 744572
Var f_boolor(Params p)
Ivan Mahonin 744572
  { return vari(p.a.u || p.b.u); }
Ivan Mahonin 744572
Ivan Mahonin 744572
Var f_cond(Params p)
Ivan Mahonin 744572
  { return isflt2(p.b, p.c) ? (p.a.u ? varf(asflt(p.b)) : varf(asflt(p.c))) : (p.a.u ? vari(asint(p.b)) : vari(asint(p.c))); }
Ivan Mahonin 744572
Ivan Mahonin 9e60e5
Var f_sin(Params p)
Ivan Mahonin 9e60e5
  { return varf(sinf(asflt(p.a))); }
Ivan Mahonin 9e60e5
Var f_cos(Params p)
Ivan Mahonin 9e60e5
  { return varf(cosf(asflt(p.a))); }
Ivan Mahonin 9e60e5
Ivan Mahonin 744572
Ivan Mahonin 744572
OpDesc ops[] = {
Ivan Mahonin 744572
  { M_VALUE, 0, "" },
Ivan Mahonin 744572
  { M_VALUE, 0, "t", f_var },
Ivan Mahonin 744572
Ivan Mahonin 9e60e5
  { M_FUNC, 0, "sin", f_sin },
Ivan Mahonin 9e60e5
  { M_FUNC, 0, "cos", f_cos },
Ivan Mahonin 744572
  { M_ARRAY, 0, "[" },
Ivan Mahonin 744572
  { M_INDEX, 1, "[" },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_PREFIX, 2, "+", f_pos },
Ivan Mahonin 744572
  { M_PREFIX, 2, "-", f_neg },
Ivan Mahonin 744572
  { M_PREFIX, 2, "~", f_not },
Ivan Mahonin 744572
  { M_PREFIX, 2, "!", f_boolnot },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(U32)", f_casti },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(int)", f_casti },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(unsigned)", f_casti },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(unsigned int)", f_casti },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(F32)", f_castf },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(float)", f_castf },
Ivan Mahonin 744572
  { M_PREFIX, 2, "(double)", f_castf },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 3, "*", f_mul },
Ivan Mahonin 744572
  { M_BINARY, 3, "/", f_div },
Ivan Mahonin 744572
  { M_BINARY, 3, "%", f_mod },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 4, "+", f_add },
Ivan Mahonin 744572
  { M_BINARY, 4, "-", f_sub },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 5, "<<", f_shl },
Ivan Mahonin 744572
  { M_BINARY, 5, ">>", f_shr },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 6, "<", f_lt },
Ivan Mahonin 744572
  { M_BINARY, 6, ">", f_gt },
Ivan Mahonin 744572
  { M_BINARY, 6, "<=", f_leq },
Ivan Mahonin 744572
  { M_BINARY, 6, ">=", f_geq },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 7, "==", f_eq },
Ivan Mahonin 744572
  { M_BINARY, 7, "!=", f_neq },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_BINARY, 8, "&", f_and },
Ivan Mahonin 744572
  { M_BINARY, 9, "^", f_xor },
Ivan Mahonin 744572
  { M_BINARY, 10, "|", f_or },
Ivan Mahonin 744572
  { M_BINARY, 11, "&&", f_booland },
Ivan Mahonin 744572
  { M_BINARY, 12, "||", f_boolor },
Ivan Mahonin 744572
Ivan Mahonin 744572
  { M_TERNARY, 13, "?", f_cond },
Ivan Mahonin 744572
};
Ivan Mahonin 744572
int opsCnt = sizeof(ops)/sizeof(*ops);
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572
Ivan Mahonin 744572