|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: structure NS32Assem = struct val outfile = ref std_out end ! 3: ! 4: structure NS32AsCode : NS32CODER = struct ! 5: ! 6: open System.Tags NS32Assem ! 7: ! 8: val offset = ref 0 ! 9: ! 10: type Label = string ! 11: ! 12: local val i = ref 0 in ! 13: fun newlabel () = (i := !i + 1; "L" ^ makestring (!i)) ! 14: end ! 15: ! 16: fun itoa (i:int) = if i < 0 then "-" ^ makestring (~i) ! 17: else makestring i ! 18: ! 19: datatype Register = Genreg of int ! 20: | FloatReg of int ! 21: | FP ! 22: | SP ! 23: | SB ! 24: | PC ! 25: ! 26: val r0 = Genreg 0 ! 27: val r1 = Genreg 1 ! 28: val r2 = Genreg 2 ! 29: val r3 = Genreg 3 ! 30: val r4 = Genreg 4 ! 31: val r5 = Genreg 5 ! 32: val r6 = Genreg 6 ! 33: val r7 = Genreg 7 ! 34: val fp = FP ! 35: val sp = SP ! 36: val sb = SB ! 37: val pc = PC ! 38: val fp0 = FloatReg 0 ! 39: ! 40: datatype Size = Byte | Word | Long ! 41: ! 42: datatype EA = Direct of Register ! 43: | Topofstack ! 44: | Displace of int * Register ! 45: | Immed of int ! 46: | Immedlab of Label ! 47: | Abs of int ! 48: | OffAddress of Label * int ! 49: | Index of EA * Register * Size ! 50: ! 51: fun address lab = OffAddress(lab,0) (* old Address style *) ! 52: ! 53: fun emit s = output (!outfile) s ! 54: (* fun emit s = (output std_out s; output (!outfile) s) DEBUG *) ! 55: ! 56: fun newline () = (emit "\n" (* ; emit(makestring(!offset)); emit "\t" *) ) ! 57: ! 58: fun emitopc opc = (emit "\t"; emit opc; emit "\t") ! 59: ! 60: fun emitreg (Genreg r) = emit ("r" ^ itoa r) ! 61: | emitreg (FloatReg r) = emit ("f" ^ itoa r) ! 62: | emitreg (FP) = emit "fp" ! 63: | emitreg (SP) = emit "sp" ! 64: | emitreg (SB) = emit "sb" ! 65: | emitreg (PC) = emit "pc" ! 66: ! 67: fun emitsize (Byte) = emit "B" ! 68: | emitsize (Word) = emit "W" ! 69: | emitsize (Long) = emit "L" ! 70: ! 71: fun emitarg (Direct r) = emitreg r ! 72: | emitarg (Immed i) = emit ("$" ^ itoa i) ! 73: | emitarg (Displace(0,r)) = (emit "("; emitreg r; emit ")") ! 74: | emitarg (Displace(i,r)) = (emit (itoa i); emit "("; emitreg r; emit ")") ! 75: | emitarg (OffAddress(lab,i)) = (emit lab; ! 76: if i>0 then emit ("+" ^ makestring i) ! 77: else if i<0 then emit (itoa i) ! 78: else ()) ! 79: | emitarg (Index(ea,r,sz)) = (emitarg ea; emit "["; emitreg r; emit ":"; ! 80: emitsize sz; emit "]") ! 81: | emitarg (Topofstack) = (emit "TOS") ! 82: | emitarg (Immedlab lab) = (emit "BOGUS:"; emit lab) ! 83: | emitarg (Abs n) = emit ("BOGUSABS:" ^ itoa(n)) ! 84: ! 85: fun emit1arg (a) = (emitarg a; newline()) ! 86: ! 87: fun emit2arg (a,b) = (emitarg a; emit ","; emitarg b; newline()) ! 88: ! 89: fun align () = emit "\t.align\t2\n" ! 90: ! 91: local val p = makestring power_tags ! 92: val t = makestring tag_backptr ! 93: in ! 94: fun mark () = let val lab = newlabel() ! 95: in emit lab; ! 96: emit ":\t.long\t(("; ! 97: emit lab; ! 98: emit "-base)/4+1)*"; (* STRING dependency *) ! 99: emit p; ! 100: emit "+"; ! 101: emit t; ! 102: emit "\n" ! 103: end ! 104: end ! 105: ! 106: fun define lab = (emit lab; emit ":\n") ! 107: fun oct i = let val m = Integer.makestring ! 108: in m(i div 64)^m((i div 8)mod 8)^m(i mod 8) end ! 109: fun c_char "\n" = "\\n" ! 110: | c_char "\t" = "\\t" ! 111: | c_char "\\" = "\\\\" ! 112: | c_char "\"" = "\\\"" ! 113: | c_char c = if ord c < 32 then "\\"^oct(ord c) else c ! 114: fun a_str s = implode(map c_char (explode s)) ! 115: fun emitstring s = (emit "\t.ascii\t\""; emit(a_str s); emit "\"\n") ! 116: fun realconst s = (emit "\t.gfloat\t"; emit s; emit "\n") ! 117: fun emitlong (i : int) = (emit "\t.long\t"; emit(makestring i); emit "\n") ! 118: ! 119: fun emitlab (offset,l2) = ! 120: (emit "5:\t.long\t"; emit l2; emit "-5b"; ! 121: if offset < 0 then (emit "-"; emit (makestring (~offset))) ! 122: else (emit "+"; emit (makestring offset)); ! 123: emit "\n") ! 124: ! 125: fun isquick k = (k<=7 andalso k>= ~8) ! 126: ! 127: fun lprl (src,preg) = (emitopc "lprl"; emit2arg (preg,src)) ! 128: fun sprl args = (emitopc "sprl"; emit2arg args) ! 129: fun tbit (arg1 as Immed k, arg2) = (emitopc "tbitl"; emit2arg(arg1,arg2)) ! 130: | tbit args = (emitopc "tbitl"; emit2arg args) ! 131: fun bfs arg = (emitopc "bfs"; emit1arg arg) ! 132: ! 133: fun movql args = (emitopc "movql"; emit2arg args) ! 134: ! 135: fun movb args = (emitopc "movb"; emit2arg args) ! 136: fun movzbl args = (emitopc "movzbl"; emit2arg args) ! 137: ! 138: fun lea args = (emitopc "addr"; emit2arg args) ! 139: ! 140: fun movl (Immedlab l, arg) = lea(address l, arg) ! 141: | movl (args as (Immed k, dest)) = ! 142: if isquick(k) ! 143: then movql args ! 144: else (emitopc "movl"; emit2arg args) ! 145: | movl args = (emitopc "movl"; emit2arg args) ! 146: ! 147: fun addl (args as (Immed k, dest)) = ! 148: if isquick(k) ! 149: then (emitopc "addql"; emit2arg args) ! 150: else (emitopc "addl"; emit2arg args) ! 151: | addl args = (emitopc "addl"; emit2arg args) ! 152: fun subl args = (emitopc "subl"; emit2arg args) ! 153: fun negl args = (emitopc "negl"; emit2arg args) ! 154: fun ashl args = (emitopc "ashl"; emit2arg args) ! 155: fun andl args = (emitopc "andl"; emit2arg args) ! 156: fun orl args = (emitopc "orl"; emit2arg args) ! 157: fun xorl args = (emitopc "xorl"; emit2arg args) ! 158: fun coml args = (emitopc "coml"; emit2arg args) ! 159: fun mull args = (emitopc "mull"; emit2arg args) ! 160: fun divl args = (emitopc "divl"; emit2arg args) ! 161: ! 162: fun br arg = (emitopc "br"; emit1arg arg) ! 163: fun jump (arg as OffAddress _) = br arg ! 164: | jump arg = (emitopc "jump"; emit1arg arg) ! 165: fun beq arg = (emitopc "beq"; emit1arg arg) ! 166: fun bne arg = (emitopc "bne"; emit1arg arg) ! 167: fun bge arg = (emitopc "bge"; emit1arg arg) ! 168: fun bgt arg = (emitopc "bgt"; emit1arg arg) ! 169: fun blt arg = (emitopc "blt"; emit1arg arg) ! 170: fun ble arg = (emitopc "ble"; emit1arg arg) ! 171: fun cmpl (args as (Immed k,arg2)) = ! 172: if isquick(k) ! 173: then (emitopc "cmpql"; emit2arg args) ! 174: else (emitopc "cmpl"; emit2arg args) ! 175: | cmpl args = (emitopc "cmpl"; emit2arg args) ! 176: ! 177: ! 178: fun movg args = (emitopc "movg"; emit2arg args) ! 179: fun negg args = (emitopc "negg"; emit2arg args) ! 180: fun addg args = (emitopc "addg"; emit2arg args) ! 181: fun subg args = (emitopc "subg"; emit2arg args) ! 182: fun mulg args = (emitopc "mulg"; emit2arg args) ! 183: fun divg args = (emitopc "divg"; emit2arg args) ! 184: fun cmpg args = (emitopc "cmpg"; emit2arg args) ! 185: ! 186: ! 187: val comment = emit ! 188: ! 189: end (* structure NS32AsCode *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.