diff --git a/source/picasso.h b/source/picasso.h index 6728f4b..2a95c6e 100644 --- a/source/picasso.h +++ b/source/picasso.h @@ -110,7 +110,7 @@ struct Uniform int pos, size; int type; - inline bool operator <(const Uniform& rhs) + inline bool operator <(const Uniform& rhs) const { return pos < rhs.pos; } diff --git a/source/picasso_assembler.cpp b/source/picasso_assembler.cpp index 3b3aa5b..9f3fb96 100644 --- a/source/picasso_assembler.cpp +++ b/source/picasso_assembler.cpp @@ -985,7 +985,7 @@ DEF_COMMAND(format5) if (opdesc >= 32) { int which; - for (which; which < 32; which ++) + for (which = 0; which < 32; which ++) if (!(g_opdescIsMad & BIT(which))) break; if (which == 32) @@ -1364,7 +1364,8 @@ DEF_DIRECTIVE(end) insertPaddingNop(); lastWasEnd = false; } - else if (elem.type == SE_PROC || elem.type == SE_FOR || elem.type == SE_IF && BUF.size() > 0) + + else if (elem.type == SE_PROC || elem.type == SE_FOR || (elem.type == SE_IF && BUF.size() > 0)) { u32 p = BUF.size(); u32 lastOpcode = BUF[p-1] >> 26; diff --git a/source/picasso_frontend.cpp b/source/picasso_frontend.cpp index d865cfa..490db1e 100644 --- a/source/picasso_frontend.cpp +++ b/source/picasso_frontend.cpp @@ -1,21 +1,41 @@ #include "picasso.h" -// !! Taken from ctrulib !! -u32 f32tof24(float vf) +static inline uint32_t floatrawbits(float f) { - if (!vf) return 0; + union { float f; uint32_t i; } s; + s.f = f; + return s.i; +} - union { float f; u32 v; } q; - q.f=vf; +// f24 has: +// - 1 sign bit +// - 7 exponent bits +// - 16 mantissa bits +uint32_t f32tof24(float f) +{ + uint32_t i = floatrawbits(f); - u8 s = q.v>>31; - u32 exp = ((q.v>>23) & 0xFF) - 0x40; - u32 man = (q.v>>7) & 0xFFFF; + uint32_t mantissa = (i << 9) >> 9; + int32_t exponent = (i << 1) >> 24; + uint32_t sign = (i << 0) >> 31; - if (exp >= 0) - return man | (exp<<16) | (s<<23); - else - return s<<23; + // Truncate mantissa + mantissa >>= 7; + + // Re-bias exponent + exponent = exponent - 127 + 63; + if (exponent < 0) + { + // Underflow: flush to zero + return sign << 23; + } + else if (exponent > 0x7F) + { + // Overflow: saturate to infinity + return (sign << 23) | (0x7F << 16); + } + + return (sign << 23) | (exponent << 16) | mantissa; } #ifdef WIN32