#include "game_types.h"

/* Mem_CompareAndAlloc @ 0x0801D630 (real 120B) -- unsigned restoring division twin. Mirrors src/matched/Mem_CompareAndAlloc.c. */
/* Unsigned twin of Math_Log2 (no sign save/negate): nibble+bit normalize
   from 1<<28, unrolled subtract quartet, zero divisor via allocator stub. */
extern void Mem_Alloc(void);

unsigned Mem_CompareAndAlloc(unsigned a, unsigned b)
{
    unsigned x = a, y = b, q = 0, bit = 1, scale;
    if (b == 0) {
        Mem_Alloc();
        return 0;
    }
    if (x < y)
        return 0;
    scale = 1u << 28;
    while (y < scale && y < x) {
        y <<= 4;
        bit <<= 4;
    }
    scale <<= 3;
    while (y < scale && y < x) {
        y <<= 1;
        bit <<= 1;
    }
    for (;;) {
        if (x >= y) {
            x -= y;
            q |= bit;
        }
        if (x >= (y >> 1)) {
            x -= y >> 1;
            q |= bit >> 1;
        }
        if (x >= (y >> 2)) {
            x -= y >> 2;
            q |= bit >> 2;
        }
        if (x >= (y >> 3)) {
            x -= y >> 3;
            q |= bit >> 3;
        }
        if (x == 0 || (bit >>= 4) == 0)
            break;
        y >>= 4;
    }
    return q;
}
