desc $10, 132, "001F"
Syntax: addb src1, src2, dst addf src1, src2, dst addw src1, src2, dst addl src1, src2, dst Function: dst = src1 + src2
Syntax: addc src1, src2, dst Function: dst = src1 + src2
Syntax: alt src, dst
struct Alt {
	int nsend;		/* Number of senders */
	int nrecv;		/* Number of receivers */
	struct {
		Channel* c;		/* Channel */
		void*	val;	/* Address of lval/rval */
	} entry[];
};
Syntax: andb src1, src2, dst andw src1, src2, dst andl src1, src2, dst Function: dst = src1 & src2
Syntax: beqb src1, src2, dst beqc src1, src2, dst beqf src1, src2, dst beqw src1, src2, dst beql src1, src2, dst Function: if src1 == src2 then pc = dst
Syntax: bgeb src1, src2, dst bgec src1, src2, dst bgef src1, src2, dst bgew src1, src2, dst bgel src1, src2, dst Function: if src1 >= src2 then pc = dst
Syntax: bgtb src1, src2, dst bgtc src1, src2, dst bgtf src1, src2, dst bgtw src1, src2, dst bgtl src1, src2, dst Function: if src1 > src2 then pc = dst
Syntax: bleb src1, src2, dst blec src1, src2, dst blef src1, src2, dst blew src1, src2, dst blel src1, src2, dst Function: if src1 <= src2 then pc = dst
Syntax: bltb src1, src2, dst bltc src1, src2, dst bltf src1, src2, dst bltw src1, src2, dst bltl src1, src2, dst Function: if src1 < src2 then pc = dst
Syntax: bneb src1, src2, dst bnec src1, src2, dst bnef src1, src2, dst bnew src1, src2, dst bnel src1, src2, dst Function: if src1 != src2 then pc = dst
Syntax: call src, dst Function: link(src) = pc frame(src) = fp mod(src) = 0 fp = src pc = dst
Syntax: case src, dst Function: pc = 0..i: dst[i].pc where dst[i].lo >= src && dst[i].hi < src
Syntax: casec src, dst Function: pc = 0..i: dst[i].pc where dst[i].lo >= src && dst[i].hi < src
Syntax: consb src, dst consc src, dst consf src, dst consl src, dst consm src, dst consmp src, dst consp src, dst consw src, dst Function: p = new(src, dst) dst = p
Syntax: cvtac src, dst Function: dst = string(src)
Syntax: cvtbw src, dst Function: dst = src & 0xff
Syntax: cvtca src, dst Function: dst = array(src)
Syntax: cvtcf src, dst Function: dst = (float)src
Syntax: cvtcl src, dst Function: dst = (big)src
Syntax: cvtcw src, dst Function: dst = (int)src
Syntax: cvtfc src, dst Function: dst = string(src)
Syntax: cvtfw src, dst Function: dst = (int)src
Syntax: cvtfl src, dst Function: dst = (big)src
Syntax: cvtfr src, dst Function: dst = (short float)src
Syntax: cvtlc src, dst Function: dst = string(src)
Syntax: cvtlw src, dst Function: dst = (int)src
Syntax: cvtsw src, dst Function: dst = (int)src
Syntax: cvtwb src, dst Function: dst = (byte)src;
Syntax: cvtwc src, dst Function: dst = string(src)
Syntax: cvtwl src, dst Function: dst = (big)src;
Syntax: cvtwf src, dst Function: dst = (float)src;
Syntax: cvtws src, dst Function: dst = (short)src;
Syntax: cvtlf src, dst Function: dst = (float)src;
Syntax: cvtrf src, dst Function: dst = (float)src;
Syntax: divb src1, src2, dst divf src1, src2, dst divw src1, src2, dst divl src1, src2, dst Function: dst = src2/src1
Syntax: eclr
Syntax: exit Function: exit()
Syntax: frame src1, src2 Function: src2 = fp + src1->size initmem(src2, src1);
Syntax: goto src, dst Function: pc = dst[src]
Syntax: headb src, dst headf src, dst headm src, dst headmp src, dst headp src, dst headw src, dst headl src, dst Function: dst = hd src
Syntax: indc src1, src2, dst Function: dst = src1[src2]
Syntax: indx src1, dst, src2 Function: dst = &src1[src2]
Syntax: indb src1, dst, src2 indw src1, dst, src2 indf src1, dst, src2 indl src1, dst, src2 Function: dst = src1[src2]
Syntax: insc src1, src2, dst Function: src1[src2] = dst
Syntax: jmp dst Function: pc = dst
Syntax: lea src, dst Function: dst = &src
Syntax: lena src, dst Function: dst = nelem(src)
Syntax: lenc src, dst Function: dst = utflen(src)
Syntax: lenl src, dst Function: dst = 0; for(l = src; l; l = tl l) dst++;
Syntax: load src1, src2, dst Function: dst = load src2 src1
int nentries;
struct {	/* word aligned */
	int	sig;
	byte	name[];	/* UTF encoded name, 0-terminated */
} entry[];
Syntax: lsrw src1, src2, dst lsrl src1, src2, dst Function: dst = (unsigned)src2 >> src1
Syntax: mcall src1, src2, src3 Function: link(src1) = pc frame(src1) = fp mod(src1) = current_moduleptr current_moduleptr = src3->moduleptr fp = src1 pc = src3->links[src2]->pc
Syntax: mframe src1, src2, dst Function: dst = fp + src1->links[src2]->t->size initmem(dst, src1->links[src2])
Syntax: mnewz src1, src2, dst Function: dst = malloc(src1->types[src2]->size) initmem(dst, src1->types[src2]->map)
Syntax: modb src1, src2, dst modw src1, src2, dst modl src1, src2, dst Function: dst = src2 % src1
Syntax: movb src, dst movw src, dst movf src, dst movl src, dst Function: dst = src
Syntax: movm src1, src2, dst Function: memmove(&dst, &src1, src2)
Syntax: movmp src1, src2, dst Function: decmem(&dst, src2) memmove(&dst, &src1, src2->size) incmem(&src, src2)
Syntax: movp src, dst Function: destroy(dst) dst = src incref(src)
Syntax: movpc src, dst Function: dst = PC(src);
Syntax:		mspawn	src1, src2, src3
Function:	fork();
		if(child){
			link(src1) = 0
			frame(src1) = 0
			mod(src1) = src3->moduleptr
			current_moduleptr = src3->moduleptr
			fp = src1
			pc = src3->links[src2]->pc
		}
Syntax: mulb src1, src2, dst mulw src1, src2, dst mulf src1, src2, dst mull src1, src2, dst Function: dst = src1 * src2
Syntax: nbalt src, dst
Syntax: negf src, dst Function: dst = -src
Syntax: new src, dst newz src, dst Function: dst = malloc(src->size); initmem(dst, src->map);
Syntax: newa src1, src2, dst newaz src1, src2, dst Function: dst = malloc(src2->size * src1); for(i = 0; i < src1; i++) initmem(dst + i*src2->size, src2->map);
Syntax: newcw dst newcb dst newcl dst newcf dst newcp dst newcm src, dst newcmp src, dst Function: dst = new(Channel)
Syntax: orb src1, src2, dst orw src1, src2, dst orl src1, src2, dst Function: dst = src1 | src
Syntax: recv src, dst Function: dst = <-src
Syntax: ret Function: npc = link(fp) mod = mod(fp) fp = frame(fp) pc = npc
Syntax: send src, dst Function: dst <-= src
Syntax: shlb src1, src2, dst shlw src1, src2, dst shll src1, src2, dst Function: dst = src2 << src1
Syntax: shrb src1, src2, dst shrw src1, src2, dst shrl src1, src2, dst Function: dst = src2 >> src1
Syntax: slicea src1, src2, dst Function: dst = dst[src1:src2]
Syntax: slicec src1, src2, dst Function: dst = dst[src1:src2]
Syntax: slicela src1, src2, dst Function: dst[src2:] = src1
Syntax: spawn src, dst Function: fork(); if(child) dst(src);
Syntax: subb src1, src2, dst subf src1, src2, dst subw src1, src2, dst subl src1, src2, dst Function: dst = src2 - src1
Syntax: tail src, dst Function: dst = src->next
Syntax:		tcmp	src, dst
Function:	if(typeof(src) != typeof(dst))
			error("typecheck");
Syntax: xorb src1, src2, dst xorw src1, src2, dst xorl src1, src2, dst Function: dst = src1 ^ src2
Objfile
{
	Header;
	Code_section;
	Type_section;
	Data_section;
	Module_name;
	Link_section;
};
Header
{
	OP: magic_number;
	Signature;
	OP: runtime_flag;
	OP: stack_extent;
	OP: code_size;
	OP: data_size;
	OP: type_size;
	OP: link_size;
	OP: entry_pc;
	OP: entry_type;
};
Signature
{
	OP: length;
	array[length] of byte: signature;
};
MUSTCOMPILE = 1<<0 DONTCOMPILE = 1<<1 SHAREMP = 1<<2
Instruction
{
	B: opcode;
	B: address_mode;
	Middle_data;
	Source_data;
	Dest_data;
};
bit 7 6 5 4 3 2 1 0 m1 m0 s2 s1 s0 d2 d1 d0
Type_descriptor
{
	OP: desc_number;
	OP: size;
	OP: number_ptrs;
	array[number_ptrs] of B: map;
};
Short_item
{
	B: code;
	OP: offset;
	array[code & 16rF] of type[code>>4]: data;
};
Long_item
{
	B: code;
	OP: count;
	OP: offset;
	array[ndata] of type[code>>4]: data;
};
Linkage_item
{
	OP: pc;
	OP: desc_number;
	W: sig;
	array[] of byte: name;
};