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

1.1       root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
                      2: functor NS32CM(V : NS32CODER) : CMACHINE = struct
                      3: 
                      4: structure V' : sig datatype Register = Genreg of int
                      5:                                     | FloatReg of int
                      6:                                     | FP
                      7:                                     | SP
                      8:                                     | SB
                      9:                                     | PC
                     10: 
                     11:                   eqtype Label sharing type Label = V.Label
                     12:                   datatype Size = Byte | Word | Long
                     13:                        
                     14:                   datatype EA = Direct of Register
                     15:                               | Topofstack
                     16:                               | Displace of int * Register
                     17:                               | Immed of int
                     18:                               | Immedlab of Label
                     19:                               | Abs of int
                     20:                               | OffAddress of Label * int
                     21:                               | Index of EA * Register * Size
                     22: 
                     23:                end = V
                     24: open V' System.Tags
                     25: 
                     26: datatype condition = NEQ | EQL | LEQ | GEQ | LSS | GTR
                     27: 
                     28: fun address lab = OffAddress(lab,0)    (* old Address style *)
                     29: 
                     30: fun defer(Direct r) = Displace(0,r)
                     31:   | defer(Immedlab lab) = address lab
                     32:   | defer(Displace z) = ErrorMsg.impossible "defer of displace in cpsns32"
                     33:   | defer _ = ErrorMsg.impossible "defer in cpsns32"
                     34: 
                     35: val sp' = SP
                     36: val exnptr = Displace(0, SB)
                     37: val dataptr as Direct dataptr' = Direct(FP)
                     38: val arithtemp as Direct arithtemp' = Direct(Genreg 6)
                     39: val arithtemp2 = Direct(Genreg 7)
                     40: val storeptr = Displace(4, SB)
                     41: val standardclosure = Direct(Genreg 2)
                     42: val standardarg = Direct(Genreg 0)
                     43: val standardcont = Direct(Genreg 1)
                     44: val miscregs : EA list = map (Direct o Genreg) [3,4]
                     45: val ptrtemp = Direct(Genreg 5)
                     46: 
                     47: fun newlabel() = Immedlab(V.newlabel())
                     48: fun emitlab(i,Immedlab lab) = V.emitlab(i,lab)
                     49: fun define (Immedlab lab) = V.define lab
                     50: fun beginStdFn _ = ()
                     51: 
                     52: val align = V.align
                     53: val mark = V.mark
                     54: 
                     55: fun move(Immedlab l, dest as Direct(Genreg x)) = V.lea(address l, dest)
                     56:   | move(Immedlab l, dest) = (* This via ptrtemp probably not needed BUGBUG *)
                     57:            (V.lea(address l, ptrtemp);
                     58:             move(ptrtemp, dest))
                     59: (* Only runtime knows about SB and MOD registers.
                     60:    We use SB as a base for our pseudo-registers.
                     61:   | move(src as Direct(SB), dest) = V.sprl(src, dest)
                     62:   | move(src, dest as Direct(SB)) = V.lprl(src, dest)
                     63:  *)
                     64:   | move(src as Direct(FP), dest) = V.sprl(src, dest)
                     65:   | move(src, dest as Direct(FP)) = V.lprl(src, dest)
                     66:   | move x = V.movl x
                     67: 
                     68: (* checkLimit (n):
                     69:  * Generate code to check the heap limit to see if there is enough free space
                     70:  * to allocate n bytes.
                     71:  *)
                     72: fun checkLimit maxAllocSize = (
                     73:       V.comment ("begin fun, max alloc = "^(makestring maxAllocSize)^"\n");
                     74:     (* Check the heap limit by writing to the dataptr+maxAllocSize-4 *)
                     75:       move(Immed 0, Displace(maxAllocSize-4, dataptr')))
                     76: 
                     77: val emitlong = V.emitlong
                     78: val realconst = V.realconst
                     79: val emitstring = V.emitstring
                     80: 
                     81: fun jmpindexb lab = V.jump(Index(defer lab, arithtemp', Byte))
                     82: 
                     83: fun record(vl, z) =
                     84:     let open CPS
                     85:        val len = List.length vl
                     86:        fun f(i,nil) = ()
                     87:          | f(i,(Direct r, SELp(j,p))::rest) = f(i,(Displace(j*4,r),p)::rest)
                     88:          | f(i,(Immedlab l, p)::rest) = (V.lea(address l, ptrtemp);
                     89:                                          f(i, (ptrtemp,p)::rest))
                     90:          | f(i,(x,OFFp 0)::rest) = (move(x,Displace(i*4,dataptr'));
                     91:                                     f(i-1,rest))
                     92:          | f(i,(Direct r, OFFp j)::rest) = (V.lea(Displace(j*4,r),
                     93:                                                   Displace(i*4,dataptr'));
                     94:                                                 f(i-1,rest))
                     95:          | f(i,(x,p)::rest) = (move(x,ptrtemp); f(i,(ptrtemp,p)::rest))
                     96:       in
                     97:         f(len - 2, rev vl);
                     98:         move(dataptr,z);
                     99:          V.lea(Displace(4*len, dataptr'), ptrtemp);
                    100:          move(ptrtemp, dataptr)
                    101: (*         V.addl(Immed(4*len), dataptr)       *)
                    102:      end
                    103: 
                    104: fun select(i, Direct r, s) = move(Displace(i*4,r),s)
                    105:   | select(0, a, s) = move(defer a, s) (* BUGBUG *)
                    106: 
                    107: fun offset(i, Direct r, s) = V.lea(Displace(i*4,r),s)
                    108: 
                    109: exception Three
                    110: fun three opcode (a,b,c) = 
                    111:            if b=c then opcode(a,b) 
                    112:            else if a=c then (move(a,ptrtemp); three opcode(ptrtemp,b,c))
                    113:            else (move(b,c); opcode(a,c))
                    114: 
                    115: (* opcode is commutative *)
                    116: fun threec opcode (a,b,c) = 
                    117:             if b=c then opcode(a,c)
                    118:             else if a=c then opcode(b,c)
                    119:             else (move(b,c); opcode(a,c))
                    120: 
                    121: (* opcode(x,y) is bop(y,anti(x)) *)
                    122: fun threeab opcode anti bop (a,b,c) = 
                    123:             if b=c then opcode(a,c)
                    124:             else if a=c then (anti(c,c); bop(b,c))
                    125:             else (move(b,c); opcode(a,c))
                    126: 
                    127: (* The use of three here is silly.
                    128:    If opcode is commutative, then only one move should ever
                    129:    be necessary, not two, as in the middle case of above.
                    130:    Also note that we have few registers, so folding is likely.
                    131:    The only non-commutative 3-operation here is subl3.
                    132:    Subtraction may require a move, but in this case we should
                    133:    do a negate instead of a move, then add.
                    134:  *)
                    135: 
                    136: val addl3 = threec V.addl
                    137: val addl3t = addl3
                    138: val subl3 = threeab V.subl V.negl V.addl
                    139: val subl3t = subl3
                    140: fun ashl(s, r, d as Direct(Genreg _)) =
                    141:         (if r<>d then move(r,d) else ();
                    142:          V.ashl(s,d))
                    143: fun ashr(Immed i, b, c) = ashl(Immed (~i), b, c)
                    144:   | ashr(a,b,c) = (V.negl(a,ptrtemp);
                    145:                   ashl(ptrtemp,b,c))
                    146: val mull2 = V.mull
                    147: val mull2t = mull2
                    148: val divl2 = V.divl
                    149: val andb = threec V.andl
                    150: val orb = threec V.orl
                    151: val xorb = threec V.xorl
                    152: fun notb (a,b) = V.coml(a,b)
                    153: 
                    154: fun fetchindexl(Direct x,y,Immed k) = move(Displace(k+k-2,x),y)
                    155:   | fetchindexl(Direct x,y,Direct z) = move(Index(Displace(~2,x),z,Word),y)
                    156:   | fetchindexl(Immedlab lab, y, Direct z) =
                    157:        move(Index(OffAddress(lab,~2), z, Word), y)
                    158: fun storeindexl(x,y, Immed 1) = move(x, defer y)
                    159:   | storeindexl(x, Direct y, Immed k) = move(x, Displace(k+k-2,y))
                    160:   | storeindexl(x, Direct y, Direct z) = move(x,Index(Displace(~2,y),z,Word))
                    161: fun fetchindexb(v,w) = V.movzbl(Index(defer v, arithtemp', Byte),w)
                    162: fun storeindexb(v,w) = V.movb(v,Index(defer w, arithtemp', Byte))
                    163: 
                    164: fun finishreal(y) = (V.movl(Immed(8*power_tags + tag_string),
                    165:                            Displace(~4,dataptr'));
                    166:                     move(dataptr,y);
                    167:                     V.lea(Displace(4*3, dataptr'), ptrtemp);
                    168:                     move(ptrtemp, dataptr))
                    169: (*                     V.addl(Immed(4*3), dataptr)) *)
                    170: 
                    171: val fp0 = FloatReg 0
                    172: 
                    173: fun float f (a,b,c) =
                    174:     (V.movg(defer a, Direct fp0);
                    175:      f(defer b, Direct fp0);
                    176:      V.movg(Direct fp0, defer dataptr);
                    177:      finishreal c)
                    178: 
                    179: fun mnegg(x,y) = (V.negg(defer x, defer dataptr); finishreal y)
                    180: 
                    181: val mulg3 = float V.mulg
                    182: val divg3 = float V.divg
                    183: val addg3 = float V.addg
                    184: val subg3 = float V.subg
                    185: 
                    186: fun cbranch NEQ = V.bne
                    187:   | cbranch EQL = V.beq
                    188:   | cbranch LEQ = V.ble
                    189:   | cbranch GEQ = V.bge
                    190:   | cbranch LSS = V.blt
                    191:   | cbranch GTR = V.bgt
                    192: 
                    193: fun ibranch (cond, op1, op2, label) =
                    194:        (V.cmpl(op1, op2); cbranch cond (defer label))
                    195: 
                    196: fun gbranch (cond, op1, op2, label) =
                    197:        (V.cmpg(defer op1, defer op2); cbranch cond (defer label))
                    198: 
                    199: fun defer' j = fn x => j(defer x)
                    200: val jmp = defer' V.jump
                    201: val bbs = fn(x,y,l) => (V.tbit(x,y); V.bfs(defer l))
                    202: 
                    203: val immed = Immed
                    204: fun isimmed(Immed i) = SOME i
                    205:   | isimmed _ = NONE
                    206: 
                    207: fun isreg(Direct(Genreg i)) = SOME i
                    208: (*  | isreg(Direct(FP)) = SOME(8)              (* What?  BUGBUG *) *)
                    209:   | isreg _ = NONE
                    210: 
                    211: fun eqreg (a: EA) b = a=b
                    212: 
                    213: fun profile(i,incr) = if i >= Profile.PROFSIZE
                    214:                        then ErrorMsg.impossible ("Bad profiling in ns32: trying "
                    215:                                                  ^makestring i^" with size "
                    216:                                                  ^makestring Profile.PROFSIZE)
                    217:                        else V.addl(Immed incr, Displace(4*i,sp')) (* MSPACE mode *) 
                    218: 
                    219: val comment = V.comment
                    220: end

unix.superglobalmegacorp.com

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