qbe has its own magic

This commit is contained in:
Quentin Carbonneaux 2024-06-17 13:17:39 +02:00
parent b5be429091
commit e7ebdc8fb6
2 changed files with 73 additions and 9 deletions

18
simpl.c
View file

@ -32,20 +32,20 @@ blit(Ref sd[2], int sz, Fn *fn)
static int static int
ulog2_tab64[64] = { ulog2_tab64[64] = {
63, 0, 58, 1, 59, 47, 53, 2, 63, 0, 1, 41, 37, 2, 16, 42,
60, 39, 48, 27, 54, 33, 42, 3, 38, 29, 32, 3, 12, 17, 43, 55,
61, 51, 37, 40, 49, 18, 28, 20, 39, 35, 30, 53, 33, 21, 4, 23,
55, 30, 34, 11, 43, 14, 22, 4, 13, 9, 18, 6, 25, 44, 48, 56,
62, 57, 46, 52, 38, 26, 32, 41, 62, 40, 36, 15, 28, 31, 11, 54,
50, 36, 17, 19, 29, 10, 13, 21, 34, 52, 20, 22, 8, 5, 24, 47,
56, 45, 25, 31, 35, 16, 9, 12, 61, 14, 27, 10, 51, 19, 7, 46,
44, 24, 15, 8, 23, 7, 6, 5 60, 26, 50, 45, 59, 49, 58, 57,
}; };
static int static int
ulog2(uint64_t pow2) ulog2(uint64_t pow2)
{ {
return ulog2_tab64[(pow2 * 0x07EDD5E59A4E28C2) >> 58]; return ulog2_tab64[(pow2 * 0x5b31ab928877a7e) >> 58];
} }
static int static int

64
tools/log2.c Normal file
View file

@ -0,0 +1,64 @@
#include <assert.h>
#include <stdio.h>
typedef unsigned long long ullong;
char seen[64];
ullong rbg = 0x1e0298f7a7e;
int
bit()
{
int bit;
bit = rbg & 1;
rbg >>= 1;
return bit;
}
int
search(ullong n, int b, ullong *out)
{
int i, x;
ullong y, z;
if (b == 64) {
*out = n;
return 1;
}
x = 63 & ((n << (63 - b)) >> 58);
assert(!(x & 0) && x <= 62);
y = bit();
for (i=0; i<2; i++) {
z = x | (y << 5);
if (!seen[z]) {
seen[z] = (63-b)+1;
if (search(n | (y << b), b+1, out))
return 1;
seen[z] = 0;
}
y ^= 1;
}
return 0;
}
int
main()
{
ullong out;
int i;
if (search(0, 0, &out)) {
printf("0x%llx\n", out);
for (i=0; i<64; i++) {
printf((i&7) == 0 ? "\t" : " ");
printf("%2d,", seen[i]-1);
if ((i&7) == 7)
printf("\n");
}
} else
puts("not found");
}