ref: d8d4802f80b40bc9a43031e3d6484aa237e7d444
parent: 394d095ee0a9e50242b88a783af6bb777cfb3e01
author: cinap_lenrek <cinap_lenrek@felloff.net>
date: Mon Apr 8 10:05:27 EDT 2019
7l: add arm64 linker (initial sync)
--- /dev/null
+++ b/sys/src/cmd/7l/asm.c
@@ -1,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;
+}
--- /dev/null
+++ b/sys/src/cmd/7l/asmout.c
@@ -1,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
+ */
--- /dev/null
+++ b/sys/src/cmd/7l/bits.c
@@ -1,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;
+}
--- /dev/null
+++ b/sys/src/cmd/7l/compat.c
@@ -1,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);
+}
--- /dev/null
+++ b/sys/src/cmd/7l/dyn.c
@@ -1,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);
+ }
+}
--- /dev/null
+++ b/sys/src/cmd/7l/l.h
@@ -1,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)
--- /dev/null
+++ b/sys/src/cmd/7l/list.c
@@ -1,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();
+ }
+}
--- /dev/null
+++ b/sys/src/cmd/7l/mkcname
@@ -1,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
+!
--- /dev/null
+++ b/sys/src/cmd/7l/mkfile
@@ -1,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
--- /dev/null
+++ b/sys/src/cmd/7l/mod.c
@@ -1,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);
+}
--- /dev/null
+++ b/sys/src/cmd/7l/noop.c
@@ -1,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;
+}
--- /dev/null
+++ b/sys/src/cmd/7l/obj.c
@@ -1,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);
+}
--- /dev/null
+++ b/sys/src/cmd/7l/optab.c
@@ -1,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 },
+};
--- /dev/null
+++ b/sys/src/cmd/7l/pass.c
@@ -1,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);
+}
--- /dev/null
+++ b/sys/src/cmd/7l/span.c
@@ -1,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;
+ }
+ }
+}