⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 vlrt.c

📁 著名操作系统Plan 9的第三版的部分核心源代码。现在很难找到了。Plan 9是bell实验室开发的Unix后继者。
💻 C
字号:
typedef	unsigned long	ulong;typedef	unsigned int	uint;typedef	unsigned short	ushort;typedef	unsigned char	uchar;typedef	signed char	schar;#define	SIGN(n)	(1UL<<(n-1))typedef	struct	Vlong	Vlong;struct	Vlong{	union	{		struct		{			ulong	lo;			ulong	hi;		};		struct		{			ushort	lols;			ushort	loms;			ushort	hils;			ushort	hims;		};	};};void	abort(void);void_subv(Vlong *r, Vlong a, Vlong b){	ulong lo, hi;	lo = a.lo - b.lo;	hi = a.hi - b.hi;	if(lo > a.lo)		hi--;	r->lo = lo;	r->hi = hi;}void_d2v(Vlong *y, double d){	union { double d; struct Vlong; } x;	ulong xhi, xlo, ylo, yhi;	int sh;	x.d = d;	xhi = (x.hi & 0xfffff) | 0x100000;	xlo = x.lo;	sh = 1075 - ((x.hi >> 20) & 0x7ff);	ylo = 0;	yhi = 0;	if(sh >= 0) {		/* v = (hi||lo) >> sh */		if(sh < 32) {			if(sh == 0) {				ylo = xlo;				yhi = xhi;			} else {				ylo = (xlo >> sh) | (xhi << (32-sh));				yhi = xhi >> sh;			}		} else {			if(sh == 32) {				ylo = xhi;			} else			if(sh < 64) {				ylo = xhi >> (sh-32);			}		}	} else {		/* v = (hi||lo) << -sh */		sh = -sh;		if(sh <= 10) {			ylo = xlo << sh;			yhi = (xhi << sh) | (xlo >> (32-sh));		} else {			/* overflow */			yhi = d;	/* causes something awful */		}	}	if(x.hi & SIGN(32)) {		if(ylo != 0) {			ylo = -ylo;			yhi = ~yhi;		} else			yhi = -yhi;	}	y->hi = yhi;	y->lo = ylo;}void_f2v(Vlong *y, float f){	_d2v(y, f);}double_v2d(Vlong x){	if(x.hi & SIGN(32)) {		if(x.lo) {			x.lo = -x.lo;			x.hi = ~x.hi;		} else			x.hi = -x.hi;		return -((long)x.hi*4294967296. + x.lo);	}	return (long)x.hi*4294967296. + x.lo;}float_v2f(Vlong x){	return _v2d(x);}ulong	_div64by32(Vlong, ulong, ulong*);void	_mul64by32(Vlong*, Vlong, ulong);static voiddodiv(Vlong num, Vlong den, Vlong *qp, Vlong *rp){	ulong n;	Vlong x, q, r;	if(den.hi > num.hi || (den.hi == num.hi && den.lo > num.lo)){		if(qp) {			qp->hi = 0;			qp->lo = 0;		}		if(rp) {			rp->hi = num.hi;			rp->lo = num.lo;		}		return;	}	if(den.hi != 0){		q.hi = 0;		n = num.hi/den.hi;		_mul64by32(&x, den, n);		if(x.hi > num.hi || (x.hi == num.hi && x.lo > num.lo)){			n--;			_mul64by32(&x, den, n);		}		q.lo = n;		_subv(&r, num, x);	} else {		if(num.hi >= den.lo){			q.hi = n = num.hi/den.lo;			num.hi -= den.lo*n;		} else {			q.hi = 0;		}		q.lo = _div64by32(num, den.lo, &r.lo);		r.hi = 0;	}	if(qp) {		qp->lo = q.lo;		qp->hi = q.hi;	}	if(rp) {		rp->lo = r.lo;		rp->hi = r.hi;	}}void_divvu(Vlong *q, Vlong n, Vlong d){	if(n.hi == 0 && d.hi == 0) {		q->hi = 0;		q->lo = n.lo / d.lo;		return;	}	dodiv(n, d, q, 0);}void_modvu(Vlong *r, Vlong n, Vlong d){	if(n.hi == 0 && d.hi == 0) {		r->hi = 0;		r->lo = n.lo % d.lo;		return;	}	dodiv(n, d, 0, r);}static voidvneg(Vlong *v){	if(v->lo == 0) {		v->hi = -v->hi;		return;	}	v->lo = -v->lo;	v->hi = ~v->hi;}void_divv(Vlong *q, Vlong n, Vlong d){	long nneg, dneg;	if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {		q->lo = (long)n.lo / (long)d.lo;		q->hi = ((long)q->lo) >> 31;		return;	}	nneg = n.hi >> 31;	if(nneg)		vneg(&n);	dneg = d.hi >> 31;	if(dneg)		vneg(&d);	dodiv(n, d, q, 0);	if(nneg != dneg)		vneg(q);}void_modv(Vlong *r, Vlong n, Vlong d){	long nneg, dneg;	if(n.hi == (((long)n.lo)>>31) && d.hi == (((long)d.lo)>>31)) {		r->lo = (long)n.lo % (long)d.lo;		r->hi = ((long)r->lo) >> 31;		return;	}	nneg = n.hi >> 31;	if(nneg)		vneg(&n);	dneg = d.hi >> 31;	if(dneg)		vneg(&d);	dodiv(n, d, 0, r);	if(nneg)		vneg(r);}void_rshav(Vlong *r, Vlong a, int b){	long t;	t = a.hi;	if(b >= 32) {		r->hi = t>>31;		if(b >= 64) {			/* this is illegal re C standard */			r->lo = t>>31;			return;		}		r->lo = t >> (b-32);		return;	}	if(b <= 0) {		r->hi = t;		r->lo = a.lo;		return;	}	r->hi = t >> b;	r->lo = (t << (32-b)) | (a.lo >> b);}void_rshlv(Vlong *r, Vlong a, int b){	ulong t;	t = a.hi;	if(b >= 32) {		r->hi = 0;		if(b >= 64) {			/* this is illegal re C standard */			r->lo = 0;			return;		}		r->lo = t >> (b-32);		return;	}	if(b <= 0) {		r->hi = t;		r->lo = a.lo;		return;	}	r->hi = t >> b;	r->lo = (t << (32-b)) | (a.lo >> b);}void_lshv(Vlong *r, Vlong a, int b){	ulong t;	t = a.lo;	if(b >= 32) {		r->lo = 0;		if(b >= 64) {			/* this is illegal re C standard */			r->hi = 0;			return;		}		r->hi = t << (b-32);		return;	}	if(b <= 0) {		r->lo = t;		r->hi = a.hi;		return;	}	r->lo = t << b;	r->hi = (t >> (32-b)) | (a.hi << b);}void_andv(Vlong *r, Vlong a, Vlong b){	r->hi = a.hi & b.hi;	r->lo = a.lo & b.lo;}void_orv(Vlong *r, Vlong a, Vlong b){	r->hi = a.hi | b.hi;	r->lo = a.lo | b.lo;}void_xorv(Vlong *r, Vlong a, Vlong b){	r->hi = a.hi ^ b.hi;	r->lo = a.lo ^ b.lo;}void_vpp(Vlong *l, Vlong *r){	l->hi = r->hi;	l->lo = r->lo;	r->lo++;	if(r->lo == 0)		r->hi++;}void_vmm(Vlong *l, Vlong *r){	l->hi = r->hi;	l->lo = r->lo;	if(r->lo == 0)		r->hi--;	r->lo--;}void_ppv(Vlong *l, Vlong *r){	r->lo++;	if(r->lo == 0)		r->hi++;	l->hi = r->hi;	l->lo = r->lo;}void_mmv(Vlong *l, Vlong *r){	if(r->lo == 0)		r->hi--;	r->lo--;	l->hi = r->hi;	l->lo = r->lo;}void_vasop(Vlong *ret, void *lv, void fn(Vlong*, Vlong, Vlong), int type, Vlong rv){	Vlong t, u;	u.lo = 0;	u.hi = 0;	switch(type) {	default:		abort();		break;	case 1:	/* schar */		t.lo = *(schar*)lv;		t.hi = t.lo >> 31;		fn(&u, t, rv);		*(schar*)lv = u.lo;		break;	case 2:	/* uchar */		t.lo = *(uchar*)lv;		t.hi = 0;		fn(&u, t, rv);		*(uchar*)lv = u.lo;		break;	case 3:	/* short */		t.lo = *(short*)lv;		t.hi = t.lo >> 31;		fn(&u, t, rv);		*(short*)lv = u.lo;		break;	case 4:	/* ushort */		t.lo = *(ushort*)lv;		t.hi = 0;		fn(&u, t, rv);		*(ushort*)lv = u.lo;		break;	case 9:	/* int */		t.lo = *(int*)lv;		t.hi = t.lo >> 31;		fn(&u, t, rv);		*(int*)lv = u.lo;		break;	case 10:	/* uint */		t.lo = *(uint*)lv;		t.hi = 0;		fn(&u, t, rv);		*(uint*)lv = u.lo;		break;	case 5:	/* long */		t.lo = *(long*)lv;		t.hi = t.lo >> 31;		fn(&u, t, rv);		*(long*)lv = u.lo;		break;	case 6:	/* ulong */		t.lo = *(ulong*)lv;		t.hi = 0;		fn(&u, t, rv);		*(ulong*)lv = u.lo;		break;	case 7:	/* vlong */	case 8:	/* uvlong */		fn(&u, *(Vlong*)lv, rv);		*(Vlong*)lv = u;		break;	}	*ret = u;}void_p2v(Vlong *ret, void *p){	long t;	t = (ulong)p;	ret->lo = t;	ret->hi = 0;}void_sl2v(Vlong *ret, long sl){	long t;	t = sl;	ret->lo = t;	ret->hi = t >> 31;}void_ul2v(Vlong *ret, ulong ul){	long t;	t = ul;	ret->lo = t;	ret->hi = 0;}void_si2v(Vlong *ret, int si){	long t;	t = si;	ret->lo = t;	ret->hi = t >> 31;}void_ui2v(Vlong *ret, uint ui){	long t;	t = ui;	ret->lo = t;	ret->hi = 0;}void_sh2v(Vlong *ret, long sh){	long t;	t = (sh << 16) >> 16;	ret->lo = t;	ret->hi = t >> 31;}void_uh2v(Vlong *ret, ulong ul){	long t;	t = ul & 0xffff;	ret->lo = t;	ret->hi = 0;}void_sc2v(Vlong *ret, long uc){	long t;	t = (uc << 24) >> 24;	ret->lo = t;	ret->hi = t >> 31;}void_uc2v(Vlong *ret, ulong ul){	long t;	t = ul & 0xff;	ret->lo = t;	ret->hi = 0;}long_v2sc(Vlong rv){	long t;	t = rv.lo & 0xff;	return (t << 24) >> 24;}long_v2uc(Vlong rv){	return rv.lo & 0xff;}long_v2sh(Vlong rv){	long t;	t = rv.lo & 0xffff;	return (t << 16) >> 16;}long_v2uh(Vlong rv){	return rv.lo & 0xffff;}long_v2sl(Vlong rv){	return rv.lo;}long_v2ul(Vlong rv){	return rv.lo;}long_v2si(Vlong rv){	return rv.lo;}long_v2ui(Vlong rv){	return rv.lo;}int_testv(Vlong rv){	return rv.lo || rv.hi;}int_eqv(Vlong lv, Vlong rv){	return lv.lo == rv.lo && lv.hi == rv.hi;}int_nev(Vlong lv, Vlong rv){	return lv.lo != rv.lo || lv.hi != rv.hi;}int_ltv(Vlong lv, Vlong rv){	return (long)lv.hi < (long)rv.hi || 		(lv.hi == rv.hi && lv.lo < rv.lo);}int_lev(Vlong lv, Vlong rv){	return (long)lv.hi < (long)rv.hi || 		(lv.hi == rv.hi && lv.lo <= rv.lo);}int_gtv(Vlong lv, Vlong rv){	return (long)lv.hi > (long)rv.hi || 		(lv.hi == rv.hi && lv.lo > rv.lo);}int_gev(Vlong lv, Vlong rv){	return (long)lv.hi > (long)rv.hi || 		(lv.hi == rv.hi && lv.lo >= rv.lo);}int_lov(Vlong lv, Vlong rv){	return lv.hi < rv.hi || 		(lv.hi == rv.hi && lv.lo < rv.lo);}int_lsv(Vlong lv, Vlong rv){	return lv.hi < rv.hi || 		(lv.hi == rv.hi && lv.lo <= rv.lo);}int_hiv(Vlong lv, Vlong rv){	return lv.hi > rv.hi || 		(lv.hi == rv.hi && lv.lo > rv.lo);}int_hsv(Vlong lv, Vlong rv){	return lv.hi > rv.hi || 		(lv.hi == rv.hi && lv.lo >= rv.lo);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -