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

📄 interp.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
			tl = *pc.cp++;		/* tl has shift amount */			tl1 = pop4();			tl1 = (tl1 - *pc.sp++) << tl;			tcp = popaddr();			pushaddr(tcp + tl1);			continue;		case O_INX2:			tl = *pc.cp++;		/* tl has element size */			if (tl == 0)				tl = *pc.usp++;			tl1 = pop2();		/* index */			tl2 = *pc.sp++;			tcp = popaddr();			pushaddr(tcp + (tl1 - tl2) * tl);			tl = *pc.usp++;			if (_runtst)				SUBSC(tl1, tl2, tl); /* range check */			continue;		case O_INX4:			tl = *pc.cp++;		/* tl has element size */			if (tl == 0)				tl = *pc.usp++;			tl1 = pop4();		/* index */			tl2 = *pc.sp++;			tcp = popaddr();			pushaddr(tcp + (tl1 - tl2) * tl);			tl = *pc.usp++;			if (_runtst)				SUBSC(tl1, tl2, tl); /* range check */			continue;		case O_VINX2:			pc.cp++;			tl = pop2();		/* tl has element size */			tl1 = pop2();		/* upper bound */			tl2 = pop2();		/* lower bound */			tl3 = pop2();		/* index */			tcp = popaddr();			pushaddr(tcp + (tl3 - tl2) * tl);			if (_runtst)				SUBSC(tl3, tl2, tl1); /* range check */			continue;		case O_VINX24:			pc.cp++;			tl = pop2();		/* tl has element size */			tl1 = pop2();		/* upper bound */			tl2 = pop2();		/* lower bound */			tl3 = pop4();		/* index */			tcp = popaddr();			pushaddr(tcp + (tl3 - tl2) * tl);			if (_runtst)				SUBSC(tl3, tl2, tl1); /* range check */			continue;		case O_VINX42:			pc.cp++;			tl = pop4();		/* tl has element size */			tl1 = pop4();		/* upper bound */			tl2 = pop4();		/* lower bound */			tl3 = pop2();		/* index */			tcp = popaddr();			pushaddr(tcp + (tl3 - tl2) * tl);			if (_runtst)				SUBSC(tl3, tl2, tl1); /* range check */			continue;		case O_VINX4:			pc.cp++;			tl = pop4();		/* tl has element size */			tl1 = pop4();		/* upper bound */			tl2 = pop4();		/* lower bound */			tl3 = pop4();		/* index */			tcp = popaddr();			pushaddr(tcp + (tl3 - tl2) * tl);			if (_runtst)				SUBSC(tl3, tl2, tl1); /* range check */			continue;		case O_OFF:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.usp++;			tcp = popaddr();			pushaddr(tcp + tl);			continue;		case O_NIL:			pc.cp++;			tcp = popaddr();			NIL(tcp);			pushaddr(tcp);			continue;		case O_ADD2:			pc.cp++;			tl = pop2();			tl1 = pop2();			push4(tl1 + tl);			continue;		case O_ADD4:			pc.cp++;			tl = pop4();			tl1 = pop4();			push4(tl1 + tl);			continue;		case O_ADD24:			pc.cp++;			tl = pop2();			tl1 = pop4();			push4(tl1 + tl);			continue;		case O_ADD42:			pc.cp++;			tl = pop4();			tl1 = pop2();			push4(tl1 + tl);			continue;		case O_ADD28:			pc.cp++;			tl = pop2();			td = pop8();			push8(td + tl);			continue;		case O_ADD48:			pc.cp++;			tl = pop4();			td = pop8();			push8(td + tl);			continue;		case O_ADD82:			pc.cp++;			td = pop8();			td1 = pop2();			push8(td1 + td);			continue;		case O_ADD84:			pc.cp++;			td = pop8();			td1 = pop4();			push8(td1 + td);			continue;		case O_SUB2:			pc.cp++;			tl = pop2();			tl1 = pop2();			push4(tl1 - tl);			continue;		case O_SUB4:			pc.cp++;			tl = pop4();			tl1 = pop4();			push4(tl1 - tl);			continue;		case O_SUB24:			pc.cp++;			tl = pop2();			tl1 = pop4();			push4(tl1 - tl);			continue;		case O_SUB42:			pc.cp++;			tl = pop4();			tl1 = pop2();			push4(tl1 - tl);			continue;		case O_SUB28:			pc.cp++;			tl = pop2();			td = pop8();			push8(td - tl);			continue;		case O_SUB48:			pc.cp++;			tl = pop4();			td = pop8();			push8(td - tl);			continue;		case O_SUB82:			pc.cp++;			td = pop8();			td1 = pop2();			push8(td1 - td);			continue;		case O_SUB84:			pc.cp++;			td = pop8();			td1 = pop4();			push8(td1 - td);			continue;		case O_MUL2:			pc.cp++;			tl = pop2();			tl1 = pop2();			push4(tl1 * tl);			continue;		case O_MUL4:			pc.cp++;			tl = pop4();			tl1 = pop4();			push4(tl1 * tl);			continue;		case O_MUL24:			pc.cp++;			tl = pop2();			tl1 = pop4();			push4(tl1 * tl);			continue;		case O_MUL42:			pc.cp++;			tl = pop4();			tl1 = pop2();			push4(tl1 * tl);			continue;		case O_MUL28:			pc.cp++;			tl = pop2();			td = pop8();			push8(td * tl);			continue;		case O_MUL48:			pc.cp++;			tl = pop4();			td = pop8();			push8(td * tl);			continue;		case O_MUL82:			pc.cp++;			td = pop8();			td1 = pop2();			push8(td1 * td);			continue;		case O_MUL84:			pc.cp++;			td = pop8();			td1 = pop4();			push8(td1 * td);			continue;		case O_ABS2:		case O_ABS4:			pc.cp++;			tl = pop4();			push4(tl >= 0 ? tl : -tl);			continue;		case O_ABS8:			pc.cp++;			td = pop8();			push8(td >= 0.0 ? td : -td);			continue;		case O_NEG2:			pc.cp++;			ts = -pop2();			push4((long)ts);			continue;		case O_NEG4:			pc.cp++;			tl = -pop4();			push4(tl);			continue;		case O_NEG8:			pc.cp++;			td = -pop8();			push8(td);			continue;		case O_DIV2:			pc.cp++;			tl = pop2();			tl1 = pop2();			push4(tl1 / tl);			continue;		case O_DIV4:			pc.cp++;			tl = pop4();			tl1 = pop4();			push4(tl1 / tl);			continue;		case O_DIV24:			pc.cp++;			tl = pop2();			tl1 = pop4();			push4(tl1 / tl);			continue;		case O_DIV42:			pc.cp++;			tl = pop4();			tl1 = pop2();			push4(tl1 / tl);			continue;		case O_MOD2:			pc.cp++;			tl = pop2();			tl1 = pop2();			push4(tl1 % tl);			continue;		case O_MOD4:			pc.cp++;			tl = pop4();			tl1 = pop4();			push4(tl1 % tl);			continue;		case O_MOD24:			pc.cp++;			tl = pop2();			tl1 = pop4();			push4(tl1 % tl);			continue;		case O_MOD42:			pc.cp++;			tl = pop4();			tl1 = pop2();			push4(tl1 % tl);			continue;		case O_ADD8:			pc.cp++;			td = pop8();			td1 = pop8();			push8(td1 + td);			continue;		case O_SUB8:			pc.cp++;			td = pop8();			td1 = pop8();			push8(td1 - td);			continue;		case O_MUL8:			pc.cp++;			td = pop8();			td1 = pop8();			push8(td1 * td);			continue;		case O_DVD8:			pc.cp++;			td = pop8();			td1 = pop8();			push8(td1 / td);			continue;		case O_STOI:			pc.cp++;			ts = pop2();			push4((long)ts);			continue;		case O_STOD:			pc.cp++;			td = pop2();			push8(td);			continue;		case O_ITOD:			pc.cp++;			td = pop4();			push8(td);			continue;		case O_ITOS:			pc.cp++;			tl = pop4();			push2((short)tl);			continue;		case O_DVD2:			pc.cp++;			td = pop2();			td1 = pop2();			push8(td1 / td);			continue;		case O_DVD4:			pc.cp++;			td = pop4();			td1 = pop4();			push8(td1 / td);			continue;		case O_DVD24:			pc.cp++;			td = pop2();			td1 = pop4();			push8(td1 / td);			continue;		case O_DVD42:			pc.cp++;			td = pop4();			td1 = pop2();			push8(td1 / td);			continue;		case O_DVD28:			pc.cp++;			td = pop2();			td1 = pop8();			push8(td1 / td);			continue;		case O_DVD48:			pc.cp++;			td = pop4();			td1 = pop8();			push8(td1 / td);			continue;		case O_DVD82:			pc.cp++;			td = pop8();			td1 = pop2();			push8(td1 / td);			continue;		case O_DVD84:			pc.cp++;			td = pop8();			td1 = pop4();			push8(td1 / td);			continue;		case O_RV1:			tcp = _display.raw[*pc.ucp++];			push2((short)(*(tcp + *pc.sp++)));			continue;		case O_RV14:			tcp = _display.raw[*pc.ucp++];			push4((long)(*(tcp + *pc.sp++)));			continue;		case O_RV2:			tcp = _display.raw[*pc.ucp++];			push2(*(short *)(tcp + *pc.sp++));			continue;		case O_RV24:			tcp = _display.raw[*pc.ucp++];			push4((long)(*(short *)(tcp + *pc.sp++)));			continue;		case O_RV4:			tcp = _display.raw[*pc.ucp++];			push4(*(long *)(tcp + *pc.sp++));			continue;		case O_RV8:			tcp = _display.raw[*pc.ucp++];			pushsze8(*(struct sze8 *)(tcp + *pc.sp++));			continue;		case O_RV:			tcp = _display.raw[*pc.ucp++];			tcp += *pc.sp++;			tl = *pc.usp++;			STACKALIGN(tl1, tl);			tcp1 = pushsp(tl1);			blkcpy(tcp, tcp1, tl);			continue;		case O_LV:			tcp = _display.raw[*pc.ucp++];			pushaddr(tcp + *pc.sp++);			continue;		case O_LRV1:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			push2((short)(*(tcp + tl)));			continue;		case O_LRV14:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			push4((long)(*(tcp + tl)));			continue;		case O_LRV2:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			push2(*(short *)(tcp + tl));			continue;		case O_LRV24:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			push4((long)(*(short *)(tcp + tl)));			continue;		case O_LRV4:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			push4(*(long *)(tcp + tl));			continue;		case O_LRV8:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			pushsze8(*(struct sze8 *)(tcp + tl));			continue;		case O_LRV:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			tcp += tl;			tl = *pc.usp++;			STACKALIGN(tl1, tl);			tcp1 = pushsp(tl1);			blkcpy(tcp, tcp1, tl);			continue;		case O_LLV:			tcp = _display.raw[*pc.ucp++];			PCLONGVAL(tl);			pushaddr(tcp + tl);			continue;		case O_IND1:			pc.cp++;			ts = *popaddr();			push2(ts);			continue;		case O_IND14:			pc.cp++;			ti = *popaddr();			push4((long)ti);			continue;		case O_IND2:			pc.cp++;			ts = *(short *)(popaddr());			push2(ts);			continue;		case O_IND24:			pc.cp++;			ts = *(short *)(popaddr());			push4((long)ts);			continue;		case O_IND4:			pc.cp++;			tl = *(long *)(popaddr());			push4(tl);			continue;		case O_IND8:			pc.cp++;			t8 = *(struct sze8 *)(popaddr());			pushsze8(t8);			continue;		case O_IND:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.usp++;			tcp = popaddr();			STACKALIGN(tl1, tl);			tcp1 = pushsp(tl1);			blkcpy(tcp, tcp1, tl);			continue;		case O_CON1:			push2((short)(*pc.cp++));			continue;		case O_CON14:			push4((long)(*pc.cp++));			continue;		case O_CON2:			pc.cp++;			push2(*pc.sp++);			continue;		case O_CON24:			pc.cp++;			push4((long)(*pc.sp++));			continue;		case O_CON4:			pc.cp++;			PCLONGVAL(tl);			push4(tl);			continue;		case O_CON8:			pc.cp++;			tcp = pushsp(sizeof(double));			blkcpy(pc.cp, tcp, sizeof(double));			pc.dbp++;			continue;		case O_CON:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.usp++;			STACKALIGN(tl1, tl);			tcp = pushsp(tl1);			blkcpy(pc.cp, tcp, tl);			pc.cp += (int)tl;			continue;		case O_CONG:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.usp++;			STACKALIGN(tl1, tl);			tcp = pushsp(tl1);			blkcpy(pc.cp, tcp, tl1);			pc.cp += (int)((tl + 2) & ~1);			continue;		case O_LVCON:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.usp++;			pushaddr(pc.cp);			tl = (tl + 1) & ~1;			pc.cp += (int)tl;			continue;		case O_RANG2:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.sp++;			tl1 = pop2();			push2((short)(RANG4(tl1, tl, (long)(*pc.sp++))));			continue;		case O_RANG42:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.sp++;			tl1 = pop4();			push4(RANG4(tl1, tl, (long)(*pc.sp++)));			continue;		case O_RSNG2:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.sp++;			tl1 = pop2();			push2((short)(RSNG4(tl1, tl)));			continue;		case O_RSNG42:			tl = *pc.cp++;			if (tl == 0)				tl = *pc.sp++;			tl1 = pop4();			push4(RSNG4(tl1, tl));			continue;		case O_RANG4:			tl = *pc.cp++;			if (tl == 0)				PCLONGVAL(tl);			tl1 = pop4();			PCLONGVAL(tl2);			push4(RANG4(tl1, tl, tl2));			continue;		case O_RANG24:			tl = *pc.cp++;			if (tl == 0)				PCLONGVAL(tl);			tl1 = pop2();			PCLONGVAL(tl2);			push2((short)(RANG4(tl1, tl, tl2)));			continue;		case O_RSNG4:			tl = *pc.cp++;			if (tl == 0)				PCLONGVAL(tl);			tl1 = pop4();			push4(RSNG4(tl1, tl));			continue;		case O_RSNG24:			tl = *pc.cp++;			if (tl == 0)				PCLONGVAL(tl);			tl1 = pop2();			push2((short)(RSNG4(tl1, tl)));			continue;		case O_STLIM:			pc.cp++;			tl = pop4();			STLIM(tl);			continue;		case O_LLIMIT:			pc.cp++;			tcp = popaddr();			tl = pop4();			LLIMIT(tcp, tl);			continue;		case O_BUFF:			BUFF((long)(*pc.cp++));			continue;		case O_HALT:			pc.cp++;			if (_nodump == TRUE)				psexit(0);			fputs("\nCall to procedure halt\n", stderr);			backtrace("Halted");			psexit(0);

⌨️ 快捷键说明

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