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

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: functor M68CM(V : M68CODER) : CMACHINE = struct
                      3: 
                      4: structure V' : sig 
                      5:                        datatype Register = DataReg of int
                      6:                                          | AddrReg of int
                      7:                                          | FloatReg of int
                      8:                                          | PC
                      9:                        
                     10:                        type Label sharing type Label = V.Label
                     11:                        datatype Size = Byte | Word | Long
                     12:                        
                     13:                        datatype EA = Direct of Register
                     14:                                    | PostInc of Register
                     15:                                    | PreDec of Register
                     16:                                    | Displace of Register * int
                     17:                                    | Index of Register * int * Register * Size
                     18:                                    | Immed of int
                     19:                                    | Immedlab of Label
                     20:                                    | Abs of int
                     21:                                    | Address of Label
                     22: 
                     23:                end = V
                     24: open V'
                     25: 
                     26: datatype condition = NEQ | EQL | LEQ | GEQ | LSS | GTR
                     27: 
                     28: (* +DEBUG *)
                     29: fun diag (s : string) f x =
                     30:        f x handle e =>
                     31:                (print "?exception "; print (System.exn_name e);
                     32:                 print " in m68."; print s; print "\n";
                     33:                 raise e)
                     34: (* -DEBUG *)
                     35: 
                     36: fun defer(Direct r) = Displace(r,0)
                     37:   | defer(Immedlab lab) = Address lab
                     38:   | defer _ = ErrorMsg.impossible "defer in cpsm68"
                     39: 
                     40: (* DEBUG *) val defer = diag "defer" defer 
                     41: 
                     42: val exnptr = Direct(DataReg 7)
                     43: val dataptr as Direct dataptr' = Direct(AddrReg 6)
                     44: val arithtemp as Direct arithtemp' = Direct(DataReg 1)
                     45: val arithtemp2 = Direct(DataReg 2)
                     46: val arithtemp3 = Direct(DataReg 4)
                     47: val storeptr = Direct(DataReg 6)
                     48: val standardclosure = Direct(AddrReg 2)
                     49: val standardarg = Direct(AddrReg 0)
                     50: val standardcont = Direct(AddrReg 1)
                     51: val miscregs = map (Direct o AddrReg) [3,4]
                     52: val datalimit = Direct(DataReg 5)
                     53: 
                     54: val ptrtemp2 = Direct(DataReg 3)
                     55: val ptrtemp as Direct ptrtemp' = Direct(AddrReg 5)
                     56: 
                     57: fun reg(Direct r) = r
                     58: 
                     59: fun newlabel() = Immedlab(V.newlabel())
                     60: (* DEBUG *) val newlabel = diag "newlabel" newlabel 
                     61: fun emitlab(i,Immedlab lab) = V.emitlab(i,lab)
                     62: fun define (Immedlab lab) = V.define lab
                     63: 
                     64: fun beginStdFn _ = ()
                     65: 
                     66: (* checkLimit (n):
                     67:  * Generate code to check the heap limit to see if there is enough free space
                     68:  * to allocate n bytes.
                     69:  *)
                     70: fun checkLimit maxAllocSize = (
                     71:       V.comment ("check limit, max alloc = "^(makestring maxAllocSize)^"\n");
                     72:     (* Check the heap limit register *)
                     73:       if (maxAllocSize <= 4096)
                     74:        then (
                     75:          V.cmpl(dataptr, datalimit);
                     76:          V.trapmi())
                     77:        else (
                     78:          V.movl (dataptr, arithtemp3);
                     79:          V.addl(Immed(maxAllocSize-4096), arithtemp3);
                     80:          V.cmpl(arithtemp3, datalimit);
                     81:          V.trapmi()))
                     82: 
                     83: val align = V.align
                     84: val mark = V.mark
                     85: fun move(Immedlab l, dest as Direct(AddrReg x)) = V.lea(Address l, dest)
                     86:   | move(Immedlab l, dest) = 
                     87:            (V.lea(Address l, ptrtemp);
                     88:             move(ptrtemp,dest))
                     89:   | move(Displace(DataReg(d), i), dest) =
                     90:            (V.movl(Direct(DataReg(d)), ptrtemp);
                     91:             move(Displace(reg(ptrtemp), i), dest))
                     92: (* let's hope that ptrtemp never shows up in both src and dest! *)
                     93:   | move(src, Address l) =
                     94:              (V.lea(Address l, ptrtemp);
                     95:               move(src, Displace(reg(ptrtemp), 0)))
                     96:   | move x = V.movl x
                     97: (* DEBUG *) val move = diag "move" move 
                     98: 
                     99: val emitlong = V.emitlong
                    100: val realconst = V.realconst
                    101: val emitstring = V.emitstring
                    102: 
                    103: fun ashl(s as Immed k, r, d as Direct(DataReg _)) =
                    104:     (if r<>d then move(r,d) else (); V.asll(s,d))
                    105:   | ashl(s as Direct(DataReg _),r,d) =
                    106:     (move(r,arithtemp3); V.asll(s,arithtemp3); move(arithtemp3,d))
                    107:   | ashl(s as Immed k,r,d) =
                    108:     (move(r,arithtemp3);
                    109:      if k>8
                    110:        then (move(s,arithtemp2); V.asll(arithtemp2,arithtemp3))
                    111:        else V.asll(s,arithtemp3);
                    112:      move(arithtemp3,d))
                    113: 
                    114: (* DEBUG *) val ashl = diag "ashl" ashl 
                    115: 
                    116: fun ashr(s as Immed k, r, d as Direct(DataReg _)) =
                    117:     (if r<>d then move(r,d) else ();
                    118:      if k>8 then (move(s,arithtemp3); V.asrl(arithtemp3,d)) else V.asrl(s,d))
                    119:   | ashr(s as Direct(DataReg _),r,d) =
                    120:     (move(r,arithtemp3); V.asrl(s,arithtemp3); move(arithtemp3,d))
                    121:   | ashr(s as Immed k,r,d) =
                    122:     (move(r,arithtemp3); 
                    123:      if k>8
                    124:      then (move(s,arithtemp2); V.asrl(arithtemp2,arithtemp3))
                    125:      else V.asrl(s,arithtemp3);
                    126:      move(arithtemp3,d))
                    127: 
                    128: fun jmpindexb lab = V.jra(Index(PC,2,arithtemp',Byte))
                    129: (* DEBUG *) val jmpindexb = diag "jmpindexb" jmpindexb 
                    130: 
                    131: fun record(vl, z) =
                    132:     let open CPS
                    133:        fun f (Direct r, SELp(j,p)) = f(Displace(r,j*4),p)
                    134:          | f (Immedlab l, p) = (V.lea(Address l, ptrtemp); f(ptrtemp,p))
                    135:          | f (x,OFFp 0) = V.movl(x, PostInc dataptr')
                    136:          | f (Direct r, OFFp j) = (V.lea(Displace(r,j*4),ptrtemp);
                    137:                                    f(ptrtemp,OFFp 0))
                    138:          | f (x,p) = (V.movl(x,ptrtemp); f(ptrtemp,p))
                    139:       in
                    140:         app f vl;
                    141:         V.lea(Displace(dataptr',~4*(List.length(vl)-1)),z)
                    142:      end
                    143: 
                    144: fun select(i, Direct r, s) = move(Displace(r,i*4),s)
                    145:   | select(0, a, s) = move(defer a,s)
                    146: 
                    147: fun offset(i, Direct r, s) = V.lea(Displace(r,i*4),s)
                    148: (* DEBUG *) val select = diag "select" select 
                    149: (* DEBUG *) val offset = diag "offset" offset 
                    150: 
                    151: exception Three
                    152: fun three opcode (a as Direct(AddrReg _), b as Direct(AddrReg _),
                    153:                  c as Direct(AddrReg _)) =
                    154:                 (three opcode(a,b,arithtemp3); move(arithtemp3,c))
                    155:   | three opcode (a,b,c) = 
                    156:            if b=c then opcode(a,b) 
                    157:            else if a=c then (move(a,arithtemp3); three opcode(arithtemp3,b,c))
                    158:            else (move(b,c); opcode(a,c))
                    159: 
                    160: fun threet opcode (a,b,c as Direct(AddrReg _)) =
                    161:                 (threet opcode(a,b,arithtemp3); move(arithtemp3,c))
                    162:   | threet opcode (a,b,c) = 
                    163:            if b=c then (opcode(a,b); V.trapv())
                    164:            else if a=c then (move(a,arithtemp3); threet opcode(arithtemp3,b,c))
                    165:            else (move(b,c); opcode(a,c); V.trapv())
                    166: 
                    167: fun three' opcode (a as Immed _,b,c as Direct(DataReg _)) =
                    168:            three opcode(a,b,c)
                    169:   | three' opcode (a as Direct(AddrReg _),b,c) =
                    170:            (move(b,arithtemp3); move(a,arithtemp2);
                    171:             opcode(arithtemp2,arithtemp3); move(arithtemp3,c))
                    172:   | three' opcode (a,b,c) =
                    173:            (move(b,arithtemp3); opcode(a,arithtemp3); move(arithtemp3,c))
                    174: 
                    175: fun orb(a as Immed k,b,c as Direct(DataReg _)) =
                    176:     if k<65538
                    177:     then if k<=0
                    178:          then raise Match
                    179:         else if b=c then V.orl(a,b) else (move(b,c); V.orl(a,c))
                    180:     else (move(a,arithtemp3);
                    181:          if b=c then V.orl(arithtemp3,b) else (move(b,c); V.orl(arithtemp3,c)))
                    182:   | orb(a as Direct(AddrReg _),b,c) =
                    183:            (move(b,arithtemp3); move(a,arithtemp2);
                    184:             V.orl(arithtemp2,arithtemp3); move(arithtemp3,c))
                    185:   | orb(a as Immed k,b,c) =
                    186:     if k<65536
                    187:     then if k<=0
                    188:          then raise Match
                    189:         else (move(b,arithtemp3); V.orl(a,arithtemp3); move(arithtemp3,c))
                    190:     else (move(a,arithtemp2);
                    191:          move(b,arithtemp3);
                    192:          V.orl(arithtemp2,arithtemp3);
                    193:          move(arithtemp3,c))
                    194:   | orb(a,b,c) = (move(b,arithtemp3); V.orl(a,arithtemp3); move(arithtemp3,c))
                    195: 
                    196: fun xorb(a as Immed k,b,c as Direct(DataReg _)) =
                    197:     if k<65536
                    198:     then if k<=0
                    199:          then raise Match
                    200:         else if b=c then V.eorl(a,b) else (move(b,c); V.eorl(a,c))
                    201:     else (move(a,arithtemp3);
                    202:          if b=c then V.eorl(arithtemp3,b) else (move(b,c); V.eorl(arithtemp3,c)))
                    203:   | xorb(a as Direct(AddrReg _),b,c) =
                    204:            (move(b,arithtemp3); move(a,arithtemp2);
                    205:             V.eorl(arithtemp2,arithtemp3); move(arithtemp3,c))
                    206:   | xorb(a as Immed k,b,c) =
                    207:     if k<65538
                    208:     then if k<=0
                    209:          then raise Match
                    210:         else (move(b,arithtemp3); V.eorl(a,arithtemp3); move(arithtemp3,c))
                    211:     else (move(a,arithtemp2);
                    212:          move(b,arithtemp3);
                    213:          V.eorl(arithtemp2,arithtemp3);
                    214:          move(arithtemp3,c))
                    215:   | xorb(a,b,c) = (move(b,arithtemp3); V.eorl(a,arithtemp3); move(arithtemp3,c))
                    216: 
                    217: fun notb(a,b) = (move(Immed ~1,arithtemp3); V.subl(a,arithtemp3);
                    218:                 move(arithtemp3,b))
                    219: val andb = three' V.andl
                    220: val addl3 = three V.addl
                    221: val addl3t = threet V.addl
                    222: val subl3 = three V.subl
                    223: val subl3t = threet V.subl
                    224: val mull2 = V.mull
                    225: fun mull2t x = (mull2 x; V.trapv())
                    226: val divl2 = V.divl
                    227: 
                    228: exception Fetchindexb
                    229: fun fetchindexb(Direct x,y) = (if y=arithtemp then raise Fetchindexb else ();
                    230:                               move(Immed 0,y); 
                    231:                               V.movb(Index(x,0,arithtemp',Byte),y))
                    232: (* DEBUG *) val fetchindexb = diag "fetchindexb" fetchindexb 
                    233: fun storeindexb(x, Direct y) = V.movb(x,Index(y,0,arithtemp',Byte))
                    234: (* DEBUG *) val storeindexb = diag "storeindexb" storeindexb 
                    235: fun fetchindexl(Direct x,y,Immed k) = move(Displace(x,k+k-2),y)
                    236:   | fetchindexl(Direct x,y,Direct z) = move(Index(x,~2,z,Word),y)
                    237:   | fetchindexl(Immedlab lab, y, Direct z) = 
                    238:            (* this is a hack, since it depends on lab being PC+6 *)
                    239:                    move(Index(PC,4,z,Word), y);
                    240: (* DEBUG *) val fetchindexl = diag "fetchindexl" fetchindexl 
                    241: fun storeindexl(x, y, Immed 1) = move(x, defer y)
                    242:   | storeindexl(x, Direct y, Immed k) = move(x, Displace(y,k+k-2))
                    243:   | storeindexl(x, Direct y, Direct z) = move(x,Index(y,~2,z,Word))
                    244: (* DEBUG *) val storeindexl = diag "storeindexl" storeindexl 
                    245: 
                    246: val fp0 = FloatReg 0
                    247: 
                    248: fun finishreal(c) =  (V.cmpl(dataptr,datalimit);
                    249:                      V.trapmi();
                    250:                      V.movl(Immed(8*System.Tags.power_tags
                    251:                                    + System.Tags.tag_string),
                    252:                             PostInc dataptr');
                    253:                     V.movl(dataptr,c);
                    254:                     V.fmoved(Direct fp0, PostInc dataptr'))
                    255: 
                    256: fun float f (a,b,c) =
                    257:     (V.fmoved(defer a, Direct fp0);
                    258:      f(defer b, Direct fp0);
                    259:      finishreal c)
                    260: 
                    261: fun mnegg (a,c) = (V.fnegd(defer a, Direct fp0); finishreal c)
                    262: 
                    263: val mulg3 = float V.fmuld
                    264: val divg3 = float V.fdivd
                    265: val addg3 = float V.faddd
                    266: val subg3 = float V.fsubd
                    267: 
                    268: fun cbranch NEQ = V.jne
                    269:   | cbranch EQL = V.jeq
                    270:   | cbranch LEQ = V.jle
                    271:   | cbranch GEQ = V.jge
                    272:   | cbranch LSS = V.jlt
                    273:   | cbranch GTR = V.jgt
                    274: 
                    275: fun fbranch NEQ = V.fjne
                    276:   | fbranch EQL = V.fjeq
                    277:   | fbranch LEQ = V.fjle
                    278:   | fbranch GEQ = V.fjge
                    279:   | fbranch LSS = V.fjlt
                    280:   | fbranch GTR = V.fjgt
                    281: 
                    282: fun rev LEQ = GEQ
                    283:   | rev GEQ = LEQ
                    284:   | rev LSS = GTR
                    285:   | rev GTR = LSS
                    286:   | rev NEQ = NEQ
                    287:   | rev EQL = EQL
                    288: 
                    289: fun ibranch (cond, op1 as Immed _, op2, label) =
                    290:        (V.cmpl(op1, op2); cbranch (rev cond) (defer label))
                    291:   | ibranch (cond, op1, op2, label) =
                    292:        (V.cmpl(op2, op1); cbranch cond (defer label))
                    293: 
                    294: fun gbranch (cond, op1, op2, label) =
                    295:        (V.fmoved(defer op1,Direct fp0);
                    296:          V.fcmpd(defer op2, Direct fp0);
                    297:          fbranch cond (defer label))
                    298: 
                    299: fun defer' j = fn x => j(defer x)
                    300: val jmp = defer' V.jra
                    301: fun bbs (x,dest as Direct(AddrReg _) ,l) = (move(dest,ptrtemp2);
                    302:                                            bbs(x,ptrtemp2,l))
                    303:   | bbs (x,y,l) = (V.btst(x,y); V.jne(defer l))
                    304: (* DEBUG *) val bbs = diag "bbs" bbs 
                    305: 
                    306: val immed = Immed
                    307: fun isimmed(Immed i) = SOME i
                    308:   | isimmed _ = NONE
                    309: fun isreg(Direct(AddrReg i)) = SOME i
                    310:   | isreg(Direct(DataReg i)) = SOME(i+8)
                    311:   | isreg _            = NONE
                    312: 
                    313: fun eqreg (a: EA) b = a=b
                    314: (* DEBUG *) val eqreg = diag "eqreg" eqreg 
                    315: 
                    316: fun profile(index,incr) = V.addl(Immed incr, Displace(V.sp,4*index))
                    317: 
                    318: val comment = V.comment
                    319: end

unix.superglobalmegacorp.com

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