Annotation of researchv10no/cmd/sml/src/m68/m68ascode.sml, revision 1.1.1.1

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: structure M68Assem = struct val outfile = ref std_out end
                      3: 
                      4: structure M68AsCode : M68CODER = struct
                      5: 
                      6: open System.Tags M68Assem 
                      7: 
                      8: (* DEBUG
                      9: fun diag (s : string) f x =
                     10:        f x handle e =>
                     11:                (print "?exception "; print (System.exn_name e);
                     12:                 print " in m68ascode."; print s; print "\n";
                     13:                 raise e)
                     14: *)
                     15: 
                     16: val offset = ref 0
                     17: 
                     18: type Label = string
                     19: 
                     20: local val i = ref 0 in
                     21: fun newlabel () = (i := !i + 1; "L" ^ makestring (!i))
                     22: end
                     23: 
                     24: fun itoa (i:int) = if i < 0 then "-" ^ makestring (~i)
                     25:                   else makestring i
                     26: 
                     27: datatype Register = DataReg of int
                     28:                  | AddrReg of int
                     29:                  | FloatReg of int
                     30:                  | PC
                     31: 
                     32: datatype Size = Byte | Word | Long
                     33: 
                     34: datatype EA = Direct of Register
                     35:            | PostInc of Register
                     36:            | PreDec of Register
                     37:            | Displace of Register * int
                     38:            | Index of Register * int * Register * Size
                     39:            | Immedlab of Label
                     40:            | Immed of int
                     41:            | Abs of int
                     42:            | Address of Label
                     43: 
                     44: val d0 = DataReg 0
                     45: and d1 = DataReg 1
                     46: and d2 = DataReg 2
                     47: and d3 = DataReg 3
                     48: and d4 = DataReg 4
                     49: and d5 = DataReg 5
                     50: and d6 = DataReg 6
                     51: and d7 = DataReg 7
                     52: and a0 = AddrReg 0
                     53: and a1 = AddrReg 1
                     54: and a2 = AddrReg 2
                     55: and a3 = AddrReg 3
                     56: and a4 = AddrReg 4
                     57: and a5 = AddrReg 5
                     58: and a6 = AddrReg 6
                     59: and sp = AddrReg 7
                     60: and fp0 = FloatReg 0
                     61: and fp1 = FloatReg 1
                     62: and fp2 = FloatReg 2
                     63: and fp3 = FloatReg 3
                     64: and fp4 = FloatReg 4
                     65: and fp5 = FloatReg 5
                     66: and fp6 = FloatReg 6
                     67: and fp7 = FloatReg 7
                     68: 
                     69: fun emit s = output (!outfile) s
                     70: 
                     71: fun emitreg (DataReg 0) = emit "d0"
                     72:   | emitreg (DataReg 1) = emit "d1"
                     73:   | emitreg (DataReg 2) = emit "d2"
                     74:   | emitreg (DataReg 3) = emit "d3"
                     75:   | emitreg (DataReg 4) = emit "d4"
                     76:   | emitreg (DataReg 5) = emit "d5"
                     77:   | emitreg (DataReg 6) = emit "d6"
                     78:   | emitreg (DataReg 7) = emit "d7"
                     79:   | emitreg (AddrReg 0) = emit "a0"
                     80:   | emitreg (AddrReg 1) = emit "a1"
                     81:   | emitreg (AddrReg 2) = emit "a2"
                     82:   | emitreg (AddrReg 3) = emit "a3"
                     83:   | emitreg (AddrReg 4) = emit "a4"
                     84:   | emitreg (AddrReg 5) = emit "a5"
                     85:   | emitreg (AddrReg 6) = emit "a6"
                     86:   | emitreg (AddrReg 7) = emit "sp"
                     87:   | emitreg (FloatReg 0) = emit "fp0"
                     88:   | emitreg (FloatReg 1) = emit "fp1"
                     89:   | emitreg (FloatReg 2) = emit "fp2"
                     90:   | emitreg (FloatReg 3) = emit "fp3"
                     91:   | emitreg (FloatReg 4) = emit "fp4"
                     92:   | emitreg (FloatReg 5) = emit "fp5"
                     93:   | emitreg (FloatReg 6) = emit "fp6"
                     94:   | emitreg (FloatReg 7) = emit "fp7"
                     95:   | emitreg PC = emit "pc"
                     96: 
                     97: (* DEBUG val emitreg = diag "emitreg" emitreg *)
                     98: 
                     99: fun sizeint i =
                    100:        if i < 128 andalso i > ~129 then Byte
                    101:        else if i < 32768 andalso i > ~32769 then Word
                    102:        else Long
                    103: 
                    104: (* DEBUG val sizeint = diag "sizeint" sizeint *)
                    105: 
                    106: fun emitarg (Immed i) = (emit "#"; emit (itoa i))
                    107:   | emitarg (Abs i) = emit (itoa i)
                    108:   | emitarg (Direct r) = emitreg r
                    109:   | emitarg (Displace (ra as AddrReg _,0)) = (emitreg ra; emit "@")
                    110:   | emitarg (PostInc ra) = (emitreg ra; emit "@+")
                    111:   | emitarg (PreDec ra) = (emitreg ra; emit "@-")
                    112:   | emitarg (Displace (r as DataReg _, i)) = 
                    113:            (emit"@("; emit(itoa i); emit ","; emitreg r; emit ":L:1)")
                    114:   | emitarg (Displace (r as AddrReg _,i)) =
                    115:        (emitreg r;
                    116:         emit "@(";
                    117:         emit (itoa i);
                    118:         emit ")")
                    119:   | emitarg (Index (ra,disp,r,s)) =
                    120:        (emitreg ra;
                    121:         emit "@(";
                    122:         emit (itoa disp);
                    123:         emit ",";
                    124:         emitreg r;
                    125:         emit ":L:";
                    126:         emit (case s of Byte => "1" | Word => "2" | Long => "4");    
                    127:         emit ")")
                    128:   | emitarg (Address lab) = emit lab
                    129: 
                    130: (* DEBUG val emitarg = diag "emitarg" emitarg *)
                    131: 
                    132: fun emit2arg (a,b) = (emitarg a; emit ","; emitarg b; emit "\n")
                    133: 
                    134: (* DEBUG val emit2arg = diag "emit2arg" emit2arg *)
                    135: 
                    136: fun emit1arg (a) = (emitarg a; emit "\n")
                    137: 
                    138: fun align () = emit ".align 2\n"
                    139: 
                    140: (* DEBUG val align = diag "align" align *)
                    141: 
                    142: local val p = makestring power_tags
                    143:       val t = makestring tag_backptr
                    144: in
                    145: fun mark () = let val lab = newlabel()
                    146:              in  emit lab;
                    147:                  emit ": .long ((";
                    148:                  emit lab;
                    149:                  emit "-base)/4+1)*";   (* STRING dependency *)
                    150:                  emit p;
                    151:                  emit "+";
                    152:                  emit t;
                    153:                  emit "\n"
                    154:              end
                    155: end
                    156: 
                    157: (* DEBUG val mark = diag "mark" mark *)
                    158: 
                    159: fun define lab = (emit lab; emit ":\n")
                    160: (* DEBUG val define = diag "define" define *)
                    161: fun oct i = let val m = Integer.makestring
                    162:            in  m(i div 64)^m((i div 8)mod 8)^m(i mod 8) end
                    163: (* DEBUG val oct = diag "oct" oct *)
                    164: fun c_char "\n" = "\\n"
                    165:   | c_char "\t" = "\\t"
                    166:   | c_char "\\" = "\\\\"
                    167:   | c_char "\"" = "\\\""
                    168:   | c_char c = if ord c < 32 then "\\"^oct(ord c) else c
                    169: fun a_str s = implode(map c_char (explode s))
                    170: fun emitstring s = (emit ".ascii \""; emit(a_str s); emit "\"\n")
                    171: fun realconst s = (emit ".double 0r"; emit s; emit "\n")
                    172: fun emitlong (i : int) = (emit ".long "; emit(makestring i); emit "\n")
                    173: 
                    174: fun emitlab (offset,l2) = 
                    175:        (emit "5: .long "; emit l2; emit "-5b";
                    176:         if offset < 0 then (emit "-"; emit (makestring (~offset)))
                    177:                       else (emit "+"; emit (makestring offset));
                    178:         emit "\n")
                    179: 
                    180: exception Illegal
                    181: 
                    182: fun rts () = emit "rts\n"
                    183: 
                    184: fun exg (arg as (Direct(AddrReg a),Direct(AddrReg b))) =
                    185:        if a = b then ()
                    186:        else (emit "exg "; emit2arg arg)
                    187:   | exg (arg as (Direct(DataReg a),Direct(DataReg b))) =
                    188:        if a = b then ()
                    189:        else (emit "exg "; emit2arg arg)
                    190:   | exg (arg as (Direct(AddrReg b),Direct(DataReg a))) =
                    191:        (emit "exg "; emit2arg arg)
                    192:   | exg (arg as (Direct(DataReg a),Direct(AddrReg b))) =
                    193:        (emit "exg "; emit2arg arg)
                    194: 
                    195: fun pea (Direct _) = raise Illegal
                    196:   | pea (PreDec _) = raise Illegal
                    197:   | pea (PostInc _) = raise Illegal
                    198:   | pea (Immed _) = raise Illegal
                    199:   | pea (arg as (Address lab)) =
                    200:        (emit "pea "; emit1arg arg)
                    201:   | pea (arg) =
                    202:        (emit "pea "; emit1arg arg)
                    203: 
                    204: fun movl (_,Immed _) = raise Illegal
                    205:   (* labels not implemented *)
                    206:   (* MOVEQ/MOVE *)
                    207:   | movl (src as (Immed i),dest as (Direct(DataReg d))) =
                    208:        (case sizeint i of
                    209:            Byte => (emit "moveq "; emit2arg (src,dest))
                    210:          | _ => (emit "movl "; emit2arg (src,dest)))
                    211:   (* MOVEA *)
                    212:   | movl (src,dest as (Direct(AddrReg a))) =
                    213:        (emit "movl "; emit2arg (src,dest))
                    214:   (* general MOVE *)
                    215:   | movl (src,dest) =
                    216:        (emit "movl "; emit2arg (src,dest))
                    217: 
                    218: fun addl (_,Immed _) = raise Illegal
                    219:   (* ADDQ/ADDA *)
                    220:   | addl (src as (Immed i),dest as (Direct(AddrReg a))) =
                    221:        if i <= 8 andalso i >= 1 then
                    222:                (emit "addql "; emit2arg(src,dest))
                    223:        else    (emit "addl "; emit2arg(src,dest))
                    224:   | addl (src,dest as (Direct(AddrReg a))) =
                    225:        (emit "addl "; emit2arg (src,dest))
                    226:   (* ADDQ/ADDI *)
                    227:   | addl (src as (Immed i),dest) =
                    228:        if i <= 8 andalso i >= 1 then
                    229:                (emit "addql "; emit2arg (src,dest))
                    230:        else    (emit "addl "; emit2arg (src,dest))
                    231:   (* general ADD *)
                    232:   | addl (src,dest as (Direct(DataReg d))) = 
                    233:        (emit "addl "; emit2arg (src,dest))
                    234:   | addl (src as (Direct(DataReg d)),dest) =
                    235:        (emit "addl "; emit2arg (src,dest))
                    236: 
                    237: fun lea (Direct _,_) = raise Illegal
                    238:   | lea (PreDec _,_) = raise Illegal
                    239:   | lea (PostInc _,_) = raise Illegal
                    240:   | lea (Immed _,_) = raise Illegal
                    241:   | lea (src as Address _,dest as Direct(AddrReg _)) =
                    242:        (emit "lea "; emit2arg (src,dest))
                    243:   | lea (src,dest as (Direct(AddrReg a))) =
                    244:        (emit "lea "; emit2arg (src,dest))
                    245:   | lea (Displace(a, i), dest as (Direct(DataReg _))) =    (* fake lea to data register *)
                    246:        (movl(Direct(a), dest); addl(Immed(i), dest))
                    247:   | lea _ = raise Illegal
                    248: 
                    249: (* DEBUG val lea = diag "lea" lea *)
                    250: 
                    251: fun subl (_,Immed _) = raise Illegal
                    252:   (* SUBQ/SUBA *)
                    253:   | subl (src  as (Immed i),dest as (Direct(AddrReg a))) =
                    254:        if i <= 8 andalso i >= 1 then
                    255:                (emit "subql "; emit2arg(src,dest))
                    256:        else    (emit "subl "; emit2arg(src,dest))
                    257:   (* SUBA *)
                    258:   | subl (src,dest as (Direct(AddrReg a))) =
                    259:        (emit "subl "; emit2arg(src,dest))
                    260:   (* SUBQ/SUBI *)
                    261:   | subl (src as (Immed i),dest) =
                    262:        if i <= 8 andalso i >= 1 then
                    263:                (emit "subql "; emit2arg(src,dest))
                    264:        else    (emit "subl "; emit2arg(src,dest))
                    265:   (* general SUB *)
                    266:   | subl (src,dest as (Direct(DataReg d))) = 
                    267:        (emit "subl "; emit2arg(src,dest))
                    268:   | subl (src as (Direct(DataReg d)),dest) = 
                    269:        (emit "subl "; emit2arg(src,dest))
                    270: 
                    271: fun eorl (_, Direct(AddrReg _)) = raise Illegal
                    272:   | eorl args = (emit "eorl "; emit2arg args)
                    273: 
                    274: fun orl (_, Direct(AddrReg _)) = raise Illegal
                    275:   | orl args = (emit "orl "; emit2arg args)
                    276: 
                    277: fun andl (_, Direct(AddrReg _)) = raise Illegal
                    278:   | andl args = (emit "andl "; emit2arg args)
                    279: 
                    280: fun divl args = (emit "divl "; emit2arg args)
                    281: fun mull args = (emit "mull "; emit2arg args)
                    282: fun asll (Immed 1, arg) = (emit "asll "; emit1arg arg)
                    283:   | asll args = (emit "asll "; emit2arg args)
                    284: fun asrl (Immed 1, arg) = (emit "asrl "; emit1arg arg)
                    285:   | asrl args = (emit "asrl "; emit2arg args)
                    286: fun movb (Immed 0, arg) = (emit "clrb "; emit1arg arg)
                    287:   | movb args = (emit "movb "; emit2arg args)
                    288: 
                    289: fun cmpl (src, dest as (Immed i)) =
                    290:        (print "?bad cmpl\n"; emit "| BAD cmpl "; emit2arg(src, dest))
                    291:   (* CMP *)
                    292:   | cmpl (src,dest as (Direct(DataReg d))) =
                    293:        (emit "cmpl "; emit2arg (src,dest))
                    294:   (* CMPA *)
                    295:   | cmpl (src,dest as (Direct(AddrReg a))) =
                    296:        (emit "cmpl "; emit2arg (src,dest))
                    297:   (* CMPI *)
                    298:   | cmpl (src as (Immed i),dest) =
                    299:        (emit "cmpl "; emit2arg (src,dest))
                    300:   (* CMPM *)
                    301:   | cmpl (src as (PostInc(AddrReg y)),dest as (PostInc(AddrReg x))) =
                    302:        (emit "cmpm "; emit2arg (src,dest))
                    303: 
                    304: fun btst (_,Direct(AddrReg _)) = raise Illegal
                    305:   | btst (_,Immed _) = raise Illegal
                    306:   | btst (src as (Direct(DataReg d)),dest) =
                    307:        (emit "btst "; emit2arg (src,dest))
                    308:   | btst (src as (Immed i),dest) =
                    309:        (emit "btst "; emit2arg (src,dest))
                    310: 
                    311: 
                    312: fun jne (arg as (Address lab)) = (emit "jne "; emit1arg arg)
                    313: fun jeq (arg as (Address lab)) = (emit "jeq "; emit1arg arg)
                    314: fun jgt (arg as (Address lab)) = (emit "jgt "; emit1arg arg)
                    315: fun jge (arg as (Address lab)) = (emit "jge "; emit1arg arg)
                    316: fun jlt (arg as (Address lab)) = (emit "jlt "; emit1arg arg)
                    317: fun jle (arg as (Address lab)) = (emit "jle "; emit1arg arg)
                    318: 
                    319: fun jra (arg as (Address lab)) =
                    320:        (emit "jra "; emit1arg arg)
                    321:   | jra (arg as (Displace(AddrReg a,i))) =
                    322:        (emit "jra "; emit1arg arg)
                    323:   | jra (arg as Index _) =
                    324:        (emit "jra "; emit1arg arg)
                    325: 
                    326: fun jbsr (arg as (Address lab)) =
                    327:        (emit "jbsr "; emit1arg arg)
                    328:   | jbsr (arg as (Displace(AddrReg _,_))) =
                    329:        (emit "jbsr "; emit1arg arg)
                    330: 
                    331: (* 68881 float operations *)
                    332: (* Some src/dest combinations are illegal, but not caught here. *)
                    333: fun fjne (arg as (Address lab)) = (emit "fjne "; emit1arg arg)
                    334: fun fjeq (arg as (Address lab)) = (emit "fjeq "; emit1arg arg)
                    335: fun fjgt (arg as (Address lab)) = (emit "fjgt "; emit1arg arg)
                    336: fun fjge (arg as (Address lab)) = (emit "fjge "; emit1arg arg)
                    337: fun fjlt (arg as (Address lab)) = (emit "fjlt "; emit1arg arg)
                    338: fun fjle (arg as (Address lab)) = (emit "fjle "; emit1arg arg)
                    339: 
                    340: fun fcmpd (arg as (src,dest)) = (emit "fcmpd "; emit2arg arg)
                    341: fun faddd (arg as (src,dest)) = (emit "faddd "; emit2arg arg)
                    342: fun fsubd (arg as (src,dest)) = (emit "fsubd "; emit2arg arg)
                    343: fun fmuld (arg as (src,dest)) = (emit "fmuld "; emit2arg arg)
                    344: fun fdivd (arg as (src,dest)) = (emit "fdivd "; emit2arg arg)
                    345: fun fnegd (arg as (src,dest)) = (emit "fnegd "; emit2arg arg)
                    346: fun fmoved (arg as (src,dest as Direct(FloatReg f))) =
                    347:        (emit "fmoved "; emit2arg arg)
                    348:   | fmoved (arg as (src as Direct(FloatReg f),dest)) =
                    349:        (emit "fmoved "; emit2arg arg)
                    350: 
                    351: fun trapv() = emit "trapv\n"
                    352: fun trapmi() = emit "trapmi\n"
                    353: 
                    354: fun exg args = (emit "exg "; emit2arg args)
                    355: 
                    356: fun push ea = movl(ea,PreDec sp)
                    357: 
                    358: fun pop ea = movl(PostInc sp,ea)
                    359: 
                    360: val pusha = pea
                    361: 
                    362: val comment = emit
                    363: 
                    364: end (* structure AsCode *)

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.