1
1
Fork 0
mirror of https://github.com/oxen-io/lokinet synced 2023-12-14 06:53:00 +01:00
lokinet/crypto/libntrup/src/ref/int32_sort.c
2018-10-23 07:29:37 -04:00

40 lines
702 B
C

#include "int32_sort.h"
#include <sodium/crypto_uint32.h>
static void
minmax(crypto_int32 *x, crypto_int32 *y)
{
crypto_uint32 xi = *x;
crypto_uint32 yi = *y;
crypto_uint32 xy = xi ^ yi;
crypto_uint32 c = yi - xi;
c ^= xy & (c ^ yi);
c >>= 31;
c = -c;
c &= xy;
*x = xi ^ c;
*y = yi ^ c;
}
void
int32_sort(crypto_int32 *x, int n)
{
int top, p, q, i;
if(n < 2)
return;
top = 1;
while(top < n - top)
top += top;
for(p = top; p > 0; p >>= 1)
{
for(i = 0; i < n - p; ++i)
if(!(i & p))
minmax(x + i, x + i + p);
for(q = top; q > p; q >>= 1)
for(i = 0; i < n - q; ++i)
if(!(i & p))
minmax(x + i + p, x + i + q);
}
}