1*7dd7cddfSDavid du Colombier typedef unsigned long ulong; 2*7dd7cddfSDavid du Colombier typedef unsigned int uint; 3*7dd7cddfSDavid du Colombier typedef unsigned short ushort; 4*7dd7cddfSDavid du Colombier typedef unsigned char uchar; 5*7dd7cddfSDavid du Colombier typedef signed char schar; 6*7dd7cddfSDavid du Colombier 7*7dd7cddfSDavid du Colombier #define SIGN(n) (1UL<<(n-1)) 8*7dd7cddfSDavid du Colombier 9*7dd7cddfSDavid du Colombier typedef struct Vlong Vlong; 10*7dd7cddfSDavid du Colombier struct Vlong 11*7dd7cddfSDavid du Colombier { 12*7dd7cddfSDavid du Colombier union 13*7dd7cddfSDavid du Colombier { 14*7dd7cddfSDavid du Colombier struct 15*7dd7cddfSDavid du Colombier { 16*7dd7cddfSDavid du Colombier ulong hi; 17*7dd7cddfSDavid du Colombier ulong lo; 18*7dd7cddfSDavid du Colombier }; 19*7dd7cddfSDavid du Colombier struct 20*7dd7cddfSDavid du Colombier { 21*7dd7cddfSDavid du Colombier ushort hims; 22*7dd7cddfSDavid du Colombier ushort hils; 23*7dd7cddfSDavid du Colombier ushort loms; 24*7dd7cddfSDavid du Colombier ushort lols; 25*7dd7cddfSDavid du Colombier }; 26*7dd7cddfSDavid du Colombier }; 27*7dd7cddfSDavid du Colombier }; 28*7dd7cddfSDavid du Colombier 29*7dd7cddfSDavid du Colombier void abort(void); 30*7dd7cddfSDavid du Colombier 31*7dd7cddfSDavid du Colombier void 32*7dd7cddfSDavid du Colombier _addv(Vlong *r, Vlong a, Vlong b) 33*7dd7cddfSDavid du Colombier { 34*7dd7cddfSDavid du Colombier ulong lo, hi; 35*7dd7cddfSDavid du Colombier 36*7dd7cddfSDavid du Colombier lo = a.lo + b.lo; 37*7dd7cddfSDavid du Colombier hi = a.hi + b.hi; 38*7dd7cddfSDavid du Colombier if(lo < a.lo) 39*7dd7cddfSDavid du Colombier hi++; 40*7dd7cddfSDavid du Colombier r->lo = lo; 41*7dd7cddfSDavid du Colombier r->hi = hi; 42*7dd7cddfSDavid du Colombier } 43*7dd7cddfSDavid du Colombier 44*7dd7cddfSDavid du Colombier void 45*7dd7cddfSDavid du Colombier _subv(Vlong *r, Vlong a, Vlong b) 46*7dd7cddfSDavid du Colombier { 47*7dd7cddfSDavid du Colombier ulong lo, hi; 48*7dd7cddfSDavid du Colombier 49*7dd7cddfSDavid du Colombier lo = a.lo - b.lo; 50*7dd7cddfSDavid du Colombier hi = a.hi - b.hi; 51*7dd7cddfSDavid du Colombier if(lo > a.lo) 52*7dd7cddfSDavid du Colombier hi--; 53*7dd7cddfSDavid du Colombier r->lo = lo; 54*7dd7cddfSDavid du Colombier r->hi = hi; 55*7dd7cddfSDavid du Colombier } 56*7dd7cddfSDavid du Colombier 57*7dd7cddfSDavid du Colombier void 58*7dd7cddfSDavid du Colombier _d2v(Vlong *y, double d) 59*7dd7cddfSDavid du Colombier { 60*7dd7cddfSDavid du Colombier union { double d; struct Vlong; } x; 61*7dd7cddfSDavid du Colombier ulong xhi, xlo, ylo, yhi; 62*7dd7cddfSDavid du Colombier int sh; 63*7dd7cddfSDavid du Colombier 64*7dd7cddfSDavid du Colombier x.d = d; 65*7dd7cddfSDavid du Colombier 66*7dd7cddfSDavid du Colombier xhi = (x.hi & 0xfffff) | 0x100000; 67*7dd7cddfSDavid du Colombier xlo = x.lo; 68*7dd7cddfSDavid du Colombier sh = 1075 - ((x.hi >> 20) & 0x7ff); 69*7dd7cddfSDavid du Colombier 70*7dd7cddfSDavid du Colombier ylo = 0; 71*7dd7cddfSDavid du Colombier yhi = 0; 72*7dd7cddfSDavid du Colombier if(sh >= 0) { 73*7dd7cddfSDavid du Colombier /* v = (hi||lo) >> sh */ 74*7dd7cddfSDavid du Colombier if(sh < 32) { 75*7dd7cddfSDavid du Colombier if(sh == 0) { 76*7dd7cddfSDavid du Colombier ylo = xlo; 77*7dd7cddfSDavid du Colombier yhi = xhi; 78*7dd7cddfSDavid du Colombier } else { 79*7dd7cddfSDavid du Colombier ylo = (xlo >> sh) | (xhi << (32-sh)); 80*7dd7cddfSDavid du Colombier yhi = xhi >> sh; 81*7dd7cddfSDavid du Colombier } 82*7dd7cddfSDavid du Colombier } else { 83*7dd7cddfSDavid du Colombier if(sh == 32) { 84*7dd7cddfSDavid du Colombier ylo = xhi; 85*7dd7cddfSDavid du Colombier } else 86*7dd7cddfSDavid du Colombier if(sh < 64) { 87*7dd7cddfSDavid du Colombier ylo = xhi >> (sh-32); 88*7dd7cddfSDavid du Colombier } 89*7dd7cddfSDavid du Colombier } 90*7dd7cddfSDavid du Colombier } else { 91*7dd7cddfSDavid du Colombier /* v = (hi||lo) << -sh */ 92*7dd7cddfSDavid du Colombier sh = -sh; 93*7dd7cddfSDavid du Colombier if(sh <= 10) { 94*7dd7cddfSDavid du Colombier ylo = xlo << sh; 95*7dd7cddfSDavid du Colombier yhi = (xhi << sh) | (xlo >> (32-sh)); 96*7dd7cddfSDavid du Colombier } else { 97*7dd7cddfSDavid du Colombier /* overflow */ 98*7dd7cddfSDavid du Colombier yhi = d; /* causes something awful */ 99*7dd7cddfSDavid du Colombier } 100*7dd7cddfSDavid du Colombier } 101*7dd7cddfSDavid du Colombier if(x.hi & SIGN(32)) { 102*7dd7cddfSDavid du Colombier if(ylo != 0) { 103*7dd7cddfSDavid du Colombier ylo = -ylo; 104*7dd7cddfSDavid du Colombier yhi = ~yhi; 105*7dd7cddfSDavid du Colombier } else 106*7dd7cddfSDavid du Colombier yhi = -yhi; 107*7dd7cddfSDavid du Colombier } 108*7dd7cddfSDavid du Colombier 109*7dd7cddfSDavid du Colombier y->hi = yhi; 110*7dd7cddfSDavid du Colombier y->lo = ylo; 111*7dd7cddfSDavid du Colombier } 112*7dd7cddfSDavid du Colombier 113*7dd7cddfSDavid du Colombier void 114*7dd7cddfSDavid du Colombier _f2v(Vlong *y, float f) 115*7dd7cddfSDavid du Colombier { 116*7dd7cddfSDavid du Colombier 117*7dd7cddfSDavid du Colombier _d2v(y, f); 118*7dd7cddfSDavid du Colombier } 119*7dd7cddfSDavid du Colombier 120*7dd7cddfSDavid du Colombier double 121*7dd7cddfSDavid du Colombier _v2d(Vlong x) 122*7dd7cddfSDavid du Colombier { 123*7dd7cddfSDavid du Colombier if(x.hi & SIGN(32)) { 124*7dd7cddfSDavid du Colombier if(x.lo) { 125*7dd7cddfSDavid du Colombier x.lo = -x.lo; 126*7dd7cddfSDavid du Colombier x.hi = ~x.hi; 127*7dd7cddfSDavid du Colombier } else 128*7dd7cddfSDavid du Colombier x.hi = -x.hi; 129*7dd7cddfSDavid du Colombier return -((long)x.hi*4294967296. + x.lo); 130*7dd7cddfSDavid du Colombier } 131*7dd7cddfSDavid du Colombier return (long)x.hi*4294967296. + x.lo; 132*7dd7cddfSDavid du Colombier } 133*7dd7cddfSDavid du Colombier 134*7dd7cddfSDavid du Colombier float 135*7dd7cddfSDavid du Colombier _v2f(Vlong x) 136*7dd7cddfSDavid du Colombier { 137*7dd7cddfSDavid du Colombier return _v2d(x); 138*7dd7cddfSDavid du Colombier } 139*7dd7cddfSDavid du Colombier 140*7dd7cddfSDavid du Colombier static void 141*7dd7cddfSDavid du Colombier dodiv(Vlong num, Vlong den, Vlong *q, Vlong *r) 142*7dd7cddfSDavid du Colombier { 143*7dd7cddfSDavid du Colombier ulong numlo, numhi, denhi, denlo, quohi, quolo, t; 144*7dd7cddfSDavid du Colombier int i; 145*7dd7cddfSDavid du Colombier 146*7dd7cddfSDavid du Colombier numhi = num.hi; 147*7dd7cddfSDavid du Colombier numlo = num.lo; 148*7dd7cddfSDavid du Colombier denhi = den.hi; 149*7dd7cddfSDavid du Colombier denlo = den.lo; 150*7dd7cddfSDavid du Colombier 151*7dd7cddfSDavid du Colombier /* 152*7dd7cddfSDavid du Colombier * get a divide by zero 153*7dd7cddfSDavid du Colombier */ 154*7dd7cddfSDavid du Colombier if(denlo==0 && denhi==0) { 155*7dd7cddfSDavid du Colombier numlo = numlo / denlo; 156*7dd7cddfSDavid du Colombier } 157*7dd7cddfSDavid du Colombier 158*7dd7cddfSDavid du Colombier /* 159*7dd7cddfSDavid du Colombier * set up the divisor and find the number of iterations needed 160*7dd7cddfSDavid du Colombier */ 161*7dd7cddfSDavid du Colombier if(numhi >= SIGN(32)) { 162*7dd7cddfSDavid du Colombier quohi = SIGN(32); 163*7dd7cddfSDavid du Colombier quolo = 0; 164*7dd7cddfSDavid du Colombier } else { 165*7dd7cddfSDavid du Colombier quohi = numhi; 166*7dd7cddfSDavid du Colombier quolo = numlo; 167*7dd7cddfSDavid du Colombier } 168*7dd7cddfSDavid du Colombier i = 0; 169*7dd7cddfSDavid du Colombier while(denhi < quohi || (denhi == quohi && denlo < quolo)) { 170*7dd7cddfSDavid du Colombier denhi = (denhi<<1) | (denlo>>31); 171*7dd7cddfSDavid du Colombier denlo <<= 1; 172*7dd7cddfSDavid du Colombier i++; 173*7dd7cddfSDavid du Colombier } 174*7dd7cddfSDavid du Colombier 175*7dd7cddfSDavid du Colombier quohi = 0; 176*7dd7cddfSDavid du Colombier quolo = 0; 177*7dd7cddfSDavid du Colombier for(; i >= 0; i--) { 178*7dd7cddfSDavid du Colombier quohi = (quohi<<1) | (quolo>>31); 179*7dd7cddfSDavid du Colombier quolo <<= 1; 180*7dd7cddfSDavid du Colombier if(numhi > denhi || (numhi == denhi && numlo >= denlo)) { 181*7dd7cddfSDavid du Colombier t = numlo; 182*7dd7cddfSDavid du Colombier numlo -= denlo; 183*7dd7cddfSDavid du Colombier if(numlo > t) 184*7dd7cddfSDavid du Colombier numhi--; 185*7dd7cddfSDavid du Colombier numhi -= denhi; 186*7dd7cddfSDavid du Colombier quolo |= 1; 187*7dd7cddfSDavid du Colombier } 188*7dd7cddfSDavid du Colombier denlo = (denlo>>1) | (denhi<<31); 189*7dd7cddfSDavid du Colombier denhi >>= 1; 190*7dd7cddfSDavid du Colombier } 191*7dd7cddfSDavid du Colombier 192*7dd7cddfSDavid du Colombier if(q) { 193*7dd7cddfSDavid du Colombier q->lo = quolo; 194*7dd7cddfSDavid du Colombier q->hi = quohi; 195*7dd7cddfSDavid du Colombier } 196*7dd7cddfSDavid du Colombier if(r) { 197*7dd7cddfSDavid du Colombier r->lo = numlo; 198*7dd7cddfSDavid du Colombier r->hi = numhi; 199*7dd7cddfSDavid du Colombier } 200*7dd7cddfSDavid du Colombier } 201*7dd7cddfSDavid du Colombier 202*7dd7cddfSDavid du Colombier void 203*7dd7cddfSDavid du Colombier _divvu(Vlong *q, Vlong n, Vlong d) 204*7dd7cddfSDavid du Colombier { 205*7dd7cddfSDavid du Colombier 206*7dd7cddfSDavid du Colombier if(n.hi == 0 && d.hi == 0) { 207*7dd7cddfSDavid du Colombier q->hi = 0; 208*7dd7cddfSDavid du Colombier q->lo = n.lo / d.lo; 209*7dd7cddfSDavid du Colombier return; 210*7dd7cddfSDavid du Colombier } 211*7dd7cddfSDavid du Colombier dodiv(n, d, q, 0); 212*7dd7cddfSDavid du Colombier } 213*7dd7cddfSDavid du Colombier 214*7dd7cddfSDavid du Colombier void 215*7dd7cddfSDavid du Colombier _modvu(Vlong *r, Vlong n, Vlong d) 216*7dd7cddfSDavid du Colombier { 217*7dd7cddfSDavid du Colombier 218*7dd7cddfSDavid du Colombier if(n.hi == 0 && d.hi == 0) { 219*7dd7cddfSDavid du Colombier r->hi = 0; 220*7dd7cddfSDavid du Colombier r->lo = n.lo % d.lo; 221*7dd7cddfSDavid du Colombier return; 222*7dd7cddfSDavid du Colombier } 223*7dd7cddfSDavid du Colombier dodiv(n, d, 0, r); 224*7dd7cddfSDavid du Colombier } 225*7dd7cddfSDavid du Colombier 226*7dd7cddfSDavid du Colombier static void 227*7dd7cddfSDavid du Colombier vneg(Vlong *v) 228*7dd7cddfSDavid du Colombier { 229*7dd7cddfSDavid du Colombier 230*7dd7cddfSDavid du Colombier if(v->lo == 0) { 231*7dd7cddfSDavid du Colombier v->hi = -v->hi; 232*7dd7cddfSDavid du Colombier return; 233*7dd7cddfSDavid du Colombier } 234*7dd7cddfSDavid du Colombier v->lo = -v->lo; 235*7dd7cddfSDavid du Colombier v->hi = ~v->hi; 236*7dd7cddfSDavid du Colombier } 237*7dd7cddfSDavid du Colombier 238*7dd7cddfSDavid du Colombier void 239*7dd7cddfSDavid du Colombier _divv(Vlong *q, Vlong n, Vlong d) 240*7dd7cddfSDavid du Colombier { 241*7dd7cddfSDavid du Colombier long nneg, dneg; 242*7dd7cddfSDavid du Colombier 243*7dd7cddfSDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { 244*7dd7cddfSDavid du Colombier q->lo = (long)n.lo / (long)d.lo; 245*7dd7cddfSDavid du Colombier q->hi = ((long)q->lo) >> 31; 246*7dd7cddfSDavid du Colombier return; 247*7dd7cddfSDavid du Colombier } 248*7dd7cddfSDavid du Colombier nneg = n.hi >> 31; 249*7dd7cddfSDavid du Colombier if(nneg) 250*7dd7cddfSDavid du Colombier vneg(&n); 251*7dd7cddfSDavid du Colombier dneg = d.hi >> 31; 252*7dd7cddfSDavid du Colombier if(dneg) 253*7dd7cddfSDavid du Colombier vneg(&d); 254*7dd7cddfSDavid du Colombier dodiv(n, d, q, 0); 255*7dd7cddfSDavid du Colombier if(nneg != dneg) 256*7dd7cddfSDavid du Colombier vneg(q); 257*7dd7cddfSDavid du Colombier } 258*7dd7cddfSDavid du Colombier 259*7dd7cddfSDavid du Colombier void 260*7dd7cddfSDavid du Colombier _modv(Vlong *r, Vlong n, Vlong d) 261*7dd7cddfSDavid du Colombier { 262*7dd7cddfSDavid du Colombier long nneg, dneg; 263*7dd7cddfSDavid du Colombier 264*7dd7cddfSDavid du Colombier if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) { 265*7dd7cddfSDavid du Colombier r->lo = (long)n.lo % (long)d.lo; 266*7dd7cddfSDavid du Colombier r->hi = ((long)r->lo) >> 31; 267*7dd7cddfSDavid du Colombier return; 268*7dd7cddfSDavid du Colombier } 269*7dd7cddfSDavid du Colombier nneg = n.hi >> 31; 270*7dd7cddfSDavid du Colombier if(nneg) 271*7dd7cddfSDavid du Colombier vneg(&n); 272*7dd7cddfSDavid du Colombier dneg = d.hi >> 31; 273*7dd7cddfSDavid du Colombier if(dneg) 274*7dd7cddfSDavid du Colombier vneg(&d); 275*7dd7cddfSDavid du Colombier dodiv(n, d, 0, r); 276*7dd7cddfSDavid du Colombier if(nneg) 277*7dd7cddfSDavid du Colombier vneg(r); 278*7dd7cddfSDavid du Colombier } 279*7dd7cddfSDavid du Colombier 280*7dd7cddfSDavid du Colombier void 281*7dd7cddfSDavid du Colombier _rshav(Vlong *r, Vlong a, int b) 282*7dd7cddfSDavid du Colombier { 283*7dd7cddfSDavid du Colombier long t; 284*7dd7cddfSDavid du Colombier 285*7dd7cddfSDavid du Colombier t = a.hi; 286*7dd7cddfSDavid du Colombier if(b >= 32) { 287*7dd7cddfSDavid du Colombier r->hi = t>>31; 288*7dd7cddfSDavid du Colombier if(b >= 64) { 289*7dd7cddfSDavid du Colombier /* this is illegal re C standard */ 290*7dd7cddfSDavid du Colombier r->lo = t>>31; 291*7dd7cddfSDavid du Colombier return; 292*7dd7cddfSDavid du Colombier } 293*7dd7cddfSDavid du Colombier r->lo = t >> (b-32); 294*7dd7cddfSDavid du Colombier return; 295*7dd7cddfSDavid du Colombier } 296*7dd7cddfSDavid du Colombier if(b <= 0) { 297*7dd7cddfSDavid du Colombier r->hi = t; 298*7dd7cddfSDavid du Colombier r->lo = a.lo; 299*7dd7cddfSDavid du Colombier return; 300*7dd7cddfSDavid du Colombier } 301*7dd7cddfSDavid du Colombier r->hi = t >> b; 302*7dd7cddfSDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b); 303*7dd7cddfSDavid du Colombier } 304*7dd7cddfSDavid du Colombier 305*7dd7cddfSDavid du Colombier void 306*7dd7cddfSDavid du Colombier _rshlv(Vlong *r, Vlong a, int b) 307*7dd7cddfSDavid du Colombier { 308*7dd7cddfSDavid du Colombier ulong t; 309*7dd7cddfSDavid du Colombier 310*7dd7cddfSDavid du Colombier t = a.hi; 311*7dd7cddfSDavid du Colombier if(b >= 32) { 312*7dd7cddfSDavid du Colombier r->hi = 0; 313*7dd7cddfSDavid du Colombier if(b >= 64) { 314*7dd7cddfSDavid du Colombier /* this is illegal re C standard */ 315*7dd7cddfSDavid du Colombier r->lo = 0; 316*7dd7cddfSDavid du Colombier return; 317*7dd7cddfSDavid du Colombier } 318*7dd7cddfSDavid du Colombier r->lo = t >> (b-32); 319*7dd7cddfSDavid du Colombier return; 320*7dd7cddfSDavid du Colombier } 321*7dd7cddfSDavid du Colombier if(b <= 0) { 322*7dd7cddfSDavid du Colombier r->hi = t; 323*7dd7cddfSDavid du Colombier r->lo = a.lo; 324*7dd7cddfSDavid du Colombier return; 325*7dd7cddfSDavid du Colombier } 326*7dd7cddfSDavid du Colombier r->hi = t >> b; 327*7dd7cddfSDavid du Colombier r->lo = (t << (32-b)) | (a.lo >> b); 328*7dd7cddfSDavid du Colombier } 329*7dd7cddfSDavid du Colombier 330*7dd7cddfSDavid du Colombier void 331*7dd7cddfSDavid du Colombier _lshv(Vlong *r, Vlong a, int b) 332*7dd7cddfSDavid du Colombier { 333*7dd7cddfSDavid du Colombier ulong t; 334*7dd7cddfSDavid du Colombier 335*7dd7cddfSDavid du Colombier t = a.lo; 336*7dd7cddfSDavid du Colombier if(b >= 32) { 337*7dd7cddfSDavid du Colombier r->lo = 0; 338*7dd7cddfSDavid du Colombier if(b >= 64) { 339*7dd7cddfSDavid du Colombier /* this is illegal re C standard */ 340*7dd7cddfSDavid du Colombier r->hi = 0; 341*7dd7cddfSDavid du Colombier return; 342*7dd7cddfSDavid du Colombier } 343*7dd7cddfSDavid du Colombier r->hi = t << (b-32); 344*7dd7cddfSDavid du Colombier return; 345*7dd7cddfSDavid du Colombier } 346*7dd7cddfSDavid du Colombier if(b <= 0) { 347*7dd7cddfSDavid du Colombier r->lo = t; 348*7dd7cddfSDavid du Colombier r->hi = a.hi; 349*7dd7cddfSDavid du Colombier return; 350*7dd7cddfSDavid du Colombier } 351*7dd7cddfSDavid du Colombier r->lo = t << b; 352*7dd7cddfSDavid du Colombier r->hi = (t >> (32-b)) | (a.hi << b); 353*7dd7cddfSDavid du Colombier } 354*7dd7cddfSDavid du Colombier 355*7dd7cddfSDavid du Colombier void 356*7dd7cddfSDavid du Colombier _andv(Vlong *r, Vlong a, Vlong b) 357*7dd7cddfSDavid du Colombier { 358*7dd7cddfSDavid du Colombier r->hi = a.hi & b.hi; 359*7dd7cddfSDavid du Colombier r->lo = a.lo & b.lo; 360*7dd7cddfSDavid du Colombier } 361*7dd7cddfSDavid du Colombier 362*7dd7cddfSDavid du Colombier void 363*7dd7cddfSDavid du Colombier _orv(Vlong *r, Vlong a, Vlong b) 364*7dd7cddfSDavid du Colombier { 365*7dd7cddfSDavid du Colombier r->hi = a.hi | b.hi; 366*7dd7cddfSDavid du Colombier r->lo = a.lo | b.lo; 367*7dd7cddfSDavid du Colombier } 368*7dd7cddfSDavid du Colombier 369*7dd7cddfSDavid du Colombier void 370*7dd7cddfSDavid du Colombier _xorv(Vlong *r, Vlong a, Vlong b) 371*7dd7cddfSDavid du Colombier { 372*7dd7cddfSDavid du Colombier r->hi = a.hi ^ b.hi; 373*7dd7cddfSDavid du Colombier r->lo = a.lo ^ b.lo; 374*7dd7cddfSDavid du Colombier } 375*7dd7cddfSDavid du Colombier 376*7dd7cddfSDavid du Colombier void 377*7dd7cddfSDavid du Colombier _vpp(Vlong *l, Vlong *r) 378*7dd7cddfSDavid du Colombier { 379*7dd7cddfSDavid du Colombier 380*7dd7cddfSDavid du Colombier l->hi = r->hi; 381*7dd7cddfSDavid du Colombier l->lo = r->lo; 382*7dd7cddfSDavid du Colombier r->lo++; 383*7dd7cddfSDavid du Colombier if(r->lo == 0) 384*7dd7cddfSDavid du Colombier r->hi++; 385*7dd7cddfSDavid du Colombier } 386*7dd7cddfSDavid du Colombier 387*7dd7cddfSDavid du Colombier void 388*7dd7cddfSDavid du Colombier _vmm(Vlong *l, Vlong *r) 389*7dd7cddfSDavid du Colombier { 390*7dd7cddfSDavid du Colombier 391*7dd7cddfSDavid du Colombier l->hi = r->hi; 392*7dd7cddfSDavid du Colombier l->lo = r->lo; 393*7dd7cddfSDavid du Colombier if(r->lo == 0) 394*7dd7cddfSDavid du Colombier r->hi--; 395*7dd7cddfSDavid du Colombier r->lo--; 396*7dd7cddfSDavid du Colombier } 397*7dd7cddfSDavid du Colombier 398*7dd7cddfSDavid du Colombier void 399*7dd7cddfSDavid du Colombier _ppv(Vlong *l, Vlong *r) 400*7dd7cddfSDavid du Colombier { 401*7dd7cddfSDavid du Colombier 402*7dd7cddfSDavid du Colombier r->lo++; 403*7dd7cddfSDavid du Colombier if(r->lo == 0) 404*7dd7cddfSDavid du Colombier r->hi++; 405*7dd7cddfSDavid du Colombier l->hi = r->hi; 406*7dd7cddfSDavid du Colombier l->lo = r->lo; 407*7dd7cddfSDavid du Colombier } 408*7dd7cddfSDavid du Colombier 409*7dd7cddfSDavid du Colombier void 410*7dd7cddfSDavid du Colombier _mmv(Vlong *l, Vlong *r) 411*7dd7cddfSDavid du Colombier { 412*7dd7cddfSDavid du Colombier 413*7dd7cddfSDavid du Colombier if(r->lo == 0) 414*7dd7cddfSDavid du Colombier r->hi--; 415*7dd7cddfSDavid du Colombier r->lo--; 416*7dd7cddfSDavid du Colombier l->hi = r->hi; 417*7dd7cddfSDavid du Colombier l->lo = r->lo; 418*7dd7cddfSDavid du Colombier } 419*7dd7cddfSDavid du Colombier 420*7dd7cddfSDavid du Colombier void 421*7dd7cddfSDavid du Colombier _vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv) 422*7dd7cddfSDavid du Colombier { 423*7dd7cddfSDavid du Colombier Vlong t, u; 424*7dd7cddfSDavid du Colombier 425*7dd7cddfSDavid du Colombier u = *ret; 426*7dd7cddfSDavid du Colombier switch(type) { 427*7dd7cddfSDavid du Colombier default: 428*7dd7cddfSDavid du Colombier abort(); 429*7dd7cddfSDavid du Colombier break; 430*7dd7cddfSDavid du Colombier 431*7dd7cddfSDavid du Colombier case 1: /* schar */ 432*7dd7cddfSDavid du Colombier t.lo = *(schar*)lv; 433*7dd7cddfSDavid du Colombier t.hi = t.lo >> 31; 434*7dd7cddfSDavid du Colombier fn(&u, t, rv); 435*7dd7cddfSDavid du Colombier *(schar*)lv = u.lo; 436*7dd7cddfSDavid du Colombier break; 437*7dd7cddfSDavid du Colombier 438*7dd7cddfSDavid du Colombier case 2: /* uchar */ 439*7dd7cddfSDavid du Colombier t.lo = *(uchar*)lv; 440*7dd7cddfSDavid du Colombier t.hi = 0; 441*7dd7cddfSDavid du Colombier fn(&u, t, rv); 442*7dd7cddfSDavid du Colombier *(uchar*)lv = u.lo; 443*7dd7cddfSDavid du Colombier break; 444*7dd7cddfSDavid du Colombier 445*7dd7cddfSDavid du Colombier case 3: /* short */ 446*7dd7cddfSDavid du Colombier t.lo = *(short*)lv; 447*7dd7cddfSDavid du Colombier t.hi = t.lo >> 31; 448*7dd7cddfSDavid du Colombier fn(&u, t, rv); 449*7dd7cddfSDavid du Colombier *(short*)lv = u.lo; 450*7dd7cddfSDavid du Colombier break; 451*7dd7cddfSDavid du Colombier 452*7dd7cddfSDavid du Colombier case 4: /* ushort */ 453*7dd7cddfSDavid du Colombier t.lo = *(ushort*)lv; 454*7dd7cddfSDavid du Colombier t.hi = 0; 455*7dd7cddfSDavid du Colombier fn(&u, t, rv); 456*7dd7cddfSDavid du Colombier *(ushort*)lv = u.lo; 457*7dd7cddfSDavid du Colombier break; 458*7dd7cddfSDavid du Colombier 459*7dd7cddfSDavid du Colombier case 9: /* int */ 460*7dd7cddfSDavid du Colombier t.lo = *(int*)lv; 461*7dd7cddfSDavid du Colombier t.hi = t.lo >> 31; 462*7dd7cddfSDavid du Colombier fn(&u, t, rv); 463*7dd7cddfSDavid du Colombier *(int*)lv = u.lo; 464*7dd7cddfSDavid du Colombier break; 465*7dd7cddfSDavid du Colombier 466*7dd7cddfSDavid du Colombier case 10: /* uint */ 467*7dd7cddfSDavid du Colombier t.lo = *(uint*)lv; 468*7dd7cddfSDavid du Colombier t.hi = 0; 469*7dd7cddfSDavid du Colombier fn(&u, t, rv); 470*7dd7cddfSDavid du Colombier *(uint*)lv = u.lo; 471*7dd7cddfSDavid du Colombier break; 472*7dd7cddfSDavid du Colombier 473*7dd7cddfSDavid du Colombier case 5: /* long */ 474*7dd7cddfSDavid du Colombier t.lo = *(long*)lv; 475*7dd7cddfSDavid du Colombier t.hi = t.lo >> 31; 476*7dd7cddfSDavid du Colombier fn(&u, t, rv); 477*7dd7cddfSDavid du Colombier *(long*)lv = u.lo; 478*7dd7cddfSDavid du Colombier break; 479*7dd7cddfSDavid du Colombier 480*7dd7cddfSDavid du Colombier case 6: /* ulong */ 481*7dd7cddfSDavid du Colombier t.lo = *(ulong*)lv; 482*7dd7cddfSDavid du Colombier t.hi = 0; 483*7dd7cddfSDavid du Colombier fn(&u, t, rv); 484*7dd7cddfSDavid du Colombier *(ulong*)lv = u.lo; 485*7dd7cddfSDavid du Colombier break; 486*7dd7cddfSDavid du Colombier 487*7dd7cddfSDavid du Colombier case 7: /* vlong */ 488*7dd7cddfSDavid du Colombier case 8: /* uvlong */ 489*7dd7cddfSDavid du Colombier fn(&u, *(Vlong*)lv, rv); 490*7dd7cddfSDavid du Colombier *(Vlong*)lv = u; 491*7dd7cddfSDavid du Colombier break; 492*7dd7cddfSDavid du Colombier } 493*7dd7cddfSDavid du Colombier *ret = u; 494*7dd7cddfSDavid du Colombier } 495*7dd7cddfSDavid du Colombier 496*7dd7cddfSDavid du Colombier void 497*7dd7cddfSDavid du Colombier _p2v(Vlong *ret, void *p) 498*7dd7cddfSDavid du Colombier { 499*7dd7cddfSDavid du Colombier long t; 500*7dd7cddfSDavid du Colombier 501*7dd7cddfSDavid du Colombier t = (ulong)p; 502*7dd7cddfSDavid du Colombier ret->lo = t; 503*7dd7cddfSDavid du Colombier ret->hi = 0; 504*7dd7cddfSDavid du Colombier } 505*7dd7cddfSDavid du Colombier 506*7dd7cddfSDavid du Colombier void 507*7dd7cddfSDavid du Colombier _sl2v(Vlong *ret, long sl) 508*7dd7cddfSDavid du Colombier { 509*7dd7cddfSDavid du Colombier long t; 510*7dd7cddfSDavid du Colombier 511*7dd7cddfSDavid du Colombier t = sl; 512*7dd7cddfSDavid du Colombier ret->lo = t; 513*7dd7cddfSDavid du Colombier ret->hi = t >> 31; 514*7dd7cddfSDavid du Colombier } 515*7dd7cddfSDavid du Colombier 516*7dd7cddfSDavid du Colombier void 517*7dd7cddfSDavid du Colombier _ul2v(Vlong *ret, ulong ul) 518*7dd7cddfSDavid du Colombier { 519*7dd7cddfSDavid du Colombier long t; 520*7dd7cddfSDavid du Colombier 521*7dd7cddfSDavid du Colombier t = ul; 522*7dd7cddfSDavid du Colombier ret->lo = t; 523*7dd7cddfSDavid du Colombier ret->hi = 0; 524*7dd7cddfSDavid du Colombier } 525*7dd7cddfSDavid du Colombier 526*7dd7cddfSDavid du Colombier void 527*7dd7cddfSDavid du Colombier _si2v(Vlong *ret, int si) 528*7dd7cddfSDavid du Colombier { 529*7dd7cddfSDavid du Colombier long t; 530*7dd7cddfSDavid du Colombier 531*7dd7cddfSDavid du Colombier t = si; 532*7dd7cddfSDavid du Colombier ret->lo = t; 533*7dd7cddfSDavid du Colombier ret->hi = t >> 31; 534*7dd7cddfSDavid du Colombier } 535*7dd7cddfSDavid du Colombier 536*7dd7cddfSDavid du Colombier void 537*7dd7cddfSDavid du Colombier _ui2v(Vlong *ret, uint ui) 538*7dd7cddfSDavid du Colombier { 539*7dd7cddfSDavid du Colombier long t; 540*7dd7cddfSDavid du Colombier 541*7dd7cddfSDavid du Colombier t = ui; 542*7dd7cddfSDavid du Colombier ret->lo = t; 543*7dd7cddfSDavid du Colombier ret->hi = 0; 544*7dd7cddfSDavid du Colombier } 545*7dd7cddfSDavid du Colombier 546*7dd7cddfSDavid du Colombier void 547*7dd7cddfSDavid du Colombier _sh2v(Vlong *ret, long sh) 548*7dd7cddfSDavid du Colombier { 549*7dd7cddfSDavid du Colombier long t; 550*7dd7cddfSDavid du Colombier 551*7dd7cddfSDavid du Colombier t = (sh << 16) >> 16; 552*7dd7cddfSDavid du Colombier ret->lo = t; 553*7dd7cddfSDavid du Colombier ret->hi = t >> 31; 554*7dd7cddfSDavid du Colombier } 555*7dd7cddfSDavid du Colombier 556*7dd7cddfSDavid du Colombier void 557*7dd7cddfSDavid du Colombier _uh2v(Vlong *ret, ulong ul) 558*7dd7cddfSDavid du Colombier { 559*7dd7cddfSDavid du Colombier long t; 560*7dd7cddfSDavid du Colombier 561*7dd7cddfSDavid du Colombier t = ul & 0xffff; 562*7dd7cddfSDavid du Colombier ret->lo = t; 563*7dd7cddfSDavid du Colombier ret->hi = 0; 564*7dd7cddfSDavid du Colombier } 565*7dd7cddfSDavid du Colombier 566*7dd7cddfSDavid du Colombier void 567*7dd7cddfSDavid du Colombier _sc2v(Vlong *ret, long uc) 568*7dd7cddfSDavid du Colombier { 569*7dd7cddfSDavid du Colombier long t; 570*7dd7cddfSDavid du Colombier 571*7dd7cddfSDavid du Colombier t = (uc << 24) >> 24; 572*7dd7cddfSDavid du Colombier ret->lo = t; 573*7dd7cddfSDavid du Colombier ret->hi = t >> 31; 574*7dd7cddfSDavid du Colombier } 575*7dd7cddfSDavid du Colombier 576*7dd7cddfSDavid du Colombier void 577*7dd7cddfSDavid du Colombier _uc2v(Vlong *ret, ulong ul) 578*7dd7cddfSDavid du Colombier { 579*7dd7cddfSDavid du Colombier long t; 580*7dd7cddfSDavid du Colombier 581*7dd7cddfSDavid du Colombier t = ul & 0xff; 582*7dd7cddfSDavid du Colombier ret->lo = t; 583*7dd7cddfSDavid du Colombier ret->hi = 0; 584*7dd7cddfSDavid du Colombier } 585*7dd7cddfSDavid du Colombier 586*7dd7cddfSDavid du Colombier long 587*7dd7cddfSDavid du Colombier _v2sc(Vlong rv) 588*7dd7cddfSDavid du Colombier { 589*7dd7cddfSDavid du Colombier long t; 590*7dd7cddfSDavid du Colombier 591*7dd7cddfSDavid du Colombier t = rv.lo & 0xff; 592*7dd7cddfSDavid du Colombier return (t << 24) >> 24; 593*7dd7cddfSDavid du Colombier } 594*7dd7cddfSDavid du Colombier 595*7dd7cddfSDavid du Colombier long 596*7dd7cddfSDavid du Colombier _v2uc(Vlong rv) 597*7dd7cddfSDavid du Colombier { 598*7dd7cddfSDavid du Colombier 599*7dd7cddfSDavid du Colombier return rv.lo & 0xff; 600*7dd7cddfSDavid du Colombier } 601*7dd7cddfSDavid du Colombier 602*7dd7cddfSDavid du Colombier long 603*7dd7cddfSDavid du Colombier _v2sh(Vlong rv) 604*7dd7cddfSDavid du Colombier { 605*7dd7cddfSDavid du Colombier long t; 606*7dd7cddfSDavid du Colombier 607*7dd7cddfSDavid du Colombier t = rv.lo & 0xffff; 608*7dd7cddfSDavid du Colombier return (t << 16) >> 16; 609*7dd7cddfSDavid du Colombier } 610*7dd7cddfSDavid du Colombier 611*7dd7cddfSDavid du Colombier long 612*7dd7cddfSDavid du Colombier _v2uh(Vlong rv) 613*7dd7cddfSDavid du Colombier { 614*7dd7cddfSDavid du Colombier 615*7dd7cddfSDavid du Colombier return rv.lo & 0xffff; 616*7dd7cddfSDavid du Colombier } 617*7dd7cddfSDavid du Colombier 618*7dd7cddfSDavid du Colombier long 619*7dd7cddfSDavid du Colombier _v2sl(Vlong rv) 620*7dd7cddfSDavid du Colombier { 621*7dd7cddfSDavid du Colombier 622*7dd7cddfSDavid du Colombier return rv.lo; 623*7dd7cddfSDavid du Colombier } 624*7dd7cddfSDavid du Colombier 625*7dd7cddfSDavid du Colombier long 626*7dd7cddfSDavid du Colombier _v2ul(Vlong rv) 627*7dd7cddfSDavid du Colombier { 628*7dd7cddfSDavid du Colombier 629*7dd7cddfSDavid du Colombier return rv.lo; 630*7dd7cddfSDavid du Colombier } 631*7dd7cddfSDavid du Colombier 632*7dd7cddfSDavid du Colombier long 633*7dd7cddfSDavid du Colombier _v2si(Vlong rv) 634*7dd7cddfSDavid du Colombier { 635*7dd7cddfSDavid du Colombier 636*7dd7cddfSDavid du Colombier return rv.lo; 637*7dd7cddfSDavid du Colombier } 638*7dd7cddfSDavid du Colombier 639*7dd7cddfSDavid du Colombier long 640*7dd7cddfSDavid du Colombier _v2ui(Vlong rv) 641*7dd7cddfSDavid du Colombier { 642*7dd7cddfSDavid du Colombier 643*7dd7cddfSDavid du Colombier return rv.lo; 644*7dd7cddfSDavid du Colombier } 645*7dd7cddfSDavid du Colombier 646*7dd7cddfSDavid du Colombier int 647*7dd7cddfSDavid du Colombier _testv(Vlong rv) 648*7dd7cddfSDavid du Colombier { 649*7dd7cddfSDavid du Colombier return rv.lo || rv.hi; 650*7dd7cddfSDavid du Colombier } 651*7dd7cddfSDavid du Colombier 652*7dd7cddfSDavid du Colombier int 653*7dd7cddfSDavid du Colombier _eqv(Vlong lv, Vlong rv) 654*7dd7cddfSDavid du Colombier { 655*7dd7cddfSDavid du Colombier return lv.lo == rv.lo && lv.hi == rv.hi; 656*7dd7cddfSDavid du Colombier } 657*7dd7cddfSDavid du Colombier 658*7dd7cddfSDavid du Colombier int 659*7dd7cddfSDavid du Colombier _nev(Vlong lv, Vlong rv) 660*7dd7cddfSDavid du Colombier { 661*7dd7cddfSDavid du Colombier return lv.lo != rv.lo || lv.hi != rv.hi; 662*7dd7cddfSDavid du Colombier } 663*7dd7cddfSDavid du Colombier 664*7dd7cddfSDavid du Colombier int 665*7dd7cddfSDavid du Colombier _ltv(Vlong lv, Vlong rv) 666*7dd7cddfSDavid du Colombier { 667*7dd7cddfSDavid du Colombier return (long)lv.hi < (long)rv.hi || 668*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo); 669*7dd7cddfSDavid du Colombier } 670*7dd7cddfSDavid du Colombier 671*7dd7cddfSDavid du Colombier int 672*7dd7cddfSDavid du Colombier _lev(Vlong lv, Vlong rv) 673*7dd7cddfSDavid du Colombier { 674*7dd7cddfSDavid du Colombier return (long)lv.hi < (long)rv.hi || 675*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo); 676*7dd7cddfSDavid du Colombier } 677*7dd7cddfSDavid du Colombier 678*7dd7cddfSDavid du Colombier int 679*7dd7cddfSDavid du Colombier _gtv(Vlong lv, Vlong rv) 680*7dd7cddfSDavid du Colombier { 681*7dd7cddfSDavid du Colombier return (long)lv.hi > (long)rv.hi || 682*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo); 683*7dd7cddfSDavid du Colombier } 684*7dd7cddfSDavid du Colombier 685*7dd7cddfSDavid du Colombier int 686*7dd7cddfSDavid du Colombier _gev(Vlong lv, Vlong rv) 687*7dd7cddfSDavid du Colombier { 688*7dd7cddfSDavid du Colombier return (long)lv.hi > (long)rv.hi || 689*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo); 690*7dd7cddfSDavid du Colombier } 691*7dd7cddfSDavid du Colombier 692*7dd7cddfSDavid du Colombier int 693*7dd7cddfSDavid du Colombier _lov(Vlong lv, Vlong rv) 694*7dd7cddfSDavid du Colombier { 695*7dd7cddfSDavid du Colombier return lv.hi < rv.hi || 696*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo < rv.lo); 697*7dd7cddfSDavid du Colombier } 698*7dd7cddfSDavid du Colombier 699*7dd7cddfSDavid du Colombier int 700*7dd7cddfSDavid du Colombier _lsv(Vlong lv, Vlong rv) 701*7dd7cddfSDavid du Colombier { 702*7dd7cddfSDavid du Colombier return lv.hi < rv.hi || 703*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo <= rv.lo); 704*7dd7cddfSDavid du Colombier } 705*7dd7cddfSDavid du Colombier 706*7dd7cddfSDavid du Colombier int 707*7dd7cddfSDavid du Colombier _hiv(Vlong lv, Vlong rv) 708*7dd7cddfSDavid du Colombier { 709*7dd7cddfSDavid du Colombier return lv.hi > rv.hi || 710*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo > rv.lo); 711*7dd7cddfSDavid du Colombier } 712*7dd7cddfSDavid du Colombier 713*7dd7cddfSDavid du Colombier int 714*7dd7cddfSDavid du Colombier _hsv(Vlong lv, Vlong rv) 715*7dd7cddfSDavid du Colombier { 716*7dd7cddfSDavid du Colombier return lv.hi > rv.hi || 717*7dd7cddfSDavid du Colombier (lv.hi == rv.hi && lv.lo >= rv.lo); 718*7dd7cddfSDavid du Colombier } 719