diff options
author | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-04-08 14:05:27 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@felloff.net> | 2019-04-08 14:05:27 +0200 |
commit | d8d4802f80b40bc9a43031e3d6484aa237e7d444 (patch) | |
tree | 7714690d2d47f2aedf4ad60ad9ad0e6d88db2a1b /sys/src | |
parent | 394d095ee0a9e50242b88a783af6bb777cfb3e01 (diff) |
7l: add arm64 linker (initial sync)
Diffstat (limited to 'sys/src')
-rw-r--r-- | sys/src/cmd/7l/asm.c | 615 | ||||
-rw-r--r-- | sys/src/cmd/7l/asmout.c | 1709 | ||||
-rw-r--r-- | sys/src/cmd/7l/bits.c | 5359 | ||||
-rw-r--r-- | sys/src/cmd/7l/compat.c | 56 | ||||
-rw-r--r-- | sys/src/cmd/7l/dyn.c | 157 | ||||
-rw-r--r-- | sys/src/cmd/7l/l.h | 430 | ||||
-rw-r--r-- | sys/src/cmd/7l/list.c | 362 | ||||
-rw-r--r-- | sys/src/cmd/7l/mkcname | 17 | ||||
-rw-r--r-- | sys/src/cmd/7l/mkfile | 37 | ||||
-rw-r--r-- | sys/src/cmd/7l/mod.c | 203 | ||||
-rw-r--r-- | sys/src/cmd/7l/noop.c | 324 | ||||
-rw-r--r-- | sys/src/cmd/7l/obj.c | 1502 | ||||
-rw-r--r-- | sys/src/cmd/7l/optab.c | 388 | ||||
-rw-r--r-- | sys/src/cmd/7l/pass.c | 448 | ||||
-rw-r--r-- | sys/src/cmd/7l/span.c | 1316 |
15 files changed, 12923 insertions, 0 deletions
diff --git a/sys/src/cmd/7l/asm.c b/sys/src/cmd/7l/asm.c new file mode 100644 index 000000000..408881ee5 --- /dev/null +++ b/sys/src/cmd/7l/asm.c @@ -0,0 +1,615 @@ +#include "l.h" + +long OFFSET; + +#define PADDR(a) ((a) & ~0xfffffffff0000000ull) + +vlong +entryvalue(void) +{ + char *a; + Sym *s; + + a = INITENTRY; + if(*a >= '0' && *a <= '9') + return atolwhex(a); + s = lookup(a, 0); + if(s->type == 0) + return INITTEXT; + switch(s->type) { + case STEXT: + case SLEAF: + break; + case SDATA: + if(dlm) + return s->value+INITDAT; + default: + diag("entry not text: %s", s->name); + } + return s->value; +} + +void +cflush(void) +{ + int n; + + n = sizeof(buf.cbuf) - cbc; + if(n) + write(cout, buf.cbuf, n); + cbp = buf.cbuf; + cbc = sizeof(buf.cbuf); +} + +void +asmb(void) +{ + Prog *p; + long magic, t, etext; + vlong vl; + Optab *o; + + if(debug['v']) + Bprint(&bso, "%5.2f asm\n", cputime()); + Bflush(&bso); + OFFSET = HEADR; + seek(cout, OFFSET, 0); + pc = INITTEXT; + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) { + curtext = p; + autosize = p->to.offset + PCSZ; + } + if(p->as == ADWORD && (pc & 7) != 0) { + lputl(0); + pc += 4; + } + if(p->pc != pc) { + diag("phase error %llux sb %llux", + p->pc, pc); + if(!debug['a']) + prasm(curp); + pc = p->pc; + } + curp = p; + o = oplook(p); /* could probably avoid this call */ + asmout(p, o); + pc += o->size; + } + + if(debug['a']) + Bprint(&bso, "\n"); + Bflush(&bso); + cflush(); + + /* output strings in text segment */ + etext = INITTEXT + textsize; + for(t = pc; t < etext; t += sizeof(buf)-100) { + if(etext-t > sizeof(buf)-100) + datblk(t, sizeof(buf)-100, 1); + else + datblk(t, etext-t, 1); + } + + curtext = P; + switch(HEADTYPE) { + case 0: + case 2: + case 7: + OFFSET = HEADR+textsize; + seek(cout, OFFSET, 0); + break; + case 6: /* no header, padded segments */ + OFFSET = rnd(HEADR+textsize, 4096); + seek(cout, OFFSET, 0); + break; + } + if(dlm){ + char buf[8]; + + write(cout, buf, INITDAT-textsize); + textsize = INITDAT; + } + for(t = 0; t < datsize; t += sizeof(buf)-100) { + if(datsize-t > sizeof(buf)-100) + datblk(t, sizeof(buf)-100, 0); + else + datblk(t, datsize-t, 0); + } + + symsize = 0; + lcsize = 0; + if(!debug['s']) { + if(debug['v']) + Bprint(&bso, "%5.2f sym\n", cputime()); + Bflush(&bso); + switch(HEADTYPE) { + case 0: + debug['s'] = 1; + break; + case 2: + OFFSET = HEADR+textsize+datsize; + seek(cout, OFFSET, 0); + break; + case 6: /* no header, padded segments */ + OFFSET += rnd(datsize, 4096); + seek(cout, OFFSET, 0); + break; + case 7: + break; + } + if(!debug['s']) + asmsym(); + if(debug['v']) + Bprint(&bso, "%5.2f pc\n", cputime()); + Bflush(&bso); + if(!debug['s']) + asmlc(); + if(dlm) + asmdyn(); + cflush(); + } + else if(dlm){ + seek(cout, HEADR+textsize+datsize, 0); + asmdyn(); + cflush(); + } + + if(debug['v']) + Bprint(&bso, "%5.2f header\n", cputime()); + Bflush(&bso); + OFFSET = 0; + seek(cout, OFFSET, 0); + switch(HEADTYPE) { + case 0: /* no header */ + case 6: /* no header, padded segments */ + break; + case 2: /* plan 9 */ + magic = 4*28*28+7; + magic |= 0x00008000; /* fat header */ + if(dlm) + magic |= 0x80000000; /* dlm */ + lput(magic); /* magic */ + lput(textsize); /* sizes */ + lput(datsize); + lput(bsssize); + lput(symsize); /* nsyms */ + vl = entryvalue(); + lput(PADDR(vl)); /* va of entry */ + lput(0L); + lput(lcsize); + llput(vl); /* va of entry */ + break; + } + cflush(); +} + +void +cput(int c) +{ + cbp[0] = c; + cbp++; + cbc--; + if(cbc <= 0) + cflush(); +} + +void +wput(long l) +{ + + cbp[0] = l>>8; + cbp[1] = l; + cbp += 2; + cbc -= 2; + if(cbc <= 0) + cflush(); +} + +void +wputl(long l) +{ + + cbp[0] = l; + cbp[1] = l>>8; + cbp += 2; + cbc -= 2; + if(cbc <= 0) + cflush(); +} + +void +lput(long l) +{ + + cbp[0] = l>>24; + cbp[1] = l>>16; + cbp[2] = l>>8; + cbp[3] = l; + cbp += 4; + cbc -= 4; + if(cbc <= 0) + cflush(); +} + +void +lputl(long l) +{ + + cbp[3] = l>>24; + cbp[2] = l>>16; + cbp[1] = l>>8; + cbp[0] = l; + cbp += 4; + cbc -= 4; + if(cbc <= 0) + cflush(); +} + +void +llput(vlong v) +{ + lput(v>>32); + lput(v); +} + +void +llputl(vlong v) +{ + lputl(v); + lputl(v>>32); +} + +void +asmsym(void) +{ + Prog *p; + Auto *a; + Sym *s; + int h; + + s = lookup("etext", 0); + if(s->type == STEXT) + putsymb(s->name, 'T', s->value, s->version); + + for(h=0; h<NHASH; h++) + for(s=hash[h]; s!=S; s=s->link) + switch(s->type) { + case SCONST: + putsymb(s->name, 'D', s->value, s->version); + continue; + + case SDATA: + putsymb(s->name, 'D', s->value+INITDAT, s->version); + continue; + + case SBSS: + putsymb(s->name, 'B', s->value+INITDAT, s->version); + continue; + + case SSTRING: + putsymb(s->name, 'T', s->value, s->version); + continue; + + case SFILE: + putsymb(s->name, 'f', s->value, s->version); + continue; + } + + for(p=textp; p!=P; p=p->cond) { + s = p->from.sym; + if(s->type != STEXT && s->type != SLEAF) + continue; + + /* filenames first */ + for(a=p->to.autom; a; a=a->link) + if(a->type == D_FILE) + putsymb(a->asym->name, 'z', a->aoffset, 0); + else + if(a->type == D_FILE1) + putsymb(a->asym->name, 'Z', a->aoffset, 0); + + if(s->type == STEXT) + putsymb(s->name, 'T', s->value, s->version); + else + putsymb(s->name, 'L', s->value, s->version); + + /* frame, auto and param after */ + putsymb(".frame", 'm', p->to.offset+PCSZ, 0); + for(a=p->to.autom; a; a=a->link) + if(a->type == D_AUTO) + putsymb(a->asym->name, 'a', -a->aoffset, 0); + else + if(a->type == D_PARAM) + putsymb(a->asym->name, 'p', a->aoffset, 0); + } + if(debug['v'] || debug['n']) + Bprint(&bso, "symsize = %lud\n", symsize); + Bflush(&bso); +} + +void +putsymb(char *s, int t, vlong v, int ver) +{ + int i, f, l; + + if(t == 'f') + s++; + l = 4; + switch(HEADTYPE){ + default: + break; + case 2: + lput(v>>32); + l = 8; + break; + } + lput(v); + if(ver) + t += 'a' - 'A'; + cput(t+0x80); /* 0x80 is variable length */ + + if(t == 'Z' || t == 'z') { + cput(s[0]); + for(i=1; s[i] != 0 || s[i+1] != 0; i += 2) { + cput(s[i]); + cput(s[i+1]); + } + cput(0); + cput(0); + i++; + } + else { + for(i=0; s[i]; i++) + cput(s[i]); + cput(0); + } + symsize += l + 1 + i + 1; + + if(debug['n']) { + if(t == 'z' || t == 'Z') { + Bprint(&bso, "%c %.8llux ", t, v); + for(i=1; s[i] != 0 || s[i+1] != 0; i+=2) { + f = ((s[i]&0xff) << 8) | (s[i+1]&0xff); + Bprint(&bso, "/%x", f); + } + Bprint(&bso, "\n"); + return; + } + if(ver) + Bprint(&bso, "%c %.8llux %s<%d>\n", t, v, s, ver); + else + Bprint(&bso, "%c %.8llux %s\n", t, v, s); + } +} + +#define MINLC 4 +void +asmlc(void) +{ + long oldpc, oldlc; + Prog *p; + long v, s; + + oldpc = INITTEXT; + oldlc = 0; + for(p = firstp; p != P; p = p->link) { + if(p->line == oldlc || p->as == ATEXT || p->as == ANOP) { + if(p->as == ATEXT) + curtext = p; + if(debug['V']) + Bprint(&bso, "%6llux %P\n", + p->pc, p); + continue; + } + if(debug['V']) + Bprint(&bso, "\t\t%6ld", lcsize); + v = (p->pc - oldpc) / MINLC; + while(v) { + s = 127; + if(v < 127) + s = v; + cput(s+128); /* 129-255 +pc */ + if(debug['V']) + Bprint(&bso, " pc+%ld*%d(%ld)", s, MINLC, s+128); + v -= s; + lcsize++; + } + s = p->line - oldlc; + oldlc = p->line; + oldpc = p->pc + MINLC; + if(s > 64 || s < -64) { + cput(0); /* 0 vv +lc */ + cput(s>>24); + cput(s>>16); + cput(s>>8); + cput(s); + if(debug['V']) { + if(s > 0) + Bprint(&bso, " lc+%ld(%d,%ld)\n", + s, 0, s); + else + Bprint(&bso, " lc%ld(%d,%ld)\n", + s, 0, s); + Bprint(&bso, "%6llux %P\n", + p->pc, p); + } + lcsize += 5; + continue; + } + if(s > 0) { + cput(0+s); /* 1-64 +lc */ + if(debug['V']) { + Bprint(&bso, " lc+%ld(%ld)\n", s, 0+s); + Bprint(&bso, "%6llux %P\n", + p->pc, p); + } + } else { + cput(64-s); /* 65-128 -lc */ + if(debug['V']) { + Bprint(&bso, " lc%ld(%ld)\n", s, 64-s); + Bprint(&bso, "%6llux %P\n", + p->pc, p); + } + } + lcsize++; + } + while(lcsize & 1) { + s = 129; + cput(s); + lcsize++; + } + if(debug['v'] || debug['V']) + Bprint(&bso, "lcsize = %ld\n", lcsize); + Bflush(&bso); +} + +void +datblk(long s, long n, int str) +{ + Sym *v; + Prog *p; + char *cast; + long a, l, fl, j; + vlong d; + int i, c; + + memset(buf.dbuf, 0, n+100); + for(p = datap; p != P; p = p->link) { + if(str != (p->from.sym->type == SSTRING)) + continue; + curp = p; + a = p->from.sym->value + p->from.offset; + l = a - s; + c = p->reg; + i = 0; + if(l < 0) { + if(l+c <= 0) + continue; + while(l < 0) { + l++; + i++; + } + } + if(l >= n) + continue; + if(p->as != AINIT && p->as != ADYNT) { + for(j=l+(c-i)-1; j>=l; j--) + if(buf.dbuf[j]) { + print("%P\n", p); + diag("multiple initialization"); + break; + } + } + switch(p->to.type) { + default: + diag("unknown mode in initialization%P", p); + break; + + case D_FCONST: + switch(c) { + default: + case 4: + fl = ieeedtof(p->to.ieee); + cast = (char*)&fl; + for(; i<c; i++) { + buf.dbuf[l] = cast[fnuxi4[i]]; + l++; + } + break; + case 8: + cast = (char*)p->to.ieee; + for(; i<c; i++) { + buf.dbuf[l] = cast[fnuxi8[i]]; + l++; + } + break; + } + break; + + case D_SCONST: + for(; i<c; i++) { + buf.dbuf[l] = p->to.sval[i]; + l++; + } + break; + + case D_CONST: + d = p->to.offset; + v = p->to.sym; + if(v) { + switch(v->type) { + case SUNDEF: + ckoff(v, d); + case STEXT: + case SLEAF: + case SSTRING: + d += p->to.sym->value; + break; + case SDATA: + case SBSS: + d += p->to.sym->value + INITDAT; + } + if(dlm) + dynreloc(v, a+INITDAT, 1); + } + cast = (char*)&d; + switch(c) { + default: + diag("bad nuxi %d %d%P", c, i, curp); + break; + case 1: + for(; i<c; i++) { + buf.dbuf[l] = cast[inuxi1[i]]; + l++; + } + break; + case 2: + for(; i<c; i++) { + buf.dbuf[l] = cast[inuxi2[i]]; + l++; + } + break; + case 4: + for(; i<c; i++) { + buf.dbuf[l] = cast[inuxi4[i]]; + l++; + } + break; + case 8: + for(; i<c; i++) { + buf.dbuf[l] = cast[inuxi8[i]]; + l++; + } + break; + } + break; + } + } + write(cout, buf.dbuf, n); +} + +static Ieee chipfloats[] = { + {0x00000000, 0x00000000}, /* 0 */ + {0x00000000, 0x3ff00000}, /* 1 */ + {0x00000000, 0x40000000}, /* 2 */ + {0x00000000, 0x40080000}, /* 3 */ + {0x00000000, 0x40100000}, /* 4 */ + {0x00000000, 0x40140000}, /* 5 */ + {0x00000000, 0x3fe00000}, /* .5 */ + {0x00000000, 0x40240000}, /* 10 */ +}; + +int +chipfloat(Ieee *e) +{ + Ieee *p; + int n; + + for(n = sizeof(chipfloats)/sizeof(chipfloats[0]); --n >= 0;){ + p = &chipfloats[n]; + if(p->l == e->l && p->h == e->h && 0) + return n; /* TO DO: return imm8 encoding */ + } + return -1; +} diff --git a/sys/src/cmd/7l/asmout.c b/sys/src/cmd/7l/asmout.c new file mode 100644 index 000000000..7a3c7b4f9 --- /dev/null +++ b/sys/src/cmd/7l/asmout.c @@ -0,0 +1,1709 @@ +#include "l.h" + +#define S32 (0U<<31) +#define S64 (1U<<31) +#define Rm(X) (((X)&31)<<16) +#define Rn(X) (((X)&31)<<5) +#define Rd(X) (((X)&31)<<0) +#define Sbit (1U<<29) + +#define OPDP2(x) (0<<30 | 0 << 29 | 0xd6<<21 | (x)<<10) +#define OPDP3(sf,op54,op31,o0) ((sf)<<31 | (op54)<<29 | 0x1B<<24 | (op31)<<21 | (o0)<<15) +#define OPBcc(x) (0x2A<<25 | 0<<24 | 0<<4 | ((x)&15)) +#define OPBLR(x) (0x6B<<25 | 0<<23 | (x)<<21 | 0x1F<<16 | 0<<10) /* x=0, JMP; 1, CALL; 2, RET */ +#define SYSOP(l,op0,op1,crn,crm,op2,rt) (0x354<<22 | (l)<<21 | (op0)<<19 | (op1)<<16 | (crn)<<12 | (crm)<<8 | (op2)<<5 | (rt)) +#define SYSHINT(x) SYSOP(0,0,3,2,0,(x),0x1F) + +#define LDSTR12U(sz,v,opc) ((sz)<<30 | 7<<27 | (v)<<26 | 1<<24 | (opc)<<22) +#define LDSTR9S(sz,v,opc) ((sz)<<30 | 7<<27 | (v)<<26 | 0<<24 | (opc)<<22) +#define LD2STR(o) ((o) & ~(3<<22)) + +#define LDSTX(sz,o2,l,o1,o0) ((sz)<<30 | 0x8<<24 | (o2)<<23 | (l)<<22 | (o1)<<21 | (o0)<<15) + +#define FPCMP(m,s,type,op,op2) ((m)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 1<<21 | (op)<<14 | 8<<10 | (op2)) +#define FPCCMP(m,s,type,op) ((m)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 1<<21 | 1<<10 | (op)<<4) +#define FPOP1S(m,s,type,op) ((m)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 1<<21 | (op)<<15 | 0x10<<10) +#define FPOP2S(m,s,type,op) ((m)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 1<<21 | (op)<<12 | 2<<10) +#define FPCVTI(sf,s,type,rmode,op) ((sf)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 1<<21 | (rmode)<<19 | (op)<<16 | 0<<10) +#define FPCVTF(sf,s,type,rmode,op,scale) ((sf)<<31 | (s)<<29 | 0x1E<<24 | (type)<<22 | 0<<21 | (rmode)<<19 | (op)<<16 | (scale)<<10) +#define ADR(p,o,rt) ((p)<<31 | ((o)&3)<<29 | (0x10<<24) | (((o>>2)&0x7FFFF)<<5) | (rt)) + +#define LSL0_32 (2<<13) +#define LSL0_64 (3<<13) + +static long opbrr(int); +static long opbra(int); +static long oshrr(int, int, int); +static long olhrr(int, int, int); +static long olsr12u(long, long, int, int); +static long olsr9s(long, long, int, int); +static long opimm(int); +static vlong brdist(Prog*, int, int, int); +static long opbfm(int, int, int, int, int); +static long opextr(int, long, int, int, int); +static long opbit(int); +static long op0(int); +static long opstr12(int); +static long opstr9(int); +static long opldr9(int); +static long opxrrr(int); +static long olsxrr(int, int, int, int); +static long oprrr(int); +static long opirr(int); +static long opldr12(int); +static long opldrpp(int); +static long opload(int); +static long opstore(int); +static long omovlit(int, Prog*, Adr*, int); +static int movesize(int); +static long oaddi(long, long, int, int); + +/* + * valid pstate field values, and value to use in instruction + */ +static struct{ + ulong a; + ulong b; +} pstatefield[] = { +D_SPSel, (0<<16) | (4<<12) | (5<<5), +D_DAIFSet, (3<<16) | (4<<12) | (6<<5), +D_DAIFClr, (3<<16) | (4<<12) | (7<<5), +}; + +void +asmout(Prog *p, Optab *o) +{ + long o1, o2, o3, o4, o5, v, hi; + ulong u; + vlong d; + int r, s, rf, rt, ra, nzcv, cond, i, as; + Mask *mask; + static Prog *lastcase; + + o1 = 0; + o2 = 0; + o3 = 0; + o4 = 0; + o5 = 0; + switch(o->type) { + default: + diag("unknown asm %d", o->type); + prasm(p); + break; + + case 0: /* pseudo ops */ + break; + + case 1: /* op Rm,[Rn],Rd; default Rn=Rd -> op Rm<<0,[Rn,]Rd (shifted register) */ + o1 = oprrr(p->as); + rf = p->from.reg; + rt = p->to.reg; + r = p->reg; + if(p->to.type == D_NONE) + rt = REGZERO; + if(r == NREG) + r = rt; + o1 |= (rf<<16) | (r<<5) | rt; + break; + + case 2: /* add/sub $(uimm12|uimm24)[,R],R; cmp $(uimm12|uimm24),R */ + o1 = opirr(p->as); + rt = p->to.reg; + if(p->to.type == D_NONE){ + if((o1 & Sbit) == 0) + diag("ineffective ZR destination\n%P", p); + rt = REGZERO; + } + r = p->reg; + if(r == NREG) + r = rt; + v = regoff(&p->from); + o1 = oaddi(o1, v, r, rt); + break; + + case 3: /* op R<<n[,R],R (shifted register) */ + o1 = oprrr(p->as); + o1 |= p->from.offset; /* includes reg, op, etc */ + rt = p->to.reg; + if(p->to.type == D_NONE) + rt = REGZERO; + r = p->reg; + if(p->as == AMVN || p->as == AMVNW) + r = REGZERO; + else if(r == NREG) + r = rt; + o1 |= (r<<5) | rt; + break; + + case 4: /* mov $addcon, R; mov $recon, R; mov $racon, R */ + o1 = opirr(p->as); + rt = p->to.reg; + r = o->param; + if(r == 0) + r = REGZERO; + v = regoff(&p->from); + if((v & 0xFFF000) != 0){ + v >>= 12; + o1 |= 1<<22; /* shift, by 12 */ + } + o1 |= ((v& 0xFFF) << 10) | (r<<5) | rt; + break; + + case 5: /* b s; bl s */ + o1 = opbra(p->as); + o1 |= brdist(p, 0, 26, 2); + break; + + case 6: /* b ,O(R); bl ,O(R) */ + o1 = opbrr(p->as); + o1 |= p->to.reg << 5; + break; + + case 7: /* beq s */ + o1 = opbra(p->as); + o1 |= brdist(p, 0, 19, 2)<<5; + break; + + case 8: /* lsl $c,[R],R -> ubfm $(W-1)-c,$(-c MOD (W-1)),Rn,Rd */ + rt = p->to.reg; + rf = p->reg; + if(rf == NREG) + rf = rt; + v = p->from.offset; + switch(p->as){ + case AASR: o1 = opbfm(ASBFM, v, 63, rf, rt); break; + case AASRW: o1 = opbfm(ASBFMW, v, 31, rf, rt); break; + case ALSL: o1 = opbfm(AUBFM, (64-v)&63, 63-v, rf, rt); break; + case ALSLW: o1 = opbfm(AUBFMW, (32-v)&31, 31-v, rf, rt); break; + case ALSR: o1 = opbfm(AUBFM, v, 63, rf, rt); break; + case ALSRW: o1 = opbfm(AUBFMW, v, 31, rf, rt); break; + case AROR: o1 = opextr(AEXTR, v, rf, rf, rt); break; + case ARORW: o1 = opextr(AEXTRW, v, rf, rf, rt); break; + default: + diag("bad shift $con\n%P", curp); + break; + } + break; + + case 9: /* lsl Rm,[Rn],Rd -> lslv Rm, Rn, Rd */ + o1 = oprrr(p->as); + r = p->reg; + if(r == NREG) + r = p->to.reg; + o1 |= (p->from.reg << 16) | (r<<5) | p->to.reg; + break; + + case 10: /* brk/hvc/.../svc [$con] */ + o1 = opimm(p->as); + if(p->to.type != D_NONE) + o1 |= (p->to.offset & 0xffff)<<5; + break; + + case 11: /* dword */ + switch(aclass(&p->to)) { + case C_VCON: + case C_ZCON: + case C_LCON: + if(!dlm) + break; + if(p->to.name != D_EXTERN && p->to.name != D_STATIC) + break; + case C_ADDR: + if(p->to.sym->type == SUNDEF) + ckoff(p->to.sym, p->to.offset); + dynreloc(p->to.sym, p->pc, 1); + } + o1 = instoffset; + o2 = instoffset >> 32; + break; + + case 12: /* movT $lcon, reg */ + o1 = omovlit(p->as, p, &p->from, p->to.reg); + break; + + case 13: /* addop $lcon, [R], R (64 bit literal); cmp $lcon,R -> addop $lcon,R, ZR */ + o1 = omovlit(AMOV, p, &p->from, REGTMP); + if(!o1) + break; + rt = p->to.reg; + if(p->to.type == D_NONE) + rt = REGZERO; + r = p->reg; + if(r == NREG) + r = rt; + if(p->to.type != D_NONE && (p->to.reg == REGSP || r == REGSP)){ + o2 = opxrrr(p->as); + o2 |= REGTMP<<16; + o2 |= LSL0_64; + }else{ + o2 = oprrr(p->as); + o2 |= REGTMP << 16; /* shift is 0 */ + } + o2 |= r << 5; + o2 |= rt; + break; + + case 14: /* word */ + if(aclass(&p->to) == C_ADDR) + diag("address constant needs DWORD\n%P", p); + o1 = instoffset; + break; + + case 15: /* mul/mneg/umulh/umull r,[r,]r; madd/msub Rm,Rn,Ra,Rd */ + o1 = oprrr(p->as); + rf = p->from.reg; + rt = p->to.reg; + if(p->from3.type == D_REG){ + r = p->from3.reg; + ra = p->reg; + if(ra == NREG) + ra = REGZERO; + }else{ + r = p->reg; + if(r == NREG) + r = rt; + ra = REGZERO; + } + o1 |= (rf<<16) | (ra<<10) | (r<<5) | rt; + break; + + case 16: /* XremY R[,R],R -> XdivY; XmsubY */ + o1 = oprrr(p->as); + rf = p->from.reg; + rt = p->to.reg; + r = p->reg; + if(r == NREG) + r = rt; + o1 |= (rf<<16) | (r<<5) | REGTMP; + o2 = oprrr(AMSUBW); + o2 |= o1 & (1<<31); /* same size */ + o2 |= (rf<<16) | (r<<10) | (REGTMP<<5) | rt; + break; + + case 17: /* op Rm,[Rn],Rd; default Rn=ZR */ + o1 = oprrr(p->as); + rf = p->from.reg; + rt = p->to.reg; + r = p->reg; + if(p->to.type == D_NONE) + rt = REGZERO; + if(r == NREG) + r = REGZERO; + o1 |= (rf<<16) | (r<<5) | rt; + break; + + case 18: /* csel cond,Rn,Rm,Rd; cinc/cinv/cneg cond,Rn,Rd; cset cond,Rd */ + o1 = oprrr(p->as); + cond = p->from.reg; + r = p->reg; + if(r != NREG){ + if(p->from3.type == D_NONE){ + /* CINC/CINV/CNEG */ + rf = r; + cond ^= 1; + }else + rf = p->from3.reg; /* CSEL */ + }else{ + /* CSET */ + if(p->from3.type != D_NONE) + diag("invalid combination\n%P", p); + r = rf = REGZERO; + cond ^= 1; + } + rt = p->to.reg; + o1 |= (r<<16) | (cond<<12) | (rf<<5) | rt; + break; + + case 19: /* CCMN cond, (Rm|uimm5),Rn, uimm4 -> ccmn Rn,Rm,uimm4,cond */ + nzcv = p->to.offset; + cond = p->from.reg; + if(p->from3.type == D_REG){ + o1 = oprrr(p->as); + rf = p->from3.reg; /* Rm */ + }else{ + o1 = opirr(p->as); + rf = p->from3.offset & 0x1F; + } + o1 |= (rf<<16) | (cond<<12) | (p->reg<<5) | nzcv; + break; + + case 20: /* movT R,O(R) -> strT */ + v = regoff(&p->to); + r = p->to.reg; + if(r == NREG) + r = o->param; + if(v < 0){ /* unscaled 9-bit signed */ + o1 = olsr9s(opstr9(p->as), v, r, p->from.reg); + }else{ + v = offsetshift(v, o->a3); + o1 = olsr12u(opstr12(p->as), v, r, p->from.reg); + } + break; + + case 21: /* movT O(R),R -> ldrT */ + v = regoff(&p->from); + r = p->from.reg; + if(r == NREG) + r = o->param; + if(v < 0){ /* unscaled 9-bit signed */ + o1 = olsr9s(opldr9(p->as), v, r, p->to.reg); + }else{ + v = offsetshift(v, o->a1); + //print("offset=%lld v=%ld a1=%d\n", instoffset, v, o->a1); + o1 = olsr12u(opldr12(p->as), v, r, p->to.reg); + } + break; + + case 22: /* movT (R)O!,R; movT O(R)!, R -> ldrT */ + v = p->from.offset; + if(v < -256 || v > 255) + diag("offset out of range\n%P", p); + o1 = opldrpp(p->as); + if(p->from.type == D_XPOST) + o1 |= 1<<10; + else + o1 |= 3<<10; + o1 |= ((v&0x1FF)<<12) | (p->from.reg<<5) | p->to.reg; + break; + + case 23: /* movT R,(R)O!; movT O(R)!, R -> strT */ + v = p->to.offset; + if(v < -256 || v > 255) + diag("offset out of range\n%P", p); + o1 = LD2STR(opldrpp(p->as)); + if(p->to.type == D_XPOST) + o1 |= 1<<10; + else + o1 |= 3<<10; + o1 |= ((v&0x1FF)<<12) | (p->to.reg<<5) | p->from.reg; + break; + + case 24: /* mov/mvn Rs,Rd -> add $0,Rs,Rd or orr Rs,ZR,Rd */ + rf = p->from.reg; + rt = p->to.reg; + s = rf == REGSP || rt == REGSP; + if(p->as == AMVN || p->as == AMVNW){ + if(s) + diag("illegal SP reference\n%P", p); + o1 = oprrr(p->as); + o1 |= (rf<<16) | (REGZERO<<5) | rt; + }else if(s){ + o1 = opirr(p->as); + o1 |= (rf<<5) | rt; + }else{ + o1 = oprrr(p->as); + o1 |= (rf<<16) | (REGZERO<<5) | rt; + } + break; + + case 25: /* negX Rs, Rd -> subX Rs<<0, ZR, Rd */ + o1 = oprrr(p->as); + rf = p->from.reg; + rt = p->to.reg; + o1 |= (rf<<16) | (REGZERO<<5) | rt; + break; + + case 26: /* negX Rm<<s, Rd -> subX Rm<<s, ZR, Rd */ + o1 = oprrr(p->as); + o1 |= p->from.offset; /* includes reg, op, etc */ + rt = p->to.reg; + o1 |= (REGZERO<<5) | rt; + break; + + case 27: /* op Rm<<n[,Rn],Rd (extended register) */ + o1 = opxrrr(p->as); + if(p->from.type == D_EXTREG) + o1 |= p->from.offset; /* includes reg, op, etc */ + else + o1 |= p->from.reg << 16; + rt = p->to.reg; + if(p->to.type == D_NONE) + rt = REGZERO; + r = p->reg; + if(r == NREG) + r = rt; + o1 |= (r<<5) | rt; + break; + + case 28: /* logop $lcon, [R], R (64 bit literal) */ + o1 = omovlit(AMOV, p, &p->from, REGTMP); + if(!o1) + break; + r = p->reg; + if(r == NREG) + r = p->to.reg; + o2 = oprrr(p->as); + o2 |= REGTMP << 16; /* shift is 0 */ + o2 |= r << 5; + o2 |= p->to.reg; + break; + + case 29: /* op Rn, Rd */ + o1 = oprrr(p->as); + o1 |= p->from.reg<<5 | p->to.reg; + break; + + case 30: /* movT R,L(R) -> strT */ + s = movesize(o->as); + if(s < 0) + diag("unexpected long move, op %A tab %A\n%P", p->as, o->as, p); + v = regoff(&p->to); + if(v < 0) + diag("negative large offset\n%P", p); + if((v & ((1<<s)-1)) != 0) + diag("misaligned offset\n%P", p); + hi = v - (v & (0xFFF<<s)); + if((hi & 0xFFF) != 0) + diag("internal: miscalculated offset %ld [%d]\n%P", v, s, p); + //fprint(2, "v=%ld (%#lux) s=%d hi=%ld (%#lux) v'=%ld (%#lux)\n", v, v, s, hi, hi, ((v-hi)>>s)&0xFFF, ((v-hi)>>s)&0xFFF); + r = p->to.reg; + if(r == NREG) + r = o->param; + o1 = oaddi(opirr(AADD), hi, r, REGTMP); + o2 = olsr12u(opstr12(p->as), ((v-hi)>>s)&0xFFF, REGTMP, p->from.reg); + break; + + case 31: /* movT L(R), R -> ldrT */ + s = movesize(o->as); + if(s < 0) + diag("unexpected long move, op %A tab %A\n%P", p->as, o->as, p); + v = regoff(&p->from); + if(v < 0) + diag("negative large offset\n%P", p); + if((v & ((1<<s)-1)) != 0) + diag("misaligned offset\n%P", p); + hi = v - (v & (0xFFF<<s)); + if((hi & 0xFFF) != 0) + diag("internal: miscalculated offset %ld [%d]\n%P", v, s, p); + //fprint(2, "v=%ld (%#lux) s=%d hi=%ld (%#lux) v'=%ld (%#lux)\n", v, v, s, hi, hi, ((v-hi)>>s)&0xFFF, ((v-hi)>>s)&0xFFF); + r = p->from.reg; + if(r == NREG) + r = o->param; + o1 = oaddi(opirr(AADD), hi, r, REGTMP); + o2 = olsr12u(opldr12(p->as), ((v-hi)>>s)&0xFFF, REGTMP, p->to.reg); + break; + + case 32: /* mov $con, R -> movz/movn */ + r = 32; + if(p->as == AMOV) + r = 64; + d = p->from.offset; + s = movcon(d); + if(s < 0 || s >= r){ + d = ~d; + s = movcon(d); + if(s < 0 || s >= r) + diag("impossible move wide: %#llux\n%P", p->from.offset, p); + if(p->as == AMOV) + o1 = opirr(AMOVN); + else + o1 = opirr(AMOVNW); + }else{ + if(p->as == AMOV) + o1 = opirr(AMOVZ); + else + o1 = opirr(AMOVZW); + } + rt = p->to.reg; + o1 |= (((d>>(s*16))& 0xFFFF) << 5) | ((s&3)<<21) | rt; + break; + + case 33: /* movk $uimm16 << pos */ + o1 = opirr(p->as); + d = p->from.offset; + if((d>>16) != 0) + diag("requires uimm16\n%P", p); + s = 0; + if(p->from3.type != D_NONE){ + if(p->from3.type != D_CONST) + diag("missing bit position\n%P", p); + s = p->from3.offset; + if((s&0xF) != 0 || (s /= 16) >= 4 || (o1&S64) == 0 && s >= 2) + diag("illegal bit position\n%P", p); + } + rt = p->to.reg; + o1 |= ((d & 0xFFFF) << 5) | ((s&3)<<21) | rt; + break; + + case 34: /* mov $lacon,R */ + o1 = omovlit(AMOV, p, &p->from, REGTMP); + if(!o1) + break; + + o2 = opxrrr(AADD); + o2 |= REGTMP << 16; + o2 |= LSL0_64; + r = p->from.reg; + if(r == NREG) + r = o->param; + o2 |= r << 5; + o2 |= p->to.reg; + break; + + case 35: /* mov SPR,R -> mrs */ + o1 = oprrr(AMRS); + v = p->from.offset; + if((o1 & (v & ~(3<<19))) != 0) + diag("MRS register value overlap\n%P", p); + o1 |= v; + o1 |= p->to.reg; + break; + + case 36: /* mov R,SPR */ + o1 = oprrr(AMSR); + v = p->to.offset; + if((o1 & (v & ~(3<<19))) != 0) + diag("MSR register value overlap\n%P", p); + o1 |= v; + o1 |= p->from.reg; + break; + + case 37: /* mov $con,PSTATEfield -> MSR [immediate] */ + if((p->from.offset&~(uvlong)0xF) != 0) + diag("illegal immediate for PSTATE field\n%P", p); + o1 = opirr(AMSR); + o1 |= (p->from.offset&0xF) << 8; /* Crm */ + v = 0; + for(i = 0; i < nelem(pstatefield); i++) + if(pstatefield[i].a == p->to.offset){ + v = pstatefield[i].b; + break; + } + if(v == 0) + diag("illegal PSTATE field for immediate move\n%P", p); + o1 |= v; + break; + + case 38: /* clrex [$imm] */ + o1 = opimm(p->as); + if(p->to.type == D_NONE) + o1 |= 0xF<<8; + else + o1 |= (p->to.offset & 0xF)<<8; + break; + + case 39: /* cbz R, rel */ + o1 = opirr(p->as); + o1 |= p->from.reg; + o1 |= brdist(p, 0, 19, 2) << 5; + break; + + case 40: /* tbz */ + o1 = opirr(p->as); + v = p->from.offset; + if(v < 0 || v > 63) + diag("illegal bit number\n%P", p); + o1 |= ((v&0x20)<<(31-5)) | ((v&0x1F)<<19); + o1 |= brdist(p, 0, 14, 2)<<5; + o1 |= p->reg; + break; + + case 41: /* eret, nop, others with no operands */ + o1 = op0(p->as); + break; + + case 42: /* bfm R,r,s,R */ + o1 = opbfm(p->as, p->from.offset, p->from3.offset, p->reg, p->to.reg); + break; + + case 43: /* bfm aliases */ + r = p->from.offset; + s = p->from3.offset; + rf = p->reg; + rt = p->to.reg; + if(rf == NREG) + rf = rt; + switch(p->as){ + case ABFI: o1 = opbfm(ABFM, 64-r, s-1, rf, rt); break; + case ABFIW: o1 = opbfm(ABFMW, 32-r, s-1, rf, rt); break; + case ABFXIL: o1 = opbfm(ABFM, r, r+s-1, rf, rt); break; + case ABFXILW: o1 = opbfm(ABFMW, r, r+s-1, rf, rt); break; + case ASBFIZ: o1 = opbfm(ASBFM, 64-r, s-1, rf, rt); break; + case ASBFIZW: o1 = opbfm(ASBFMW, 32-r, s-1, rf, rt); break; + case ASBFX: o1 = opbfm(ASBFM, r, r+s-1, rf, rt); break; + case ASBFXW: o1 = opbfm(ASBFMW, r, r+s-1, rf, rt); break; + case AUBFIZ: o1 = opbfm(AUBFM, 64-r, s-1, rf, rt); break; + case AUBFIZW: o1 = opbfm(AUBFMW, 32-r, s-1, rf, rt); break; + case AUBFX: o1 = opbfm(AUBFM, r, r+s-1, rf, rt); break; + case AUBFXW: o1 = opbfm(AUBFMW, r, r+s-1, rf, rt); break; + default: + diag("bad bfm alias\n%P", curp); + break; + } + break; + + case 44: /* extr $b, Rn, Rm, Rd */ + o1 = opextr(p->as, p->from.offset, p->from3.reg, p->reg, p->to.reg); + break; + + case 45: /* sxt/uxt[bhw] R,R; movT R,R -> sxtT R,R */ + rf = p->from.reg; + rt = p->to.reg; + as = p->as; + if(rf == REGZERO) + as = AMOVWU; /* clearer in disassembly */ + switch(as){ + case AMOVB: + case ASXTB: o1 = opbfm(ASBFM, 0, 7, rf, rt); break; + case AMOVH: + case ASXTH: o1 = opbfm(ASBFM, 0, 15, rf, rt); break; + case AMOVW: + case ASXTW: o1 = opbfm(ASBFM, 0, 31, rf, rt); break; + case AMOVBU: + case AUXTB: o1 = opbfm(AUBFM, 0, 7, rf, rt); break; + case AMOVHU: + case AUXTH: o1 = opbfm(AUBFM, 0, 15, rf, rt); break; + case AMOVWU: o1 = oprrr(as) | (rf<<16) | (REGZERO<<5) | rt; break; + case AUXTW: o1 = opbfm(AUBFM, 0, 31, rf, rt); break; + case ASXTBW: o1 = opbfm(ASBFMW, 0, 7, rf, rt); break; + case ASXTHW: o1 = opbfm(ASBFMW, 0, 15, rf, rt); break; + case AUXTBW: o1 = opbfm(AUBFMW, 0, 7, rf, rt); break; + case AUXTHW: o1 = opbfm(AUBFMW, 0, 15, rf, rt); break; + default: diag("bad sxt %A", as); break; + } + break; + + case 46: /* cls */ + o1 = opbit(p->as); + o1 |= p->from.reg<<5; + o1 |= p->to.reg; + break; + + case 47: /* movT R,V(R) -> strT (huge offset) */ + o1 = omovlit(AMOVW, p, &p->to, REGTMP); + if(!o1) + break; + r = p->to.reg; + if(r == NREG) + r = o->param; + o2 = olsxrr(p->as, REGTMP,r, p->from.reg); + break; + + case 48: /* movT V(R), R -> ldrT (huge offset) */ + o1 = omovlit(AMOVW, p, &p->from, REGTMP); + if(!o1) + break; + r = p->from.reg; + if(r == NREG) + r = o->param; + o2 = olsxrr(p->as, REGTMP,r, p->to.reg); + break; + + case 50: /* sys/sysl */ + o1 = opirr(p->as); + if((p->from.offset & ~SYSARG4(0x7, 0xF, 0xF, 0x7)) != 0) + diag("illegal SYS argument\n%P", p); + o1 |= p->from.offset; + if(p->to.type == D_REG) + o1 |= p->to.reg; + else if(p->reg != NREG) + o1 |= p->reg; + else + o1 |= 0x1F; + break; + + case 51: /* dmb */ + o1 = opirr(p->as); + if(p->from.type == D_CONST) + o1 |= (p->from.offset&0xF)<<8; + break; + + case 52: /* hint */ + o1 = opirr(p->as); + o1 |= (p->from.offset&0x7F)<<5; + break; + + case 53: /* and/or/eor/bic/... $bimmN, Rn, Rd -> op (N,r,s), Rn, Rd */ + as = p->as; + rt = p->to.reg; + r = p->reg; + if(r == NREG) + r = rt; + if(as == AMOV){ + as = AORR; + r = REGZERO; + }else if(as == AMOVW){ + as = AORRW; + r = REGZERO; + } + o1 = opirr(as); + s = o1 & S64? 64: 32; + mask = findmask(p->from.offset); + if(mask == nil) + mask = findmask(p->from.offset | (p->from.offset<<32)); + if(mask != nil){ + o1 |= ((mask->r&(s-1))<<16) | (((mask->s-1)&(s-1))<<10); + if(s == 64){ + if(mask->e == 64 && ((uvlong)p->from.offset>>32) != 0) + o1 |= 1<<22; + }else{ + u = (uvlong)p->from.offset >> 32; + if(u != 0 && u != 0xFFFFFFFF) + diag("mask needs 64 bits %#llux\n%P", p->from.offset, p); + } + }else + diag("invalid mask %#llux\n%P", p->from.offset, p); /* probably shouldn't happen */ + o1 |= (r<<5) | rt; + break; + + case 54: /* floating point arith */ + o1 = oprrr(p->as); + if(p->from.type == D_FCONST) { + rf = chipfloat(p->from.ieee); + if(rf < 0 || 1){ + diag("invalid floating-point immediate\n%P", p); + rf = 0; + } + rf |= (1<<3); + } else + rf = p->from.reg; + rt = p->to.reg; + r = p->reg; + if((o1 & (0x1F<<24)) == (0x1E<<24) && (o1 & (1<<11)) == 0){ /* monadic */ + r = rf; + rf = 0; + }else if(r == NREG) + r = rt; + o1 |= (rf << 16) | (r<<5) | rt; + break; + + case 56: /* floating point compare */ + o1 = oprrr(p->as); + if(p->from.type == D_FCONST) { + if(p->from.ieee->h != 0 || p->from.ieee->l != 0) + diag("invalid floating-point immediate\n%P", p); + o1 |= 8; /* zero */ + rf = 0; + }else + rf = p->from.reg; + rt = p->reg; + o1 |= rf<<16 | rt<<5; + break; + + case 57: /* floating point conditional compare */ + o1 = oprrr(p->as); + cond = p->from.reg; + nzcv = p->to.offset; + if(nzcv & ~0xF) + diag("implausible condition\n%P", p); + rf = p->reg; + if(p->from3.type != D_FREG) + diag("illegal FCCMP\n%P", p); + rt = p->from3.reg; + o1 |= rf<<16 | cond<<12 | rt<<5 | nzcv; + break; + + case 58: /* ldxr */ + o1 = opload(p->as); + o1 |= 0x1F<<16; + o1 |= p->from.reg<<5; + if(p->reg != NREG) + o1 |= p->reg<<10; + else + o1 |= 0x1F<<10; + o1 |= p->to.reg; + break; + + case 59: /* stxr */ + o1 = opstore(p->as); + o1 |= p->reg << 16; + if(p->from3.type != D_NONE) + o1 |= p->from3.reg<<10; + else + o1 |= 0x1F<<10; + o1 |= p->to.reg<<5; + o1 |= p->from.reg; + break; + + case 60: /* adrp label,r */ + d = brdist(p, 12, 21, 0); + o1 = ADR(1, d, p->to.reg); + break; + + case 61: /* adr label, r */ + d = brdist(p, 0, 21, 0); + o1 = ADR(0, d, p->to.reg); + break; + + case 62: /* case Rv, Rt -> adr tab, Rt; movw Rt[R<<2], Rl; add Rt, Rl; br (Rl) */ + o1 = ADR(0, 4*4, p->to.reg); /* adr 4(pc), Rt */ + o2 = (2<<30)|(7<<27)|(2<<22)|(1<<21)|(3<<13)|(1<<12)|(2<<10)|(p->from.reg<<16)|(p->to.reg<<5)|REGTMP; /* movw Rt[Rv<<2], REGTMP */ + o3 = oprrr(AADD) | (p->to.reg<<16) | (REGTMP<<5) | REGTMP; /* add Rt, REGTMP */ + o4 = (0x6b<<25)|(0x1F<<16)|(REGTMP<<5); /* br (REGTMP) */ + lastcase = p; + break; + + case 63: /* bcase */ + if(lastcase == nil){ + diag("missing CASE\n%P", p); + break; + } + if(p->cond != P) { + o1 = p->cond->pc - (lastcase->pc + 4*4); + if(dlm) + dynreloc(S, p->pc, 1); + } + break; + + /* reloc ops */ + case 64: /* movT R,addr */ + o1 = omovlit(AMOV, p, &p->to, REGTMP); + if(!o1) + break; + o2 = olsr12u(opstr12(p->as), 0, REGTMP, p->from.reg); + break; + + case 65: /* movT addr,R */ + o1 = omovlit(AMOV, p, &p->from, REGTMP); + if(!o1) + break; + o2 = olsr12u(opldr12(p->as), 0, REGTMP, p->to.reg); + break; + } + + if(debug['a'] > 1) + Bprint(&bso, "%2d ", o->type); + + v = p->pc; + switch(o->size) { + default: + if(debug['a']) + Bprint(&bso, " %.8lux:\t\t%P\n", v, p); + break; + case 4: + if(debug['a']) + Bprint(&bso, " %.8lux: %.8lux\t%P\n", v, o1, p); + lputl(o1); + break; + case 8: + if(debug['a']) + Bprint(&bso, " %.8lux: %.8lux %.8lux%P\n", v, o1, o2, p); + lputl(o1); + lputl(o2); + break; + case 12: + if(debug['a']) + Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux%P\n", v, o1, o2, o3, p); + lputl(o1); + lputl(o2); + lputl(o3); + break; + case 16: + if(debug['a']) + Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux %.8lux%P\n", + v, o1, o2, o3, o4, p); + lputl(o1); + lputl(o2); + lputl(o3); + lputl(o4); + break; + case 20: + if(debug['a']) + Bprint(&bso, " %.8lux: %.8lux %.8lux %.8lux %.8lux %.8lux%P\n", + v, o1, o2, o3, o4, o5, p); + lputl(o1); + lputl(o2); + lputl(o3); + lputl(o4); + lputl(o5); + break; + } +} + +/* + * basic Rm op Rn -> Rd (using shifted register with 0) + * also op Rn -> Rt + * also Rm*Rn op Ra -> Rd + */ +static long +oprrr(int a) +{ + switch(a) { + case AADC: return S64 | 0<<30 | 0<<29 | 0xd0<<21 | 0<<10; + case AADCW: return S32 | 0<<30 | 0<<29 | 0xd0<<21 | 0<<10; + case AADCS: return S64 | 0<<30 | 1<<29 | 0xd0<<21 | 0<<10; + case AADCSW: return S32 | 0<<30 | 1<<29 | 0xd0<<21 | 0<<10; + + case ANGC: + case ASBC: return S64 | 1<<30 | 0<<29 | 0xd0<<21 | 0<<10; + case ANGCS: + case ASBCS: return S64 | 1<<30 | 1<<29 | 0xd0<<21 | 0<<10; + case ANGCW: + case ASBCW: return S32 | 1<<30 | 0<<29 | 0xd0<<21 | 0<<10; + case ANGCSW: + case ASBCSW: return S32 | 1<<30 | 1<<29 | 0xd0<<21 | 0<<10; + + case AADD: return S64 | 0<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case AADDW: return S32 | 0<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case ACMN: + case AADDS: return S64 | 0<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case ACMNW: + case AADDSW: return S32 | 0<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + + case ASUB: return S64 | 1<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case ASUBW: return S32 | 1<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case ACMP: + case ASUBS: return S64 | 1<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + case ACMPW: + case ASUBSW: return S32 | 1<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 0<<21 | 0<<10; + + case AAND: return S64 | 0<<29 | 0xA<<24; + case AANDW: return S32 | 0<<29 | 0xA<<24; + case AMOV: + case AORR: return S64 | 1<<29 | 0xA<<24; +// case AMOVW: + case AMOVWU: + case AORRW: return S32 | 1<<29 | 0xA<<24; + case AEOR: return S64 | 2<<29 | 0xA<<24; + case AEORW: return S32 | 2<<29 | 0xA<<24; + case AANDS: return S64 | 3<<29 | 0xA<<24; + case AANDSW: return S32 | 3<<29 | 0xA<<24; + + case ABIC: return S64 | 0<<29 | 0xA<<24 | 1<<21; + case ABICW: return S32 | 0<<29 | 0xA<<24 | 1<<21; + case ABICS: return S64 | 3<<29 | 0xA<<24 | 1<<21; + case ABICSW: return S32 | 3<<29 | 0xA<<24 | 1<<21; + case AEON: return S64 | 2<<29 | 0xA<<24 | 1<<21; + case AEONW: return S32 | 2<<29 | 0xA<<24 | 1<<21; + case AMVN: + case AORN: return S64 | 1<<29 | 0xA<<24 | 1<<21; + case AMVNW: + case AORNW: return S32 | 1<<29 | 0xA<<24 | 1<<21; + + case AASR: return S64 | OPDP2(10); /* also ASRV */ + case AASRW: return S32 | OPDP2(10); + case ALSL: return S64 | OPDP2(8); + case ALSLW: return S32 | OPDP2(8); + case ALSR: return S64 | OPDP2(9); + case ALSRW: return S32 | OPDP2(9); + case AROR: return S64 | OPDP2(11); + case ARORW: return S32 | OPDP2(11); + + case ACCMN: return S64 | 0<<30 | 1<<29 | 0xD2<<21 | 0<<11 | 0<<10 | 0<<4; /* cond<<12 | nzcv<<0 */ + case ACCMNW: return S32 | 0<<30 | 1<<29 | 0xD2<<21 | 0<<11 | 0<<10 | 0<<4; + case ACCMP: return S64 | 1<<30 | 1<<29 | 0xD2<<21 | 0<<11 | 0<<10 | 0<<4; /* imm5<<16 | cond<<12 | nzcv<<0 */ + case ACCMPW: return S32 | 1<<30 | 1<<29 | 0xD2<<21 | 0<<11 | 0<<10 | 0<<4; + + case ACRC32B: return S32 | OPDP2(16); + case ACRC32H: return S32 | OPDP2(17); + case ACRC32W: return S32 | OPDP2(18); + case ACRC32X: return S64 | OPDP2(19); + case ACRC32CB: return S32 | OPDP2(20); + case ACRC32CH: return S32 | OPDP2(21); + case ACRC32CW: return S32 | OPDP2(22); + case ACRC32CX: return S64 | OPDP2(23); + + case ACSEL: return S64 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACSELW: return S32 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACSET: return S64 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + case ACSETW: return S32 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + case ACSETM: return S64 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACSETMW: return S32 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACINC: + case ACSINC: return S64 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + case ACINCW: + case ACSINCW: return S32 | 0<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + case ACINV: + case ACSINV: return S64 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACINVW: + case ACSINVW: return S32 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 0<<10; + case ACNEG: + case ACSNEG: return S64 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + case ACNEGW: + case ACSNEGW: return S32 | 1<<30 | 0<<29 | 0xD4<<21 | 0<<11 | 1<<10; + + case AMUL: + case AMADD: return S64 | 0<<29 | 0x1B<<24 | 0<<21 | 0<<15; + case AMULW: + case AMADDW: return S32 | 0<<29 | 0x1B<<24 | 0<<21 | 0<<15; + case AMNEG: + case AMSUB: return S64 | 0<<29 | 0x1B<<24 | 0<<21 | 1<<15; + case AMNEGW: + case AMSUBW: return S32 | 0<<29 | 0x1B<<24 | 0<<21 | 1<<15; + + case AMRS: return SYSOP(1,2,0,0,0,0,0); + case AMSR: return SYSOP(0,2,0,0,0,0,0); + + case ANEG: return S64 | 1<<30 | 0<<29 | 0xB<<24 | 0<<21; + case ANEGW: return S32 | 1<<30 | 0<<29 | 0xB<<24 | 0<<21; + case ANEGS: return S64 | 1<<30 | 1<<29 | 0xB<<24 | 0<<21; + case ANEGSW: return S32 | 1<<30 | 1<<29 | 0xB<<24 | 0<<21; + + case AREM: + case ASDIV: return S64 | OPDP2(3); + case AREMW: + case ASDIVW: return S32 | OPDP2(3); + + case ASMULL: + case ASMADDL: return OPDP3(1, 0, 1, 0); + case ASMNEGL: + case ASMSUBL: return OPDP3(1, 0, 1, 1); + case ASMULH: return OPDP3(1, 0, 2, 0); + case AUMULL: + case AUMADDL: return OPDP3(1, 0, 5, 0); + case AUMNEGL: + case AUMSUBL: return OPDP3(1, 0, 5, 1); + case AUMULH: return OPDP3(1, 0, 6, 0); + + case AUREM: + case AUDIV: return S64 | OPDP2(2); + case AUREMW: + case AUDIVW: return S32 | OPDP2(2); + + case AAESE: return 0x4E<<24 | 2<<20 | 8<<16 | 4<<12 | 2<<10; + case AAESD: return 0x4E<<24 | 2<<20 | 8<<16 | 5<<12 | 2<<10; + case AAESMC: return 0x4E<<24 | 2<<20 | 8<<16 | 6<<12 | 2<<10; + case AAESIMC: return 0x4E<<24 | 2<<20 | 8<<16 | 7<<12 | 2<<10; + + case ASHA1C: return 0x5E<<24 | 0<<12; + case ASHA1P: return 0x5E<<24 | 1<<12; + case ASHA1M: return 0x5E<<24 | 2<<12; + case ASHA1SU0: return 0x5E<<24 | 3<<12; + case ASHA256H: return 0x5E<<24 | 4<<12; + case ASHA256H2: return 0x5E<<24 | 5<<12; + case ASHA256SU1: return 0x5E<<24 | 6<<12; + + case ASHA1H: return 0x5E<<24 | 2<<20 | 8<<16 | 0<<12 | 2<<10; + case ASHA1SU1: return 0x5E<<24 | 2<<20 | 8<<16 | 1<<12 | 2<<10; + case ASHA256SU0: return 0x5E<<24 | 2<<20 | 8<<16 | 2<<12 | 2<<10; + + case AFCVTZSD: return FPCVTI(1, 0, 1, 3, 0); + case AFCVTZSDW: return FPCVTI(0, 0, 1, 3, 0); + case AFCVTZSS: return FPCVTI(1, 0, 0, 3, 0); + case AFCVTZSSW: return FPCVTI(0, 0, 0, 3, 0); + + case AFCVTZUD: return FPCVTI(1, 0, 1, 3, 1); + case AFCVTZUDW: return FPCVTI(0, 0, 1, 3, 1); + case AFCVTZUS: return FPCVTI(1, 0, 0, 3, 1); + case AFCVTZUSW: return FPCVTI(0, 0, 0, 3, 1); + + case ASCVTFD: return FPCVTI(1, 0, 1, 0, 2); + case ASCVTFS: return FPCVTI(1, 0, 0, 0, 2); + case ASCVTFWD: return FPCVTI(0, 0, 1, 0, 2); + case ASCVTFWS: return FPCVTI(0, 0, 0, 0, 2); + + case AUCVTFD: return FPCVTI(1, 0, 1, 0, 3); + case AUCVTFS: return FPCVTI(1, 0, 0, 0, 3); + case AUCVTFWD: return FPCVTI(0, 0, 1, 0, 3); + case AUCVTFWS: return FPCVTI(0, 0, 0, 0, 3); + + case AFADDS: return FPOP2S(0, 0, 0, 2); + case AFADDD: return FPOP2S(0, 0, 1, 2); + case AFSUBS: return FPOP2S(0, 0, 0, 3); + case AFSUBD: return FPOP2S(0, 0, 1, 3); + case AFMULS: return FPOP2S(0, 0, 0, 0); + case AFMULD: return FPOP2S(0, 0, 1, 0); + case AFDIVS: return FPOP2S(0, 0, 0, 1); + case AFDIVD: return FPOP2S(0, 0, 1, 1); + case AFMAXS: return FPOP2S(0, 0, 0, 4); + case AFMINS: return FPOP2S(0, 0, 0, 5); + case AFMAXD: return FPOP2S(0, 0, 1, 4); + case AFMIND: return FPOP2S(0, 0, 1, 5); + case AFMAXNMS: return FPOP2S(0, 0, 0, 6); + case AFMAXNMD: return FPOP2S(0, 0, 1, 6); + case AFMINNMS: return FPOP2S(0, 0, 0, 7); + case AFMINNMD: return FPOP2S(0, 0, 1, 7); + case AFNMULS: return FPOP2S(0, 0, 0, 8); + case AFNMULD: return FPOP2S(0, 0, 1, 8); + + case AFCMPS: return FPCMP(0, 0, 0, 0, 0); + case AFCMPD: return FPCMP(0, 0, 1, 0, 0); + case AFCMPES: return FPCMP(0, 0, 0, 0, 16); + case AFCMPED: return FPCMP(0, 0, 1, 0, 16); + + case AFCCMPS: return FPCCMP(0, 0, 0, 0); + case AFCCMPD: return FPCCMP(0, 0, 1, 0); + case AFCCMPES: return FPCCMP(0, 0, 0, 1); + case AFCCMPED: return FPCCMP(0, 0, 1, 1); + + case AFCSELS: return 0x1E<<24 | 0<<22 | 1<<21 | 3<<10; + case AFCSELD: return 0x1E<<24 | 1<<22 | 1<<21 | 3<<10; + + case AFMOVS: return FPOP1S(0, 0, 0, 0); + case AFABSS: return FPOP1S(0, 0, 0, 1); + case AFNEGS: return FPOP1S(0, 0, 0, 2); + case AFSQRTS: return FPOP1S(0, 0, 0, 3); + case AFCVTSD: return FPOP1S(0, 0, 0, 5); + case AFCVTSH: return FPOP1S(0, 0, 0, 7); + case AFRINTNS: return FPOP1S(0, 0, 0, 8); + case AFRINTPS: return FPOP1S(0, 0, 0, 9); + case AFRINTMS: return FPOP1S(0, 0, 0, 10); + case AFRINTZS: return FPOP1S(0, 0, 0, 11); + case AFRINTAS: return FPOP1S(0, 0, 0, 12); + case AFRINTXS: return FPOP1S(0, 0, 0, 14); + case AFRINTIS: return FPOP1S(0, 0, 0, 15); + + case AFMOVD: return FPOP1S(0, 0, 1, 0); + case AFABSD: return FPOP1S(0, 0, 1, 1); + case AFNEGD: return FPOP1S(0, 0, 1, 2); + case AFSQRTD: return FPOP1S(0, 0, 1, 3); + case AFCVTDS: return FPOP1S(0, 0, 1, 4); + case AFCVTDH: return FPOP1S(0, 0, 1, 7); + case AFRINTND: return FPOP1S(0, 0, 1, 8); + case AFRINTPD: return FPOP1S(0, 0, 1, 9); + case AFRINTMD: return FPOP1S(0, 0, 1, 10); + case AFRINTZD: return FPOP1S(0, 0, 1, 11); + case AFRINTAD: return FPOP1S(0, 0, 1, 12); + case AFRINTXD: return FPOP1S(0, 0, 1, 14); + case AFRINTID: return FPOP1S(0, 0, 1, 15); + case AFCVTHS: return FPOP1S(0, 0, 3, 4); + case AFCVTHD: return FPOP1S(0, 0, 3, 5); + + } + diag("bad rrr %d %A", a, a); + prasm(curp); + return 0; +} + +/* + * imm -> Rd + * imm op Rn -> Rd + */ +static long +opirr(int a) +{ + switch(a){ + + /* op $addcon, Rn, Rd */ + case AMOV: + case AADD: return S64 | 0<<30 | 0<<29 | 0x11<<24; + case ACMN: + case AADDS: return S64 | 0<<30 | 1<<29 | 0x11<<24; + case AMOVW: + case AADDW: return S32 | 0<<30 | 0<<29 | 0x11<<24; + case ACMNW: + case AADDSW: return S32 | 0<<30 | 1<<29 | 0x11<<24; + case ASUB: return S64 | 1<<30 | 0<<29 | 0x11<<24; + case ACMP: + case ASUBS: return S64 | 1<<30 | 1<<29 | 0x11<<24; + case ASUBW: return S32 | 1<<30 | 0<<29 | 0x11<<24; + case ACMPW: + case ASUBSW: return S32 | 1<<30 | 1<<29 | 0x11<<24; + + /* op $imm(SB), Rd; op label, Rd */ + case AADR: return 0<<31 | 0x10<<24; + case AADRP: return 1<<31 | 0x10<<24; + + /* op $bimm, Rn, Rd */ + case AAND: return S64 | 0<<29 | 0x24<<23; + case AANDW: return S32 | 0<<29 | 0x24<<23 | 0<<22; + case AORR: return S64 | 1<<29 | 0x24<<23; + case AORRW: return S32 | 1<<29 | 0x24<<23 | 0<<22; + case AEOR: return S64 | 2<<29 | 0x24<<23; + case AEORW: return S32 | 2<<29 | 0x24<<23 | 0<<22; + case AANDS: return S64 | 3<<29 | 0x24<<23; + case AANDSW: return S32 | 3<<29 | 0x24<<23 | 0<<22; + + case AASR: return S64 | 0<<29 | 0x26<<23; /* alias of SBFM */ + case AASRW: return S32 | 0<<29 | 0x26<<23 | 0<<22; + + /* op $width, $lsb, Rn, Rd */ + case ABFI: return S64 | 2<<29 | 0x26<<23 | 1<<22; /* alias of BFM */ + case ABFIW: return S32 | 2<<29 | 0x26<<23 | 0<<22; + + /* op $imms, $immr, Rn, Rd */ + case ABFM: return S64 | 1<<29 | 0x26<<23 | 1<<22; + case ABFMW: return S32 | 1<<29 | 0x26<<23 | 0<<22; + case ASBFM: return S64 | 0<<29 | 0x26<<23 | 1<<22; + case ASBFMW: return S32 | 0<<29 | 0x26<<23 | 0<<22; + case AUBFM: return S64 | 2<<29 | 0x26<<23 | 1<<22; + case AUBFMW: return S32 | 2<<29 | 0x26<<23 | 0<<22; + + case ABFXIL: return S64 | 1<<29 | 0x26<<23 | 1<<22; /* alias of BFM */ + case ABFXILW: return S32 | 1<<29 | 0x26<<23 | 0<<22; + + case AEXTR: return S64 | 0<<29 | 0x27<<23 | 1<<22 | 0<<21; + case AEXTRW: return S32 | 0<<29 | 0x27<<23 | 0<<22 | 0<<21; + + case ACBNZ: return S64 | 0x1A<<25 | 1<<24; + case ACBNZW: return S32 | 0x1A<<25 | 1<<24; + case ACBZ: return S64 | 0x1A<<25 | 0<<24; + case ACBZW: return S32 | 0x1A<<25 | 0<<24; + + case ACCMN: return S64 | 0<<30 | 1<<29 | 0xD2<<21 | 1<<11 | 0<<10 | 0<<4; /* imm5<<16 | cond<<12 | nzcv<<0 */ + case ACCMNW: return S32 | 0<<30 | 1<<29 | 0xD2<<21 | 1<<11 | 0<<10 | 0<<4; + case ACCMP: return S64 | 1<<30 | 1<<29 | 0xD2<<21 | 1<<11 | 0<<10 | 0<<4; /* imm5<<16 | cond<<12 | nzcv<<0 */ + case ACCMPW: return S32 | 1<<30 | 1<<29 | 0xD2<<21 | 1<<11 | 0<<10 | 0<<4; + + case AMOVK: return S64 | 3<<29 | 0x25<<23; + case AMOVKW: return S32 | 3<<29 | 0x25<<23; + + case AMOVN: return S64 | 0<<29 | 0x25<<23; + case AMOVNW: return S32 | 0<<29 | 0x25<<23; + case AMOVZ: return S64 | 2<<29 | 0x25<<23; + case AMOVZW: return S32 | 2<<29 | 0x25<<23; + + case AMSR: return SYSOP(0,0,0,4,0,0,0x1F); /* MSR (immediate) */ + + case AAT: + case ADC: + case AIC: + case ATLBI: + case ASYS: return SYSOP(0,1,0,0,0,0,0); + case ASYSL: return SYSOP(1,1,0,0,0,0,0); + + case ATBZ: return 0x36<<24; + case ATBNZ: return 0x37<<24; + + case ADSB: return SYSOP(0,0,3,3,0,4,0x1F); + case ADMB: return SYSOP(0,0,3,3,0,5,0x1F); + case AISB: return SYSOP(0,0,3,3,0,6,0x1F); + case AHINT: return SYSOP(0,0,3,2,0,0,0x1F); + + } + diag("bad irr %A", a); + prasm(curp); + return 0; +} + +/* + * bit operations + */ +#define OPBIT(x) (1<<30 | 0<<29 | 0xD6<<21 | 0<<16 | (x)<<10) + +static long +opbit(int a) +{ + switch(a){ + case ACLS: return S64 | OPBIT(5); + case ACLSW: return S32 | OPBIT(5); + case ACLZ: return S64 | OPBIT(4); + case ACLZW: return S32 | OPBIT(4); + case ARBIT: return S64 | OPBIT(0); + case ARBITW: return S32 | OPBIT(0); + case AREV: return S64 | OPBIT(3); + case AREVW: return S32 | OPBIT(2); + case AREV16: return S64 | OPBIT(1); + case AREV16W: return S32 | OPBIT(1); + case AREV32: return S64 | OPBIT(2); + default: + diag("bad bit op\n%P", curp); + return 0; + } +} + +/* + * add/subtract extended register + */ +static long +opxrrr(int a) +{ + switch(a) { + case AADD: return S64 | 0<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_64; + case AADDW: return S32 | 0<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_32; + case ACMN: + case AADDS: return S64 | 0<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_64; + case ACMNW: + case AADDSW: return S32 | 0<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_32; + + case ASUB: return S64 | 1<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_64; + case ASUBW: return S32 | 1<<30 | 0<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_32; + case ACMP: + case ASUBS: return S64 | 1<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_64; + case ACMPW: + case ASUBSW: return S32 | 1<<30 | 1<<29 | 0x0b<<24 | 0<<22 | 1<<21 | LSL0_32; + + } + diag("bad opxrrr %A\n%P", a, curp); + return 0; +} + +static long +opimm(int a) +{ + switch(a){ + case ASVC: return 0xD4<<24 | 0<<21 | 1; /* imm16<<5 */ + case AHVC: return 0xD4<<24 | 0<<21 | 2; + case ASMC: return 0xD4<<24 | 0<<21 | 3; + case ABRK: return 0xD4<<24 | 1<<21 | 0; + case AHLT: return 0xD4<<24 | 2<<21 | 0; + case ADCPS1: return 0xD4<<24 | 5<<21 | 1; + case ADCPS2: return 0xD4<<24 | 5<<21 | 2; + case ADCPS3: return 0xD4<<24 | 5<<21 | 3; + + case ACLREX: return SYSOP(0,0,3,3,0,2,0x1F); + } + diag("bad imm %A", a); + prasm(curp); + return 0; +} + +static vlong +brdist(Prog *p, int preshift, int flen, int shift) +{ + vlong v, t; + Sym *s; + + v = 0; + if(p->cond == UP) { + s = p->to.sym; + if(s->type != SUNDEF) + diag("bad branch sym type"); + v = (uvlong)s->value >> (Roffset-2); + dynreloc(s, p->pc, 0); /* TO DO */ + } + else if(p->cond != P) + v = (p->cond->pc>>preshift) - (pc>>preshift); + if((v & ((1<<shift)-1)) != 0) + diag("misaligned label\n%P", p); + v >>= shift; + t = (vlong)1 << (flen-1); + if(v < -t || v >= t) + diag("branch too far\n%P", p); + return v & ((t<<1)-1); +} + +/* + * pc-relative branches + */ +static long +opbra(int a) +{ + switch(a) { + case ABEQ: return OPBcc(0x0); + case ABNE: return OPBcc(0x1); + case ABCS: return OPBcc(0x2); + case ABHS: return OPBcc(0x2); + case ABCC: return OPBcc(0x3); + case ABLO: return OPBcc(0x3); + case ABMI: return OPBcc(0x4); + case ABPL: return OPBcc(0x5); + case ABVS: return OPBcc(0x6); + case ABVC: return OPBcc(0x7); + case ABHI: return OPBcc(0x8); + case ABLS: return OPBcc(0x9); + case ABGE: return OPBcc(0xa); + case ABLT: return OPBcc(0xb); + case ABGT: return OPBcc(0xc); + case ABLE: return OPBcc(0xd); /* imm19<<5 | cond */ + case AB: return 0<<31 | 5<<26; /* imm26 */ + case ABL: return 1<<31 | 5<<26; + } + diag("bad bra %A", a); + prasm(curp); + return 0; +} + +static long +opbrr(int a) +{ + switch(a){ + case ABL: return OPBLR(1); /* BLR */ + case AB: return OPBLR(0); /* BR */ + case ARET: return OPBLR(2); /* RET */ + } + diag("bad brr %A", a); + prasm(curp); + return 0; +} + +static long +op0(int a) +{ + switch(a){ + case ADRPS: return 0x6B<<25 | 5<<21 | 0x1F<<16 | 0x1F<<5; + case AERET: return 0x6B<<25 | 4<<21 | 0x1F<<16 | 0<<10 | 0x1F<<5; + case ANOP: return SYSHINT(0); + case AYIELD: return SYSHINT(1); + case AWFE: return SYSHINT(2); + case AWFI: return SYSHINT(3); + case ASEV: return SYSHINT(4); + case ASEVL: return SYSHINT(5); + } + diag("bad op0 %A", a); + prasm(curp); + return 0; +} + +/* + * register offset + */ +static long +opload(int a) +{ + switch(a){ + case ALDAR: return LDSTX(3,1,1,0,1) | 0x1F<<10; + case ALDARW: return LDSTX(2,1,1,0,1) | 0x1F<<10; + case ALDARB: return LDSTX(0,1,1,0,1) | 0x1F<<10; + case ALDARH: return LDSTX(1,1,1,0,1) | 0x1F<<10; + case ALDAXP: return LDSTX(3,0,1,1,1); + case ALDAXPW: return LDSTX(2,0,1,1,1); + case ALDAXR: return LDSTX(3,0,1,0,1) | 0x1F<<10; + case ALDAXRW: return LDSTX(2,1,1,0,1) | 0x1F<<10; + case ALDAXRB: return LDSTX(0,0,1,0,1) | 0x1F<<10; + case ALDAXRH: return LDSTX(1,0,1,0,1) | 0x1F<<10; + case ALDXR: return LDSTX(3,0,1,0,0) | 0x1F<<10; + case ALDXRB: return LDSTX(0,0,1,0,0) | 0x1F<<10; + case ALDXRH: return LDSTX(1,0,1,0,0) | 0x1F<<10; + case ALDXRW: return LDSTX(2,0,1,0,0) | 0x1F<<10; + case ALDXP: return LDSTX(3,0,1,1,0); + case ALDXPW: return LDSTX(2,0,1,1,0); + case AMOVNP: return S64 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22; + case AMOVNPW: return S32 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22; + } + diag("bad opload %A\n%P", a, curp); + return 0; +} + +static long +opstore(int a) +{ + switch(a){ + case ASTLR: return LDSTX(3,1,0,0,1) | 0x1F<<10; + case ASTLRB: return LDSTX(0,1,0,0,1) | 0x1F<<10; + case ASTLRH: return LDSTX(1,1,0,0,1) | 0x1F<<10; + case ASTLP: return LDSTX(3,0,0,1,1); + case ASTLPW: return LDSTX(2,0,0,1,1); + case ASTLRW: return LDSTX(2,1,0,0,1) | 0x1F<<10; + case ASTLXP: return LDSTX(2,0,0,1,1); + case ASTLXPW: return LDSTX(3,0,0,1,1); + case ASTLXR: return LDSTX(3,0,0,0,1) | 0x1F<<10; + case ASTLXRB: return LDSTX(0,0,0,0,1) | 0x1F<<10; + case ASTLXRH: return LDSTX(1,0,0,0,1) | 0x1F<<10; + case ASTLXRW: return LDSTX(2,0,0,0,1) | 0x1F<<10; + case ASTXR: return LDSTX(3,0,0,0,0) | 0x1F<<10; + case ASTXRB: return LDSTX(0,0,0,0,0) | 0x1F<<10; + case ASTXRH: return LDSTX(1,0,0,0,0) | 0x1F<<10; + case ASTXP: return LDSTX(3,0,0,1,0); + case ASTXPW: return LDSTX(2,0,0,1,0); + case ASTXRW: return LDSTX(2,0,0,0,0) | 0x1F<<10; + case AMOVNP: return S64 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22; + case AMOVNPW: return S32 | 0<<30 | 5<<27 | 0<<26 | 0<<23 | 1<<22; + } + diag("bad opstore %A\n%P", a, curp); + return 0; +} + +/* + * load/store register (unsigned immediate) C3.3.13 + * these produce 64-bit values (when there's an option) + */ + +static long +olsr12u(long o, long v, int b, int r) +{ + if(v < 0 || v >= (1<<12)) + diag("offset out of range: %ld\n%P", v, curp); + o |= (v&0xFFF)<<10; + o |= b << 5; + o |= r; + return o; +} + +static long +opldr12(int a) +{ + switch(a){ + case AMOV: return LDSTR12U(3, 0, 1); /* imm12<<10 | Rn<<5 | Rt */ + case AMOVW: return LDSTR12U(2, 0, 2); + case AMOVWU: return LDSTR12U(2, 0, 1); + case AMOVH: return LDSTR12U(1, 0, 2); + case AMOVHU: return LDSTR12U(1, 0, 1); + case AMOVB: return LDSTR12U(0, 0, 2); + case AMOVBU: return LDSTR12U(0, 0, 1); + case AFMOVS: return LDSTR12U(2, 1, 1); + case AFMOVD: return LDSTR12U(3, 1, 1); + } + diag("bad opldr12 %A\n%P", a, curp); + return 0; +} + +static long +opstr12(int a) +{ + return LD2STR(opldr12(a)); +} + +/* + * load/store register (unscaled immediate) C3.3.12 + */ + +static long +olsr9s(long o, long v, int b, int r) +{ + if(v < -256 || v > 255) + diag("offset out of range: %ld\n%P", v, curp); + o |= (v&0x1FF)<<12; + o |= b << 5; + o |= r; + return o; +} + +static long +opldr9(int a) +{ + switch(a){ + case AMOV: return LDSTR9S(3, 0, 1); /* simm9<<12 | Rn<<5 | Rt */ + case AMOVW: return LDSTR9S(2, 0, 2); + case AMOVWU: return LDSTR9S(2, 0, 1); + case AMOVH: return LDSTR9S(1, 0, 2); + case AMOVHU: return LDSTR9S(1, 0, 1); + case AMOVB: return LDSTR9S(0, 0, 2); + case AMOVBU: return LDSTR9S(0, 0, 1); + case AFMOVS: return LDSTR9S(2, 1, 1); + case AFMOVD: return LDSTR9S(3, 1, 1); + } + diag("bad opldr9 %A\n%P", a, curp); + return 0; +} + +static long +opstr9(int a) +{ + return LD2STR(opldr9(a)); +} + +static long +opldrpp(int a) +{ + switch(a){ + case AMOV: return 3<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22; /* simm9<<12 | Rn<<5 | Rt */ + case AMOVW: return 2<<30 | 7<<27 | 0<<26 | 0<<24 | 2<<22; + case AMOVWU: return 2<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22; + case AMOVH: return 1<<30 | 7<<27 | 0<<26 | 0<<24 | 2<<22; + case AMOVHU: return 1<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22; + case AMOVB: return 0<<30 | 7<<27 | 0<<26 | 0<<24 | 2<<22; + case AMOVBU: return 0<<30 | 7<<27 | 0<<26 | 0<<24 | 1<<22; + } + diag("bad opldr %A\n%P", a, curp); + return 0; +} + +/* + * load/store register (extended register) + */ +static long +olsxrr(int a, int b, int c, int d) +{ + diag("need load/store extended register\n%P", curp); + return -1; +} + +static long +oaddi(long o1, long v, int r, int rt) +{ + if((v & 0xFFF000) != 0){ + v >>= 12; + o1 |= 1<<22; + } + o1 |= ((v & 0xFFF) << 10) | (r<<5) | rt; + return o1; +} + +/* + * load a a literal value into dr + */ +static long +omovlit(int as, Prog *p, Adr *a, int dr) +{ + long v, o1; + int w, fp; + + if(p->cond == nil){ /* not in literal pool */ + aclass(a); +fprint(2, "omovlit add %lld (%#llux)\n", instoffset, instoffset); + /* TO DO: could be clever, and use general constant builder */ + o1 = opirr(AADD); + v = instoffset; + if(v != 0 && (v & 0xFFF) == 0){ + v >>= 12; + o1 |= 1<<22; /* shift, by 12 */ + } + o1 |= ((v& 0xFFF) << 10) | (REGZERO<<5) | dr; + }else{ + fp = 0; + w = 0; /* default: 32 bit, unsigned */ + switch(as){ + case AFMOVS: + fp = 1; + break; + case AFMOVD: + fp = 1; + w = 1; /* 64 bit simd&fp */ + break; + case AMOV: + if(p->cond->as == ADWORD) + w = 1; /* 64 bit */ + else if(p->cond->to.offset < 0) + w = 2; /* sign extend */ + break; + case AMOVB: + case AMOVH: + case AMOVW: + w = 2; /* 32 bit, sign-extended to 64 */ + break; + } + v = brdist(p, 0, 19, 2); + o1 = (w<<30)|(fp<<26)|(3<<27); + o1 |= (v&0x7FFFF)<<5; + o1 |= dr; + } + return o1; +} + +static long +opbfm(int a, int r, int s, int rf, int rt) +{ + long o, c; + + o = opirr(a); + if((o & (1<<31)) == 0) + c = 32; + else + c = 64; + if(r < 0 || r >= c) + diag("illegal bit number\n%P", curp); + o |= (r&0x3F)<<16; + if(s < 0 || s >= c) + diag("illegal bit number\n%P", curp); + o |= (s&0x3F)<<10; + o |= (rf<<5) | rt; + return o; +} + +static long +opextr(int a, long v, int rn, int rm, int rt) +{ + long o, c; + + o = opirr(a); + c = (o & (1<<31)) != 0? 63: 31; + if(v < 0 || v > c) + diag("illegal bit number\n%P", curp); + o |= v<<10; + o |= rn << 5; + o |= rm << 16; + o |= rt; + return o; +} + +/* + * size in log2(bytes) + */ +static int +movesize(int a) +{ + switch(a){ + case AMOV: + return 3; + case AMOVW: + case AMOVWU: + return 2; + case AMOVH: + case AMOVHU: + return 1; + case AMOVB: + case AMOVBU: + return 0; + case AFMOVS: + return 2; + case AFMOVD: + return 3; + default: + return -1; + } +} + +/* + * SIMD + */ diff --git a/sys/src/cmd/7l/bits.c b/sys/src/cmd/7l/bits.c new file mode 100644 index 000000000..753e6b3dd --- /dev/null +++ b/sys/src/cmd/7l/bits.c @@ -0,0 +1,5359 @@ +#include "l.h" + +static Mask bitmasks[] = { + 1, 64, 0, 0x00000000000001LL, + 1, 64, 63, 0x00000000000002LL, + 2, 64, 0, 0x00000000000003LL, + 1, 64, 62, 0x00000000000004LL, + 2, 64, 63, 0x00000000000006LL, + 3, 64, 0, 0x00000000000007LL, + 1, 64, 61, 0x00000000000008LL, + 2, 64, 62, 0x0000000000000cLL, + 3, 64, 63, 0x0000000000000eLL, + 4, 64, 0, 0x0000000000000fLL, + 1, 64, 60, 0x00000000000010LL, + 2, 64, 61, 0x00000000000018LL, + 3, 64, 62, 0x0000000000001cLL, + 4, 64, 63, 0x0000000000001eLL, + 5, 64, 0, 0x0000000000001fLL, + 1, 64, 59, 0x00000000000020LL, + 2, 64, 60, 0x00000000000030LL, + 3, 64, 61, 0x00000000000038LL, + 4, 64, 62, 0x0000000000003cLL, + 5, 64, 63, 0x0000000000003eLL, + 6, 64, 0, 0x0000000000003fLL, + 1, 64, 58, 0x00000000000040LL, + 2, 64, 59, 0x00000000000060LL, + 3, 64, 60, 0x00000000000070LL, + 4, 64, 61, 0x00000000000078LL, + 5, 64, 62, 0x0000000000007cLL, + 6, 64, 63, 0x0000000000007eLL, + 7, 64, 0, 0x0000000000007fLL, + 1, 64, 57, 0x00000000000080LL, + 2, 64, 58, 0x000000000000c0LL, + 3, 64, 59, 0x000000000000e0LL, + 4, 64, 60, 0x000000000000f0LL, + 5, 64, 61, 0x000000000000f8LL, + 6, 64, 62, 0x000000000000fcLL, + 7, 64, 63, 0x000000000000feLL, + 8, 64, 0, 0x000000000000ffLL, + 1, 64, 56, 0x00000000000100LL, + 2, 64, 57, 0x00000000000180LL, + 3, 64, 58, 0x000000000001c0LL, + 4, 64, 59, 0x000000000001e0LL, + 5, 64, 60, 0x000000000001f0LL, + 6, 64, 61, 0x000000000001f8LL, + 7, 64, 62, 0x000000000001fcLL, + 8, 64, 63, 0x000000000001feLL, + 9, 64, 0, 0x000000000001ffLL, + 1, 64, 55, 0x00000000000200LL, + 2, 64, 56, 0x00000000000300LL, + 3, 64, 57, 0x00000000000380LL, + 4, 64, 58, 0x000000000003c0LL, + 5, 64, 59, 0x000000000003e0LL, + 6, 64, 60, 0x000000000003f0LL, + 7, 64, 61, 0x000000000003f8LL, + 8, 64, 62, 0x000000000003fcLL, + 9, 64, 63, 0x000000000003feLL, + 10, 64, 0, 0x000000000003ffLL, + 1, 64, 54, 0x00000000000400LL, + 2, 64, 55, 0x00000000000600LL, + 3, 64, 56, 0x00000000000700LL, + 4, 64, 57, 0x00000000000780LL, + 5, 64, 58, 0x000000000007c0LL, + 6, 64, 59, 0x000000000007e0LL, + 7, 64, 60, 0x000000000007f0LL, + 8, 64, 61, 0x000000000007f8LL, + 9, 64, 62, 0x000000000007fcLL, + 10, 64, 63, 0x000000000007feLL, + 11, 64, 0, 0x000000000007ffLL, + 1, 64, 53, 0x00000000000800LL, + 2, 64, 54, 0x00000000000c00LL, + 3, 64, 55, 0x00000000000e00LL, + 4, 64, 56, 0x00000000000f00LL, + 5, 64, 57, 0x00000000000f80LL, + 6, 64, 58, 0x00000000000fc0LL, + 7, 64, 59, 0x00000000000fe0LL, + 8, 64, 60, 0x00000000000ff0LL, + 9, 64, 61, 0x00000000000ff8LL, + 10, 64, 62, 0x00000000000ffcLL, + 11, 64, 63, 0x00000000000ffeLL, + 12, 64, 0, 0x00000000000fffLL, + 1, 64, 52, 0x00000000001000LL, + 2, 64, 53, 0x00000000001800LL, + 3, 64, 54, 0x00000000001c00LL, + 4, 64, 55, 0x00000000001e00LL, + 5, 64, 56, 0x00000000001f00LL, + 6, 64, 57, 0x00000000001f80LL, + 7, 64, 58, 0x00000000001fc0LL, + 8, 64, 59, 0x00000000001fe0LL, + 9, 64, 60, 0x00000000001ff0LL, + 10, 64, 61, 0x00000000001ff8LL, + 11, 64, 62, 0x00000000001ffcLL, + 12, 64, 63, 0x00000000001ffeLL, + 13, 64, 0, 0x00000000001fffLL, + 1, 64, 51, 0x00000000002000LL, + 2, 64, 52, 0x00000000003000LL, + 3, 64, 53, 0x00000000003800LL, + 4, 64, 54, 0x00000000003c00LL, + 5, 64, 55, 0x00000000003e00LL, + 6, 64, 56, 0x00000000003f00LL, + 7, 64, 57, 0x00000000003f80LL, + 8, 64, 58, 0x00000000003fc0LL, + 9, 64, 59, 0x00000000003fe0LL, + 10, 64, 60, 0x00000000003ff0LL, + 11, 64, 61, 0x00000000003ff8LL, + 12, 64, 62, 0x00000000003ffcLL, + 13, 64, 63, 0x00000000003ffeLL, + 14, 64, 0, 0x00000000003fffLL, + 1, 64, 50, 0x00000000004000LL, + 2, 64, 51, 0x00000000006000LL, + 3, 64, 52, 0x00000000007000LL, + 4, 64, 53, 0x00000000007800LL, + 5, 64, 54, 0x00000000007c00LL, + 6, 64, 55, 0x00000000007e00LL, + 7, 64, 56, 0x00000000007f00LL, + 8, 64, 57, 0x00000000007f80LL, + 9, 64, 58, 0x00000000007fc0LL, + 10, 64, 59, 0x00000000007fe0LL, + 11, 64, 60, 0x00000000007ff0LL, + 12, 64, 61, 0x00000000007ff8LL, + 13, 64, 62, 0x00000000007ffcLL, + 14, 64, 63, 0x00000000007ffeLL, + 15, 64, 0, 0x00000000007fffLL, + 1, 64, 49, 0x00000000008000LL, + 2, 64, 50, 0x0000000000c000LL, + 3, 64, 51, 0x0000000000e000LL, + 4, 64, 52, 0x0000000000f000LL, + 5, 64, 53, 0x0000000000f800LL, + 6, 64, 54, 0x0000000000fc00LL, + 7, 64, 55, 0x0000000000fe00LL, + 8, 64, 56, 0x0000000000ff00LL, + 9, 64, 57, 0x0000000000ff80LL, + 10, 64, 58, 0x0000000000ffc0LL, + 11, 64, 59, 0x0000000000ffe0LL, + 12, 64, 60, 0x0000000000fff0LL, + 13, 64, 61, 0x0000000000fff8LL, + 14, 64, 62, 0x0000000000fffcLL, + 15, 64, 63, 0x0000000000fffeLL, + 16, 64, 0, 0x0000000000ffffLL, + 1, 64, 48, 0x00000000010000LL, + 2, 64, 49, 0x00000000018000LL, + 3, 64, 50, 0x0000000001c000LL, + 4, 64, 51, 0x0000000001e000LL, + 5, 64, 52, 0x0000000001f000LL, + 6, 64, 53, 0x0000000001f800LL, + 7, 64, 54, 0x0000000001fc00LL, + 8, 64, 55, 0x0000000001fe00LL, + 9, 64, 56, 0x0000000001ff00LL, + 10, 64, 57, 0x0000000001ff80LL, + 11, 64, 58, 0x0000000001ffc0LL, + 12, 64, 59, 0x0000000001ffe0LL, + 13, 64, 60, 0x0000000001fff0LL, + 14, 64, 61, 0x0000000001fff8LL, + 15, 64, 62, 0x0000000001fffcLL, + 16, 64, 63, 0x0000000001fffeLL, + 17, 64, 0, 0x0000000001ffffLL, + 1, 64, 47, 0x00000000020000LL, + 2, 64, 48, 0x00000000030000LL, + 3, 64, 49, 0x00000000038000LL, + 4, 64, 50, 0x0000000003c000LL, + 5, 64, 51, 0x0000000003e000LL, + 6, 64, 52, 0x0000000003f000LL, + 7, 64, 53, 0x0000000003f800LL, + 8, 64, 54, 0x0000000003fc00LL, + 9, 64, 55, 0x0000000003fe00LL, + 10, 64, 56, 0x0000000003ff00LL, + 11, 64, 57, 0x0000000003ff80LL, + 12, 64, 58, 0x0000000003ffc0LL, + 13, 64, 59, 0x0000000003ffe0LL, + 14, 64, 60, 0x0000000003fff0LL, + 15, 64, 61, 0x0000000003fff8LL, + 16, 64, 62, 0x0000000003fffcLL, + 17, 64, 63, 0x0000000003fffeLL, + 18, 64, 0, 0x0000000003ffffLL, + 1, 64, 46, 0x00000000040000LL, + 2, 64, 47, 0x00000000060000LL, + 3, 64, 48, 0x00000000070000LL, + 4, 64, 49, 0x00000000078000LL, + 5, 64, 50, 0x0000000007c000LL, + 6, 64, 51, 0x0000000007e000LL, + 7, 64, 52, 0x0000000007f000LL, + 8, 64, 53, 0x0000000007f800LL, + 9, 64, 54, 0x0000000007fc00LL, + 10, 64, 55, 0x0000000007fe00LL, + 11, 64, 56, 0x0000000007ff00LL, + 12, 64, 57, 0x0000000007ff80LL, + 13, 64, 58, 0x0000000007ffc0LL, + 14, 64, 59, 0x0000000007ffe0LL, + 15, 64, 60, 0x0000000007fff0LL, + 16, 64, 61, 0x0000000007fff8LL, + 17, 64, 62, 0x0000000007fffcLL, + 18, 64, 63, 0x0000000007fffeLL, + 19, 64, 0, 0x0000000007ffffLL, + 1, 64, 45, 0x00000000080000LL, + 2, 64, 46, 0x000000000c0000LL, + 3, 64, 47, 0x000000000e0000LL, + 4, 64, 48, 0x000000000f0000LL, + 5, 64, 49, 0x000000000f8000LL, + 6, 64, 50, 0x000000000fc000LL, + 7, 64, 51, 0x000000000fe000LL, + 8, 64, 52, 0x000000000ff000LL, + 9, 64, 53, 0x000000000ff800LL, + 10, 64, 54, 0x000000000ffc00LL, + 11, 64, 55, 0x000000000ffe00LL, + 12, 64, 56, 0x000000000fff00LL, + 13, 64, 57, 0x000000000fff80LL, + 14, 64, 58, 0x000000000fffc0LL, + 15, 64, 59, 0x000000000fffe0LL, + 16, 64, 60, 0x000000000ffff0LL, + 17, 64, 61, 0x000000000ffff8LL, + 18, 64, 62, 0x000000000ffffcLL, + 19, 64, 63, 0x000000000ffffeLL, + 20, 64, 0, 0x000000000fffffLL, + 1, 64, 44, 0x00000000100000LL, + 2, 64, 45, 0x00000000180000LL, + 3, 64, 46, 0x000000001c0000LL, + 4, 64, 47, 0x000000001e0000LL, + 5, 64, 48, 0x000000001f0000LL, + 6, 64, 49, 0x000000001f8000LL, + 7, 64, 50, 0x000000001fc000LL, + 8, 64, 51, 0x000000001fe000LL, + 9, 64, 52, 0x000000001ff000LL, + 10, 64, 53, 0x000000001ff800LL, + 11, 64, 54, 0x000000001ffc00LL, + 12, 64, 55, 0x000000001ffe00LL, + 13, 64, 56, 0x000000001fff00LL, + 14, 64, 57, 0x000000001fff80LL, + 15, 64, 58, 0x000000001fffc0LL, + 16, 64, 59, 0x000000001fffe0LL, + 17, 64, 60, 0x000000001ffff0LL, + 18, 64, 61, 0x000000001ffff8LL, + 19, 64, 62, 0x000000001ffffcLL, + 20, 64, 63, 0x000000001ffffeLL, + 21, 64, 0, 0x000000001fffffLL, + 1, 64, 43, 0x00000000200000LL, + 2, 64, 44, 0x00000000300000LL, + 3, 64, 45, 0x00000000380000LL, + 4, 64, 46, 0x000000003c0000LL, + 5, 64, 47, 0x000000003e0000LL, + 6, 64, 48, 0x000000003f0000LL, + 7, 64, 49, 0x000000003f8000LL, + 8, 64, 50, 0x000000003fc000LL, + 9, 64, 51, 0x000000003fe000LL, + 10, 64, 52, 0x000000003ff000LL, + 11, 64, 53, 0x000000003ff800LL, + 12, 64, 54, 0x000000003ffc00LL, + 13, 64, 55, 0x000000003ffe00LL, + 14, 64, 56, 0x000000003fff00LL, + 15, 64, 57, 0x000000003fff80LL, + 16, 64, 58, 0x000000003fffc0LL, + 17, 64, 59, 0x000000003fffe0LL, + 18, 64, 60, 0x000000003ffff0LL, + 19, 64, 61, 0x000000003ffff8LL, + 20, 64, 62, 0x000000003ffffcLL, + 21, 64, 63, 0x000000003ffffeLL, + 22, 64, 0, 0x000000003fffffLL, + 1, 64, 42, 0x00000000400000LL, + 2, 64, 43, 0x00000000600000LL, + 3, 64, 44, 0x00000000700000LL, + 4, 64, 45, 0x00000000780000LL, + 5, 64, 46, 0x000000007c0000LL, + 6, 64, 47, 0x000000007e0000LL, + 7, 64, 48, 0x000000007f0000LL, + 8, 64, 49, 0x000000007f8000LL, + 9, 64, 50, 0x000000007fc000LL, + 10, 64, 51, 0x000000007fe000LL, + 11, 64, 52, 0x000000007ff000LL, + 12, 64, 53, 0x000000007ff800LL, + 13, 64, 54, 0x000000007ffc00LL, + 14, 64, 55, 0x000000007ffe00LL, + 15, 64, 56, 0x000000007fff00LL, + 16, 64, 57, 0x000000007fff80LL, + 17, 64, 58, 0x000000007fffc0LL, + 18, 64, 59, 0x000000007fffe0LL, + 19, 64, 60, 0x000000007ffff0LL, + 20, 64, 61, 0x000000007ffff8LL, + 21, 64, 62, 0x000000007ffffcLL, + 22, 64, 63, 0x000000007ffffeLL, + 23, 64, 0, 0x000000007fffffLL, + 1, 64, 41, 0x00000000800000LL, + 2, 64, 42, 0x00000000c00000LL, + 3, 64, 43, 0x00000000e00000LL, + 4, 64, 44, 0x00000000f00000LL, + 5, 64, 45, 0x00000000f80000LL, + 6, 64, 46, 0x00000000fc0000LL, + 7, 64, 47, 0x00000000fe0000LL, + 8, 64, 48, 0x00000000ff0000LL, + 9, 64, 49, 0x00000000ff8000LL, + 10, 64, 50, 0x00000000ffc000LL, + 11, 64, 51, 0x00000000ffe000LL, + 12, 64, 52, 0x00000000fff000LL, + 13, 64, 53, 0x00000000fff800LL, + 14, 64, 54, 0x00000000fffc00LL, + 15, 64, 55, 0x00000000fffe00LL, + 16, 64, 56, 0x00000000ffff00LL, + 17, 64, 57, 0x00000000ffff80LL, + 18, 64, 58, 0x00000000ffffc0LL, + 19, 64, 59, 0x00000000ffffe0LL, + 20, 64, 60, 0x00000000fffff0LL, + 21, 64, 61, 0x00000000fffff8LL, + 22, 64, 62, 0x00000000fffffcLL, + 23, 64, 63, 0x00000000fffffeLL, + 24, 64, 0, 0x00000000ffffffLL, + 1, 64, 40, 0x00000001000000LL, + 2, 64, 41, 0x00000001800000LL, + 3, 64, 42, 0x00000001c00000LL, + 4, 64, 43, 0x00000001e00000LL, + 5, 64, 44, 0x00000001f00000LL, + 6, 64, 45, 0x00000001f80000LL, + 7, 64, 46, 0x00000001fc0000LL, + 8, 64, 47, 0x00000001fe0000LL, + 9, 64, 48, 0x00000001ff0000LL, + 10, 64, 49, 0x00000001ff8000LL, + 11, 64, 50, 0x00000001ffc000LL, + 12, 64, 51, 0x00000001ffe000LL, + 13, 64, 52, 0x00000001fff000LL, + 14, 64, 53, 0x00000001fff800LL, + 15, 64, 54, 0x00000001fffc00LL, + 16, 64, 55, 0x00000001fffe00LL, + 17, 64, 56, 0x00000001ffff00LL, + 18, 64, 57, 0x00000001ffff80LL, + 19, 64, 58, 0x00000001ffffc0LL, + 20, 64, 59, 0x00000001ffffe0LL, + 21, 64, 60, 0x00000001fffff0LL, + 22, 64, 61, 0x00000001fffff8LL, + 23, 64, 62, 0x00000001fffffcLL, + 24, 64, 63, 0x00000001fffffeLL, + 25, 64, 0, 0x00000001ffffffLL, + 1, 64, 39, 0x00000002000000LL, + 2, 64, 40, 0x00000003000000LL, + 3, 64, 41, 0x00000003800000LL, + 4, 64, 42, 0x00000003c00000LL, + 5, 64, 43, 0x00000003e00000LL, + 6, 64, 44, 0x00000003f00000LL, + 7, 64, 45, 0x00000003f80000LL, + 8, 64, 46, 0x00000003fc0000LL, + 9, 64, 47, 0x00000003fe0000LL, + 10, 64, 48, 0x00000003ff0000LL, + 11, 64, 49, 0x00000003ff8000LL, + 12, 64, 50, 0x00000003ffc000LL, + 13, 64, 51, 0x00000003ffe000LL, + 14, 64, 52, 0x00000003fff000LL, + 15, 64, 53, 0x00000003fff800LL, + 16, 64, 54, 0x00000003fffc00LL, + 17, 64, 55, 0x00000003fffe00LL, + 18, 64, 56, 0x00000003ffff00LL, + 19, 64, 57, 0x00000003ffff80LL, + 20, 64, 58, 0x00000003ffffc0LL, + 21, 64, 59, 0x00000003ffffe0LL, + 22, 64, 60, 0x00000003fffff0LL, + 23, 64, 61, 0x00000003fffff8LL, + 24, 64, 62, 0x00000003fffffcLL, + 25, 64, 63, 0x00000003fffffeLL, + 26, 64, 0, 0x00000003ffffffLL, + 1, 64, 38, 0x00000004000000LL, + 2, 64, 39, 0x00000006000000LL, + 3, 64, 40, 0x00000007000000LL, + 4, 64, 41, 0x00000007800000LL, + 5, 64, 42, 0x00000007c00000LL, + 6, 64, 43, 0x00000007e00000LL, + 7, 64, 44, 0x00000007f00000LL, + 8, 64, 45, 0x00000007f80000LL, + 9, 64, 46, 0x00000007fc0000LL, + 10, 64, 47, 0x00000007fe0000LL, + 11, 64, 48, 0x00000007ff0000LL, + 12, 64, 49, 0x00000007ff8000LL, + 13, 64, 50, 0x00000007ffc000LL, + 14, 64, 51, 0x00000007ffe000LL, + 15, 64, 52, 0x00000007fff000LL, + 16, 64, 53, 0x00000007fff800LL, + 17, 64, 54, 0x00000007fffc00LL, + 18, 64, 55, 0x00000007fffe00LL, + 19, 64, 56, 0x00000007ffff00LL, + 20, 64, 57, 0x00000007ffff80LL, + 21, 64, 58, 0x00000007ffffc0LL, + 22, 64, 59, 0x00000007ffffe0LL, + 23, 64, 60, 0x00000007fffff0LL, + 24, 64, 61, 0x00000007fffff8LL, + 25, 64, 62, 0x00000007fffffcLL, + 26, 64, 63, 0x00000007fffffeLL, + 27, 64, 0, 0x00000007ffffffLL, + 1, 64, 37, 0x00000008000000LL, + 2, 64, 38, 0x0000000c000000LL, + 3, 64, 39, 0x0000000e000000LL, + 4, 64, 40, 0x0000000f000000LL, + 5, 64, 41, 0x0000000f800000LL, + 6, 64, 42, 0x0000000fc00000LL, + 7, 64, 43, 0x0000000fe00000LL, + 8, 64, 44, 0x0000000ff00000LL, + 9, 64, 45, 0x0000000ff80000LL, + 10, 64, 46, 0x0000000ffc0000LL, + 11, 64, 47, 0x0000000ffe0000LL, + 12, 64, 48, 0x0000000fff0000LL, + 13, 64, 49, 0x0000000fff8000LL, + 14, 64, 50, 0x0000000fffc000LL, + 15, 64, 51, 0x0000000fffe000LL, + 16, 64, 52, 0x0000000ffff000LL, + 17, 64, 53, 0x0000000ffff800LL, + 18, 64, 54, 0x0000000ffffc00LL, + 19, 64, 55, 0x0000000ffffe00LL, + 20, 64, 56, 0x0000000fffff00LL, + 21, 64, 57, 0x0000000fffff80LL, + 22, 64, 58, 0x0000000fffffc0LL, + 23, 64, 59, 0x0000000fffffe0LL, + 24, 64, 60, 0x0000000ffffff0LL, + 25, 64, 61, 0x0000000ffffff8LL, + 26, 64, 62, 0x0000000ffffffcLL, + 27, 64, 63, 0x0000000ffffffeLL, + 28, 64, 0, 0x0000000fffffffLL, + 1, 64, 36, 0x00000010000000LL, + 2, 64, 37, 0x00000018000000LL, + 3, 64, 38, 0x0000001c000000LL, + 4, 64, 39, 0x0000001e000000LL, + 5, 64, 40, 0x0000001f000000LL, + 6, 64, 41, 0x0000001f800000LL, + 7, 64, 42, 0x0000001fc00000LL, + 8, 64, 43, 0x0000001fe00000LL, + 9, 64, 44, 0x0000001ff00000LL, + 10, 64, 45, 0x0000001ff80000LL, + 11, 64, 46, 0x0000001ffc0000LL, + 12, 64, 47, 0x0000001ffe0000LL, + 13, 64, 48, 0x0000001fff0000LL, + 14, 64, 49, 0x0000001fff8000LL, + 15, 64, 50, 0x0000001fffc000LL, + 16, 64, 51, 0x0000001fffe000LL, + 17, 64, 52, 0x0000001ffff000LL, + 18, 64, 53, 0x0000001ffff800LL, + 19, 64, 54, 0x0000001ffffc00LL, + 20, 64, 55, 0x0000001ffffe00LL, + 21, 64, 56, 0x0000001fffff00LL, + 22, 64, 57, 0x0000001fffff80LL, + 23, 64, 58, 0x0000001fffffc0LL, + 24, 64, 59, 0x0000001fffffe0LL, + 25, 64, 60, 0x0000001ffffff0LL, + 26, 64, 61, 0x0000001ffffff8LL, + 27, 64, 62, 0x0000001ffffffcLL, + 28, 64, 63, 0x0000001ffffffeLL, + 29, 64, 0, 0x0000001fffffffLL, + 1, 64, 35, 0x00000020000000LL, + 2, 64, 36, 0x00000030000000LL, + 3, 64, 37, 0x00000038000000LL, + 4, 64, 38, 0x0000003c000000LL, + 5, 64, 39, 0x0000003e000000LL, + 6, 64, 40, 0x0000003f000000LL, + 7, 64, 41, 0x0000003f800000LL, + 8, 64, 42, 0x0000003fc00000LL, + 9, 64, 43, 0x0000003fe00000LL, + 10, 64, 44, 0x0000003ff00000LL, + 11, 64, 45, 0x0000003ff80000LL, + 12, 64, 46, 0x0000003ffc0000LL, + 13, 64, 47, 0x0000003ffe0000LL, + 14, 64, 48, 0x0000003fff0000LL, + 15, 64, 49, 0x0000003fff8000LL, + 16, 64, 50, 0x0000003fffc000LL, + 17, 64, 51, 0x0000003fffe000LL, + 18, 64, 52, 0x0000003ffff000LL, + 19, 64, 53, 0x0000003ffff800LL, + 20, 64, 54, 0x0000003ffffc00LL, + 21, 64, 55, 0x0000003ffffe00LL, + 22, 64, 56, 0x0000003fffff00LL, + 23, 64, 57, 0x0000003fffff80LL, + 24, 64, 58, 0x0000003fffffc0LL, + 25, 64, 59, 0x0000003fffffe0LL, + 26, 64, 60, 0x0000003ffffff0LL, + 27, 64, 61, 0x0000003ffffff8LL, + 28, 64, 62, 0x0000003ffffffcLL, + 29, 64, 63, 0x0000003ffffffeLL, + 30, 64, 0, 0x0000003fffffffLL, + 1, 64, 34, 0x00000040000000LL, + 2, 64, 35, 0x00000060000000LL, + 3, 64, 36, 0x00000070000000LL, + 4, 64, 37, 0x00000078000000LL, + 5, 64, 38, 0x0000007c000000LL, + 6, 64, 39, 0x0000007e000000LL, + 7, 64, 40, 0x0000007f000000LL, + 8, 64, 41, 0x0000007f800000LL, + 9, 64, 42, 0x0000007fc00000LL, + 10, 64, 43, 0x0000007fe00000LL, + 11, 64, 44, 0x0000007ff00000LL, + 12, 64, 45, 0x0000007ff80000LL, + 13, 64, 46, 0x0000007ffc0000LL, + 14, 64, 47, 0x0000007ffe0000LL, + 15, 64, 48, 0x0000007fff0000LL, + 16, 64, 49, 0x0000007fff8000LL, + 17, 64, 50, 0x0000007fffc000LL, + 18, 64, 51, 0x0000007fffe000LL, + 19, 64, 52, 0x0000007ffff000LL, + 20, 64, 53, 0x0000007ffff800LL, + 21, 64, 54, 0x0000007ffffc00LL, + 22, 64, 55, 0x0000007ffffe00LL, + 23, 64, 56, 0x0000007fffff00LL, + 24, 64, 57, 0x0000007fffff80LL, + 25, 64, 58, 0x0000007fffffc0LL, + 26, 64, 59, 0x0000007fffffe0LL, + 27, 64, 60, 0x0000007ffffff0LL, + 28, 64, 61, 0x0000007ffffff8LL, + 29, 64, 62, 0x0000007ffffffcLL, + 30, 64, 63, 0x0000007ffffffeLL, + 31, 64, 0, 0x0000007fffffffLL, + 1, 64, 33, 0x00000080000000LL, + 2, 64, 34, 0x000000c0000000LL, + 3, 64, 35, 0x000000e0000000LL, + 4, 64, 36, 0x000000f0000000LL, + 5, 64, 37, 0x000000f8000000LL, + 6, 64, 38, 0x000000fc000000LL, + 7, 64, 39, 0x000000fe000000LL, + 8, 64, 40, 0x000000ff000000LL, + 9, 64, 41, 0x000000ff800000LL, + 10, 64, 42, 0x000000ffc00000LL, + 11, 64, 43, 0x000000ffe00000LL, + 12, 64, 44, 0x000000fff00000LL, + 13, 64, 45, 0x000000fff80000LL, + 14, 64, 46, 0x000000fffc0000LL, + 15, 64, 47, 0x000000fffe0000LL, + 16, 64, 48, 0x000000ffff0000LL, + 17, 64, 49, 0x000000ffff8000LL, + 18, 64, 50, 0x000000ffffc000LL, + 19, 64, 51, 0x000000ffffe000LL, + 20, 64, 52, 0x000000fffff000LL, + 21, 64, 53, 0x000000fffff800LL, + 22, 64, 54, 0x000000fffffc00LL, + 23, 64, 55, 0x000000fffffe00LL, + 24, 64, 56, 0x000000ffffff00LL, + 25, 64, 57, 0x000000ffffff80LL, + 26, 64, 58, 0x000000ffffffc0LL, + 27, 64, 59, 0x000000ffffffe0LL, + 28, 64, 60, 0x000000fffffff0LL, + 29, 64, 61, 0x000000fffffff8LL, + 30, 64, 62, 0x000000fffffffcLL, + 31, 64, 63, 0x000000fffffffeLL, + 32, 64, 0, 0x000000ffffffffLL, + 1, 64, 32, 0x00000100000000LL, + 1, 32, 0, 0x00000100000001LL, + 2, 64, 33, 0x00000180000000LL, + 3, 64, 34, 0x000001c0000000LL, + 4, 64, 35, 0x000001e0000000LL, + 5, 64, 36, 0x000001f0000000LL, + 6, 64, 37, 0x000001f8000000LL, + 7, 64, 38, 0x000001fc000000LL, + 8, 64, 39, 0x000001fe000000LL, + 9, 64, 40, 0x000001ff000000LL, + 10, 64, 41, 0x000001ff800000LL, + 11, 64, 42, 0x000001ffc00000LL, + 12, 64, 43, 0x000001ffe00000LL, + 13, 64, 44, 0x000001fff00000LL, + 14, 64, 45, 0x000001fff80000LL, + 15, 64, 46, 0x000001fffc0000LL, + 16, 64, 47, 0x000001fffe0000LL, + 17, 64, 48, 0x000001ffff0000LL, + 18, 64, 49, 0x000001ffff8000LL, + 19, 64, 50, 0x000001ffffc000LL, + 20, 64, 51, 0x000001ffffe000LL, + 21, 64, 52, 0x000001fffff000LL, + 22, 64, 53, 0x000001fffff800LL, + 23, 64, 54, 0x000001fffffc00LL, + 24, 64, 55, 0x000001fffffe00LL, + 25, 64, 56, 0x000001ffffff00LL, + 26, 64, 57, 0x000001ffffff80LL, + 27, 64, 58, 0x000001ffffffc0LL, + 28, 64, 59, 0x000001ffffffe0LL, + 29, 64, 60, 0x000001fffffff0LL, + 30, 64, 61, 0x000001fffffff8LL, + 31, 64, 62, 0x000001fffffffcLL, + 32, 64, 63, 0x000001fffffffeLL, + 33, 64, 0, 0x000001ffffffffLL, + 1, 64, 31, 0x00000200000000LL, + 1, 32, 31, 0x00000200000002LL, + 2, 64, 32, 0x00000300000000LL, + 2, 32, 0, 0x00000300000003LL, + 3, 64, 33, 0x00000380000000LL, + 4, 64, 34, 0x000003c0000000LL, + 5, 64, 35, 0x000003e0000000LL, + 6, 64, 36, 0x000003f0000000LL, + 7, 64, 37, 0x000003f8000000LL, + 8, 64, 38, 0x000003fc000000LL, + 9, 64, 39, 0x000003fe000000LL, + 10, 64, 40, 0x000003ff000000LL, + 11, 64, 41, 0x000003ff800000LL, + 12, 64, 42, 0x000003ffc00000LL, + 13, 64, 43, 0x000003ffe00000LL, + 14, 64, 44, 0x000003fff00000LL, + 15, 64, 45, 0x000003fff80000LL, + 16, 64, 46, 0x000003fffc0000LL, + 17, 64, 47, 0x000003fffe0000LL, + 18, 64, 48, 0x000003ffff0000LL, + 19, 64, 49, 0x000003ffff8000LL, + 20, 64, 50, 0x000003ffffc000LL, + 21, 64, 51, 0x000003ffffe000LL, + 22, 64, 52, 0x000003fffff000LL, + 23, 64, 53, 0x000003fffff800LL, + 24, 64, 54, 0x000003fffffc00LL, + 25, 64, 55, 0x000003fffffe00LL, + 26, 64, 56, 0x000003ffffff00LL, + 27, 64, 57, 0x000003ffffff80LL, + 28, 64, 58, 0x000003ffffffc0LL, + 29, 64, 59, 0x000003ffffffe0LL, + 30, 64, 60, 0x000003fffffff0LL, + 31, 64, 61, 0x000003fffffff8LL, + 32, 64, 62, 0x000003fffffffcLL, + 33, 64, 63, 0x000003fffffffeLL, + 34, 64, 0, 0x000003ffffffffLL, + 1, 64, 30, 0x00000400000000LL, + 1, 32, 30, 0x00000400000004LL, + 2, 64, 31, 0x00000600000000LL, + 2, 32, 31, 0x00000600000006LL, + 3, 64, 32, 0x00000700000000LL, + 3, 32, 0, 0x00000700000007LL, + 4, 64, 33, 0x00000780000000LL, + 5, 64, 34, 0x000007c0000000LL, + 6, 64, 35, 0x000007e0000000LL, + 7, 64, 36, 0x000007f0000000LL, + 8, 64, 37, 0x000007f8000000LL, + 9, 64, 38, 0x000007fc000000LL, + 10, 64, 39, 0x000007fe000000LL, + 11, 64, 40, 0x000007ff000000LL, + 12, 64, 41, 0x000007ff800000LL, + 13, 64, 42, 0x000007ffc00000LL, + 14, 64, 43, 0x000007ffe00000LL, + 15, 64, 44, 0x000007fff00000LL, + 16, 64, 45, 0x000007fff80000LL, + 17, 64, 46, 0x000007fffc0000LL, + 18, 64, 47, 0x000007fffe0000LL, + 19, 64, 48, 0x000007ffff0000LL, + 20, 64, 49, 0x000007ffff8000LL, + 21, 64, 50, 0x000007ffffc000LL, + 22, 64, 51, 0x000007ffffe000LL, + 23, 64, 52, 0x000007fffff000LL, + 24, 64, 53, 0x000007fffff800LL, + 25, 64, 54, 0x000007fffffc00LL, + 26, 64, 55, 0x000007fffffe00LL, + 27, 64, 56, 0x000007ffffff00LL, + 28, 64, 57, 0x000007ffffff80LL, + 29, 64, 58, 0x000007ffffffc0LL, + 30, 64, 59, 0x000007ffffffe0LL, + 31, 64, 60, 0x000007fffffff0LL, + 32, 64, 61, 0x000007fffffff8LL, + 33, 64, 62, 0x000007fffffffcLL, + 34, 64, 63, 0x000007fffffffeLL, + 35, 64, 0, 0x000007ffffffffLL, + 1, 64, 29, 0x00000800000000LL, + 1, 32, 29, 0x00000800000008LL, + 2, 64, 30, 0x00000c00000000LL, + 2, 32, 30, 0x00000c0000000cLL, + 3, 64, 31, 0x00000e00000000LL, + 3, 32, 31, 0x00000e0000000eLL, + 4, 64, 32, 0x00000f00000000LL, + 4, 32, 0, 0x00000f0000000fLL, + 5, 64, 33, 0x00000f80000000LL, + 6, 64, 34, 0x00000fc0000000LL, + 7, 64, 35, 0x00000fe0000000LL, + 8, 64, 36, 0x00000ff0000000LL, + 9, 64, 37, 0x00000ff8000000LL, + 10, 64, 38, 0x00000ffc000000LL, + 11, 64, 39, 0x00000ffe000000LL, + 12, 64, 40, 0x00000fff000000LL, + 13, 64, 41, 0x00000fff800000LL, + 14, 64, 42, 0x00000fffc00000LL, + 15, 64, 43, 0x00000fffe00000LL, + 16, 64, 44, 0x00000ffff00000LL, + 17, 64, 45, 0x00000ffff80000LL, + 18, 64, 46, 0x00000ffffc0000LL, + 19, 64, 47, 0x00000ffffe0000LL, + 20, 64, 48, 0x00000fffff0000LL, + 21, 64, 49, 0x00000fffff8000LL, + 22, 64, 50, 0x00000fffffc000LL, + 23, 64, 51, 0x00000fffffe000LL, + 24, 64, 52, 0x00000ffffff000LL, + 25, 64, 53, 0x00000ffffff800LL, + 26, 64, 54, 0x00000ffffffc00LL, + 27, 64, 55, 0x00000ffffffe00LL, + 28, 64, 56, 0x00000fffffff00LL, + 29, 64, 57, 0x00000fffffff80LL, + 30, 64, 58, 0x00000fffffffc0LL, + 31, 64, 59, 0x00000fffffffe0LL, + 32, 64, 60, 0x00000ffffffff0LL, + 33, 64, 61, 0x00000ffffffff8LL, + 34, 64, 62, 0x00000ffffffffcLL, + 35, 64, 63, 0x00000ffffffffeLL, + 36, 64, 0, 0x00000fffffffffLL, + 1, 64, 28, 0x00001000000000LL, + 1, 32, 28, 0x00001000000010LL, + 2, 64, 29, 0x00001800000000LL, + 2, 32, 29, 0x00001800000018LL, + 3, 64, 30, 0x00001c00000000LL, + 3, 32, 30, 0x00001c0000001cLL, + 4, 64, 31, 0x00001e00000000LL, + 4, 32, 31, 0x00001e0000001eLL, + 5, 64, 32, 0x00001f00000000LL, + 5, 32, 0, 0x00001f0000001fLL, + 6, 64, 33, 0x00001f80000000LL, + 7, 64, 34, 0x00001fc0000000LL, + 8, 64, 35, 0x00001fe0000000LL, + 9, 64, 36, 0x00001ff0000000LL, + 10, 64, 37, 0x00001ff8000000LL, + 11, 64, 38, 0x00001ffc000000LL, + 12, 64, 39, 0x00001ffe000000LL, + 13, 64, 40, 0x00001fff000000LL, + 14, 64, 41, 0x00001fff800000LL, + 15, 64, 42, 0x00001fffc00000LL, + 16, 64, 43, 0x00001fffe00000LL, + 17, 64, 44, 0x00001ffff00000LL, + 18, 64, 45, 0x00001ffff80000LL, + 19, 64, 46, 0x00001ffffc0000LL, + 20, 64, 47, 0x00001ffffe0000LL, + 21, 64, 48, 0x00001fffff0000LL, + 22, 64, 49, 0x00001fffff8000LL, + 23, 64, 50, 0x00001fffffc000LL, + 24, 64, 51, 0x00001fffffe000LL, + 25, 64, 52, 0x00001ffffff000LL, + 26, 64, 53, 0x00001ffffff800LL, + 27, 64, 54, 0x00001ffffffc00LL, + 28, 64, 55, 0x00001ffffffe00LL, + 29, 64, 56, 0x00001fffffff00LL, + 30, 64, 57, 0x00001fffffff80LL, + 31, 64, 58, 0x00001fffffffc0LL, + 32, 64, 59, 0x00001fffffffe0LL, + 33, 64, 60, 0x00001ffffffff0LL, + 34, 64, 61, 0x00001ffffffff8LL, + 35, 64, 62, 0x00001ffffffffcLL, + 36, 64, 63, 0x00001ffffffffeLL, + 37, 64, 0, 0x00001fffffffffLL, + 1, 64, 27, 0x00002000000000LL, + 1, 32, 27, 0x00002000000020LL, + 2, 64, 28, 0x00003000000000LL, + 2, 32, 28, 0x00003000000030LL, + 3, 64, 29, 0x00003800000000LL, + 3, 32, 29, 0x00003800000038LL, + 4, 64, 30, 0x00003c00000000LL, + 4, 32, 30, 0x00003c0000003cLL, + 5, 64, 31, 0x00003e00000000LL, + 5, 32, 31, 0x00003e0000003eLL, + 6, 64, 32, 0x00003f00000000LL, + 6, 32, 0, 0x00003f0000003fLL, + 7, 64, 33, 0x00003f80000000LL, + 8, 64, 34, 0x00003fc0000000LL, + 9, 64, 35, 0x00003fe0000000LL, + 10, 64, 36, 0x00003ff0000000LL, + 11, 64, 37, 0x00003ff8000000LL, + 12, 64, 38, 0x00003ffc000000LL, + 13, 64, 39, 0x00003ffe000000LL, + 14, 64, 40, 0x00003fff000000LL, + 15, 64, 41, 0x00003fff800000LL, + 16, 64, 42, 0x00003fffc00000LL, + 17, 64, 43, 0x00003fffe00000LL, + 18, 64, 44, 0x00003ffff00000LL, + 19, 64, 45, 0x00003ffff80000LL, + 20, 64, 46, 0x00003ffffc0000LL, + 21, 64, 47, 0x00003ffffe0000LL, + 22, 64, 48, 0x00003fffff0000LL, + 23, 64, 49, 0x00003fffff8000LL, + 24, 64, 50, 0x00003fffffc000LL, + 25, 64, 51, 0x00003fffffe000LL, + 26, 64, 52, 0x00003ffffff000LL, + 27, 64, 53, 0x00003ffffff800LL, + 28, 64, 54, 0x00003ffffffc00LL, + 29, 64, 55, 0x00003ffffffe00LL, + 30, 64, 56, 0x00003fffffff00LL, + 31, 64, 57, 0x00003fffffff80LL, + 32, 64, 58, 0x00003fffffffc0LL, + 33, 64, 59, 0x00003fffffffe0LL, + 34, 64, 60, 0x00003ffffffff0LL, + 35, 64, 61, 0x00003ffffffff8LL, + 36, 64, 62, 0x00003ffffffffcLL, + 37, 64, 63, 0x00003ffffffffeLL, + 38, 64, 0, 0x00003fffffffffLL, + 1, 64, 26, 0x00004000000000LL, + 1, 32, 26, 0x00004000000040LL, + 2, 64, 27, 0x00006000000000LL, + 2, 32, 27, 0x00006000000060LL, + 3, 64, 28, 0x00007000000000LL, + 3, 32, 28, 0x00007000000070LL, + 4, 64, 29, 0x00007800000000LL, + 4, 32, 29, 0x00007800000078LL, + 5, 64, 30, 0x00007c00000000LL, + 5, 32, 30, 0x00007c0000007cLL, + 6, 64, 31, 0x00007e00000000LL, + 6, 32, 31, 0x00007e0000007eLL, + 7, 64, 32, 0x00007f00000000LL, + 7, 32, 0, 0x00007f0000007fLL, + 8, 64, 33, 0x00007f80000000LL, + 9, 64, 34, 0x00007fc0000000LL, + 10, 64, 35, 0x00007fe0000000LL, + 11, 64, 36, 0x00007ff0000000LL, + 12, 64, 37, 0x00007ff8000000LL, + 13, 64, 38, 0x00007ffc000000LL, + 14, 64, 39, 0x00007ffe000000LL, + 15, 64, 40, 0x00007fff000000LL, + 16, 64, 41, 0x00007fff800000LL, + 17, 64, 42, 0x00007fffc00000LL, + 18, 64, 43, 0x00007fffe00000LL, + 19, 64, 44, 0x00007ffff00000LL, + 20, 64, 45, 0x00007ffff80000LL, + 21, 64, 46, 0x00007ffffc0000LL, + 22, 64, 47, 0x00007ffffe0000LL, + 23, 64, 48, 0x00007fffff0000LL, + 24, 64, 49, 0x00007fffff8000LL, + 25, 64, 50, 0x00007fffffc000LL, + 26, 64, 51, 0x00007fffffe000LL, + 27, 64, 52, 0x00007ffffff000LL, + 28, 64, 53, 0x00007ffffff800LL, + 29, 64, 54, 0x00007ffffffc00LL, + 30, 64, 55, 0x00007ffffffe00LL, + 31, 64, 56, 0x00007fffffff00LL, + 32, 64, 57, 0x00007fffffff80LL, + 33, 64, 58, 0x00007fffffffc0LL, + 34, 64, 59, 0x00007fffffffe0LL, + 35, 64, 60, 0x00007ffffffff0LL, + 36, 64, 61, 0x00007ffffffff8LL, + 37, 64, 62, 0x00007ffffffffcLL, + 38, 64, 63, 0x00007ffffffffeLL, + 39, 64, 0, 0x00007fffffffffLL, + 1, 64, 25, 0x00008000000000LL, + 1, 32, 25, 0x00008000000080LL, + 2, 64, 26, 0x0000c000000000LL, + 2, 32, 26, 0x0000c0000000c0LL, + 3, 64, 27, 0x0000e000000000LL, + 3, 32, 27, 0x0000e0000000e0LL, + 4, 64, 28, 0x0000f000000000LL, + 4, 32, 28, 0x0000f0000000f0LL, + 5, 64, 29, 0x0000f800000000LL, + 5, 32, 29, 0x0000f8000000f8LL, + 6, 64, 30, 0x0000fc00000000LL, + 6, 32, 30, 0x0000fc000000fcLL, + 7, 64, 31, 0x0000fe00000000LL, + 7, 32, 31, 0x0000fe000000feLL, + 8, 64, 32, 0x0000ff00000000LL, + 8, 32, 0, 0x0000ff000000ffLL, + 9, 64, 33, 0x0000ff80000000LL, + 10, 64, 34, 0x0000ffc0000000LL, + 11, 64, 35, 0x0000ffe0000000LL, + 12, 64, 36, 0x0000fff0000000LL, + 13, 64, 37, 0x0000fff8000000LL, + 14, 64, 38, 0x0000fffc000000LL, + 15, 64, 39, 0x0000fffe000000LL, + 16, 64, 40, 0x0000ffff000000LL, + 17, 64, 41, 0x0000ffff800000LL, + 18, 64, 42, 0x0000ffffc00000LL, + 19, 64, 43, 0x0000ffffe00000LL, + 20, 64, 44, 0x0000fffff00000LL, + 21, 64, 45, 0x0000fffff80000LL, + 22, 64, 46, 0x0000fffffc0000LL, + 23, 64, 47, 0x0000fffffe0000LL, + 24, 64, 48, 0x0000ffffff0000LL, + 25, 64, 49, 0x0000ffffff8000LL, + 26, 64, 50, 0x0000ffffffc000LL, + 27, 64, 51, 0x0000ffffffe000LL, + 28, 64, 52, 0x0000fffffff000LL, + 29, 64, 53, 0x0000fffffff800LL, + 30, 64, 54, 0x0000fffffffc00LL, + 31, 64, 55, 0x0000fffffffe00LL, + 32, 64, 56, 0x0000ffffffff00LL, + 33, 64, 57, 0x0000ffffffff80LL, + 34, 64, 58, 0x0000ffffffffc0LL, + 35, 64, 59, 0x0000ffffffffe0LL, + 36, 64, 60, 0x0000fffffffff0LL, + 37, 64, 61, 0x0000fffffffff8LL, + 38, 64, 62, 0x0000fffffffffcLL, + 39, 64, 63, 0x0000fffffffffeLL, + 40, 64, 0, 0x0000ffffffffffLL, + 1, 64, 24, 0x00010000000000LL, + 1, 32, 24, 0x00010000000100LL, + 2, 64, 25, 0x00018000000000LL, + 2, 32, 25, 0x00018000000180LL, + 3, 64, 26, 0x0001c000000000LL, + 3, 32, 26, 0x0001c0000001c0LL, + 4, 64, 27, 0x0001e000000000LL, + 4, 32, 27, 0x0001e0000001e0LL, + 5, 64, 28, 0x0001f000000000LL, + 5, 32, 28, 0x0001f0000001f0LL, + 6, 64, 29, 0x0001f800000000LL, + 6, 32, 29, 0x0001f8000001f8LL, + 7, 64, 30, 0x0001fc00000000LL, + 7, 32, 30, 0x0001fc000001fcLL, + 8, 64, 31, 0x0001fe00000000LL, + 8, 32, 31, 0x0001fe000001feLL, + 9, 64, 32, 0x0001ff00000000LL, + 9, 32, 0, 0x0001ff000001ffLL, + 10, 64, 33, 0x0001ff80000000LL, + 11, 64, 34, 0x0001ffc0000000LL, + 12, 64, 35, 0x0001ffe0000000LL, + 13, 64, 36, 0x0001fff0000000LL, + 14, 64, 37, 0x0001fff8000000LL, + 15, 64, 38, 0x0001fffc000000LL, + 16, 64, 39, 0x0001fffe000000LL, + 17, 64, 40, 0x0001ffff000000LL, + 18, 64, 41, 0x0001ffff800000LL, + 19, 64, 42, 0x0001ffffc00000LL, + 20, 64, 43, 0x0001ffffe00000LL, + 21, 64, 44, 0x0001fffff00000LL, + 22, 64, 45, 0x0001fffff80000LL, + 23, 64, 46, 0x0001fffffc0000LL, + 24, 64, 47, 0x0001fffffe0000LL, + 25, 64, 48, 0x0001ffffff0000LL, + 26, 64, 49, 0x0001ffffff8000LL, + 27, 64, 50, 0x0001ffffffc000LL, + 28, 64, 51, 0x0001ffffffe000LL, + 29, 64, 52, 0x0001fffffff000LL, + 30, 64, 53, 0x0001fffffff800LL, + 31, 64, 54, 0x0001fffffffc00LL, + 32, 64, 55, 0x0001fffffffe00LL, + 33, 64, 56, 0x0001ffffffff00LL, + 34, 64, 57, 0x0001ffffffff80LL, + 35, 64, 58, 0x0001ffffffffc0LL, + 36, 64, 59, 0x0001ffffffffe0LL, + 37, 64, 60, 0x0001fffffffff0LL, + 38, 64, 61, 0x0001fffffffff8LL, + 39, 64, 62, 0x0001fffffffffcLL, + 40, 64, 63, 0x0001fffffffffeLL, + 41, 64, 0, 0x0001ffffffffffLL, + 1, 64, 23, 0x00020000000000LL, + 1, 32, 23, 0x00020000000200LL, + 2, 64, 24, 0x00030000000000LL, + 2, 32, 24, 0x00030000000300LL, + 3, 64, 25, 0x00038000000000LL, + 3, 32, 25, 0x00038000000380LL, + 4, 64, 26, 0x0003c000000000LL, + 4, 32, 26, 0x0003c0000003c0LL, + 5, 64, 27, 0x0003e000000000LL, + 5, 32, 27, 0x0003e0000003e0LL, + 6, 64, 28, 0x0003f000000000LL, + 6, 32, 28, 0x0003f0000003f0LL, + 7, 64, 29, 0x0003f800000000LL, + 7, 32, 29, 0x0003f8000003f8LL, + 8, 64, 30, 0x0003fc00000000LL, + 8, 32, 30, 0x0003fc000003fcLL, + 9, 64, 31, 0x0003fe00000000LL, + 9, 32, 31, 0x0003fe000003feLL, + 10, 64, 32, 0x0003ff00000000LL, + 10, 32, 0, 0x0003ff000003ffLL, + 11, 64, 33, 0x0003ff80000000LL, + 12, 64, 34, 0x0003ffc0000000LL, + 13, 64, 35, 0x0003ffe0000000LL, + 14, 64, 36, 0x0003fff0000000LL, + 15, 64, 37, 0x0003fff8000000LL, + 16, 64, 38, 0x0003fffc000000LL, + 17, 64, 39, 0x0003fffe000000LL, + 18, 64, 40, 0x0003ffff000000LL, + 19, 64, 41, 0x0003ffff800000LL, + 20, 64, 42, 0x0003ffffc00000LL, + 21, 64, 43, 0x0003ffffe00000LL, + 22, 64, 44, 0x0003fffff00000LL, + 23, 64, 45, 0x0003fffff80000LL, + 24, 64, 46, 0x0003fffffc0000LL, + 25, 64, 47, 0x0003fffffe0000LL, + 26, 64, 48, 0x0003ffffff0000LL, + 27, 64, 49, 0x0003ffffff8000LL, + 28, 64, 50, 0x0003ffffffc000LL, + 29, 64, 51, 0x0003ffffffe000LL, + 30, 64, 52, 0x0003fffffff000LL, + 31, 64, 53, 0x0003fffffff800LL, + 32, 64, 54, 0x0003fffffffc00LL, + 33, 64, 55, 0x0003fffffffe00LL, + 34, 64, 56, 0x0003ffffffff00LL, + 35, 64, 57, 0x0003ffffffff80LL, + 36, 64, 58, 0x0003ffffffffc0LL, + 37, 64, 59, 0x0003ffffffffe0LL, + 38, 64, 60, 0x0003fffffffff0LL, + 39, 64, 61, 0x0003fffffffff8LL, + 40, 64, 62, 0x0003fffffffffcLL, + 41, 64, 63, 0x0003fffffffffeLL, + 42, 64, 0, 0x0003ffffffffffLL, + 1, 64, 22, 0x00040000000000LL, + 1, 32, 22, 0x00040000000400LL, + 2, 64, 23, 0x00060000000000LL, + 2, 32, 23, 0x00060000000600LL, + 3, 64, 24, 0x00070000000000LL, + 3, 32, 24, 0x00070000000700LL, + 4, 64, 25, 0x00078000000000LL, + 4, 32, 25, 0x00078000000780LL, + 5, 64, 26, 0x0007c000000000LL, + 5, 32, 26, 0x0007c0000007c0LL, + 6, 64, 27, 0x0007e000000000LL, + 6, 32, 27, 0x0007e0000007e0LL, + 7, 64, 28, 0x0007f000000000LL, + 7, 32, 28, 0x0007f0000007f0LL, + 8, 64, 29, 0x0007f800000000LL, + 8, 32, 29, 0x0007f8000007f8LL, + 9, 64, 30, 0x0007fc00000000LL, + 9, 32, 30, 0x0007fc000007fcLL, + 10, 64, 31, 0x0007fe00000000LL, + 10, 32, 31, 0x0007fe000007feLL, + 11, 64, 32, 0x0007ff00000000LL, + 11, 32, 0, 0x0007ff000007ffLL, + 12, 64, 33, 0x0007ff80000000LL, + 13, 64, 34, 0x0007ffc0000000LL, + 14, 64, 35, 0x0007ffe0000000LL, + 15, 64, 36, 0x0007fff0000000LL, + 16, 64, 37, 0x0007fff8000000LL, + 17, 64, 38, 0x0007fffc000000LL, + 18, 64, 39, 0x0007fffe000000LL, + 19, 64, 40, 0x0007ffff000000LL, + 20, 64, 41, 0x0007ffff800000LL, + 21, 64, 42, 0x0007ffffc00000LL, + 22, 64, 43, 0x0007ffffe00000LL, + 23, 64, 44, 0x0007fffff00000LL, + 24, 64, 45, 0x0007fffff80000LL, + 25, 64, 46, 0x0007fffffc0000LL, + 26, 64, 47, 0x0007fffffe0000LL, + 27, 64, 48, 0x0007ffffff0000LL, + 28, 64, 49, 0x0007ffffff8000LL, + 29, 64, 50, 0x0007ffffffc000LL, + 30, 64, 51, 0x0007ffffffe000LL, + 31, 64, 52, 0x0007fffffff000LL, + 32, 64, 53, 0x0007fffffff800LL, + 33, 64, 54, 0x0007fffffffc00LL, + 34, 64, 55, 0x0007fffffffe00LL, + 35, 64, 56, 0x0007ffffffff00LL, + 36, 64, 57, 0x0007ffffffff80LL, + 37, 64, 58, 0x0007ffffffffc0LL, + 38, 64, 59, 0x0007ffffffffe0LL, + 39, 64, 60, 0x0007fffffffff0LL, + 40, 64, 61, 0x0007fffffffff8LL, + 41, 64, 62, 0x0007fffffffffcLL, + 42, 64, 63, 0x0007fffffffffeLL, + 43, 64, 0, 0x0007ffffffffffLL, + 1, 64, 21, 0x00080000000000LL, + 1, 32, 21, 0x00080000000800LL, + 2, 64, 22, 0x000c0000000000LL, + 2, 32, 22, 0x000c0000000c00LL, + 3, 64, 23, 0x000e0000000000LL, + 3, 32, 23, 0x000e0000000e00LL, + 4, 64, 24, 0x000f0000000000LL, + 4, 32, 24, 0x000f0000000f00LL, + 5, 64, 25, 0x000f8000000000LL, + 5, 32, 25, 0x000f8000000f80LL, + 6, 64, 26, 0x000fc000000000LL, + 6, 32, 26, 0x000fc000000fc0LL, + 7, 64, 27, 0x000fe000000000LL, + 7, 32, 27, 0x000fe000000fe0LL, + 8, 64, 28, 0x000ff000000000LL, + 8, 32, 28, 0x000ff000000ff0LL, + 9, 64, 29, 0x000ff800000000LL, + 9, 32, 29, 0x000ff800000ff8LL, + 10, 64, 30, 0x000ffc00000000LL, + 10, 32, 30, 0x000ffc00000ffcLL, + 11, 64, 31, 0x000ffe00000000LL, + 11, 32, 31, 0x000ffe00000ffeLL, + 12, 64, 32, 0x000fff00000000LL, + 12, 32, 0, 0x000fff00000fffLL, + 13, 64, 33, 0x000fff80000000LL, + 14, 64, 34, 0x000fffc0000000LL, + 15, 64, 35, 0x000fffe0000000LL, + 16, 64, 36, 0x000ffff0000000LL, + 17, 64, 37, 0x000ffff8000000LL, + 18, 64, 38, 0x000ffffc000000LL, + 19, 64, 39, 0x000ffffe000000LL, + 20, 64, 40, 0x000fffff000000LL, + 21, 64, 41, 0x000fffff800000LL, + 22, 64, 42, 0x000fffffc00000LL, + 23, 64, 43, 0x000fffffe00000LL, + 24, 64, 44, 0x000ffffff00000LL, + 25, 64, 45, 0x000ffffff80000LL, + 26, 64, 46, 0x000ffffffc0000LL, + 27, 64, 47, 0x000ffffffe0000LL, + 28, 64, 48, 0x000fffffff0000LL, + 29, 64, 49, 0x000fffffff8000LL, + 30, 64, 50, 0x000fffffffc000LL, + 31, 64, 51, 0x000fffffffe000LL, + 32, 64, 52, 0x000ffffffff000LL, + 33, 64, 53, 0x000ffffffff800LL, + 34, 64, 54, 0x000ffffffffc00LL, + 35, 64, 55, 0x000ffffffffe00LL, + 36, 64, 56, 0x000fffffffff00LL, + 37, 64, 57, 0x000fffffffff80LL, + 38, 64, 58, 0x000fffffffffc0LL, + 39, 64, 59, 0x000fffffffffe0LL, + 40, 64, 60, 0x000ffffffffff0LL, + 41, 64, 61, 0x000ffffffffff8LL, + 42, 64, 62, 0x000ffffffffffcLL, + 43, 64, 63, 0x000ffffffffffeLL, + 44, 64, 0, 0x000fffffffffffLL, + 1, 64, 20, 0x00100000000000LL, + 1, 32, 20, 0x00100000001000LL, + 2, 64, 21, 0x00180000000000LL, + 2, 32, 21, 0x00180000001800LL, + 3, 64, 22, 0x001c0000000000LL, + 3, 32, 22, 0x001c0000001c00LL, + 4, 64, 23, 0x001e0000000000LL, + 4, 32, 23, 0x001e0000001e00LL, + 5, 64, 24, 0x001f0000000000LL, + 5, 32, 24, 0x001f0000001f00LL, + 6, 64, 25, 0x001f8000000000LL, + 6, 32, 25, 0x001f8000001f80LL, + 7, 64, 26, 0x001fc000000000LL, + 7, 32, 26, 0x001fc000001fc0LL, + 8, 64, 27, 0x001fe000000000LL, + 8, 32, 27, 0x001fe000001fe0LL, + 9, 64, 28, 0x001ff000000000LL, + 9, 32, 28, 0x001ff000001ff0LL, + 10, 64, 29, 0x001ff800000000LL, + 10, 32, 29, 0x001ff800001ff8LL, + 11, 64, 30, 0x001ffc00000000LL, + 11, 32, 30, 0x001ffc00001ffcLL, + 12, 64, 31, 0x001ffe00000000LL, + 12, 32, 31, 0x001ffe00001ffeLL, + 13, 64, 32, 0x001fff00000000LL, + 13, 32, 0, 0x001fff00001fffLL, + 14, 64, 33, 0x001fff80000000LL, + 15, 64, 34, 0x001fffc0000000LL, + 16, 64, 35, 0x001fffe0000000LL, + 17, 64, 36, 0x001ffff0000000LL, + 18, 64, 37, 0x001ffff8000000LL, + 19, 64, 38, 0x001ffffc000000LL, + 20, 64, 39, 0x001ffffe000000LL, + 21, 64, 40, 0x001fffff000000LL, + 22, 64, 41, 0x001fffff800000LL, + 23, 64, 42, 0x001fffffc00000LL, + 24, 64, 43, 0x001fffffe00000LL, + 25, 64, 44, 0x001ffffff00000LL, + 26, 64, 45, 0x001ffffff80000LL, + 27, 64, 46, 0x001ffffffc0000LL, + 28, 64, 47, 0x001ffffffe0000LL, + 29, 64, 48, 0x001fffffff0000LL, + 30, 64, 49, 0x001fffffff8000LL, + 31, 64, 50, 0x001fffffffc000LL, + 32, 64, 51, 0x001fffffffe000LL, + 33, 64, 52, 0x001ffffffff000LL, + 34, 64, 53, 0x001ffffffff800LL, + 35, 64, 54, 0x001ffffffffc00LL, + 36, 64, 55, 0x001ffffffffe00LL, + 37, 64, 56, 0x001fffffffff00LL, + 38, 64, 57, 0x001fffffffff80LL, + 39, 64, 58, 0x001fffffffffc0LL, + 40, 64, 59, 0x001fffffffffe0LL, + 41, 64, 60, 0x001ffffffffff0LL, + 42, 64, 61, 0x001ffffffffff8LL, + 43, 64, 62, 0x001ffffffffffcLL, + 44, 64, 63, 0x001ffffffffffeLL, + 45, 64, 0, 0x001fffffffffffLL, + 1, 64, 19, 0x00200000000000LL, + 1, 32, 19, 0x00200000002000LL, + 2, 64, 20, 0x00300000000000LL, + 2, 32, 20, 0x00300000003000LL, + 3, 64, 21, 0x00380000000000LL, + 3, 32, 21, 0x00380000003800LL, + 4, 64, 22, 0x003c0000000000LL, + 4, 32, 22, 0x003c0000003c00LL, + 5, 64, 23, 0x003e0000000000LL, + 5, 32, 23, 0x003e0000003e00LL, + 6, 64, 24, 0x003f0000000000LL, + 6, 32, 24, 0x003f0000003f00LL, + 7, 64, 25, 0x003f8000000000LL, + 7, 32, 25, 0x003f8000003f80LL, + 8, 64, 26, 0x003fc000000000LL, + 8, 32, 26, 0x003fc000003fc0LL, + 9, 64, 27, 0x003fe000000000LL, + 9, 32, 27, 0x003fe000003fe0LL, + 10, 64, 28, 0x003ff000000000LL, + 10, 32, 28, 0x003ff000003ff0LL, + 11, 64, 29, 0x003ff800000000LL, + 11, 32, 29, 0x003ff800003ff8LL, + 12, 64, 30, 0x003ffc00000000LL, + 12, 32, 30, 0x003ffc00003ffcLL, + 13, 64, 31, 0x003ffe00000000LL, + 13, 32, 31, 0x003ffe00003ffeLL, + 14, 64, 32, 0x003fff00000000LL, + 14, 32, 0, 0x003fff00003fffLL, + 15, 64, 33, 0x003fff80000000LL, + 16, 64, 34, 0x003fffc0000000LL, + 17, 64, 35, 0x003fffe0000000LL, + 18, 64, 36, 0x003ffff0000000LL, + 19, 64, 37, 0x003ffff8000000LL, + 20, 64, 38, 0x003ffffc000000LL, + 21, 64, 39, 0x003ffffe000000LL, + 22, 64, 40, 0x003fffff000000LL, + 23, 64, 41, 0x003fffff800000LL, + 24, 64, 42, 0x003fffffc00000LL, + 25, 64, 43, 0x003fffffe00000LL, + 26, 64, 44, 0x003ffffff00000LL, + 27, 64, 45, 0x003ffffff80000LL, + 28, 64, 46, 0x003ffffffc0000LL, + 29, 64, 47, 0x003ffffffe0000LL, + 30, 64, 48, 0x003fffffff0000LL, + 31, 64, 49, 0x003fffffff8000LL, + 32, 64, 50, 0x003fffffffc000LL, + 33, 64, 51, 0x003fffffffe000LL, + 34, 64, 52, 0x003ffffffff000LL, + 35, 64, 53, 0x003ffffffff800LL, + 36, 64, 54, 0x003ffffffffc00LL, + 37, 64, 55, 0x003ffffffffe00LL, + 38, 64, 56, 0x003fffffffff00LL, + 39, 64, 57, 0x003fffffffff80LL, + 40, 64, 58, 0x003fffffffffc0LL, + 41, 64, 59, 0x003fffffffffe0LL, + 42, 64, 60, 0x003ffffffffff0LL, + 43, 64, 61, 0x003ffffffffff8LL, + 44, 64, 62, 0x003ffffffffffcLL, + 45, 64, 63, 0x003ffffffffffeLL, + 46, 64, 0, 0x003fffffffffffLL, + 1, 64, 18, 0x00400000000000LL, + 1, 32, 18, 0x00400000004000LL, + 2, 64, 19, 0x00600000000000LL, + 2, 32, 19, 0x00600000006000LL, + 3, 64, 20, 0x00700000000000LL, + 3, 32, 20, 0x00700000007000LL, + 4, 64, 21, 0x00780000000000LL, + 4, 32, 21, 0x00780000007800LL, + 5, 64, 22, 0x007c0000000000LL, + 5, 32, 22, 0x007c0000007c00LL, + 6, 64, 23, 0x007e0000000000LL, + 6, 32, 23, 0x007e0000007e00LL, + 7, 64, 24, 0x007f0000000000LL, + 7, 32, 24, 0x007f0000007f00LL, + 8, 64, 25, 0x007f8000000000LL, + 8, 32, 25, 0x007f8000007f80LL, + 9, 64, 26, 0x007fc000000000LL, + 9, 32, 26, 0x007fc000007fc0LL, + 10, 64, 27, 0x007fe000000000LL, + 10, 32, 27, 0x007fe000007fe0LL, + 11, 64, 28, 0x007ff000000000LL, + 11, 32, 28, 0x007ff000007ff0LL, + 12, 64, 29, 0x007ff800000000LL, + 12, 32, 29, 0x007ff800007ff8LL, + 13, 64, 30, 0x007ffc00000000LL, + 13, 32, 30, 0x007ffc00007ffcLL, + 14, 64, 31, 0x007ffe00000000LL, + 14, 32, 31, 0x007ffe00007ffeLL, + 15, 64, 32, 0x007fff00000000LL, + 15, 32, 0, 0x007fff00007fffLL, + 16, 64, 33, 0x007fff80000000LL, + 17, 64, 34, 0x007fffc0000000LL, + 18, 64, 35, 0x007fffe0000000LL, + 19, 64, 36, 0x007ffff0000000LL, + 20, 64, 37, 0x007ffff8000000LL, + 21, 64, 38, 0x007ffffc000000LL, + 22, 64, 39, 0x007ffffe000000LL, + 23, 64, 40, 0x007fffff000000LL, + 24, 64, 41, 0x007fffff800000LL, + 25, 64, 42, 0x007fffffc00000LL, + 26, 64, 43, 0x007fffffe00000LL, + 27, 64, 44, 0x007ffffff00000LL, + 28, 64, 45, 0x007ffffff80000LL, + 29, 64, 46, 0x007ffffffc0000LL, + 30, 64, 47, 0x007ffffffe0000LL, + 31, 64, 48, 0x007fffffff0000LL, + 32, 64, 49, 0x007fffffff8000LL, + 33, 64, 50, 0x007fffffffc000LL, + 34, 64, 51, 0x007fffffffe000LL, + 35, 64, 52, 0x007ffffffff000LL, + 36, 64, 53, 0x007ffffffff800LL, + 37, 64, 54, 0x007ffffffffc00LL, + 38, 64, 55, 0x007ffffffffe00LL, + 39, 64, 56, 0x007fffffffff00LL, + 40, 64, 57, 0x007fffffffff80LL, + 41, 64, 58, 0x007fffffffffc0LL, + 42, 64, 59, 0x007fffffffffe0LL, + 43, 64, 60, 0x007ffffffffff0LL, + 44, 64, 61, 0x007ffffffffff8LL, + 45, 64, 62, 0x007ffffffffffcLL, + 46, 64, 63, 0x007ffffffffffeLL, + 47, 64, 0, 0x007fffffffffffLL, + 1, 64, 17, 0x00800000000000LL, + 1, 32, 17, 0x00800000008000LL, + 2, 64, 18, 0x00c00000000000LL, + 2, 32, 18, 0x00c0000000c000LL, + 3, 64, 19, 0x00e00000000000LL, + 3, 32, 19, 0x00e0000000e000LL, + 4, 64, 20, 0x00f00000000000LL, + 4, 32, 20, 0x00f0000000f000LL, + 5, 64, 21, 0x00f80000000000LL, + 5, 32, 21, 0x00f8000000f800LL, + 6, 64, 22, 0x00fc0000000000LL, + 6, 32, 22, 0x00fc000000fc00LL, + 7, 64, 23, 0x00fe0000000000LL, + 7, 32, 23, 0x00fe000000fe00LL, + 8, 64, 24, 0x00ff0000000000LL, + 8, 32, 24, 0x00ff000000ff00LL, + 9, 64, 25, 0x00ff8000000000LL, + 9, 32, 25, 0x00ff800000ff80LL, + 10, 64, 26, 0x00ffc000000000LL, + 10, 32, 26, 0x00ffc00000ffc0LL, + 11, 64, 27, 0x00ffe000000000LL, + 11, 32, 27, 0x00ffe00000ffe0LL, + 12, 64, 28, 0x00fff000000000LL, + 12, 32, 28, 0x00fff00000fff0LL, + 13, 64, 29, 0x00fff800000000LL, + 13, 32, 29, 0x00fff80000fff8LL, + 14, 64, 30, 0x00fffc00000000LL, + 14, 32, 30, 0x00fffc0000fffcLL, + 15, 64, 31, 0x00fffe00000000LL, + 15, 32, 31, 0x00fffe0000fffeLL, + 16, 64, 32, 0x00ffff00000000LL, + 16, 32, 0, 0x00ffff0000ffffLL, + 17, 64, 33, 0x00ffff80000000LL, + 18, 64, 34, 0x00ffffc0000000LL, + 19, 64, 35, 0x00ffffe0000000LL, + 20, 64, 36, 0x00fffff0000000LL, + 21, 64, 37, 0x00fffff8000000LL, + 22, 64, 38, 0x00fffffc000000LL, + 23, 64, 39, 0x00fffffe000000LL, + 24, 64, 40, 0x00ffffff000000LL, + 25, 64, 41, 0x00ffffff800000LL, + 26, 64, 42, 0x00ffffffc00000LL, + 27, 64, 43, 0x00ffffffe00000LL, + 28, 64, 44, 0x00fffffff00000LL, + 29, 64, 45, 0x00fffffff80000LL, + 30, 64, 46, 0x00fffffffc0000LL, + 31, 64, 47, 0x00fffffffe0000LL, + 32, 64, 48, 0x00ffffffff0000LL, + 33, 64, 49, 0x00ffffffff8000LL, + 34, 64, 50, 0x00ffffffffc000LL, + 35, 64, 51, 0x00ffffffffe000LL, + 36, 64, 52, 0x00fffffffff000LL, + 37, 64, 53, 0x00fffffffff800LL, + 38, 64, 54, 0x00fffffffffc00LL, + 39, 64, 55, 0x00fffffffffe00LL, + 40, 64, 56, 0x00ffffffffff00LL, + 41, 64, 57, 0x00ffffffffff80LL, + 42, 64, 58, 0x00ffffffffffc0LL, + 43, 64, 59, 0x00ffffffffffe0LL, + 44, 64, 60, 0x00fffffffffff0LL, + 45, 64, 61, 0x00fffffffffff8LL, + 46, 64, 62, 0x00fffffffffffcLL, + 47, 64, 63, 0x00fffffffffffeLL, + 48, 64, 0, 0x00ffffffffffffLL, + 1, 64, 16, 0x01000000000000LL, + 1, 32, 16, 0x01000000010000LL, + 1, 16, 0, 0x01000100010001LL, + 2, 64, 17, 0x01800000000000LL, + 2, 32, 17, 0x01800000018000LL, + 3, 64, 18, 0x01c00000000000LL, + 3, 32, 18, 0x01c0000001c000LL, + 4, 64, 19, 0x01e00000000000LL, + 4, 32, 19, 0x01e0000001e000LL, + 5, 64, 20, 0x01f00000000000LL, + 5, 32, 20, 0x01f0000001f000LL, + 6, 64, 21, 0x01f80000000000LL, + 6, 32, 21, 0x01f8000001f800LL, + 7, 64, 22, 0x01fc0000000000LL, + 7, 32, 22, 0x01fc000001fc00LL, + 8, 64, 23, 0x01fe0000000000LL, + 8, 32, 23, 0x01fe000001fe00LL, + 9, 64, 24, 0x01ff0000000000LL, + 9, 32, 24, 0x01ff000001ff00LL, + 10, 64, 25, 0x01ff8000000000LL, + 10, 32, 25, 0x01ff800001ff80LL, + 11, 64, 26, 0x01ffc000000000LL, + 11, 32, 26, 0x01ffc00001ffc0LL, + 12, 64, 27, 0x01ffe000000000LL, + 12, 32, 27, 0x01ffe00001ffe0LL, + 13, 64, 28, 0x01fff000000000LL, + 13, 32, 28, 0x01fff00001fff0LL, + 14, 64, 29, 0x01fff800000000LL, + 14, 32, 29, 0x01fff80001fff8LL, + 15, 64, 30, 0x01fffc00000000LL, + 15, 32, 30, 0x01fffc0001fffcLL, + 16, 64, 31, 0x01fffe00000000LL, + 16, 32, 31, 0x01fffe0001fffeLL, + 17, 64, 32, 0x01ffff00000000LL, + 17, 32, 0, 0x01ffff0001ffffLL, + 18, 64, 33, 0x01ffff80000000LL, + 19, 64, 34, 0x01ffffc0000000LL, + 20, 64, 35, 0x01ffffe0000000LL, + 21, 64, 36, 0x01fffff0000000LL, + 22, 64, 37, 0x01fffff8000000LL, + 23, 64, 38, 0x01fffffc000000LL, + 24, 64, 39, 0x01fffffe000000LL, + 25, 64, 40, 0x01ffffff000000LL, + 26, 64, 41, 0x01ffffff800000LL, + 27, 64, 42, 0x01ffffffc00000LL, + 28, 64, 43, 0x01ffffffe00000LL, + 29, 64, 44, 0x01fffffff00000LL, + 30, 64, 45, 0x01fffffff80000LL, + 31, 64, 46, 0x01fffffffc0000LL, + 32, 64, 47, 0x01fffffffe0000LL, + 33, 64, 48, 0x01ffffffff0000LL, + 34, 64, 49, 0x01ffffffff8000LL, + 35, 64, 50, 0x01ffffffffc000LL, + 36, 64, 51, 0x01ffffffffe000LL, + 37, 64, 52, 0x01fffffffff000LL, + 38, 64, 53, 0x01fffffffff800LL, + 39, 64, 54, 0x01fffffffffc00LL, + 40, 64, 55, 0x01fffffffffe00LL, + 41, 64, 56, 0x01ffffffffff00LL, + 42, 64, 57, 0x01ffffffffff80LL, + 43, 64, 58, 0x01ffffffffffc0LL, + 44, 64, 59, 0x01ffffffffffe0LL, + 45, 64, 60, 0x01fffffffffff0LL, + 46, 64, 61, 0x01fffffffffff8LL, + 47, 64, 62, 0x01fffffffffffcLL, + 48, 64, 63, 0x01fffffffffffeLL, + 49, 64, 0, 0x01ffffffffffffLL, + 1, 64, 15, 0x02000000000000LL, + 1, 32, 15, 0x02000000020000LL, + 1, 16, 15, 0x02000200020002LL, + 2, 64, 16, 0x03000000000000LL, + 2, 32, 16, 0x03000000030000LL, + 2, 16, 0, 0x03000300030003LL, + 3, 64, 17, 0x03800000000000LL, + 3, 32, 17, 0x03800000038000LL, + 4, 64, 18, 0x03c00000000000LL, + 4, 32, 18, 0x03c0000003c000LL, + 5, 64, 19, 0x03e00000000000LL, + 5, 32, 19, 0x03e0000003e000LL, + 6, 64, 20, 0x03f00000000000LL, + 6, 32, 20, 0x03f0000003f000LL, + 7, 64, 21, 0x03f80000000000LL, + 7, 32, 21, 0x03f8000003f800LL, + 8, 64, 22, 0x03fc0000000000LL, + 8, 32, 22, 0x03fc000003fc00LL, + 9, 64, 23, 0x03fe0000000000LL, + 9, 32, 23, 0x03fe000003fe00LL, + 10, 64, 24, 0x03ff0000000000LL, + 10, 32, 24, 0x03ff000003ff00LL, + 11, 64, 25, 0x03ff8000000000LL, + 11, 32, 25, 0x03ff800003ff80LL, + 12, 64, 26, 0x03ffc000000000LL, + 12, 32, 26, 0x03ffc00003ffc0LL, + 13, 64, 27, 0x03ffe000000000LL, + 13, 32, 27, 0x03ffe00003ffe0LL, + 14, 64, 28, 0x03fff000000000LL, + 14, 32, 28, 0x03fff00003fff0LL, + 15, 64, 29, 0x03fff800000000LL, + 15, 32, 29, 0x03fff80003fff8LL, + 16, 64, 30, 0x03fffc00000000LL, + 16, 32, 30, 0x03fffc0003fffcLL, + 17, 64, 31, 0x03fffe00000000LL, + 17, 32, 31, 0x03fffe0003fffeLL, + 18, 64, 32, 0x03ffff00000000LL, + 18, 32, 0, 0x03ffff0003ffffLL, + 19, 64, 33, 0x03ffff80000000LL, + 20, 64, 34, 0x03ffffc0000000LL, + 21, 64, 35, 0x03ffffe0000000LL, + 22, 64, 36, 0x03fffff0000000LL, + 23, 64, 37, 0x03fffff8000000LL, + 24, 64, 38, 0x03fffffc000000LL, + 25, 64, 39, 0x03fffffe000000LL, + 26, 64, 40, 0x03ffffff000000LL, + 27, 64, 41, 0x03ffffff800000LL, + 28, 64, 42, 0x03ffffffc00000LL, + 29, 64, 43, 0x03ffffffe00000LL, + 30, 64, 44, 0x03fffffff00000LL, + 31, 64, 45, 0x03fffffff80000LL, + 32, 64, 46, 0x03fffffffc0000LL, + 33, 64, 47, 0x03fffffffe0000LL, + 34, 64, 48, 0x03ffffffff0000LL, + 35, 64, 49, 0x03ffffffff8000LL, + 36, 64, 50, 0x03ffffffffc000LL, + 37, 64, 51, 0x03ffffffffe000LL, + 38, 64, 52, 0x03fffffffff000LL, + 39, 64, 53, 0x03fffffffff800LL, + 40, 64, 54, 0x03fffffffffc00LL, + 41, 64, 55, 0x03fffffffffe00LL, + 42, 64, 56, 0x03ffffffffff00LL, + 43, 64, 57, 0x03ffffffffff80LL, + 44, 64, 58, 0x03ffffffffffc0LL, + 45, 64, 59, 0x03ffffffffffe0LL, + 46, 64, 60, 0x03fffffffffff0LL, + 47, 64, 61, 0x03fffffffffff8LL, + 48, 64, 62, 0x03fffffffffffcLL, + 49, 64, 63, 0x03fffffffffffeLL, + 50, 64, 0, 0x03ffffffffffffLL, + 1, 64, 14, 0x04000000000000LL, + 1, 32, 14, 0x04000000040000LL, + 1, 16, 14, 0x04000400040004LL, + 2, 64, 15, 0x06000000000000LL, + 2, 32, 15, 0x06000000060000LL, + 2, 16, 15, 0x06000600060006LL, + 3, 64, 16, 0x07000000000000LL, + 3, 32, 16, 0x07000000070000LL, + 3, 16, 0, 0x07000700070007LL, + 4, 64, 17, 0x07800000000000LL, + 4, 32, 17, 0x07800000078000LL, + 5, 64, 18, 0x07c00000000000LL, + 5, 32, 18, 0x07c0000007c000LL, + 6, 64, 19, 0x07e00000000000LL, + 6, 32, 19, 0x07e0000007e000LL, + 7, 64, 20, 0x07f00000000000LL, + 7, 32, 20, 0x07f0000007f000LL, + 8, 64, 21, 0x07f80000000000LL, + 8, 32, 21, 0x07f8000007f800LL, + 9, 64, 22, 0x07fc0000000000LL, + 9, 32, 22, 0x07fc000007fc00LL, + 10, 64, 23, 0x07fe0000000000LL, + 10, 32, 23, 0x07fe000007fe00LL, + 11, 64, 24, 0x07ff0000000000LL, + 11, 32, 24, 0x07ff000007ff00LL, + 12, 64, 25, 0x07ff8000000000LL, + 12, 32, 25, 0x07ff800007ff80LL, + 13, 64, 26, 0x07ffc000000000LL, + 13, 32, 26, 0x07ffc00007ffc0LL, + 14, 64, 27, 0x07ffe000000000LL, + 14, 32, 27, 0x07ffe00007ffe0LL, + 15, 64, 28, 0x07fff000000000LL, + 15, 32, 28, 0x07fff00007fff0LL, + 16, 64, 29, 0x07fff800000000LL, + 16, 32, 29, 0x07fff80007fff8LL, + 17, 64, 30, 0x07fffc00000000LL, + 17, 32, 30, 0x07fffc0007fffcLL, + 18, 64, 31, 0x07fffe00000000LL, + 18, 32, 31, 0x07fffe0007fffeLL, + 19, 64, 32, 0x07ffff00000000LL, + 19, 32, 0, 0x07ffff0007ffffLL, + 20, 64, 33, 0x07ffff80000000LL, + 21, 64, 34, 0x07ffffc0000000LL, + 22, 64, 35, 0x07ffffe0000000LL, + 23, 64, 36, 0x07fffff0000000LL, + 24, 64, 37, 0x07fffff8000000LL, + 25, 64, 38, 0x07fffffc000000LL, + 26, 64, 39, 0x07fffffe000000LL, + 27, 64, 40, 0x07ffffff000000LL, + 28, 64, 41, 0x07ffffff800000LL, + 29, 64, 42, 0x07ffffffc00000LL, + 30, 64, 43, 0x07ffffffe00000LL, + 31, 64, 44, 0x07fffffff00000LL, + 32, 64, 45, 0x07fffffff80000LL, + 33, 64, 46, 0x07fffffffc0000LL, + 34, 64, 47, 0x07fffffffe0000LL, + 35, 64, 48, 0x07ffffffff0000LL, + 36, 64, 49, 0x07ffffffff8000LL, + 37, 64, 50, 0x07ffffffffc000LL, + 38, 64, 51, 0x07ffffffffe000LL, + 39, 64, 52, 0x07fffffffff000LL, + 40, 64, 53, 0x07fffffffff800LL, + 41, 64, 54, 0x07fffffffffc00LL, + 42, 64, 55, 0x07fffffffffe00LL, + 43, 64, 56, 0x07ffffffffff00LL, + 44, 64, 57, 0x07ffffffffff80LL, + 45, 64, 58, 0x07ffffffffffc0LL, + 46, 64, 59, 0x07ffffffffffe0LL, + 47, 64, 60, 0x07fffffffffff0LL, + 48, 64, 61, 0x07fffffffffff8LL, + 49, 64, 62, 0x07fffffffffffcLL, + 50, 64, 63, 0x07fffffffffffeLL, + 51, 64, 0, 0x07ffffffffffffLL, + 1, 64, 13, 0x08000000000000LL, + 1, 32, 13, 0x08000000080000LL, + 1, 16, 13, 0x08000800080008LL, + 2, 64, 14, 0x0c000000000000LL, + 2, 32, 14, 0x0c0000000c0000LL, + 2, 16, 14, 0x0c000c000c000cLL, + 3, 64, 15, 0x0e000000000000LL, + 3, 32, 15, 0x0e0000000e0000LL, + 3, 16, 15, 0x0e000e000e000eLL, + 4, 64, 16, 0x0f000000000000LL, + 4, 32, 16, 0x0f0000000f0000LL, + 4, 16, 0, 0x0f000f000f000fLL, + 5, 64, 17, 0x0f800000000000LL, + 5, 32, 17, 0x0f8000000f8000LL, + 6, 64, 18, 0x0fc00000000000LL, + 6, 32, 18, 0x0fc000000fc000LL, + 7, 64, 19, 0x0fe00000000000LL, + 7, 32, 19, 0x0fe000000fe000LL, + 8, 64, 20, 0x0ff00000000000LL, + 8, 32, 20, 0x0ff000000ff000LL, + 9, 64, 21, 0x0ff80000000000LL, + 9, 32, 21, 0x0ff800000ff800LL, + 10, 64, 22, 0x0ffc0000000000LL, + 10, 32, 22, 0x0ffc00000ffc00LL, + 11, 64, 23, 0x0ffe0000000000LL, + 11, 32, 23, 0x0ffe00000ffe00LL, + 12, 64, 24, 0x0fff0000000000LL, + 12, 32, 24, 0x0fff00000fff00LL, + 13, 64, 25, 0x0fff8000000000LL, + 13, 32, 25, 0x0fff80000fff80LL, + 14, 64, 26, 0x0fffc000000000LL, + 14, 32, 26, 0x0fffc0000fffc0LL, + 15, 64, 27, 0x0fffe000000000LL, + 15, 32, 27, 0x0fffe0000fffe0LL, + 16, 64, 28, 0x0ffff000000000LL, + 16, 32, 28, 0x0ffff0000ffff0LL, + 17, 64, 29, 0x0ffff800000000LL, + 17, 32, 29, 0x0ffff8000ffff8LL, + 18, 64, 30, 0x0ffffc00000000LL, + 18, 32, 30, 0x0ffffc000ffffcLL, + 19, 64, 31, 0x0ffffe00000000LL, + 19, 32, 31, 0x0ffffe000ffffeLL, + 20, 64, 32, 0x0fffff00000000LL, + 20, 32, 0, 0x0fffff000fffffLL, + 21, 64, 33, 0x0fffff80000000LL, + 22, 64, 34, 0x0fffffc0000000LL, + 23, 64, 35, 0x0fffffe0000000LL, + 24, 64, 36, 0x0ffffff0000000LL, + 25, 64, 37, 0x0ffffff8000000LL, + 26, 64, 38, 0x0ffffffc000000LL, + 27, 64, 39, 0x0ffffffe000000LL, + 28, 64, 40, 0x0fffffff000000LL, + 29, 64, 41, 0x0fffffff800000LL, + 30, 64, 42, 0x0fffffffc00000LL, + 31, 64, 43, 0x0fffffffe00000LL, + 32, 64, 44, 0x0ffffffff00000LL, + 33, 64, 45, 0x0ffffffff80000LL, + 34, 64, 46, 0x0ffffffffc0000LL, + 35, 64, 47, 0x0ffffffffe0000LL, + 36, 64, 48, 0x0fffffffff0000LL, + 37, 64, 49, 0x0fffffffff8000LL, + 38, 64, 50, 0x0fffffffffc000LL, + 39, 64, 51, 0x0fffffffffe000LL, + 40, 64, 52, 0x0ffffffffff000LL, + 41, 64, 53, 0x0ffffffffff800LL, + 42, 64, 54, 0x0ffffffffffc00LL, + 43, 64, 55, 0x0ffffffffffe00LL, + 44, 64, 56, 0x0fffffffffff00LL, + 45, 64, 57, 0x0fffffffffff80LL, + 46, 64, 58, 0x0fffffffffffc0LL, + 47, 64, 59, 0x0fffffffffffe0LL, + 48, 64, 60, 0x0ffffffffffff0LL, + 49, 64, 61, 0x0ffffffffffff8LL, + 50, 64, 62, 0x0ffffffffffffcLL, + 51, 64, 63, 0x0ffffffffffffeLL, + 52, 64, 0, 0x0fffffffffffffLL, + 1, 64, 12, 0x10000000000000LL, + 1, 32, 12, 0x10000000100000LL, + 1, 16, 12, 0x10001000100010LL, + 2, 64, 13, 0x18000000000000LL, + 2, 32, 13, 0x18000000180000LL, + 2, 16, 13, 0x18001800180018LL, + 3, 64, 14, 0x1c000000000000LL, + 3, 32, 14, 0x1c0000001c0000LL, + 3, 16, 14, 0x1c001c001c001cLL, + 4, 64, 15, 0x1e000000000000LL, + 4, 32, 15, 0x1e0000001e0000LL, + 4, 16, 15, 0x1e001e001e001eLL, + 5, 64, 16, 0x1f000000000000LL, + 5, 32, 16, 0x1f0000001f0000LL, + 5, 16, 0, 0x1f001f001f001fLL, + 6, 64, 17, 0x1f800000000000LL, + 6, 32, 17, 0x1f8000001f8000LL, + 7, 64, 18, 0x1fc00000000000LL, + 7, 32, 18, 0x1fc000001fc000LL, + 8, 64, 19, 0x1fe00000000000LL, + 8, 32, 19, 0x1fe000001fe000LL, + 9, 64, 20, 0x1ff00000000000LL, + 9, 32, 20, 0x1ff000001ff000LL, + 10, 64, 21, 0x1ff80000000000LL, + 10, 32, 21, 0x1ff800001ff800LL, + 11, 64, 22, 0x1ffc0000000000LL, + 11, 32, 22, 0x1ffc00001ffc00LL, + 12, 64, 23, 0x1ffe0000000000LL, + 12, 32, 23, 0x1ffe00001ffe00LL, + 13, 64, 24, 0x1fff0000000000LL, + 13, 32, 24, 0x1fff00001fff00LL, + 14, 64, 25, 0x1fff8000000000LL, + 14, 32, 25, 0x1fff80001fff80LL, + 15, 64, 26, 0x1fffc000000000LL, + 15, 32, 26, 0x1fffc0001fffc0LL, + 16, 64, 27, 0x1fffe000000000LL, + 16, 32, 27, 0x1fffe0001fffe0LL, + 17, 64, 28, 0x1ffff000000000LL, + 17, 32, 28, 0x1ffff0001ffff0LL, + 18, 64, 29, 0x1ffff800000000LL, + 18, 32, 29, 0x1ffff8001ffff8LL, + 19, 64, 30, 0x1ffffc00000000LL, + 19, 32, 30, 0x1ffffc001ffffcLL, + 20, 64, 31, 0x1ffffe00000000LL, + 20, 32, 31, 0x1ffffe001ffffeLL, + 21, 64, 32, 0x1fffff00000000LL, + 21, 32, 0, 0x1fffff001fffffLL, + 22, 64, 33, 0x1fffff80000000LL, + 23, 64, 34, 0x1fffffc0000000LL, + 24, 64, 35, 0x1fffffe0000000LL, + 25, 64, 36, 0x1ffffff0000000LL, + 26, 64, 37, 0x1ffffff8000000LL, + 27, 64, 38, 0x1ffffffc000000LL, + 28, 64, 39, 0x1ffffffe000000LL, + 29, 64, 40, 0x1fffffff000000LL, + 30, 64, 41, 0x1fffffff800000LL, + 31, 64, 42, 0x1fffffffc00000LL, + 32, 64, 43, 0x1fffffffe00000LL, + 33, 64, 44, 0x1ffffffff00000LL, + 34, 64, 45, 0x1ffffffff80000LL, + 35, 64, 46, 0x1ffffffffc0000LL, + 36, 64, 47, 0x1ffffffffe0000LL, + 37, 64, 48, 0x1fffffffff0000LL, + 38, 64, 49, 0x1fffffffff8000LL, + 39, 64, 50, 0x1fffffffffc000LL, + 40, 64, 51, 0x1fffffffffe000LL, + 41, 64, 52, 0x1ffffffffff000LL, + 42, 64, 53, 0x1ffffffffff800LL, + 43, 64, 54, 0x1ffffffffffc00LL, + 44, 64, 55, 0x1ffffffffffe00LL, + 45, 64, 56, 0x1fffffffffff00LL, + 46, 64, 57, 0x1fffffffffff80LL, + 47, 64, 58, 0x1fffffffffffc0LL, + 48, 64, 59, 0x1fffffffffffe0LL, + 49, 64, 60, 0x1ffffffffffff0LL, + 50, 64, 61, 0x1ffffffffffff8LL, + 51, 64, 62, 0x1ffffffffffffcLL, + 52, 64, 63, 0x1ffffffffffffeLL, + 53, 64, 0, 0x1fffffffffffffLL, + 1, 64, 11, 0x20000000000000LL, + 1, 32, 11, 0x20000000200000LL, + 1, 16, 11, 0x20002000200020LL, + 2, 64, 12, 0x30000000000000LL, + 2, 32, 12, 0x30000000300000LL, + 2, 16, 12, 0x30003000300030LL, + 3, 64, 13, 0x38000000000000LL, + 3, 32, 13, 0x38000000380000LL, + 3, 16, 13, 0x38003800380038LL, + 4, 64, 14, 0x3c000000000000LL, + 4, 32, 14, 0x3c0000003c0000LL, + 4, 16, 14, 0x3c003c003c003cLL, + 5, 64, 15, 0x3e000000000000LL, + 5, 32, 15, 0x3e0000003e0000LL, + 5, 16, 15, 0x3e003e003e003eLL, + 6, 64, 16, 0x3f000000000000LL, + 6, 32, 16, 0x3f0000003f0000LL, + 6, 16, 0, 0x3f003f003f003fLL, + 7, 64, 17, 0x3f800000000000LL, + 7, 32, 17, 0x3f8000003f8000LL, + 8, 64, 18, 0x3fc00000000000LL, + 8, 32, 18, 0x3fc000003fc000LL, + 9, 64, 19, 0x3fe00000000000LL, + 9, 32, 19, 0x3fe000003fe000LL, + 10, 64, 20, 0x3ff00000000000LL, + 10, 32, 20, 0x3ff000003ff000LL, + 11, 64, 21, 0x3ff80000000000LL, + 11, 32, 21, 0x3ff800003ff800LL, + 12, 64, 22, 0x3ffc0000000000LL, + 12, 32, 22, 0x3ffc00003ffc00LL, + 13, 64, 23, 0x3ffe0000000000LL, + 13, 32, 23, 0x3ffe00003ffe00LL, + 14, 64, 24, 0x3fff0000000000LL, + 14, 32, 24, 0x3fff00003fff00LL, + 15, 64, 25, 0x3fff8000000000LL, + 15, 32, 25, 0x3fff80003fff80LL, + 16, 64, 26, 0x3fffc000000000LL, + 16, 32, 26, 0x3fffc0003fffc0LL, + 17, 64, 27, 0x3fffe000000000LL, + 17, 32, 27, 0x3fffe0003fffe0LL, + 18, 64, 28, 0x3ffff000000000LL, + 18, 32, 28, 0x3ffff0003ffff0LL, + 19, 64, 29, 0x3ffff800000000LL, + 19, 32, 29, 0x3ffff8003ffff8LL, + 20, 64, 30, 0x3ffffc00000000LL, + 20, 32, 30, 0x3ffffc003ffffcLL, + 21, 64, 31, 0x3ffffe00000000LL, + 21, 32, 31, 0x3ffffe003ffffeLL, + 22, 64, 32, 0x3fffff00000000LL, + 22, 32, 0, 0x3fffff003fffffLL, + 23, 64, 33, 0x3fffff80000000LL, + 24, 64, 34, 0x3fffffc0000000LL, + 25, 64, 35, 0x3fffffe0000000LL, + 26, 64, 36, 0x3ffffff0000000LL, + 27, 64, 37, 0x3ffffff8000000LL, + 28, 64, 38, 0x3ffffffc000000LL, + 29, 64, 39, 0x3ffffffe000000LL, + 30, 64, 40, 0x3fffffff000000LL, + 31, 64, 41, 0x3fffffff800000LL, + 32, 64, 42, 0x3fffffffc00000LL, + 33, 64, 43, 0x3fffffffe00000LL, + 34, 64, 44, 0x3ffffffff00000LL, + 35, 64, 45, 0x3ffffffff80000LL, + 36, 64, 46, 0x3ffffffffc0000LL, + 37, 64, 47, 0x3ffffffffe0000LL, + 38, 64, 48, 0x3fffffffff0000LL, + 39, 64, 49, 0x3fffffffff8000LL, + 40, 64, 50, 0x3fffffffffc000LL, + 41, 64, 51, 0x3fffffffffe000LL, + 42, 64, 52, 0x3ffffffffff000LL, + 43, 64, 53, 0x3ffffffffff800LL, + 44, 64, 54, 0x3ffffffffffc00LL, + 45, 64, 55, 0x3ffffffffffe00LL, + 46, 64, 56, 0x3fffffffffff00LL, + 47, 64, 57, 0x3fffffffffff80LL, + 48, 64, 58, 0x3fffffffffffc0LL, + 49, 64, 59, 0x3fffffffffffe0LL, + 50, 64, 60, 0x3ffffffffffff0LL, + 51, 64, 61, 0x3ffffffffffff8LL, + 52, 64, 62, 0x3ffffffffffffcLL, + 53, 64, 63, 0x3ffffffffffffeLL, + 54, 64, 0, 0x3fffffffffffffLL, + 1, 64, 10, 0x40000000000000LL, + 1, 32, 10, 0x40000000400000LL, + 1, 16, 10, 0x40004000400040LL, + 2, 64, 11, 0x60000000000000LL, + 2, 32, 11, 0x60000000600000LL, + 2, 16, 11, 0x60006000600060LL, + 3, 64, 12, 0x70000000000000LL, + 3, 32, 12, 0x70000000700000LL, + 3, 16, 12, 0x70007000700070LL, + 4, 64, 13, 0x78000000000000LL, + 4, 32, 13, 0x78000000780000LL, + 4, 16, 13, 0x78007800780078LL, + 5, 64, 14, 0x7c000000000000LL, + 5, 32, 14, 0x7c0000007c0000LL, + 5, 16, 14, 0x7c007c007c007cLL, + 6, 64, 15, 0x7e000000000000LL, + 6, 32, 15, 0x7e0000007e0000LL, + 6, 16, 15, 0x7e007e007e007eLL, + 7, 64, 16, 0x7f000000000000LL, + 7, 32, 16, 0x7f0000007f0000LL, + 7, 16, 0, 0x7f007f007f007fLL, + 8, 64, 17, 0x7f800000000000LL, + 8, 32, 17, 0x7f8000007f8000LL, + 9, 64, 18, 0x7fc00000000000LL, + 9, 32, 18, 0x7fc000007fc000LL, + 10, 64, 19, 0x7fe00000000000LL, + 10, 32, 19, 0x7fe000007fe000LL, + 11, 64, 20, 0x7ff00000000000LL, + 11, 32, 20, 0x7ff000007ff000LL, + 12, 64, 21, 0x7ff80000000000LL, + 12, 32, 21, 0x7ff800007ff800LL, + 13, 64, 22, 0x7ffc0000000000LL, + 13, 32, 22, 0x7ffc00007ffc00LL, + 14, 64, 23, 0x7ffe0000000000LL, + 14, 32, 23, 0x7ffe00007ffe00LL, + 15, 64, 24, 0x7fff0000000000LL, + 15, 32, 24, 0x7fff00007fff00LL, + 16, 64, 25, 0x7fff8000000000LL, + 16, 32, 25, 0x7fff80007fff80LL, + 17, 64, 26, 0x7fffc000000000LL, + 17, 32, 26, 0x7fffc0007fffc0LL, + 18, 64, 27, 0x7fffe000000000LL, + 18, 32, 27, 0x7fffe0007fffe0LL, + 19, 64, 28, 0x7ffff000000000LL, + 19, 32, 28, 0x7ffff0007ffff0LL, + 20, 64, 29, 0x7ffff800000000LL, + 20, 32, 29, 0x7ffff8007ffff8LL, + 21, 64, 30, 0x7ffffc00000000LL, + 21, 32, 30, 0x7ffffc007ffffcLL, + 22, 64, 31, 0x7ffffe00000000LL, + 22, 32, 31, 0x7ffffe007ffffeLL, + 23, 64, 32, 0x7fffff00000000LL, + 23, 32, 0, 0x7fffff007fffffLL, + 24, 64, 33, 0x7fffff80000000LL, + 25, 64, 34, 0x7fffffc0000000LL, + 26, 64, 35, 0x7fffffe0000000LL, + 27, 64, 36, 0x7ffffff0000000LL, + 28, 64, 37, 0x7ffffff8000000LL, + 29, 64, 38, 0x7ffffffc000000LL, + 30, 64, 39, 0x7ffffffe000000LL, + 31, 64, 40, 0x7fffffff000000LL, + 32, 64, 41, 0x7fffffff800000LL, + 33, 64, 42, 0x7fffffffc00000LL, + 34, 64, 43, 0x7fffffffe00000LL, + 35, 64, 44, 0x7ffffffff00000LL, + 36, 64, 45, 0x7ffffffff80000LL, + 37, 64, 46, 0x7ffffffffc0000LL, + 38, 64, 47, 0x7ffffffffe0000LL, + 39, 64, 48, 0x7fffffffff0000LL, + 40, 64, 49, 0x7fffffffff8000LL, + 41, 64, 50, 0x7fffffffffc000LL, + 42, 64, 51, 0x7fffffffffe000LL, + 43, 64, 52, 0x7ffffffffff000LL, + 44, 64, 53, 0x7ffffffffff800LL, + 45, 64, 54, 0x7ffffffffffc00LL, + 46, 64, 55, 0x7ffffffffffe00LL, + 47, 64, 56, 0x7fffffffffff00LL, + 48, 64, 57, 0x7fffffffffff80LL, + 49, 64, 58, 0x7fffffffffffc0LL, + 50, 64, 59, 0x7fffffffffffe0LL, + 51, 64, 60, 0x7ffffffffffff0LL, + 52, 64, 61, 0x7ffffffffffff8LL, + 53, 64, 62, 0x7ffffffffffffcLL, + 54, 64, 63, 0x7ffffffffffffeLL, + 55, 64, 0, 0x7fffffffffffffLL, + 1, 64, 9, 0x80000000000000LL, + 1, 32, 9, 0x80000000800000LL, + 1, 16, 9, 0x80008000800080LL, + 2, 64, 10, 0xc0000000000000LL, + 2, 32, 10, 0xc0000000c00000LL, + 2, 16, 10, 0xc000c000c000c0LL, + 3, 64, 11, 0xe0000000000000LL, + 3, 32, 11, 0xe0000000e00000LL, + 3, 16, 11, 0xe000e000e000e0LL, + 4, 64, 12, 0xf0000000000000LL, + 4, 32, 12, 0xf0000000f00000LL, + 4, 16, 12, 0xf000f000f000f0LL, + 5, 64, 13, 0xf8000000000000LL, + 5, 32, 13, 0xf8000000f80000LL, + 5, 16, 13, 0xf800f800f800f8LL, + 6, 64, 14, 0xfc000000000000LL, + 6, 32, 14, 0xfc000000fc0000LL, + 6, 16, 14, 0xfc00fc00fc00fcLL, + 7, 64, 15, 0xfe000000000000LL, + 7, 32, 15, 0xfe000000fe0000LL, + 7, 16, 15, 0xfe00fe00fe00feLL, + 8, 64, 16, 0xff000000000000LL, + 8, 32, 16, 0xff000000ff0000LL, + 8, 16, 0, 0xff00ff00ff00ffLL, + 9, 64, 17, 0xff800000000000LL, + 9, 32, 17, 0xff800000ff8000LL, + 10, 64, 18, 0xffc00000000000LL, + 10, 32, 18, 0xffc00000ffc000LL, + 11, 64, 19, 0xffe00000000000LL, + 11, 32, 19, 0xffe00000ffe000LL, + 12, 64, 20, 0xfff00000000000LL, + 12, 32, 20, 0xfff00000fff000LL, + 13, 64, 21, 0xfff80000000000LL, + 13, 32, 21, 0xfff80000fff800LL, + 14, 64, 22, 0xfffc0000000000LL, + 14, 32, 22, 0xfffc0000fffc00LL, + 15, 64, 23, 0xfffe0000000000LL, + 15, 32, 23, 0xfffe0000fffe00LL, + 16, 64, 24, 0xffff0000000000LL, + 16, 32, 24, 0xffff0000ffff00LL, + 17, 64, 25, 0xffff8000000000LL, + 17, 32, 25, 0xffff8000ffff80LL, + 18, 64, 26, 0xffffc000000000LL, + 18, 32, 26, 0xffffc000ffffc0LL, + 19, 64, 27, 0xffffe000000000LL, + 19, 32, 27, 0xffffe000ffffe0LL, + 20, 64, 28, 0xfffff000000000LL, + 20, 32, 28, 0xfffff000fffff0LL, + 21, 64, 29, 0xfffff800000000LL, + 21, 32, 29, 0xfffff800fffff8LL, + 22, 64, 30, 0xfffffc00000000LL, + 22, 32, 30, 0xfffffc00fffffcLL, + 23, 64, 31, 0xfffffe00000000LL, + 23, 32, 31, 0xfffffe00fffffeLL, + 24, 64, 32, 0xffffff00000000LL, + 24, 32, 0, 0xffffff00ffffffLL, + 25, 64, 33, 0xffffff80000000LL, + 26, 64, 34, 0xffffffc0000000LL, + 27, 64, 35, 0xffffffe0000000LL, + 28, 64, 36, 0xfffffff0000000LL, + 29, 64, 37, 0xfffffff8000000LL, + 30, 64, 38, 0xfffffffc000000LL, + 31, 64, 39, 0xfffffffe000000LL, + 32, 64, 40, 0xffffffff000000LL, + 33, 64, 41, 0xffffffff800000LL, + 34, 64, 42, 0xffffffffc00000LL, + 35, 64, 43, 0xffffffffe00000LL, + 36, 64, 44, 0xfffffffff00000LL, + 37, 64, 45, 0xfffffffff80000LL, + 38, 64, 46, 0xfffffffffc0000LL, + 39, 64, 47, 0xfffffffffe0000LL, + 40, 64, 48, 0xffffffffff0000LL, + 41, 64, 49, 0xffffffffff8000LL, + 42, 64, 50, 0xffffffffffc000LL, + 43, 64, 51, 0xffffffffffe000LL, + 44, 64, 52, 0xfffffffffff000LL, + 45, 64, 53, 0xfffffffffff800LL, + 46, 64, 54, 0xfffffffffffc00LL, + 47, 64, 55, 0xfffffffffffe00LL, + 48, 64, 56, 0xffffffffffff00LL, + 49, 64, 57, 0xffffffffffff80LL, + 50, 64, 58, 0xffffffffffffc0LL, + 51, 64, 59, 0xffffffffffffe0LL, + 52, 64, 60, 0xfffffffffffff0LL, + 53, 64, 61, 0xfffffffffffff8LL, + 54, 64, 62, 0xfffffffffffffcLL, + 55, 64, 63, 0xfffffffffffffeLL, + 56, 64, 0, 0xffffffffffffffLL, + 1, 64, 8, 0x100000000000000LL, + 1, 32, 8, 0x100000001000000LL, + 1, 16, 8, 0x100010001000100LL, + 1, 8, 0, 0x101010101010101LL, + 2, 64, 9, 0x180000000000000LL, + 2, 32, 9, 0x180000001800000LL, + 2, 16, 9, 0x180018001800180LL, + 3, 64, 10, 0x1c0000000000000LL, + 3, 32, 10, 0x1c0000001c00000LL, + 3, 16, 10, 0x1c001c001c001c0LL, + 4, 64, 11, 0x1e0000000000000LL, + 4, 32, 11, 0x1e0000001e00000LL, + 4, 16, 11, 0x1e001e001e001e0LL, + 5, 64, 12, 0x1f0000000000000LL, + 5, 32, 12, 0x1f0000001f00000LL, + 5, 16, 12, 0x1f001f001f001f0LL, + 6, 64, 13, 0x1f8000000000000LL, + 6, 32, 13, 0x1f8000001f80000LL, + 6, 16, 13, 0x1f801f801f801f8LL, + 7, 64, 14, 0x1fc000000000000LL, + 7, 32, 14, 0x1fc000001fc0000LL, + 7, 16, 14, 0x1fc01fc01fc01fcLL, + 8, 64, 15, 0x1fe000000000000LL, + 8, 32, 15, 0x1fe000001fe0000LL, + 8, 16, 15, 0x1fe01fe01fe01feLL, + 9, 64, 16, 0x1ff000000000000LL, + 9, 32, 16, 0x1ff000001ff0000LL, + 9, 16, 0, 0x1ff01ff01ff01ffLL, + 10, 64, 17, 0x1ff800000000000LL, + 10, 32, 17, 0x1ff800001ff8000LL, + 11, 64, 18, 0x1ffc00000000000LL, + 11, 32, 18, 0x1ffc00001ffc000LL, + 12, 64, 19, 0x1ffe00000000000LL, + 12, 32, 19, 0x1ffe00001ffe000LL, + 13, 64, 20, 0x1fff00000000000LL, + 13, 32, 20, 0x1fff00001fff000LL, + 14, 64, 21, 0x1fff80000000000LL, + 14, 32, 21, 0x1fff80001fff800LL, + 15, 64, 22, 0x1fffc0000000000LL, + 15, 32, 22, 0x1fffc0001fffc00LL, + 16, 64, 23, 0x1fffe0000000000LL, + 16, 32, 23, 0x1fffe0001fffe00LL, + 17, 64, 24, 0x1ffff0000000000LL, + 17, 32, 24, 0x1ffff0001ffff00LL, + 18, 64, 25, 0x1ffff8000000000LL, + 18, 32, 25, 0x1ffff8001ffff80LL, + 19, 64, 26, 0x1ffffc000000000LL, + 19, 32, 26, 0x1ffffc001ffffc0LL, + 20, 64, 27, 0x1ffffe000000000LL, + 20, 32, 27, 0x1ffffe001ffffe0LL, + 21, 64, 28, 0x1fffff000000000LL, + 21, 32, 28, 0x1fffff001fffff0LL, + 22, 64, 29, 0x1fffff800000000LL, + 22, 32, 29, 0x1fffff801fffff8LL, + 23, 64, 30, 0x1fffffc00000000LL, + 23, 32, 30, 0x1fffffc01fffffcLL, + 24, 64, 31, 0x1fffffe00000000LL, + 24, 32, 31, 0x1fffffe01fffffeLL, + 25, 64, 32, 0x1ffffff00000000LL, + 25, 32, 0, 0x1ffffff01ffffffLL, + 26, 64, 33, 0x1ffffff80000000LL, + 27, 64, 34, 0x1ffffffc0000000LL, + 28, 64, 35, 0x1ffffffe0000000LL, + 29, 64, 36, 0x1fffffff0000000LL, + 30, 64, 37, 0x1fffffff8000000LL, + 31, 64, 38, 0x1fffffffc000000LL, + 32, 64, 39, 0x1fffffffe000000LL, + 33, 64, 40, 0x1ffffffff000000LL, + 34, 64, 41, 0x1ffffffff800000LL, + 35, 64, 42, 0x1ffffffffc00000LL, + 36, 64, 43, 0x1ffffffffe00000LL, + 37, 64, 44, 0x1fffffffff00000LL, + 38, 64, 45, 0x1fffffffff80000LL, + 39, 64, 46, 0x1fffffffffc0000LL, + 40, 64, 47, 0x1fffffffffe0000LL, + 41, 64, 48, 0x1ffffffffff0000LL, + 42, 64, 49, 0x1ffffffffff8000LL, + 43, 64, 50, 0x1ffffffffffc000LL, + 44, 64, 51, 0x1ffffffffffe000LL, + 45, 64, 52, 0x1fffffffffff000LL, + 46, 64, 53, 0x1fffffffffff800LL, + 47, 64, 54, 0x1fffffffffffc00LL, + 48, 64, 55, 0x1fffffffffffe00LL, + 49, 64, 56, 0x1ffffffffffff00LL, + 50, 64, 57, 0x1ffffffffffff80LL, + 51, 64, 58, 0x1ffffffffffffc0LL, + 52, 64, 59, 0x1ffffffffffffe0LL, + 53, 64, 60, 0x1fffffffffffff0LL, + 54, 64, 61, 0x1fffffffffffff8LL, + 55, 64, 62, 0x1fffffffffffffcLL, + 56, 64, 63, 0x1fffffffffffffeLL, + 57, 64, 0, 0x1ffffffffffffffLL, + 1, 64, 7, 0x200000000000000LL, + 1, 32, 7, 0x200000002000000LL, + 1, 16, 7, 0x200020002000200LL, + 1, 8, 7, 0x202020202020202LL, + 2, 64, 8, 0x300000000000000LL, + 2, 32, 8, 0x300000003000000LL, + 2, 16, 8, 0x300030003000300LL, + 2, 8, 0, 0x303030303030303LL, + 3, 64, 9, 0x380000000000000LL, + 3, 32, 9, 0x380000003800000LL, + 3, 16, 9, 0x380038003800380LL, + 4, 64, 10, 0x3c0000000000000LL, + 4, 32, 10, 0x3c0000003c00000LL, + 4, 16, 10, 0x3c003c003c003c0LL, + 5, 64, 11, 0x3e0000000000000LL, + 5, 32, 11, 0x3e0000003e00000LL, + 5, 16, 11, 0x3e003e003e003e0LL, + 6, 64, 12, 0x3f0000000000000LL, + 6, 32, 12, 0x3f0000003f00000LL, + 6, 16, 12, 0x3f003f003f003f0LL, + 7, 64, 13, 0x3f8000000000000LL, + 7, 32, 13, 0x3f8000003f80000LL, + 7, 16, 13, 0x3f803f803f803f8LL, + 8, 64, 14, 0x3fc000000000000LL, + 8, 32, 14, 0x3fc000003fc0000LL, + 8, 16, 14, 0x3fc03fc03fc03fcLL, + 9, 64, 15, 0x3fe000000000000LL, + 9, 32, 15, 0x3fe000003fe0000LL, + 9, 16, 15, 0x3fe03fe03fe03feLL, + 10, 64, 16, 0x3ff000000000000LL, + 10, 32, 16, 0x3ff000003ff0000LL, + 10, 16, 0, 0x3ff03ff03ff03ffLL, + 11, 64, 17, 0x3ff800000000000LL, + 11, 32, 17, 0x3ff800003ff8000LL, + 12, 64, 18, 0x3ffc00000000000LL, + 12, 32, 18, 0x3ffc00003ffc000LL, + 13, 64, 19, 0x3ffe00000000000LL, + 13, 32, 19, 0x3ffe00003ffe000LL, + 14, 64, 20, 0x3fff00000000000LL, + 14, 32, 20, 0x3fff00003fff000LL, + 15, 64, 21, 0x3fff80000000000LL, + 15, 32, 21, 0x3fff80003fff800LL, + 16, 64, 22, 0x3fffc0000000000LL, + 16, 32, 22, 0x3fffc0003fffc00LL, + 17, 64, 23, 0x3fffe0000000000LL, + 17, 32, 23, 0x3fffe0003fffe00LL, + 18, 64, 24, 0x3ffff0000000000LL, + 18, 32, 24, 0x3ffff0003ffff00LL, + 19, 64, 25, 0x3ffff8000000000LL, + 19, 32, 25, 0x3ffff8003ffff80LL, + 20, 64, 26, 0x3ffffc000000000LL, + 20, 32, 26, 0x3ffffc003ffffc0LL, + 21, 64, 27, 0x3ffffe000000000LL, + 21, 32, 27, 0x3ffffe003ffffe0LL, + 22, 64, 28, 0x3fffff000000000LL, + 22, 32, 28, 0x3fffff003fffff0LL, + 23, 64, 29, 0x3fffff800000000LL, + 23, 32, 29, 0x3fffff803fffff8LL, + 24, 64, 30, 0x3fffffc00000000LL, + 24, 32, 30, 0x3fffffc03fffffcLL, + 25, 64, 31, 0x3fffffe00000000LL, + 25, 32, 31, 0x3fffffe03fffffeLL, + 26, 64, 32, 0x3ffffff00000000LL, + 26, 32, 0, 0x3ffffff03ffffffLL, + 27, 64, 33, 0x3ffffff80000000LL, + 28, 64, 34, 0x3ffffffc0000000LL, + 29, 64, 35, 0x3ffffffe0000000LL, + 30, 64, 36, 0x3fffffff0000000LL, + 31, 64, 37, 0x3fffffff8000000LL, + 32, 64, 38, 0x3fffffffc000000LL, + 33, 64, 39, 0x3fffffffe000000LL, + 34, 64, 40, 0x3ffffffff000000LL, + 35, 64, 41, 0x3ffffffff800000LL, + 36, 64, 42, 0x3ffffffffc00000LL, + 37, 64, 43, 0x3ffffffffe00000LL, + 38, 64, 44, 0x3fffffffff00000LL, + 39, 64, 45, 0x3fffffffff80000LL, + 40, 64, 46, 0x3fffffffffc0000LL, + 41, 64, 47, 0x3fffffffffe0000LL, + 42, 64, 48, 0x3ffffffffff0000LL, + 43, 64, 49, 0x3ffffffffff8000LL, + 44, 64, 50, 0x3ffffffffffc000LL, + 45, 64, 51, 0x3ffffffffffe000LL, + 46, 64, 52, 0x3fffffffffff000LL, + 47, 64, 53, 0x3fffffffffff800LL, + 48, 64, 54, 0x3fffffffffffc00LL, + 49, 64, 55, 0x3fffffffffffe00LL, + 50, 64, 56, 0x3ffffffffffff00LL, + 51, 64, 57, 0x3ffffffffffff80LL, + 52, 64, 58, 0x3ffffffffffffc0LL, + 53, 64, 59, 0x3ffffffffffffe0LL, + 54, 64, 60, 0x3fffffffffffff0LL, + 55, 64, 61, 0x3fffffffffffff8LL, + 56, 64, 62, 0x3fffffffffffffcLL, + 57, 64, 63, 0x3fffffffffffffeLL, + 58, 64, 0, 0x3ffffffffffffffLL, + 1, 64, 6, 0x400000000000000LL, + 1, 32, 6, 0x400000004000000LL, + 1, 16, 6, 0x400040004000400LL, + 1, 8, 6, 0x404040404040404LL, + 2, 64, 7, 0x600000000000000LL, + 2, 32, 7, 0x600000006000000LL, + 2, 16, 7, 0x600060006000600LL, + 2, 8, 7, 0x606060606060606LL, + 3, 64, 8, 0x700000000000000LL, + 3, 32, 8, 0x700000007000000LL, + 3, 16, 8, 0x700070007000700LL, + 3, 8, 0, 0x707070707070707LL, + 4, 64, 9, 0x780000000000000LL, + 4, 32, 9, 0x780000007800000LL, + 4, 16, 9, 0x780078007800780LL, + 5, 64, 10, 0x7c0000000000000LL, + 5, 32, 10, 0x7c0000007c00000LL, + 5, 16, 10, 0x7c007c007c007c0LL, + 6, 64, 11, 0x7e0000000000000LL, + 6, 32, 11, 0x7e0000007e00000LL, + 6, 16, 11, 0x7e007e007e007e0LL, + 7, 64, 12, 0x7f0000000000000LL, + 7, 32, 12, 0x7f0000007f00000LL, + 7, 16, 12, 0x7f007f007f007f0LL, + 8, 64, 13, 0x7f8000000000000LL, + 8, 32, 13, 0x7f8000007f80000LL, + 8, 16, 13, 0x7f807f807f807f8LL, + 9, 64, 14, 0x7fc000000000000LL, + 9, 32, 14, 0x7fc000007fc0000LL, + 9, 16, 14, 0x7fc07fc07fc07fcLL, + 10, 64, 15, 0x7fe000000000000LL, + 10, 32, 15, 0x7fe000007fe0000LL, + 10, 16, 15, 0x7fe07fe07fe07feLL, + 11, 64, 16, 0x7ff000000000000LL, + 11, 32, 16, 0x7ff000007ff0000LL, + 11, 16, 0, 0x7ff07ff07ff07ffLL, + 12, 64, 17, 0x7ff800000000000LL, + 12, 32, 17, 0x7ff800007ff8000LL, + 13, 64, 18, 0x7ffc00000000000LL, + 13, 32, 18, 0x7ffc00007ffc000LL, + 14, 64, 19, 0x7ffe00000000000LL, + 14, 32, 19, 0x7ffe00007ffe000LL, + 15, 64, 20, 0x7fff00000000000LL, + 15, 32, 20, 0x7fff00007fff000LL, + 16, 64, 21, 0x7fff80000000000LL, + 16, 32, 21, 0x7fff80007fff800LL, + 17, 64, 22, 0x7fffc0000000000LL, + 17, 32, 22, 0x7fffc0007fffc00LL, + 18, 64, 23, 0x7fffe0000000000LL, + 18, 32, 23, 0x7fffe0007fffe00LL, + 19, 64, 24, 0x7ffff0000000000LL, + 19, 32, 24, 0x7ffff0007ffff00LL, + 20, 64, 25, 0x7ffff8000000000LL, + 20, 32, 25, 0x7ffff8007ffff80LL, + 21, 64, 26, 0x7ffffc000000000LL, + 21, 32, 26, 0x7ffffc007ffffc0LL, + 22, 64, 27, 0x7ffffe000000000LL, + 22, 32, 27, 0x7ffffe007ffffe0LL, + 23, 64, 28, 0x7fffff000000000LL, + 23, 32, 28, 0x7fffff007fffff0LL, + 24, 64, 29, 0x7fffff800000000LL, + 24, 32, 29, 0x7fffff807fffff8LL, + 25, 64, 30, 0x7fffffc00000000LL, + 25, 32, 30, 0x7fffffc07fffffcLL, + 26, 64, 31, 0x7fffffe00000000LL, + 26, 32, 31, 0x7fffffe07fffffeLL, + 27, 64, 32, 0x7ffffff00000000LL, + 27, 32, 0, 0x7ffffff07ffffffLL, + 28, 64, 33, 0x7ffffff80000000LL, + 29, 64, 34, 0x7ffffffc0000000LL, + 30, 64, 35, 0x7ffffffe0000000LL, + 31, 64, 36, 0x7fffffff0000000LL, + 32, 64, 37, 0x7fffffff8000000LL, + 33, 64, 38, 0x7fffffffc000000LL, + 34, 64, 39, 0x7fffffffe000000LL, + 35, 64, 40, 0x7ffffffff000000LL, + 36, 64, 41, 0x7ffffffff800000LL, + 37, 64, 42, 0x7ffffffffc00000LL, + 38, 64, 43, 0x7ffffffffe00000LL, + 39, 64, 44, 0x7fffffffff00000LL, + 40, 64, 45, 0x7fffffffff80000LL, + 41, 64, 46, 0x7fffffffffc0000LL, + 42, 64, 47, 0x7fffffffffe0000LL, + 43, 64, 48, 0x7ffffffffff0000LL, + 44, 64, 49, 0x7ffffffffff8000LL, + 45, 64, 50, 0x7ffffffffffc000LL, + 46, 64, 51, 0x7ffffffffffe000LL, + 47, 64, 52, 0x7fffffffffff000LL, + 48, 64, 53, 0x7fffffffffff800LL, + 49, 64, 54, 0x7fffffffffffc00LL, + 50, 64, 55, 0x7fffffffffffe00LL, + 51, 64, 56, 0x7ffffffffffff00LL, + 52, 64, 57, 0x7ffffffffffff80LL, + 53, 64, 58, 0x7ffffffffffffc0LL, + 54, 64, 59, 0x7ffffffffffffe0LL, + 55, 64, 60, 0x7fffffffffffff0LL, + 56, 64, 61, 0x7fffffffffffff8LL, + 57, 64, 62, 0x7fffffffffffffcLL, + 58, 64, 63, 0x7fffffffffffffeLL, + 59, 64, 0, 0x7ffffffffffffffLL, + 1, 64, 5, 0x800000000000000LL, + 1, 32, 5, 0x800000008000000LL, + 1, 16, 5, 0x800080008000800LL, + 1, 8, 5, 0x808080808080808LL, + 2, 64, 6, 0xc00000000000000LL, + 2, 32, 6, 0xc0000000c000000LL, + 2, 16, 6, 0xc000c000c000c00LL, + 2, 8, 6, 0xc0c0c0c0c0c0c0cLL, + 3, 64, 7, 0xe00000000000000LL, + 3, 32, 7, 0xe0000000e000000LL, + 3, 16, 7, 0xe000e000e000e00LL, + 3, 8, 7, 0xe0e0e0e0e0e0e0eLL, + 4, 64, 8, 0xf00000000000000LL, + 4, 32, 8, 0xf0000000f000000LL, + 4, 16, 8, 0xf000f000f000f00LL, + 4, 8, 0, 0xf0f0f0f0f0f0f0fLL, + 5, 64, 9, 0xf80000000000000LL, + 5, 32, 9, 0xf8000000f800000LL, + 5, 16, 9, 0xf800f800f800f80LL, + 6, 64, 10, 0xfc0000000000000LL, + 6, 32, 10, 0xfc000000fc00000LL, + 6, 16, 10, 0xfc00fc00fc00fc0LL, + 7, 64, 11, 0xfe0000000000000LL, + 7, 32, 11, 0xfe000000fe00000LL, + 7, 16, 11, 0xfe00fe00fe00fe0LL, + 8, 64, 12, 0xff0000000000000LL, + 8, 32, 12, 0xff000000ff00000LL, + 8, 16, 12, 0xff00ff00ff00ff0LL, + 9, 64, 13, 0xff8000000000000LL, + 9, 32, 13, 0xff800000ff80000LL, + 9, 16, 13, 0xff80ff80ff80ff8LL, + 10, 64, 14, 0xffc000000000000LL, + 10, 32, 14, 0xffc00000ffc0000LL, + 10, 16, 14, 0xffc0ffc0ffc0ffcLL, + 11, 64, 15, 0xffe000000000000LL, + 11, 32, 15, 0xffe00000ffe0000LL, + 11, 16, 15, 0xffe0ffe0ffe0ffeLL, + 12, 64, 16, 0xfff000000000000LL, + 12, 32, 16, 0xfff00000fff0000LL, + 12, 16, 0, 0xfff0fff0fff0fffLL, + 13, 64, 17, 0xfff800000000000LL, + 13, 32, 17, 0xfff80000fff8000LL, + 14, 64, 18, 0xfffc00000000000LL, + 14, 32, 18, 0xfffc0000fffc000LL, + 15, 64, 19, 0xfffe00000000000LL, + 15, 32, 19, 0xfffe0000fffe000LL, + 16, 64, 20, 0xffff00000000000LL, + 16, 32, 20, 0xffff0000ffff000LL, + 17, 64, 21, 0xffff80000000000LL, + 17, 32, 21, 0xffff8000ffff800LL, + 18, 64, 22, 0xffffc0000000000LL, + 18, 32, 22, 0xffffc000ffffc00LL, + 19, 64, 23, 0xffffe0000000000LL, + 19, 32, 23, 0xffffe000ffffe00LL, + 20, 64, 24, 0xfffff0000000000LL, + 20, 32, 24, 0xfffff000fffff00LL, + 21, 64, 25, 0xfffff8000000000LL, + 21, 32, 25, 0xfffff800fffff80LL, + 22, 64, 26, 0xfffffc000000000LL, + 22, 32, 26, 0xfffffc00fffffc0LL, + 23, 64, 27, 0xfffffe000000000LL, + 23, 32, 27, 0xfffffe00fffffe0LL, + 24, 64, 28, 0xffffff000000000LL, + 24, 32, 28, 0xffffff00ffffff0LL, + 25, 64, 29, 0xffffff800000000LL, + 25, 32, 29, 0xffffff80ffffff8LL, + 26, 64, 30, 0xffffffc00000000LL, + 26, 32, 30, 0xffffffc0ffffffcLL, + 27, 64, 31, 0xffffffe00000000LL, + 27, 32, 31, 0xffffffe0ffffffeLL, + 28, 64, 32, 0xfffffff00000000LL, + 28, 32, 0, 0xfffffff0fffffffLL, + 29, 64, 33, 0xfffffff80000000LL, + 30, 64, 34, 0xfffffffc0000000LL, + 31, 64, 35, 0xfffffffe0000000LL, + 32, 64, 36, 0xffffffff0000000LL, + 33, 64, 37, 0xffffffff8000000LL, + 34, 64, 38, 0xffffffffc000000LL, + 35, 64, 39, 0xffffffffe000000LL, + 36, 64, 40, 0xfffffffff000000LL, + 37, 64, 41, 0xfffffffff800000LL, + 38, 64, 42, 0xfffffffffc00000LL, + 39, 64, 43, 0xfffffffffe00000LL, + 40, 64, 44, 0xffffffffff00000LL, + 41, 64, 45, 0xffffffffff80000LL, + 42, 64, 46, 0xffffffffffc0000LL, + 43, 64, 47, 0xffffffffffe0000LL, + 44, 64, 48, 0xfffffffffff0000LL, + 45, 64, 49, 0xfffffffffff8000LL, + 46, 64, 50, 0xfffffffffffc000LL, + 47, 64, 51, 0xfffffffffffe000LL, + 48, 64, 52, 0xffffffffffff000LL, + 49, 64, 53, 0xffffffffffff800LL, + 50, 64, 54, 0xffffffffffffc00LL, + 51, 64, 55, 0xffffffffffffe00LL, + 52, 64, 56, 0xfffffffffffff00LL, + 53, 64, 57, 0xfffffffffffff80LL, + 54, 64, 58, 0xfffffffffffffc0LL, + 55, 64, 59, 0xfffffffffffffe0LL, + 56, 64, 60, 0xffffffffffffff0LL, + 57, 64, 61, 0xffffffffffffff8LL, + 58, 64, 62, 0xffffffffffffffcLL, + 59, 64, 63, 0xffffffffffffffeLL, + 60, 64, 0, 0xfffffffffffffffLL, + 1, 64, 4, 0x1000000000000000LL, + 1, 32, 4, 0x1000000010000000LL, + 1, 16, 4, 0x1000100010001000LL, + 1, 8, 4, 0x1010101010101010LL, + 1, 4, 0, 0x1111111111111111LL, + 2, 64, 5, 0x1800000000000000LL, + 2, 32, 5, 0x1800000018000000LL, + 2, 16, 5, 0x1800180018001800LL, + 2, 8, 5, 0x1818181818181818LL, + 3, 64, 6, 0x1c00000000000000LL, + 3, 32, 6, 0x1c0000001c000000LL, + 3, 16, 6, 0x1c001c001c001c00LL, + 3, 8, 6, 0x1c1c1c1c1c1c1c1cLL, + 4, 64, 7, 0x1e00000000000000LL, + 4, 32, 7, 0x1e0000001e000000LL, + 4, 16, 7, 0x1e001e001e001e00LL, + 4, 8, 7, 0x1e1e1e1e1e1e1e1eLL, + 5, 64, 8, 0x1f00000000000000LL, + 5, 32, 8, 0x1f0000001f000000LL, + 5, 16, 8, 0x1f001f001f001f00LL, + 5, 8, 0, 0x1f1f1f1f1f1f1f1fLL, + 6, 64, 9, 0x1f80000000000000LL, + 6, 32, 9, 0x1f8000001f800000LL, + 6, 16, 9, 0x1f801f801f801f80LL, + 7, 64, 10, 0x1fc0000000000000LL, + 7, 32, 10, 0x1fc000001fc00000LL, + 7, 16, 10, 0x1fc01fc01fc01fc0LL, + 8, 64, 11, 0x1fe0000000000000LL, + 8, 32, 11, 0x1fe000001fe00000LL, + 8, 16, 11, 0x1fe01fe01fe01fe0LL, + 9, 64, 12, 0x1ff0000000000000LL, + 9, 32, 12, 0x1ff000001ff00000LL, + 9, 16, 12, 0x1ff01ff01ff01ff0LL, + 10, 64, 13, 0x1ff8000000000000LL, + 10, 32, 13, 0x1ff800001ff80000LL, + 10, 16, 13, 0x1ff81ff81ff81ff8LL, + 11, 64, 14, 0x1ffc000000000000LL, + 11, 32, 14, 0x1ffc00001ffc0000LL, + 11, 16, 14, 0x1ffc1ffc1ffc1ffcLL, + 12, 64, 15, 0x1ffe000000000000LL, + 12, 32, 15, 0x1ffe00001ffe0000LL, + 12, 16, 15, 0x1ffe1ffe1ffe1ffeLL, + 13, 64, 16, 0x1fff000000000000LL, + 13, 32, 16, 0x1fff00001fff0000LL, + 13, 16, 0, 0x1fff1fff1fff1fffLL, + 14, 64, 17, 0x1fff800000000000LL, + 14, 32, 17, 0x1fff80001fff8000LL, + 15, 64, 18, 0x1fffc00000000000LL, + 15, 32, 18, 0x1fffc0001fffc000LL, + 16, 64, 19, 0x1fffe00000000000LL, + 16, 32, 19, 0x1fffe0001fffe000LL, + 17, 64, 20, 0x1ffff00000000000LL, + 17, 32, 20, 0x1ffff0001ffff000LL, + 18, 64, 21, 0x1ffff80000000000LL, + 18, 32, 21, 0x1ffff8001ffff800LL, + 19, 64, 22, 0x1ffffc0000000000LL, + 19, 32, 22, 0x1ffffc001ffffc00LL, + 20, 64, 23, 0x1ffffe0000000000LL, + 20, 32, 23, 0x1ffffe001ffffe00LL, + 21, 64, 24, 0x1fffff0000000000LL, + 21, 32, 24, 0x1fffff001fffff00LL, + 22, 64, 25, 0x1fffff8000000000LL, + 22, 32, 25, 0x1fffff801fffff80LL, + 23, 64, 26, 0x1fffffc000000000LL, + 23, 32, 26, 0x1fffffc01fffffc0LL, + 24, 64, 27, 0x1fffffe000000000LL, + 24, 32, 27, 0x1fffffe01fffffe0LL, + 25, 64, 28, 0x1ffffff000000000LL, + 25, 32, 28, 0x1ffffff01ffffff0LL, + 26, 64, 29, 0x1ffffff800000000LL, + 26, 32, 29, 0x1ffffff81ffffff8LL, + 27, 64, 30, 0x1ffffffc00000000LL, + 27, 32, 30, 0x1ffffffc1ffffffcLL, + 28, 64, 31, 0x1ffffffe00000000LL, + 28, 32, 31, 0x1ffffffe1ffffffeLL, + 29, 64, 32, 0x1fffffff00000000LL, + 29, 32, 0, 0x1fffffff1fffffffLL, + 30, 64, 33, 0x1fffffff80000000LL, + 31, 64, 34, 0x1fffffffc0000000LL, + 32, 64, 35, 0x1fffffffe0000000LL, + 33, 64, 36, 0x1ffffffff0000000LL, + 34, 64, 37, 0x1ffffffff8000000LL, + 35, 64, 38, 0x1ffffffffc000000LL, + 36, 64, 39, 0x1ffffffffe000000LL, + 37, 64, 40, 0x1fffffffff000000LL, + 38, 64, 41, 0x1fffffffff800000LL, + 39, 64, 42, 0x1fffffffffc00000LL, + 40, 64, 43, 0x1fffffffffe00000LL, + 41, 64, 44, 0x1ffffffffff00000LL, + 42, 64, 45, 0x1ffffffffff80000LL, + 43, 64, 46, 0x1ffffffffffc0000LL, + 44, 64, 47, 0x1ffffffffffe0000LL, + 45, 64, 48, 0x1fffffffffff0000LL, + 46, 64, 49, 0x1fffffffffff8000LL, + 47, 64, 50, 0x1fffffffffffc000LL, + 48, 64, 51, 0x1fffffffffffe000LL, + 49, 64, 52, 0x1ffffffffffff000LL, + 50, 64, 53, 0x1ffffffffffff800LL, + 51, 64, 54, 0x1ffffffffffffc00LL, + 52, 64, 55, 0x1ffffffffffffe00LL, + 53, 64, 56, 0x1fffffffffffff00LL, + 54, 64, 57, 0x1fffffffffffff80LL, + 55, 64, 58, 0x1fffffffffffffc0LL, + 56, 64, 59, 0x1fffffffffffffe0LL, + 57, 64, 60, 0x1ffffffffffffff0LL, + 58, 64, 61, 0x1ffffffffffffff8LL, + 59, 64, 62, 0x1ffffffffffffffcLL, + 60, 64, 63, 0x1ffffffffffffffeLL, + 61, 64, 0, 0x1fffffffffffffffLL, + 1, 64, 3, 0x2000000000000000LL, + 1, 32, 3, 0x2000000020000000LL, + 1, 16, 3, 0x2000200020002000LL, + 1, 8, 3, 0x2020202020202020LL, + 1, 4, 3, 0x2222222222222222LL, + 2, 64, 4, 0x3000000000000000LL, + 2, 32, 4, 0x3000000030000000LL, + 2, 16, 4, 0x3000300030003000LL, + 2, 8, 4, 0x3030303030303030LL, + 2, 4, 0, 0x3333333333333333LL, + 3, 64, 5, 0x3800000000000000LL, + 3, 32, 5, 0x3800000038000000LL, + 3, 16, 5, 0x3800380038003800LL, + 3, 8, 5, 0x3838383838383838LL, + 4, 64, 6, 0x3c00000000000000LL, + 4, 32, 6, 0x3c0000003c000000LL, + 4, 16, 6, 0x3c003c003c003c00LL, + 4, 8, 6, 0x3c3c3c3c3c3c3c3cLL, + 5, 64, 7, 0x3e00000000000000LL, + 5, 32, 7, 0x3e0000003e000000LL, + 5, 16, 7, 0x3e003e003e003e00LL, + 5, 8, 7, 0x3e3e3e3e3e3e3e3eLL, + 6, 64, 8, 0x3f00000000000000LL, + 6, 32, 8, 0x3f0000003f000000LL, + 6, 16, 8, 0x3f003f003f003f00LL, + 6, 8, 0, 0x3f3f3f3f3f3f3f3fLL, + 7, 64, 9, 0x3f80000000000000LL, + 7, 32, 9, 0x3f8000003f800000LL, + 7, 16, 9, 0x3f803f803f803f80LL, + 8, 64, 10, 0x3fc0000000000000LL, + 8, 32, 10, 0x3fc000003fc00000LL, + 8, 16, 10, 0x3fc03fc03fc03fc0LL, + 9, 64, 11, 0x3fe0000000000000LL, + 9, 32, 11, 0x3fe000003fe00000LL, + 9, 16, 11, 0x3fe03fe03fe03fe0LL, + 10, 64, 12, 0x3ff0000000000000LL, + 10, 32, 12, 0x3ff000003ff00000LL, + 10, 16, 12, 0x3ff03ff03ff03ff0LL, + 11, 64, 13, 0x3ff8000000000000LL, + 11, 32, 13, 0x3ff800003ff80000LL, + 11, 16, 13, 0x3ff83ff83ff83ff8LL, + 12, 64, 14, 0x3ffc000000000000LL, + 12, 32, 14, 0x3ffc00003ffc0000LL, + 12, 16, 14, 0x3ffc3ffc3ffc3ffcLL, + 13, 64, 15, 0x3ffe000000000000LL, + 13, 32, 15, 0x3ffe00003ffe0000LL, + 13, 16, 15, 0x3ffe3ffe3ffe3ffeLL, + 14, 64, 16, 0x3fff000000000000LL, + 14, 32, 16, 0x3fff00003fff0000LL, + 14, 16, 0, 0x3fff3fff3fff3fffLL, + 15, 64, 17, 0x3fff800000000000LL, + 15, 32, 17, 0x3fff80003fff8000LL, + 16, 64, 18, 0x3fffc00000000000LL, + 16, 32, 18, 0x3fffc0003fffc000LL, + 17, 64, 19, 0x3fffe00000000000LL, + 17, 32, 19, 0x3fffe0003fffe000LL, + 18, 64, 20, 0x3ffff00000000000LL, + 18, 32, 20, 0x3ffff0003ffff000LL, + 19, 64, 21, 0x3ffff80000000000LL, + 19, 32, 21, 0x3ffff8003ffff800LL, + 20, 64, 22, 0x3ffffc0000000000LL, + 20, 32, 22, 0x3ffffc003ffffc00LL, + 21, 64, 23, 0x3ffffe0000000000LL, + 21, 32, 23, 0x3ffffe003ffffe00LL, + 22, 64, 24, 0x3fffff0000000000LL, + 22, 32, 24, 0x3fffff003fffff00LL, + 23, 64, 25, 0x3fffff8000000000LL, + 23, 32, 25, 0x3fffff803fffff80LL, + 24, 64, 26, 0x3fffffc000000000LL, + 24, 32, 26, 0x3fffffc03fffffc0LL, + 25, 64, 27, 0x3fffffe000000000LL, + 25, 32, 27, 0x3fffffe03fffffe0LL, + 26, 64, 28, 0x3ffffff000000000LL, + 26, 32, 28, 0x3ffffff03ffffff0LL, + 27, 64, 29, 0x3ffffff800000000LL, + 27, 32, 29, 0x3ffffff83ffffff8LL, + 28, 64, 30, 0x3ffffffc00000000LL, + 28, 32, 30, 0x3ffffffc3ffffffcLL, + 29, 64, 31, 0x3ffffffe00000000LL, + 29, 32, 31, 0x3ffffffe3ffffffeLL, + 30, 64, 32, 0x3fffffff00000000LL, + 30, 32, 0, 0x3fffffff3fffffffLL, + 31, 64, 33, 0x3fffffff80000000LL, + 32, 64, 34, 0x3fffffffc0000000LL, + 33, 64, 35, 0x3fffffffe0000000LL, + 34, 64, 36, 0x3ffffffff0000000LL, + 35, 64, 37, 0x3ffffffff8000000LL, + 36, 64, 38, 0x3ffffffffc000000LL, + 37, 64, 39, 0x3ffffffffe000000LL, + 38, 64, 40, 0x3fffffffff000000LL, + 39, 64, 41, 0x3fffffffff800000LL, + 40, 64, 42, 0x3fffffffffc00000LL, + 41, 64, 43, 0x3fffffffffe00000LL, + 42, 64, 44, 0x3ffffffffff00000LL, + 43, 64, 45, 0x3ffffffffff80000LL, + 44, 64, 46, 0x3ffffffffffc0000LL, + 45, 64, 47, 0x3ffffffffffe0000LL, + 46, 64, 48, 0x3fffffffffff0000LL, + 47, 64, 49, 0x3fffffffffff8000LL, + 48, 64, 50, 0x3fffffffffffc000LL, + 49, 64, 51, 0x3fffffffffffe000LL, + 50, 64, 52, 0x3ffffffffffff000LL, + 51, 64, 53, 0x3ffffffffffff800LL, + 52, 64, 54, 0x3ffffffffffffc00LL, + 53, 64, 55, 0x3ffffffffffffe00LL, + 54, 64, 56, 0x3fffffffffffff00LL, + 55, 64, 57, 0x3fffffffffffff80LL, + 56, 64, 58, 0x3fffffffffffffc0LL, + 57, 64, 59, 0x3fffffffffffffe0LL, + 58, 64, 60, 0x3ffffffffffffff0LL, + 59, 64, 61, 0x3ffffffffffffff8LL, + 60, 64, 62, 0x3ffffffffffffffcLL, + 61, 64, 63, 0x3ffffffffffffffeLL, + 62, 64, 0, 0x3fffffffffffffffLL, + 1, 64, 2, 0x4000000000000000LL, + 1, 32, 2, 0x4000000040000000LL, + 1, 16, 2, 0x4000400040004000LL, + 1, 8, 2, 0x4040404040404040LL, + 1, 4, 2, 0x4444444444444444LL, + 1, 2, 0, 0x5555555555555555LL, + 2, 64, 3, 0x6000000000000000LL, + 2, 32, 3, 0x6000000060000000LL, + 2, 16, 3, 0x6000600060006000LL, + 2, 8, 3, 0x6060606060606060LL, + 2, 4, 3, 0x6666666666666666LL, + 3, 64, 4, 0x7000000000000000LL, + 3, 32, 4, 0x7000000070000000LL, + 3, 16, 4, 0x7000700070007000LL, + 3, 8, 4, 0x7070707070707070LL, + 3, 4, 0, 0x7777777777777777LL, + 4, 64, 5, 0x7800000000000000LL, + 4, 32, 5, 0x7800000078000000LL, + 4, 16, 5, 0x7800780078007800LL, + 4, 8, 5, 0x7878787878787878LL, + 5, 64, 6, 0x7c00000000000000LL, + 5, 32, 6, 0x7c0000007c000000LL, + 5, 16, 6, 0x7c007c007c007c00LL, + 5, 8, 6, 0x7c7c7c7c7c7c7c7cLL, + 6, 64, 7, 0x7e00000000000000LL, + 6, 32, 7, 0x7e0000007e000000LL, + 6, 16, 7, 0x7e007e007e007e00LL, + 6, 8, 7, 0x7e7e7e7e7e7e7e7eLL, + 7, 64, 8, 0x7f00000000000000LL, + 7, 32, 8, 0x7f0000007f000000LL, + 7, 16, 8, 0x7f007f007f007f00LL, + 7, 8, 0, 0x7f7f7f7f7f7f7f7fLL, + 8, 64, 9, 0x7f80000000000000LL, + 8, 32, 9, 0x7f8000007f800000LL, + 8, 16, 9, 0x7f807f807f807f80LL, + 9, 64, 10, 0x7fc0000000000000LL, + 9, 32, 10, 0x7fc000007fc00000LL, + 9, 16, 10, 0x7fc07fc07fc07fc0LL, + 10, 64, 11, 0x7fe0000000000000LL, + 10, 32, 11, 0x7fe000007fe00000LL, + 10, 16, 11, 0x7fe07fe07fe07fe0LL, + 11, 64, 12, 0x7ff0000000000000LL, + 11, 32, 12, 0x7ff000007ff00000LL, + 11, 16, 12, 0x7ff07ff07ff07ff0LL, + 12, 64, 13, 0x7ff8000000000000LL, + 12, 32, 13, 0x7ff800007ff80000LL, + 12, 16, 13, 0x7ff87ff87ff87ff8LL, + 13, 64, 14, 0x7ffc000000000000LL, + 13, 32, 14, 0x7ffc00007ffc0000LL, + 13, 16, 14, 0x7ffc7ffc7ffc7ffcLL, + 14, 64, 15, 0x7ffe000000000000LL, + 14, 32, 15, 0x7ffe00007ffe0000LL, + 14, 16, 15, 0x7ffe7ffe7ffe7ffeLL, + 15, 64, 16, 0x7fff000000000000LL, + 15, 32, 16, 0x7fff00007fff0000LL, + 15, 16, 0, 0x7fff7fff7fff7fffLL, + 16, 64, 17, 0x7fff800000000000LL, + 16, 32, 17, 0x7fff80007fff8000LL, + 17, 64, 18, 0x7fffc00000000000LL, + 17, 32, 18, 0x7fffc0007fffc000LL, + 18, 64, 19, 0x7fffe00000000000LL, + 18, 32, 19, 0x7fffe0007fffe000LL, + 19, 64, 20, 0x7ffff00000000000LL, + 19, 32, 20, 0x7ffff0007ffff000LL, + 20, 64, 21, 0x7ffff80000000000LL, + 20, 32, 21, 0x7ffff8007ffff800LL, + 21, 64, 22, 0x7ffffc0000000000LL, + 21, 32, 22, 0x7ffffc007ffffc00LL, + 22, 64, 23, 0x7ffffe0000000000LL, + 22, 32, 23, 0x7ffffe007ffffe00LL, + 23, 64, 24, 0x7fffff0000000000LL, + 23, 32, 24, 0x7fffff007fffff00LL, + 24, 64, 25, 0x7fffff8000000000LL, + 24, 32, 25, 0x7fffff807fffff80LL, + 25, 64, 26, 0x7fffffc000000000LL, + 25, 32, 26, 0x7fffffc07fffffc0LL, + 26, 64, 27, 0x7fffffe000000000LL, + 26, 32, 27, 0x7fffffe07fffffe0LL, + 27, 64, 28, 0x7ffffff000000000LL, + 27, 32, 28, 0x7ffffff07ffffff0LL, + 28, 64, 29, 0x7ffffff800000000LL, + 28, 32, 29, 0x7ffffff87ffffff8LL, + 29, 64, 30, 0x7ffffffc00000000LL, + 29, 32, 30, 0x7ffffffc7ffffffcLL, + 30, 64, 31, 0x7ffffffe00000000LL, + 30, 32, 31, 0x7ffffffe7ffffffeLL, + 31, 64, 32, 0x7fffffff00000000LL, + 31, 32, 0, 0x7fffffff7fffffffLL, + 32, 64, 33, 0x7fffffff80000000LL, + 33, 64, 34, 0x7fffffffc0000000LL, + 34, 64, 35, 0x7fffffffe0000000LL, + 35, 64, 36, 0x7ffffffff0000000LL, + 36, 64, 37, 0x7ffffffff8000000LL, + 37, 64, 38, 0x7ffffffffc000000LL, + 38, 64, 39, 0x7ffffffffe000000LL, + 39, 64, 40, 0x7fffffffff000000LL, + 40, 64, 41, 0x7fffffffff800000LL, + 41, 64, 42, 0x7fffffffffc00000LL, + 42, 64, 43, 0x7fffffffffe00000LL, + 43, 64, 44, 0x7ffffffffff00000LL, + 44, 64, 45, 0x7ffffffffff80000LL, + 45, 64, 46, 0x7ffffffffffc0000LL, + 46, 64, 47, 0x7ffffffffffe0000LL, + 47, 64, 48, 0x7fffffffffff0000LL, + 48, 64, 49, 0x7fffffffffff8000LL, + 49, 64, 50, 0x7fffffffffffc000LL, + 50, 64, 51, 0x7fffffffffffe000LL, + 51, 64, 52, 0x7ffffffffffff000LL, + 52, 64, 53, 0x7ffffffffffff800LL, + 53, 64, 54, 0x7ffffffffffffc00LL, + 54, 64, 55, 0x7ffffffffffffe00LL, + 55, 64, 56, 0x7fffffffffffff00LL, + 56, 64, 57, 0x7fffffffffffff80LL, + 57, 64, 58, 0x7fffffffffffffc0LL, + 58, 64, 59, 0x7fffffffffffffe0LL, + 59, 64, 60, 0x7ffffffffffffff0LL, + 60, 64, 61, 0x7ffffffffffffff8LL, + 61, 64, 62, 0x7ffffffffffffffcLL, + 62, 64, 63, 0x7ffffffffffffffeLL, + 63, 64, 0, 0x7fffffffffffffffLL, + 1, 64, 1, 0x8000000000000000LL, + 2, 64, 1, 0x8000000000000001LL, + 3, 64, 1, 0x8000000000000003LL, + 4, 64, 1, 0x8000000000000007LL, + 5, 64, 1, 0x800000000000000fLL, + 6, 64, 1, 0x800000000000001fLL, + 7, 64, 1, 0x800000000000003fLL, + 8, 64, 1, 0x800000000000007fLL, + 9, 64, 1, 0x80000000000000ffLL, + 10, 64, 1, 0x80000000000001ffLL, + 11, 64, 1, 0x80000000000003ffLL, + 12, 64, 1, 0x80000000000007ffLL, + 13, 64, 1, 0x8000000000000fffLL, + 14, 64, 1, 0x8000000000001fffLL, + 15, 64, 1, 0x8000000000003fffLL, + 16, 64, 1, 0x8000000000007fffLL, + 17, 64, 1, 0x800000000000ffffLL, + 18, 64, 1, 0x800000000001ffffLL, + 19, 64, 1, 0x800000000003ffffLL, + 20, 64, 1, 0x800000000007ffffLL, + 21, 64, 1, 0x80000000000fffffLL, + 22, 64, 1, 0x80000000001fffffLL, + 23, 64, 1, 0x80000000003fffffLL, + 24, 64, 1, 0x80000000007fffffLL, + 25, 64, 1, 0x8000000000ffffffLL, + 26, 64, 1, 0x8000000001ffffffLL, + 27, 64, 1, 0x8000000003ffffffLL, + 28, 64, 1, 0x8000000007ffffffLL, + 29, 64, 1, 0x800000000fffffffLL, + 30, 64, 1, 0x800000001fffffffLL, + 31, 64, 1, 0x800000003fffffffLL, + 32, 64, 1, 0x800000007fffffffLL, + 1, 32, 1, 0x8000000080000000LL, + 33, 64, 1, 0x80000000ffffffffLL, + 2, 32, 1, 0x8000000180000001LL, + 34, 64, 1, 0x80000001ffffffffLL, + 3, 32, 1, 0x8000000380000003LL, + 35, 64, 1, 0x80000003ffffffffLL, + 4, 32, 1, 0x8000000780000007LL, + 36, 64, 1, 0x80000007ffffffffLL, + 5, 32, 1, 0x8000000f8000000fLL, + 37, 64, 1, 0x8000000fffffffffLL, + 6, 32, 1, 0x8000001f8000001fLL, + 38, 64, 1, 0x8000001fffffffffLL, + 7, 32, 1, 0x8000003f8000003fLL, + 39, 64, 1, 0x8000003fffffffffLL, + 8, 32, 1, 0x8000007f8000007fLL, + 40, 64, 1, 0x8000007fffffffffLL, + 9, 32, 1, 0x800000ff800000ffLL, + 41, 64, 1, 0x800000ffffffffffLL, + 10, 32, 1, 0x800001ff800001ffLL, + 42, 64, 1, 0x800001ffffffffffLL, + 11, 32, 1, 0x800003ff800003ffLL, + 43, 64, 1, 0x800003ffffffffffLL, + 12, 32, 1, 0x800007ff800007ffLL, + 44, 64, 1, 0x800007ffffffffffLL, + 13, 32, 1, 0x80000fff80000fffLL, + 45, 64, 1, 0x80000fffffffffffLL, + 14, 32, 1, 0x80001fff80001fffLL, + 46, 64, 1, 0x80001fffffffffffLL, + 15, 32, 1, 0x80003fff80003fffLL, + 47, 64, 1, 0x80003fffffffffffLL, + 16, 32, 1, 0x80007fff80007fffLL, + 48, 64, 1, 0x80007fffffffffffLL, + 1, 16, 1, 0x8000800080008000LL, + 17, 32, 1, 0x8000ffff8000ffffLL, + 49, 64, 1, 0x8000ffffffffffffLL, + 2, 16, 1, 0x8001800180018001LL, + 18, 32, 1, 0x8001ffff8001ffffLL, + 50, 64, 1, 0x8001ffffffffffffLL, + 3, 16, 1, 0x8003800380038003LL, + 19, 32, 1, 0x8003ffff8003ffffLL, + 51, 64, 1, 0x8003ffffffffffffLL, + 4, 16, 1, 0x8007800780078007LL, + 20, 32, 1, 0x8007ffff8007ffffLL, + 52, 64, 1, 0x8007ffffffffffffLL, + 5, 16, 1, 0x800f800f800f800fLL, + 21, 32, 1, 0x800fffff800fffffLL, + 53, 64, 1, 0x800fffffffffffffLL, + 6, 16, 1, 0x801f801f801f801fLL, + 22, 32, 1, 0x801fffff801fffffLL, + 54, 64, 1, 0x801fffffffffffffLL, + 7, 16, 1, 0x803f803f803f803fLL, + 23, 32, 1, 0x803fffff803fffffLL, + 55, 64, 1, 0x803fffffffffffffLL, + 8, 16, 1, 0x807f807f807f807fLL, + 24, 32, 1, 0x807fffff807fffffLL, + 56, 64, 1, 0x807fffffffffffffLL, + 1, 8, 1, 0x8080808080808080LL, + 9, 16, 1, 0x80ff80ff80ff80ffLL, + 25, 32, 1, 0x80ffffff80ffffffLL, + 57, 64, 1, 0x80ffffffffffffffLL, + 2, 8, 1, 0x8181818181818181LL, + 10, 16, 1, 0x81ff81ff81ff81ffLL, + 26, 32, 1, 0x81ffffff81ffffffLL, + 58, 64, 1, 0x81ffffffffffffffLL, + 3, 8, 1, 0x8383838383838383LL, + 11, 16, 1, 0x83ff83ff83ff83ffLL, + 27, 32, 1, 0x83ffffff83ffffffLL, + 59, 64, 1, 0x83ffffffffffffffLL, + 4, 8, 1, 0x8787878787878787LL, + 12, 16, 1, 0x87ff87ff87ff87ffLL, + 28, 32, 1, 0x87ffffff87ffffffLL, + 60, 64, 1, 0x87ffffffffffffffLL, + 1, 4, 1, 0x8888888888888888LL, + 5, 8, 1, 0x8f8f8f8f8f8f8f8fLL, + 13, 16, 1, 0x8fff8fff8fff8fffLL, + 29, 32, 1, 0x8fffffff8fffffffLL, + 61, 64, 1, 0x8fffffffffffffffLL, + 2, 4, 1, 0x9999999999999999LL, + 6, 8, 1, 0x9f9f9f9f9f9f9f9fLL, + 14, 16, 1, 0x9fff9fff9fff9fffLL, + 30, 32, 1, 0x9fffffff9fffffffLL, + 62, 64, 1, 0x9fffffffffffffffLL, + 1, 2, 1, 0xaaaaaaaaaaaaaaaaLL, + 3, 4, 1, 0xbbbbbbbbbbbbbbbbLL, + 7, 8, 1, 0xbfbfbfbfbfbfbfbfLL, + 15, 16, 1, 0xbfffbfffbfffbfffLL, + 31, 32, 1, 0xbfffffffbfffffffLL, + 63, 64, 1, 0xbfffffffffffffffLL, + 2, 64, 2, 0xc000000000000000LL, + 3, 64, 2, 0xc000000000000001LL, + 4, 64, 2, 0xc000000000000003LL, + 5, 64, 2, 0xc000000000000007LL, + 6, 64, 2, 0xc00000000000000fLL, + 7, 64, 2, 0xc00000000000001fLL, + 8, 64, 2, 0xc00000000000003fLL, + 9, 64, 2, 0xc00000000000007fLL, + 10, 64, 2, 0xc0000000000000ffLL, + 11, 64, 2, 0xc0000000000001ffLL, + 12, 64, 2, 0xc0000000000003ffLL, + 13, 64, 2, 0xc0000000000007ffLL, + 14, 64, 2, 0xc000000000000fffLL, + 15, 64, 2, 0xc000000000001fffLL, + 16, 64, 2, 0xc000000000003fffLL, + 17, 64, 2, 0xc000000000007fffLL, + 18, 64, 2, 0xc00000000000ffffLL, + 19, 64, 2, 0xc00000000001ffffLL, + 20, 64, 2, 0xc00000000003ffffLL, + 21, 64, 2, 0xc00000000007ffffLL, + 22, 64, 2, 0xc0000000000fffffLL, + 23, 64, 2, 0xc0000000001fffffLL, + 24, 64, 2, 0xc0000000003fffffLL, + 25, 64, 2, 0xc0000000007fffffLL, + 26, 64, 2, 0xc000000000ffffffLL, + 27, 64, 2, 0xc000000001ffffffLL, + 28, 64, 2, 0xc000000003ffffffLL, + 29, 64, 2, 0xc000000007ffffffLL, + 30, 64, 2, 0xc00000000fffffffLL, + 31, 64, 2, 0xc00000001fffffffLL, + 32, 64, 2, 0xc00000003fffffffLL, + 33, 64, 2, 0xc00000007fffffffLL, + 2, 32, 2, 0xc0000000c0000000LL, + 34, 64, 2, 0xc0000000ffffffffLL, + 3, 32, 2, 0xc0000001c0000001LL, + 35, 64, 2, 0xc0000001ffffffffLL, + 4, 32, 2, 0xc0000003c0000003LL, + 36, 64, 2, 0xc0000003ffffffffLL, + 5, 32, 2, 0xc0000007c0000007LL, + 37, 64, 2, 0xc0000007ffffffffLL, + 6, 32, 2, 0xc000000fc000000fLL, + 38, 64, 2, 0xc000000fffffffffLL, + 7, 32, 2, 0xc000001fc000001fLL, + 39, 64, 2, 0xc000001fffffffffLL, + 8, 32, 2, 0xc000003fc000003fLL, + 40, 64, 2, 0xc000003fffffffffLL, + 9, 32, 2, 0xc000007fc000007fLL, + 41, 64, 2, 0xc000007fffffffffLL, + 10, 32, 2, 0xc00000ffc00000ffLL, + 42, 64, 2, 0xc00000ffffffffffLL, + 11, 32, 2, 0xc00001ffc00001ffLL, + 43, 64, 2, 0xc00001ffffffffffLL, + 12, 32, 2, 0xc00003ffc00003ffLL, + 44, 64, 2, 0xc00003ffffffffffLL, + 13, 32, 2, 0xc00007ffc00007ffLL, + 45, 64, 2, 0xc00007ffffffffffLL, + 14, 32, 2, 0xc0000fffc0000fffLL, + 46, 64, 2, 0xc0000fffffffffffLL, + 15, 32, 2, 0xc0001fffc0001fffLL, + 47, 64, 2, 0xc0001fffffffffffLL, + 16, 32, 2, 0xc0003fffc0003fffLL, + 48, 64, 2, 0xc0003fffffffffffLL, + 17, 32, 2, 0xc0007fffc0007fffLL, + 49, 64, 2, 0xc0007fffffffffffLL, + 2, 16, 2, 0xc000c000c000c000LL, + 18, 32, 2, 0xc000ffffc000ffffLL, + 50, 64, 2, 0xc000ffffffffffffLL, + 3, 16, 2, 0xc001c001c001c001LL, + 19, 32, 2, 0xc001ffffc001ffffLL, + 51, 64, 2, 0xc001ffffffffffffLL, + 4, 16, 2, 0xc003c003c003c003LL, + 20, 32, 2, 0xc003ffffc003ffffLL, + 52, 64, 2, 0xc003ffffffffffffLL, + 5, 16, 2, 0xc007c007c007c007LL, + 21, 32, 2, 0xc007ffffc007ffffLL, + 53, 64, 2, 0xc007ffffffffffffLL, + 6, 16, 2, 0xc00fc00fc00fc00fLL, + 22, 32, 2, 0xc00fffffc00fffffLL, + 54, 64, 2, 0xc00fffffffffffffLL, + 7, 16, 2, 0xc01fc01fc01fc01fLL, + 23, 32, 2, 0xc01fffffc01fffffLL, + 55, 64, 2, 0xc01fffffffffffffLL, + 8, 16, 2, 0xc03fc03fc03fc03fLL, + 24, 32, 2, 0xc03fffffc03fffffLL, + 56, 64, 2, 0xc03fffffffffffffLL, + 9, 16, 2, 0xc07fc07fc07fc07fLL, + 25, 32, 2, 0xc07fffffc07fffffLL, + 57, 64, 2, 0xc07fffffffffffffLL, + 2, 8, 2, 0xc0c0c0c0c0c0c0c0LL, + 10, 16, 2, 0xc0ffc0ffc0ffc0ffLL, + 26, 32, 2, 0xc0ffffffc0ffffffLL, + 58, 64, 2, 0xc0ffffffffffffffLL, + 3, 8, 2, 0xc1c1c1c1c1c1c1c1LL, + 11, 16, 2, 0xc1ffc1ffc1ffc1ffLL, + 27, 32, 2, 0xc1ffffffc1ffffffLL, + 59, 64, 2, 0xc1ffffffffffffffLL, + 4, 8, 2, 0xc3c3c3c3c3c3c3c3LL, + 12, 16, 2, 0xc3ffc3ffc3ffc3ffLL, + 28, 32, 2, 0xc3ffffffc3ffffffLL, + 60, 64, 2, 0xc3ffffffffffffffLL, + 5, 8, 2, 0xc7c7c7c7c7c7c7c7LL, + 13, 16, 2, 0xc7ffc7ffc7ffc7ffLL, + 29, 32, 2, 0xc7ffffffc7ffffffLL, + 61, 64, 2, 0xc7ffffffffffffffLL, + 2, 4, 2, 0xccccccccccccccccLL, + 6, 8, 2, 0xcfcfcfcfcfcfcfcfLL, + 14, 16, 2, 0xcfffcfffcfffcfffLL, + 30, 32, 2, 0xcfffffffcfffffffLL, + 62, 64, 2, 0xcfffffffffffffffLL, + 3, 4, 2, 0xddddddddddddddddLL, + 7, 8, 2, 0xdfdfdfdfdfdfdfdfLL, + 15, 16, 2, 0xdfffdfffdfffdfffLL, + 31, 32, 2, 0xdfffffffdfffffffLL, + 63, 64, 2, 0xdfffffffffffffffLL, + 3, 64, 3, 0xe000000000000000LL, + 4, 64, 3, 0xe000000000000001LL, + 5, 64, 3, 0xe000000000000003LL, + 6, 64, 3, 0xe000000000000007LL, + 7, 64, 3, 0xe00000000000000fLL, + 8, 64, 3, 0xe00000000000001fLL, + 9, 64, 3, 0xe00000000000003fLL, + 10, 64, 3, 0xe00000000000007fLL, + 11, 64, 3, 0xe0000000000000ffLL, + 12, 64, 3, 0xe0000000000001ffLL, + 13, 64, 3, 0xe0000000000003ffLL, + 14, 64, 3, 0xe0000000000007ffLL, + 15, 64, 3, 0xe000000000000fffLL, + 16, 64, 3, 0xe000000000001fffLL, + 17, 64, 3, 0xe000000000003fffLL, + 18, 64, 3, 0xe000000000007fffLL, + 19, 64, 3, 0xe00000000000ffffLL, + 20, 64, 3, 0xe00000000001ffffLL, + 21, 64, 3, 0xe00000000003ffffLL, + 22, 64, 3, 0xe00000000007ffffLL, + 23, 64, 3, 0xe0000000000fffffLL, + 24, 64, 3, 0xe0000000001fffffLL, + 25, 64, 3, 0xe0000000003fffffLL, + 26, 64, 3, 0xe0000000007fffffLL, + 27, 64, 3, 0xe000000000ffffffLL, + 28, 64, 3, 0xe000000001ffffffLL, + 29, 64, 3, 0xe000000003ffffffLL, + 30, 64, 3, 0xe000000007ffffffLL, + 31, 64, 3, 0xe00000000fffffffLL, + 32, 64, 3, 0xe00000001fffffffLL, + 33, 64, 3, 0xe00000003fffffffLL, + 34, 64, 3, 0xe00000007fffffffLL, + 3, 32, 3, 0xe0000000e0000000LL, + 35, 64, 3, 0xe0000000ffffffffLL, + 4, 32, 3, 0xe0000001e0000001LL, + 36, 64, 3, 0xe0000001ffffffffLL, + 5, 32, 3, 0xe0000003e0000003LL, + 37, 64, 3, 0xe0000003ffffffffLL, + 6, 32, 3, 0xe0000007e0000007LL, + 38, 64, 3, 0xe0000007ffffffffLL, + 7, 32, 3, 0xe000000fe000000fLL, + 39, 64, 3, 0xe000000fffffffffLL, + 8, 32, 3, 0xe000001fe000001fLL, + 40, 64, 3, 0xe000001fffffffffLL, + 9, 32, 3, 0xe000003fe000003fLL, + 41, 64, 3, 0xe000003fffffffffLL, + 10, 32, 3, 0xe000007fe000007fLL, + 42, 64, 3, 0xe000007fffffffffLL, + 11, 32, 3, 0xe00000ffe00000ffLL, + 43, 64, 3, 0xe00000ffffffffffLL, + 12, 32, 3, 0xe00001ffe00001ffLL, + 44, 64, 3, 0xe00001ffffffffffLL, + 13, 32, 3, 0xe00003ffe00003ffLL, + 45, 64, 3, 0xe00003ffffffffffLL, + 14, 32, 3, 0xe00007ffe00007ffLL, + 46, 64, 3, 0xe00007ffffffffffLL, + 15, 32, 3, 0xe0000fffe0000fffLL, + 47, 64, 3, 0xe0000fffffffffffLL, + 16, 32, 3, 0xe0001fffe0001fffLL, + 48, 64, 3, 0xe0001fffffffffffLL, + 17, 32, 3, 0xe0003fffe0003fffLL, + 49, 64, 3, 0xe0003fffffffffffLL, + 18, 32, 3, 0xe0007fffe0007fffLL, + 50, 64, 3, 0xe0007fffffffffffLL, + 3, 16, 3, 0xe000e000e000e000LL, + 19, 32, 3, 0xe000ffffe000ffffLL, + 51, 64, 3, 0xe000ffffffffffffLL, + 4, 16, 3, 0xe001e001e001e001LL, + 20, 32, 3, 0xe001ffffe001ffffLL, + 52, 64, 3, 0xe001ffffffffffffLL, + 5, 16, 3, 0xe003e003e003e003LL, + 21, 32, 3, 0xe003ffffe003ffffLL, + 53, 64, 3, 0xe003ffffffffffffLL, + 6, 16, 3, 0xe007e007e007e007LL, + 22, 32, 3, 0xe007ffffe007ffffLL, + 54, 64, 3, 0xe007ffffffffffffLL, + 7, 16, 3, 0xe00fe00fe00fe00fLL, + 23, 32, 3, 0xe00fffffe00fffffLL, + 55, 64, 3, 0xe00fffffffffffffLL, + 8, 16, 3, 0xe01fe01fe01fe01fLL, + 24, 32, 3, 0xe01fffffe01fffffLL, + 56, 64, 3, 0xe01fffffffffffffLL, + 9, 16, 3, 0xe03fe03fe03fe03fLL, + 25, 32, 3, 0xe03fffffe03fffffLL, + 57, 64, 3, 0xe03fffffffffffffLL, + 10, 16, 3, 0xe07fe07fe07fe07fLL, + 26, 32, 3, 0xe07fffffe07fffffLL, + 58, 64, 3, 0xe07fffffffffffffLL, + 3, 8, 3, 0xe0e0e0e0e0e0e0e0LL, + 11, 16, 3, 0xe0ffe0ffe0ffe0ffLL, + 27, 32, 3, 0xe0ffffffe0ffffffLL, + 59, 64, 3, 0xe0ffffffffffffffLL, + 4, 8, 3, 0xe1e1e1e1e1e1e1e1LL, + 12, 16, 3, 0xe1ffe1ffe1ffe1ffLL, + 28, 32, 3, 0xe1ffffffe1ffffffLL, + 60, 64, 3, 0xe1ffffffffffffffLL, + 5, 8, 3, 0xe3e3e3e3e3e3e3e3LL, + 13, 16, 3, 0xe3ffe3ffe3ffe3ffLL, + 29, 32, 3, 0xe3ffffffe3ffffffLL, + 61, 64, 3, 0xe3ffffffffffffffLL, + 6, 8, 3, 0xe7e7e7e7e7e7e7e7LL, + 14, 16, 3, 0xe7ffe7ffe7ffe7ffLL, + 30, 32, 3, 0xe7ffffffe7ffffffLL, + 62, 64, 3, 0xe7ffffffffffffffLL, + 3, 4, 3, 0xeeeeeeeeeeeeeeeeLL, + 7, 8, 3, 0xefefefefefefefefLL, + 15, 16, 3, 0xefffefffefffefffLL, + 31, 32, 3, 0xefffffffefffffffLL, + 63, 64, 3, 0xefffffffffffffffLL, + 4, 64, 4, 0xf000000000000000LL, + 5, 64, 4, 0xf000000000000001LL, + 6, 64, 4, 0xf000000000000003LL, + 7, 64, 4, 0xf000000000000007LL, + 8, 64, 4, 0xf00000000000000fLL, + 9, 64, 4, 0xf00000000000001fLL, + 10, 64, 4, 0xf00000000000003fLL, + 11, 64, 4, 0xf00000000000007fLL, + 12, 64, 4, 0xf0000000000000ffLL, + 13, 64, 4, 0xf0000000000001ffLL, + 14, 64, 4, 0xf0000000000003ffLL, + 15, 64, 4, 0xf0000000000007ffLL, + 16, 64, 4, 0xf000000000000fffLL, + 17, 64, 4, 0xf000000000001fffLL, + 18, 64, 4, 0xf000000000003fffLL, + 19, 64, 4, 0xf000000000007fffLL, + 20, 64, 4, 0xf00000000000ffffLL, + 21, 64, 4, 0xf00000000001ffffLL, + 22, 64, 4, 0xf00000000003ffffLL, + 23, 64, 4, 0xf00000000007ffffLL, + 24, 64, 4, 0xf0000000000fffffLL, + 25, 64, 4, 0xf0000000001fffffLL, + 26, 64, 4, 0xf0000000003fffffLL, + 27, 64, 4, 0xf0000000007fffffLL, + 28, 64, 4, 0xf000000000ffffffLL, + 29, 64, 4, 0xf000000001ffffffLL, + 30, 64, 4, 0xf000000003ffffffLL, + 31, 64, 4, 0xf000000007ffffffLL, + 32, 64, 4, 0xf00000000fffffffLL, + 33, 64, 4, 0xf00000001fffffffLL, + 34, 64, 4, 0xf00000003fffffffLL, + 35, 64, 4, 0xf00000007fffffffLL, + 4, 32, 4, 0xf0000000f0000000LL, + 36, 64, 4, 0xf0000000ffffffffLL, + 5, 32, 4, 0xf0000001f0000001LL, + 37, 64, 4, 0xf0000001ffffffffLL, + 6, 32, 4, 0xf0000003f0000003LL, + 38, 64, 4, 0xf0000003ffffffffLL, + 7, 32, 4, 0xf0000007f0000007LL, + 39, 64, 4, 0xf0000007ffffffffLL, + 8, 32, 4, 0xf000000ff000000fLL, + 40, 64, 4, 0xf000000fffffffffLL, + 9, 32, 4, 0xf000001ff000001fLL, + 41, 64, 4, 0xf000001fffffffffLL, + 10, 32, 4, 0xf000003ff000003fLL, + 42, 64, 4, 0xf000003fffffffffLL, + 11, 32, 4, 0xf000007ff000007fLL, + 43, 64, 4, 0xf000007fffffffffLL, + 12, 32, 4, 0xf00000fff00000ffLL, + 44, 64, 4, 0xf00000ffffffffffLL, + 13, 32, 4, 0xf00001fff00001ffLL, + 45, 64, 4, 0xf00001ffffffffffLL, + 14, 32, 4, 0xf00003fff00003ffLL, + 46, 64, 4, 0xf00003ffffffffffLL, + 15, 32, 4, 0xf00007fff00007ffLL, + 47, 64, 4, 0xf00007ffffffffffLL, + 16, 32, 4, 0xf0000ffff0000fffLL, + 48, 64, 4, 0xf0000fffffffffffLL, + 17, 32, 4, 0xf0001ffff0001fffLL, + 49, 64, 4, 0xf0001fffffffffffLL, + 18, 32, 4, 0xf0003ffff0003fffLL, + 50, 64, 4, 0xf0003fffffffffffLL, + 19, 32, 4, 0xf0007ffff0007fffLL, + 51, 64, 4, 0xf0007fffffffffffLL, + 4, 16, 4, 0xf000f000f000f000LL, + 20, 32, 4, 0xf000fffff000ffffLL, + 52, 64, 4, 0xf000ffffffffffffLL, + 5, 16, 4, 0xf001f001f001f001LL, + 21, 32, 4, 0xf001fffff001ffffLL, + 53, 64, 4, 0xf001ffffffffffffLL, + 6, 16, 4, 0xf003f003f003f003LL, + 22, 32, 4, 0xf003fffff003ffffLL, + 54, 64, 4, 0xf003ffffffffffffLL, + 7, 16, 4, 0xf007f007f007f007LL, + 23, 32, 4, 0xf007fffff007ffffLL, + 55, 64, 4, 0xf007ffffffffffffLL, + 8, 16, 4, 0xf00ff00ff00ff00fLL, + 24, 32, 4, 0xf00ffffff00fffffLL, + 56, 64, 4, 0xf00fffffffffffffLL, + 9, 16, 4, 0xf01ff01ff01ff01fLL, + 25, 32, 4, 0xf01ffffff01fffffLL, + 57, 64, 4, 0xf01fffffffffffffLL, + 10, 16, 4, 0xf03ff03ff03ff03fLL, + 26, 32, 4, 0xf03ffffff03fffffLL, + 58, 64, 4, 0xf03fffffffffffffLL, + 11, 16, 4, 0xf07ff07ff07ff07fLL, + 27, 32, 4, 0xf07ffffff07fffffLL, + 59, 64, 4, 0xf07fffffffffffffLL, + 4, 8, 4, 0xf0f0f0f0f0f0f0f0LL, + 12, 16, 4, 0xf0fff0fff0fff0ffLL, + 28, 32, 4, 0xf0fffffff0ffffffLL, + 60, 64, 4, 0xf0ffffffffffffffLL, + 5, 8, 4, 0xf1f1f1f1f1f1f1f1LL, + 13, 16, 4, 0xf1fff1fff1fff1ffLL, + 29, 32, 4, 0xf1fffffff1ffffffLL, + 61, 64, 4, 0xf1ffffffffffffffLL, + 6, 8, 4, 0xf3f3f3f3f3f3f3f3LL, + 14, 16, 4, 0xf3fff3fff3fff3ffLL, + 30, 32, 4, 0xf3fffffff3ffffffLL, + 62, 64, 4, 0xf3ffffffffffffffLL, + 7, 8, 4, 0xf7f7f7f7f7f7f7f7LL, + 15, 16, 4, 0xf7fff7fff7fff7ffLL, + 31, 32, 4, 0xf7fffffff7ffffffLL, + 63, 64, 4, 0xf7ffffffffffffffLL, + 5, 64, 5, 0xf800000000000000LL, + 6, 64, 5, 0xf800000000000001LL, + 7, 64, 5, 0xf800000000000003LL, + 8, 64, 5, 0xf800000000000007LL, + 9, 64, 5, 0xf80000000000000fLL, + 10, 64, 5, 0xf80000000000001fLL, + 11, 64, 5, 0xf80000000000003fLL, + 12, 64, 5, 0xf80000000000007fLL, + 13, 64, 5, 0xf8000000000000ffLL, + 14, 64, 5, 0xf8000000000001ffLL, + 15, 64, 5, 0xf8000000000003ffLL, + 16, 64, 5, 0xf8000000000007ffLL, + 17, 64, 5, 0xf800000000000fffLL, + 18, 64, 5, 0xf800000000001fffLL, + 19, 64, 5, 0xf800000000003fffLL, + 20, 64, 5, 0xf800000000007fffLL, + 21, 64, 5, 0xf80000000000ffffLL, + 22, 64, 5, 0xf80000000001ffffLL, + 23, 64, 5, 0xf80000000003ffffLL, + 24, 64, 5, 0xf80000000007ffffLL, + 25, 64, 5, 0xf8000000000fffffLL, + 26, 64, 5, 0xf8000000001fffffLL, + 27, 64, 5, 0xf8000000003fffffLL, + 28, 64, 5, 0xf8000000007fffffLL, + 29, 64, 5, 0xf800000000ffffffLL, + 30, 64, 5, 0xf800000001ffffffLL, + 31, 64, 5, 0xf800000003ffffffLL, + 32, 64, 5, 0xf800000007ffffffLL, + 33, 64, 5, 0xf80000000fffffffLL, + 34, 64, 5, 0xf80000001fffffffLL, + 35, 64, 5, 0xf80000003fffffffLL, + 36, 64, 5, 0xf80000007fffffffLL, + 5, 32, 5, 0xf8000000f8000000LL, + 37, 64, 5, 0xf8000000ffffffffLL, + 6, 32, 5, 0xf8000001f8000001LL, + 38, 64, 5, 0xf8000001ffffffffLL, + 7, 32, 5, 0xf8000003f8000003LL, + 39, 64, 5, 0xf8000003ffffffffLL, + 8, 32, 5, 0xf8000007f8000007LL, + 40, 64, 5, 0xf8000007ffffffffLL, + 9, 32, 5, 0xf800000ff800000fLL, + 41, 64, 5, 0xf800000fffffffffLL, + 10, 32, 5, 0xf800001ff800001fLL, + 42, 64, 5, 0xf800001fffffffffLL, + 11, 32, 5, 0xf800003ff800003fLL, + 43, 64, 5, 0xf800003fffffffffLL, + 12, 32, 5, 0xf800007ff800007fLL, + 44, 64, 5, 0xf800007fffffffffLL, + 13, 32, 5, 0xf80000fff80000ffLL, + 45, 64, 5, 0xf80000ffffffffffLL, + 14, 32, 5, 0xf80001fff80001ffLL, + 46, 64, 5, 0xf80001ffffffffffLL, + 15, 32, 5, 0xf80003fff80003ffLL, + 47, 64, 5, 0xf80003ffffffffffLL, + 16, 32, 5, 0xf80007fff80007ffLL, + 48, 64, 5, 0xf80007ffffffffffLL, + 17, 32, 5, 0xf8000ffff8000fffLL, + 49, 64, 5, 0xf8000fffffffffffLL, + 18, 32, 5, 0xf8001ffff8001fffLL, + 50, 64, 5, 0xf8001fffffffffffLL, + 19, 32, 5, 0xf8003ffff8003fffLL, + 51, 64, 5, 0xf8003fffffffffffLL, + 20, 32, 5, 0xf8007ffff8007fffLL, + 52, 64, 5, 0xf8007fffffffffffLL, + 5, 16, 5, 0xf800f800f800f800LL, + 21, 32, 5, 0xf800fffff800ffffLL, + 53, 64, 5, 0xf800ffffffffffffLL, + 6, 16, 5, 0xf801f801f801f801LL, + 22, 32, 5, 0xf801fffff801ffffLL, + 54, 64, 5, 0xf801ffffffffffffLL, + 7, 16, 5, 0xf803f803f803f803LL, + 23, 32, 5, 0xf803fffff803ffffLL, + 55, 64, 5, 0xf803ffffffffffffLL, + 8, 16, 5, 0xf807f807f807f807LL, + 24, 32, 5, 0xf807fffff807ffffLL, + 56, 64, 5, 0xf807ffffffffffffLL, + 9, 16, 5, 0xf80ff80ff80ff80fLL, + 25, 32, 5, 0xf80ffffff80fffffLL, + 57, 64, 5, 0xf80fffffffffffffLL, + 10, 16, 5, 0xf81ff81ff81ff81fLL, + 26, 32, 5, 0xf81ffffff81fffffLL, + 58, 64, 5, 0xf81fffffffffffffLL, + 11, 16, 5, 0xf83ff83ff83ff83fLL, + 27, 32, 5, 0xf83ffffff83fffffLL, + 59, 64, 5, 0xf83fffffffffffffLL, + 12, 16, 5, 0xf87ff87ff87ff87fLL, + 28, 32, 5, 0xf87ffffff87fffffLL, + 60, 64, 5, 0xf87fffffffffffffLL, + 5, 8, 5, 0xf8f8f8f8f8f8f8f8LL, + 13, 16, 5, 0xf8fff8fff8fff8ffLL, + 29, 32, 5, 0xf8fffffff8ffffffLL, + 61, 64, 5, 0xf8ffffffffffffffLL, + 6, 8, 5, 0xf9f9f9f9f9f9f9f9LL, + 14, 16, 5, 0xf9fff9fff9fff9ffLL, + 30, 32, 5, 0xf9fffffff9ffffffLL, + 62, 64, 5, 0xf9ffffffffffffffLL, + 7, 8, 5, 0xfbfbfbfbfbfbfbfbLL, + 15, 16, 5, 0xfbfffbfffbfffbffLL, + 31, 32, 5, 0xfbfffffffbffffffLL, + 63, 64, 5, 0xfbffffffffffffffLL, + 6, 64, 6, 0xfc00000000000000LL, + 7, 64, 6, 0xfc00000000000001LL, + 8, 64, 6, 0xfc00000000000003LL, + 9, 64, 6, 0xfc00000000000007LL, + 10, 64, 6, 0xfc0000000000000fLL, + 11, 64, 6, 0xfc0000000000001fLL, + 12, 64, 6, 0xfc0000000000003fLL, + 13, 64, 6, 0xfc0000000000007fLL, + 14, 64, 6, 0xfc000000000000ffLL, + 15, 64, 6, 0xfc000000000001ffLL, + 16, 64, 6, 0xfc000000000003ffLL, + 17, 64, 6, 0xfc000000000007ffLL, + 18, 64, 6, 0xfc00000000000fffLL, + 19, 64, 6, 0xfc00000000001fffLL, + 20, 64, 6, 0xfc00000000003fffLL, + 21, 64, 6, 0xfc00000000007fffLL, + 22, 64, 6, 0xfc0000000000ffffLL, + 23, 64, 6, 0xfc0000000001ffffLL, + 24, 64, 6, 0xfc0000000003ffffLL, + 25, 64, 6, 0xfc0000000007ffffLL, + 26, 64, 6, 0xfc000000000fffffLL, + 27, 64, 6, 0xfc000000001fffffLL, + 28, 64, 6, 0xfc000000003fffffLL, + 29, 64, 6, 0xfc000000007fffffLL, + 30, 64, 6, 0xfc00000000ffffffLL, + 31, 64, 6, 0xfc00000001ffffffLL, + 32, 64, 6, 0xfc00000003ffffffLL, + 33, 64, 6, 0xfc00000007ffffffLL, + 34, 64, 6, 0xfc0000000fffffffLL, + 35, 64, 6, 0xfc0000001fffffffLL, + 36, 64, 6, 0xfc0000003fffffffLL, + 37, 64, 6, 0xfc0000007fffffffLL, + 6, 32, 6, 0xfc000000fc000000LL, + 38, 64, 6, 0xfc000000ffffffffLL, + 7, 32, 6, 0xfc000001fc000001LL, + 39, 64, 6, 0xfc000001ffffffffLL, + 8, 32, 6, 0xfc000003fc000003LL, + 40, 64, 6, 0xfc000003ffffffffLL, + 9, 32, 6, 0xfc000007fc000007LL, + 41, 64, 6, 0xfc000007ffffffffLL, + 10, 32, 6, 0xfc00000ffc00000fLL, + 42, 64, 6, 0xfc00000fffffffffLL, + 11, 32, 6, 0xfc00001ffc00001fLL, + 43, 64, 6, 0xfc00001fffffffffLL, + 12, 32, 6, 0xfc00003ffc00003fLL, + 44, 64, 6, 0xfc00003fffffffffLL, + 13, 32, 6, 0xfc00007ffc00007fLL, + 45, 64, 6, 0xfc00007fffffffffLL, + 14, 32, 6, 0xfc0000fffc0000ffLL, + 46, 64, 6, 0xfc0000ffffffffffLL, + 15, 32, 6, 0xfc0001fffc0001ffLL, + 47, 64, 6, 0xfc0001ffffffffffLL, + 16, 32, 6, 0xfc0003fffc0003ffLL, + 48, 64, 6, 0xfc0003ffffffffffLL, + 17, 32, 6, 0xfc0007fffc0007ffLL, + 49, 64, 6, 0xfc0007ffffffffffLL, + 18, 32, 6, 0xfc000ffffc000fffLL, + 50, 64, 6, 0xfc000fffffffffffLL, + 19, 32, 6, 0xfc001ffffc001fffLL, + 51, 64, 6, 0xfc001fffffffffffLL, + 20, 32, 6, 0xfc003ffffc003fffLL, + 52, 64, 6, 0xfc003fffffffffffLL, + 21, 32, 6, 0xfc007ffffc007fffLL, + 53, 64, 6, 0xfc007fffffffffffLL, + 6, 16, 6, 0xfc00fc00fc00fc00LL, + 22, 32, 6, 0xfc00fffffc00ffffLL, + 54, 64, 6, 0xfc00ffffffffffffLL, + 7, 16, 6, 0xfc01fc01fc01fc01LL, + 23, 32, 6, 0xfc01fffffc01ffffLL, + 55, 64, 6, 0xfc01ffffffffffffLL, + 8, 16, 6, 0xfc03fc03fc03fc03LL, + 24, 32, 6, 0xfc03fffffc03ffffLL, + 56, 64, 6, 0xfc03ffffffffffffLL, + 9, 16, 6, 0xfc07fc07fc07fc07LL, + 25, 32, 6, 0xfc07fffffc07ffffLL, + 57, 64, 6, 0xfc07ffffffffffffLL, + 10, 16, 6, 0xfc0ffc0ffc0ffc0fLL, + 26, 32, 6, 0xfc0ffffffc0fffffLL, + 58, 64, 6, 0xfc0fffffffffffffLL, + 11, 16, 6, 0xfc1ffc1ffc1ffc1fLL, + 27, 32, 6, 0xfc1ffffffc1fffffLL, + 59, 64, 6, 0xfc1fffffffffffffLL, + 12, 16, 6, 0xfc3ffc3ffc3ffc3fLL, + 28, 32, 6, 0xfc3ffffffc3fffffLL, + 60, 64, 6, 0xfc3fffffffffffffLL, + 13, 16, 6, 0xfc7ffc7ffc7ffc7fLL, + 29, 32, 6, 0xfc7ffffffc7fffffLL, + 61, 64, 6, 0xfc7fffffffffffffLL, + 6, 8, 6, 0xfcfcfcfcfcfcfcfcLL, + 14, 16, 6, 0xfcfffcfffcfffcffLL, + 30, 32, 6, 0xfcfffffffcffffffLL, + 62, 64, 6, 0xfcffffffffffffffLL, + 7, 8, 6, 0xfdfdfdfdfdfdfdfdLL, + 15, 16, 6, 0xfdfffdfffdfffdffLL, + 31, 32, 6, 0xfdfffffffdffffffLL, + 63, 64, 6, 0xfdffffffffffffffLL, + 7, 64, 7, 0xfe00000000000000LL, + 8, 64, 7, 0xfe00000000000001LL, + 9, 64, 7, 0xfe00000000000003LL, + 10, 64, 7, 0xfe00000000000007LL, + 11, 64, 7, 0xfe0000000000000fLL, + 12, 64, 7, 0xfe0000000000001fLL, + 13, 64, 7, 0xfe0000000000003fLL, + 14, 64, 7, 0xfe0000000000007fLL, + 15, 64, 7, 0xfe000000000000ffLL, + 16, 64, 7, 0xfe000000000001ffLL, + 17, 64, 7, 0xfe000000000003ffLL, + 18, 64, 7, 0xfe000000000007ffLL, + 19, 64, 7, 0xfe00000000000fffLL, + 20, 64, 7, 0xfe00000000001fffLL, + 21, 64, 7, 0xfe00000000003fffLL, + 22, 64, 7, 0xfe00000000007fffLL, + 23, 64, 7, 0xfe0000000000ffffLL, + 24, 64, 7, 0xfe0000000001ffffLL, + 25, 64, 7, 0xfe0000000003ffffLL, + 26, 64, 7, 0xfe0000000007ffffLL, + 27, 64, 7, 0xfe000000000fffffLL, + 28, 64, 7, 0xfe000000001fffffLL, + 29, 64, 7, 0xfe000000003fffffLL, + 30, 64, 7, 0xfe000000007fffffLL, + 31, 64, 7, 0xfe00000000ffffffLL, + 32, 64, 7, 0xfe00000001ffffffLL, + 33, 64, 7, 0xfe00000003ffffffLL, + 34, 64, 7, 0xfe00000007ffffffLL, + 35, 64, 7, 0xfe0000000fffffffLL, + 36, 64, 7, 0xfe0000001fffffffLL, + 37, 64, 7, 0xfe0000003fffffffLL, + 38, 64, 7, 0xfe0000007fffffffLL, + 7, 32, 7, 0xfe000000fe000000LL, + 39, 64, 7, 0xfe000000ffffffffLL, + 8, 32, 7, 0xfe000001fe000001LL, + 40, 64, 7, 0xfe000001ffffffffLL, + 9, 32, 7, 0xfe000003fe000003LL, + 41, 64, 7, 0xfe000003ffffffffLL, + 10, 32, 7, 0xfe000007fe000007LL, + 42, 64, 7, 0xfe000007ffffffffLL, + 11, 32, 7, 0xfe00000ffe00000fLL, + 43, 64, 7, 0xfe00000fffffffffLL, + 12, 32, 7, 0xfe00001ffe00001fLL, + 44, 64, 7, 0xfe00001fffffffffLL, + 13, 32, 7, 0xfe00003ffe00003fLL, + 45, 64, 7, 0xfe00003fffffffffLL, + 14, 32, 7, 0xfe00007ffe00007fLL, + 46, 64, 7, 0xfe00007fffffffffLL, + 15, 32, 7, 0xfe0000fffe0000ffLL, + 47, 64, 7, 0xfe0000ffffffffffLL, + 16, 32, 7, 0xfe0001fffe0001ffLL, + 48, 64, 7, 0xfe0001ffffffffffLL, + 17, 32, 7, 0xfe0003fffe0003ffLL, + 49, 64, 7, 0xfe0003ffffffffffLL, + 18, 32, 7, 0xfe0007fffe0007ffLL, + 50, 64, 7, 0xfe0007ffffffffffLL, + 19, 32, 7, 0xfe000ffffe000fffLL, + 51, 64, 7, 0xfe000fffffffffffLL, + 20, 32, 7, 0xfe001ffffe001fffLL, + 52, 64, 7, 0xfe001fffffffffffLL, + 21, 32, 7, 0xfe003ffffe003fffLL, + 53, 64, 7, 0xfe003fffffffffffLL, + 22, 32, 7, 0xfe007ffffe007fffLL, + 54, 64, 7, 0xfe007fffffffffffLL, + 7, 16, 7, 0xfe00fe00fe00fe00LL, + 23, 32, 7, 0xfe00fffffe00ffffLL, + 55, 64, 7, 0xfe00ffffffffffffLL, + 8, 16, 7, 0xfe01fe01fe01fe01LL, + 24, 32, 7, 0xfe01fffffe01ffffLL, + 56, 64, 7, 0xfe01ffffffffffffLL, + 9, 16, 7, 0xfe03fe03fe03fe03LL, + 25, 32, 7, 0xfe03fffffe03ffffLL, + 57, 64, 7, 0xfe03ffffffffffffLL, + 10, 16, 7, 0xfe07fe07fe07fe07LL, + 26, 32, 7, 0xfe07fffffe07ffffLL, + 58, 64, 7, 0xfe07ffffffffffffLL, + 11, 16, 7, 0xfe0ffe0ffe0ffe0fLL, + 27, 32, 7, 0xfe0ffffffe0fffffLL, + 59, 64, 7, 0xfe0fffffffffffffLL, + 12, 16, 7, 0xfe1ffe1ffe1ffe1fLL, + 28, 32, 7, 0xfe1ffffffe1fffffLL, + 60, 64, 7, 0xfe1fffffffffffffLL, + 13, 16, 7, 0xfe3ffe3ffe3ffe3fLL, + 29, 32, 7, 0xfe3ffffffe3fffffLL, + 61, 64, 7, 0xfe3fffffffffffffLL, + 14, 16, 7, 0xfe7ffe7ffe7ffe7fLL, + 30, 32, 7, 0xfe7ffffffe7fffffLL, + 62, 64, 7, 0xfe7fffffffffffffLL, + 7, 8, 7, 0xfefefefefefefefeLL, + 15, 16, 7, 0xfefffefffefffeffLL, + 31, 32, 7, 0xfefffffffeffffffLL, + 63, 64, 7, 0xfeffffffffffffffLL, + 8, 64, 8, 0xff00000000000000LL, + 9, 64, 8, 0xff00000000000001LL, + 10, 64, 8, 0xff00000000000003LL, + 11, 64, 8, 0xff00000000000007LL, + 12, 64, 8, 0xff0000000000000fLL, + 13, 64, 8, 0xff0000000000001fLL, + 14, 64, 8, 0xff0000000000003fLL, + 15, 64, 8, 0xff0000000000007fLL, + 16, 64, 8, 0xff000000000000ffLL, + 17, 64, 8, 0xff000000000001ffLL, + 18, 64, 8, 0xff000000000003ffLL, + 19, 64, 8, 0xff000000000007ffLL, + 20, 64, 8, 0xff00000000000fffLL, + 21, 64, 8, 0xff00000000001fffLL, + 22, 64, 8, 0xff00000000003fffLL, + 23, 64, 8, 0xff00000000007fffLL, + 24, 64, 8, 0xff0000000000ffffLL, + 25, 64, 8, 0xff0000000001ffffLL, + 26, 64, 8, 0xff0000000003ffffLL, + 27, 64, 8, 0xff0000000007ffffLL, + 28, 64, 8, 0xff000000000fffffLL, + 29, 64, 8, 0xff000000001fffffLL, + 30, 64, 8, 0xff000000003fffffLL, + 31, 64, 8, 0xff000000007fffffLL, + 32, 64, 8, 0xff00000000ffffffLL, + 33, 64, 8, 0xff00000001ffffffLL, + 34, 64, 8, 0xff00000003ffffffLL, + 35, 64, 8, 0xff00000007ffffffLL, + 36, 64, 8, 0xff0000000fffffffLL, + 37, 64, 8, 0xff0000001fffffffLL, + 38, 64, 8, 0xff0000003fffffffLL, + 39, 64, 8, 0xff0000007fffffffLL, + 8, 32, 8, 0xff000000ff000000LL, + 40, 64, 8, 0xff000000ffffffffLL, + 9, 32, 8, 0xff000001ff000001LL, + 41, 64, 8, 0xff000001ffffffffLL, + 10, 32, 8, 0xff000003ff000003LL, + 42, 64, 8, 0xff000003ffffffffLL, + 11, 32, 8, 0xff000007ff000007LL, + 43, 64, 8, 0xff000007ffffffffLL, + 12, 32, 8, 0xff00000fff00000fLL, + 44, 64, 8, 0xff00000fffffffffLL, + 13, 32, 8, 0xff00001fff00001fLL, + 45, 64, 8, 0xff00001fffffffffLL, + 14, 32, 8, 0xff00003fff00003fLL, + 46, 64, 8, 0xff00003fffffffffLL, + 15, 32, 8, 0xff00007fff00007fLL, + 47, 64, 8, 0xff00007fffffffffLL, + 16, 32, 8, 0xff0000ffff0000ffLL, + 48, 64, 8, 0xff0000ffffffffffLL, + 17, 32, 8, 0xff0001ffff0001ffLL, + 49, 64, 8, 0xff0001ffffffffffLL, + 18, 32, 8, 0xff0003ffff0003ffLL, + 50, 64, 8, 0xff0003ffffffffffLL, + 19, 32, 8, 0xff0007ffff0007ffLL, + 51, 64, 8, 0xff0007ffffffffffLL, + 20, 32, 8, 0xff000fffff000fffLL, + 52, 64, 8, 0xff000fffffffffffLL, + 21, 32, 8, 0xff001fffff001fffLL, + 53, 64, 8, 0xff001fffffffffffLL, + 22, 32, 8, 0xff003fffff003fffLL, + 54, 64, 8, 0xff003fffffffffffLL, + 23, 32, 8, 0xff007fffff007fffLL, + 55, 64, 8, 0xff007fffffffffffLL, + 8, 16, 8, 0xff00ff00ff00ff00LL, + 24, 32, 8, 0xff00ffffff00ffffLL, + 56, 64, 8, 0xff00ffffffffffffLL, + 9, 16, 8, 0xff01ff01ff01ff01LL, + 25, 32, 8, 0xff01ffffff01ffffLL, + 57, 64, 8, 0xff01ffffffffffffLL, + 10, 16, 8, 0xff03ff03ff03ff03LL, + 26, 32, 8, 0xff03ffffff03ffffLL, + 58, 64, 8, 0xff03ffffffffffffLL, + 11, 16, 8, 0xff07ff07ff07ff07LL, + 27, 32, 8, 0xff07ffffff07ffffLL, + 59, 64, 8, 0xff07ffffffffffffLL, + 12, 16, 8, 0xff0fff0fff0fff0fLL, + 28, 32, 8, 0xff0fffffff0fffffLL, + 60, 64, 8, 0xff0fffffffffffffLL, + 13, 16, 8, 0xff1fff1fff1fff1fLL, + 29, 32, 8, 0xff1fffffff1fffffLL, + 61, 64, 8, 0xff1fffffffffffffLL, + 14, 16, 8, 0xff3fff3fff3fff3fLL, + 30, 32, 8, 0xff3fffffff3fffffLL, + 62, 64, 8, 0xff3fffffffffffffLL, + 15, 16, 8, 0xff7fff7fff7fff7fLL, + 31, 32, 8, 0xff7fffffff7fffffLL, + 63, 64, 8, 0xff7fffffffffffffLL, + 9, 64, 9, 0xff80000000000000LL, + 10, 64, 9, 0xff80000000000001LL, + 11, 64, 9, 0xff80000000000003LL, + 12, 64, 9, 0xff80000000000007LL, + 13, 64, 9, 0xff8000000000000fLL, + 14, 64, 9, 0xff8000000000001fLL, + 15, 64, 9, 0xff8000000000003fLL, + 16, 64, 9, 0xff8000000000007fLL, + 17, 64, 9, 0xff800000000000ffLL, + 18, 64, 9, 0xff800000000001ffLL, + 19, 64, 9, 0xff800000000003ffLL, + 20, 64, 9, 0xff800000000007ffLL, + 21, 64, 9, 0xff80000000000fffLL, + 22, 64, 9, 0xff80000000001fffLL, + 23, 64, 9, 0xff80000000003fffLL, + 24, 64, 9, 0xff80000000007fffLL, + 25, 64, 9, 0xff8000000000ffffLL, + 26, 64, 9, 0xff8000000001ffffLL, + 27, 64, 9, 0xff8000000003ffffLL, + 28, 64, 9, 0xff8000000007ffffLL, + 29, 64, 9, 0xff800000000fffffLL, + 30, 64, 9, 0xff800000001fffffLL, + 31, 64, 9, 0xff800000003fffffLL, + 32, 64, 9, 0xff800000007fffffLL, + 33, 64, 9, 0xff80000000ffffffLL, + 34, 64, 9, 0xff80000001ffffffLL, + 35, 64, 9, 0xff80000003ffffffLL, + 36, 64, 9, 0xff80000007ffffffLL, + 37, 64, 9, 0xff8000000fffffffLL, + 38, 64, 9, 0xff8000001fffffffLL, + 39, 64, 9, 0xff8000003fffffffLL, + 40, 64, 9, 0xff8000007fffffffLL, + 9, 32, 9, 0xff800000ff800000LL, + 41, 64, 9, 0xff800000ffffffffLL, + 10, 32, 9, 0xff800001ff800001LL, + 42, 64, 9, 0xff800001ffffffffLL, + 11, 32, 9, 0xff800003ff800003LL, + 43, 64, 9, 0xff800003ffffffffLL, + 12, 32, 9, 0xff800007ff800007LL, + 44, 64, 9, 0xff800007ffffffffLL, + 13, 32, 9, 0xff80000fff80000fLL, + 45, 64, 9, 0xff80000fffffffffLL, + 14, 32, 9, 0xff80001fff80001fLL, + 46, 64, 9, 0xff80001fffffffffLL, + 15, 32, 9, 0xff80003fff80003fLL, + 47, 64, 9, 0xff80003fffffffffLL, + 16, 32, 9, 0xff80007fff80007fLL, + 48, 64, 9, 0xff80007fffffffffLL, + 17, 32, 9, 0xff8000ffff8000ffLL, + 49, 64, 9, 0xff8000ffffffffffLL, + 18, 32, 9, 0xff8001ffff8001ffLL, + 50, 64, 9, 0xff8001ffffffffffLL, + 19, 32, 9, 0xff8003ffff8003ffLL, + 51, 64, 9, 0xff8003ffffffffffLL, + 20, 32, 9, 0xff8007ffff8007ffLL, + 52, 64, 9, 0xff8007ffffffffffLL, + 21, 32, 9, 0xff800fffff800fffLL, + 53, 64, 9, 0xff800fffffffffffLL, + 22, 32, 9, 0xff801fffff801fffLL, + 54, 64, 9, 0xff801fffffffffffLL, + 23, 32, 9, 0xff803fffff803fffLL, + 55, 64, 9, 0xff803fffffffffffLL, + 24, 32, 9, 0xff807fffff807fffLL, + 56, 64, 9, 0xff807fffffffffffLL, + 9, 16, 9, 0xff80ff80ff80ff80LL, + 25, 32, 9, 0xff80ffffff80ffffLL, + 57, 64, 9, 0xff80ffffffffffffLL, + 10, 16, 9, 0xff81ff81ff81ff81LL, + 26, 32, 9, 0xff81ffffff81ffffLL, + 58, 64, 9, 0xff81ffffffffffffLL, + 11, 16, 9, 0xff83ff83ff83ff83LL, + 27, 32, 9, 0xff83ffffff83ffffLL, + 59, 64, 9, 0xff83ffffffffffffLL, + 12, 16, 9, 0xff87ff87ff87ff87LL, + 28, 32, 9, 0xff87ffffff87ffffLL, + 60, 64, 9, 0xff87ffffffffffffLL, + 13, 16, 9, 0xff8fff8fff8fff8fLL, + 29, 32, 9, 0xff8fffffff8fffffLL, + 61, 64, 9, 0xff8fffffffffffffLL, + 14, 16, 9, 0xff9fff9fff9fff9fLL, + 30, 32, 9, 0xff9fffffff9fffffLL, + 62, 64, 9, 0xff9fffffffffffffLL, + 15, 16, 9, 0xffbfffbfffbfffbfLL, + 31, 32, 9, 0xffbfffffffbfffffLL, + 63, 64, 9, 0xffbfffffffffffffLL, + 10, 64, 10, 0xffc0000000000000LL, + 11, 64, 10, 0xffc0000000000001LL, + 12, 64, 10, 0xffc0000000000003LL, + 13, 64, 10, 0xffc0000000000007LL, + 14, 64, 10, 0xffc000000000000fLL, + 15, 64, 10, 0xffc000000000001fLL, + 16, 64, 10, 0xffc000000000003fLL, + 17, 64, 10, 0xffc000000000007fLL, + 18, 64, 10, 0xffc00000000000ffLL, + 19, 64, 10, 0xffc00000000001ffLL, + 20, 64, 10, 0xffc00000000003ffLL, + 21, 64, 10, 0xffc00000000007ffLL, + 22, 64, 10, 0xffc0000000000fffLL, + 23, 64, 10, 0xffc0000000001fffLL, + 24, 64, 10, 0xffc0000000003fffLL, + 25, 64, 10, 0xffc0000000007fffLL, + 26, 64, 10, 0xffc000000000ffffLL, + 27, 64, 10, 0xffc000000001ffffLL, + 28, 64, 10, 0xffc000000003ffffLL, + 29, 64, 10, 0xffc000000007ffffLL, + 30, 64, 10, 0xffc00000000fffffLL, + 31, 64, 10, 0xffc00000001fffffLL, + 32, 64, 10, 0xffc00000003fffffLL, + 33, 64, 10, 0xffc00000007fffffLL, + 34, 64, 10, 0xffc0000000ffffffLL, + 35, 64, 10, 0xffc0000001ffffffLL, + 36, 64, 10, 0xffc0000003ffffffLL, + 37, 64, 10, 0xffc0000007ffffffLL, + 38, 64, 10, 0xffc000000fffffffLL, + 39, 64, 10, 0xffc000001fffffffLL, + 40, 64, 10, 0xffc000003fffffffLL, + 41, 64, 10, 0xffc000007fffffffLL, + 10, 32, 10, 0xffc00000ffc00000LL, + 42, 64, 10, 0xffc00000ffffffffLL, + 11, 32, 10, 0xffc00001ffc00001LL, + 43, 64, 10, 0xffc00001ffffffffLL, + 12, 32, 10, 0xffc00003ffc00003LL, + 44, 64, 10, 0xffc00003ffffffffLL, + 13, 32, 10, 0xffc00007ffc00007LL, + 45, 64, 10, 0xffc00007ffffffffLL, + 14, 32, 10, 0xffc0000fffc0000fLL, + 46, 64, 10, 0xffc0000fffffffffLL, + 15, 32, 10, 0xffc0001fffc0001fLL, + 47, 64, 10, 0xffc0001fffffffffLL, + 16, 32, 10, 0xffc0003fffc0003fLL, + 48, 64, 10, 0xffc0003fffffffffLL, + 17, 32, 10, 0xffc0007fffc0007fLL, + 49, 64, 10, 0xffc0007fffffffffLL, + 18, 32, 10, 0xffc000ffffc000ffLL, + 50, 64, 10, 0xffc000ffffffffffLL, + 19, 32, 10, 0xffc001ffffc001ffLL, + 51, 64, 10, 0xffc001ffffffffffLL, + 20, 32, 10, 0xffc003ffffc003ffLL, + 52, 64, 10, 0xffc003ffffffffffLL, + 21, 32, 10, 0xffc007ffffc007ffLL, + 53, 64, 10, 0xffc007ffffffffffLL, + 22, 32, 10, 0xffc00fffffc00fffLL, + 54, 64, 10, 0xffc00fffffffffffLL, + 23, 32, 10, 0xffc01fffffc01fffLL, + 55, 64, 10, 0xffc01fffffffffffLL, + 24, 32, 10, 0xffc03fffffc03fffLL, + 56, 64, 10, 0xffc03fffffffffffLL, + 25, 32, 10, 0xffc07fffffc07fffLL, + 57, 64, 10, 0xffc07fffffffffffLL, + 10, 16, 10, 0xffc0ffc0ffc0ffc0LL, + 26, 32, 10, 0xffc0ffffffc0ffffLL, + 58, 64, 10, 0xffc0ffffffffffffLL, + 11, 16, 10, 0xffc1ffc1ffc1ffc1LL, + 27, 32, 10, 0xffc1ffffffc1ffffLL, + 59, 64, 10, 0xffc1ffffffffffffLL, + 12, 16, 10, 0xffc3ffc3ffc3ffc3LL, + 28, 32, 10, 0xffc3ffffffc3ffffLL, + 60, 64, 10, 0xffc3ffffffffffffLL, + 13, 16, 10, 0xffc7ffc7ffc7ffc7LL, + 29, 32, 10, 0xffc7ffffffc7ffffLL, + 61, 64, 10, 0xffc7ffffffffffffLL, + 14, 16, 10, 0xffcfffcfffcfffcfLL, + 30, 32, 10, 0xffcfffffffcfffffLL, + 62, 64, 10, 0xffcfffffffffffffLL, + 15, 16, 10, 0xffdfffdfffdfffdfLL, + 31, 32, 10, 0xffdfffffffdfffffLL, + 63, 64, 10, 0xffdfffffffffffffLL, + 11, 64, 11, 0xffe0000000000000LL, + 12, 64, 11, 0xffe0000000000001LL, + 13, 64, 11, 0xffe0000000000003LL, + 14, 64, 11, 0xffe0000000000007LL, + 15, 64, 11, 0xffe000000000000fLL, + 16, 64, 11, 0xffe000000000001fLL, + 17, 64, 11, 0xffe000000000003fLL, + 18, 64, 11, 0xffe000000000007fLL, + 19, 64, 11, 0xffe00000000000ffLL, + 20, 64, 11, 0xffe00000000001ffLL, + 21, 64, 11, 0xffe00000000003ffLL, + 22, 64, 11, 0xffe00000000007ffLL, + 23, 64, 11, 0xffe0000000000fffLL, + 24, 64, 11, 0xffe0000000001fffLL, + 25, 64, 11, 0xffe0000000003fffLL, + 26, 64, 11, 0xffe0000000007fffLL, + 27, 64, 11, 0xffe000000000ffffLL, + 28, 64, 11, 0xffe000000001ffffLL, + 29, 64, 11, 0xffe000000003ffffLL, + 30, 64, 11, 0xffe000000007ffffLL, + 31, 64, 11, 0xffe00000000fffffLL, + 32, 64, 11, 0xffe00000001fffffLL, + 33, 64, 11, 0xffe00000003fffffLL, + 34, 64, 11, 0xffe00000007fffffLL, + 35, 64, 11, 0xffe0000000ffffffLL, + 36, 64, 11, 0xffe0000001ffffffLL, + 37, 64, 11, 0xffe0000003ffffffLL, + 38, 64, 11, 0xffe0000007ffffffLL, + 39, 64, 11, 0xffe000000fffffffLL, + 40, 64, 11, 0xffe000001fffffffLL, + 41, 64, 11, 0xffe000003fffffffLL, + 42, 64, 11, 0xffe000007fffffffLL, + 11, 32, 11, 0xffe00000ffe00000LL, + 43, 64, 11, 0xffe00000ffffffffLL, + 12, 32, 11, 0xffe00001ffe00001LL, + 44, 64, 11, 0xffe00001ffffffffLL, + 13, 32, 11, 0xffe00003ffe00003LL, + 45, 64, 11, 0xffe00003ffffffffLL, + 14, 32, 11, 0xffe00007ffe00007LL, + 46, 64, 11, 0xffe00007ffffffffLL, + 15, 32, 11, 0xffe0000fffe0000fLL, + 47, 64, 11, 0xffe0000fffffffffLL, + 16, 32, 11, 0xffe0001fffe0001fLL, + 48, 64, 11, 0xffe0001fffffffffLL, + 17, 32, 11, 0xffe0003fffe0003fLL, + 49, 64, 11, 0xffe0003fffffffffLL, + 18, 32, 11, 0xffe0007fffe0007fLL, + 50, 64, 11, 0xffe0007fffffffffLL, + 19, 32, 11, 0xffe000ffffe000ffLL, + 51, 64, 11, 0xffe000ffffffffffLL, + 20, 32, 11, 0xffe001ffffe001ffLL, + 52, 64, 11, 0xffe001ffffffffffLL, + 21, 32, 11, 0xffe003ffffe003ffLL, + 53, 64, 11, 0xffe003ffffffffffLL, + 22, 32, 11, 0xffe007ffffe007ffLL, + 54, 64, 11, 0xffe007ffffffffffLL, + 23, 32, 11, 0xffe00fffffe00fffLL, + 55, 64, 11, 0xffe00fffffffffffLL, + 24, 32, 11, 0xffe01fffffe01fffLL, + 56, 64, 11, 0xffe01fffffffffffLL, + 25, 32, 11, 0xffe03fffffe03fffLL, + 57, 64, 11, 0xffe03fffffffffffLL, + 26, 32, 11, 0xffe07fffffe07fffLL, + 58, 64, 11, 0xffe07fffffffffffLL, + 11, 16, 11, 0xffe0ffe0ffe0ffe0LL, + 27, 32, 11, 0xffe0ffffffe0ffffLL, + 59, 64, 11, 0xffe0ffffffffffffLL, + 12, 16, 11, 0xffe1ffe1ffe1ffe1LL, + 28, 32, 11, 0xffe1ffffffe1ffffLL, + 60, 64, 11, 0xffe1ffffffffffffLL, + 13, 16, 11, 0xffe3ffe3ffe3ffe3LL, + 29, 32, 11, 0xffe3ffffffe3ffffLL, + 61, 64, 11, 0xffe3ffffffffffffLL, + 14, 16, 11, 0xffe7ffe7ffe7ffe7LL, + 30, 32, 11, 0xffe7ffffffe7ffffLL, + 62, 64, 11, 0xffe7ffffffffffffLL, + 15, 16, 11, 0xffefffefffefffefLL, + 31, 32, 11, 0xffefffffffefffffLL, + 63, 64, 11, 0xffefffffffffffffLL, + 12, 64, 12, 0xfff0000000000000LL, + 13, 64, 12, 0xfff0000000000001LL, + 14, 64, 12, 0xfff0000000000003LL, + 15, 64, 12, 0xfff0000000000007LL, + 16, 64, 12, 0xfff000000000000fLL, + 17, 64, 12, 0xfff000000000001fLL, + 18, 64, 12, 0xfff000000000003fLL, + 19, 64, 12, 0xfff000000000007fLL, + 20, 64, 12, 0xfff00000000000ffLL, + 21, 64, 12, 0xfff00000000001ffLL, + 22, 64, 12, 0xfff00000000003ffLL, + 23, 64, 12, 0xfff00000000007ffLL, + 24, 64, 12, 0xfff0000000000fffLL, + 25, 64, 12, 0xfff0000000001fffLL, + 26, 64, 12, 0xfff0000000003fffLL, + 27, 64, 12, 0xfff0000000007fffLL, + 28, 64, 12, 0xfff000000000ffffLL, + 29, 64, 12, 0xfff000000001ffffLL, + 30, 64, 12, 0xfff000000003ffffLL, + 31, 64, 12, 0xfff000000007ffffLL, + 32, 64, 12, 0xfff00000000fffffLL, + 33, 64, 12, 0xfff00000001fffffLL, + 34, 64, 12, 0xfff00000003fffffLL, + 35, 64, 12, 0xfff00000007fffffLL, + 36, 64, 12, 0xfff0000000ffffffLL, + 37, 64, 12, 0xfff0000001ffffffLL, + 38, 64, 12, 0xfff0000003ffffffLL, + 39, 64, 12, 0xfff0000007ffffffLL, + 40, 64, 12, 0xfff000000fffffffLL, + 41, 64, 12, 0xfff000001fffffffLL, + 42, 64, 12, 0xfff000003fffffffLL, + 43, 64, 12, 0xfff000007fffffffLL, + 12, 32, 12, 0xfff00000fff00000LL, + 44, 64, 12, 0xfff00000ffffffffLL, + 13, 32, 12, 0xfff00001fff00001LL, + 45, 64, 12, 0xfff00001ffffffffLL, + 14, 32, 12, 0xfff00003fff00003LL, + 46, 64, 12, 0xfff00003ffffffffLL, + 15, 32, 12, 0xfff00007fff00007LL, + 47, 64, 12, 0xfff00007ffffffffLL, + 16, 32, 12, 0xfff0000ffff0000fLL, + 48, 64, 12, 0xfff0000fffffffffLL, + 17, 32, 12, 0xfff0001ffff0001fLL, + 49, 64, 12, 0xfff0001fffffffffLL, + 18, 32, 12, 0xfff0003ffff0003fLL, + 50, 64, 12, 0xfff0003fffffffffLL, + 19, 32, 12, 0xfff0007ffff0007fLL, + 51, 64, 12, 0xfff0007fffffffffLL, + 20, 32, 12, 0xfff000fffff000ffLL, + 52, 64, 12, 0xfff000ffffffffffLL, + 21, 32, 12, 0xfff001fffff001ffLL, + 53, 64, 12, 0xfff001ffffffffffLL, + 22, 32, 12, 0xfff003fffff003ffLL, + 54, 64, 12, 0xfff003ffffffffffLL, + 23, 32, 12, 0xfff007fffff007ffLL, + 55, 64, 12, 0xfff007ffffffffffLL, + 24, 32, 12, 0xfff00ffffff00fffLL, + 56, 64, 12, 0xfff00fffffffffffLL, + 25, 32, 12, 0xfff01ffffff01fffLL, + 57, 64, 12, 0xfff01fffffffffffLL, + 26, 32, 12, 0xfff03ffffff03fffLL, + 58, 64, 12, 0xfff03fffffffffffLL, + 27, 32, 12, 0xfff07ffffff07fffLL, + 59, 64, 12, 0xfff07fffffffffffLL, + 12, 16, 12, 0xfff0fff0fff0fff0LL, + 28, 32, 12, 0xfff0fffffff0ffffLL, + 60, 64, 12, 0xfff0ffffffffffffLL, + 13, 16, 12, 0xfff1fff1fff1fff1LL, + 29, 32, 12, 0xfff1fffffff1ffffLL, + 61, 64, 12, 0xfff1ffffffffffffLL, + 14, 16, 12, 0xfff3fff3fff3fff3LL, + 30, 32, 12, 0xfff3fffffff3ffffLL, + 62, 64, 12, 0xfff3ffffffffffffLL, + 15, 16, 12, 0xfff7fff7fff7fff7LL, + 31, 32, 12, 0xfff7fffffff7ffffLL, + 63, 64, 12, 0xfff7ffffffffffffLL, + 13, 64, 13, 0xfff8000000000000LL, + 14, 64, 13, 0xfff8000000000001LL, + 15, 64, 13, 0xfff8000000000003LL, + 16, 64, 13, 0xfff8000000000007LL, + 17, 64, 13, 0xfff800000000000fLL, + 18, 64, 13, 0xfff800000000001fLL, + 19, 64, 13, 0xfff800000000003fLL, + 20, 64, 13, 0xfff800000000007fLL, + 21, 64, 13, 0xfff80000000000ffLL, + 22, 64, 13, 0xfff80000000001ffLL, + 23, 64, 13, 0xfff80000000003ffLL, + 24, 64, 13, 0xfff80000000007ffLL, + 25, 64, 13, 0xfff8000000000fffLL, + 26, 64, 13, 0xfff8000000001fffLL, + 27, 64, 13, 0xfff8000000003fffLL, + 28, 64, 13, 0xfff8000000007fffLL, + 29, 64, 13, 0xfff800000000ffffLL, + 30, 64, 13, 0xfff800000001ffffLL, + 31, 64, 13, 0xfff800000003ffffLL, + 32, 64, 13, 0xfff800000007ffffLL, + 33, 64, 13, 0xfff80000000fffffLL, + 34, 64, 13, 0xfff80000001fffffLL, + 35, 64, 13, 0xfff80000003fffffLL, + 36, 64, 13, 0xfff80000007fffffLL, + 37, 64, 13, 0xfff8000000ffffffLL, + 38, 64, 13, 0xfff8000001ffffffLL, + 39, 64, 13, 0xfff8000003ffffffLL, + 40, 64, 13, 0xfff8000007ffffffLL, + 41, 64, 13, 0xfff800000fffffffLL, + 42, 64, 13, 0xfff800001fffffffLL, + 43, 64, 13, 0xfff800003fffffffLL, + 44, 64, 13, 0xfff800007fffffffLL, + 13, 32, 13, 0xfff80000fff80000LL, + 45, 64, 13, 0xfff80000ffffffffLL, + 14, 32, 13, 0xfff80001fff80001LL, + 46, 64, 13, 0xfff80001ffffffffLL, + 15, 32, 13, 0xfff80003fff80003LL, + 47, 64, 13, 0xfff80003ffffffffLL, + 16, 32, 13, 0xfff80007fff80007LL, + 48, 64, 13, 0xfff80007ffffffffLL, + 17, 32, 13, 0xfff8000ffff8000fLL, + 49, 64, 13, 0xfff8000fffffffffLL, + 18, 32, 13, 0xfff8001ffff8001fLL, + 50, 64, 13, 0xfff8001fffffffffLL, + 19, 32, 13, 0xfff8003ffff8003fLL, + 51, 64, 13, 0xfff8003fffffffffLL, + 20, 32, 13, 0xfff8007ffff8007fLL, + 52, 64, 13, 0xfff8007fffffffffLL, + 21, 32, 13, 0xfff800fffff800ffLL, + 53, 64, 13, 0xfff800ffffffffffLL, + 22, 32, 13, 0xfff801fffff801ffLL, + 54, 64, 13, 0xfff801ffffffffffLL, + 23, 32, 13, 0xfff803fffff803ffLL, + 55, 64, 13, 0xfff803ffffffffffLL, + 24, 32, 13, 0xfff807fffff807ffLL, + 56, 64, 13, 0xfff807ffffffffffLL, + 25, 32, 13, 0xfff80ffffff80fffLL, + 57, 64, 13, 0xfff80fffffffffffLL, + 26, 32, 13, 0xfff81ffffff81fffLL, + 58, 64, 13, 0xfff81fffffffffffLL, + 27, 32, 13, 0xfff83ffffff83fffLL, + 59, 64, 13, 0xfff83fffffffffffLL, + 28, 32, 13, 0xfff87ffffff87fffLL, + 60, 64, 13, 0xfff87fffffffffffLL, + 13, 16, 13, 0xfff8fff8fff8fff8LL, + 29, 32, 13, 0xfff8fffffff8ffffLL, + 61, 64, 13, 0xfff8ffffffffffffLL, + 14, 16, 13, 0xfff9fff9fff9fff9LL, + 30, 32, 13, 0xfff9fffffff9ffffLL, + 62, 64, 13, 0xfff9ffffffffffffLL, + 15, 16, 13, 0xfffbfffbfffbfffbLL, + 31, 32, 13, 0xfffbfffffffbffffLL, + 63, 64, 13, 0xfffbffffffffffffLL, + 14, 64, 14, 0xfffc000000000000LL, + 15, 64, 14, 0xfffc000000000001LL, + 16, 64, 14, 0xfffc000000000003LL, + 17, 64, 14, 0xfffc000000000007LL, + 18, 64, 14, 0xfffc00000000000fLL, + 19, 64, 14, 0xfffc00000000001fLL, + 20, 64, 14, 0xfffc00000000003fLL, + 21, 64, 14, 0xfffc00000000007fLL, + 22, 64, 14, 0xfffc0000000000ffLL, + 23, 64, 14, 0xfffc0000000001ffLL, + 24, 64, 14, 0xfffc0000000003ffLL, + 25, 64, 14, 0xfffc0000000007ffLL, + 26, 64, 14, 0xfffc000000000fffLL, + 27, 64, 14, 0xfffc000000001fffLL, + 28, 64, 14, 0xfffc000000003fffLL, + 29, 64, 14, 0xfffc000000007fffLL, + 30, 64, 14, 0xfffc00000000ffffLL, + 31, 64, 14, 0xfffc00000001ffffLL, + 32, 64, 14, 0xfffc00000003ffffLL, + 33, 64, 14, 0xfffc00000007ffffLL, + 34, 64, 14, 0xfffc0000000fffffLL, + 35, 64, 14, 0xfffc0000001fffffLL, + 36, 64, 14, 0xfffc0000003fffffLL, + 37, 64, 14, 0xfffc0000007fffffLL, + 38, 64, 14, 0xfffc000000ffffffLL, + 39, 64, 14, 0xfffc000001ffffffLL, + 40, 64, 14, 0xfffc000003ffffffLL, + 41, 64, 14, 0xfffc000007ffffffLL, + 42, 64, 14, 0xfffc00000fffffffLL, + 43, 64, 14, 0xfffc00001fffffffLL, + 44, 64, 14, 0xfffc00003fffffffLL, + 45, 64, 14, 0xfffc00007fffffffLL, + 14, 32, 14, 0xfffc0000fffc0000LL, + 46, 64, 14, 0xfffc0000ffffffffLL, + 15, 32, 14, 0xfffc0001fffc0001LL, + 47, 64, 14, 0xfffc0001ffffffffLL, + 16, 32, 14, 0xfffc0003fffc0003LL, + 48, 64, 14, 0xfffc0003ffffffffLL, + 17, 32, 14, 0xfffc0007fffc0007LL, + 49, 64, 14, 0xfffc0007ffffffffLL, + 18, 32, 14, 0xfffc000ffffc000fLL, + 50, 64, 14, 0xfffc000fffffffffLL, + 19, 32, 14, 0xfffc001ffffc001fLL, + 51, 64, 14, 0xfffc001fffffffffLL, + 20, 32, 14, 0xfffc003ffffc003fLL, + 52, 64, 14, 0xfffc003fffffffffLL, + 21, 32, 14, 0xfffc007ffffc007fLL, + 53, 64, 14, 0xfffc007fffffffffLL, + 22, 32, 14, 0xfffc00fffffc00ffLL, + 54, 64, 14, 0xfffc00ffffffffffLL, + 23, 32, 14, 0xfffc01fffffc01ffLL, + 55, 64, 14, 0xfffc01ffffffffffLL, + 24, 32, 14, 0xfffc03fffffc03ffLL, + 56, 64, 14, 0xfffc03ffffffffffLL, + 25, 32, 14, 0xfffc07fffffc07ffLL, + 57, 64, 14, 0xfffc07ffffffffffLL, + 26, 32, 14, 0xfffc0ffffffc0fffLL, + 58, 64, 14, 0xfffc0fffffffffffLL, + 27, 32, 14, 0xfffc1ffffffc1fffLL, + 59, 64, 14, 0xfffc1fffffffffffLL, + 28, 32, 14, 0xfffc3ffffffc3fffLL, + 60, 64, 14, 0xfffc3fffffffffffLL, + 29, 32, 14, 0xfffc7ffffffc7fffLL, + 61, 64, 14, 0xfffc7fffffffffffLL, + 14, 16, 14, 0xfffcfffcfffcfffcLL, + 30, 32, 14, 0xfffcfffffffcffffLL, + 62, 64, 14, 0xfffcffffffffffffLL, + 15, 16, 14, 0xfffdfffdfffdfffdLL, + 31, 32, 14, 0xfffdfffffffdffffLL, + 63, 64, 14, 0xfffdffffffffffffLL, + 15, 64, 15, 0xfffe000000000000LL, + 16, 64, 15, 0xfffe000000000001LL, + 17, 64, 15, 0xfffe000000000003LL, + 18, 64, 15, 0xfffe000000000007LL, + 19, 64, 15, 0xfffe00000000000fLL, + 20, 64, 15, 0xfffe00000000001fLL, + 21, 64, 15, 0xfffe00000000003fLL, + 22, 64, 15, 0xfffe00000000007fLL, + 23, 64, 15, 0xfffe0000000000ffLL, + 24, 64, 15, 0xfffe0000000001ffLL, + 25, 64, 15, 0xfffe0000000003ffLL, + 26, 64, 15, 0xfffe0000000007ffLL, + 27, 64, 15, 0xfffe000000000fffLL, + 28, 64, 15, 0xfffe000000001fffLL, + 29, 64, 15, 0xfffe000000003fffLL, + 30, 64, 15, 0xfffe000000007fffLL, + 31, 64, 15, 0xfffe00000000ffffLL, + 32, 64, 15, 0xfffe00000001ffffLL, + 33, 64, 15, 0xfffe00000003ffffLL, + 34, 64, 15, 0xfffe00000007ffffLL, + 35, 64, 15, 0xfffe0000000fffffLL, + 36, 64, 15, 0xfffe0000001fffffLL, + 37, 64, 15, 0xfffe0000003fffffLL, + 38, 64, 15, 0xfffe0000007fffffLL, + 39, 64, 15, 0xfffe000000ffffffLL, + 40, 64, 15, 0xfffe000001ffffffLL, + 41, 64, 15, 0xfffe000003ffffffLL, + 42, 64, 15, 0xfffe000007ffffffLL, + 43, 64, 15, 0xfffe00000fffffffLL, + 44, 64, 15, 0xfffe00001fffffffLL, + 45, 64, 15, 0xfffe00003fffffffLL, + 46, 64, 15, 0xfffe00007fffffffLL, + 15, 32, 15, 0xfffe0000fffe0000LL, + 47, 64, 15, 0xfffe0000ffffffffLL, + 16, 32, 15, 0xfffe0001fffe0001LL, + 48, 64, 15, 0xfffe0001ffffffffLL, + 17, 32, 15, 0xfffe0003fffe0003LL, + 49, 64, 15, 0xfffe0003ffffffffLL, + 18, 32, 15, 0xfffe0007fffe0007LL, + 50, 64, 15, 0xfffe0007ffffffffLL, + 19, 32, 15, 0xfffe000ffffe000fLL, + 51, 64, 15, 0xfffe000fffffffffLL, + 20, 32, 15, 0xfffe001ffffe001fLL, + 52, 64, 15, 0xfffe001fffffffffLL, + 21, 32, 15, 0xfffe003ffffe003fLL, + 53, 64, 15, 0xfffe003fffffffffLL, + 22, 32, 15, 0xfffe007ffffe007fLL, + 54, 64, 15, 0xfffe007fffffffffLL, + 23, 32, 15, 0xfffe00fffffe00ffLL, + 55, 64, 15, 0xfffe00ffffffffffLL, + 24, 32, 15, 0xfffe01fffffe01ffLL, + 56, 64, 15, 0xfffe01ffffffffffLL, + 25, 32, 15, 0xfffe03fffffe03ffLL, + 57, 64, 15, 0xfffe03ffffffffffLL, + 26, 32, 15, 0xfffe07fffffe07ffLL, + 58, 64, 15, 0xfffe07ffffffffffLL, + 27, 32, 15, 0xfffe0ffffffe0fffLL, + 59, 64, 15, 0xfffe0fffffffffffLL, + 28, 32, 15, 0xfffe1ffffffe1fffLL, + 60, 64, 15, 0xfffe1fffffffffffLL, + 29, 32, 15, 0xfffe3ffffffe3fffLL, + 61, 64, 15, 0xfffe3fffffffffffLL, + 30, 32, 15, 0xfffe7ffffffe7fffLL, + 62, 64, 15, 0xfffe7fffffffffffLL, + 15, 16, 15, 0xfffefffefffefffeLL, + 31, 32, 15, 0xfffefffffffeffffLL, + 63, 64, 15, 0xfffeffffffffffffLL, + 16, 64, 16, 0xffff000000000000LL, + 17, 64, 16, 0xffff000000000001LL, + 18, 64, 16, 0xffff000000000003LL, + 19, 64, 16, 0xffff000000000007LL, + 20, 64, 16, 0xffff00000000000fLL, + 21, 64, 16, 0xffff00000000001fLL, + 22, 64, 16, 0xffff00000000003fLL, + 23, 64, 16, 0xffff00000000007fLL, + 24, 64, 16, 0xffff0000000000ffLL, + 25, 64, 16, 0xffff0000000001ffLL, + 26, 64, 16, 0xffff0000000003ffLL, + 27, 64, 16, 0xffff0000000007ffLL, + 28, 64, 16, 0xffff000000000fffLL, + 29, 64, 16, 0xffff000000001fffLL, + 30, 64, 16, 0xffff000000003fffLL, + 31, 64, 16, 0xffff000000007fffLL, + 32, 64, 16, 0xffff00000000ffffLL, + 33, 64, 16, 0xffff00000001ffffLL, + 34, 64, 16, 0xffff00000003ffffLL, + 35, 64, 16, 0xffff00000007ffffLL, + 36, 64, 16, 0xffff0000000fffffLL, + 37, 64, 16, 0xffff0000001fffffLL, + 38, 64, 16, 0xffff0000003fffffLL, + 39, 64, 16, 0xffff0000007fffffLL, + 40, 64, 16, 0xffff000000ffffffLL, + 41, 64, 16, 0xffff000001ffffffLL, + 42, 64, 16, 0xffff000003ffffffLL, + 43, 64, 16, 0xffff000007ffffffLL, + 44, 64, 16, 0xffff00000fffffffLL, + 45, 64, 16, 0xffff00001fffffffLL, + 46, 64, 16, 0xffff00003fffffffLL, + 47, 64, 16, 0xffff00007fffffffLL, + 16, 32, 16, 0xffff0000ffff0000LL, + 48, 64, 16, 0xffff0000ffffffffLL, + 17, 32, 16, 0xffff0001ffff0001LL, + 49, 64, 16, 0xffff0001ffffffffLL, + 18, 32, 16, 0xffff0003ffff0003LL, + 50, 64, 16, 0xffff0003ffffffffLL, + 19, 32, 16, 0xffff0007ffff0007LL, + 51, 64, 16, 0xffff0007ffffffffLL, + 20, 32, 16, 0xffff000fffff000fLL, + 52, 64, 16, 0xffff000fffffffffLL, + 21, 32, 16, 0xffff001fffff001fLL, + 53, 64, 16, 0xffff001fffffffffLL, + 22, 32, 16, 0xffff003fffff003fLL, + 54, 64, 16, 0xffff003fffffffffLL, + 23, 32, 16, 0xffff007fffff007fLL, + 55, 64, 16, 0xffff007fffffffffLL, + 24, 32, 16, 0xffff00ffffff00ffLL, + 56, 64, 16, 0xffff00ffffffffffLL, + 25, 32, 16, 0xffff01ffffff01ffLL, + 57, 64, 16, 0xffff01ffffffffffLL, + 26, 32, 16, 0xffff03ffffff03ffLL, + 58, 64, 16, 0xffff03ffffffffffLL, + 27, 32, 16, 0xffff07ffffff07ffLL, + 59, 64, 16, 0xffff07ffffffffffLL, + 28, 32, 16, 0xffff0fffffff0fffLL, + 60, 64, 16, 0xffff0fffffffffffLL, + 29, 32, 16, 0xffff1fffffff1fffLL, + 61, 64, 16, 0xffff1fffffffffffLL, + 30, 32, 16, 0xffff3fffffff3fffLL, + 62, 64, 16, 0xffff3fffffffffffLL, + 31, 32, 16, 0xffff7fffffff7fffLL, + 63, 64, 16, 0xffff7fffffffffffLL, + 17, 64, 17, 0xffff800000000000LL, + 18, 64, 17, 0xffff800000000001LL, + 19, 64, 17, 0xffff800000000003LL, + 20, 64, 17, 0xffff800000000007LL, + 21, 64, 17, 0xffff80000000000fLL, + 22, 64, 17, 0xffff80000000001fLL, + 23, 64, 17, 0xffff80000000003fLL, + 24, 64, 17, 0xffff80000000007fLL, + 25, 64, 17, 0xffff8000000000ffLL, + 26, 64, 17, 0xffff8000000001ffLL, + 27, 64, 17, 0xffff8000000003ffLL, + 28, 64, 17, 0xffff8000000007ffLL, + 29, 64, 17, 0xffff800000000fffLL, + 30, 64, 17, 0xffff800000001fffLL, + 31, 64, 17, 0xffff800000003fffLL, + 32, 64, 17, 0xffff800000007fffLL, + 33, 64, 17, 0xffff80000000ffffLL, + 34, 64, 17, 0xffff80000001ffffLL, + 35, 64, 17, 0xffff80000003ffffLL, + 36, 64, 17, 0xffff80000007ffffLL, + 37, 64, 17, 0xffff8000000fffffLL, + 38, 64, 17, 0xffff8000001fffffLL, + 39, 64, 17, 0xffff8000003fffffLL, + 40, 64, 17, 0xffff8000007fffffLL, + 41, 64, 17, 0xffff800000ffffffLL, + 42, 64, 17, 0xffff800001ffffffLL, + 43, 64, 17, 0xffff800003ffffffLL, + 44, 64, 17, 0xffff800007ffffffLL, + 45, 64, 17, 0xffff80000fffffffLL, + 46, 64, 17, 0xffff80001fffffffLL, + 47, 64, 17, 0xffff80003fffffffLL, + 48, 64, 17, 0xffff80007fffffffLL, + 17, 32, 17, 0xffff8000ffff8000LL, + 49, 64, 17, 0xffff8000ffffffffLL, + 18, 32, 17, 0xffff8001ffff8001LL, + 50, 64, 17, 0xffff8001ffffffffLL, + 19, 32, 17, 0xffff8003ffff8003LL, + 51, 64, 17, 0xffff8003ffffffffLL, + 20, 32, 17, 0xffff8007ffff8007LL, + 52, 64, 17, 0xffff8007ffffffffLL, + 21, 32, 17, 0xffff800fffff800fLL, + 53, 64, 17, 0xffff800fffffffffLL, + 22, 32, 17, 0xffff801fffff801fLL, + 54, 64, 17, 0xffff801fffffffffLL, + 23, 32, 17, 0xffff803fffff803fLL, + 55, 64, 17, 0xffff803fffffffffLL, + 24, 32, 17, 0xffff807fffff807fLL, + 56, 64, 17, 0xffff807fffffffffLL, + 25, 32, 17, 0xffff80ffffff80ffLL, + 57, 64, 17, 0xffff80ffffffffffLL, + 26, 32, 17, 0xffff81ffffff81ffLL, + 58, 64, 17, 0xffff81ffffffffffLL, + 27, 32, 17, 0xffff83ffffff83ffLL, + 59, 64, 17, 0xffff83ffffffffffLL, + 28, 32, 17, 0xffff87ffffff87ffLL, + 60, 64, 17, 0xffff87ffffffffffLL, + 29, 32, 17, 0xffff8fffffff8fffLL, + 61, 64, 17, 0xffff8fffffffffffLL, + 30, 32, 17, 0xffff9fffffff9fffLL, + 62, 64, 17, 0xffff9fffffffffffLL, + 31, 32, 17, 0xffffbfffffffbfffLL, + 63, 64, 17, 0xffffbfffffffffffLL, + 18, 64, 18, 0xffffc00000000000LL, + 19, 64, 18, 0xffffc00000000001LL, + 20, 64, 18, 0xffffc00000000003LL, + 21, 64, 18, 0xffffc00000000007LL, + 22, 64, 18, 0xffffc0000000000fLL, + 23, 64, 18, 0xffffc0000000001fLL, + 24, 64, 18, 0xffffc0000000003fLL, + 25, 64, 18, 0xffffc0000000007fLL, + 26, 64, 18, 0xffffc000000000ffLL, + 27, 64, 18, 0xffffc000000001ffLL, + 28, 64, 18, 0xffffc000000003ffLL, + 29, 64, 18, 0xffffc000000007ffLL, + 30, 64, 18, 0xffffc00000000fffLL, + 31, 64, 18, 0xffffc00000001fffLL, + 32, 64, 18, 0xffffc00000003fffLL, + 33, 64, 18, 0xffffc00000007fffLL, + 34, 64, 18, 0xffffc0000000ffffLL, + 35, 64, 18, 0xffffc0000001ffffLL, + 36, 64, 18, 0xffffc0000003ffffLL, + 37, 64, 18, 0xffffc0000007ffffLL, + 38, 64, 18, 0xffffc000000fffffLL, + 39, 64, 18, 0xffffc000001fffffLL, + 40, 64, 18, 0xffffc000003fffffLL, + 41, 64, 18, 0xffffc000007fffffLL, + 42, 64, 18, 0xffffc00000ffffffLL, + 43, 64, 18, 0xffffc00001ffffffLL, + 44, 64, 18, 0xffffc00003ffffffLL, + 45, 64, 18, 0xffffc00007ffffffLL, + 46, 64, 18, 0xffffc0000fffffffLL, + 47, 64, 18, 0xffffc0001fffffffLL, + 48, 64, 18, 0xffffc0003fffffffLL, + 49, 64, 18, 0xffffc0007fffffffLL, + 18, 32, 18, 0xffffc000ffffc000LL, + 50, 64, 18, 0xffffc000ffffffffLL, + 19, 32, 18, 0xffffc001ffffc001LL, + 51, 64, 18, 0xffffc001ffffffffLL, + 20, 32, 18, 0xffffc003ffffc003LL, + 52, 64, 18, 0xffffc003ffffffffLL, + 21, 32, 18, 0xffffc007ffffc007LL, + 53, 64, 18, 0xffffc007ffffffffLL, + 22, 32, 18, 0xffffc00fffffc00fLL, + 54, 64, 18, 0xffffc00fffffffffLL, + 23, 32, 18, 0xffffc01fffffc01fLL, + 55, 64, 18, 0xffffc01fffffffffLL, + 24, 32, 18, 0xffffc03fffffc03fLL, + 56, 64, 18, 0xffffc03fffffffffLL, + 25, 32, 18, 0xffffc07fffffc07fLL, + 57, 64, 18, 0xffffc07fffffffffLL, + 26, 32, 18, 0xffffc0ffffffc0ffLL, + 58, 64, 18, 0xffffc0ffffffffffLL, + 27, 32, 18, 0xffffc1ffffffc1ffLL, + 59, 64, 18, 0xffffc1ffffffffffLL, + 28, 32, 18, 0xffffc3ffffffc3ffLL, + 60, 64, 18, 0xffffc3ffffffffffLL, + 29, 32, 18, 0xffffc7ffffffc7ffLL, + 61, 64, 18, 0xffffc7ffffffffffLL, + 30, 32, 18, 0xffffcfffffffcfffLL, + 62, 64, 18, 0xffffcfffffffffffLL, + 31, 32, 18, 0xffffdfffffffdfffLL, + 63, 64, 18, 0xffffdfffffffffffLL, + 19, 64, 19, 0xffffe00000000000LL, + 20, 64, 19, 0xffffe00000000001LL, + 21, 64, 19, 0xffffe00000000003LL, + 22, 64, 19, 0xffffe00000000007LL, + 23, 64, 19, 0xffffe0000000000fLL, + 24, 64, 19, 0xffffe0000000001fLL, + 25, 64, 19, 0xffffe0000000003fLL, + 26, 64, 19, 0xffffe0000000007fLL, + 27, 64, 19, 0xffffe000000000ffLL, + 28, 64, 19, 0xffffe000000001ffLL, + 29, 64, 19, 0xffffe000000003ffLL, + 30, 64, 19, 0xffffe000000007ffLL, + 31, 64, 19, 0xffffe00000000fffLL, + 32, 64, 19, 0xffffe00000001fffLL, + 33, 64, 19, 0xffffe00000003fffLL, + 34, 64, 19, 0xffffe00000007fffLL, + 35, 64, 19, 0xffffe0000000ffffLL, + 36, 64, 19, 0xffffe0000001ffffLL, + 37, 64, 19, 0xffffe0000003ffffLL, + 38, 64, 19, 0xffffe0000007ffffLL, + 39, 64, 19, 0xffffe000000fffffLL, + 40, 64, 19, 0xffffe000001fffffLL, + 41, 64, 19, 0xffffe000003fffffLL, + 42, 64, 19, 0xffffe000007fffffLL, + 43, 64, 19, 0xffffe00000ffffffLL, + 44, 64, 19, 0xffffe00001ffffffLL, + 45, 64, 19, 0xffffe00003ffffffLL, + 46, 64, 19, 0xffffe00007ffffffLL, + 47, 64, 19, 0xffffe0000fffffffLL, + 48, 64, 19, 0xffffe0001fffffffLL, + 49, 64, 19, 0xffffe0003fffffffLL, + 50, 64, 19, 0xffffe0007fffffffLL, + 19, 32, 19, 0xffffe000ffffe000LL, + 51, 64, 19, 0xffffe000ffffffffLL, + 20, 32, 19, 0xffffe001ffffe001LL, + 52, 64, 19, 0xffffe001ffffffffLL, + 21, 32, 19, 0xffffe003ffffe003LL, + 53, 64, 19, 0xffffe003ffffffffLL, + 22, 32, 19, 0xffffe007ffffe007LL, + 54, 64, 19, 0xffffe007ffffffffLL, + 23, 32, 19, 0xffffe00fffffe00fLL, + 55, 64, 19, 0xffffe00fffffffffLL, + 24, 32, 19, 0xffffe01fffffe01fLL, + 56, 64, 19, 0xffffe01fffffffffLL, + 25, 32, 19, 0xffffe03fffffe03fLL, + 57, 64, 19, 0xffffe03fffffffffLL, + 26, 32, 19, 0xffffe07fffffe07fLL, + 58, 64, 19, 0xffffe07fffffffffLL, + 27, 32, 19, 0xffffe0ffffffe0ffLL, + 59, 64, 19, 0xffffe0ffffffffffLL, + 28, 32, 19, 0xffffe1ffffffe1ffLL, + 60, 64, 19, 0xffffe1ffffffffffLL, + 29, 32, 19, 0xffffe3ffffffe3ffLL, + 61, 64, 19, 0xffffe3ffffffffffLL, + 30, 32, 19, 0xffffe7ffffffe7ffLL, + 62, 64, 19, 0xffffe7ffffffffffLL, + 31, 32, 19, 0xffffefffffffefffLL, + 63, 64, 19, 0xffffefffffffffffLL, + 20, 64, 20, 0xfffff00000000000LL, + 21, 64, 20, 0xfffff00000000001LL, + 22, 64, 20, 0xfffff00000000003LL, + 23, 64, 20, 0xfffff00000000007LL, + 24, 64, 20, 0xfffff0000000000fLL, + 25, 64, 20, 0xfffff0000000001fLL, + 26, 64, 20, 0xfffff0000000003fLL, + 27, 64, 20, 0xfffff0000000007fLL, + 28, 64, 20, 0xfffff000000000ffLL, + 29, 64, 20, 0xfffff000000001ffLL, + 30, 64, 20, 0xfffff000000003ffLL, + 31, 64, 20, 0xfffff000000007ffLL, + 32, 64, 20, 0xfffff00000000fffLL, + 33, 64, 20, 0xfffff00000001fffLL, + 34, 64, 20, 0xfffff00000003fffLL, + 35, 64, 20, 0xfffff00000007fffLL, + 36, 64, 20, 0xfffff0000000ffffLL, + 37, 64, 20, 0xfffff0000001ffffLL, + 38, 64, 20, 0xfffff0000003ffffLL, + 39, 64, 20, 0xfffff0000007ffffLL, + 40, 64, 20, 0xfffff000000fffffLL, + 41, 64, 20, 0xfffff000001fffffLL, + 42, 64, 20, 0xfffff000003fffffLL, + 43, 64, 20, 0xfffff000007fffffLL, + 44, 64, 20, 0xfffff00000ffffffLL, + 45, 64, 20, 0xfffff00001ffffffLL, + 46, 64, 20, 0xfffff00003ffffffLL, + 47, 64, 20, 0xfffff00007ffffffLL, + 48, 64, 20, 0xfffff0000fffffffLL, + 49, 64, 20, 0xfffff0001fffffffLL, + 50, 64, 20, 0xfffff0003fffffffLL, + 51, 64, 20, 0xfffff0007fffffffLL, + 20, 32, 20, 0xfffff000fffff000LL, + 52, 64, 20, 0xfffff000ffffffffLL, + 21, 32, 20, 0xfffff001fffff001LL, + 53, 64, 20, 0xfffff001ffffffffLL, + 22, 32, 20, 0xfffff003fffff003LL, + 54, 64, 20, 0xfffff003ffffffffLL, + 23, 32, 20, 0xfffff007fffff007LL, + 55, 64, 20, 0xfffff007ffffffffLL, + 24, 32, 20, 0xfffff00ffffff00fLL, + 56, 64, 20, 0xfffff00fffffffffLL, + 25, 32, 20, 0xfffff01ffffff01fLL, + 57, 64, 20, 0xfffff01fffffffffLL, + 26, 32, 20, 0xfffff03ffffff03fLL, + 58, 64, 20, 0xfffff03fffffffffLL, + 27, 32, 20, 0xfffff07ffffff07fLL, + 59, 64, 20, 0xfffff07fffffffffLL, + 28, 32, 20, 0xfffff0fffffff0ffLL, + 60, 64, 20, 0xfffff0ffffffffffLL, + 29, 32, 20, 0xfffff1fffffff1ffLL, + 61, 64, 20, 0xfffff1ffffffffffLL, + 30, 32, 20, 0xfffff3fffffff3ffLL, + 62, 64, 20, 0xfffff3ffffffffffLL, + 31, 32, 20, 0xfffff7fffffff7ffLL, + 63, 64, 20, 0xfffff7ffffffffffLL, + 21, 64, 21, 0xfffff80000000000LL, + 22, 64, 21, 0xfffff80000000001LL, + 23, 64, 21, 0xfffff80000000003LL, + 24, 64, 21, 0xfffff80000000007LL, + 25, 64, 21, 0xfffff8000000000fLL, + 26, 64, 21, 0xfffff8000000001fLL, + 27, 64, 21, 0xfffff8000000003fLL, + 28, 64, 21, 0xfffff8000000007fLL, + 29, 64, 21, 0xfffff800000000ffLL, + 30, 64, 21, 0xfffff800000001ffLL, + 31, 64, 21, 0xfffff800000003ffLL, + 32, 64, 21, 0xfffff800000007ffLL, + 33, 64, 21, 0xfffff80000000fffLL, + 34, 64, 21, 0xfffff80000001fffLL, + 35, 64, 21, 0xfffff80000003fffLL, + 36, 64, 21, 0xfffff80000007fffLL, + 37, 64, 21, 0xfffff8000000ffffLL, + 38, 64, 21, 0xfffff8000001ffffLL, + 39, 64, 21, 0xfffff8000003ffffLL, + 40, 64, 21, 0xfffff8000007ffffLL, + 41, 64, 21, 0xfffff800000fffffLL, + 42, 64, 21, 0xfffff800001fffffLL, + 43, 64, 21, 0xfffff800003fffffLL, + 44, 64, 21, 0xfffff800007fffffLL, + 45, 64, 21, 0xfffff80000ffffffLL, + 46, 64, 21, 0xfffff80001ffffffLL, + 47, 64, 21, 0xfffff80003ffffffLL, + 48, 64, 21, 0xfffff80007ffffffLL, + 49, 64, 21, 0xfffff8000fffffffLL, + 50, 64, 21, 0xfffff8001fffffffLL, + 51, 64, 21, 0xfffff8003fffffffLL, + 52, 64, 21, 0xfffff8007fffffffLL, + 21, 32, 21, 0xfffff800fffff800LL, + 53, 64, 21, 0xfffff800ffffffffLL, + 22, 32, 21, 0xfffff801fffff801LL, + 54, 64, 21, 0xfffff801ffffffffLL, + 23, 32, 21, 0xfffff803fffff803LL, + 55, 64, 21, 0xfffff803ffffffffLL, + 24, 32, 21, 0xfffff807fffff807LL, + 56, 64, 21, 0xfffff807ffffffffLL, + 25, 32, 21, 0xfffff80ffffff80fLL, + 57, 64, 21, 0xfffff80fffffffffLL, + 26, 32, 21, 0xfffff81ffffff81fLL, + 58, 64, 21, 0xfffff81fffffffffLL, + 27, 32, 21, 0xfffff83ffffff83fLL, + 59, 64, 21, 0xfffff83fffffffffLL, + 28, 32, 21, 0xfffff87ffffff87fLL, + 60, 64, 21, 0xfffff87fffffffffLL, + 29, 32, 21, 0xfffff8fffffff8ffLL, + 61, 64, 21, 0xfffff8ffffffffffLL, + 30, 32, 21, 0xfffff9fffffff9ffLL, + 62, 64, 21, 0xfffff9ffffffffffLL, + 31, 32, 21, 0xfffffbfffffffbffLL, + 63, 64, 21, 0xfffffbffffffffffLL, + 22, 64, 22, 0xfffffc0000000000LL, + 23, 64, 22, 0xfffffc0000000001LL, + 24, 64, 22, 0xfffffc0000000003LL, + 25, 64, 22, 0xfffffc0000000007LL, + 26, 64, 22, 0xfffffc000000000fLL, + 27, 64, 22, 0xfffffc000000001fLL, + 28, 64, 22, 0xfffffc000000003fLL, + 29, 64, 22, 0xfffffc000000007fLL, + 30, 64, 22, 0xfffffc00000000ffLL, + 31, 64, 22, 0xfffffc00000001ffLL, + 32, 64, 22, 0xfffffc00000003ffLL, + 33, 64, 22, 0xfffffc00000007ffLL, + 34, 64, 22, 0xfffffc0000000fffLL, + 35, 64, 22, 0xfffffc0000001fffLL, + 36, 64, 22, 0xfffffc0000003fffLL, + 37, 64, 22, 0xfffffc0000007fffLL, + 38, 64, 22, 0xfffffc000000ffffLL, + 39, 64, 22, 0xfffffc000001ffffLL, + 40, 64, 22, 0xfffffc000003ffffLL, + 41, 64, 22, 0xfffffc000007ffffLL, + 42, 64, 22, 0xfffffc00000fffffLL, + 43, 64, 22, 0xfffffc00001fffffLL, + 44, 64, 22, 0xfffffc00003fffffLL, + 45, 64, 22, 0xfffffc00007fffffLL, + 46, 64, 22, 0xfffffc0000ffffffLL, + 47, 64, 22, 0xfffffc0001ffffffLL, + 48, 64, 22, 0xfffffc0003ffffffLL, + 49, 64, 22, 0xfffffc0007ffffffLL, + 50, 64, 22, 0xfffffc000fffffffLL, + 51, 64, 22, 0xfffffc001fffffffLL, + 52, 64, 22, 0xfffffc003fffffffLL, + 53, 64, 22, 0xfffffc007fffffffLL, + 22, 32, 22, 0xfffffc00fffffc00LL, + 54, 64, 22, 0xfffffc00ffffffffLL, + 23, 32, 22, 0xfffffc01fffffc01LL, + 55, 64, 22, 0xfffffc01ffffffffLL, + 24, 32, 22, 0xfffffc03fffffc03LL, + 56, 64, 22, 0xfffffc03ffffffffLL, + 25, 32, 22, 0xfffffc07fffffc07LL, + 57, 64, 22, 0xfffffc07ffffffffLL, + 26, 32, 22, 0xfffffc0ffffffc0fLL, + 58, 64, 22, 0xfffffc0fffffffffLL, + 27, 32, 22, 0xfffffc1ffffffc1fLL, + 59, 64, 22, 0xfffffc1fffffffffLL, + 28, 32, 22, 0xfffffc3ffffffc3fLL, + 60, 64, 22, 0xfffffc3fffffffffLL, + 29, 32, 22, 0xfffffc7ffffffc7fLL, + 61, 64, 22, 0xfffffc7fffffffffLL, + 30, 32, 22, 0xfffffcfffffffcffLL, + 62, 64, 22, 0xfffffcffffffffffLL, + 31, 32, 22, 0xfffffdfffffffdffLL, + 63, 64, 22, 0xfffffdffffffffffLL, + 23, 64, 23, 0xfffffe0000000000LL, + 24, 64, 23, 0xfffffe0000000001LL, + 25, 64, 23, 0xfffffe0000000003LL, + 26, 64, 23, 0xfffffe0000000007LL, + 27, 64, 23, 0xfffffe000000000fLL, + 28, 64, 23, 0xfffffe000000001fLL, + 29, 64, 23, 0xfffffe000000003fLL, + 30, 64, 23, 0xfffffe000000007fLL, + 31, 64, 23, 0xfffffe00000000ffLL, + 32, 64, 23, 0xfffffe00000001ffLL, + 33, 64, 23, 0xfffffe00000003ffLL, + 34, 64, 23, 0xfffffe00000007ffLL, + 35, 64, 23, 0xfffffe0000000fffLL, + 36, 64, 23, 0xfffffe0000001fffLL, + 37, 64, 23, 0xfffffe0000003fffLL, + 38, 64, 23, 0xfffffe0000007fffLL, + 39, 64, 23, 0xfffffe000000ffffLL, + 40, 64, 23, 0xfffffe000001ffffLL, + 41, 64, 23, 0xfffffe000003ffffLL, + 42, 64, 23, 0xfffffe000007ffffLL, + 43, 64, 23, 0xfffffe00000fffffLL, + 44, 64, 23, 0xfffffe00001fffffLL, + 45, 64, 23, 0xfffffe00003fffffLL, + 46, 64, 23, 0xfffffe00007fffffLL, + 47, 64, 23, 0xfffffe0000ffffffLL, + 48, 64, 23, 0xfffffe0001ffffffLL, + 49, 64, 23, 0xfffffe0003ffffffLL, + 50, 64, 23, 0xfffffe0007ffffffLL, + 51, 64, 23, 0xfffffe000fffffffLL, + 52, 64, 23, 0xfffffe001fffffffLL, + 53, 64, 23, 0xfffffe003fffffffLL, + 54, 64, 23, 0xfffffe007fffffffLL, + 23, 32, 23, 0xfffffe00fffffe00LL, + 55, 64, 23, 0xfffffe00ffffffffLL, + 24, 32, 23, 0xfffffe01fffffe01LL, + 56, 64, 23, 0xfffffe01ffffffffLL, + 25, 32, 23, 0xfffffe03fffffe03LL, + 57, 64, 23, 0xfffffe03ffffffffLL, + 26, 32, 23, 0xfffffe07fffffe07LL, + 58, 64, 23, 0xfffffe07ffffffffLL, + 27, 32, 23, 0xfffffe0ffffffe0fLL, + 59, 64, 23, 0xfffffe0fffffffffLL, + 28, 32, 23, 0xfffffe1ffffffe1fLL, + 60, 64, 23, 0xfffffe1fffffffffLL, + 29, 32, 23, 0xfffffe3ffffffe3fLL, + 61, 64, 23, 0xfffffe3fffffffffLL, + 30, 32, 23, 0xfffffe7ffffffe7fLL, + 62, 64, 23, 0xfffffe7fffffffffLL, + 31, 32, 23, 0xfffffefffffffeffLL, + 63, 64, 23, 0xfffffeffffffffffLL, + 24, 64, 24, 0xffffff0000000000LL, + 25, 64, 24, 0xffffff0000000001LL, + 26, 64, 24, 0xffffff0000000003LL, + 27, 64, 24, 0xffffff0000000007LL, + 28, 64, 24, 0xffffff000000000fLL, + 29, 64, 24, 0xffffff000000001fLL, + 30, 64, 24, 0xffffff000000003fLL, + 31, 64, 24, 0xffffff000000007fLL, + 32, 64, 24, 0xffffff00000000ffLL, + 33, 64, 24, 0xffffff00000001ffLL, + 34, 64, 24, 0xffffff00000003ffLL, + 35, 64, 24, 0xffffff00000007ffLL, + 36, 64, 24, 0xffffff0000000fffLL, + 37, 64, 24, 0xffffff0000001fffLL, + 38, 64, 24, 0xffffff0000003fffLL, + 39, 64, 24, 0xffffff0000007fffLL, + 40, 64, 24, 0xffffff000000ffffLL, + 41, 64, 24, 0xffffff000001ffffLL, + 42, 64, 24, 0xffffff000003ffffLL, + 43, 64, 24, 0xffffff000007ffffLL, + 44, 64, 24, 0xffffff00000fffffLL, + 45, 64, 24, 0xffffff00001fffffLL, + 46, 64, 24, 0xffffff00003fffffLL, + 47, 64, 24, 0xffffff00007fffffLL, + 48, 64, 24, 0xffffff0000ffffffLL, + 49, 64, 24, 0xffffff0001ffffffLL, + 50, 64, 24, 0xffffff0003ffffffLL, + 51, 64, 24, 0xffffff0007ffffffLL, + 52, 64, 24, 0xffffff000fffffffLL, + 53, 64, 24, 0xffffff001fffffffLL, + 54, 64, 24, 0xffffff003fffffffLL, + 55, 64, 24, 0xffffff007fffffffLL, + 24, 32, 24, 0xffffff00ffffff00LL, + 56, 64, 24, 0xffffff00ffffffffLL, + 25, 32, 24, 0xffffff01ffffff01LL, + 57, 64, 24, 0xffffff01ffffffffLL, + 26, 32, 24, 0xffffff03ffffff03LL, + 58, 64, 24, 0xffffff03ffffffffLL, + 27, 32, 24, 0xffffff07ffffff07LL, + 59, 64, 24, 0xffffff07ffffffffLL, + 28, 32, 24, 0xffffff0fffffff0fLL, + 60, 64, 24, 0xffffff0fffffffffLL, + 29, 32, 24, 0xffffff1fffffff1fLL, + 61, 64, 24, 0xffffff1fffffffffLL, + 30, 32, 24, 0xffffff3fffffff3fLL, + 62, 64, 24, 0xffffff3fffffffffLL, + 31, 32, 24, 0xffffff7fffffff7fLL, + 63, 64, 24, 0xffffff7fffffffffLL, + 25, 64, 25, 0xffffff8000000000LL, + 26, 64, 25, 0xffffff8000000001LL, + 27, 64, 25, 0xffffff8000000003LL, + 28, 64, 25, 0xffffff8000000007LL, + 29, 64, 25, 0xffffff800000000fLL, + 30, 64, 25, 0xffffff800000001fLL, + 31, 64, 25, 0xffffff800000003fLL, + 32, 64, 25, 0xffffff800000007fLL, + 33, 64, 25, 0xffffff80000000ffLL, + 34, 64, 25, 0xffffff80000001ffLL, + 35, 64, 25, 0xffffff80000003ffLL, + 36, 64, 25, 0xffffff80000007ffLL, + 37, 64, 25, 0xffffff8000000fffLL, + 38, 64, 25, 0xffffff8000001fffLL, + 39, 64, 25, 0xffffff8000003fffLL, + 40, 64, 25, 0xffffff8000007fffLL, + 41, 64, 25, 0xffffff800000ffffLL, + 42, 64, 25, 0xffffff800001ffffLL, + 43, 64, 25, 0xffffff800003ffffLL, + 44, 64, 25, 0xffffff800007ffffLL, + 45, 64, 25, 0xffffff80000fffffLL, + 46, 64, 25, 0xffffff80001fffffLL, + 47, 64, 25, 0xffffff80003fffffLL, + 48, 64, 25, 0xffffff80007fffffLL, + 49, 64, 25, 0xffffff8000ffffffLL, + 50, 64, 25, 0xffffff8001ffffffLL, + 51, 64, 25, 0xffffff8003ffffffLL, + 52, 64, 25, 0xffffff8007ffffffLL, + 53, 64, 25, 0xffffff800fffffffLL, + 54, 64, 25, 0xffffff801fffffffLL, + 55, 64, 25, 0xffffff803fffffffLL, + 56, 64, 25, 0xffffff807fffffffLL, + 25, 32, 25, 0xffffff80ffffff80LL, + 57, 64, 25, 0xffffff80ffffffffLL, + 26, 32, 25, 0xffffff81ffffff81LL, + 58, 64, 25, 0xffffff81ffffffffLL, + 27, 32, 25, 0xffffff83ffffff83LL, + 59, 64, 25, 0xffffff83ffffffffLL, + 28, 32, 25, 0xffffff87ffffff87LL, + 60, 64, 25, 0xffffff87ffffffffLL, + 29, 32, 25, 0xffffff8fffffff8fLL, + 61, 64, 25, 0xffffff8fffffffffLL, + 30, 32, 25, 0xffffff9fffffff9fLL, + 62, 64, 25, 0xffffff9fffffffffLL, + 31, 32, 25, 0xffffffbfffffffbfLL, + 63, 64, 25, 0xffffffbfffffffffLL, + 26, 64, 26, 0xffffffc000000000LL, + 27, 64, 26, 0xffffffc000000001LL, + 28, 64, 26, 0xffffffc000000003LL, + 29, 64, 26, 0xffffffc000000007LL, + 30, 64, 26, 0xffffffc00000000fLL, + 31, 64, 26, 0xffffffc00000001fLL, + 32, 64, 26, 0xffffffc00000003fLL, + 33, 64, 26, 0xffffffc00000007fLL, + 34, 64, 26, 0xffffffc0000000ffLL, + 35, 64, 26, 0xffffffc0000001ffLL, + 36, 64, 26, 0xffffffc0000003ffLL, + 37, 64, 26, 0xffffffc0000007ffLL, + 38, 64, 26, 0xffffffc000000fffLL, + 39, 64, 26, 0xffffffc000001fffLL, + 40, 64, 26, 0xffffffc000003fffLL, + 41, 64, 26, 0xffffffc000007fffLL, + 42, 64, 26, 0xffffffc00000ffffLL, + 43, 64, 26, 0xffffffc00001ffffLL, + 44, 64, 26, 0xffffffc00003ffffLL, + 45, 64, 26, 0xffffffc00007ffffLL, + 46, 64, 26, 0xffffffc0000fffffLL, + 47, 64, 26, 0xffffffc0001fffffLL, + 48, 64, 26, 0xffffffc0003fffffLL, + 49, 64, 26, 0xffffffc0007fffffLL, + 50, 64, 26, 0xffffffc000ffffffLL, + 51, 64, 26, 0xffffffc001ffffffLL, + 52, 64, 26, 0xffffffc003ffffffLL, + 53, 64, 26, 0xffffffc007ffffffLL, + 54, 64, 26, 0xffffffc00fffffffLL, + 55, 64, 26, 0xffffffc01fffffffLL, + 56, 64, 26, 0xffffffc03fffffffLL, + 57, 64, 26, 0xffffffc07fffffffLL, + 26, 32, 26, 0xffffffc0ffffffc0LL, + 58, 64, 26, 0xffffffc0ffffffffLL, + 27, 32, 26, 0xffffffc1ffffffc1LL, + 59, 64, 26, 0xffffffc1ffffffffLL, + 28, 32, 26, 0xffffffc3ffffffc3LL, + 60, 64, 26, 0xffffffc3ffffffffLL, + 29, 32, 26, 0xffffffc7ffffffc7LL, + 61, 64, 26, 0xffffffc7ffffffffLL, + 30, 32, 26, 0xffffffcfffffffcfLL, + 62, 64, 26, 0xffffffcfffffffffLL, + 31, 32, 26, 0xffffffdfffffffdfLL, + 63, 64, 26, 0xffffffdfffffffffLL, + 27, 64, 27, 0xffffffe000000000LL, + 28, 64, 27, 0xffffffe000000001LL, + 29, 64, 27, 0xffffffe000000003LL, + 30, 64, 27, 0xffffffe000000007LL, + 31, 64, 27, 0xffffffe00000000fLL, + 32, 64, 27, 0xffffffe00000001fLL, + 33, 64, 27, 0xffffffe00000003fLL, + 34, 64, 27, 0xffffffe00000007fLL, + 35, 64, 27, 0xffffffe0000000ffLL, + 36, 64, 27, 0xffffffe0000001ffLL, + 37, 64, 27, 0xffffffe0000003ffLL, + 38, 64, 27, 0xffffffe0000007ffLL, + 39, 64, 27, 0xffffffe000000fffLL, + 40, 64, 27, 0xffffffe000001fffLL, + 41, 64, 27, 0xffffffe000003fffLL, + 42, 64, 27, 0xffffffe000007fffLL, + 43, 64, 27, 0xffffffe00000ffffLL, + 44, 64, 27, 0xffffffe00001ffffLL, + 45, 64, 27, 0xffffffe00003ffffLL, + 46, 64, 27, 0xffffffe00007ffffLL, + 47, 64, 27, 0xffffffe0000fffffLL, + 48, 64, 27, 0xffffffe0001fffffLL, + 49, 64, 27, 0xffffffe0003fffffLL, + 50, 64, 27, 0xffffffe0007fffffLL, + 51, 64, 27, 0xffffffe000ffffffLL, + 52, 64, 27, 0xffffffe001ffffffLL, + 53, 64, 27, 0xffffffe003ffffffLL, + 54, 64, 27, 0xffffffe007ffffffLL, + 55, 64, 27, 0xffffffe00fffffffLL, + 56, 64, 27, 0xffffffe01fffffffLL, + 57, 64, 27, 0xffffffe03fffffffLL, + 58, 64, 27, 0xffffffe07fffffffLL, + 27, 32, 27, 0xffffffe0ffffffe0LL, + 59, 64, 27, 0xffffffe0ffffffffLL, + 28, 32, 27, 0xffffffe1ffffffe1LL, + 60, 64, 27, 0xffffffe1ffffffffLL, + 29, 32, 27, 0xffffffe3ffffffe3LL, + 61, 64, 27, 0xffffffe3ffffffffLL, + 30, 32, 27, 0xffffffe7ffffffe7LL, + 62, 64, 27, 0xffffffe7ffffffffLL, + 31, 32, 27, 0xffffffefffffffefLL, + 63, 64, 27, 0xffffffefffffffffLL, + 28, 64, 28, 0xfffffff000000000LL, + 29, 64, 28, 0xfffffff000000001LL, + 30, 64, 28, 0xfffffff000000003LL, + 31, 64, 28, 0xfffffff000000007LL, + 32, 64, 28, 0xfffffff00000000fLL, + 33, 64, 28, 0xfffffff00000001fLL, + 34, 64, 28, 0xfffffff00000003fLL, + 35, 64, 28, 0xfffffff00000007fLL, + 36, 64, 28, 0xfffffff0000000ffLL, + 37, 64, 28, 0xfffffff0000001ffLL, + 38, 64, 28, 0xfffffff0000003ffLL, + 39, 64, 28, 0xfffffff0000007ffLL, + 40, 64, 28, 0xfffffff000000fffLL, + 41, 64, 28, 0xfffffff000001fffLL, + 42, 64, 28, 0xfffffff000003fffLL, + 43, 64, 28, 0xfffffff000007fffLL, + 44, 64, 28, 0xfffffff00000ffffLL, + 45, 64, 28, 0xfffffff00001ffffLL, + 46, 64, 28, 0xfffffff00003ffffLL, + 47, 64, 28, 0xfffffff00007ffffLL, + 48, 64, 28, 0xfffffff0000fffffLL, + 49, 64, 28, 0xfffffff0001fffffLL, + 50, 64, 28, 0xfffffff0003fffffLL, + 51, 64, 28, 0xfffffff0007fffffLL, + 52, 64, 28, 0xfffffff000ffffffLL, + 53, 64, 28, 0xfffffff001ffffffLL, + 54, 64, 28, 0xfffffff003ffffffLL, + 55, 64, 28, 0xfffffff007ffffffLL, + 56, 64, 28, 0xfffffff00fffffffLL, + 57, 64, 28, 0xfffffff01fffffffLL, + 58, 64, 28, 0xfffffff03fffffffLL, + 59, 64, 28, 0xfffffff07fffffffLL, + 28, 32, 28, 0xfffffff0fffffff0LL, + 60, 64, 28, 0xfffffff0ffffffffLL, + 29, 32, 28, 0xfffffff1fffffff1LL, + 61, 64, 28, 0xfffffff1ffffffffLL, + 30, 32, 28, 0xfffffff3fffffff3LL, + 62, 64, 28, 0xfffffff3ffffffffLL, + 31, 32, 28, 0xfffffff7fffffff7LL, + 63, 64, 28, 0xfffffff7ffffffffLL, + 29, 64, 29, 0xfffffff800000000LL, + 30, 64, 29, 0xfffffff800000001LL, + 31, 64, 29, 0xfffffff800000003LL, + 32, 64, 29, 0xfffffff800000007LL, + 33, 64, 29, 0xfffffff80000000fLL, + 34, 64, 29, 0xfffffff80000001fLL, + 35, 64, 29, 0xfffffff80000003fLL, + 36, 64, 29, 0xfffffff80000007fLL, + 37, 64, 29, 0xfffffff8000000ffLL, + 38, 64, 29, 0xfffffff8000001ffLL, + 39, 64, 29, 0xfffffff8000003ffLL, + 40, 64, 29, 0xfffffff8000007ffLL, + 41, 64, 29, 0xfffffff800000fffLL, + 42, 64, 29, 0xfffffff800001fffLL, + 43, 64, 29, 0xfffffff800003fffLL, + 44, 64, 29, 0xfffffff800007fffLL, + 45, 64, 29, 0xfffffff80000ffffLL, + 46, 64, 29, 0xfffffff80001ffffLL, + 47, 64, 29, 0xfffffff80003ffffLL, + 48, 64, 29, 0xfffffff80007ffffLL, + 49, 64, 29, 0xfffffff8000fffffLL, + 50, 64, 29, 0xfffffff8001fffffLL, + 51, 64, 29, 0xfffffff8003fffffLL, + 52, 64, 29, 0xfffffff8007fffffLL, + 53, 64, 29, 0xfffffff800ffffffLL, + 54, 64, 29, 0xfffffff801ffffffLL, + 55, 64, 29, 0xfffffff803ffffffLL, + 56, 64, 29, 0xfffffff807ffffffLL, + 57, 64, 29, 0xfffffff80fffffffLL, + 58, 64, 29, 0xfffffff81fffffffLL, + 59, 64, 29, 0xfffffff83fffffffLL, + 60, 64, 29, 0xfffffff87fffffffLL, + 29, 32, 29, 0xfffffff8fffffff8LL, + 61, 64, 29, 0xfffffff8ffffffffLL, + 30, 32, 29, 0xfffffff9fffffff9LL, + 62, 64, 29, 0xfffffff9ffffffffLL, + 31, 32, 29, 0xfffffffbfffffffbLL, + 63, 64, 29, 0xfffffffbffffffffLL, + 30, 64, 30, 0xfffffffc00000000LL, + 31, 64, 30, 0xfffffffc00000001LL, + 32, 64, 30, 0xfffffffc00000003LL, + 33, 64, 30, 0xfffffffc00000007LL, + 34, 64, 30, 0xfffffffc0000000fLL, + 35, 64, 30, 0xfffffffc0000001fLL, + 36, 64, 30, 0xfffffffc0000003fLL, + 37, 64, 30, 0xfffffffc0000007fLL, + 38, 64, 30, 0xfffffffc000000ffLL, + 39, 64, 30, 0xfffffffc000001ffLL, + 40, 64, 30, 0xfffffffc000003ffLL, + 41, 64, 30, 0xfffffffc000007ffLL, + 42, 64, 30, 0xfffffffc00000fffLL, + 43, 64, 30, 0xfffffffc00001fffLL, + 44, 64, 30, 0xfffffffc00003fffLL, + 45, 64, 30, 0xfffffffc00007fffLL, + 46, 64, 30, 0xfffffffc0000ffffLL, + 47, 64, 30, 0xfffffffc0001ffffLL, + 48, 64, 30, 0xfffffffc0003ffffLL, + 49, 64, 30, 0xfffffffc0007ffffLL, + 50, 64, 30, 0xfffffffc000fffffLL, + 51, 64, 30, 0xfffffffc001fffffLL, + 52, 64, 30, 0xfffffffc003fffffLL, + 53, 64, 30, 0xfffffffc007fffffLL, + 54, 64, 30, 0xfffffffc00ffffffLL, + 55, 64, 30, 0xfffffffc01ffffffLL, + 56, 64, 30, 0xfffffffc03ffffffLL, + 57, 64, 30, 0xfffffffc07ffffffLL, + 58, 64, 30, 0xfffffffc0fffffffLL, + 59, 64, 30, 0xfffffffc1fffffffLL, + 60, 64, 30, 0xfffffffc3fffffffLL, + 61, 64, 30, 0xfffffffc7fffffffLL, + 30, 32, 30, 0xfffffffcfffffffcLL, + 62, 64, 30, 0xfffffffcffffffffLL, + 31, 32, 30, 0xfffffffdfffffffdLL, + 63, 64, 30, 0xfffffffdffffffffLL, + 31, 64, 31, 0xfffffffe00000000LL, + 32, 64, 31, 0xfffffffe00000001LL, + 33, 64, 31, 0xfffffffe00000003LL, + 34, 64, 31, 0xfffffffe00000007LL, + 35, 64, 31, 0xfffffffe0000000fLL, + 36, 64, 31, 0xfffffffe0000001fLL, + 37, 64, 31, 0xfffffffe0000003fLL, + 38, 64, 31, 0xfffffffe0000007fLL, + 39, 64, 31, 0xfffffffe000000ffLL, + 40, 64, 31, 0xfffffffe000001ffLL, + 41, 64, 31, 0xfffffffe000003ffLL, + 42, 64, 31, 0xfffffffe000007ffLL, + 43, 64, 31, 0xfffffffe00000fffLL, + 44, 64, 31, 0xfffffffe00001fffLL, + 45, 64, 31, 0xfffffffe00003fffLL, + 46, 64, 31, 0xfffffffe00007fffLL, + 47, 64, 31, 0xfffffffe0000ffffLL, + 48, 64, 31, 0xfffffffe0001ffffLL, + 49, 64, 31, 0xfffffffe0003ffffLL, + 50, 64, 31, 0xfffffffe0007ffffLL, + 51, 64, 31, 0xfffffffe000fffffLL, + 52, 64, 31, 0xfffffffe001fffffLL, + 53, 64, 31, 0xfffffffe003fffffLL, + 54, 64, 31, 0xfffffffe007fffffLL, + 55, 64, 31, 0xfffffffe00ffffffLL, + 56, 64, 31, 0xfffffffe01ffffffLL, + 57, 64, 31, 0xfffffffe03ffffffLL, + 58, 64, 31, 0xfffffffe07ffffffLL, + 59, 64, 31, 0xfffffffe0fffffffLL, + 60, 64, 31, 0xfffffffe1fffffffLL, + 61, 64, 31, 0xfffffffe3fffffffLL, + 62, 64, 31, 0xfffffffe7fffffffLL, + 31, 32, 31, 0xfffffffefffffffeLL, + 63, 64, 31, 0xfffffffeffffffffLL, + 32, 64, 32, 0xffffffff00000000LL, + 33, 64, 32, 0xffffffff00000001LL, + 34, 64, 32, 0xffffffff00000003LL, + 35, 64, 32, 0xffffffff00000007LL, + 36, 64, 32, 0xffffffff0000000fLL, + 37, 64, 32, 0xffffffff0000001fLL, + 38, 64, 32, 0xffffffff0000003fLL, + 39, 64, 32, 0xffffffff0000007fLL, + 40, 64, 32, 0xffffffff000000ffLL, + 41, 64, 32, 0xffffffff000001ffLL, + 42, 64, 32, 0xffffffff000003ffLL, + 43, 64, 32, 0xffffffff000007ffLL, + 44, 64, 32, 0xffffffff00000fffLL, + 45, 64, 32, 0xffffffff00001fffLL, + 46, 64, 32, 0xffffffff00003fffLL, + 47, 64, 32, 0xffffffff00007fffLL, + 48, 64, 32, 0xffffffff0000ffffLL, + 49, 64, 32, 0xffffffff0001ffffLL, + 50, 64, 32, 0xffffffff0003ffffLL, + 51, 64, 32, 0xffffffff0007ffffLL, + 52, 64, 32, 0xffffffff000fffffLL, + 53, 64, 32, 0xffffffff001fffffLL, + 54, 64, 32, 0xffffffff003fffffLL, + 55, 64, 32, 0xffffffff007fffffLL, + 56, 64, 32, 0xffffffff00ffffffLL, + 57, 64, 32, 0xffffffff01ffffffLL, + 58, 64, 32, 0xffffffff03ffffffLL, + 59, 64, 32, 0xffffffff07ffffffLL, + 60, 64, 32, 0xffffffff0fffffffLL, + 61, 64, 32, 0xffffffff1fffffffLL, + 62, 64, 32, 0xffffffff3fffffffLL, + 63, 64, 32, 0xffffffff7fffffffLL, + 33, 64, 33, 0xffffffff80000000LL, + 34, 64, 33, 0xffffffff80000001LL, + 35, 64, 33, 0xffffffff80000003LL, + 36, 64, 33, 0xffffffff80000007LL, + 37, 64, 33, 0xffffffff8000000fLL, + 38, 64, 33, 0xffffffff8000001fLL, + 39, 64, 33, 0xffffffff8000003fLL, + 40, 64, 33, 0xffffffff8000007fLL, + 41, 64, 33, 0xffffffff800000ffLL, + 42, 64, 33, 0xffffffff800001ffLL, + 43, 64, 33, 0xffffffff800003ffLL, + 44, 64, 33, 0xffffffff800007ffLL, + 45, 64, 33, 0xffffffff80000fffLL, + 46, 64, 33, 0xffffffff80001fffLL, + 47, 64, 33, 0xffffffff80003fffLL, + 48, 64, 33, 0xffffffff80007fffLL, + 49, 64, 33, 0xffffffff8000ffffLL, + 50, 64, 33, 0xffffffff8001ffffLL, + 51, 64, 33, 0xffffffff8003ffffLL, + 52, 64, 33, 0xffffffff8007ffffLL, + 53, 64, 33, 0xffffffff800fffffLL, + 54, 64, 33, 0xffffffff801fffffLL, + 55, 64, 33, 0xffffffff803fffffLL, + 56, 64, 33, 0xffffffff807fffffLL, + 57, 64, 33, 0xffffffff80ffffffLL, + 58, 64, 33, 0xffffffff81ffffffLL, + 59, 64, 33, 0xffffffff83ffffffLL, + 60, 64, 33, 0xffffffff87ffffffLL, + 61, 64, 33, 0xffffffff8fffffffLL, + 62, 64, 33, 0xffffffff9fffffffLL, + 63, 64, 33, 0xffffffffbfffffffLL, + 34, 64, 34, 0xffffffffc0000000LL, + 35, 64, 34, 0xffffffffc0000001LL, + 36, 64, 34, 0xffffffffc0000003LL, + 37, 64, 34, 0xffffffffc0000007LL, + 38, 64, 34, 0xffffffffc000000fLL, + 39, 64, 34, 0xffffffffc000001fLL, + 40, 64, 34, 0xffffffffc000003fLL, + 41, 64, 34, 0xffffffffc000007fLL, + 42, 64, 34, 0xffffffffc00000ffLL, + 43, 64, 34, 0xffffffffc00001ffLL, + 44, 64, 34, 0xffffffffc00003ffLL, + 45, 64, 34, 0xffffffffc00007ffLL, + 46, 64, 34, 0xffffffffc0000fffLL, + 47, 64, 34, 0xffffffffc0001fffLL, + 48, 64, 34, 0xffffffffc0003fffLL, + 49, 64, 34, 0xffffffffc0007fffLL, + 50, 64, 34, 0xffffffffc000ffffLL, + 51, 64, 34, 0xffffffffc001ffffLL, + 52, 64, 34, 0xffffffffc003ffffLL, + 53, 64, 34, 0xffffffffc007ffffLL, + 54, 64, 34, 0xffffffffc00fffffLL, + 55, 64, 34, 0xffffffffc01fffffLL, + 56, 64, 34, 0xffffffffc03fffffLL, + 57, 64, 34, 0xffffffffc07fffffLL, + 58, 64, 34, 0xffffffffc0ffffffLL, + 59, 64, 34, 0xffffffffc1ffffffLL, + 60, 64, 34, 0xffffffffc3ffffffLL, + 61, 64, 34, 0xffffffffc7ffffffLL, + 62, 64, 34, 0xffffffffcfffffffLL, + 63, 64, 34, 0xffffffffdfffffffLL, + 35, 64, 35, 0xffffffffe0000000LL, + 36, 64, 35, 0xffffffffe0000001LL, + 37, 64, 35, 0xffffffffe0000003LL, + 38, 64, 35, 0xffffffffe0000007LL, + 39, 64, 35, 0xffffffffe000000fLL, + 40, 64, 35, 0xffffffffe000001fLL, + 41, 64, 35, 0xffffffffe000003fLL, + 42, 64, 35, 0xffffffffe000007fLL, + 43, 64, 35, 0xffffffffe00000ffLL, + 44, 64, 35, 0xffffffffe00001ffLL, + 45, 64, 35, 0xffffffffe00003ffLL, + 46, 64, 35, 0xffffffffe00007ffLL, + 47, 64, 35, 0xffffffffe0000fffLL, + 48, 64, 35, 0xffffffffe0001fffLL, + 49, 64, 35, 0xffffffffe0003fffLL, + 50, 64, 35, 0xffffffffe0007fffLL, + 51, 64, 35, 0xffffffffe000ffffLL, + 52, 64, 35, 0xffffffffe001ffffLL, + 53, 64, 35, 0xffffffffe003ffffLL, + 54, 64, 35, 0xffffffffe007ffffLL, + 55, 64, 35, 0xffffffffe00fffffLL, + 56, 64, 35, 0xffffffffe01fffffLL, + 57, 64, 35, 0xffffffffe03fffffLL, + 58, 64, 35, 0xffffffffe07fffffLL, + 59, 64, 35, 0xffffffffe0ffffffLL, + 60, 64, 35, 0xffffffffe1ffffffLL, + 61, 64, 35, 0xffffffffe3ffffffLL, + 62, 64, 35, 0xffffffffe7ffffffLL, + 63, 64, 35, 0xffffffffefffffffLL, + 36, 64, 36, 0xfffffffff0000000LL, + 37, 64, 36, 0xfffffffff0000001LL, + 38, 64, 36, 0xfffffffff0000003LL, + 39, 64, 36, 0xfffffffff0000007LL, + 40, 64, 36, 0xfffffffff000000fLL, + 41, 64, 36, 0xfffffffff000001fLL, + 42, 64, 36, 0xfffffffff000003fLL, + 43, 64, 36, 0xfffffffff000007fLL, + 44, 64, 36, 0xfffffffff00000ffLL, + 45, 64, 36, 0xfffffffff00001ffLL, + 46, 64, 36, 0xfffffffff00003ffLL, + 47, 64, 36, 0xfffffffff00007ffLL, + 48, 64, 36, 0xfffffffff0000fffLL, + 49, 64, 36, 0xfffffffff0001fffLL, + 50, 64, 36, 0xfffffffff0003fffLL, + 51, 64, 36, 0xfffffffff0007fffLL, + 52, 64, 36, 0xfffffffff000ffffLL, + 53, 64, 36, 0xfffffffff001ffffLL, + 54, 64, 36, 0xfffffffff003ffffLL, + 55, 64, 36, 0xfffffffff007ffffLL, + 56, 64, 36, 0xfffffffff00fffffLL, + 57, 64, 36, 0xfffffffff01fffffLL, + 58, 64, 36, 0xfffffffff03fffffLL, + 59, 64, 36, 0xfffffffff07fffffLL, + 60, 64, 36, 0xfffffffff0ffffffLL, + 61, 64, 36, 0xfffffffff1ffffffLL, + 62, 64, 36, 0xfffffffff3ffffffLL, + 63, 64, 36, 0xfffffffff7ffffffLL, + 37, 64, 37, 0xfffffffff8000000LL, + 38, 64, 37, 0xfffffffff8000001LL, + 39, 64, 37, 0xfffffffff8000003LL, + 40, 64, 37, 0xfffffffff8000007LL, + 41, 64, 37, 0xfffffffff800000fLL, + 42, 64, 37, 0xfffffffff800001fLL, + 43, 64, 37, 0xfffffffff800003fLL, + 44, 64, 37, 0xfffffffff800007fLL, + 45, 64, 37, 0xfffffffff80000ffLL, + 46, 64, 37, 0xfffffffff80001ffLL, + 47, 64, 37, 0xfffffffff80003ffLL, + 48, 64, 37, 0xfffffffff80007ffLL, + 49, 64, 37, 0xfffffffff8000fffLL, + 50, 64, 37, 0xfffffffff8001fffLL, + 51, 64, 37, 0xfffffffff8003fffLL, + 52, 64, 37, 0xfffffffff8007fffLL, + 53, 64, 37, 0xfffffffff800ffffLL, + 54, 64, 37, 0xfffffffff801ffffLL, + 55, 64, 37, 0xfffffffff803ffffLL, + 56, 64, 37, 0xfffffffff807ffffLL, + 57, 64, 37, 0xfffffffff80fffffLL, + 58, 64, 37, 0xfffffffff81fffffLL, + 59, 64, 37, 0xfffffffff83fffffLL, + 60, 64, 37, 0xfffffffff87fffffLL, + 61, 64, 37, 0xfffffffff8ffffffLL, + 62, 64, 37, 0xfffffffff9ffffffLL, + 63, 64, 37, 0xfffffffffbffffffLL, + 38, 64, 38, 0xfffffffffc000000LL, + 39, 64, 38, 0xfffffffffc000001LL, + 40, 64, 38, 0xfffffffffc000003LL, + 41, 64, 38, 0xfffffffffc000007LL, + 42, 64, 38, 0xfffffffffc00000fLL, + 43, 64, 38, 0xfffffffffc00001fLL, + 44, 64, 38, 0xfffffffffc00003fLL, + 45, 64, 38, 0xfffffffffc00007fLL, + 46, 64, 38, 0xfffffffffc0000ffLL, + 47, 64, 38, 0xfffffffffc0001ffLL, + 48, 64, 38, 0xfffffffffc0003ffLL, + 49, 64, 38, 0xfffffffffc0007ffLL, + 50, 64, 38, 0xfffffffffc000fffLL, + 51, 64, 38, 0xfffffffffc001fffLL, + 52, 64, 38, 0xfffffffffc003fffLL, + 53, 64, 38, 0xfffffffffc007fffLL, + 54, 64, 38, 0xfffffffffc00ffffLL, + 55, 64, 38, 0xfffffffffc01ffffLL, + 56, 64, 38, 0xfffffffffc03ffffLL, + 57, 64, 38, 0xfffffffffc07ffffLL, + 58, 64, 38, 0xfffffffffc0fffffLL, + 59, 64, 38, 0xfffffffffc1fffffLL, + 60, 64, 38, 0xfffffffffc3fffffLL, + 61, 64, 38, 0xfffffffffc7fffffLL, + 62, 64, 38, 0xfffffffffcffffffLL, + 63, 64, 38, 0xfffffffffdffffffLL, + 39, 64, 39, 0xfffffffffe000000LL, + 40, 64, 39, 0xfffffffffe000001LL, + 41, 64, 39, 0xfffffffffe000003LL, + 42, 64, 39, 0xfffffffffe000007LL, + 43, 64, 39, 0xfffffffffe00000fLL, + 44, 64, 39, 0xfffffffffe00001fLL, + 45, 64, 39, 0xfffffffffe00003fLL, + 46, 64, 39, 0xfffffffffe00007fLL, + 47, 64, 39, 0xfffffffffe0000ffLL, + 48, 64, 39, 0xfffffffffe0001ffLL, + 49, 64, 39, 0xfffffffffe0003ffLL, + 50, 64, 39, 0xfffffffffe0007ffLL, + 51, 64, 39, 0xfffffffffe000fffLL, + 52, 64, 39, 0xfffffffffe001fffLL, + 53, 64, 39, 0xfffffffffe003fffLL, + 54, 64, 39, 0xfffffffffe007fffLL, + 55, 64, 39, 0xfffffffffe00ffffLL, + 56, 64, 39, 0xfffffffffe01ffffLL, + 57, 64, 39, 0xfffffffffe03ffffLL, + 58, 64, 39, 0xfffffffffe07ffffLL, + 59, 64, 39, 0xfffffffffe0fffffLL, + 60, 64, 39, 0xfffffffffe1fffffLL, + 61, 64, 39, 0xfffffffffe3fffffLL, + 62, 64, 39, 0xfffffffffe7fffffLL, + 63, 64, 39, 0xfffffffffeffffffLL, + 40, 64, 40, 0xffffffffff000000LL, + 41, 64, 40, 0xffffffffff000001LL, + 42, 64, 40, 0xffffffffff000003LL, + 43, 64, 40, 0xffffffffff000007LL, + 44, 64, 40, 0xffffffffff00000fLL, + 45, 64, 40, 0xffffffffff00001fLL, + 46, 64, 40, 0xffffffffff00003fLL, + 47, 64, 40, 0xffffffffff00007fLL, + 48, 64, 40, 0xffffffffff0000ffLL, + 49, 64, 40, 0xffffffffff0001ffLL, + 50, 64, 40, 0xffffffffff0003ffLL, + 51, 64, 40, 0xffffffffff0007ffLL, + 52, 64, 40, 0xffffffffff000fffLL, + 53, 64, 40, 0xffffffffff001fffLL, + 54, 64, 40, 0xffffffffff003fffLL, + 55, 64, 40, 0xffffffffff007fffLL, + 56, 64, 40, 0xffffffffff00ffffLL, + 57, 64, 40, 0xffffffffff01ffffLL, + 58, 64, 40, 0xffffffffff03ffffLL, + 59, 64, 40, 0xffffffffff07ffffLL, + 60, 64, 40, 0xffffffffff0fffffLL, + 61, 64, 40, 0xffffffffff1fffffLL, + 62, 64, 40, 0xffffffffff3fffffLL, + 63, 64, 40, 0xffffffffff7fffffLL, + 41, 64, 41, 0xffffffffff800000LL, + 42, 64, 41, 0xffffffffff800001LL, + 43, 64, 41, 0xffffffffff800003LL, + 44, 64, 41, 0xffffffffff800007LL, + 45, 64, 41, 0xffffffffff80000fLL, + 46, 64, 41, 0xffffffffff80001fLL, + 47, 64, 41, 0xffffffffff80003fLL, + 48, 64, 41, 0xffffffffff80007fLL, + 49, 64, 41, 0xffffffffff8000ffLL, + 50, 64, 41, 0xffffffffff8001ffLL, + 51, 64, 41, 0xffffffffff8003ffLL, + 52, 64, 41, 0xffffffffff8007ffLL, + 53, 64, 41, 0xffffffffff800fffLL, + 54, 64, 41, 0xffffffffff801fffLL, + 55, 64, 41, 0xffffffffff803fffLL, + 56, 64, 41, 0xffffffffff807fffLL, + 57, 64, 41, 0xffffffffff80ffffLL, + 58, 64, 41, 0xffffffffff81ffffLL, + 59, 64, 41, 0xffffffffff83ffffLL, + 60, 64, 41, 0xffffffffff87ffffLL, + 61, 64, 41, 0xffffffffff8fffffLL, + 62, 64, 41, 0xffffffffff9fffffLL, + 63, 64, 41, 0xffffffffffbfffffLL, + 42, 64, 42, 0xffffffffffc00000LL, + 43, 64, 42, 0xffffffffffc00001LL, + 44, 64, 42, 0xffffffffffc00003LL, + 45, 64, 42, 0xffffffffffc00007LL, + 46, 64, 42, 0xffffffffffc0000fLL, + 47, 64, 42, 0xffffffffffc0001fLL, + 48, 64, 42, 0xffffffffffc0003fLL, + 49, 64, 42, 0xffffffffffc0007fLL, + 50, 64, 42, 0xffffffffffc000ffLL, + 51, 64, 42, 0xffffffffffc001ffLL, + 52, 64, 42, 0xffffffffffc003ffLL, + 53, 64, 42, 0xffffffffffc007ffLL, + 54, 64, 42, 0xffffffffffc00fffLL, + 55, 64, 42, 0xffffffffffc01fffLL, + 56, 64, 42, 0xffffffffffc03fffLL, + 57, 64, 42, 0xffffffffffc07fffLL, + 58, 64, 42, 0xffffffffffc0ffffLL, + 59, 64, 42, 0xffffffffffc1ffffLL, + 60, 64, 42, 0xffffffffffc3ffffLL, + 61, 64, 42, 0xffffffffffc7ffffLL, + 62, 64, 42, 0xffffffffffcfffffLL, + 63, 64, 42, 0xffffffffffdfffffLL, + 43, 64, 43, 0xffffffffffe00000LL, + 44, 64, 43, 0xffffffffffe00001LL, + 45, 64, 43, 0xffffffffffe00003LL, + 46, 64, 43, 0xffffffffffe00007LL, + 47, 64, 43, 0xffffffffffe0000fLL, + 48, 64, 43, 0xffffffffffe0001fLL, + 49, 64, 43, 0xffffffffffe0003fLL, + 50, 64, 43, 0xffffffffffe0007fLL, + 51, 64, 43, 0xffffffffffe000ffLL, + 52, 64, 43, 0xffffffffffe001ffLL, + 53, 64, 43, 0xffffffffffe003ffLL, + 54, 64, 43, 0xffffffffffe007ffLL, + 55, 64, 43, 0xffffffffffe00fffLL, + 56, 64, 43, 0xffffffffffe01fffLL, + 57, 64, 43, 0xffffffffffe03fffLL, + 58, 64, 43, 0xffffffffffe07fffLL, + 59, 64, 43, 0xffffffffffe0ffffLL, + 60, 64, 43, 0xffffffffffe1ffffLL, + 61, 64, 43, 0xffffffffffe3ffffLL, + 62, 64, 43, 0xffffffffffe7ffffLL, + 63, 64, 43, 0xffffffffffefffffLL, + 44, 64, 44, 0xfffffffffff00000LL, + 45, 64, 44, 0xfffffffffff00001LL, + 46, 64, 44, 0xfffffffffff00003LL, + 47, 64, 44, 0xfffffffffff00007LL, + 48, 64, 44, 0xfffffffffff0000fLL, + 49, 64, 44, 0xfffffffffff0001fLL, + 50, 64, 44, 0xfffffffffff0003fLL, + 51, 64, 44, 0xfffffffffff0007fLL, + 52, 64, 44, 0xfffffffffff000ffLL, + 53, 64, 44, 0xfffffffffff001ffLL, + 54, 64, 44, 0xfffffffffff003ffLL, + 55, 64, 44, 0xfffffffffff007ffLL, + 56, 64, 44, 0xfffffffffff00fffLL, + 57, 64, 44, 0xfffffffffff01fffLL, + 58, 64, 44, 0xfffffffffff03fffLL, + 59, 64, 44, 0xfffffffffff07fffLL, + 60, 64, 44, 0xfffffffffff0ffffLL, + 61, 64, 44, 0xfffffffffff1ffffLL, + 62, 64, 44, 0xfffffffffff3ffffLL, + 63, 64, 44, 0xfffffffffff7ffffLL, + 45, 64, 45, 0xfffffffffff80000LL, + 46, 64, 45, 0xfffffffffff80001LL, + 47, 64, 45, 0xfffffffffff80003LL, + 48, 64, 45, 0xfffffffffff80007LL, + 49, 64, 45, 0xfffffffffff8000fLL, + 50, 64, 45, 0xfffffffffff8001fLL, + 51, 64, 45, 0xfffffffffff8003fLL, + 52, 64, 45, 0xfffffffffff8007fLL, + 53, 64, 45, 0xfffffffffff800ffLL, + 54, 64, 45, 0xfffffffffff801ffLL, + 55, 64, 45, 0xfffffffffff803ffLL, + 56, 64, 45, 0xfffffffffff807ffLL, + 57, 64, 45, 0xfffffffffff80fffLL, + 58, 64, 45, 0xfffffffffff81fffLL, + 59, 64, 45, 0xfffffffffff83fffLL, + 60, 64, 45, 0xfffffffffff87fffLL, + 61, 64, 45, 0xfffffffffff8ffffLL, + 62, 64, 45, 0xfffffffffff9ffffLL, + 63, 64, 45, 0xfffffffffffbffffLL, + 46, 64, 46, 0xfffffffffffc0000LL, + 47, 64, 46, 0xfffffffffffc0001LL, + 48, 64, 46, 0xfffffffffffc0003LL, + 49, 64, 46, 0xfffffffffffc0007LL, + 50, 64, 46, 0xfffffffffffc000fLL, + 51, 64, 46, 0xfffffffffffc001fLL, + 52, 64, 46, 0xfffffffffffc003fLL, + 53, 64, 46, 0xfffffffffffc007fLL, + 54, 64, 46, 0xfffffffffffc00ffLL, + 55, 64, 46, 0xfffffffffffc01ffLL, + 56, 64, 46, 0xfffffffffffc03ffLL, + 57, 64, 46, 0xfffffffffffc07ffLL, + 58, 64, 46, 0xfffffffffffc0fffLL, + 59, 64, 46, 0xfffffffffffc1fffLL, + 60, 64, 46, 0xfffffffffffc3fffLL, + 61, 64, 46, 0xfffffffffffc7fffLL, + 62, 64, 46, 0xfffffffffffcffffLL, + 63, 64, 46, 0xfffffffffffdffffLL, + 47, 64, 47, 0xfffffffffffe0000LL, + 48, 64, 47, 0xfffffffffffe0001LL, + 49, 64, 47, 0xfffffffffffe0003LL, + 50, 64, 47, 0xfffffffffffe0007LL, + 51, 64, 47, 0xfffffffffffe000fLL, + 52, 64, 47, 0xfffffffffffe001fLL, + 53, 64, 47, 0xfffffffffffe003fLL, + 54, 64, 47, 0xfffffffffffe007fLL, + 55, 64, 47, 0xfffffffffffe00ffLL, + 56, 64, 47, 0xfffffffffffe01ffLL, + 57, 64, 47, 0xfffffffffffe03ffLL, + 58, 64, 47, 0xfffffffffffe07ffLL, + 59, 64, 47, 0xfffffffffffe0fffLL, + 60, 64, 47, 0xfffffffffffe1fffLL, + 61, 64, 47, 0xfffffffffffe3fffLL, + 62, 64, 47, 0xfffffffffffe7fffLL, + 63, 64, 47, 0xfffffffffffeffffLL, + 48, 64, 48, 0xffffffffffff0000LL, + 49, 64, 48, 0xffffffffffff0001LL, + 50, 64, 48, 0xffffffffffff0003LL, + 51, 64, 48, 0xffffffffffff0007LL, + 52, 64, 48, 0xffffffffffff000fLL, + 53, 64, 48, 0xffffffffffff001fLL, + 54, 64, 48, 0xffffffffffff003fLL, + 55, 64, 48, 0xffffffffffff007fLL, + 56, 64, 48, 0xffffffffffff00ffLL, + 57, 64, 48, 0xffffffffffff01ffLL, + 58, 64, 48, 0xffffffffffff03ffLL, + 59, 64, 48, 0xffffffffffff07ffLL, + 60, 64, 48, 0xffffffffffff0fffLL, + 61, 64, 48, 0xffffffffffff1fffLL, + 62, 64, 48, 0xffffffffffff3fffLL, + 63, 64, 48, 0xffffffffffff7fffLL, + 49, 64, 49, 0xffffffffffff8000LL, + 50, 64, 49, 0xffffffffffff8001LL, + 51, 64, 49, 0xffffffffffff8003LL, + 52, 64, 49, 0xffffffffffff8007LL, + 53, 64, 49, 0xffffffffffff800fLL, + 54, 64, 49, 0xffffffffffff801fLL, + 55, 64, 49, 0xffffffffffff803fLL, + 56, 64, 49, 0xffffffffffff807fLL, + 57, 64, 49, 0xffffffffffff80ffLL, + 58, 64, 49, 0xffffffffffff81ffLL, + 59, 64, 49, 0xffffffffffff83ffLL, + 60, 64, 49, 0xffffffffffff87ffLL, + 61, 64, 49, 0xffffffffffff8fffLL, + 62, 64, 49, 0xffffffffffff9fffLL, + 63, 64, 49, 0xffffffffffffbfffLL, + 50, 64, 50, 0xffffffffffffc000LL, + 51, 64, 50, 0xffffffffffffc001LL, + 52, 64, 50, 0xffffffffffffc003LL, + 53, 64, 50, 0xffffffffffffc007LL, + 54, 64, 50, 0xffffffffffffc00fLL, + 55, 64, 50, 0xffffffffffffc01fLL, + 56, 64, 50, 0xffffffffffffc03fLL, + 57, 64, 50, 0xffffffffffffc07fLL, + 58, 64, 50, 0xffffffffffffc0ffLL, + 59, 64, 50, 0xffffffffffffc1ffLL, + 60, 64, 50, 0xffffffffffffc3ffLL, + 61, 64, 50, 0xffffffffffffc7ffLL, + 62, 64, 50, 0xffffffffffffcfffLL, + 63, 64, 50, 0xffffffffffffdfffLL, + 51, 64, 51, 0xffffffffffffe000LL, + 52, 64, 51, 0xffffffffffffe001LL, + 53, 64, 51, 0xffffffffffffe003LL, + 54, 64, 51, 0xffffffffffffe007LL, + 55, 64, 51, 0xffffffffffffe00fLL, + 56, 64, 51, 0xffffffffffffe01fLL, + 57, 64, 51, 0xffffffffffffe03fLL, + 58, 64, 51, 0xffffffffffffe07fLL, + 59, 64, 51, 0xffffffffffffe0ffLL, + 60, 64, 51, 0xffffffffffffe1ffLL, + 61, 64, 51, 0xffffffffffffe3ffLL, + 62, 64, 51, 0xffffffffffffe7ffLL, + 63, 64, 51, 0xffffffffffffefffLL, + 52, 64, 52, 0xfffffffffffff000LL, + 53, 64, 52, 0xfffffffffffff001LL, + 54, 64, 52, 0xfffffffffffff003LL, + 55, 64, 52, 0xfffffffffffff007LL, + 56, 64, 52, 0xfffffffffffff00fLL, + 57, 64, 52, 0xfffffffffffff01fLL, + 58, 64, 52, 0xfffffffffffff03fLL, + 59, 64, 52, 0xfffffffffffff07fLL, + 60, 64, 52, 0xfffffffffffff0ffLL, + 61, 64, 52, 0xfffffffffffff1ffLL, + 62, 64, 52, 0xfffffffffffff3ffLL, + 63, 64, 52, 0xfffffffffffff7ffLL, + 53, 64, 53, 0xfffffffffffff800LL, + 54, 64, 53, 0xfffffffffffff801LL, + 55, 64, 53, 0xfffffffffffff803LL, + 56, 64, 53, 0xfffffffffffff807LL, + 57, 64, 53, 0xfffffffffffff80fLL, + 58, 64, 53, 0xfffffffffffff81fLL, + 59, 64, 53, 0xfffffffffffff83fLL, + 60, 64, 53, 0xfffffffffffff87fLL, + 61, 64, 53, 0xfffffffffffff8ffLL, + 62, 64, 53, 0xfffffffffffff9ffLL, + 63, 64, 53, 0xfffffffffffffbffLL, + 54, 64, 54, 0xfffffffffffffc00LL, + 55, 64, 54, 0xfffffffffffffc01LL, + 56, 64, 54, 0xfffffffffffffc03LL, + 57, 64, 54, 0xfffffffffffffc07LL, + 58, 64, 54, 0xfffffffffffffc0fLL, + 59, 64, 54, 0xfffffffffffffc1fLL, + 60, 64, 54, 0xfffffffffffffc3fLL, + 61, 64, 54, 0xfffffffffffffc7fLL, + 62, 64, 54, 0xfffffffffffffcffLL, + 63, 64, 54, 0xfffffffffffffdffLL, + 55, 64, 55, 0xfffffffffffffe00LL, + 56, 64, 55, 0xfffffffffffffe01LL, + 57, 64, 55, 0xfffffffffffffe03LL, + 58, 64, 55, 0xfffffffffffffe07LL, + 59, 64, 55, 0xfffffffffffffe0fLL, + 60, 64, 55, 0xfffffffffffffe1fLL, + 61, 64, 55, 0xfffffffffffffe3fLL, + 62, 64, 55, 0xfffffffffffffe7fLL, + 63, 64, 55, 0xfffffffffffffeffLL, + 56, 64, 56, 0xffffffffffffff00LL, + 57, 64, 56, 0xffffffffffffff01LL, + 58, 64, 56, 0xffffffffffffff03LL, + 59, 64, 56, 0xffffffffffffff07LL, + 60, 64, 56, 0xffffffffffffff0fLL, + 61, 64, 56, 0xffffffffffffff1fLL, + 62, 64, 56, 0xffffffffffffff3fLL, + 63, 64, 56, 0xffffffffffffff7fLL, + 57, 64, 57, 0xffffffffffffff80LL, + 58, 64, 57, 0xffffffffffffff81LL, + 59, 64, 57, 0xffffffffffffff83LL, + 60, 64, 57, 0xffffffffffffff87LL, + 61, 64, 57, 0xffffffffffffff8fLL, + 62, 64, 57, 0xffffffffffffff9fLL, + 63, 64, 57, 0xffffffffffffffbfLL, + 58, 64, 58, 0xffffffffffffffc0LL, + 59, 64, 58, 0xffffffffffffffc1LL, + 60, 64, 58, 0xffffffffffffffc3LL, + 61, 64, 58, 0xffffffffffffffc7LL, + 62, 64, 58, 0xffffffffffffffcfLL, + 63, 64, 58, 0xffffffffffffffdfLL, + 59, 64, 59, 0xffffffffffffffe0LL, + 60, 64, 59, 0xffffffffffffffe1LL, + 61, 64, 59, 0xffffffffffffffe3LL, + 62, 64, 59, 0xffffffffffffffe7LL, + 63, 64, 59, 0xffffffffffffffefLL, + 60, 64, 60, 0xfffffffffffffff0LL, + 61, 64, 60, 0xfffffffffffffff1LL, + 62, 64, 60, 0xfffffffffffffff3LL, + 63, 64, 60, 0xfffffffffffffff7LL, + 61, 64, 61, 0xfffffffffffffff8LL, + 62, 64, 61, 0xfffffffffffffff9LL, + 63, 64, 61, 0xfffffffffffffffbLL, + 62, 64, 62, 0xfffffffffffffffcLL, + 63, 64, 62, 0xfffffffffffffffdLL, + 63, 64, 63, 0xfffffffffffffffeLL, +}; + +Mask* +findmask(uvlong v) +{ + int top, bot, mid; + Mask *m; + + bot = 0; + top = nelem(bitmasks); + while(bot < top){ + mid = (bot+top)/2; + m = &bitmasks[mid]; + if(v == m->v) + return m; + if(v < m->v) + top = mid; + else + bot = mid+1; + } + return nil; +} diff --git a/sys/src/cmd/7l/compat.c b/sys/src/cmd/7l/compat.c new file mode 100644 index 000000000..1d9f89e43 --- /dev/null +++ b/sys/src/cmd/7l/compat.c @@ -0,0 +1,56 @@ +#include "l.h" + +/* + * fake malloc + */ +void* +malloc(ulong n) +{ + void *p; + + while(n & 7) + n++; + while(nhunk < n) + gethunk(); + p = hunk; + nhunk -= n; + hunk += n; + return p; +} + +void +free(void *p) +{ + USED(p); +} + +void* +calloc(ulong m, ulong n) +{ + void *p; + + n *= m; + p = malloc(n); + memset(p, 0, n); + return p; +} + +void* +realloc(void *p, ulong n) +{ + fprint(2, "realloc(0x%p %ld) called\n", p, n); + abort(); + return 0; +} + +void* +mysbrk(ulong size) +{ + return sbrk(size); +} + +void +setmalloctag(void *v, uintptr pc) +{ + USED(v, pc); +} diff --git a/sys/src/cmd/7l/dyn.c b/sys/src/cmd/7l/dyn.c new file mode 100644 index 000000000..ba8800a61 --- /dev/null +++ b/sys/src/cmd/7l/dyn.c @@ -0,0 +1,157 @@ +#include "l.h" + +enum{ + ABSD = 0, + ABSU = 1, + RELD = 2, + RELU = 3, +}; + +int modemap[4] = { 0, 1, -1, 2, }; + +typedef struct Reloc Reloc; + +struct Reloc +{ + int n; + int t; + uchar *m; + ulong *a; +}; + +Reloc rels; + +static void +grow(Reloc *r) +{ + int t; + uchar *m, *nm; + ulong *a, *na; + + t = r->t; + r->t += 64; + m = r->m; + a = r->a; + r->m = nm = malloc(r->t*sizeof(uchar)); + r->a = na = malloc(r->t*sizeof(ulong)); + memmove(nm, m, t*sizeof(uchar)); + memmove(na, a, t*sizeof(ulong)); + free(m); + free(a); +} + +void +dynreloc(Sym *s, long v, int abs) +{ + int i, k, n; + uchar *m; + ulong *a; + Reloc *r; + + if(v&3) + diag("bad relocation address"); + v >>= 2; + if(s != S && s->type == SUNDEF) + k = abs ? ABSU : RELU; + else + k = abs ? ABSD : RELD; + /* Bprint(&bso, "R %s a=%ld(%lx) %d\n", s->name, a, a, k); */ + k = modemap[k]; + r = &rels; + n = r->n; + if(n >= r->t) + grow(r); + m = r->m; + a = r->a; + for(i = n; i > 0; i--){ + if(v < a[i-1]){ /* happens occasionally for data */ + m[i] = m[i-1]; + a[i] = a[i-1]; + } + else + break; + } + m[i] = k; + a[i] = v; + r->n++; +} + +static int +sput(char *s) +{ + char *p; + + p = s; + while(*s) + cput(*s++); + cput(0); + return s-p+1; +} + +void +asmdyn(void) +{ + int i, n, t, c; + Sym *s; + ulong la, ra, *a; + vlong off; + uchar *m; + Reloc *r; + + cflush(); + off = seek(cout, 0, 1); + lput(0); + t = 0; + lput(imports); + t += 4; + for(i = 0; i < NHASH; i++) + for(s = hash[i]; s != S; s = s->link) + if(s->type == SUNDEF){ + lput(s->sig); + t += 4; + t += sput(s->name); + } + + la = 0; + r = &rels; + n = r->n; + m = r->m; + a = r->a; + lput(n); + t += 4; + for(i = 0; i < n; i++){ + ra = *a-la; + if(*a < la) + diag("bad relocation order"); + if(ra < 256) + c = 0; + else if(ra < 65536) + c = 1; + else + c = 2; + cput((c<<6)|*m++); + t++; + if(c == 0){ + cput(ra); + t++; + } + else if(c == 1){ + wput(ra); + t += 2; + } + else{ + lput(ra); + t += 4; + } + la = *a++; + } + + cflush(); + seek(cout, off, 0); + lput(t); + + if(debug['v']){ + Bprint(&bso, "import table entries = %d\n", imports); + Bprint(&bso, "export table entries = %d\n", exports); + } +} diff --git a/sys/src/cmd/7l/l.h b/sys/src/cmd/7l/l.h new file mode 100644 index 000000000..ac0dae6dc --- /dev/null +++ b/sys/src/cmd/7l/l.h @@ -0,0 +1,430 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include "../7c/7.out.h" + +#ifndef EXTERN +#define EXTERN extern +#endif + +#define LIBNAMELEN 300 + +void addlibpath(char*); +int fileexists(char*); +int find1(long, int); +char* findlib(char*); + +typedef struct Adr Adr; +typedef struct Autom Auto; +typedef struct Count Count; +typedef struct Ieee Ieee; +typedef struct Prog Prog; +typedef struct Sym Sym; +typedef struct Mask Mask; +typedef struct Optab Optab; +typedef struct Oprang Oprang; +typedef uchar Opcross[32][2][32]; + +#define P ((Prog*)0) +#define S ((Sym*)0) +#define TNAME (curtext&&curtext->from.sym?curtext->from.sym->name:noname) + +struct Adr +{ + union + { + vlong u0offset; + char* u0sval; + Ieee* u0ieee; + } u0; + union + { + Auto* u1autom; + Sym* u1sym; + } u1; + char type; + char reg; + char name; + char class; +}; + +#define offset u0.u0offset +#define sval u0.u0sval +#define ieee u0.u0ieee + +#define autom u1.u1autom +#define sym u1.u1sym + +struct Prog +{ + Adr from; + Adr from3; /* third register operand */ + Adr to; + union + { + long u0regused; + Prog* u0forwd; + } u0; + Prog* cond; + Prog* link; + vlong pc; + long line; + uchar mark; + ushort optab; + ushort as; + uchar reg; +}; +#define regused u0.u0regused +#define forwd u0.u0forwd + +struct Sym +{ + char *name; + short type; + short version; + short become; + short frame; + uchar subtype; + ushort file; + vlong value; + long sig; + Sym* link; +}; + +#define SIGNINTERN (1729*325*1729) /* signature of internal functions such as _div */ + +struct Autom +{ + Sym* asym; + Auto* link; + long aoffset; + short type; +}; + +struct Optab +{ + ushort as; + char a1; + char a2; + char a3; + char type; + char size; + char param; + char flag; +}; +struct Oprang +{ + Optab* start; + Optab* stop; +}; +struct Mask +{ + uchar s; + uchar e; + uchar r; + uvlong v; +}; + +enum +{ + STEXT = 1, + SDATA, + SBSS, + SDATA1, + SXREF, + SLEAF, + SFILE, + SCONST, + SSTRING, + SUNDEF, + + SIMPORT, + SEXPORT, + + LFROM = 1<<0, + LTO = 1<<1, + LPOOL = 1<<2, + + C_NONE = 0, + C_REG, + C_RSP, /* D_REG or D_SP */ + C_SHIFT, /* D_SHIFT: shift type, amount, value */ + C_EXTREG, /* D_EXTREG: reg, ext type, shift */ + C_FREG, + C_SPR, + C_COND, + + C_ZCON, /* 0 (matching C_REG, not C_RSP, allowing REGZERO) */ + C_ADDCON0, /* 12-bit unsigned, unshifted */ + C_ADDCON, /* 12-bit unsigned, shifted left by 0 or 12 */ + C_MOVCON, /* generated by a 16-bit constant, optionally inverted and/or shifted by multiple of 16 */ + C_BITCON, /* bimm32 */ + C_ABCON, /* could be C_ADDCON or C_BITCON */ + C_MBCON, /* could be C_MOVCON or C_BITCON */ + C_LCON, /* 32-bit constant */ + C_FCON, /* floating-point constant */ + C_VCON, /* 64-bit constant */ + + C_AACON, /* ADDCON offset in auto constant $a(FP) */ + C_LACON, /* 32-bit offset in auto constant $a(FP) */ + + C_AECON, /* ADDCON offset in extern constant $e(SB) */ + + C_SBRA, + C_LBRA, + + C_NPAUTO, /* -512 <= x < 0, 0 mod 8 */ + C_NSAUTO, /* -256 <= x < 0 */ + C_PSAUTO, /* 0 to 255 */ + C_PPAUTO, /* 0 to 504, 0 mod 8 */ + C_UAUTO4K, /* 0 to 4095 */ + C_UAUTO8K, /* 0 to 8190, 0 mod 2 */ + C_UAUTO16K, /* 0 to 16380, 0 mod 4 */ + C_UAUTO32K, /* 0 to 32760, 0 mod 8 */ + C_UAUTO64K, /* 0 to 65520, 0 mod 16 */ + C_LAUTO, /* any other 32-bit constant */ + + C_SEXT1, /* 0 to 4095, direct */ + C_SEXT2, /* 0 to 8190 */ + C_SEXT4, /* 0 to 16380 */ + C_SEXT8, /* 0 to 32760 */ + C_SEXT16, /* 0 to 65520 */ + C_LEXT, + + C_NPOREG, /* mirror NPAUTO etc, except for ZOREG */ + C_NSOREG, + C_ZOREG, + C_PSOREG, + C_PPOREG, + C_UOREG4K, + C_UOREG8K, + C_UOREG16K, + C_UOREG32K, + C_UOREG64K, + C_LOREG, + + C_ADDR, /* relocatable address for dynamic loading */ + C_ROFF, /* register offset (inc register extended) */ + C_XPOST, + C_XPRE, + + C_VREG, + + C_GOK, + C_NCLASS, /* must be last */ + +/* mark flags */ + FOLL = 1<<0, + LABEL = 1<<1, + LEAF = 1<<2, + FLOAT = 1<<3, + BRANCH = 1<<4, + LOAD = 1<<5, + SYNC = 1<<6, + NOSCHED = 1<<7, + + MINSIZ = 64, + + Roffset = 22, /* no. bits for offset in relocation address */ + Rindex = 10, /* no. bits for index in relocation address */ + + STACKALIGN = 16, /* alignment of stack */ + PCSZ= 8, /* size of PC */ +}; + +enum +{ + + STRINGSZ = 200, + NHASH = 10007, + NHUNK = 100000, + MAXIO = 8192, + MAXHIST = 20, /* limit of path elements for history symbols */ +}; + +EXTERN union +{ + struct + { + uchar obuf[MAXIO]; /* output buffer */ + uchar ibuf[MAXIO]; /* input buffer */ + } u; + char dbuf[1]; +} buf; + +#define cbuf u.obuf +#define xbuf u.ibuf + +EXTERN long HEADR; /* length of header */ +EXTERN int HEADTYPE; /* type of header */ +EXTERN long INITDAT; /* data location */ +EXTERN long INITRND; /* data round above text location */ +EXTERN long INITTEXT; /* text location */ +EXTERN long INITTEXTP; /* text location (physical) */ +EXTERN char* INITENTRY; /* entry point */ +EXTERN long autosize; +EXTERN Biobuf bso; +EXTERN long bsssize; +EXTERN int cbc; +EXTERN uchar* cbp; +EXTERN int cout; +EXTERN Auto* curauto; +EXTERN Auto* curhist; +EXTERN Prog* curp; +EXTERN Prog* curtext; +EXTERN Prog* datap; +EXTERN long datsize; +EXTERN char debug[128]; +EXTERN Prog* etextp; +EXTERN Prog* firstp; + +EXTERN char fnuxi4[4]; +EXTERN char fnuxi8[8]; +EXTERN char inuxi1[1]; +EXTERN char inuxi2[2]; +EXTERN char inuxi4[4]; +EXTERN uchar inuxi8[8]; + +EXTERN Sym* hash[NHASH]; +EXTERN Sym* histfrog[MAXHIST]; +EXTERN int histfrogp; +EXTERN int histgen; +EXTERN char* hunk; + +EXTERN char* library[50]; +EXTERN char* libraryobj[50]; +EXTERN int libraryp; +EXTERN Prog* lastp; +EXTERN long lcsize; +EXTERN char literal[32]; +EXTERN int nerrors; +EXTERN long nhunk; +EXTERN char* noname; +EXTERN vlong instoffset; +EXTERN Opcross opcross[8]; +EXTERN char* outfile; +EXTERN vlong pc; +EXTERN uchar repop[ALAST]; +EXTERN long symsize; +EXTERN Prog* textp; +EXTERN vlong textsize; +EXTERN long thunk; +EXTERN int version; +EXTERN char xcmp[C_NCLASS][C_NCLASS]; +EXTERN int xrefresolv; +EXTERN Prog zprg; +EXTERN int dtype; + +EXTERN int doexp, dlm; +EXTERN int imports, nimports; +EXTERN int exports, nexports; +EXTERN char* EXPTAB; +EXTERN Prog undefp; + +#define UP (&undefp) + +extern char* anames[]; +extern char* cnames[]; +extern Optab optab[]; + +EXTERN Prog* blitrl; +EXTERN Prog* elitrl; + +#pragma varargck argpos diag 1 + +#pragma varargck type "A" int +#pragma varargck type "A" uint +#pragma varargck type "C" int +#pragma varargck type "D" Adr* +#pragma varargck type "N" Adr* +#pragma varargck type "P" Prog* +#pragma varargck type "S" char* + + +int Aconv(Fmt*); +int Cconv(Fmt*); +int Dconv(Fmt*); +int Nconv(Fmt*); +int Pconv(Fmt*); +int Rconv(Fmt*); +int Sconv(Fmt*); +int aclass(Adr*); +void addpool(Prog*, Adr*); +vlong atolwhex(char*); +void asmb(void); +void asmdyn(void); +void asmlc(void); +void asmout(Prog*, Optab*); +void asmsym(void); +Prog* brchain(Prog*); +Prog* brloop(Prog*); +void buildop(void); +void buildrep(int, int); +void cflush(void); +void ckoff(Sym*, long); +int chipfloat(Ieee*); +int cmp(int, int); +int compound(Prog*); +void cput(int); +void datblk(long, long, int); +void diag(char*, ...); +void dodata(void); +void doprof1(void); +void doprof2(void); +void dynreloc(Sym*, long, int); +vlong entryvalue(void); +void errorexit(void); +void export(void); +void follow(void); +void gethunk(void); +void histtoauto(void); +void* halloc(usize); +int isnop(Prog*); +double ieeedtod(Ieee*); +long ieeedtof(Ieee*); +void import(void); +void ldobj(int, long, char*); +void listinit(void); +void llput(vlong); +void llputl(vlong); +void loadlib(void); +Sym* lookup(char*, int); +void lput(long); +void lputl(long); +void mkfwd(void); +int movcon(vlong); +void* mysbrk(ulong); +void names(void); +void nocache(Prog*); +void nuxiinit(void); +void objfile(char*); +vlong offsetshift(vlong, int); +Optab* oplook(Prog*); +void patch(void); +int pseudo(Prog*); +void prasm(Prog*); +Prog* prg(void); +void putsymb(char*, int, vlong, int); +void readundefs(char*, int); +long regoff(Adr*); +int relinv(int); +vlong rnd(vlong, long); +void span(void); +void undef(void); +void wput(long); +void wputl(long); +void noops(void); +Mask* findmask(uvlong); +void xdefine(char*, int, long); +void xfol(Prog*); +void zerosig(char*); + + +#pragma varargck type "R" int + +/* for ../ld */ +#define isbranch(a) ((a) == AB) +#define iscall(a) ((a) == ABL) +#define isreturn(a) ((a) == ARETURN || (a) == ARET || (a) == AERET) +#define branchop() AB +#define canfollow(a) ((a) != ATEXT && (a) != ABCASE) diff --git a/sys/src/cmd/7l/list.c b/sys/src/cmd/7l/list.c new file mode 100644 index 000000000..c1f513027 --- /dev/null +++ b/sys/src/cmd/7l/list.c @@ -0,0 +1,362 @@ +#include "l.h" + +void +listinit(void) +{ + + fmtinstall('A', Aconv); + fmtinstall('D', Dconv); + fmtinstall('P', Pconv); + fmtinstall('S', Sconv); + fmtinstall('N', Nconv); + fmtinstall('R', Rconv); +} + +int +Pconv(Fmt *fp) +{ + char str[STRINGSZ], *s; + Prog *p; + int a; + + p = va_arg(fp->args, Prog*); + curp = p; + a = p->as; + switch(a) { + default: + s = str; + s += sprint(s, "(%ld)", p->line); + if(p->reg == NREG && p->from3.type == D_NONE) + sprint(s, " %A %D,%D", + a, &p->from, &p->to); + else if(p->from.type != D_FREG){ + s += sprint(s, " %A %D", a, &p->from); + if(p->from3.type != D_NONE) + s += sprint(s, ",%D", &p->from3); + if(p->reg != NREG) + s += sprint(s, ",R%d", p->reg); + sprint(s, ",%D", &p->to); + }else + sprint(s, " %A %D,F%d,%D", + a, &p->from, p->reg, &p->to); + break; + + case ADATA: + case AINIT: + case ADYNT: + sprint(str, "(%ld) %A %D/%d,%D", + p->line, a, &p->from, p->reg, &p->to); + break; + } + return fmtstrcpy(fp, str); +} + +int +Aconv(Fmt *fp) +{ + char *s; + int a; + + a = va_arg(fp->args, int); + s = "???"; + if(a >= AXXX && a < ALAST && anames[a]) + s = anames[a]; + return fmtstrcpy(fp, s); +} + +char* strcond[16] = +{ + "EQ", + "NE", + "HS", + "LO", + "MI", + "PL", + "VS", + "VC", + "HI", + "LS", + "GE", + "LT", + "GT", + "LE", + "AL", + "NV" +}; + +int +Dconv(Fmt *fp) +{ + char str[STRINGSZ]; + char *op; + Adr *a; + long v; + static char *extop[] = {".UB", ".UH", ".UW", ".UX", ".SB", ".SH", ".SW", ".SX"}; + + a = va_arg(fp->args, Adr*); + switch(a->type) { + + default: + sprint(str, "GOK-type(%d)", a->type); + break; + + case D_NONE: + str[0] = 0; + if(a->name != D_NONE || a->reg != NREG || a->sym != S) + sprint(str, "%N(R%d)(NONE)", a, a->reg); + break; + + case D_CONST: + if(a->reg == NREG || a->reg == REGZERO) + sprint(str, "$%N", a); + else + sprint(str, "$%N(R%d)", a, a->reg); + break; + + case D_SHIFT: + v = a->offset; + op = "<<>>->@>" + (((v>>22) & 3) << 1); + sprint(str, "R%ld%c%c%ld", (v>>16)&0x1F, op[0], op[1], (v>>10)&0x3F); + if(a->reg != NREG) + sprint(str+strlen(str), "(R%d)", a->reg); + break; + + case D_OCONST: + sprint(str, "$*$%N", a); + if(a->reg != NREG) + sprint(str, "%N(R%d)(CONST)", a, a->reg); + break; + + case D_OREG: + if(a->reg != NREG) + sprint(str, "%N(R%d)", a, a->reg); + else + sprint(str, "%N", a); + break; + + case D_XPRE: + if(a->reg != NREG) + sprint(str, "%N(R%d)!", a, a->reg); + else + sprint(str, "%N!", a); + break; + + case D_XPOST: + if(a->reg != NREG) + sprint(str, "(R%d)%N!", a->reg, a); + else + sprint(str, "%N!", a); + break; + + case D_EXTREG: + v = a->offset; + if(v & (7<<10)) + snprint(str, sizeof(str), "R%ld%s<<%ld", (v>>16)&31, extop[(v>>13)&7], (v>>10)&7); + else + snprint(str, sizeof(str), "R%ld%s", (v>>16)&31, extop[(v>>13)&7]); + break; + + case D_ROFF: + v = a->offset; + if(v & (1<<16)) + snprint(str, sizeof(str), "(R%d)[R%ld%s]", a->reg, v&31, extop[(v>>8)&7]); + else + snprint(str, sizeof(str), "(R%d)(R%ld%s)", a->reg, v&31, extop[(v>>8)&7]); + break; + + case D_REG: + sprint(str, "R%d", a->reg); + if(a->name != D_NONE || a->sym != S) + sprint(str, "%N(R%d)(REG)", a, a->reg); + break; + + case D_SP: + if(a->name != D_NONE || a->sym != S) + sprint(str, "%N(R%d)(REG)", a, a->reg); + else + strcpy(str, "SP"); + break; + + case D_COND: + strcpy(str, strcond[a->reg & 0xF]); + break; + + case D_FREG: + sprint(str, "F%d", a->reg); + if(a->name != D_NONE || a->sym != S) + sprint(str, "%N(R%d)(REG)", a, a->reg); + break; + + case D_SPR: + switch((ulong)a->offset){ + case D_FPSR: + sprint(str, "FPSR"); + break; + case D_FPCR: + sprint(str, "FPCR"); + break; + case D_NZCV: + sprint(str, "NZCV"); + break; + default: + sprint(str, "SPR(%#llux)", a->offset); + break; + } + if(a->name != D_NONE || a->sym != S) + sprint(str, "%N(SPR%lld)(REG)", a, a->offset); + break; + + case D_BRANCH: /* botch */ + if(curp->cond != P) { + v = curp->cond->pc; + if(a->sym != S) + sprint(str, "%s+%#.5lux(BRANCH)", a->sym->name, v); + else + sprint(str, "%.5lux(BRANCH)", v); + } else + if(a->sym != S) + sprint(str, "%s+%lld(APC)", a->sym->name, a->offset); + else + sprint(str, "%lld(APC)", a->offset); + break; + + case D_FCONST: + sprint(str, "$%e", ieeedtod(a->ieee)); + break; + + case D_SCONST: + sprint(str, "$\"%S\"", a->sval); + break; + } + return fmtstrcpy(fp, str); +} + +int +Nconv(Fmt *fp) +{ + char str[STRINGSZ]; + Adr *a; + Sym *s; + + a = va_arg(fp->args, Adr*); + s = a->sym; + switch(a->name) { + default: + sprint(str, "GOK-name(%d)", a->name); + break; + + case D_NONE: + sprint(str, "%lld", a->offset); + break; + + case D_EXTERN: + if(s == S) + sprint(str, "%lld(SB)", a->offset); + else + sprint(str, "%s+%lld(SB)", s->name, a->offset); + break; + + case D_STATIC: + if(s == S) + sprint(str, "<>+%lld(SB)", a->offset); + else + sprint(str, "%s<>+%lld(SB)", s->name, a->offset); + break; + + case D_AUTO: + if(s == S) + sprint(str, "%lld(SP)", a->offset); + else + sprint(str, "%s-%lld(SP)", s->name, -a->offset); + break; + + case D_PARAM: + if(s == S) + sprint(str, "%lld(FP)", a->offset); + else + sprint(str, "%s+%lld(FP)", s->name, a->offset); + break; + } + return fmtstrcpy(fp, str); +} + +int +Rconv(Fmt *fp) +{ + char *s; + int a; + + a = va_arg(fp->args, int); + s = "C_??"; + if(a >= C_NONE && a <= C_NCLASS) + s = cnames[a]; + return fmtstrcpy(fp, s); +} + +void +prasm(Prog *p) +{ + print("%P\n", p); +} + +int +Sconv(Fmt *fp) +{ + int i, c; + char str[STRINGSZ], *p, *a; + + a = va_arg(fp->args, char*); + p = str; + for(i=0; i<sizeof(long); i++) { + c = a[i] & 0xff; + if(c >= 'a' && c <= 'z' || + c >= 'A' && c <= 'Z' || + c >= '0' && c <= '9' || + c == ' ' || c == '%') { + *p++ = c; + continue; + } + *p++ = '\\'; + switch(c) { + case 0: + *p++ = 'z'; + continue; + case '\\': + case '"': + *p++ = c; + continue; + case '\n': + *p++ = 'n'; + continue; + case '\t': + *p++ = 't'; + continue; + } + *p++ = (c>>6) + '0'; + *p++ = ((c>>3) & 7) + '0'; + *p++ = (c & 7) + '0'; + } + *p = 0; + return fmtstrcpy(fp, str); +} + +void +diag(char *fmt, ...) +{ + char buf[STRINGSZ], *tn; + va_list arg; + + tn = "??none??"; + if(curtext != P && curtext->from.sym != S) + tn = curtext->from.sym->name; + va_start(arg, fmt); + vseprint(buf, buf+sizeof(buf), fmt, arg); + va_end(arg); + print("%s: %s\n", tn, buf); + + nerrors++; + if(nerrors > 10) { + print("too many errors\n"); + errorexit(); + } +} diff --git a/sys/src/cmd/7l/mkcname b/sys/src/cmd/7l/mkcname new file mode 100644 index 000000000..5502484ae --- /dev/null +++ b/sys/src/cmd/7l/mkcname @@ -0,0 +1,17 @@ +ed - l.h <<'!' +v/^ C_/d +g/^ C_NCLASS/s//&,/ +g/[ ]*=.*,/s//,/ +v/,/p +,s/^ C_/ "/ +,s/,.*$/",/ +1i +char *cnames[] = +{ +. +,a +}; +. +w cnam.c +Q +! diff --git a/sys/src/cmd/7l/mkfile b/sys/src/cmd/7l/mkfile new file mode 100644 index 000000000..1c1856aa8 --- /dev/null +++ b/sys/src/cmd/7l/mkfile @@ -0,0 +1,37 @@ +</$objtype/mkfile + +TARG=7l +OFILES=\ + asm.$O\ + asmout.$O\ + enam.$O\ + bits.$O\ + cnam.$O\ + compat.$O\ + dyn.$O\ + list.$O\ + noop.$O\ + obj.$O\ + optab.$O\ + span.$O\ + pass.$O\ + mod.$O\ + +HFILES=\ + l.h\ + ../7c/7.out.h\ + +BIN=/$objtype/bin +</sys/src/cmd/mkone + +../7c/enam.c: ../7c/7.out.h + @ { cd ../7c; mk enam.c } + +cnam.c: l.h mkcname + rc mkcname + +enam.$O: ../7c/enam.c + $CC $CFLAGS ../7c/enam.c + +x:V: $O.out + $O.out -la -o/dev/null x.7 diff --git a/sys/src/cmd/7l/mod.c b/sys/src/cmd/7l/mod.c new file mode 100644 index 000000000..f3ae0d47f --- /dev/null +++ b/sys/src/cmd/7l/mod.c @@ -0,0 +1,203 @@ +#include "l.h" + +void +readundefs(char *f, int t) +{ + int i, n; + Sym *s; + Biobuf *b; + char *l, buf[256], *fields[64]; + + if(f == nil) + return; + b = Bopen(f, OREAD); + if(b == nil){ + diag("could not open %s: %r", f); + errorexit(); + } + while((l = Brdline(b, '\n')) != nil){ + n = Blinelen(b); + if(n >= sizeof(buf)){ + diag("%s: line too long", f); + errorexit(); + } + memmove(buf, l, n); + buf[n-1] = '\0'; + n = getfields(buf, fields, nelem(fields), 1, " \t\r\n"); + if(n == nelem(fields)){ + diag("%s: bad format", f); + errorexit(); + } + for(i = 0; i < n; i++){ + s = lookup(fields[i], 0); + s->type = SXREF; + s->subtype = t; + if(t == SIMPORT) + nimports++; + else + nexports++; + } + } + Bterm(b); +} + +void +undefsym(Sym *s) +{ + int n; + + n = imports; + if(s->value != 0) + diag("value != 0 on SXREF"); + if(n >= 1<<Rindex) + diag("import index %d out of range", n); + s->value = n<<Roffset; + s->type = SUNDEF; + imports++; +} + +void +zerosig(char *sp) +{ + Sym *s; + + s = lookup(sp, 0); + s->sig = 0; +} + +void +import(void) +{ + int i; + Sym *s; + + for(i = 0; i < NHASH; i++) + for(s = hash[i]; s != S; s = s->link) + if(s->sig != 0 && s->type == SXREF && (nimports == 0 || s->subtype == SIMPORT)){ + undefsym(s); + Bprint(&bso, "IMPORT: %s sig=%lux v=%lld\n", s->name, s->sig, (vlong)s->value); + } +} + +void +ckoff(Sym *s, long v) +{ + if(v < 0 || v >= 1<<Roffset) + diag("relocation offset %ld for %s out of range", v, s->name); +} + +static Prog* +newdata(Sym *s, int o, int w, int t) +{ + Prog *p; + + p = prg(); + p->link = datap; + datap = p; + p->as = ADATA; + p->reg = w; + p->from.type = D_OREG; + p->from.name = t; + p->from.sym = s; + p->from.offset = o; + p->to.type = D_CONST; + p->to.name = D_NONE; + return p; +} + +void +export(void) +{ + int i, j, n, off, nb, sv, ne; + Sym *s, *et, *str, **esyms; + Prog *p; + char buf[NSNAME], *t; + + n = 0; + for(i = 0; i < NHASH; i++) + for(s = hash[i]; s != S; s = s->link) + if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) + n++; + esyms = malloc(n*sizeof(Sym*)); + ne = n; + n = 0; + for(i = 0; i < NHASH; i++) + for(s = hash[i]; s != S; s = s->link) + if(s->sig != 0 && s->type != SXREF && s->type != SUNDEF && (nexports == 0 || s->subtype == SEXPORT)) + esyms[n++] = s; + for(i = 0; i < ne-1; i++) + for(j = i+1; j < ne; j++) + if(strcmp(esyms[i]->name, esyms[j]->name) > 0){ + s = esyms[i]; + esyms[i] = esyms[j]; + esyms[j] = s; + } + + nb = 0; + off = 0; + et = lookup(EXPTAB, 0); + if(et->type != 0 && et->type != SXREF) + diag("%s already defined", EXPTAB); + et->type = SDATA; + str = lookup(".string", 0); + if(str->type == 0) + str->type = SDATA; + sv = str->value; + for(i = 0; i < ne; i++){ + s = esyms[i]; + Bprint(&bso, "EXPORT: %s sig=%lux t=%d\n", s->name, s->sig, s->type); + + /* signature */ + p = newdata(et, off, sizeof(long), D_EXTERN); + off += sizeof(long); + p->to.offset = s->sig; + + /* address */ + p = newdata(et, off, sizeof(long), D_EXTERN); + off += sizeof(long); + p->to.name = D_EXTERN; + p->to.sym = s; + + /* string */ + t = s->name; + n = strlen(t)+1; + for(;;){ + buf[nb++] = *t; + sv++; + if(nb >= NSNAME){ + p = newdata(str, sv-NSNAME, NSNAME, D_STATIC); + p->to.type = D_SCONST; + p->to.sval = malloc(NSNAME); + memmove(p->to.sval, buf, NSNAME); + nb = 0; + } + if(*t++ == 0) + break; + } + + /* name */ + p = newdata(et, off, sizeof(long), D_EXTERN); + off += sizeof(long); + p->to.name = D_STATIC; + p->to.sym = str; + p->to.offset = sv-n; + } + + if(nb > 0){ + p = newdata(str, sv-nb, nb, D_STATIC); + p->to.type = D_SCONST; + p->to.sval = malloc(NSNAME); + memmove(p->to.sval, buf, nb); + } + + for(i = 0; i < 3; i++){ + newdata(et, off, sizeof(long), D_EXTERN); + off += sizeof(long); + } + et->value = off; + if(sv == 0) + sv = 1; + str->value = sv; + exports = ne; + free(esyms); +} diff --git a/sys/src/cmd/7l/noop.c b/sys/src/cmd/7l/noop.c new file mode 100644 index 000000000..b61ac3f4d --- /dev/null +++ b/sys/src/cmd/7l/noop.c @@ -0,0 +1,324 @@ +#include "l.h" + +void +noops(void) +{ + Prog *p, *q, *q1; + int o, aoffset, curframe, curbecome, maxbecome; + + /* + * find leaf subroutines + * become sizes + * frame sizes + * strip NOPs + * expand RET + * expand BECOME pseudo + */ + + if(debug['v']) + Bprint(&bso, "%5.2f noops\n", cputime()); + Bflush(&bso); + + curframe = 0; + curbecome = 0; + maxbecome = 0; + curtext = 0; + + q = P; + for(p = firstp; p != P; p = p->link) { + + /* find out how much arg space is used in this TEXT */ + if(p->to.type == D_OREG && p->to.reg == REGSP) + if(p->to.offset > curframe) + curframe = p->to.offset; + + switch(p->as) { + case ATEXT: + if(curtext && curtext->from.sym) { + curtext->from.sym->frame = curframe; + curtext->from.sym->become = curbecome; + if(curbecome > maxbecome) + maxbecome = curbecome; + } + curframe = 0; + curbecome = 0; + + p->mark |= LEAF; + curtext = p; + break; + + case ARETURN: + /* special form of RETURN is BECOME */ + if(p->from.type == D_CONST) + if(p->from.offset > curbecome) + curbecome = p->from.offset; + break; + + case ANOP: + q1 = p->link; + q->link = q1; /* q is non-nop */ + q1->mark |= p->mark; + continue; + + case ABL: + if(curtext != P) + curtext->mark &= ~LEAF; + + case ACBNZ: + case ACBZ: + case ACBNZW: + case ACBZW: + case ATBZ: + case ATBNZ: + + case ABCASE: + case AB: + + case ABEQ: + case ABNE: + case ABCS: + case ABHS: + case ABCC: + case ABLO: + case ABMI: + case ABPL: + case ABVS: + case ABVC: + case ABHI: + case ABLS: + case ABGE: + case ABLT: + case ABGT: + case ABLE: + + case AADR: /* strange */ + case AADRP: + + q1 = p->cond; + if(q1 != P) { + while(q1->as == ANOP) { + q1 = q1->link; + p->cond = q1; + } + } + break; + } + q = p; + } + + if(curtext && curtext->from.sym) { + curtext->from.sym->frame = curframe; + curtext->from.sym->become = curbecome; + if(curbecome > maxbecome) + maxbecome = curbecome; + } + + if(debug['b']) + print("max become = %d\n", maxbecome); + xdefine("ALEFbecome", STEXT, maxbecome); + + curtext = 0; + for(p = firstp; p != P; p = p->link) { + switch(p->as) { + case ATEXT: + curtext = p; + break; + case ABL: + if(curtext != P && curtext->from.sym != S && curtext->to.offset >= 0) { + o = maxbecome - curtext->from.sym->frame; + if(o <= 0) + break; + /* calling a become or calling a variable */ + if(p->to.sym == S || p->to.sym->become) { + curtext->to.offset += o; + if(debug['b']) { + curp = p; + print("%D calling %D increase %d\n", + &curtext->from, &p->to, o); + } + } + } + break; + } + } + + for(p = firstp; p != P; p = p->link) { + o = p->as; + switch(o) { + case ATEXT: + curtext = p; + if(p->to.offset < 0) + autosize = 0; + else + autosize = p->to.offset + PCSZ; + if((curtext->mark & LEAF) && autosize <= PCSZ) + autosize = 0; + else if(autosize & (STACKALIGN-1)) + autosize += STACKALIGN - (autosize&(STACKALIGN-1)); + p->to.offset = autosize - PCSZ; + + if(autosize == 0 && !(curtext->mark & LEAF)) { + if(debug['v']) + Bprint(&bso, "save suppressed in: %s\n", + curtext->from.sym->name); + Bflush(&bso); + curtext->mark |= LEAF; + } + + aoffset = autosize; + if(aoffset > 0xF0) + aoffset = 0xF0; + + if(curtext->mark & LEAF) { + if(curtext->from.sym) + curtext->from.sym->type = SLEAF; + if(autosize == 0) + break; + aoffset = 0; + } + + q = p; + if(autosize > aoffset){ + q = prg(); + q->as = ASUB; + q->line = p->line; + q->from.type = D_CONST; + q->from.offset = autosize - aoffset; + q->to.type = D_REG; + q->to.reg = REGSP; + q->link = p->link; + p->link = q; + + if(curtext->mark & LEAF) + break; + } + + q1 = prg(); + q1->as = AMOV; + q1->line = p->line; + q1->from.type = D_REG; + q1->from.reg = REGLINK; + q1->to.type = D_XPRE; + q1->to.offset = -aoffset; + q1->to.reg = REGSP; + + q1->link = q->link; + q->link = q1; + break; + + case ARETURN: + nocache(p); + if(p->from.type == D_CONST) + goto become; + if(curtext->mark & LEAF) { + if(autosize != 0){ + p->as = AADD; + p->from.type = D_CONST; + p->from.offset = autosize; + p->to.type = D_REG; + p->to.reg = REGSP; + } + }else{ + /* want write-back pre-indexed SP+autosize -> SP, loading REGLINK*/ + aoffset = autosize; + if(aoffset > 0xF0) + aoffset = 0xF0; + + p->as = AMOV; + p->from.type = D_XPOST; + p->from.offset = aoffset; + p->from.reg = REGSP; + p->to.type = D_REG; + p->to.reg = REGLINK; + + if(autosize > aoffset) { + q = prg(); + q->as = AADD; + q->from.type = D_CONST; + q->from.offset = autosize - aoffset; + q->to.type = D_REG; + q->to.reg = REGSP; + + q->link = p->link; + p->link = q; + p = q; + } + } + + if(p->as != ARETURN) { + q = prg(); + q->line = p->line; + q->link = p->link; + p->link = q; + p = q; + } + + p->as = ARET; + p->line = p->line; + p->to.type = D_OREG; + p->to.offset = 0; + p->to.reg = REGLINK; + + break; + + become: + if(curtext->mark & LEAF) { + + if(!autosize) { + p->as = AB; + p->from = zprg.from; + break; + } + +#ifdef optimise_time + q = prg(); + q->line = p->line; + q->as = AB; + q->from = zprg.from; + q->to = p->to; + q->cond = p->cond; + q->link = p->link; + p->link = q; + + p->as = AADD; + p->from = zprg.from; + p->from.type = D_CONST; + p->from.offset = autosize; + p->to = zprg.to; + p->to.type = D_REG; + p->to.reg = REGSP; + + break; +#endif + } + q = prg(); + q->line = p->line; + q->as = AB; + q->from = zprg.from; + q->to = p->to; + q->cond = p->cond; + q->link = p->link; + p->link = q; + + p->as = AMOV; + p->from = zprg.from; + p->from.type = D_XPRE; + p->from.offset = -autosize; + p->from.reg = REGSP; + p->to = zprg.to; + p->to.type = D_REG; + p->to.reg = REGLINK; + + break; + + } + } +} + +void +nocache(Prog *p) +{ + p->optab = 0; + p->from.class = 0; + p->to.class = 0; +} diff --git a/sys/src/cmd/7l/obj.c b/sys/src/cmd/7l/obj.c new file mode 100644 index 000000000..4d2fffb6a --- /dev/null +++ b/sys/src/cmd/7l/obj.c @@ -0,0 +1,1502 @@ +#define EXTERN +#include "l.h" +#include <ar.h> + +#ifndef DEFAULT +#define DEFAULT '9' +#endif + +char *noname = "<none>"; +char symname[] = SYMDEF; +char thechar = '7'; +char *thestring = "arm64"; + +static int +isobjfile(char *f) +{ + int n, v; + Biobuf *b; + char buf1[5], buf2[SARMAG]; + + b = Bopen(f, OREAD); + if(b == nil) + return 0; + n = Bread(b, buf1, 5); + if(n == 5 && (buf1[2] == 1 && buf1[3] == '<' || buf1[3] == 1 && buf1[4] == '<')) + v = 1; /* good enough for our purposes */ + else{ + Bseek(b, 0, 0); + n = Bread(b, buf2, SARMAG); + v = n == SARMAG && strncmp(buf2, ARMAG, SARMAG) == 0; + } + Bterm(b); + return v; +} + +/* + * -H0 no header + * -H2 -T0x100028 -R0x100000 is plan9 format + * -H6 -R4096 no header with segments padded to pages + * -H7 is elf + */ + +void +usage(void) +{ + diag("usage: %s [-options] objects", argv0); + errorexit(); +} + +void +main(int argc, char *argv[]) +{ + int c; + char *a; + + Binit(&bso, 1, OWRITE); + cout = -1; + listinit(); + outfile = 0; + nerrors = 0; + curtext = P; + HEADTYPE = -1; + INITTEXT = -1; + INITTEXTP = -1; + INITDAT = -1; + INITRND = -1; + INITENTRY = 0; + + ARGBEGIN { + default: + c = ARGC(); + if(c >= 0 && c < sizeof(debug)) + debug[c]++; + break; + case 'o': + outfile = ARGF(); + break; + case 'E': + a = ARGF(); + if(a) + INITENTRY = a; + break; +// case 'L': +// addlibpath(EARGF(usage())); +// break; + case 'T': + a = ARGF(); + if(a) + INITTEXT = atolwhex(a); + break; + case 'P': + a = ARGF(); + if(a) + INITTEXTP = atolwhex(a); + break; + case 'D': + a = ARGF(); + if(a) + INITDAT = atolwhex(a); + break; + case 'R': + a = ARGF(); + if(a) + INITRND = atolwhex(a); + break; + case 'H': + a = ARGF(); + if(a) + HEADTYPE = atolwhex(a); + break; + case 'x': /* produce export table */ + doexp = 1; + if(argv[1] != nil && argv[1][0] != '-' && !isobjfile(argv[1])) + readundefs(ARGF(), SEXPORT); + break; + case 'u': /* produce dynamically loadable module */ + dlm = 1; + if(argv[1] != nil && argv[1][0] != '-' && !isobjfile(argv[1])) + readundefs(ARGF(), SIMPORT); + break; + } ARGEND + + USED(argc); + + if(*argv == 0) + usage(); + if(!debug['9'] && !debug['U'] && !debug['B']) + debug[DEFAULT] = 1; +// addlibroot(); + if(HEADTYPE == -1) { + if(debug['U']) + HEADTYPE = 0; + if(debug['B']) + HEADTYPE = 1; + if(debug['9']) + HEADTYPE = 2; + } + switch(HEADTYPE) { + default: + diag("unknown -H option"); + errorexit(); + case 0: /* no header */ + case 6: /* no header, padded segments */ + HEADR = 0L; + if(INITTEXT == -1) + INITTEXT = 0; + if(INITDAT == -1) + INITDAT = 0; + if(INITRND == -1) + INITRND = 4; + break; + case 2: /* plan 9 */ + HEADR = 40L; + if(INITTEXT == -1) + INITTEXT = 0x10000+HEADR; + if(INITDAT == -1) + INITDAT = 0; + if(INITRND == -1) + INITRND = 0x10000; + break; + } + if (INITTEXTP == -1) + INITTEXTP = INITTEXT; + if(INITDAT != 0 && INITRND != 0) + print("warning: -D0x%lux is ignored because of -R0x%lux\n", + INITDAT, INITRND); + if(debug['v']) + Bprint(&bso, "HEADER = -H0x%d -T0x%lux -D0x%lux -R0x%lux\n", + HEADTYPE, INITTEXT, INITDAT, INITRND); + Bflush(&bso); + zprg.as = AGOK; + zprg.reg = NREG; + zprg.from.name = D_NONE; + zprg.from.type = D_NONE; + zprg.from.reg = NREG; + zprg.to = zprg.from; + zprg.from3 = zprg.from; + buildop(); + histgen = 0; + textp = P; + datap = P; + pc = 0; + dtype = 4; + if(outfile == 0) + outfile = "7.out"; + cout = create(outfile, 1, 0775); + if(cout < 0) { + diag("cannot create %s: %r", outfile); + errorexit(); + } + nuxiinit(); + + version = 0; + cbp = buf.cbuf; + cbc = sizeof(buf.cbuf); + firstp = prg(); + lastp = firstp; + + if(INITENTRY == 0) { + INITENTRY = "_main"; + if(debug['p']) + INITENTRY = "_mainp"; + if(!debug['l']) + lookup(INITENTRY, 0)->type = SXREF; + } else if(!(*INITENTRY >= '0' && *INITENTRY <= '9')) + lookup(INITENTRY, 0)->type = SXREF; + + while(*argv) + objfile(*argv++); + if(!debug['l']) + loadlib(); + firstp = firstp->link; + if(firstp == P) + goto out; + if(doexp || dlm){ + EXPTAB = "_exporttab"; + zerosig(EXPTAB); + zerosig("etext"); + zerosig("edata"); + zerosig("end"); + if(dlm){ + import(); + HEADTYPE = 2; + INITTEXT = INITDAT = 0; + INITRND = 8; + INITENTRY = EXPTAB; + } + export(); + } + patch(); + if(debug['p']) + if(debug['1']) + doprof1(); + else + doprof2(); + dodata(); + follow(); + if(firstp == P) + goto out; + noops(); + span(); + asmb(); + undef(); + +out: + if(debug['v']) { + Bprint(&bso, "%5.2f cpu time\n", cputime()); + Bprint(&bso, "%d sizeof adr\n", sizeof(Adr)); + Bprint(&bso, "%d sizeof prog\n", sizeof(Prog)); + } + Bflush(&bso); + errorexit(); +} + +void +errorexit(void) +{ + + if(nerrors) { + if(cout >= 0) + remove(outfile); + exits("error"); + } + exits(0); +} + +void +loadlib(void) +{ + int i; + long h; + Sym *s; + +loop: + xrefresolv = 0; + for(i=0; i<libraryp; i++) { + if(debug['v']) + Bprint(&bso, "%5.2f autolib: %s\n", cputime(), library[i]); + objfile(library[i]); + } + if(xrefresolv) + for(h=0; h<nelem(hash); h++) + for(s = hash[h]; s != S; s = s->link) + if(s->type == SXREF) + goto loop; +} + +void +objfile(char *file) +{ + long off, esym, cnt, l; + int f, work; + Sym *s; + char magbuf[SARMAG]; + char name[100], pname[150]; + struct ar_hdr arhdr; + char *e, *start, *stop; + + if(file[0] == '-' && file[1] == 'l') { + if(debug['9']) + snprint(name, sizeof name, "/%s/lib/lib%s.a", thestring, file+2); + else + snprint(name, sizeof name, "/usr/%clib/lib%s.a", thechar, file+2); + file = name; + } + if(debug['v']) + Bprint(&bso, "%5.2f ldobj: %s\n", cputime(), file); + Bflush(&bso); + f = open(file, 0); + if(f < 0) { + diag("cannot open file: %s", file); + errorexit(); + } + l = read(f, magbuf, SARMAG); + if(l != SARMAG || strncmp(magbuf, ARMAG, SARMAG)){ + /* load it as a regular file */ + l = seek(f, 0L, 2); + seek(f, 0L, 0); + ldobj(f, l, file); + close(f); + return; + } + + if(debug['v']) + Bprint(&bso, "%5.2f ldlib: %s\n", cputime(), file); + l = read(f, &arhdr, SAR_HDR); + if(l != SAR_HDR) { + diag("%s: short read on archive file symbol header", file); + goto out; + } + if(strncmp(arhdr.name, symname, strlen(symname))) { + diag("%s: first entry not symbol header: %s", file, arhdr.name); + goto out; + } + + esym = SARMAG + SAR_HDR + atolwhex(arhdr.size); + off = SARMAG + SAR_HDR; + + /* + * just bang the whole symbol file into memory + */ + seek(f, off, 0); + cnt = esym - off; + start = malloc(cnt + 10); + cnt = read(f, start, cnt); + if(cnt <= 0){ + close(f); + return; + } + stop = &start[cnt]; + memset(stop, 0, 10); + + work = 1; + while(work){ + if(debug['v']) + Bprint(&bso, "%5.2f library pass: %s\n", cputime(), file); + Bflush(&bso); + work = 0; + for(e = start; e < stop; e = strchr(e+5, 0) + 1) { + s = lookup(e+5, 0); + if(s->type != SXREF) + continue; + snprint(pname, sizeof pname, "%s(%s)", file, s->name); + if(debug['v']) + Bprint(&bso, "%5.2f library: %s\n", cputime(), pname); + Bflush(&bso); + l = e[1] & 0xff; + l |= (e[2] & 0xff) << 8; + l |= (e[3] & 0xff) << 16; + l |= (e[4] & 0xff) << 24; + seek(f, l, 0); + l = read(f, &arhdr, SAR_HDR); + if(l != SAR_HDR) + goto bad; + if(strncmp(arhdr.fmag, ARFMAG, sizeof(arhdr.fmag))) + goto bad; + l = atolwhex(arhdr.size); + ldobj(f, l, pname); + if(s->type == SXREF) { + diag("%s: failed to load: %s", file, s->name); + errorexit(); + } + work = 1; + xrefresolv = 1; + } + } + return; + +bad: + diag("%s: bad or out of date archive", file); +out: + close(f); +} + +int +zaddr(uchar *p, Adr *a, Sym *h[]) +{ + int i, c; + long l; + Sym *s; + Auto *u; + + c = p[2]; + if(c < 0 || c > NSYM){ + print("sym out of range: %d\n", c); + p[0] = ALAST+1; + return 0; + } + a->type = p[0]; + a->reg = p[1]; + a->sym = h[c]; + a->name = p[3]; + c = 4; + + if(a->reg < 0 || a->reg > NREG) { + print("register out of range %d\n", a->reg); + p[0] = ALAST+1; + return 0; /* force real diagnostic */ + } + + switch(a->type) { + default: + print("unknown type %d\n", a->type); + p[0] = ALAST+1; + return 0; /* force real diagnostic */ + + case D_NONE: + case D_REG: + case D_SP: + case D_FREG: + case D_VREG: + case D_COND: + break; + + case D_OREG: + case D_XPRE: + case D_XPOST: + case D_CONST: + case D_BRANCH: + case D_SHIFT: + case D_EXTREG: + case D_ROFF: + case D_SPR: + l = p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24); + a->offset = l; + c += 4; + if(a->type == D_CONST && l == 0) + a->reg = REGZERO; + break; + + case D_DCONST: + l = p[4] | (p[5]<<8) | (p[6]<<16) | (p[7]<<24); + a->offset = (uvlong)l & 0xFFFFFFFFUL; + l = p[8] | (p[9]<<8) | (p[10]<<16) | (p[11]<<24); + a->offset |= (vlong)l << 32; + c += 8; + a->type = D_CONST; + if(a->offset == 0) + a->reg = REGZERO; + break; + + case D_SCONST: + a->sval = halloc(NSNAME); + memmove(a->sval, p+4, NSNAME); + c += NSNAME; + break; + + case D_FCONST: + a->ieee = halloc(sizeof(Ieee)); + a->ieee->l = p[4] | (p[5]<<8) | + (p[6]<<16) | (p[7]<<24); + a->ieee->h = p[8] | (p[9]<<8) | + (p[10]<<16) | (p[11]<<24); + c += 8; + break; + } + s = a->sym; + if(s == S) + return c; + i = a->name; + if(i != D_AUTO && i != D_PARAM) + return c; + + l = a->offset; + for(u=curauto; u; u=u->link) + if(u->asym == s) + if(u->type == i) { + if(u->aoffset > l) + u->aoffset = l; + return c; + } + + u = halloc(sizeof(Auto)); + u->link = curauto; + curauto = u; + u->asym = s; + u->aoffset = l; + u->type = i; + return c; +} + +void +histtoauto(void) +{ + Auto *l; + + while(l = curhist) { + curhist = l->link; + l->link = curauto; + curauto = l; + } +} + +static void +collapsefrog(Sym *s) +{ + int i; + + /* + * bad encoding of path components only allows + * MAXHIST components. if there is an overflow, + * first try to collapse xxx/.. + */ + for(i=1; i<histfrogp; i++) + if(strcmp(histfrog[i]->name+1, "..") == 0) { + memmove(histfrog+i-1, histfrog+i+1, + (histfrogp-i-1)*sizeof(histfrog[0])); + histfrogp--; + goto out; + } + + /* + * next try to collapse . + */ + for(i=0; i<histfrogp; i++) + if(strcmp(histfrog[i]->name+1, ".") == 0) { + memmove(histfrog+i, histfrog+i+1, + (histfrogp-i-1)*sizeof(histfrog[0])); + goto out; + } + + /* + * last chance, just truncate from front + */ + memmove(histfrog+0, histfrog+1, + (histfrogp-1)*sizeof(histfrog[0])); + +out: + histfrog[histfrogp-1] = s; +} + +void +nopout(Prog *p) +{ + p->as = ANOP; + p->from.type = D_NONE; + p->to.type = D_NONE; +} + +static int +isnegoff(Prog *p) +{ + if(p->from.type == D_CONST && + p->from.name == D_NONE && + p->from.offset < 0) + return 1; + return 0; +} + +static uchar* +readsome(int f, uchar *buf, uchar *good, uchar *stop, int max) +{ + int n; + + n = stop - good; + memmove(buf, good, stop - good); + stop = buf + n; + n = MAXIO - n; + if(n > max) + n = max; + n = read(f, stop, n); + if(n <= 0) + return 0; + return stop + n; +} + +void +addlib(char *obj) +{ + char name[1024], comp[256], *p; + int i; + + if(histfrogp <= 0) + return; + + if(histfrog[0]->name[1] == '/') { + name[0] = 0; + i = 1; + } else + if(histfrog[0]->name[1] == '.') { + snprint(name, sizeof name, "."); + i = 0; + } else { + if(debug['9']) + snprint(name, sizeof name, "/%s/lib", thestring); + else + snprint(name, sizeof name, "/usr/%clib", thechar); + i = 0; + } + + for(; i<histfrogp; i++) { + snprint(comp, sizeof comp, histfrog[i]->name+1); + for(;;) { + p = strstr(comp, "$O"); + if(p == 0) + break; + memmove(p+1, p+2, strlen(p+2)+1); + p[0] = thechar; + } + for(;;) { + p = strstr(comp, "$M"); + if(p == 0) + break; + if(strlen(comp)+strlen(thestring)-2+1 >= sizeof comp) { + diag("library component too long"); + return; + } + memmove(p+strlen(thestring), p+2, strlen(p+2)+1); + memmove(p, thestring, strlen(thestring)); + } + if(strlen(name) + strlen(comp) + 3 >= sizeof(name)) { + diag("library component too long"); + return; + } + strcat(name, "/"); + strcat(name, comp); + } + for(i=0; i<libraryp; i++) + if(strcmp(name, library[i]) == 0) + return; + if(libraryp == nelem(library)){ + diag("too many autolibs; skipping %s", name); + return; + } + + p = malloc(strlen(name) + 1); + strcpy(p, name); + library[libraryp] = p; + p = malloc(strlen(obj) + 1); + strcpy(p, obj); + libraryobj[libraryp] = p; + libraryp++; +} + +void +addhist(long line, int type) +{ + Auto *u; + Sym *s; + int i, j, k; + + u = malloc(sizeof(Auto)); + s = malloc(sizeof(Sym)); + s->name = malloc(2*(histfrogp+1) + 1); + + u->asym = s; + u->type = type; + u->aoffset = line; + u->link = curhist; + curhist = u; + + j = 1; + for(i=0; i<histfrogp; i++) { + k = histfrog[i]->value; + s->name[j+0] = k>>8; + s->name[j+1] = k; + j += 2; + } +} + +void +ldobj(int f, long c, char *pn) +{ + vlong ipc; + Prog *p, *t; + uchar *bloc, *bsize, *stop; + Sym *h[NSYM], *s, *di; + int v, o, r, skip; + ulong sig; + static int files; + static char **filen; + char **nfilen; + + if((files&15) == 0){ + nfilen = malloc((files+16)*sizeof(char*)); + memmove(nfilen, filen, files*sizeof(char*)); + free(filen); + filen = nfilen; + } + filen[files++] = strdup(pn); + + bsize = buf.xbuf; + bloc = buf.xbuf; + di = S; + +newloop: + memset(h, 0, sizeof(h)); + version++; + histfrogp = 0; + ipc = pc; + skip = 0; + +loop: + if(c <= 0) + goto eof; + r = bsize - bloc; + if(r < 100 && r < c) { /* enough for largest prog */ + bsize = readsome(f, buf.xbuf, bloc, bsize, c); + if(bsize == 0) + goto eof; + bloc = buf.xbuf; + goto loop; + } + o = bloc[0] | (bloc[1] << 8); /* as */ + if(o <= AXXX || o >= ALAST) { + diag("%s: line %lld: opcode out of range %d", pn, pc-ipc, o); + print(" probably not a .7 file\n"); + errorexit(); + } + if(o == ANAME || o == ASIGNAME) { + sig = 0; + if(o == ASIGNAME){ + sig = bloc[2] | (bloc[3]<<8) | (bloc[4]<<16) | (bloc[5]<<24); + bloc += 4; + c -= 4; + } + stop = memchr(&bloc[4], 0, bsize-&bloc[4]); + if(stop == 0){ + bsize = readsome(f, buf.xbuf, bloc, bsize, c); + if(bsize == 0) + goto eof; + bloc = buf.xbuf; + stop = memchr(&bloc[4], 0, bsize-&bloc[4]); + if(stop == 0){ + fprint(2, "%s: name too long\n", pn); + errorexit(); + } + } + v = bloc[2]; /* type */ + o = bloc[3]; /* sym */ + bloc += 4; + c -= 4; + + r = 0; + if(v == D_STATIC) + r = version; + s = lookup((char*)bloc, r); + c -= &stop[1] - bloc; + bloc = stop + 1; + + if(sig != 0){ + if(s->sig != 0 && s->sig != sig) + diag("incompatible type signatures %lux(%s) and %lux(%s) for %s", s->sig, filen[s->file], sig, pn, s->name); + s->sig = sig; + s->file = files-1; + } + + if(debug['W']) + print(" ANAME %s\n", s->name); + h[o] = s; + if((v == D_EXTERN || v == D_STATIC) && s->type == 0) + s->type = SXREF; + if(v == D_FILE) { + if(s->type != SFILE) { + histgen++; + s->type = SFILE; + s->value = histgen; + } + if(histfrogp < MAXHIST) { + histfrog[histfrogp] = s; + histfrogp++; + } else + collapsefrog(s); + } + goto loop; + } + + p = halloc(sizeof(Prog)); + p->as = o; + p->reg = bloc[2] & 0x3F; + if(bloc[2] & 0x80) + p->mark = NOSCHED; + p->line = bloc[3] | (bloc[4]<<8) | (bloc[5]<<16) | (bloc[6]<<24); + + r = zaddr(bloc+7, &p->from, h) + 7; + if(bloc[2] & 0x40) + r += zaddr(bloc+r, &p->from3, h); + else + p->from3 = zprg.from3; + r += zaddr(bloc+r, &p->to, h); + bloc += r; + c -= r; + + if(p->reg > NREG) + diag("register out of range %d", p->reg); + + p->link = P; + p->cond = P; + + if(debug['W']) + print("%P\n", p); + + switch(o) { + case AHISTORY: + if(p->to.offset == -1) { + addlib(pn); + histfrogp = 0; + goto loop; + } + addhist(p->line, D_FILE); /* 'z' */ + if(p->to.offset) + addhist(p->to.offset, D_FILE1); /* 'Z' */ + histfrogp = 0; + goto loop; + + case AEND: + histtoauto(); + if(curtext != P) + curtext->to.autom = curauto; + curauto = 0; + curtext = P; + if(c) + goto newloop; + return; + + case AGLOBL: + s = p->from.sym; + if(s == S) { + diag("GLOBL must have a name\n%P", p); + errorexit(); + } + if(s->type == 0 || s->type == SXREF) { + s->type = SBSS; + s->value = 0; + } + if(s->type != SBSS) { + diag("redefinition: %s\n%P", s->name, p); + s->type = SBSS; + s->value = 0; + } + if(p->to.offset > s->value) + s->value = p->to.offset; + break; + + case ADYNT: + if(p->to.sym == S) { + diag("DYNT without a sym\n%P", p); + break; + } + di = p->to.sym; + p->reg = 4; + if(di->type == SXREF) { + if(debug['z']) + Bprint(&bso, "%P set to %d\n", p, dtype); + di->type = SCONST; + di->value = dtype; + dtype += 4; + } + if(p->from.sym == S) + break; + + p->from.offset = di->value; + p->from.sym->type = SDATA; + if(curtext == P) { + diag("DYNT not in text: %P", p); + break; + } + p->to.sym = curtext->from.sym; + p->to.type = D_CONST; + p->link = datap; + datap = p; + break; + + case AINIT: + if(p->from.sym == S) { + diag("INIT without a sym\n%P", p); + break; + } + if(di == S) { + diag("INIT without previous DYNT\n%P", p); + break; + } + p->from.offset = di->value; + p->from.sym->type = SDATA; + p->link = datap; + datap = p; + break; + + case ADATA: + if(p->from.sym == S) { + diag("DATA without a sym\n%P", p); + break; + } + p->link = datap; + datap = p; + break; + + case AGOK: + diag("unknown opcode\n%P", p); + p->pc = pc; + pc++; + break; + + case ATEXT: + if(curtext != P) { + histtoauto(); + curtext->to.autom = curauto; + curauto = 0; + } + skip = 0; + curtext = p; + if(p->to.offset > 0){ + autosize = (p->to.offset+7L) & ~7L; + p->to.offset = autosize; + autosize += PCSZ; + }else + autosize = 0; + s = p->from.sym; + if(s == S) { + diag("TEXT must have a name\n%P", p); + errorexit(); + } + if(s->type != 0 && s->type != SXREF) { + if(p->reg & DUPOK) { + skip = 1; + goto casedef; + } + diag("redefinition: %s\n%P", s->name, p); + } + s->type = STEXT; + s->value = pc; + lastp->link = p; + lastp = p; + p->pc = pc; + pc++; + if(textp == P) { + textp = p; + etextp = p; + goto loop; + } + etextp->cond = p; + etextp = p; + break; + + case ASUB: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = AADD; + } + goto casedef; + + case ASUBW: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = AADDW; + } + goto casedef; + + case ASUBS: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = AADDS; + } + goto casedef; + + case ASUBSW: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = AADDSW; + } + goto casedef; + + case AADD: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = ASUB; + } + goto casedef; + + case AADDW: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = ASUBW; + } + goto casedef; + + case AADDS: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = ASUBS; + } + goto casedef; + + case AADDSW: + if(isnegoff(p)){ + p->from.offset = -p->from.offset; + p->as = ASUBSW; + } + goto casedef; + + case AFCVTDS: + if(p->from.type != D_FCONST) + goto casedef; + p->as = AFMOVS; + /* fall through */ + case AFMOVS: + if(skip) + goto casedef; + + if(p->from.type == D_FCONST && chipfloat(p->from.ieee) < 0) { + /* size sb 9 max */ + sprint(literal, "$%lux", ieeedtof(p->from.ieee)); + s = lookup(literal, 0); + if(s->type == 0) { + s->type = SBSS; + s->value = 4; + t = prg(); + t->as = ADATA; + t->line = p->line; + t->from.type = D_OREG; + t->from.sym = s; + t->from.name = D_EXTERN; + t->reg = 4; + t->to = p->from; + t->link = datap; + datap = t; + } + p->from.type = D_OREG; + p->from.sym = s; + p->from.name = D_EXTERN; + p->from.offset = 0; + } + goto casedef; + + case AFMOVD: + if(skip) + goto casedef; + + if(p->from.type == D_FCONST && chipfloat(p->from.ieee) < 0) { + /* size sb 18 max */ + sprint(literal, "$%lux.%lux", + p->from.ieee->l, p->from.ieee->h); + s = lookup(literal, 0); + if(s->type == 0) { + s->type = SBSS; + s->value = 8; + t = prg(); + t->as = ADATA; + t->line = p->line; + t->from.type = D_OREG; + t->from.sym = s; + t->from.name = D_EXTERN; + t->reg = 8; + t->to = p->from; + t->link = datap; + datap = t; + } + p->from.type = D_OREG; + p->from.sym = s; + p->from.name = D_EXTERN; + p->from.offset = 0; + } + goto casedef; + + default: + casedef: + if(skip) + nopout(p); + + if(p->to.type == D_BRANCH) + p->to.offset += ipc; + if(p->from.type == D_BRANCH) + p->from.offset += ipc; + lastp->link = p; + lastp = p; + p->pc = pc; + pc++; + break; + } + goto loop; + +eof: + diag("truncated object file: %s", pn); +} + +Sym* +lookup(char *symb, int v) +{ + Sym *s; + char *p; + long h; + int c, l; + + h = v; + for(p=symb; c = *p; p++) + h = h+h+h + c; + l = (p - symb) + 1; + if(h < 0) + h = ~h; + h %= NHASH; + for(s = hash[h]; s != S; s = s->link) + if(s->version == v) + if(memcmp(s->name, symb, l) == 0) + return s; + + while(nhunk < sizeof(Sym)) + gethunk(); + s = (Sym*)hunk; + nhunk -= sizeof(Sym); + hunk += sizeof(Sym); + + s->name = malloc(l); + memmove(s->name, symb, l); + + s->link = hash[h]; + s->type = 0; + s->version = v; + s->value = 0; + s->sig = 0; +// s->dupok = 0; + hash[h] = s; + return s; +} + +Prog* +prg(void) +{ + Prog *p; + + while(nhunk < sizeof(Prog)) + gethunk(); + p = (Prog*)hunk; + nhunk -= sizeof(Prog); + hunk += sizeof(Prog); + + *p = zprg; + return p; +} + +void* +halloc(usize n) +{ + void *p; + + n = (n+7)&~7; + while(nhunk < n) + gethunk(); + p = hunk; + nhunk -= n; + hunk += n; + return p; +} + +void +gethunk(void) +{ + char *h; + long nh; + + nh = NHUNK; + if(thunk >= 5L*NHUNK) { + nh = 5L*NHUNK; + if(thunk >= 25L*NHUNK) + nh = 25L*NHUNK; + } + h = mysbrk(nh); + if(h == (char*)-1) { + diag("out of memory"); + errorexit(); + } + hunk = h; + nhunk = nh; + thunk += nh; +} + +void +doprof1(void) +{ + Sym *s; + long n; + Prog *p, *q; + + if(debug['v']) + Bprint(&bso, "%5.2f profile 1\n", cputime()); + Bflush(&bso); + s = lookup("__mcount", 0); + n = 1; + for(p = firstp->link; p != P; p = p->link) { + if(p->as == ATEXT) { + q = prg(); + q->line = p->line; + q->link = datap; + datap = q; + q->as = ADATA; + q->from.type = D_OREG; + q->from.name = D_EXTERN; + q->from.offset = n*4; + q->from.sym = s; + q->reg = 4; + q->to = p->from; + q->to.type = D_CONST; + + q = prg(); + q->line = p->line; + q->pc = p->pc; + q->link = p->link; + p->link = q; + p = q; + p->as = AMOVW; + p->from.type = D_OREG; + p->from.name = D_EXTERN; + p->from.sym = s; + p->from.offset = n*PCSZ + PCSZ; + p->to.type = D_REG; + p->to.reg = REGTMP; + + q = prg(); + q->line = p->line; + q->pc = p->pc; + q->link = p->link; + p->link = q; + p = q; + p->as = AADD; + p->from.type = D_CONST; + p->from.offset = 1; + p->to.type = D_REG; + p->to.reg = REGTMP; + + q = prg(); + q->line = p->line; + q->pc = p->pc; + q->link = p->link; + p->link = q; + p = q; + p->as = AMOVW; + p->from.type = D_REG; + p->from.reg = REGTMP; + p->to.type = D_OREG; + p->to.name = D_EXTERN; + p->to.sym = s; + p->to.offset = n*PCSZ + PCSZ; + + n += 2; + continue; + } + } + q = prg(); + q->line = 0; + q->link = datap; + datap = q; + + q->as = ADATA; + q->from.type = D_OREG; + q->from.name = D_EXTERN; + q->from.sym = s; + q->reg = 4; + q->to.type = D_CONST; + q->to.offset = n; + + s->type = SBSS; + s->value = n*4; +} + +void +doprof2(void) +{ + Sym *s2, *s4; + Prog *p, *q, *q2, *ps2, *ps4; + + if(debug['v']) + Bprint(&bso, "%5.2f profile 2\n", cputime()); + Bflush(&bso); + + if(debug['e']){ + s2 = lookup("_tracein", 0); + s4 = lookup("_traceout", 0); + }else{ + s2 = lookup("_profin", 0); + s4 = lookup("_profout", 0); + } + if(s2->type != STEXT || s4->type != STEXT) { + if(debug['e']) + diag("_tracein/_traceout not defined %d %d", s2->type, s4->type); + else + diag("_profin/_profout not defined"); + return; + } + + ps2 = P; + ps4 = P; + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) { + if(p->from.sym == s2) { + ps2 = p; + p->reg = 1; + } + if(p->from.sym == s4) { + ps4 = p; + p->reg = 1; + } + } + } + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) { + if(p->reg & NOPROF) { + for(;;) { + q = p->link; + if(q == P) + break; + if(q->as == ATEXT) + break; + p = q; + } + continue; + } + + /* + * BL profin + */ + q = prg(); + q->line = p->line; + q->pc = p->pc; + q->link = p->link; + if(debug['e']){ /* embedded tracing */ + q2 = prg(); + p->link = q2; + q2->link = q; + + q2->line = p->line; + q2->pc = p->pc; + + q2->as = AB; + q2->to.type = D_BRANCH; + q2->to.sym = p->to.sym; + q2->cond = q->link; + }else + p->link = q; + p = q; + p->as = ABL; + p->to.type = D_BRANCH; + p->cond = ps2; + p->to.sym = s2; + + continue; + } + if(p->as == ARETURN) { + /* + * RET (default) + */ + if(debug['e']){ /* embedded tracing */ + q = prg(); + q->line = p->line; + q->pc = p->pc; + q->link = p->link; + p->link = q; + p = q; + } + + /* + * RETURN + */ + q = prg(); + q->as = p->as; + q->from = p->from; + q->to = p->to; + q->cond = p->cond; + q->link = p->link; + q->reg = p->reg; + p->link = q; + + /* + * BL profout + */ + p->as = ABL; + p->from = zprg.from; + p->to = zprg.to; + p->to.type = D_BRANCH; + p->cond = ps4; + p->to.sym = s4; + + p = q; + continue; + } + } +} + +void +nuxiinit(void) +{ + + int i, c; + + for(i=0; i<4; i++) { + c = find1(0x04030201L, i+1); + if(i < 2) + inuxi2[i] = c; + if(i < 1) + inuxi1[i] = c; + inuxi4[i] = c; + fnuxi4[i] = c; + inuxi8[i] = c; + inuxi8[i+4] = c+4; + fnuxi8[i] = c; + fnuxi8[i+4] = c+4; + } + if(debug['v']) { + Bprint(&bso, "inuxi = "); + for(i=0; i<1; i++) + Bprint(&bso, "%d", inuxi1[i]); + Bprint(&bso, " "); + for(i=0; i<2; i++) + Bprint(&bso, "%d", inuxi2[i]); + Bprint(&bso, " "); + for(i=0; i<4; i++) + Bprint(&bso, "%d", inuxi4[i]); + Bprint(&bso, " "); + for(i=0; i<8; i++) + Bprint(&bso, "%d", inuxi8[i]); + Bprint(&bso, "\nfnuxi = "); + for(i=0; i<4; i++) + Bprint(&bso, "%d", fnuxi4[i]); + Bprint(&bso, " "); + for(i=0; i<8; i++) + Bprint(&bso, "%d", fnuxi8[i]); + Bprint(&bso, "\n"); + } + Bflush(&bso); +} + +int +find1(long l, int c) +{ + char *p; + int i; + + p = (char*)&l; + for(i=0; i<4; i++) + if(*p++ == c) + return i; + return 0; +} + +long +ieeedtof(Ieee *ieeep) +{ + int exp; + long v; + + if(ieeep->h == 0) + return 0; + exp = (ieeep->h>>20) & ((1L<<11)-1L); + exp -= (1L<<10) - 2L; + v = (ieeep->h & 0xfffffL) << 3; + v |= (ieeep->l >> 29) & 0x7L; + if((ieeep->l >> 28) & 1) { + v++; + if(v & 0x800000L) { + v = (v & 0x7fffffL) >> 1; + exp++; + } + } + if(exp <= -126 || exp >= 130) + diag("double fp to single fp overflow"); + v |= ((exp + 126) & 0xffL) << 23; + v |= ieeep->h & 0x80000000L; + return v; +} + +double +ieeedtod(Ieee *ieeep) +{ + Ieee e; + double fr; + int exp; + + if(ieeep->h & (1L<<31)) { + e.h = ieeep->h & ~(1L<<31); + e.l = ieeep->l; + return -ieeedtod(&e); + } + if(ieeep->l == 0 && ieeep->h == 0) + return 0; + fr = ieeep->l & ((1L<<16)-1L); + fr /= 1L<<16; + fr += (ieeep->l>>16) & ((1L<<16)-1L); + fr /= 1L<<16; + fr += (ieeep->h & (1L<<20)-1L) | (1L<<20); + fr /= 1L<<21; + exp = (ieeep->h>>20) & ((1L<<11)-1L); + exp -= (1L<<10) - 2L; + return ldexp(fr, exp); +} diff --git a/sys/src/cmd/7l/optab.c b/sys/src/cmd/7l/optab.c new file mode 100644 index 000000000..c462857ed --- /dev/null +++ b/sys/src/cmd/7l/optab.c @@ -0,0 +1,388 @@ +#include "l.h" + +Optab optab[] = +{ + { ATEXT, C_LEXT, C_NONE, C_LCON, 0, 0, 0 }, + { ATEXT, C_LEXT, C_REG, C_LCON, 0, 0, 0 }, + { ATEXT, C_ADDR, C_NONE, C_LCON, 0, 0, 0 }, + { ATEXT, C_ADDR, C_REG, C_LCON, 0, 0, 0 }, + + /* arithmetic operations */ + { AADD, C_REG, C_REG, C_REG, 1, 4, 0 }, + { AADD, C_REG, C_NONE, C_REG, 1, 4, 0 }, + { AADC, C_REG, C_REG, C_REG, 1, 4, 0 }, + { AADC, C_REG, C_NONE, C_REG, 1, 4, 0 }, + { ANEG, C_REG, C_NONE, C_REG, 25, 4, 0 }, + { ANGC, C_REG, C_NONE, C_REG, 17, 4, 0 }, + { ACMP, C_REG, C_RSP, C_NONE, 1, 4, 0 }, + + { AADD, C_ADDCON, C_RSP, C_RSP, 2, 4, 0 }, + { AADD, C_ADDCON, C_NONE, C_RSP, 2, 4, 0 }, + { ACMP, C_ADDCON, C_RSP, C_NONE, 2, 4, 0 }, + + { AADD, C_LCON, C_REG, C_REG, 13, 8, 0, LFROM }, + { AADD, C_LCON, C_NONE, C_REG, 13, 8, 0, LFROM }, + { ACMP, C_LCON, C_REG, C_NONE, 13, 8, 0, LFROM }, + + { AADD, C_SHIFT,C_REG, C_REG, 3, 4, 0 }, + { AADD, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, + { AMVN, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, + { ACMP, C_SHIFT,C_REG, C_NONE, 3, 4, 0 }, + { ANEG, C_SHIFT,C_NONE, C_REG, 26, 4, 0 }, + + { AADD, C_REG, C_RSP, C_RSP, 27, 4, 0 }, + { AADD, C_REG, C_NONE, C_RSP, 27, 4, 0 }, + { AADD, C_EXTREG,C_RSP, C_RSP, 27, 4, 0 }, + { AADD, C_EXTREG,C_NONE, C_RSP, 27, 4, 0 }, + { AMVN, C_EXTREG,C_NONE, C_RSP, 27, 4, 0 }, + { ACMP, C_EXTREG,C_RSP, C_NONE, 27, 4, 0 }, + + { AADD, C_REG, C_REG, C_REG, 1, 4, 0 }, + { AADD, C_REG, C_NONE, C_REG, 1, 4, 0 }, + + /* logical operations */ + { AAND, C_REG, C_REG, C_REG, 1, 4, 0 }, + { AAND, C_REG, C_NONE, C_REG, 1, 4, 0 }, + { ABIC, C_REG, C_REG, C_REG, 1, 4, 0 }, + { ABIC, C_REG, C_NONE, C_REG, 1, 4, 0 }, + + { AAND, C_BITCON, C_REG, C_REG, 53, 4, 0 }, + { AAND, C_BITCON, C_NONE, C_REG, 53, 4, 0 }, + { ABIC, C_BITCON, C_REG, C_REG, 53, 4, 0 }, + { ABIC, C_BITCON, C_NONE, C_REG, 53, 4, 0 }, + + { AAND, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM }, + { AAND, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM }, + { ABIC, C_LCON, C_REG, C_REG, 28, 8, 0, LFROM }, + { ABIC, C_LCON, C_NONE, C_REG, 28, 8, 0, LFROM }, + + { AAND, C_SHIFT,C_REG, C_REG, 3, 4, 0 }, + { AAND, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, + { ABIC, C_SHIFT,C_REG, C_REG, 3, 4, 0 }, + { ABIC, C_SHIFT,C_NONE, C_REG, 3, 4, 0 }, + + { AMOV, C_RSP, C_NONE, C_RSP, 24, 4, 0 }, + { AMVN, C_REG, C_NONE, C_REG, 24, 4, 0 }, + { AMOVB, C_REG, C_NONE, C_REG, 45, 4, 0 }, + { AMOVBU, C_REG, C_NONE, C_REG, 45, 4, 0 }, + { AMOVH, C_REG, C_NONE, C_REG, 45, 4, 0 }, /* also MOVHU */ + { AMOVW, C_REG, C_NONE, C_REG, 45, 4, 0 }, /* also MOVWU */ + /* TO DO: MVN C_SHIFT */ + + /* MOVs that become MOVK/MOVN/MOVZ/ADD/SUB/OR */ + { AMOVW, C_MOVCON, C_NONE, C_REG, 32, 4, 0 }, + { AMOV, C_MOVCON, C_NONE, C_REG, 32, 4, 0 }, +// { AMOVW, C_ADDCON, C_NONE, C_REG, 2, 4, 0 }, +// { AMOV, C_ADDCON, C_NONE, C_REG, 2, 4, 0 }, +// { AMOVW, C_BITCON, C_NONE, C_REG, 53, 4, 0 }, +// { AMOV, C_BITCON, C_NONE, C_REG, 53, 4, 0 }, + + { AMOVK, C_LCON, C_NONE, C_REG, 33, 4, 0 }, + + { AMOV, C_AECON,C_NONE, C_REG, 4, 4, REGSB }, + { AMOV, C_AACON,C_NONE, C_REG, 4, 4, REGSP }, + + { ASDIV, C_REG, C_NONE, C_REG, 1, 4, 0 }, + { ASDIV, C_REG, C_REG, C_REG, 1, 4, 0 }, + + { AB, C_NONE, C_NONE, C_SBRA, 5, 4, 0 }, + { ABL, C_NONE, C_NONE, C_SBRA, 5, 4, 0 }, + + { AB, C_NONE, C_NONE, C_ZOREG, 6, 4, 0 }, + { ABL, C_NONE, C_NONE, C_ZOREG, 6, 4, 0 }, + { ARET, C_NONE, C_NONE, C_REG, 6, 4, 0 }, + { ARET, C_NONE, C_NONE, C_ZOREG, 6, 4, 0 }, + + { AADRP, C_SBRA, C_NONE, C_REG, 60, 4, 0 }, + { AADR, C_SBRA, C_NONE, C_REG, 61, 4, 0 }, + + { ABFM, C_LCON, C_REG, C_REG, 42, 4, 0 }, + { ABFI, C_LCON, C_REG, C_REG, 43, 4, 0 }, + + { AEXTR, C_LCON, C_REG, C_REG, 44, 4, 0 }, + { ASXTB, C_REG, C_NONE, C_REG, 45, 4, 0 }, + { ACLS, C_REG, C_NONE, C_REG, 46, 4, 0 }, + + { ABEQ, C_NONE, C_NONE, C_SBRA, 7, 4, 0 }, + + { ALSL, C_LCON, C_REG, C_REG, 8, 4, 0 }, + { ALSL, C_LCON, C_NONE, C_REG, 8, 4, 0 }, + + { ALSL, C_REG, C_NONE, C_REG, 9, 4, 0 }, + { ALSL, C_REG, C_REG, C_REG, 9, 4, 0 }, + + { ASVC, C_NONE, C_NONE, C_LCON, 10, 4, 0 }, + { ASVC, C_NONE, C_NONE, C_NONE, 10, 4, 0 }, + + { ADWORD, C_NONE, C_NONE, C_VCON, 11, 8, 0 }, + { ADWORD, C_NONE, C_NONE, C_LEXT, 11, 8, 0 }, + { ADWORD, C_NONE, C_NONE, C_ADDR, 11, 8, 0 }, + + { AWORD, C_NONE, C_NONE, C_LCON, 14, 4, 0 }, + { AWORD, C_NONE, C_NONE, C_LEXT, 14, 4, 0 }, + { AWORD, C_NONE, C_NONE, C_ADDR, 14, 4, 0 }, + + { AMOVW, C_LCON, C_NONE, C_REG, 12, 4, 0, LFROM }, + { AMOV, C_LCON, C_NONE, C_REG, 12, 4, 0, LFROM }, + + { AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, + { AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, + { AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, LTO }, + { AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM }, + { AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, LFROM }, + + { AMUL, C_REG, C_REG, C_REG, 15, 4, 0 }, + { AMUL, C_REG, C_NONE, C_REG, 15, 4, 0 }, + { AMADD, C_REG, C_REG, C_REG, 15, 4, 0 }, + + { AREM, C_REG, C_REG, C_REG, 16, 8, 0 }, + { AREM, C_REG, C_NONE, C_REG, 16, 8, 0 }, + + { ACSEL, C_COND, C_REG, C_REG, 18, 4, 0 }, /* from3 optional */ + { ACSET, C_COND, C_NONE, C_REG, 18, 4, 0 }, + + { ACCMN, C_COND, C_REG, C_LCON, 19, 4, 0 }, /* from3 either C_REG or C_LCON */ + + /* scaled 12-bit unsigned displacement store */ + + { AMOVB, C_REG, C_NONE, C_SEXT1, 20, 4, REGSB }, // + { AMOVB, C_REG, C_NONE, C_UAUTO4K, 20, 4, REGSP }, // + { AMOVB, C_REG, C_NONE, C_UOREG4K, 20, 4, 0 }, // + { AMOVBU, C_REG, C_NONE, C_SEXT1, 20, 4, REGSB }, // + { AMOVBU, C_REG, C_NONE, C_UAUTO4K, 20, 4, REGSP }, // + { AMOVBU, C_REG, C_NONE, C_UOREG4K, 20, 4, 0 }, // + + { AMOVH, C_REG, C_NONE, C_SEXT2, 20, 4, REGSB }, // + { AMOVH, C_REG, C_NONE, C_UAUTO8K, 20, 4, REGSP }, // + { AMOVH, C_REG, C_NONE, C_ZOREG, 20, 4, 0 }, // + { AMOVH, C_REG, C_NONE, C_UOREG8K, 20, 4, 0 }, // + + { AMOVW, C_REG, C_NONE, C_SEXT4, 20, 4, REGSB }, // + { AMOVW, C_REG, C_NONE, C_UAUTO16K, 20, 4, REGSP }, // + { AMOVW, C_REG, C_NONE, C_ZOREG, 20, 4, 0 }, // + { AMOVW, C_REG, C_NONE, C_UOREG16K, 20, 4, 0 }, // + + /* unscaled 9-bit signed displacement store */ + { AMOVB, C_REG, C_NONE, C_NSAUTO, 20, 4, REGSP }, // + { AMOVB, C_REG, C_NONE, C_NSOREG, 20, 4, 0 }, // + { AMOVBU, C_REG, C_NONE, C_NSAUTO, 20, 4, REGSP }, // + { AMOVBU, C_REG, C_NONE, C_NSOREG, 20, 4, 0 }, // + + { AMOVH, C_REG, C_NONE, C_NSAUTO, 20, 4, REGSP }, // + { AMOVH, C_REG, C_NONE, C_NSOREG, 20, 4, 0 }, // + { AMOVW, C_REG, C_NONE, C_NSAUTO, 20, 4, REGSP }, // + { AMOVW, C_REG, C_NONE, C_NSOREG, 20, 4, 0 }, // + + { AMOV, C_REG, C_NONE, C_SEXT8, 20, 4, REGSB }, + { AMOV, C_REG, C_NONE, C_UAUTO32K, 20, 4, REGSP }, + { AMOV, C_REG, C_NONE, C_ZOREG, 20, 4, 0 }, + { AMOV, C_REG, C_NONE, C_UOREG32K, 20, 4, 0 }, + + { AMOV, C_REG, C_NONE, C_NSOREG, 20, 4, 0 }, // + { AMOV, C_REG, C_NONE, C_NSAUTO, 20, 4, REGSP }, // + + /* short displacement load */ + + { AMOVB, C_SEXT1, C_NONE, C_REG, 21, 4, REGSB }, // + { AMOVB, C_UAUTO4K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVB, C_NSAUTO,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVB, C_ZOREG,C_NONE, C_REG, 21, 4, 0 }, // + { AMOVB, C_UOREG4K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVB, C_NSOREG,C_NONE, C_REG, 21, 4, REGSP }, // + + { AMOVBU, C_SEXT1, C_NONE, C_REG, 21, 4, REGSB }, // + { AMOVBU, C_UAUTO4K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVBU, C_NSAUTO,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVBU, C_ZOREG,C_NONE, C_REG, 21, 4, 0 }, // + { AMOVBU, C_UOREG4K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVBU, C_NSOREG,C_NONE, C_REG, 21, 4, REGSP }, // + + { AMOVH, C_SEXT2, C_NONE, C_REG, 21, 4, REGSB }, // + { AMOVH, C_UAUTO8K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVH, C_NSAUTO,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVH, C_ZOREG,C_NONE, C_REG, 21, 4, 0 }, // + { AMOVH, C_UOREG8K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVH, C_NSOREG,C_NONE, C_REG, 21, 4, REGSP }, // + + { AMOVW, C_SEXT4, C_NONE, C_REG, 21, 4, REGSB }, // + { AMOVW, C_UAUTO16K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVW, C_NSAUTO,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVW, C_ZOREG,C_NONE, C_REG, 21, 4, 0 }, // + { AMOVW, C_UOREG16K,C_NONE, C_REG, 21, 4, REGSP }, // + { AMOVW, C_NSOREG,C_NONE, C_REG, 21, 4, REGSP }, // + + { AMOV, C_SEXT8, C_NONE, C_REG, 21, 4, REGSB }, + { AMOV, C_UAUTO32K,C_NONE, C_REG, 21, 4, REGSP }, + { AMOV, C_NSAUTO,C_NONE, C_REG, 21, 4, REGSP }, + { AMOV, C_ZOREG,C_NONE, C_REG, 21, 4, 0 }, + { AMOV, C_UOREG32K,C_NONE, C_REG, 21, 4, REGSP }, + { AMOV, C_NSOREG,C_NONE, C_REG, 21, 4, REGSP }, + + /* long displacement store */ + { AMOVB, C_REG, C_NONE, C_LEXT, 30, 8, REGSB }, // + { AMOVB, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP }, // + { AMOVB, C_REG, C_NONE, C_LOREG, 30, 8, 0 }, // + { AMOVH, C_REG, C_NONE, C_LEXT, 30, 8, REGSB }, // + { AMOVH, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP }, // + { AMOVH, C_REG, C_NONE, C_LOREG, 30, 8, 0 }, // + { AMOVW, C_REG, C_NONE, C_LEXT, 30, 8, REGSB }, // + { AMOVW, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP }, // + { AMOVW, C_REG, C_NONE, C_LOREG, 30, 8, 0 }, // + { AMOV, C_REG, C_NONE, C_LEXT, 30, 8, REGSB }, // + { AMOV, C_REG, C_NONE, C_LAUTO, 30, 8, REGSP }, // + { AMOV, C_REG, C_NONE, C_LOREG, 30, 8, 0 }, // + + /* long displacement load */ + { AMOVB, C_LEXT, C_NONE, C_REG, 31, 8, REGSB }, // + { AMOVB, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP }, // + { AMOVB, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOVB, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOVH, C_LEXT, C_NONE, C_REG, 31, 8, REGSB }, // + { AMOVH, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP }, // + { AMOVH, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOVH, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOVW, C_LEXT, C_NONE, C_REG, 31, 8, REGSB }, // + { AMOVW, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP }, // + { AMOVW, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOVW, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOV, C_LEXT, C_NONE, C_REG, 31, 8, REGSB }, // + { AMOV, C_LAUTO,C_NONE, C_REG, 31, 8, REGSP }, // + { AMOV, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + { AMOV, C_LOREG,C_NONE, C_REG, 31, 8, 0 }, // + + /* load long effective stack address (load long offset and add) */ + { AMOV, C_LACON,C_NONE, C_REG, 34, 8, REGSP, LFROM }, // + + /* pre/post-indexed load (unscaled, signed 9-bit offset) */ + { AMOV, C_XPOST, C_NONE, C_REG, 22, 4, 0 }, + { AMOVW, C_XPOST, C_NONE, C_REG, 22, 4, 0 }, + { AMOVH, C_XPOST, C_NONE, C_REG, 22, 4, 0 }, + { AMOVB, C_XPOST, C_NONE, C_REG, 22, 4, 0 }, + { AMOVBU, C_XPOST, C_NONE, C_REG, 22, 4, 0 }, + { AFMOVS, C_XPOST, C_NONE, C_FREG, 22, 4, 0 }, + { AFMOVD, C_XPOST, C_NONE, C_FREG, 22, 4, 0 }, + + { AMOV, C_XPRE, C_NONE, C_REG, 22, 4, 0 }, + { AMOVW, C_XPRE, C_NONE, C_REG, 22, 4, 0 }, + { AMOVH, C_XPRE, C_NONE, C_REG, 22, 4, 0 }, + { AMOVB, C_XPRE, C_NONE, C_REG, 22, 4, 0 }, + { AMOVBU, C_XPRE, C_NONE, C_REG, 22, 4, 0 }, + { AFMOVS, C_XPRE, C_NONE, C_FREG, 22, 4, 0 }, + { AFMOVD, C_XPRE, C_NONE, C_FREG, 22, 4, 0 }, + + /* pre/post-indexed store (unscaled, signed 9-bit offset) */ + { AMOV, C_REG, C_NONE, C_XPOST, 23, 4, 0 }, + { AMOVW, C_REG, C_NONE, C_XPOST, 23, 4, 0 }, + { AMOVH, C_REG, C_NONE, C_XPOST, 23, 4, 0 }, + { AMOVB, C_REG, C_NONE, C_XPOST, 23, 4, 0 }, + { AMOVBU, C_REG, C_NONE, C_XPOST, 23, 4, 0 }, + { AFMOVS, C_FREG, C_NONE, C_XPOST, 23, 4, 0 }, + { AFMOVD, C_FREG, C_NONE, C_XPOST, 23, 4, 0 }, + + { AMOV, C_REG, C_NONE, C_XPRE, 23, 4, 0 }, + { AMOVW, C_REG, C_NONE, C_XPRE, 23, 4, 0 }, + { AMOVH, C_REG, C_NONE, C_XPRE, 23, 4, 0 }, + { AMOVB, C_REG, C_NONE, C_XPRE, 23, 4, 0 }, + { AMOVBU, C_REG, C_NONE, C_XPRE, 23, 4, 0 }, + { AFMOVS, C_FREG, C_NONE, C_XPRE, 23, 4, 0 }, + { AFMOVD, C_FREG, C_NONE, C_XPRE, 23, 4, 0 }, + + /* special */ + { AMOV, C_SPR, C_NONE, C_REG, 35, 4, 0 }, + { AMRS, C_SPR, C_NONE, C_REG, 35, 4, 0 }, + + { AMOV, C_REG, C_NONE, C_SPR, 36, 4, 0 }, + { AMSR, C_REG, C_NONE, C_SPR, 36, 4, 0 }, + + { AMOV, C_LCON, C_NONE, C_SPR, 37, 4, 0 }, + { AMSR, C_LCON, C_NONE, C_SPR, 37, 4, 0 }, + + { AERET, C_NONE, C_NONE, C_NONE, 41, 4, 0 }, + + { AFMOVS, C_FREG, C_NONE, C_SEXT4, 20, 4, REGSB }, + { AFMOVS, C_FREG, C_NONE, C_UAUTO16K, 20, 4, REGSP }, + { AFMOVS, C_FREG, C_NONE, C_NSAUTO, 20, 4, REGSP }, + { AFMOVS, C_FREG, C_NONE, C_ZOREG, 20, 4, 0 }, + { AFMOVS, C_FREG, C_NONE, C_UOREG16K, 20, 4, 0 }, + { AFMOVS, C_FREG, C_NONE, C_NSOREG, 20, 4, 0 }, + + { AFMOVD, C_FREG, C_NONE, C_SEXT8, 20, 4, REGSB }, + { AFMOVD, C_FREG, C_NONE, C_UAUTO32K, 20, 4, REGSP }, + { AFMOVD, C_FREG, C_NONE, C_NSAUTO, 20, 4, REGSP }, + { AFMOVD, C_FREG, C_NONE, C_ZOREG, 20, 4, 0 }, + { AFMOVD, C_FREG, C_NONE, C_UOREG32K, 20, 4, 0 }, + { AFMOVD, C_FREG, C_NONE, C_NSOREG, 20, 4, 0 }, + + { AFMOVS, C_SEXT4, C_NONE, C_FREG, 21, 4, REGSB }, + { AFMOVS, C_UAUTO16K,C_NONE, C_FREG, 21, 4, REGSP }, + { AFMOVS, C_NSAUTO,C_NONE, C_FREG, 21, 4, REGSP }, + { AFMOVS, C_ZOREG,C_NONE, C_FREG, 21, 4, 0 }, + { AFMOVS, C_UOREG16K,C_NONE, C_FREG, 21, 4, 0 }, + { AFMOVS, C_NSOREG,C_NONE, C_FREG, 21, 4, 0 }, + + { AFMOVD, C_SEXT8, C_NONE, C_FREG, 21, 4, REGSB }, + { AFMOVD, C_UAUTO32K,C_NONE, C_FREG, 21, 4, REGSP }, + { AFMOVD, C_NSAUTO,C_NONE, C_FREG, 21, 4, REGSP }, + { AFMOVD, C_ZOREG,C_NONE, C_FREG, 21, 4, 0 }, + { AFMOVD, C_UOREG32K,C_NONE, C_FREG, 21, 4, 0 }, + { AFMOVD, C_NSOREG,C_NONE, C_FREG, 21, 4, 0 }, + + { AFMOVS, C_FREG, C_NONE, C_LEXT, 30, 8, REGSB, LTO }, + { AFMOVS, C_FREG, C_NONE, C_LAUTO, 30, 8, REGSP, LTO }, + { AFMOVS, C_FREG, C_NONE, C_LOREG, 30, 8, 0, LTO }, + + { AFMOVS, C_LEXT, C_NONE, C_FREG, 31, 8, REGSB, LFROM }, + { AFMOVS, C_LAUTO,C_NONE, C_FREG, 31, 8, REGSP, LFROM }, + { AFMOVS, C_LOREG,C_NONE, C_FREG, 31, 8, 0, LFROM }, + + { AFMOVS, C_FREG, C_NONE, C_ADDR, 64, 8, 0, LTO }, + { AFMOVS, C_ADDR, C_NONE, C_FREG, 65, 8, 0, LFROM }, + + { AFADDS, C_FREG, C_NONE, C_FREG, 54, 4, 0 }, + { AFADDS, C_FREG, C_REG, C_FREG, 54, 4, 0 }, + { AFADDS, C_FCON, C_NONE, C_FREG, 54, 4, 0 }, + { AFADDS, C_FCON, C_REG, C_FREG, 54, 4, 0 }, + + { AFMOVS, C_FCON, C_NONE, C_FREG, 54, 4, 0 }, + { AFMOVS, C_FREG, C_NONE, C_FREG, 54, 4, 0 }, + { AFMOVD, C_FCON, C_NONE, C_FREG, 54, 4, 0 }, + { AFMOVD, C_FREG, C_NONE, C_FREG, 54, 4, 0 }, + + { AFCVTZSD, C_FREG, C_NONE, C_REG, 29, 4, 0 }, + { ASCVTFD, C_REG, C_NONE, C_FREG, 29, 4, 0 }, + + { AFCMPS, C_FREG, C_REG, C_NONE, 56, 4, 0 }, + { AFCMPS, C_FCON, C_REG, C_NONE, 56, 4, 0 }, + + { AFCCMPS, C_COND, C_REG, C_LCON, 57, 4, 0 }, + + { AFCSELD, C_COND, C_REG, C_FREG, 18, 4, 0 }, + + { AFCVTSD, C_FREG, C_NONE, C_FREG, 29, 4, 0 }, + + { ACASE, C_REG, C_NONE, C_REG, 62, 4*4, 0 }, + { ABCASE, C_NONE, C_NONE, C_SBRA, 63, 4, 0 }, + + { ACLREX, C_NONE, C_NONE, C_LCON, 38, 4, 0 }, + { ACLREX, C_NONE, C_NONE, C_NONE, 38, 4, 0 }, + + { ACBZ, C_REG, C_NONE, C_SBRA, 39, 4, 0 }, + { ATBZ, C_LCON, C_REG, C_SBRA, 40, 4, 0 }, + + { ASYS, C_LCON, C_NONE, C_NONE, 50, 4, 0 }, + { ASYS, C_LCON, C_REG, C_NONE, 50, 4, 0 }, + { ASYSL, C_LCON, C_NONE, C_REG, 50, 4, 0 }, + + { ADMB, C_LCON, C_NONE, C_NONE, 51, 4, 0 }, + { AHINT, C_LCON, C_NONE, C_NONE, 52, 4, 0 }, + + { ALDXR, C_ZOREG, C_NONE, C_REG, 58, 4, 0 }, + { ALDXP, C_ZOREG, C_REG, C_REG, 58, 4, 0 }, + { ASTXR, C_REG, C_REG, C_ZOREG, 59, 4, 0 }, + { ASTXP, C_REG, C_REG, C_ZOREG, 59, 4, 0 }, + + { AAESD, C_VREG, C_NONE, C_VREG, 29, 4, 0 }, + { ASHA1C, C_VREG, C_REG, C_VREG, 1, 4, 0 }, + + { AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 }, +}; diff --git a/sys/src/cmd/7l/pass.c b/sys/src/cmd/7l/pass.c new file mode 100644 index 000000000..ad3d9a439 --- /dev/null +++ b/sys/src/cmd/7l/pass.c @@ -0,0 +1,448 @@ +#include "l.h" + +vlong +atolwhex(char *s) +{ + vlong n; + int f; + + n = 0; + f = 0; + while(*s == ' ' || *s == '\t') + s++; + if(*s == '-' || *s == '+') { + if(*s++ == '-') + f = 1; + while(*s == ' ' || *s == '\t') + s++; + } + if(s[0]=='0' && s[1]){ + if(s[1]=='x' || s[1]=='X'){ + s += 2; + for(;;){ + if(*s >= '0' && *s <= '9') + n = n*16 + *s++ - '0'; + else if(*s >= 'a' && *s <= 'f') + n = n*16 + *s++ - 'a' + 10; + else if(*s >= 'A' && *s <= 'F') + n = n*16 + *s++ - 'A' + 10; + else + break; + } + } else + while(*s >= '0' && *s <= '7') + n = n*8 + *s++ - '0'; + } else + while(*s >= '0' && *s <= '9') + n = n*10 + *s++ - '0'; + if(f) + n = -n; + return n; +} + +vlong +rnd(vlong v, long r) +{ + long c; + + if(r <= 0) + return v; + v += r - 1; + c = v % r; + if(c < 0) + c += r; + v -= c; + return v; +} + +void +dodata(void) +{ + int i, t; + Sym *s; + Prog *p; + long orig, v; + + if(debug['v']) + Bprint(&bso, "%5.2f dodata\n", cputime()); + Bflush(&bso); + for(p = datap; p != P; p = p->link) { + s = p->from.sym; + if(p->as == ADYNT || p->as == AINIT) + s->value = dtype; + if(s->type == SBSS) + s->type = SDATA; + if(s->type != SDATA) + diag("initialize non-data (%d): %s\n%P", + s->type, s->name, p); + v = p->from.offset + p->reg; + if(v > s->value) + diag("initialize bounds (%lld): %s\n%P", + (vlong)s->value, s->name, p); + } + + if(debug['t']) { + /* + * pull out string constants + */ + for(p = datap; p != P; p = p->link) { + s = p->from.sym; + if(p->to.type == D_SCONST) + s->type = SSTRING; + } + } + + /* + * pass 1 + * assign 'small' variables to data segment + * (rationale is that data segment is more easily + * addressed through offset on REGSB) + */ + orig = 0; + for(i=0; i<NHASH; i++) + for(s = hash[i]; s != S; s = s->link) { + t = s->type; + if(t != SDATA && t != SBSS) + continue; + v = s->value; + if(v == 0) { + diag("%s: no size", s->name); + v = 1; + } + v = rnd(v, 4); + s->value = v; + if(v > MINSIZ) + continue; + if(v >= 16) + orig = rnd(orig, 16); + else if(v >= 8) + orig = rnd(orig, 8); + s->value = orig; + orig += v; + s->type = SDATA1; + } + + /* + * pass 2 + * assign large 'data' variables to data segment + */ + for(i=0; i<NHASH; i++) + for(s = hash[i]; s != S; s = s->link) { + t = s->type; + if(t != SDATA) { + if(t == SDATA1) + s->type = SDATA; + continue; + } + v = s->value; + if(v >= 16) + orig = rnd(orig, 16); + else if(v >= 8) + orig = rnd(orig, 8); + s->value = orig; + orig += v; + } + + while(orig & 7) + orig++; + datsize = orig; + + /* + * pass 3 + * everything else to bss segment + */ + for(i=0; i<NHASH; i++) + for(s = hash[i]; s != S; s = s->link) { + if(s->type != SBSS) + continue; + v = s->value; + if(v >= 16) + orig = rnd(orig, 16); + else if(v >= 8) + orig = rnd(orig, 8); + s->value = orig; + orig += v; + } + while(orig & 7) + orig++; + bsssize = orig-datsize; + + xdefine("setSB", SDATA, 0L); + xdefine("bdata", SDATA, 0L); + xdefine("edata", SDATA, datsize); + xdefine("end", SBSS, datsize+bsssize); + xdefine("etext", STEXT, 0L); +} + +Prog* +brchain(Prog *p) +{ + int i; + + for(i=0; i<20; i++) { + if(p == P || !isbranch(p->as)) + return p; + p = p->cond; + } + return P; +} + +void +follow(void) +{ + if(debug['v']) + Bprint(&bso, "%5.2f follow\n", cputime()); + Bflush(&bso); + + firstp = prg(); + lastp = firstp; + xfol(textp); + + firstp = firstp->link; + lastp->link = P; +} + +void +xfol(Prog *p) +{ + Prog *q, *r; + int a, i; + +loop: + if(p == P) + return; + a = p->as; + if(a == ATEXT) + curtext = p; + if(isbranch(a)) { + q = p->cond; + if(q != P) { + p->mark |= FOLL; + p = q; + if(!(p->mark & FOLL)) + goto loop; + } + } + if(p->mark & FOLL) { + for(i=0,q=p; i<4; i++,q=q->link) { + if(q == lastp) + break; + a = q->as; + if(a == ANOP) { + i--; + continue; + } + if(isbranch(a) || isreturn(a)) + goto copy; + if(q->cond == nil || (q->cond->mark&FOLL)) + continue; + if(a != ABEQ && a != ABNE) + continue; + copy: + for(;;) { + r = prg(); + *r = *p; + if(!(r->mark&FOLL)) + print("cant happen 1\n"); + r->mark |= FOLL; + if(p != q) { + p = p->link; + lastp->link = r; + lastp = r; + continue; + } + lastp->link = r; + lastp = r; + if(isbranch(a) || isreturn(a)) + return; + r->as = a == ABNE? ABEQ: ABNE; + r->cond = p->link; + r->link = p->cond; + if(!(r->link->mark&FOLL)) + xfol(r->link); + if(!(r->cond->mark&FOLL)) + print("cant happen 2\n"); + return; + } + } + a = branchop(); + q = prg(); + q->as = a; + q->line = p->line; + q->to.type = D_BRANCH; + q->to.offset = p->pc; + q->cond = p; + p = q; + } + p->mark |= FOLL; + lastp->link = p; + lastp = p; + if(isbranch(a) || isreturn(a)) + return; + if(p->cond != P) + if(!iscall(a) && p->link != P) { + q = brchain(p->link); + if(canfollow(a)) + if(q != P && (q->mark&FOLL)) { + p->as = relinv(a); + p->link = p->cond; + p->cond = q; + } + xfol(p->link); + q = brchain(p->cond); + if(q == P) + q = p->cond; + if(q->mark&FOLL) { + p->cond = q; + return; + } + p = q; + goto loop; + } + p = p->link; + goto loop; +} + +void +patch(void) +{ + long c, vexit; + Prog *p, *q; + Sym *s; + int a; + + if(debug['v']) + Bprint(&bso, "%5.2f patch\n", cputime()); + Bflush(&bso); + mkfwd(); + s = lookup("exit", 0); + vexit = s->value; + for(p = firstp; p != P; p = p->link) { + a = p->as; + if(a == ATEXT) + curtext = p; + if((iscall(a) || isbranch(a) || isreturn(a)) && + p->to.type != D_BRANCH && p->to.sym != S) { + s = p->to.sym; + switch(s->type) { + default: + diag("undefined: %s\n%P", s->name, p); + s->type = STEXT; + s->value = vexit; + break; + case STEXT: + p->to.offset = s->value; + break; + case SUNDEF: + if(!iscall(p->as)) + diag("help: SUNDEF in AB || ARET"); + p->to.offset = 0; + p->cond = UP; + break; + } + p->to.type = D_BRANCH; + } + if(p->cond == UP) + continue; + if(p->to.type == D_BRANCH) + c = p->to.offset; + else if(p->from.type == D_BRANCH) + c = p->from.offset; + else + continue; + for(q = firstp; q != P;) { + if(q->forwd != P) + if(c >= q->forwd->pc) { + q = q->forwd; + continue; + } + if(c == q->pc) + break; + q = q->link; + } + if(q == P) { + diag("branch out of range %ld\n%P", c, p); + p->to.type = D_NONE; + } + p->cond = q; + } + + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) + curtext = p; + if(p->cond != P && p->cond != UP) { + p->cond = brloop(p->cond); + if(p->cond != P){ + if(p->to.type == D_BRANCH) + p->to.offset = p->cond->pc; + if(p->from.type == D_BRANCH) + p->from.offset = p->cond->pc; + } + } + } +} + +#define LOG 6 +void +mkfwd(void) +{ + Prog *p; + long dwn[LOG], cnt[LOG], i; + Prog *lst[LOG]; + + for(i=0; i<LOG; i++) { + if(i == 0) + cnt[i] = 1; else + cnt[i] = LOG * cnt[i-1]; + dwn[i] = 1; + lst[i] = P; + } + i = 0; + for(p = firstp; p != P; p = p->link) { + if(p->as == ATEXT) + curtext = p; + i--; + if(i < 0) + i = LOG-1; + p->forwd = P; + dwn[i]--; + if(dwn[i] <= 0) { + dwn[i] = cnt[i]; + if(lst[i] != P) + lst[i]->forwd = p; + lst[i] = p; + } + } +} + +Prog* +brloop(Prog *p) +{ + Prog *q; + int c; + + for(c=0; p!=P;) { + if(!isbranch(p->as)) + return p; + q = p->cond; + if(q <= p) { + c++; + if(q == p || c > 5000) + break; + } + p = q; + } + return P; +} + +void +undef(void) +{ + int i; + Sym *s; + + for(i=0; i<NHASH; i++) + for(s = hash[i]; s != S; s = s->link) + if(s->type == SXREF) + diag("%s: not defined", s->name); +} diff --git a/sys/src/cmd/7l/span.c b/sys/src/cmd/7l/span.c new file mode 100644 index 000000000..a2d724ac8 --- /dev/null +++ b/sys/src/cmd/7l/span.c @@ -0,0 +1,1316 @@ +#include "l.h" + +#define BIT(n) ((uvlong)1<<(n)) + +static struct { + ulong start; + ulong size; +} pool; + +static void checkpool(Prog*, int); +static void flushpool(Prog*, int); +static int ispcdisp(long); + +static Optab *badop; +static Oprang oprange[ALAST]; + +void +span(void) +{ + Prog *p; + Sym *setext, *s; + Optab *o; + int m, bflag, i; + long c, otxt, v; + + if(debug['v']) + Bprint(&bso, "%5.2f span\n", cputime()); + Bflush(&bso); + + bflag = 0; + c = INITTEXT; + otxt = c; + for(p = firstp; p != P; p = p->link) { + if(p->as == ADWORD && (c&7) != 0) + c += 4; + p->pc = c; + o = oplook(p); + m = o->size; + if(m == 0) { + if(p->as == ATEXT) { + curtext = p; + autosize = p->to.offset + PCSZ; + if(p->from.sym != S) + p->from.sym->value = c; + /* need passes to resolve branches */ + if(c-otxt >= 1L<<20) + bflag = 1; + otxt = c; + continue; + } + diag("zero-width instruction\n%P", p); + continue; + } + switch(o->flag & (LFROM|LTO)) { + case LFROM: + addpool(p, &p->from); + break; + case LTO: + addpool(p, &p->to); + break; + } + if(p->as == AB || p->as == ARET || p->as == AERET || p->as == ARETURN) /* TO DO: other unconditional operations */ + checkpool(p, 0); + c += m; + if(blitrl) + checkpool(p, 1); + } + + /* + * if any procedure is large enough to + * generate a large SBRA branch, then + * generate extra passes putting branches + * around jmps to fix. this is rare. + */ + while(bflag) { + if(debug['v']) + Bprint(&bso, "%5.2f span1\n", cputime()); + bflag = 0; + c = INITTEXT; + for(p = firstp; p != P; p = p->link) { + if(p->as == ADWORD && (c&7) != 0) + c += 4; + p->pc = c; + o = oplook(p); +/* very large branches + if(o->type == 6 && p->cond) { + otxt = p->cond->pc - c; + if(otxt < 0) + otxt = -otxt; + if(otxt >= (1L<<17) - 10) { + q = prg(); + q->link = p->link; + p->link = q; + q->as = AB; + q->to.type = D_BRANCH; + q->cond = p->cond; + p->cond = q; + q = prg(); + q->link = p->link; + p->link = q; + q->as = AB; + q->to.type = D_BRANCH; + q->cond = q->link->link; + bflag = 1; + } + } + */ + m = o->size; + if(m == 0) { + if(p->as == ATEXT) { + curtext = p; + autosize = p->to.offset + PCSZ; + if(p->from.sym != S) + p->from.sym->value = c; + continue; + } + diag("zero-width instruction\n%P", p); + continue; + } + c += m; + } + } + + if(debug['t']) { + /* + * add strings to text segment + */ + c = rnd(c, 8); + for(i=0; i<NHASH; i++) + for(s = hash[i]; s != S; s = s->link) { + if(s->type != SSTRING) + continue; + v = s->value; + while(v & 3) + v++; + s->value = c; + c += v; + } + } + + c = rnd(c, 8); + + setext = lookup("etext", 0); + if(setext != S) { + setext->value = c; + textsize = c - INITTEXT; + } + if(INITRND) + INITDAT = rnd(c, INITRND); + if(debug['v']) + Bprint(&bso, "tsize = %#llux\n", textsize); + Bflush(&bso); +} + +/* + * when the first reference to the literal pool threatens + * to go out of range of a 1Mb PC-relative offset + * drop the pool now, and branch round it. + */ +static void +checkpool(Prog *p, int skip) +{ + if(pool.size >= 0xffff0 || !ispcdisp(p->pc+4+pool.size - pool.start+8)) + flushpool(p, skip); + else if(p->link == P) + flushpool(p, 2); +} + +static void +flushpool(Prog *p, int skip) +{ + Prog *q; + + if(blitrl) { + if(skip){ + if(debug['v'] && skip == 1) + print("note: flush literal pool at %#llux: len=%lud ref=%lux\n", p->pc+4, pool.size, pool.start); + q = prg(); + q->as = AB; + q->to.type = D_BRANCH; + q->cond = p->link; + q->link = blitrl; + blitrl = q; + } + else if(p->pc+pool.size-pool.start < 1024*1024) + return; + elitrl->link = p->link; + p->link = blitrl; + blitrl = 0; /* BUG: should refer back to values until out-of-range */ + elitrl = 0; + pool.size = 0; + pool.start = 0; + } +} + +/* + * TO DO: hash + */ +void +addpool(Prog *p, Adr *a) +{ + Prog *q, t; + int c, sz; + + c = aclass(a); + + t = zprg; + t.as = AWORD; + sz = 4; + if(p->as == AMOV) { + t.as = ADWORD; + sz = 8; + } + + switch(c) { + default: + t.to = *a; + break; + + case C_PSAUTO: + case C_PPAUTO: + case C_UAUTO4K: + case C_UAUTO8K: + case C_UAUTO16K: + case C_UAUTO32K: + case C_UAUTO64K: + case C_NSAUTO: + case C_NPAUTO: + case C_LAUTO: + case C_PPOREG: + case C_PSOREG: + case C_UOREG4K: + case C_UOREG8K: + case C_UOREG16K: + case C_UOREG32K: + case C_UOREG64K: + case C_NSOREG: + case C_NPOREG: + case C_LOREG: + t.to.type = D_CONST; + t.to.offset = instoffset; + sz = 4; + break; + } + + for(q = blitrl; q != P; q = q->link) /* could hash on t.t0.offset */ + if(memcmp(&q->to, &t.to, sizeof(t.to)) == 0) { + p->cond = q; + return; + } + + q = prg(); + *q = t; + q->pc = pool.size; + + if(blitrl == P) { + blitrl = q; + pool.start = p->pc; + } else + elitrl->link = q; + elitrl = q; + pool.size = rnd(pool.size, sz); + pool.size += sz; + + p->cond = q; +} + +int +relinv(int a) +{ + switch(a) { + case ABEQ: return ABNE; + case ABNE: return ABEQ; + case ABCS: return ABCC; + case ABHS: return ABLO; + case ABCC: return ABCS; + case ABLO: return ABHS; + case ABMI: return ABPL; + case ABPL: return ABMI; + case ABVS: return ABVC; + case ABVC: return ABVS; + case ABHI: return ABLS; + case ABLS: return ABHI; + case ABGE: return ABLT; + case ABLT: return ABGE; + case ABGT: return ABLE; + case ABLE: return ABGT; + } + diag("unknown relation: %A", a); + return a; +} + +void +xdefine(char *p, int t, long v) +{ + Sym *s; + + s = lookup(p, 0); + if(s->type == 0 || s->type == SXREF) { + s->type = t; + s->value = v; + } +} + +long +regoff(Adr *a) +{ + + instoffset = 0; + aclass(a); + return instoffset; +} + +static int +ispcdisp(long v) +{ + /* pc-relative addressing will reach? */ + return v >= -0xfffff && v <= 0xfffff && (v&3) == 0; +} + +static int +isaddcon(vlong v) +{ + /* uimm12 or uimm24? */ + if(v < 0) + return 0; + if((v & 0xFFF) == 0) + v >>= 12; + return v <= 0xFFF; +} + +static int +isbitcon(uvlong v) +{ + /* fancy bimm32 or bimm64? */ + return findmask(v) != nil || (v>>32) == 0 && findmask(v | (v<<32)) != nil; +} + +static int +maxstr1(uvlong x) +{ + int i; + + for(i = 0; x != 0; i++) + x &= x<<1; + return i; +} + +static uvlong +findrotl(uvlong x, int *l) +{ + int i; + + for(i = 0; (x&1) == 0 || (x&BIT(63)) != 0; i++) + x = (x<<1) | ((x&BIT(63))!=0); + *l = i; + return x; +} + +static int +findmask64(Mask *m, uvlong v) +{ + uvlong x, f, fm; + int i, lr, l0, l1, e; + + if(v == 0 || v == ~(uvlong)0) + return 0; + x = findrotl(v, &lr); + l1 = maxstr1(x); + l0 = maxstr1(~x); + e = l0+l1; + if(e == 0 || l1 == 64 || l0 == 64 || 64%e != 0) + return 0; + if(e != 64){ + f = BIT(l1)-1; + fm = BIT(e)-1; + if(e > 32 && x != f) + return 0; + for(i = 0; i < 64; i += e) + if(((x>>i) & fm) != f) + return 0; + } + print("%#llux %#llux 1:%d 0:%d r:%d\n", v, x, l1, l0, lr%e); + m->v = v; + m->s = l1; + m->e = e; + m->r = lr%e; + return 1; +} + +/* + * internal class codes for different constant classes: + * they partition the constant/offset range into disjoint ranges that + * are somehow treated specially by one or more load/store instructions. + */ +static int autoclass[] = {C_PSAUTO, C_NSAUTO, C_NPAUTO, C_PSAUTO, C_PPAUTO, C_UAUTO4K, C_UAUTO8K, C_UAUTO16K, C_UAUTO32K, C_UAUTO64K, C_LAUTO}; +static int oregclass[] = {C_ZOREG, C_NSOREG, C_NPOREG, C_PSOREG, C_PPOREG, C_UOREG4K, C_UOREG8K, C_UOREG16K, C_UOREG32K, C_UOREG64K, C_LOREG}; +static int sextclass[] = {C_SEXT1, C_LEXT, C_LEXT, C_SEXT1, C_SEXT1, C_SEXT1, C_SEXT2, C_SEXT4, C_SEXT8, C_SEXT16, C_LEXT}; + +/* + * return appropriate index into tables above + */ +static int +constclass(vlong l) +{ + if(l == 0) + return 0; + if(l < 0){ + if(l >= -256) + return 1; + if(l >= -512 && (l&7) == 0) + return 2; + return 10; + } + if(l <= 255) + return 3; + if(l <= 504 && (l&7) == 0) + return 4; + if(l <= 4095) + return 5; + if(l <= 8190 && (l&1) == 0) + return 6; + if(l <= 16380 && (l&3) == 0) + return 7; + if(l <= 32760 && (l&7) == 0) + return 8; + if(l <= 65520 && (l&0xF) == 0) + return 9; + return 10; +} + +/* + * given an offset v and a class c (see above) + * return the offset value to use in the instruction, + * scaled if necessary + */ +vlong +offsetshift(vlong v, int c) +{ + vlong vs; + int s; + static int shifts[] = {0, 1, 2, 3, 4}; + + s = 0; + if(c >= C_SEXT1 && c <= C_SEXT16) + s = shifts[c-C_SEXT1]; + else if(c >= C_UAUTO4K && c <= C_UAUTO64K) + s = shifts[c-C_UAUTO4K]; + else if(c >= C_UOREG4K && c <= C_UOREG64K) + s = shifts[c-C_UOREG4K]; + vs = v>>s; + if(vs<<s != v) + diag("odd offset: %lld\n%P", v, curp); + return vs; +} + +/* + * if v contains a single 16-bit value aligned + * on a 16-bit field, and thus suitable for movk/movn, + * return the field index 0 to 3; otherwise return -1 + */ +int +movcon(vlong v) +{ + int s; + + for(s = 0; s < 64; s += 16) + if((v & ~((uvlong)0xFFFF<<s)) == 0) + return s/16; + return -1; +} + +int +aclass(Adr *a) +{ + vlong v; + Sym *s; + int t; + + instoffset = 0; + switch(a->type) { + case D_NONE: + return C_NONE; + + case D_REG: + return C_REG; + + case D_VREG: + return C_VREG; + + case D_SP: + return C_RSP; + + case D_COND: + return C_COND; + + case D_SHIFT: + return C_SHIFT; + + case D_EXTREG: + return C_EXTREG; + + case D_ROFF: + return C_ROFF; + + case D_XPOST: + return C_XPOST; + + case D_XPRE: + return C_XPRE; + + case D_FREG: + return C_FREG; + + case D_OREG: + switch(a->name) { + case D_EXTERN: + case D_STATIC: + if(a->sym == 0 || a->sym->name == 0) { + print("null sym external\n"); + print("%D\n", a); + return C_GOK; + } + s = a->sym; + t = s->type; + if(t == 0 || t == SXREF) { + diag("undefined external: %s in %s", + s->name, TNAME); + s->type = SDATA; + } + if(dlm) { + switch(t) { + default: + instoffset = s->value + a->offset + INITDAT; + break; + case SUNDEF: + case STEXT: + case SCONST: + case SLEAF: + case SSTRING: + instoffset = s->value + a->offset; + break; + } + return C_ADDR; + } + instoffset = s->value + a->offset; + if(instoffset >= 0) + return sextclass[constclass(instoffset)]; + return C_LEXT; + + case D_AUTO: + instoffset = autosize + a->offset; + return autoclass[constclass(instoffset)]; + + case D_PARAM: + instoffset = autosize + a->offset + PCSZ; + return autoclass[constclass(instoffset)]; + + case D_NONE: + instoffset = a->offset; + return oregclass[constclass(instoffset)]; + } + return C_GOK; + + case D_SPR: + return C_SPR; + + case D_OCONST: + switch(a->name) { + case D_EXTERN: + case D_STATIC: + s = a->sym; + t = s->type; + if(t == 0 || t == SXREF) { + diag("undefined external: %s in %s", + s->name, TNAME); + s->type = SDATA; + } + instoffset = s->value + a->offset + INITDAT; + if(s->type == STEXT || s->type == SLEAF || s->type == SUNDEF) + instoffset = s->value + a->offset; + return C_LCON; + } + return C_GOK; + + case D_FCONST: + return C_FCON; + + case D_CONST: + switch(a->name) { + + case D_NONE: + instoffset = a->offset; + if(a->reg != NREG && a->reg != REGZERO) + goto aconsize; + + v = instoffset; + if(v == 0) + return C_ZCON; + if(isaddcon(v)){ + if(isbitcon(v)) + return C_ABCON; + if(v <= 0xFFF) + return C_ADDCON0; + return C_ADDCON; + } + t = movcon(v); + if(t >= 0){ + if(isbitcon(v)) + return C_MBCON; + return C_MOVCON; + } + t = movcon(~v); + if(t >= 0){ + if(isbitcon(v)) + return C_MBCON; + return C_MOVCON; + } + if(isbitcon(v)) + return C_BITCON; + return C_LCON; + + case D_EXTERN: + case D_STATIC: + s = a->sym; + if(s == S) + break; + t = s->type; + switch(t) { + case 0: + case SXREF: + diag("undefined external: %s in %s", + s->name, TNAME); + s->type = SDATA; + break; + case SUNDEF: + case STEXT: + case SSTRING: + case SCONST: + case SLEAF: + instoffset = s->value + a->offset; + return C_LCON; + } + if(!dlm) { + instoffset = s->value + a->offset; + if(instoffset != 0 && isaddcon(instoffset)) + return C_AECON; + } + instoffset = s->value + a->offset + INITDAT; + return C_LCON; + + case D_AUTO: + instoffset = autosize + a->offset; + goto aconsize; + + case D_PARAM: + instoffset = autosize + a->offset + PCSZ; + aconsize: + if(isaddcon(instoffset)) + return C_AACON; + return C_LACON; + } + return C_GOK; + + case D_BRANCH: + return C_SBRA; + } + return C_GOK; +} + +Optab* +oplook(Prog *p) +{ + int a1, a2, a3, r; + char *c1, *c2, *c3; + Optab *o, *e; + + a1 = p->optab; + if(a1) + return optab+(a1-1); + a1 = p->from.class; + if(a1 == 0) { + a1 = aclass(&p->from) + 1; + p->from.class = a1; + } + a1--; + a3 = p->to.class; + if(a3 == 0) { + a3 = aclass(&p->to) + 1; + p->to.class = a3; + } + a3--; + a2 = C_NONE; + if(p->reg != NREG) + a2 = C_REG; + r = p->as; + o = oprange[r].start; + if(o == 0) { + a1 = opcross[repop[r]][a1][a2][a3]; + if(a1) { + p->optab = a1+1; + return optab+a1; + } + o = oprange[r].stop; /* just generate an error */ + } + if(0) { + print("oplook %A %d %d %d\n", + (int)p->as, a1, a2, a3); + print(" %d %d\n", p->from.type, p->to.type); + } + e = oprange[r].stop; + c1 = xcmp[a1]; + c2 = xcmp[a2]; + c3 = xcmp[a3]; + for(; o<e; o++) + if(o->a2 == a2 || c2[o->a2]) + if(c1[o->a1]) + if(c3[o->a3]) { + p->optab = (o-optab)+1; + return o; + } + diag("illegal combination %A %R %R %R", + p->as, a1, a2, a3); + prasm(p); + o = badop; + if(o == 0) + errorexit(); + return o; +} + +int +cmp(int a, int b) +{ + + if(a == b) + return 1; + switch(a) { + case C_RSP: + if(b == C_REG) + return 1; + break; + + case C_REG: + if(b == C_ZCON) + return 1; + break; + + case C_ADDCON0: + if(b == C_ZCON) + return 1; + break; + + case C_ADDCON: + if(b == C_ZCON || b == C_ADDCON0 || b == C_ABCON) + return 1; + break; + + case C_BITCON: + if(b == C_ABCON || b == C_MBCON) + return 1; + break; + + case C_MOVCON: + if(b == C_MBCON || b == C_ZCON || b == C_ADDCON0) + return 1; + break; + + case C_LCON: + if(b == C_ZCON || b == C_BITCON || b == C_ADDCON || b == C_ADDCON0 || b == C_ABCON || b == C_MBCON || b == C_MOVCON) + return 1; + break; + + case C_VCON: + return cmp(C_LCON, b); + + case C_LACON: + if(b == C_AACON) + return 1; + break; + + case C_SEXT2: + if(b == C_SEXT1) + return 1; + break; + + case C_SEXT4: + if(b == C_SEXT1 || b == C_SEXT2) + return 1; + break; + + case C_SEXT8: + if(b >= C_SEXT1 && b <= C_SEXT4) + return 1; + break; + + case C_SEXT16: + if(b >= C_SEXT1 && b <= C_SEXT8) + return 1; + break; + + case C_LEXT: + if(b >= C_SEXT1 && b <= C_SEXT16) + return 1; + break; + + case C_PPAUTO: + if(b == C_PSAUTO) + return 1; + break; + + case C_UAUTO4K: + if(b == C_PSAUTO || b == C_PPAUTO) + return 1; + break; + + case C_UAUTO8K: + return cmp(C_UAUTO4K, b); + + case C_UAUTO16K: + return cmp(C_UAUTO8K, b); + + case C_UAUTO32K: + return cmp(C_UAUTO16K, b); + + case C_UAUTO64K: + return cmp(C_UAUTO32K, b); + + case C_NPAUTO: + return cmp(C_NSAUTO, b); + + case C_LAUTO: + return cmp(C_NPAUTO, b) || cmp(C_UAUTO64K, b); + + case C_PSOREG: + if(b == C_ZOREG) + return 1; + break; + + case C_PPOREG: + if(b == C_ZOREG || b == C_PSOREG) + return 1; + break; + + case C_UOREG4K: + if(b == C_ZOREG || b == C_PSAUTO || b == C_PSOREG || b == C_PPAUTO || b == C_PPOREG) + return 1; + break; + + case C_UOREG8K: + return cmp(C_UOREG4K, b); + + case C_UOREG16K: + return cmp(C_UOREG8K, b); + + case C_UOREG32K: + return cmp(C_UOREG16K, b); + + case C_UOREG64K: + return cmp(C_UOREG32K, b); + + case C_NPOREG: + return cmp(C_NSOREG, b); + + case C_LOREG: + return cmp(C_NPOREG, b) || cmp(C_UOREG64K, b); + + case C_LBRA: + if(b == C_SBRA) + return 1; + break; + } + return 0; +} + +static int +ocmp(const void *a1, const void *a2) +{ + Optab *p1, *p2; + int n; + + p1 = (Optab*)a1; + p2 = (Optab*)a2; + n = p1->as - p2->as; + if(n) + return n; + n = p1->a1 - p2->a1; + if(n) + return n; + n = p1->a2 - p2->a2; + if(n) + return n; + n = p1->a3 - p2->a3; + if(n) + return n; + return 0; +} + +void +buildop(void) +{ + int i, n, r; + Oprang t; + + for(i=0; i<C_GOK; i++) + for(n=0; n<C_GOK; n++) + xcmp[i][n] = cmp(n, i); + for(n=0; optab[n].as != AXXX; n++) + ; + badop = optab+n; + qsort(optab, n, sizeof(optab[0]), ocmp); + for(i=0; i<n; i++) { + r = optab[i].as; + oprange[r].start = optab+i; + while(optab[i].as == r) + i++; + oprange[r].stop = optab+i; + i--; + + t = oprange[r]; + switch(r){ + default: + diag("unknown op in build: %A", r); + errorexit(); + case AXXX: + break; + case AADD: + oprange[AADDS] = t; + oprange[ASUB] = t; + oprange[ASUBS] = t; + oprange[AADDW] = t; + oprange[AADDSW] = t; + oprange[ASUBW] = t; + oprange[ASUBSW] = t; + break; + case AAND: /* logical immediate, logical shifted register */ + oprange[AANDS] = t; + oprange[AANDSW] = t; + oprange[AANDW] = t; + oprange[AEOR] = t; + oprange[AEORW] = t; + oprange[AORR] = t; + oprange[AORRW] = t; + break; + case ABIC: /* only logical shifted register */ + oprange[ABICS] = t; + oprange[ABICSW] = t; + oprange[ABICW] = t; + oprange[AEON] = t; + oprange[AEONW] = t; + oprange[AORN] = t; + oprange[AORNW] = t; + break; + case ANEG: + oprange[ANEGS] = t; + oprange[ANEGSW] = t; + oprange[ANEGW] = t; + break; + case AADC: /* rn=Rd */ + oprange[AADCW] = t; + oprange[AADCS] = t; + oprange[AADCSW] = t; + oprange[ASBC] = t; + oprange[ASBCW] = t; + oprange[ASBCS] = t; + oprange[ASBCSW] = t; + break; + case ANGC: /* rn=REGZERO */ + oprange[ANGCW] = t; + oprange[ANGCS] = t; + oprange[ANGCSW] = t; + break; + case ACMP: + oprange[ACMPW] = t; + oprange[ACMN] = t; + oprange[ACMNW] = t; + break; + case ATST: + oprange[ATSTW] = t; + break; + case AMVN: + /* register/register, and shifted */ + oprange[AMVNW] = t; + break; + case AMOVK: + oprange[AMOVKW] = t; + oprange[AMOVN] = t; + oprange[AMOVNW] = t; + oprange[AMOVZ] = t; + oprange[AMOVZW] = t; + break; + case ABEQ: + oprange[ABNE] = t; + oprange[ABCS] = t; + oprange[ABHS] = t; + oprange[ABCC] = t; + oprange[ABLO] = t; + oprange[ABMI] = t; + oprange[ABPL] = t; + oprange[ABVS] = t; + oprange[ABVC] = t; + oprange[ABHI] = t; + oprange[ABLS] = t; + oprange[ABGE] = t; + oprange[ABLT] = t; + oprange[ABGT] = t; + oprange[ABLE] = t; + break; + case ALSL: + oprange[ALSLW] = t; + oprange[ALSR] = t; + oprange[ALSRW] = t; + oprange[AASR] = t; + oprange[AASRW] = t; + oprange[AROR] = t; + oprange[ARORW] = t; + break; + case ACLS: + oprange[ACLSW] = t; + oprange[ACLZ] = t; + oprange[ACLZW] = t; + oprange[ARBIT] = t; + oprange[ARBITW] = t; + oprange[AREV] = t; + oprange[AREVW] = t; + oprange[AREV16] = t; + oprange[AREV16W] = t; + oprange[AREV32] = t; + break; + case ASDIV: + oprange[ASDIVW] = t; + oprange[AUDIV] = t; + oprange[AUDIVW] = t; + oprange[ACRC32B] = t; + oprange[ACRC32CB] = t; + oprange[ACRC32CH] = t; + oprange[ACRC32CW] = t; + oprange[ACRC32CX] = t; + oprange[ACRC32H] = t; + oprange[ACRC32W] = t; + oprange[ACRC32X] = t; + break; + case AMADD: + oprange[AMADDW] = t; + oprange[AMSUB] = t; + oprange[AMSUBW] = t; + oprange[ASMADDL] = t; + oprange[ASMSUBL] = t; + oprange[AUMADDL] = t; + oprange[AUMSUBL] = t; + break; + case AREM: + oprange[AREMW] = t; + oprange[AUREM] = t; + oprange[AUREMW] = t; + break; + case AMUL: + oprange[AMULW] = t; + oprange[AMNEG] = t; + oprange[AMNEGW] = t; + oprange[ASMNEGL] = t; + oprange[ASMULL] = t; + oprange[ASMULH] = t; + oprange[AUMNEGL] = t; + oprange[AUMULH] = t; + oprange[AUMULL] = t; + break; + case AMOVH: + oprange[AMOVHU] = t; + break; + case AMOVW: + oprange[AMOVWU] = t; + break; + case ABFM: + oprange[ABFMW] = t; + oprange[ASBFM] = t; + oprange[ASBFMW] = t; + oprange[AUBFM] = t; + oprange[AUBFMW] = t; + break; + case ABFI: + oprange[ABFIW] = t; + oprange[ABFXIL] = t; + oprange[ABFXILW] = t; + oprange[ASBFIZ] = t; + oprange[ASBFIZW] = t; + oprange[ASBFX] = t; + oprange[ASBFXW] = t; + oprange[AUBFIZ] = t; + oprange[AUBFIZW] = t; + oprange[AUBFX] = t; + oprange[AUBFXW] = t; + break; + case AEXTR: + oprange[AEXTRW] = t; + break; + case ASXTB: + oprange[ASXTBW] = t; + oprange[ASXTH] = t; + oprange[ASXTHW] = t; + oprange[ASXTW] = t; + oprange[AUXTB] = t; + oprange[AUXTH] = t; + oprange[AUXTW] = t; + oprange[AUXTBW] = t; + oprange[AUXTHW] = t; + break; + case ACCMN: + oprange[ACCMNW] = t; + oprange[ACCMP] = t; + oprange[ACCMPW] = t; + break; + case ACSEL: + oprange[ACSELW] = t; + oprange[ACSINC] = t; + oprange[ACSINCW] = t; + oprange[ACSINV] = t; + oprange[ACSINVW] = t; + oprange[ACSNEG] = t; + oprange[ACSNEGW] = t; + // aliases Rm=Rn, !cond + oprange[ACINC] = t; + oprange[ACINCW] = t; + oprange[ACINV] = t; + oprange[ACINVW] = t; + oprange[ACNEG] = t; + oprange[ACNEGW] = t; + break; + case ACSET: + // aliases, Rm=Rn=REGZERO, !cond + oprange[ACSETW] = t; + oprange[ACSETM] = t; + oprange[ACSETMW] = t; + break; + case AMOV: + case AMOVB: + case AMOVBU: + case AB: + case ABL: + case AWORD: + case ADWORD: + case ARET: + case ATEXT: + case ACASE: + case ABCASE: + break; + case AERET: + oprange[ANOP] = t; + oprange[AWFE] = t; + oprange[AWFI] = t; + oprange[AYIELD] = t; + oprange[ASEV] = t; + oprange[ASEVL] = t; + oprange[ADRPS] = t; + break; + case ACBZ: + oprange[ACBZW] = t; + oprange[ACBNZ] = t; + oprange[ACBNZW] = t; + break; + case ATBZ: + oprange[ATBNZ] = t; + break; + case AADR: + case AADRP: + break; + case ACLREX: + break; + case ASVC: + oprange[AHLT] = t; + oprange[AHVC] = t; + oprange[ASMC] = t; + oprange[ABRK] = t; + oprange[ADCPS1] = t; + oprange[ADCPS2] = t; + oprange[ADCPS3] = t; + break; + case AFADDS: + oprange[AFADDD] = t; + oprange[AFSUBS] = t; + oprange[AFSUBD] = t; + oprange[AFMULS] = t; + oprange[AFMULD] = t; + oprange[AFNMULS] = t; + oprange[AFNMULD] = t; + oprange[AFDIVS] = t; + oprange[AFMAXD] = t; + oprange[AFMAXS] = t; + oprange[AFMIND] = t; + oprange[AFMINS] = t; + oprange[AFMAXNMD] = t; + oprange[AFMAXNMS] = t; + oprange[AFMINNMD] = t; + oprange[AFMINNMS] = t; + oprange[AFDIVD] = t; + break; + case AFCVTSD: + oprange[AFCVTDS] = t; + oprange[AFABSD] = t; + oprange[AFABSS] = t; + oprange[AFNEGD] = t; + oprange[AFNEGS] = t; + oprange[AFSQRTD] = t; + oprange[AFSQRTS] = t; + oprange[AFRINTNS] = t; + oprange[AFRINTND] = t; + oprange[AFRINTPS] = t; + oprange[AFRINTPD] = t; + oprange[AFRINTMS] = t; + oprange[AFRINTMD] = t; + oprange[AFRINTZS] = t; + oprange[AFRINTZD] = t; + oprange[AFRINTAS] = t; + oprange[AFRINTAD] = t; + oprange[AFRINTXS] = t; + oprange[AFRINTXD] = t; + oprange[AFRINTIS] = t; + oprange[AFRINTID] = t; + oprange[AFCVTDH] = t; + oprange[AFCVTHS] = t; + oprange[AFCVTHD] = t; + oprange[AFCVTSH] = t; + break; + case AFCMPS: + oprange[AFCMPD] = t; + oprange[AFCMPES] = t; + oprange[AFCMPED] = t; + break; + case AFCCMPS: + oprange[AFCCMPD] = t; + oprange[AFCCMPES] = t; + oprange[AFCCMPED] = t; + break; + case AFCSELD: + oprange[AFCSELS] = t; + break; + + case AFMOVS: + case AFMOVD: + break; + + case AFCVTZSD: + oprange[AFCVTZSDW] = t; + oprange[AFCVTZSS] = t; + oprange[AFCVTZSSW] = t; + oprange[AFCVTZUD] = t; + oprange[AFCVTZUDW] = t; + oprange[AFCVTZUS] = t; + oprange[AFCVTZUSW] = t; + break; + case ASCVTFD: + oprange[ASCVTFS] = t; + oprange[ASCVTFWD] = t; + oprange[ASCVTFWS] = t; + oprange[AUCVTFD] = t; + oprange[AUCVTFS] = t; + oprange[AUCVTFWD] = t; + oprange[AUCVTFWS] = t; + break; + + case ASYS: + oprange[AAT] = t; + oprange[ADC] = t; + oprange[AIC] = t; + oprange[ATLBI] = t; + break; + + case ASYSL: + case AHINT: + break; + + case ADMB: + oprange[ADSB] = t; + oprange[AISB] = t; + break; + + case AMRS: + case AMSR: + break; + + case ALDXR: + oprange[ALDXRB] = t; + oprange[ALDXRH] = t; + oprange[ALDXRW] = t; + break; + case ALDXP: + oprange[ALDXPW] = t; + break; + case ASTXR: + oprange[ASTXRB] = t; + oprange[ASTXRH] = t; + oprange[ASTXRW] = t; + break; + case ASTXP: + oprange[ASTXPW] = t; + break; + + case AAESD: + oprange[AAESE] = t; + oprange[AAESMC] = t; + oprange[AAESIMC] = t; + oprange[ASHA1H] = t; + oprange[ASHA1SU1] = t; + oprange[ASHA256SU0] = t; + break; + + case ASHA1C: + oprange[ASHA1P] = t; + oprange[ASHA1M] = t; + oprange[ASHA1SU0] = t; + oprange[ASHA256H] = t; + oprange[ASHA256H2] = t; + oprange[ASHA256SU1] = t; + break; + } + } +} |