|
|
1.1 ! root 1: (* Copyright 1989 by AT&T Bell Laboratories *) ! 2: structure VaxAssem = struct val outfile = ref std_out end ! 3: ! 4: structure VaxAsCode : VAXCODER = struct ! 5: ! 6: open System.Tags VaxAssem ! 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 = reg of int ! 20: ! 21: val r0 = reg 0 ! 22: val r1 = reg 1 ! 23: val r2 = reg 2 ! 24: val r3 = reg 3 ! 25: val r4 = reg 4 ! 26: val r5 = reg 5 ! 27: val r6 = reg 6 ! 28: val r7 = reg 7 ! 29: val r8 = reg 8 ! 30: val r9 = reg 9 ! 31: val r10 = reg 10 ! 32: val r11 = reg 11 ! 33: val r12 = reg 12 ! 34: val r13 = reg 13 ! 35: val sp = reg 14 ! 36: val pc = reg 15 ! 37: ! 38: datatype EA = direct of Register ! 39: | autoinc of Register ! 40: | autodec of Register ! 41: | displace of int * Register ! 42: | deferred of int * Register ! 43: | immed of int ! 44: | immedlab of Label ! 45: | address of Label ! 46: | index of EA * Register ! 47: ! 48: fun emit s = output (!outfile) s ! 49: ! 50: fun newline () = (emit "\n" (* ; emit(makestring(!offset)); emit "\t" *) ) ! 51: ! 52: fun emitreg (reg 15) = emit "pc" ! 53: | emitreg (reg 14) = emit "sp" ! 54: | emitreg (reg r) = emit ("r" ^ itoa r) ! 55: ! 56: fun emitarg (direct r) = emitreg r ! 57: | emitarg (autoinc r) = (emit "("; emitreg r; emit ")+") ! 58: | emitarg (autodec r) = (emit "-("; emitreg r; emit ")") ! 59: | emitarg (immed i) = emit ("$" ^ itoa i) ! 60: | emitarg (displace(0,r)) = (emit "("; emitreg r; emit ")") ! 61: | emitarg (displace(i,r)) = (emit (itoa i); emit "("; emitreg r; emit ")") ! 62: | emitarg (deferred(i,r)) = (emit ("*"^itoa i); emit "("; emitreg r; emit ")") ! 63: | emitarg (address lab) = emit lab ! 64: | emitarg (index(ea,r)) = (emitarg ea; emit "["; emitreg r; emit "]") ! 65: | emitarg (immedlab lab) = (emit "BOGUS:"; emit lab) ! 66: ! 67: fun emit1arg (a) = (emitarg a; newline()) ! 68: ! 69: fun emit2arg (a,b) = (emitarg a; emit ","; emitarg b; newline()) ! 70: ! 71: fun emit3arg (a,b,c) = ! 72: (emitarg a; emit ","; emitarg b; emit ","; emitarg c; newline()) ! 73: ! 74: fun pure (autoinc _) = false ! 75: | pure (autodec _) = false ! 76: | pure _ = true ! 77: ! 78: fun args23(f2,f3) (args as (a,b,c)) = ! 79: if b=c andalso pure b then (f2(a,b)) else f3 args ! 80: ! 81: fun emitbarg (displace(n,reg 15)) = (emit "$"; emit(makestring n); newline()) ! 82: | emitbarg a = emit1arg a ! 83: ! 84: fun align () = emit ".align 2\n" ! 85: ! 86: local val p = makestring power_tags ! 87: val t = makestring tag_backptr ! 88: in ! 89: fun mark () = let val lab = newlabel() ! 90: in emit lab; ! 91: emit ": .long (("; ! 92: emit lab; ! 93: emit "-base)/4+1)*"; (* STRING dependency *) ! 94: emit p; ! 95: emit "+"; ! 96: emit t; ! 97: emit "\n" ! 98: end ! 99: end ! 100: ! 101: fun define lab = (emit lab; emit ":\n") ! 102: fun oct i = let val m = Integer.makestring ! 103: in m(i div 64)^m((i div 8)mod 8)^m(i mod 8) end ! 104: fun c_char "\n" = "\\n" ! 105: | c_char "\t" = "\\t" ! 106: | c_char "\\" = "\\\\" ! 107: | c_char "\"" = "\\\"" ! 108: | c_char c = if ord c < 32 then "\\"^oct(ord c) else c ! 109: fun a_str s = implode(map c_char (explode s)) ! 110: fun emitstring s = (emit ".ascii \""; emit(a_str s); emit "\"\n") ! 111: fun realconst s = (emit ".gfloat "; emit s; emit "\n") ! 112: fun emitlong (i : int) = (emit ".long "; emit(makestring i); emit "\n") ! 113: ! 114: fun emitlab (offset,l2) = ! 115: (emit "5: .long "; emit l2; emit "-5b"; ! 116: if offset < 0 then (emit "-"; emit (makestring (~offset))) ! 117: else (emit "+"; emit (makestring offset)); ! 118: emit "\n") ! 119: ! 120: fun jbr arg = (emit "jbr "; emit1arg arg) ! 121: fun bbc (immed 0, arg1, arg2) = (emit "blbc "; emit2arg(arg1,arg2)) ! 122: | bbc args = (emit "bbc "; emit3arg args) ! 123: fun bbs (immed 0, arg1, arg2) = (emit "blbs "; emit2arg(arg1,arg2)) ! 124: | bbs args = (emit "bbs "; emit3arg args) ! 125: ! 126: fun movb args = (emit "movb "; emit2arg args) ! 127: fun movzbl args = (emit "movzbl "; emit2arg args) ! 128: ! 129: fun pushal arg = (emit "pushal "; emit1arg arg) ! 130: ! 131: fun addl2 args = (emit "addl2 "; emit2arg args) ! 132: ! 133: fun moval (arg, autodec sp) = pushal arg ! 134: | moval (args as (displace(i, reg p),direct (reg q))) = ! 135: if p=q andalso i> ~128 andalso i < 128 ! 136: then addl2(immed i, direct(reg p)) ! 137: else (emit "moval "; emit2arg args) ! 138: | moval args = (emit "moval "; emit2arg args) ! 139: ! 140: fun movl(immedlab l, arg) = moval(address l, arg) ! 141: | movl (arg, autodec sp) = (emit "pushl "; emit1arg arg) ! 142: | movl (immed 0, arg) = (emit "clrl "; emit1arg arg) ! 143: | movl args = (emit "movl "; emit2arg args) ! 144: ! 145: fun movq args = (emit "movq "; emit2arg args) ! 146: ! 147: fun rsb () = emit "rsb\n" ! 148: fun cmpl args = (emit "cmpl "; emit2arg args) ! 149: fun addl3 args = (emit "addl3 "; emit3arg args) ! 150: val addl3 = args23 (addl2,addl3) ! 151: fun subl2 args = (emit "subl2 "; emit2arg args) ! 152: fun subl3 args = (emit "subl3 "; emit3arg args) ! 153: val subl3 = args23 (subl2,subl3) ! 154: fun bisl3 args = (emit "bisl3 "; emit3arg args) ! 155: fun bicl3 args = (emit "bicl3 "; emit3arg args) ! 156: fun xorl3 args = (emit "xorl3 "; emit3arg args) ! 157: fun ashl args = (emit "ashl "; emit3arg args) ! 158: fun mull2 args = (emit "mull2 "; emit2arg args) ! 159: fun divl3 args = (emit "divl3 "; emit3arg args) ! 160: fun divl2 args = (emit "divl2 "; emit2arg args) ! 161: val divl3 = args23 (divl2,divl3) ! 162: fun jmp (arg as address lab) = jbr arg ! 163: | jmp arg = (emit "jmp "; emit1arg arg) ! 164: fun brb arg = (emit "brb "; emitbarg arg) ! 165: fun brw arg = (emit "brw "; emitbarg arg) ! 166: ! 167: fun beql arg = (emit "beql "; emitbarg arg) ! 168: fun bneq arg = (emit "bneq "; emitbarg arg) ! 169: fun jne arg = (emit "jneq "; emit1arg arg) ! 170: fun bgeq arg = (emit "bgeq "; emitbarg arg) ! 171: fun bgtr arg = (emit "bgtr "; emitbarg arg) ! 172: fun blss arg = (emit "blss "; emitbarg arg) ! 173: fun bleq arg = (emit "bleq "; emitbarg arg) ! 174: fun sobgeq arg = (emit "sobgeq "; emit2arg arg) ! 175: ! 176: fun movg args = (emit "movg "; emit2arg args) ! 177: fun mnegg args = (emit "mnegg "; emit2arg args) ! 178: fun addg3 args = (emit "addg3 "; emit3arg args) ! 179: fun subg3 args = (emit "subg3 "; emit3arg args) ! 180: fun mulg3 args = (emit "mulg3 "; emit3arg args) ! 181: fun divg3 args = (emit "divg3 "; emit3arg args) ! 182: fun cmpg args = (emit "cmpg "; emit2arg args) ! 183: ! 184: fun push arg = movl(arg,autodec sp) ! 185: fun pusha arg = moval(arg,autodec sp) ! 186: fun pop arg = movl(autoinc sp,arg) ! 187: ! 188: val comment = emit ! 189: ! 190: end (* structure AsCode *)
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.