|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: signature CMACHINE = sig ! 3: ! 4: type EA ! 5: (* the following kinds of effective address are assumed: ! 6: register; ! 7: immediate label: ! 8: This mode doesn't in fact exist on the Vax or the MC68020, ! 9: but it can be simulated (e.g. by "move address" instructions). ! 10: immediate integer literal; *) ! 11: ! 12: val immed : int -> EA (* makes the immediate integer mode *) ! 13: val isimmed : EA -> int option ! 14: val isreg : EA -> int option ! 15: val eqreg : EA -> EA -> bool ! 16: ! 17: (* DEDICATED REGISTERS *) ! 18: (* The following registers can hold pointers or properly tagged integers *) ! 19: val exnptr : EA (* the current exception-handler *) ! 20: val storeptr : EA (* the head of the store-list of modified words *) ! 21: (* val dataptr : EA the boundary between allocated and unused *) ! 22: ! 23: (* The following registers may not hold pointers, and may hold untagged ints *) ! 24: val arithtemp : EA ! 25: val arithtemp2 : EA ! 26: ! 27: (* The following registers are not dedicated, and must be all disjoint *) ! 28: val standardclosure : EA ! 29: val standardarg : EA ! 30: val standardcont : EA ! 31: val miscregs : EA list ! 32: ! 33: val move : EA * EA -> unit (* move(a,b) a -> b *) ! 34: ! 35: val align : unit -> unit (* ensure that next code is on 4-byte boundary *) ! 36: val mark: unit -> unit (* insert a gc-tag in the code so that next address ! 37: may be moved into a record *) ! 38: val emitlong : int -> unit (* put an 4-byte integer literal into the code *) ! 39: val realconst : string -> unit (* put a floating literal into the code *) ! 40: val emitstring : string -> unit (* put a literal string into the code ! 41: (just the chars, no descriptor or length) *) ! 42: val emitlab : int * EA -> unit (* L3: emitlab(k,L2) is equivalent to ! 43: L3: emitlong(k+L2-L3) *) ! 44: ! 45: val newlabel : unit -> EA (* create a new label (but don't define it) *) ! 46: val define : EA -> unit (* Associate a label with a point in the code *) ! 47: ! 48: (* checkLimit (n): ! 49: * Generate code to check the heap limit to see if there is enough free space ! 50: * to allocate n bytes. ! 51: *) ! 52: val checkLimit : int -> unit ! 53: ! 54: (* beginStdFn (cl, lab): ! 55: * Note the beginning of a standard function with entry label lab, and ! 56: * register cl containing its closure. ! 57: *) ! 58: val beginStdFn : (EA * EA) -> unit (* Mark beginning of standard function *) ! 59: ! 60: val jmp : EA -> unit (* unconditional jump to the address specified *) ! 61: ! 62: val record : (EA * CPS.accesspath) list * EA -> unit ! 63: (* makes a new record, puts address of it ! 64: into the destination specified by the second arg. ! 65: The contents are numbered from ~1 and up. *) ! 66: ! 67: val select : int * EA * EA -> unit (* select(i,x,y) = y <- mem[x+4*i] *) ! 68: val offset : int * EA * EA -> unit (* offset(i,x,y) = y <- x+4*i *) ! 69: ! 70: val fetchindexb : EA * EA -> unit (* fetchindexb(x,y) fetches a byte: ! 71: y <- mem[x+arithtemp] ! 72: y cannot be arithtemp *) ! 73: val storeindexb : EA * EA -> unit (* storeindexb(x,y) stores a byte: ! 74: mem[y+arithtemp] <- x; *) ! 75: val jmpindexb : EA -> unit (* jmpindexb(x) pc <- (x+arithtemp) *) ! 76: val fetchindexl : EA * EA * EA -> unit (* fetchindexl(x,y,z) fetches a word: ! 77: y <- mem[x+2*(z-1)] *) ! 78: val storeindexl : EA * EA * EA -> unit (* storeindexl(x,y,z) stores a word: ! 79: mem[y+2*(z-1)] <- x *) ! 80: ! 81: val ashl : EA * EA * EA -> unit (* shift left: count, src, dest; ! 82: shift count is non-negative *) ! 83: val ashr : EA * EA * EA -> unit (* shift right: count, src, dest; ! 84: shift count is non-negative *) ! 85: ! 86: val orb : EA * EA * EA -> unit (* bitwise or *) ! 87: val andb : EA * EA * EA -> unit (* bitwise and *) ! 88: val xorb : EA * EA * EA -> unit (* bitwise xor *) ! 89: val notb : EA * EA -> unit (* bitwise complement *) ! 90: ! 91: (* the following instructions are really just vax instructions *) ! 92: val addl3 : EA * EA * EA -> unit ! 93: val subl3 : EA * EA * EA -> unit (* subl3(a,b,c): c <- (b - a) *) ! 94: ! 95: val divl2 : EA * EA -> unit (* divl2(a,b): b <- (b div a) *) ! 96: ! 97: (* integer arithmetic with overflow trapping *) ! 98: val addl3t : EA * EA * EA -> unit ! 99: val subl3t : EA * EA * EA -> unit (* subl3t(a,b,c): c <- (b - a) *) ! 100: val mull2t : EA * EA -> unit ! 101: ! 102: val bbs : EA * EA * EA -> unit ! 103: ! 104: datatype condition = NEQ | EQL | LEQ | GEQ | LSS | GTR ! 105: ! 106: (* ibranch (cond, a, b, lab): pc <- lab if (a <cond> b). *) ! 107: val ibranch : condition * EA * EA * EA -> unit ! 108: ! 109: (* these are almost vax instructions, except that in each case ! 110: the EA's are the addresses of the operands, not the values *) ! 111: val mnegg : EA * EA -> unit ! 112: val mulg3 : EA * EA * EA -> unit ! 113: val divg3 : EA * EA * EA -> unit ! 114: val addg3 : EA * EA * EA -> unit ! 115: val subg3 : EA * EA * EA -> unit ! 116: val gbranch : condition * EA * EA * EA -> unit ! 117: ! 118: val profile : int * int -> unit ! 119: val comment : string -> unit ! 120: end
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.