stego.git

table.c

espurr
/* stego - chess engine
 * Copyright (C) 2025 ArcNyxx <me@arcnyxx.net>
 * see LICENCE file for licensing information */

#include "stego.h"

const u64 kitab[64] = {
	0x302,
	0x705,
	0xe0a,
	0x1c14,
	0x3828,
	0x7050,
	0xe0a0,
	0xc040,
	0x30203,
	0x70507,
	0xe0a0e,
	0x1c141c,
	0x382838,
	0x705070,
	0xe0a0e0,
	0xc040c0,
	0x3020300,
	0x7050700,
	0xe0a0e00,
	0x1c141c00,
	0x38283800,
	0x70507000,
	0xe0a0e000,
	0xc040c000,
	0x302030000,
	0x705070000,
	0xe0a0e0000,
	0x1c141c0000,
	0x3828380000,
	0x7050700000,
	0xe0a0e00000,
	0xc040c00000,
	0x30203000000,
	0x70507000000,
	0xe0a0e000000,
	0x1c141c000000,
	0x382838000000,
	0x705070000000,
	0xe0a0e0000000,
	0xc040c0000000,
	0x3020300000000,
	0x7050700000000,
	0xe0a0e00000000,
	0x1c141c00000000,
	0x38283800000000,
	0x70507000000000,
	0xe0a0e000000000,
	0xc040c000000000,
	0x302030000000000,
	0x705070000000000,
	0xe0a0e0000000000,
	0x1c141c0000000000,
	0x3828380000000000,
	0x7050700000000000,
	0xe0a0e00000000000,
	0xc040c00000000000,
	0x203000000000000,
	0x507000000000000,
	0xa0e000000000000,
	0x141c000000000000,
	0x2838000000000000,
	0x5070000000000000,
	0xa0e0000000000000,
	0x40c0000000000000,
};

const u64 notab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x1,
	0x2,
	0x4,
	0x8,
	0x10,
	0x20,
	0x40,
	0x80,
	0x101,
	0x202,
	0x404,
	0x808,
	0x1010,
	0x2020,
	0x4040,
	0x8080,
	0x10101,
	0x20202,
	0x40404,
	0x80808,
	0x101010,
	0x202020,
	0x404040,
	0x808080,
	0x1010101,
	0x2020202,
	0x4040404,
	0x8080808,
	0x10101010,
	0x20202020,
	0x40404040,
	0x80808080,
	0x101010101,
	0x202020202,
	0x404040404,
	0x808080808,
	0x1010101010,
	0x2020202020,
	0x4040404040,
	0x8080808080,
	0x10101010101,
	0x20202020202,
	0x40404040404,
	0x80808080808,
	0x101010101010,
	0x202020202020,
	0x404040404040,
	0x808080808080,
	0x1010101010101,
	0x2020202020202,
	0x4040404040404,
	0x8080808080808,
	0x10101010101010,
	0x20202020202020,
	0x40404040404040,
	0x80808080808080,
};

const u64 nobtab[64] = {
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x3,
	0x5,
	0x9,
	0x11,
	0x21,
	0x41,
	0x81,
	0x101,
	0x203,
	0x405,
	0x809,
	0x1011,
	0x2021,
	0x4041,
	0x8081,
	0x10101,
	0x20203,
	0x40405,
	0x80809,
	0x101011,
	0x202021,
	0x404041,
	0x808081,
	0x1010101,
	0x2020203,
	0x4040405,
	0x8080809,
	0x10101011,
	0x20202021,
	0x40404041,
	0x80808081,
	0x101010101,
	0x202020203,
	0x404040405,
	0x808080809,
	0x1010101011,
	0x2020202021,
	0x4040404041,
	0x8080808081,
	0x10101010101,
	0x20202020203,
	0x40404040405,
	0x80808080809,
	0x101010101011,
	0x202020202021,
	0x404040404041,
	0x808080808081,
	0x1010101010101,
	0x2020202020203,
	0x4040404040405,
	0x8080808080809,
	0x10101010101011,
	0x20202020202021,
	0x40404040404041,
	0x80808080808081,
};

const u64 netab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x2,
	0x4,
	0x8,
	0x10,
	0x20,
	0x40,
	0x80,
	0x0,
	0x204,
	0x408,
	0x810,
	0x1020,
	0x2040,
	0x4080,
	0x8000,
	0x0,
	0x20408,
	0x40810,
	0x81020,
	0x102040,
	0x204080,
	0x408000,
	0x800000,
	0x0,
	0x2040810,
	0x4081020,
	0x8102040,
	0x10204080,
	0x20408000,
	0x40800000,
	0x80000000,
	0x0,
	0x204081020,
	0x408102040,
	0x810204080,
	0x1020408000,
	0x2040800000,
	0x4080000000,
	0x8000000000,
	0x0,
	0x20408102040,
	0x40810204080,
	0x81020408000,
	0x102040800000,
	0x204080000000,
	0x408000000000,
	0x800000000000,
	0x0,
	0x2040810204080,
	0x4081020408000,
	0x8102040800000,
	0x10204080000000,
	0x20408000000000,
	0x40800000000000,
	0x80000000000000,
	0x0,
};

const u64 nebtab[64] = {
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x3,
	0x5,
	0x9,
	0x11,
	0x21,
	0x41,
	0x81,
	0x1,
	0x205,
	0x409,
	0x811,
	0x1021,
	0x2041,
	0x4081,
	0x8001,
	0x1,
	0x20409,
	0x40811,
	0x81021,
	0x102041,
	0x204081,
	0x408001,
	0x800001,
	0x1,
	0x2040811,
	0x4081021,
	0x8102041,
	0x10204081,
	0x20408001,
	0x40800001,
	0x80000001,
	0x1,
	0x204081021,
	0x408102041,
	0x810204081,
	0x1020408001,
	0x2040800001,
	0x4080000001,
	0x8000000001,
	0x1,
	0x20408102041,
	0x40810204081,
	0x81020408001,
	0x102040800001,
	0x204080000001,
	0x408000000001,
	0x800000000001,
	0x1,
	0x2040810204081,
	0x4081020408001,
	0x8102040800001,
	0x10204080000001,
	0x20408000000001,
	0x40800000000001,
	0x80000000000001,
	0x1,
};

const u64 eatab[64] = {
	0xfe,
	0xfc,
	0xf8,
	0xf0,
	0xe0,
	0xc0,
	0x80,
	0x0,
	0xfe00,
	0xfc00,
	0xf800,
	0xf000,
	0xe000,
	0xc000,
	0x8000,
	0x0,
	0xfe0000,
	0xfc0000,
	0xf80000,
	0xf00000,
	0xe00000,
	0xc00000,
	0x800000,
	0x0,
	0xfe000000,
	0xfc000000,
	0xf8000000,
	0xf0000000,
	0xe0000000,
	0xc0000000,
	0x80000000,
	0x0,
	0xfe00000000,
	0xfc00000000,
	0xf800000000,
	0xf000000000,
	0xe000000000,
	0xc000000000,
	0x8000000000,
	0x0,
	0xfe0000000000,
	0xfc0000000000,
	0xf80000000000,
	0xf00000000000,
	0xe00000000000,
	0xc00000000000,
	0x800000000000,
	0x0,
	0xfe000000000000,
	0xfc000000000000,
	0xf8000000000000,
	0xf0000000000000,
	0xe0000000000000,
	0xc0000000000000,
	0x80000000000000,
	0x0,
	0xfe00000000000000,
	0xfc00000000000000,
	0xf800000000000000,
	0xf000000000000000,
	0xe000000000000000,
	0xc000000000000000,
	0x8000000000000000,
	0x0,
};

const u64 eabtab[64] = {
	0x80000000000000fe,
	0x80000000000000fc,
	0x80000000000000f8,
	0x80000000000000f0,
	0x80000000000000e0,
	0x80000000000000c0,
	0x8000000000000080,
	0x8000000000000000,
	0x800000000000fe00,
	0x800000000000fc00,
	0x800000000000f800,
	0x800000000000f000,
	0x800000000000e000,
	0x800000000000c000,
	0x8000000000008000,
	0x8000000000000000,
	0x8000000000fe0000,
	0x8000000000fc0000,
	0x8000000000f80000,
	0x8000000000f00000,
	0x8000000000e00000,
	0x8000000000c00000,
	0x8000000000800000,
	0x8000000000000000,
	0x80000000fe000000,
	0x80000000fc000000,
	0x80000000f8000000,
	0x80000000f0000000,
	0x80000000e0000000,
	0x80000000c0000000,
	0x8000000080000000,
	0x8000000000000000,
	0x800000fe00000000,
	0x800000fc00000000,
	0x800000f800000000,
	0x800000f000000000,
	0x800000e000000000,
	0x800000c000000000,
	0x8000008000000000,
	0x8000000000000000,
	0x8000fe0000000000,
	0x8000fc0000000000,
	0x8000f80000000000,
	0x8000f00000000000,
	0x8000e00000000000,
	0x8000c00000000000,
	0x8000800000000000,
	0x8000000000000000,
	0x80fe000000000000,
	0x80fc000000000000,
	0x80f8000000000000,
	0x80f0000000000000,
	0x80e0000000000000,
	0x80c0000000000000,
	0x8080000000000000,
	0x8000000000000000,
	0xfe00000000000000,
	0xfc00000000000000,
	0xf800000000000000,
	0xf000000000000000,
	0xe000000000000000,
	0xc000000000000000,
	0x8000000000000000,
	0x8000000000000000,
};

const u64 setab[64] = {
	0x8040201008040200,
	0x80402010080400,
	0x804020100800,
	0x8040201000,
	0x80402000,
	0x804000,
	0x8000,
	0x0,
	0x4020100804020000,
	0x8040201008040000,
	0x80402010080000,
	0x804020100000,
	0x8040200000,
	0x80400000,
	0x800000,
	0x0,
	0x2010080402000000,
	0x4020100804000000,
	0x8040201008000000,
	0x80402010000000,
	0x804020000000,
	0x8040000000,
	0x80000000,
	0x0,
	0x1008040200000000,
	0x2010080400000000,
	0x4020100800000000,
	0x8040201000000000,
	0x80402000000000,
	0x804000000000,
	0x8000000000,
	0x0,
	0x804020000000000,
	0x1008040000000000,
	0x2010080000000000,
	0x4020100000000000,
	0x8040200000000000,
	0x80400000000000,
	0x800000000000,
	0x0,
	0x402000000000000,
	0x804000000000000,
	0x1008000000000000,
	0x2010000000000000,
	0x4020000000000000,
	0x8040000000000000,
	0x80000000000000,
	0x0,
	0x200000000000000,
	0x400000000000000,
	0x800000000000000,
	0x1000000000000000,
	0x2000000000000000,
	0x4000000000000000,
	0x8000000000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 sebtab[64] = {
	0x8040201008040200,
	0x8080402010080400,
	0x8000804020100800,
	0x8000008040201000,
	0x8000000080402000,
	0x8000000000804000,
	0x8000000000008000,
	0x8000000000000000,
	0xc020100804020000,
	0x8040201008040000,
	0x8080402010080000,
	0x8000804020100000,
	0x8000008040200000,
	0x8000000080400000,
	0x8000000000800000,
	0x8000000000000000,
	0xa010080402000000,
	0xc020100804000000,
	0x8040201008000000,
	0x8080402010000000,
	0x8000804020000000,
	0x8000008040000000,
	0x8000000080000000,
	0x8000000000000000,
	0x9008040200000000,
	0xa010080400000000,
	0xc020100800000000,
	0x8040201000000000,
	0x8080402000000000,
	0x8000804000000000,
	0x8000008000000000,
	0x8000000000000000,
	0x8804020000000000,
	0x9008040000000000,
	0xa010080000000000,
	0xc020100000000000,
	0x8040200000000000,
	0x8080400000000000,
	0x8000800000000000,
	0x8000000000000000,
	0x8402000000000000,
	0x8804000000000000,
	0x9008000000000000,
	0xa010000000000000,
	0xc020000000000000,
	0x8040000000000000,
	0x8080000000000000,
	0x8000000000000000,
	0x8200000000000000,
	0x8400000000000000,
	0x8800000000000000,
	0x9000000000000000,
	0xa000000000000000,
	0xc000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
};

const u64 sotab[64] = {
	0x101010101010100,
	0x202020202020200,
	0x404040404040400,
	0x808080808080800,
	0x1010101010101000,
	0x2020202020202000,
	0x4040404040404000,
	0x8080808080808000,
	0x101010101010000,
	0x202020202020000,
	0x404040404040000,
	0x808080808080000,
	0x1010101010100000,
	0x2020202020200000,
	0x4040404040400000,
	0x8080808080800000,
	0x101010101000000,
	0x202020202000000,
	0x404040404000000,
	0x808080808000000,
	0x1010101010000000,
	0x2020202020000000,
	0x4040404040000000,
	0x8080808080000000,
	0x101010100000000,
	0x202020200000000,
	0x404040400000000,
	0x808080800000000,
	0x1010101000000000,
	0x2020202000000000,
	0x4040404000000000,
	0x8080808000000000,
	0x101010000000000,
	0x202020000000000,
	0x404040000000000,
	0x808080000000000,
	0x1010100000000000,
	0x2020200000000000,
	0x4040400000000000,
	0x8080800000000000,
	0x101000000000000,
	0x202000000000000,
	0x404000000000000,
	0x808000000000000,
	0x1010000000000000,
	0x2020000000000000,
	0x4040000000000000,
	0x8080000000000000,
	0x100000000000000,
	0x200000000000000,
	0x400000000000000,
	0x800000000000000,
	0x1000000000000000,
	0x2000000000000000,
	0x4000000000000000,
	0x8000000000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 sobtab[64] = {
	0x8101010101010100,
	0x8202020202020200,
	0x8404040404040400,
	0x8808080808080800,
	0x9010101010101000,
	0xa020202020202000,
	0xc040404040404000,
	0x8080808080808000,
	0x8101010101010000,
	0x8202020202020000,
	0x8404040404040000,
	0x8808080808080000,
	0x9010101010100000,
	0xa020202020200000,
	0xc040404040400000,
	0x8080808080800000,
	0x8101010101000000,
	0x8202020202000000,
	0x8404040404000000,
	0x8808080808000000,
	0x9010101010000000,
	0xa020202020000000,
	0xc040404040000000,
	0x8080808080000000,
	0x8101010100000000,
	0x8202020200000000,
	0x8404040400000000,
	0x8808080800000000,
	0x9010101000000000,
	0xa020202000000000,
	0xc040404000000000,
	0x8080808000000000,
	0x8101010000000000,
	0x8202020000000000,
	0x8404040000000000,
	0x8808080000000000,
	0x9010100000000000,
	0xa020200000000000,
	0xc040400000000000,
	0x8080800000000000,
	0x8101000000000000,
	0x8202000000000000,
	0x8404000000000000,
	0x8808000000000000,
	0x9010000000000000,
	0xa020000000000000,
	0xc040000000000000,
	0x8080000000000000,
	0x8100000000000000,
	0x8200000000000000,
	0x8400000000000000,
	0x8800000000000000,
	0x9000000000000000,
	0xa000000000000000,
	0xc000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
};

const u64 swtab[64] = {
	0x0,
	0x100,
	0x10200,
	0x1020400,
	0x102040800,
	0x10204081000,
	0x1020408102000,
	0x102040810204000,
	0x0,
	0x10000,
	0x1020000,
	0x102040000,
	0x10204080000,
	0x1020408100000,
	0x102040810200000,
	0x204081020400000,
	0x0,
	0x1000000,
	0x102000000,
	0x10204000000,
	0x1020408000000,
	0x102040810000000,
	0x204081020000000,
	0x408102040000000,
	0x0,
	0x100000000,
	0x10200000000,
	0x1020400000000,
	0x102040800000000,
	0x204081000000000,
	0x408102000000000,
	0x810204000000000,
	0x0,
	0x10000000000,
	0x1020000000000,
	0x102040000000000,
	0x204080000000000,
	0x408100000000000,
	0x810200000000000,
	0x1020400000000000,
	0x0,
	0x1000000000000,
	0x102000000000000,
	0x204000000000000,
	0x408000000000000,
	0x810000000000000,
	0x1020000000000000,
	0x2040000000000000,
	0x0,
	0x100000000000000,
	0x200000000000000,
	0x400000000000000,
	0x800000000000000,
	0x1000000000000000,
	0x2000000000000000,
	0x4000000000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 swbtab[64] = {
	0x8000000000000000,
	0x8000000000000100,
	0x8000000000010200,
	0x8000000001020400,
	0x8000000102040800,
	0x8000010204081000,
	0x8001020408102000,
	0x8102040810204000,
	0x8000000000000000,
	0x8000000000010000,
	0x8000000001020000,
	0x8000000102040000,
	0x8000010204080000,
	0x8001020408100000,
	0x8102040810200000,
	0x8204081020400000,
	0x8000000000000000,
	0x8000000001000000,
	0x8000000102000000,
	0x8000010204000000,
	0x8001020408000000,
	0x8102040810000000,
	0x8204081020000000,
	0x8408102040000000,
	0x8000000000000000,
	0x8000000100000000,
	0x8000010200000000,
	0x8001020400000000,
	0x8102040800000000,
	0x8204081000000000,
	0x8408102000000000,
	0x8810204000000000,
	0x8000000000000000,
	0x8000010000000000,
	0x8001020000000000,
	0x8102040000000000,
	0x8204080000000000,
	0x8408100000000000,
	0x8810200000000000,
	0x9020400000000000,
	0x8000000000000000,
	0x8001000000000000,
	0x8102000000000000,
	0x8204000000000000,
	0x8408000000000000,
	0x8810000000000000,
	0x9020000000000000,
	0xa040000000000000,
	0x8000000000000000,
	0x8100000000000000,
	0x8200000000000000,
	0x8400000000000000,
	0x8800000000000000,
	0x9000000000000000,
	0xa000000000000000,
	0xc000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
	0x8000000000000000,
};

const u64 wetab[64] = {
	0x0,
	0x1,
	0x3,
	0x7,
	0xf,
	0x1f,
	0x3f,
	0x7f,
	0x0,
	0x100,
	0x300,
	0x700,
	0xf00,
	0x1f00,
	0x3f00,
	0x7f00,
	0x0,
	0x10000,
	0x30000,
	0x70000,
	0xf0000,
	0x1f0000,
	0x3f0000,
	0x7f0000,
	0x0,
	0x1000000,
	0x3000000,
	0x7000000,
	0xf000000,
	0x1f000000,
	0x3f000000,
	0x7f000000,
	0x0,
	0x100000000,
	0x300000000,
	0x700000000,
	0xf00000000,
	0x1f00000000,
	0x3f00000000,
	0x7f00000000,
	0x0,
	0x10000000000,
	0x30000000000,
	0x70000000000,
	0xf0000000000,
	0x1f0000000000,
	0x3f0000000000,
	0x7f0000000000,
	0x0,
	0x1000000000000,
	0x3000000000000,
	0x7000000000000,
	0xf000000000000,
	0x1f000000000000,
	0x3f000000000000,
	0x7f000000000000,
	0x0,
	0x100000000000000,
	0x300000000000000,
	0x700000000000000,
	0xf00000000000000,
	0x1f00000000000000,
	0x3f00000000000000,
	0x7f00000000000000,
};

const u64 webtab[64] = {
	0x1,
	0x1,
	0x3,
	0x7,
	0xf,
	0x1f,
	0x3f,
	0x7f,
	0x1,
	0x101,
	0x301,
	0x701,
	0xf01,
	0x1f01,
	0x3f01,
	0x7f01,
	0x1,
	0x10001,
	0x30001,
	0x70001,
	0xf0001,
	0x1f0001,
	0x3f0001,
	0x7f0001,
	0x1,
	0x1000001,
	0x3000001,
	0x7000001,
	0xf000001,
	0x1f000001,
	0x3f000001,
	0x7f000001,
	0x1,
	0x100000001,
	0x300000001,
	0x700000001,
	0xf00000001,
	0x1f00000001,
	0x3f00000001,
	0x7f00000001,
	0x1,
	0x10000000001,
	0x30000000001,
	0x70000000001,
	0xf0000000001,
	0x1f0000000001,
	0x3f0000000001,
	0x7f0000000001,
	0x1,
	0x1000000000001,
	0x3000000000001,
	0x7000000000001,
	0xf000000000001,
	0x1f000000000001,
	0x3f000000000001,
	0x7f000000000001,
	0x1,
	0x100000000000001,
	0x300000000000001,
	0x700000000000001,
	0xf00000000000001,
	0x1f00000000000001,
	0x3f00000000000001,
	0x7f00000000000001,
};

const u64 nwtab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x1,
	0x2,
	0x4,
	0x8,
	0x10,
	0x20,
	0x40,
	0x0,
	0x100,
	0x201,
	0x402,
	0x804,
	0x1008,
	0x2010,
	0x4020,
	0x0,
	0x10000,
	0x20100,
	0x40201,
	0x80402,
	0x100804,
	0x201008,
	0x402010,
	0x0,
	0x1000000,
	0x2010000,
	0x4020100,
	0x8040201,
	0x10080402,
	0x20100804,
	0x40201008,
	0x0,
	0x100000000,
	0x201000000,
	0x402010000,
	0x804020100,
	0x1008040201,
	0x2010080402,
	0x4020100804,
	0x0,
	0x10000000000,
	0x20100000000,
	0x40201000000,
	0x80402010000,
	0x100804020100,
	0x201008040201,
	0x402010080402,
	0x0,
	0x1000000000000,
	0x2010000000000,
	0x4020100000000,
	0x8040201000000,
	0x10080402010000,
	0x20100804020100,
	0x40201008040201,
};

const u64 nwbtab[64] = {
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x1,
	0x3,
	0x5,
	0x9,
	0x11,
	0x21,
	0x41,
	0x1,
	0x101,
	0x201,
	0x403,
	0x805,
	0x1009,
	0x2011,
	0x4021,
	0x1,
	0x10001,
	0x20101,
	0x40201,
	0x80403,
	0x100805,
	0x201009,
	0x402011,
	0x1,
	0x1000001,
	0x2010001,
	0x4020101,
	0x8040201,
	0x10080403,
	0x20100805,
	0x40201009,
	0x1,
	0x100000001,
	0x201000001,
	0x402010001,
	0x804020101,
	0x1008040201,
	0x2010080403,
	0x4020100805,
	0x1,
	0x10000000001,
	0x20100000001,
	0x40201000001,
	0x80402010001,
	0x100804020101,
	0x201008040201,
	0x402010080403,
	0x1,
	0x1000000000001,
	0x2010000000001,
	0x4020100000001,
	0x8040201000001,
	0x10080402010001,
	0x20100804020101,
	0x40201008040201,
};

const u64 rotab[64] = {
	0x1010101010101fe,
	0x2020202020202fd,
	0x4040404040404fb,
	0x8080808080808f7,
	0x10101010101010ef,
	0x20202020202020df,
	0x40404040404040bf,
	0x808080808080807f,
	0x10101010101fe01,
	0x20202020202fd02,
	0x40404040404fb04,
	0x80808080808f708,
	0x101010101010ef10,
	0x202020202020df20,
	0x404040404040bf40,
	0x8080808080807f80,
	0x101010101fe0101,
	0x202020202fd0202,
	0x404040404fb0404,
	0x808080808f70808,
	0x1010101010ef1010,
	0x2020202020df2020,
	0x4040404040bf4040,
	0x80808080807f8080,
	0x1010101fe010101,
	0x2020202fd020202,
	0x4040404fb040404,
	0x8080808f7080808,
	0x10101010ef101010,
	0x20202020df202020,
	0x40404040bf404040,
	0x808080807f808080,
	0x10101fe01010101,
	0x20202fd02020202,
	0x40404fb04040404,
	0x80808f708080808,
	0x101010ef10101010,
	0x202020df20202020,
	0x404040bf40404040,
	0x8080807f80808080,
	0x101fe0101010101,
	0x202fd0202020202,
	0x404fb0404040404,
	0x808f70808080808,
	0x1010ef1010101010,
	0x2020df2020202020,
	0x4040bf4040404040,
	0x80807f8080808080,
	0x1fe010101010101,
	0x2fd020202020202,
	0x4fb040404040404,
	0x8f7080808080808,
	0x10ef101010101010,
	0x20df202020202020,
	0x40bf404040404040,
	0x807f808080808080,
	0xfe01010101010101,
	0xfd02020202020202,
	0xfb04040404040404,
	0xf708080808080808,
	0xef10101010101010,
	0xdf20202020202020,
	0xbf40404040404040,
	0x7f80808080808080,
};

const u64 bitab[64] = {
	0x8040201008040200,
	0x80402010080500,
	0x804020110a00,
	0x8041221400,
	0x182442800,
	0x10204885000,
	0x102040810a000,
	0x102040810204000,
	0x4020100804020002,
	0x8040201008050005,
	0x804020110a000a,
	0x804122140014,
	0x18244280028,
	0x1020488500050,
	0x102040810a000a0,
	0x204081020400040,
	0x2010080402000204,
	0x4020100805000508,
	0x804020110a000a11,
	0x80412214001422,
	0x1824428002844,
	0x102048850005088,
	0x2040810a000a010,
	0x408102040004020,
	0x1008040200020408,
	0x2010080500050810,
	0x4020110a000a1120,
	0x8041221400142241,
	0x182442800284482,
	0x204885000508804,
	0x40810a000a01008,
	0x810204000402010,
	0x804020002040810,
	0x1008050005081020,
	0x20110a000a112040,
	0x4122140014224180,
	0x8244280028448201,
	0x488500050880402,
	0x810a000a0100804,
	0x1020400040201008,
	0x402000204081020,
	0x805000508102040,
	0x110a000a11204080,
	0x2214001422418000,
	0x4428002844820100,
	0x8850005088040201,
	0x10a000a010080402,
	0x2040004020100804,
	0x200020408102040,
	0x500050810204080,
	0xa000a1120408000,
	0x1400142241800000,
	0x2800284482010000,
	0x5000508804020100,
	0xa000a01008040201,
	0x4000402010080402,
	0x2040810204080,
	0x5081020408000,
	0xa112040800000,
	0x14224180000000,
	0x28448201000000,
	0x50880402010000,
	0xa0100804020100,
	0x40201008040201,
};

const u64 kntab[64] = {
	0x20400,
	0x50800,
	0xa1100,
	0x142200,
	0x284400,
	0x508800,
	0xa01000,
	0x402000,
	0x2040004,
	0x5080008,
	0xa110011,
	0x14220022,
	0x28440044,
	0x50880088,
	0xa0100010,
	0x40200020,
	0x204000402,
	0x508000805,
	0xa1100110a,
	0x1422002214,
	0x2844004428,
	0x5088008850,
	0xa0100010a0,
	0x4020002040,
	0x20400040200,
	0x50800080500,
	0xa1100110a00,
	0x142200221400,
	0x284400442800,
	0x508800885000,
	0xa0100010a000,
	0x402000204000,
	0x2040004020000,
	0x5080008050000,
	0xa1100110a0000,
	0x14220022140000,
	0x28440044280000,
	0x50880088500000,
	0xa0100010a00000,
	0x40200020400000,
	0x204000402000000,
	0x508000805000000,
	0xa1100110a000000,
	0x1422002214000000,
	0x2844004428000000,
	0x5088008850000000,
	0xa0100010a0000000,
	0x4020002040000000,
	0x400040200000000,
	0x800080500000000,
	0x1100110a00000000,
	0x2200221400000000,
	0x4400442800000000,
	0x8800885000000000,
	0x100010a000000000,
	0x2000204000000000,
	0x4020000000000,
	0x8050000000000,
	0x110a0000000000,
	0x22140000000000,
	0x44280000000000,
	0x88500000000000,
	0x10a00000000000,
	0x20400000000000,
};

const u64 wctab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x2,
	0x5,
	0xa,
	0x14,
	0x28,
	0x50,
	0xa0,
	0x40,
	0x200,
	0x500,
	0xa00,
	0x1400,
	0x2800,
	0x5000,
	0xa000,
	0x4000,
	0x20000,
	0x50000,
	0xa0000,
	0x140000,
	0x280000,
	0x500000,
	0xa00000,
	0x400000,
	0x2000000,
	0x5000000,
	0xa000000,
	0x14000000,
	0x28000000,
	0x50000000,
	0xa0000000,
	0x40000000,
	0x200000000,
	0x500000000,
	0xa00000000,
	0x1400000000,
	0x2800000000,
	0x5000000000,
	0xa000000000,
	0x4000000000,
	0x20000000000,
	0x50000000000,
	0xa0000000000,
	0x140000000000,
	0x280000000000,
	0x500000000000,
	0xa00000000000,
	0x400000000000,
	0x2000000000000,
	0x5000000000000,
	0xa000000000000,
	0x14000000000000,
	0x28000000000000,
	0x50000000000000,
	0xa0000000000000,
	0x40000000000000,
};

const u64 bctab[64] = {
	0x200,
	0x500,
	0xa00,
	0x1400,
	0x2800,
	0x5000,
	0xa000,
	0x4000,
	0x20000,
	0x50000,
	0xa0000,
	0x140000,
	0x280000,
	0x500000,
	0xa00000,
	0x400000,
	0x2000000,
	0x5000000,
	0xa000000,
	0x14000000,
	0x28000000,
	0x50000000,
	0xa0000000,
	0x40000000,
	0x200000000,
	0x500000000,
	0xa00000000,
	0x1400000000,
	0x2800000000,
	0x5000000000,
	0xa000000000,
	0x4000000000,
	0x20000000000,
	0x50000000000,
	0xa0000000000,
	0x140000000000,
	0x280000000000,
	0x500000000000,
	0xa00000000000,
	0x400000000000,
	0x2000000000000,
	0x5000000000000,
	0xa000000000000,
	0x14000000000000,
	0x28000000000000,
	0x50000000000000,
	0xa0000000000000,
	0x40000000000000,
	0x200000000000000,
	0x500000000000000,
	0xa00000000000000,
	0x1400000000000000,
	0x2800000000000000,
	0x5000000000000000,
	0xa000000000000000,
	0x4000000000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 wptab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x1,
	0x2,
	0x4,
	0x8,
	0x10,
	0x20,
	0x40,
	0x80,
	0x100,
	0x200,
	0x400,
	0x800,
	0x1000,
	0x2000,
	0x4000,
	0x8000,
	0x10000,
	0x20000,
	0x40000,
	0x80000,
	0x100000,
	0x200000,
	0x400000,
	0x800000,
	0x1000000,
	0x2000000,
	0x4000000,
	0x8000000,
	0x10000000,
	0x20000000,
	0x40000000,
	0x80000000,
	0x100000000,
	0x200000000,
	0x400000000,
	0x800000000,
	0x1000000000,
	0x2000000000,
	0x4000000000,
	0x8000000000,
	0x10000000000,
	0x20000000000,
	0x40000000000,
	0x80000000000,
	0x100000000000,
	0x200000000000,
	0x400000000000,
	0x800000000000,
	0x1000000000000,
	0x2000000000000,
	0x4000000000000,
	0x8000000000000,
	0x10000000000000,
	0x20000000000000,
	0x40000000000000,
	0x80000000000000,
};

const u64 bptab[64] = {
	0x100,
	0x200,
	0x400,
	0x800,
	0x1000,
	0x2000,
	0x4000,
	0x8000,
	0x10000,
	0x20000,
	0x40000,
	0x80000,
	0x100000,
	0x200000,
	0x400000,
	0x800000,
	0x1000000,
	0x2000000,
	0x4000000,
	0x8000000,
	0x10000000,
	0x20000000,
	0x40000000,
	0x80000000,
	0x100000000,
	0x200000000,
	0x400000000,
	0x800000000,
	0x1000000000,
	0x2000000000,
	0x4000000000,
	0x8000000000,
	0x10000000000,
	0x20000000000,
	0x40000000000,
	0x80000000000,
	0x100000000000,
	0x200000000000,
	0x400000000000,
	0x800000000000,
	0x1000000000000,
	0x2000000000000,
	0x4000000000000,
	0x8000000000000,
	0x10000000000000,
	0x20000000000000,
	0x40000000000000,
	0x80000000000000,
	0x100000000000000,
	0x200000000000000,
	0x400000000000000,
	0x800000000000000,
	0x1000000000000000,
	0x2000000000000000,
	0x4000000000000000,
	0x8000000000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 wltab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x100000000,
	0x200000000,
	0x400000000,
	0x800000000,
	0x1000000000,
	0x2000000000,
	0x4000000000,
	0x8000000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};

const u64 bltab[64] = {
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x1000000,
	0x2000000,
	0x4000000,
	0x8000000,
	0x10000000,
	0x20000000,
	0x40000000,
	0x80000000,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
	0x0,
};