#include <mem_funcs.h>

#define cps ((unsigned char *) src)
#define cpd ((unsigned char *) dst)
#define lps ((unsigned int *) src)
#define lpd ((unsigned int *) dst)

#define deref_auto_inc(p) *(p)++

void __fill_mem(void *dst, int val, unsigned int n) {
    unsigned int v = (unsigned char) val;
    unsigned int i;

    if (n >= 32) {
        i = (-(unsigned int) dst) & 3;

        if (i) {
            n -= i;
            do {
                deref_auto_inc(cpd) = v;
            } while (--i);
        }

        if (v) {
            v |= v << 24 | v << 16 | v << 8;
        }

        i = n >> 5;

        if (i) {
            do {
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
                deref_auto_inc(lpd) = v;
            } while (--i);
        }

        i = (n & 31) >> 2;

        if (i) {
            do {
                deref_auto_inc(lpd) = v;
            } while (--i);
        }

        n &= 3;
    }

    if (n) {
        do {
            deref_auto_inc(cpd) = v;
        } while (--n);
    }
}
