shithub: dav1d

Download patch

ref: c49680e629931ecf90a294a37f9a99622be3c71c
parent: c82cf102fc635c73d7e6e94d19f37cacd90c44cb
author: Janne Grunau <janne-vlc@jannau.net>
date: Thu Dec 6 16:22:40 EST 2018

checkasm: replace rand() with xorshift xor128

Reduces the aarch64 checkasm run time from 22s to 2.4s.

--- a/tests/checkasm/cdef.c
+++ b/tests/checkasm/cdef.c
@@ -34,7 +34,7 @@
 
 static void init_tmp(pixel *buf, int n, const int bitdepth_max) {
     while (n--)
-        *buf++ = rand() & bitdepth_max;
+        *buf++ = rnd() & bitdepth_max;
 }
 
 static void check_cdef_filter(const cdef_fn fn, const int w, const int h,
@@ -57,7 +57,7 @@
                 memcpy(c_src, src, (10 * 16 + 8) * sizeof(pixel));
 
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
@@ -66,8 +66,8 @@
                 init_tmp(top, 16 * 2 + 8, bitdepth_max);
                 init_tmp((pixel *) left,8 * 2, bitdepth_max);
 
-                const int lvl = 1 + (rand() % 62);
-                const int damping = 3 + (rand() & 3) + bitdepth_min_8;
+                const int lvl = 1 + (rnd() % 62);
+                const int damping = 3 + (rnd() & 3) + bitdepth_min_8;
                 const int pri_strength = (lvl >> 2) << bitdepth_min_8;
                 int sec_strength = lvl & 3;
                 sec_strength += sec_strength == 3;
@@ -100,7 +100,7 @@
     if (check_func(fn, "cdef_dir_%dbpc", BITDEPTH)) {
         unsigned c_var, a_var;
 #if BITDEPTH == 16
-        const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+        const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
         const int bitdepth_max = 0xff;
 #endif
--- a/tests/checkasm/checkasm.c
+++ b/tests/checkasm/checkasm.c
@@ -143,6 +143,33 @@
     uint32_t i;
 } intfloat;
 
+static uint32_t xs_state[4];
+
+static void xor128_srand(unsigned int seed) {
+    xs_state[0] = seed;
+    xs_state[1] = ( seed & 0xffff0000) | (~seed & 0x0000ffff);
+    xs_state[2] = (~seed & 0xffff0000) | ( seed & 0x0000ffff);
+    xs_state[3] = ~seed;
+}
+
+// xor128 from Marsaglia, George (July 2003). "Xorshift RNGs".
+//             Journal of Statistical Software. 8 (14).
+//             doi:10.18637/jss.v008.i14.
+int xor128_rand(void) {
+    const uint32_t x = xs_state[0];
+    const uint32_t t = x ^ (x << 11);
+
+    xs_state[0] = xs_state[1];
+    xs_state[1] = xs_state[2];
+    xs_state[2] = xs_state[3];
+    uint32_t w = xs_state[3];
+
+    w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
+    xs_state[3] = w;
+
+    return w >> 1;
+}
+
 static int is_negative(const intfloat u) {
     return u.i >> 31;
 }
@@ -453,7 +480,7 @@
         for (int i = 0; tests[i].func; i++) {
             if (state.test_name && strcmp(tests[i].name, state.test_name))
                 continue;
-            srand(state.seed);
+            xor128_srand(state.seed);
             state.current_test_name = tests[i].name;
             tests[i].func();
         }
@@ -567,7 +594,7 @@
     v->ok = 1;
     v->cpu = state.cpu_flag;
     state.current_func_ver = v;
-    srand(state.seed);
+    xor128_srand(state.seed);
 
     if (state.cpu_flag)
         state.num_checked++;
--- a/tests/checkasm/checkasm.h
+++ b/tests/checkasm/checkasm.h
@@ -50,6 +50,9 @@
 #include "include/common/attributes.h"
 #include "include/common/intops.h"
 
+int xor128_rand(void);
+#define rnd xor128_rand
+
 #define decl_check_bitfns(name) \
 name##_8bpc(void); \
 name##_16bpc(void)
--- a/tests/checkasm/ipred.c
+++ b/tests/checkasm/ipred.c
@@ -85,21 +85,21 @@
 
                     int a = 0;
                     if (mode >= Z1_PRED && mode <= Z3_PRED) /* angle */
-                        a = (90 * (mode - Z1_PRED) + z_angles[rand() % 27]) |
-                            (rand() & 0x600);
+                        a = (90 * (mode - Z1_PRED) + z_angles[rnd() % 27]) |
+                            (rnd() & 0x600);
                     else if (mode == FILTER_PRED) /* filter_idx */
-                        a = (rand() % 5) | (rand() & ~511);
+                        a = (rnd() % 5) | (rnd() & ~511);
 
 #if BITDEPTH == 16
-                    const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                    const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                     const int bitdepth_max = 0xff;
 #endif
 
                     for (int i = -h * 2; i <= w * 2; i++)
-                        topleft[i] = rand() & bitdepth_max;
+                        topleft[i] = rnd() & bitdepth_max;
 
-                    const int maxw = 1 + (rand() % 128), maxh = 1 + (rand() % 128);
+                    const int maxw = 1 + (rnd() % 128), maxh = 1 + (rnd() % 128);
                     call_ref(c_dst, stride, topleft, w, h, a, maxw, maxh
                              HIGHBD_TAIL_SUFFIX);
                     call_new(a_dst, stride, topleft, w, h, a, maxw, maxh
@@ -134,13 +134,13 @@
                     for (int w_pad = (w >> 2) - 1; w_pad >= 0; w_pad--) {
                         for (int h_pad = (h >> 2) - 1; h_pad >= 0; h_pad--) {
 #if BITDEPTH == 16
-                            const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                            const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                             const int bitdepth_max = 0xff;
 #endif
                             for (int y = 0; y < (h << ss_ver); y++)
                                 for (int x = 0; x < (w << ss_hor); x++)
-                                    luma[y * 32 + x] = rand() & bitdepth_max;
+                                    luma[y * 32 + x] = rnd() & bitdepth_max;
 
                             call_ref(c_dst, luma, stride, w_pad, h_pad, w, h);
                             call_new(a_dst, luma, stride, w_pad, h_pad, w, h);
@@ -175,7 +175,7 @@
                 for (int h = imax(w / 4, 4); h <= imin(w * 4, 32); h <<= 1)
                 {
 #if BITDEPTH == 16
-                    const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                    const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                     const int bitdepth_max = 0xff;
 #endif
@@ -182,14 +182,14 @@
 
                     const ptrdiff_t stride = w * sizeof(pixel);
 
-                    int alpha = ((rand() & 15) + 1) * (1 - (rand() & 2));
+                    int alpha = ((rnd() & 15) + 1) * (1 - (rnd() & 2));
 
                     for (int i = -h * 2; i <= w * 2; i++)
-                        topleft[i] = rand() & bitdepth_max;
+                        topleft[i] = rnd() & bitdepth_max;
 
                     int luma_avg = w * h >> 1;
                     for (int i = 0; i < w * h; i++)
-                        luma_avg += ac[i] = rand() & (bitdepth_max << 3);
+                        luma_avg += ac[i] = rnd() & (bitdepth_max << 3);
                     luma_avg /= w * h;
                     for (int i = 0; i < w * h; i++)
                         ac[i] -= luma_avg;
@@ -222,7 +222,7 @@
             for (int h = imax(w / 4, 4); h <= imin(w * 4, 64); h <<= 1)
             {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
@@ -229,10 +229,10 @@
                 const ptrdiff_t stride = w * sizeof(pixel);
 
                 for (int i = 0; i < 8; i++)
-                    pal[i] = rand() & bitdepth_max;
+                    pal[i] = rnd() & bitdepth_max;
 
                 for (int i = 0; i < w * h; i++)
-                    idx[i] = rand() & 7;
+                    idx[i] = rnd() & 7;
 
                 call_ref(c_dst, stride, pal, idx, w, h);
                 call_new(a_dst, stride, pal, idx, w, h);
--- a/tests/checkasm/itx.c
+++ b/tests/checkasm/itx.c
@@ -155,7 +155,7 @@
     }
 
     if (eob)
-        eob += rand() % (n - eob - 1);
+        eob += rnd() % (n - eob - 1);
     for (n = eob + 1; n < sw * sh; n++)
         coeff[scan[n]] = 0;
     return eob;
@@ -173,7 +173,7 @@
         double in[64], temp_out[64];
 
         for (int i = 0; i < w; i++)
-            in[i] = (rand() & (2 * bitdepth_max + 1)) - bitdepth_max;
+            in[i] = (rnd() & (2 * bitdepth_max + 1)) - bitdepth_max;
 
         switch (itx_1d_types[txtp][0]) {
         case DCT:
@@ -258,7 +258,7 @@
                                BITDEPTH))
                 {
 #if BITDEPTH == 16
-                    const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                    const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                     const int bitdepth_max = 0xff;
 #endif
@@ -265,7 +265,7 @@
                     const int eob = ftx(coeff[0], tx, txtp, w, h, subsh, bitdepth_max);
 
                     for (int j = 0; j < w * h; j++)
-                        c_dst[j] = a_dst[j] = rand() & bitdepth_max;
+                        c_dst[j] = a_dst[j] = rnd() & bitdepth_max;
 
                     memcpy(coeff[1], coeff[0], sw * sh * sizeof(**coeff));
                     memcpy(coeff[2], coeff[0], sw * sh * sizeof(**coeff));
--- a/tests/checkasm/loopfilter.c
+++ b/tests/checkasm/loopfilter.c
@@ -41,51 +41,51 @@
     I <<= bitdepth_min_8;
     H <<= bitdepth_min_8;
 
-    const int filter_type = rand() % 4;
-    const int edge_diff = rand() % ((E + 2) * 4) - 2 * (E + 2);
+    const int filter_type = rnd() % 4;
+    const int edge_diff = rnd() % ((E + 2) * 4) - 2 * (E + 2);
     switch (filter_type) {
     case 0: // random, unfiltered
         for (int i = -8; i < 8; i++)
-            dst[i * stride] = rand() & bitdepth_max;
+            dst[i * stride] = rnd() & bitdepth_max;
         break;
     case 1: // long flat
-        dst[-8 * stride] = rand() & bitdepth_max;
-        dst[+7 * stride] = rand() & bitdepth_max;
-        dst[+0 * stride] = rand() & bitdepth_max;
+        dst[-8 * stride] = rnd() & bitdepth_max;
+        dst[+7 * stride] = rnd() & bitdepth_max;
+        dst[+0 * stride] = rnd() & bitdepth_max;
         dst[-1 * stride] = iclip_pixel(dst[+0 * stride] + edge_diff);
         for (int i = 1; i < 7; i++) {
             dst[-(1 + i) * stride] = iclip_pixel(dst[-1 * stride] +
-                                                 rand() % (2 * (F + 1)) - (F + 1));
+                                                 rnd() % (2 * (F + 1)) - (F + 1));
             dst[+(0 + i) * stride] = iclip_pixel(dst[+0 * stride] +
-                                                 rand() % (2 * (F + 1)) - (F + 1));
+                                                 rnd() % (2 * (F + 1)) - (F + 1));
         }
         break;
     case 2: // short flat
         for (int i = 4; i < 8; i++) {
-            dst[-(1 + i) * stride] = rand() & bitdepth_max;
-            dst[+(0 + i) * stride] = rand() & bitdepth_max;
+            dst[-(1 + i) * stride] = rnd() & bitdepth_max;
+            dst[+(0 + i) * stride] = rnd() & bitdepth_max;
         }
-        dst[+0 * stride] = rand() & bitdepth_max;
+        dst[+0 * stride] = rnd() & bitdepth_max;
         dst[-1 * stride] = iclip_pixel(dst[+0 * stride] + edge_diff);
         for (int i = 1; i < 4; i++) {
             dst[-(1 + i) * stride] = iclip_pixel(dst[-1 * stride] +
-                                                 rand() % (2 * (F + 1)) - (F + 1));
+                                                 rnd() % (2 * (F + 1)) - (F + 1));
             dst[+(0 + i) * stride] = iclip_pixel(dst[+0 * stride] +
-                                                 rand() % (2 * (F + 1)) - (F + 1));
+                                                 rnd() % (2 * (F + 1)) - (F + 1));
         }
         break;
     case 3: // normal or hev
         for (int i = 4; i < 8; i++) {
-            dst[-(1 + i) * stride] = rand() & bitdepth_max;
-            dst[+(0 + i) * stride] = rand() & bitdepth_max;
+            dst[-(1 + i) * stride] = rnd() & bitdepth_max;
+            dst[+(0 + i) * stride] = rnd() & bitdepth_max;
         }
-        dst[+0 * stride] = rand() & bitdepth_max;
+        dst[+0 * stride] = rnd() & bitdepth_max;
         dst[-1 * stride] = iclip_pixel(dst[+0 * stride] + edge_diff);
         for (int i = 1; i < 4; i++) {
             dst[-(1 + i) * stride] = iclip_pixel(dst[-(0 + i) * stride] +
-                                                 rand() % (2 * (I + 1)) - (I + 1));
+                                                 rnd() % (2 * (I + 1)) - (I + 1));
             dst[+(0 + i) * stride] = iclip_pixel(dst[+(i - 1) * stride] +
-                                                 rand() % (2 * (I + 1)) - (I + 1));
+                                                 rnd() % (2 * (I + 1)) - (I + 1));
         }
         break;
     }
@@ -117,7 +117,7 @@
     }
 
     Av1FilterLUT lut;
-    const int sharp = rand() & 7;
+    const int sharp = rnd() & 7;
     for (int level = 0; level < 64; level++) {
         int limit = level;
 
@@ -142,18 +142,18 @@
             uint8_t l[32 * 2][4];
 
             for (int j = 0; j < n_blks; j++) {
-                const int idx = rand() % (i + 2);
+                const int idx = rnd() % (i + 2);
                 if (idx) vmask[idx - 1] |= 1U << j;
                 if (dir) {
-                    l[j][lf_idx] = rand() & 63;
-                    l[j + 32][lf_idx] = rand() & 63;
+                    l[j][lf_idx] = rnd() & 63;
+                    l[j + 32][lf_idx] = rnd() & 63;
                 } else {
-                    l[j * 2][lf_idx] = rand() & 63;
-                    l[j * 2 + 1][lf_idx] = rand() & 63;
+                    l[j * 2][lf_idx] = rnd() & 63;
+                    l[j * 2 + 1][lf_idx] = rnd() & 63;
                 }
             }
 #if BITDEPTH == 16
-            const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+            const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
             const int bitdepth_max = 0xff;
 #endif
--- a/tests/checkasm/looprestoration.c
+++ b/tests/checkasm/looprestoration.c
@@ -38,7 +38,7 @@
 {
     for (int y = 0; y < h; y++) {
         for (int x = 0; x < w; x++)
-            buf[x] = rand() & bitdepth_max;
+            buf[x] = rnd() & bitdepth_max;
         buf += PXSTRIDE(stride);
     }
 }
@@ -74,12 +74,12 @@
         {
             int16_t filter[2][3], filter_v[7], filter_h[7];
 
-            filter[0][0] = pl ? 0 : (rand() & 15) - 5;
-            filter[0][1] = (rand() & 31) - 23;
-            filter[0][2] = (rand() & 63) - 17;
-            filter[1][0] = pl ? 0 : (rand() & 15) - 5;
-            filter[1][1] = (rand() & 31) - 23;
-            filter[1][2] = (rand() & 63) - 17;
+            filter[0][0] = pl ? 0 : (rnd() & 15) - 5;
+            filter[0][1] = (rnd() & 31) - 23;
+            filter[0][2] = (rnd() & 63) - 17;
+            filter[1][0] = pl ? 0 : (rnd() & 15) - 5;
+            filter[1][1] = (rnd() & 31) - 23;
+            filter[1][2] = (rnd() & 63) - 17;
 
             filter_h[0] = filter_h[6] = filter[0][0];
             filter_h[1] = filter_h[5] = filter[0][1];
@@ -91,10 +91,10 @@
             filter_v[2] = filter_v[4] = filter[1][2];
             filter_v[3] = -((filter_v[0] + filter_v[1] + filter_v[2]) * 2);
 
-            const int base_w = 1 + (rand() % 384);
-            const int base_h = 1 + (rand() & 63);
+            const int base_w = 1 + (rnd() % 384);
+            const int base_h = 1 + (rnd() & 63);
 #if BITDEPTH == 16
-            const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+            const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
             const int bitdepth_max = 0xff;
 #endif
@@ -145,14 +145,14 @@
         {
             int16_t sgr_wt[2];
 
-            sgr_wt[0] = dav1d_sgr_params[sgr_idx][0] ? (rand() & 127) - 96 : 0;
-            sgr_wt[1] = dav1d_sgr_params[sgr_idx][1] ? (rand() & 127) - 32 :
+            sgr_wt[0] = dav1d_sgr_params[sgr_idx][0] ? (rnd() & 127) - 96 : 0;
+            sgr_wt[1] = dav1d_sgr_params[sgr_idx][1] ? (rnd() & 127) - 32 :
                             iclip(128 - sgr_wt[0], -32, 95);
 
-            const int base_w = 1 + (rand() % 384);
-            const int base_h = 1 + (rand() & 63);
+            const int base_w = 1 + (rnd() % 384);
+            const int base_h = 1 + (rnd() & 63);
 #if BITDEPTH == 16
-            const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+            const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
             const int bitdepth_max = 0xff;
 #endif
--- a/tests/checkasm/mc.c
+++ b/tests/checkasm/mc.c
@@ -60,16 +60,16 @@
                     const int min = w <= 32 ? 2 : w / 4;
                     const int max = imax(imin(w * 4, 128), 32);
                     for (int h = min; h <= max; h <<= 1) {
-                        const int mx = (mxy & 1) ? rand() % 15 + 1 : 0;
-                        const int my = (mxy & 2) ? rand() % 15 + 1 : 0;
+                        const int mx = (mxy & 1) ? rnd() % 15 + 1 : 0;
+                        const int my = (mxy & 2) ? rnd() % 15 + 1 : 0;
 #if BITDEPTH == 16
-                        const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                        const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                         const int bitdepth_max = 0xff;
 #endif
 
                         for (int i = 0; i < 135 * 135; i++)
-                            src_buf[i] = rand() & bitdepth_max;
+                            src_buf[i] = rnd() & bitdepth_max;
 
                         call_ref(c_dst, w, src, w, w, h, mx, my HIGHBD_TAIL_SUFFIX);
                         call_new(a_dst, w, src, w, w, h, mx, my HIGHBD_TAIL_SUFFIX);
@@ -100,16 +100,16 @@
                     filter_names[filter], w, mxy_names[mxy], BITDEPTH))
                     for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1)
                     {
-                        const int mx = (mxy & 1) ? rand() % 15 + 1 : 0;
-                        const int my = (mxy & 2) ? rand() % 15 + 1 : 0;
+                        const int mx = (mxy & 1) ? rnd() % 15 + 1 : 0;
+                        const int my = (mxy & 2) ? rnd() % 15 + 1 : 0;
 #if BITDEPTH == 16
-                        const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                        const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                         const int bitdepth_max = 0xff;
 #endif
 
                         for (int i = 0; i < 135 * 135; i++)
-                            src_buf[i] = rand() & bitdepth_max;
+                            src_buf[i] = rnd() & bitdepth_max;
 
                         call_ref(c_tmp, src, w, w, h, mx, my HIGHBD_TAIL_SUFFIX);
                         call_new(a_tmp, src, w, w, h, mx, my HIGHBD_TAIL_SUFFIX);
@@ -128,10 +128,10 @@
 {
     for (int i = 0; i < 2; i++) {
         for (int j = 0; j < 135 * 135; j++)
-            buf[j] = rand() & bitdepth_max;
-        c->mct[rand() % N_2D_FILTERS](tmp[i], buf + 135 * 3 + 3,
+            buf[j] = rnd() & bitdepth_max;
+        c->mct[rnd() % N_2D_FILTERS](tmp[i], buf + 135 * 3 + 3,
                                       128 * sizeof(pixel), 128, 128,
-                                      rand() & 15, rand() & 15
+                                      rnd() & 15, rnd() & 15
                                       HIGHBD_TAIL_SUFFIX);
     }
 }
@@ -149,7 +149,7 @@
             for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1)
             {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
@@ -176,9 +176,9 @@
         if (check_func(c->w_avg, "w_avg_w%d_%dbpc", w, BITDEPTH))
             for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1)
             {
-                int weight = rand() % 15 + 1;
+                int weight = rnd() % 15 + 1;
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
@@ -201,7 +201,7 @@
     ALIGN_STK_32(uint8_t, mask,  128 * 128,);
 
     for (int i = 0; i < 128 * 128; i++)
-        mask[i] = rand() % 65;
+        mask[i] = rnd() % 65;
 
     declare_func(void, pixel *dst, ptrdiff_t dst_stride, const int16_t *tmp1,
                  const int16_t *tmp2, int w, int h, const uint8_t *mask
@@ -212,7 +212,7 @@
             for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1)
             {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
@@ -246,9 +246,9 @@
                            BITDEPTH))
                 for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1)
                 {
-                    int sign = rand() & 1;
+                    int sign = rnd() & 1;
 #if BITDEPTH == 16
-                    const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                    const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                     const int bitdepth_max = 0xff;
 #endif
@@ -284,16 +284,16 @@
         if (check_func(c->blend, "blend_w%d_%dbpc", w, BITDEPTH))
             for (int h = imax(w / 2, 4); h <= imin(w * 2, 32); h <<= 1) {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
                 for (int i = 0; i < 32 * 32; i++) {
-                    tmp[i] = rand() & bitdepth_max;
-                    mask[i] = rand() % 65;
+                    tmp[i] = rnd() & bitdepth_max;
+                    mask[i] = rnd() % 65;
                 }
                 for (int i = 0; i < w * h; i++)
-                    c_dst[i] = a_dst[i] = rand() & bitdepth_max;
+                    c_dst[i] = a_dst[i] = rnd() & bitdepth_max;
 
                 call_ref(c_dst, dst_stride, tmp, w, h, mask);
                 call_new(a_dst, dst_stride, tmp, w, h, mask);
@@ -319,15 +319,15 @@
         if (check_func(c->blend_v, "blend_v_w%d_%dbpc", w, BITDEPTH))
             for (int h = 2; h <= (w == 2 ? 64 : 128); h <<= 1) {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
 
                 for (int i = 0; i < w * h; i++)
-                    c_dst[i] = a_dst[i] = rand() & bitdepth_max;
+                    c_dst[i] = a_dst[i] = rnd() & bitdepth_max;
                 for (int i = 0; i < 32 * 128; i++)
-                    tmp[i] = rand() & bitdepth_max;
+                    tmp[i] = rnd() & bitdepth_max;
 
                 call_ref(c_dst, dst_stride, tmp, w, h);
                 call_new(a_dst, dst_stride, tmp, w, h);
@@ -353,14 +353,14 @@
         if (check_func(c->blend_h, "blend_h_w%d_%dbpc", w, BITDEPTH))
             for (int h = (w == 128 ? 4 : 2); h <= 32; h <<= 1) {
 #if BITDEPTH == 16
-                const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+                const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
                 const int bitdepth_max = 0xff;
 #endif
                 for (int i = 0; i < w * h; i++)
-                    c_dst[i] = a_dst[i] = rand() & bitdepth_max;
+                    c_dst[i] = a_dst[i] = rnd() & bitdepth_max;
                 for (int i = 0; i < 128 * 32; i++)
-                    tmp[i] = rand() & bitdepth_max;
+                    tmp[i] = rnd() & bitdepth_max;
 
                 call_ref(c_dst, dst_stride, tmp, w, h);
                 call_new(a_dst, dst_stride, tmp, w, h);
@@ -387,19 +387,19 @@
                  HIGHBD_DECL_SUFFIX);
 
     if (check_func(c->warp8x8, "warp_8x8_%dbpc", BITDEPTH)) {
-        const int mx = (rand() & 0x1fff) - 0x800;
-        const int my = (rand() & 0x1fff) - 0x800;
+        const int mx = (rnd() & 0x1fff) - 0x800;
+        const int my = (rnd() & 0x1fff) - 0x800;
 #if BITDEPTH == 16
-        const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+        const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
         const int bitdepth_max = 0xff;
 #endif
 
         for (int i = 0; i < 4; i++)
-            abcd[i] = (rand() & 0x1fff) - 0x800;
+            abcd[i] = (rnd() & 0x1fff) - 0x800;
 
         for (int i = 0; i < 15 * 15; i++)
-            src_buf[i] = rand() & bitdepth_max;
+            src_buf[i] = rnd() & bitdepth_max;
 
         call_ref(c_dst, dst_stride, src, src_stride, abcd, mx, my HIGHBD_TAIL_SUFFIX);
         call_new(a_dst, dst_stride, src, src_stride, abcd, mx, my HIGHBD_TAIL_SUFFIX);
@@ -424,19 +424,19 @@
                  HIGHBD_DECL_SUFFIX);
 
     if (check_func(c->warp8x8t, "warp_8x8t_%dbpc", BITDEPTH)) {
-        const int mx = (rand() & 0x1fff) - 0x800;
-        const int my = (rand() & 0x1fff) - 0x800;
+        const int mx = (rnd() & 0x1fff) - 0x800;
+        const int my = (rnd() & 0x1fff) - 0x800;
 #if BITDEPTH == 16
-        const int bitdepth_max = rand() & 1 ? 0x3ff : 0xfff;
+        const int bitdepth_max = rnd() & 1 ? 0x3ff : 0xfff;
 #else
         const int bitdepth_max = 0xff;
 #endif
 
         for (int i = 0; i < 4; i++)
-            abcd[i] = (rand() & 0x1fff) - 0x800;
+            abcd[i] = (rnd() & 0x1fff) - 0x800;
 
         for (int i = 0; i < 15 * 15; i++)
-            src_buf[i] = rand() & bitdepth_max;
+            src_buf[i] = rnd() & bitdepth_max;
 
         call_ref(c_tmp, 8, src, src_stride, abcd, mx, my HIGHBD_TAIL_SUFFIX);
         call_new(a_tmp, 8, src, src_stride, abcd, mx, my HIGHBD_TAIL_SUFFIX);
@@ -473,21 +473,21 @@
                                    const enum EdgeFlags edge)
 {
 #define set_off(edge1, edge2, pos, dim) \
-    *i##dim = edge & (HAVE_##edge1 | HAVE_##edge2) ? 160 : 1 + (rand() % (b##dim - 2)); \
+    *i##dim = edge & (HAVE_##edge1 | HAVE_##edge2) ? 160 : 1 + (rnd() % (b##dim - 2)); \
     switch (edge & (HAVE_##edge1 | HAVE_##edge2)) { \
     case HAVE_##edge1 | HAVE_##edge2: \
         assert(b##dim <= *i##dim); \
-        *pos = rand() % (*i##dim - b##dim + 1); \
+        *pos = rnd() % (*i##dim - b##dim + 1); \
         break; \
     case HAVE_##edge1: \
-        *pos = (*i##dim - b##dim) + 1 + (rand() % (b##dim - 1)); \
+        *pos = (*i##dim - b##dim) + 1 + (rnd() % (b##dim - 1)); \
         break; \
     case HAVE_##edge2: \
-        *pos = -(1 + (rand() % (b##dim - 1))); \
+        *pos = -(1 + (rnd() % (b##dim - 1))); \
         break; \
     case 0: \
         assert(b##dim - 1 > *i##dim); \
-        *pos = -(1 + (rand() % (b##dim - *i##dim - 1))); \
+        *pos = -(1 + (rnd() % (b##dim - *i##dim - 1))); \
         break; \
     }
     set_off(LEFT, RIGHT, x, w);
@@ -500,7 +500,7 @@
     ALIGN_STK_32(pixel, src,   160 * 160,);
 
     for (int i = 0; i < 160 * 160; i++)
-        src[i] = rand() & ((1U << BITDEPTH) - 1);
+        src[i] = rnd() & ((1U << BITDEPTH) - 1);
 
     declare_func(void, intptr_t bw, intptr_t bh, intptr_t iw, intptr_t ih,
                  intptr_t x, intptr_t y,
@@ -513,8 +513,8 @@
             for (int h = imax(w / 4, 4); h <= imin(w * 4, 128); h <<= 1) {
                 // we skip 0xf, since it implies that we don't need emu_edge
                 for (enum EdgeFlags edge = 0; edge < 0xf; edge++) {
-                    const int bw = w + (rand() & 7);
-                    const int bh = h + (rand() & 7);
+                    const int bw = w + (rnd() & 7);
+                    const int bh = h + (rnd() & 7);
                     random_offset_for_edge(&x, &y, bw, bh, &iw, &ih, edge);
                     call_ref(bw, bh, iw, ih, x, y,
                              c_dst, 192 * sizeof(pixel), src, 160 * sizeof(pixel));