Annotation of researchv10no/cmd/sml/src/m68/m68mcode.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: structure M68MCode : M68MCODER = struct
        !             3: 
        !             4: (* DEBUG
        !             5: fun diag (s : string) f x =
        !             6:        f x handle e =>
        !             7:                (print "?exception "; print (System.exn_name e);
        !             8:                 print " in basicm68."; print s; print "\n";
        !             9:                 raise e)
        !            10: *)
        !            11: 
        !            12: structure Jumps = struct
        !            13:     datatype JumpKind = Jcc of int | LEA of int | FJcc of int | LABPTR of int
        !            14:                        | MODE
        !            15:   datatype Size = Byte | Word | Long
        !            16:   
        !            17:   fun sizeint i =
        !            18:        if i < 128 andalso i > ~129 then Byte
        !            19:        else if i < 32768 andalso i > ~32769 then Word
        !            20:        else Long
        !            21:   
        !            22:   exception TooBig (* pc relative addressing only has 16-bit displacement *)
        !            23:   
        !            24:   fun sizejump (LEA _, _,s,d) = (* pc relative addressing *)
        !            25:        (case sizeint (d - s - 2) of
        !            26:              Byte => 4
        !            27:            | Word => 4
        !            28:            | Long => 8)
        !            29:     | sizejump (LABPTR _, _, _, _) = 4
        !            30:     | sizejump (Jcc _, _, s, d) =
        !            31:        (case sizeint (d - s - 2) of
        !            32:              Byte => 2
        !            33:            | Word => 4
        !            34:            | Long => 6)
        !            35:     | sizejump (FJcc _, _, s, d) =
        !            36:        (case sizeint (d - s - 2) of
        !            37:              Byte => 4
        !            38:            | Word => 4
        !            39:            | Long => 6)
        !            40:     | sizejump (MODE,_,_,_) = 2
        !            41:   
        !            42:   (* DEBUG val sizejump = diag "sizejump" sizejump *)
        !            43: 
        !            44: fun eword i =
        !            45:        if i < 0 then eword(65536 + i)
        !            46:        else chr(i div 256) ^ chr(i mod 256)
        !            47: 
        !            48: fun elong i =
        !            49:        if i < 0 then
        !            50:            let val a = ~i
        !            51:                val b = a mod 65536
        !            52:                val c = a div 65536
        !            53:            in  eword(~c + (if b = 0 then 0 else ~1)) ^ eword(~b)
        !            54:            end
        !            55:        else eword(i div 65536) ^ eword(i mod 65536)
        !            56: 
        !            57: val emitlong = elong
        !            58: 
        !            59: fun signedbyte i = if i < 0 then signedbyte (256 + i) else i
        !            60:   
        !            61:   exception Illegal
        !            62:   
        !            63:   fun emitjump (Jcc(opcode),2,s,d) =
        !            64:        (case (d-s-2) of
        !            65:               0 => eword(20081) (* nop *)
        !            66:             | _ => eword(opcode + signedbyte (d - s - 2)))
        !            67:     | emitjump (Jcc(opcode),4,s,d) = eword(opcode) ^ eword(d-s-2)
        !            68:     | emitjump(Jcc(opcode),6,s,d) = eword(opcode+255) ^ elong(d-s-2)
        !            69:     | emitjump(LABPTR i, _,s,d) = elong(d-s+i)
        !            70:     | emitjump (LEA(opcode),4,s,d) = (* pc relative *)
        !            71:        eword(opcode+58) ^ eword (d-s-2)
        !            72:     | emitjump (LEA(opcode),8,s,d) = (* pc relative *)
        !            73:        eword(opcode+59) ^ eword 368 ^ elong (d-s-2)
        !            74:     | emitjump (FJcc(cond),4,s,d) =
        !            75:        eword(62080+cond) ^ eword(d-s-2)
        !            76:     | emitjump (FJcc(cond),6,s,d) =
        !            77:        eword(62144+cond) ^ elong(d-s-2)
        !            78:     | emitjump (MODE,2,s,d) =
        !            79:       let val x = Integer.-(d,s)
        !            80:        in if x < 32768 andalso ~32768 <= x
        !            81:          then eword(d-s) 
        !            82:          else raise Illegal
        !            83:       end
        !            84: 
        !            85:   (* DEBUG val emitjump = diag "emitjump" emitjump *)
        !            86: end (* structure Jumps *)
        !            87: 
        !            88: structure Emitter : BACKPATCH = Backpatch(Jumps)
        !            89: 
        !            90: structure Coder : M68CODER = struct
        !            91: 
        !            92: open Emitter
        !            93: open Jumps
        !            94: 
        !            95: val emitword = fn i => emitstring(eword i)
        !            96: val emitlong = fn i => emitstring(elong i)
        !            97: 
        !            98: datatype Register = DataReg of int
        !            99:                  | AddrReg of int
        !           100:                  | FloatReg of int
        !           101:                  | PC
        !           102: 
        !           103: datatype EA = Direct of Register
        !           104:            | PostInc of Register
        !           105:            | PreDec of Register
        !           106:            | Displace of Register * int
        !           107:            | Index of Register * int * Register * Size
        !           108:            | Immedlab of Label
        !           109:            | Immed of int
        !           110:            | Abs of int
        !           111:            | Address of Label
        !           112: 
        !           113: val d0 = DataReg 0
        !           114: and d1 = DataReg 1
        !           115: and d2 = DataReg 2
        !           116: and d3 = DataReg 3
        !           117: and d4 = DataReg 4
        !           118: and d5 = DataReg 5
        !           119: and d6 = DataReg 6
        !           120: and d7 = DataReg 7
        !           121: and a0 = AddrReg 0
        !           122: and a1 = AddrReg 1
        !           123: and a2 = AddrReg 2
        !           124: and a3 = AddrReg 3
        !           125: and a4 = AddrReg 4
        !           126: and a5 = AddrReg 5
        !           127: and a6 = AddrReg 6
        !           128: and sp = AddrReg 7
        !           129: and fp0 = FloatReg 0
        !           130: and fp1 = FloatReg 1
        !           131: and fp2 = FloatReg 2
        !           132: and fp3 = FloatReg 3
        !           133: and fp4 = FloatReg 4
        !           134: and fp5 = FloatReg 5
        !           135: and fp6 = FloatReg 6
        !           136: and fp7 = FloatReg 7
        !           137: 
        !           138: exception BadLabelUse
        !           139: 
        !           140: (* DEBUG
        !           141: fun diag (s : string) f x =
        !           142:        f x handle e =>
        !           143:                (print "?exception "; print (System.exn_name e);
        !           144:                 print " in m68mcode."; print s; print "\n";
        !           145:                 raise e)
        !           146: *)
        !           147: 
        !           148: fun reg (Direct(DataReg d)) = d
        !           149:   | reg (Direct(AddrReg a)) = a
        !           150:   | reg (PostInc(AddrReg a)) = a
        !           151:   | reg (PreDec(AddrReg a)) = a
        !           152:   | reg (Displace(AddrReg a,_)) = a
        !           153:   | reg (Displace(DataReg a,_)) = 0
        !           154:   | reg (Index(PC,_,_,_)) = 3
        !           155:   | reg (Index(AddrReg a,_,_,_)) = a
        !           156:   | reg (Abs i) = (case sizeint i of
        !           157:                          Byte => 0
        !           158:                        | Word => 0
        !           159:                        | Long => 1)
        !           160:   | reg (Immed _) = 4
        !           161:   | reg (Address _) = 2
        !           162: 
        !           163: (* DEBUG val reg = diag "reg" reg *)
        !           164: 
        !           165: fun mode (Direct(DataReg _)) = 0
        !           166:   | mode (Direct(AddrReg _)) = 1
        !           167:   | mode (Displace(AddrReg _, 0)) = 2
        !           168:   | mode (PostInc(AddrReg _)) = 3
        !           169:   | mode (PreDec(AddrReg _)) = 4
        !           170:   | mode (Displace(AddrReg _,_)) = 5
        !           171:   | mode (Displace(DataReg _,_)) = 6
        !           172:   | mode (Index(PC,_,_,_)) = 7
        !           173:   | mode (Index(AddrReg _,_,_,_)) = 6
        !           174:   | mode (Abs _) = 7
        !           175:   | mode (Immed _) = 7
        !           176:   | mode (Address _) = 7
        !           177: 
        !           178: (* DEBUG val mode = diag "mode" mode *)
        !           179: 
        !           180: (* Very similar to Vax G_float format, except that the byte order within words
        !           181:    is different and the bias is different by 2. *)
        !           182: structure M68PrimReal : PRIMREAL =
        !           183: struct
        !           184: val significant = 53 (* 52 + redundant 1 bit *)
        !           185: fun outofrange s = ErrorMsg.complain("Real constant "^s^" out of range")
        !           186: (* Convert a portion of a boolean array to the appropriate integer. *)
        !           187: exception Bits
        !           188: fun bits(a,start,width) =
        !           189:     let fun b true = 1
        !           190:          | b false = 0
        !           191:        fun f 0 = b (a sub start)
        !           192:          | f n = b (a sub (start+n)) + 2 * f(n-1)
        !           193:     in  if Array.length a < start+width orelse start < 0 orelse width < 0
        !           194:        then raise Bits
        !           195:        else f (width-1)
        !           196:     end
        !           197: fun emitreal (sign,frac,exp) =
        !           198:     let val exponent = exp + 1022
        !           199:        fun emit () =
        !           200:            let val word0 =
        !           201:                   case frac sub 0 of (* zero? *)
        !           202:                     true => Bits.orb(Bits.lshift(sign,15),
        !           203:                                      Bits.orb(Bits.lshift(exponent,4),
        !           204:                                               bits(frac,1,4)))
        !           205:                   | false => 0
        !           206:                val word1 = bits(frac,5,16)
        !           207:                val word2 = bits(frac,21,16)
        !           208:                val word3 = bits(frac,37,16)
        !           209:            in  emitword word0;
        !           210:                emitword word1;
        !           211:                emitword word2;
        !           212:                emitword word3
        !           213:            end
        !           214:     in  if exponent < 1 orelse exponent > 2047
        !           215:        then outofrange "" (* A hack *)
        !           216:        else emit()
        !           217:     end
        !           218: end
        !           219: structure M68RealConst = RealConst(M68PrimReal)
        !           220: open M68RealConst
        !           221: 
        !           222: fun scale Byte = 0
        !           223:   | scale Word = 512
        !           224:   | scale Long = 1024
        !           225: 
        !           226: fun emitext (Immed i) = emitlong i
        !           227:   | emitext (Abs i) =
        !           228:        (case sizeint i of
        !           229:              Byte => emitword i
        !           230:            | Word => emitword i
        !           231:            | Long => emitlong i)
        !           232:   | emitext (Direct _) = ()
        !           233:   | emitext (PostInc _) = ()
        !           234:   | emitext (PreDec _) = ()
        !           235:   | emitext (Displace(AddrReg _, 0)) = ()
        !           236:   | emitext (Displace (AddrReg _, i)) = emitword i
        !           237:   | emitext (Displace (DataReg d, 0)) = emitword(d*4096+2448)
        !           238:   | emitext (Displace (DataReg d, i)) = (emitword(d*4096+2464); emitword i)
        !           239:   | emitext (Index (_,disp,DataReg d,s)) =
        !           240:        emitword(d * 4096 + 2048 + scale s + signedbyte disp)
        !           241:   | emitext (Index (_,disp,AddrReg d,s)) =
        !           242:        emitword(32768 + d * 4096 + 2048 + scale s + signedbyte disp)
        !           243:   | emitext (Address lab) = jump(MODE,lab)
        !           244: 
        !           245: (* DEBUG val emitext = diag "emitext" emitext *)
        !           246: 
        !           247: fun emitF (opcode,Direct(FloatReg a),Direct(FloatReg b)) =
        !           248:        (emitword(61952); emitword(opcode+128*b+1024*a))
        !           249:   | emitF (opcode,src,Direct(FloatReg f)) =
        !           250:        (emitword(61952 + 8 * mode src + reg src);
        !           251:         emitword(opcode+21504+128*f);
        !           252:         emitext src)
        !           253:   | emitF (opcode,Direct(FloatReg f),dest) =
        !           254:        (emitword(61952 + 8 * mode dest + reg dest);
        !           255:         emitword(opcode+21504+128*f);
        !           256:         emitext dest)
        !           257: 
        !           258: (* DEBUG val emitF = diag "emitF" emitF *)
        !           259: 
        !           260: fun rts() = emitword 20085
        !           261: 
        !           262: fun exg (Direct(AddrReg a),Direct(AddrReg b)) =
        !           263:        if a = b then () else emitword(49480 + 512 * a + b)
        !           264:   | exg (Direct(DataReg a),Direct(DataReg b)) =
        !           265:        if a = b then () else emitword(49472 + 512 * a + b)
        !           266:   | exg (Direct(AddrReg b),Direct(DataReg a)) =
        !           267:        emitword(49544 + 512 * a + b)
        !           268:   | exg (Direct(DataReg a),Direct(AddrReg b)) =
        !           269:        emitword(49544 + 512 * a + b)
        !           270: 
        !           271: (* DEBUG val exg = diag "exg" exg *)
        !           272: 
        !           273: fun pea (Direct _) = raise Illegal
        !           274:   | pea (PreDec _) = raise Illegal
        !           275:   | pea (PostInc _) = raise Illegal
        !           276:   | pea (Immed _) = raise Illegal
        !           277:   | pea (Address lab) = (jump(LEA(18496),lab))
        !           278:   | pea src = (emitword(18496 + 8 * mode src + reg src); emitext src)
        !           279: 
        !           280: (* DEBUG val pea = diag "pea" pea *)
        !           281: 
        !           282: fun movl (_,Immed _) = raise Illegal
        !           283:   (* labels not implemented *)
        !           284:   (* CLR *)
        !           285:   | movl(Immed 0,dest) =
        !           286:     (emitword(17024 + reg dest + 8 * mode dest); emitext dest)
        !           287:   (* MOVEQ/MOVE *)
        !           288:   | movl (src as (Immed i),dest as (Direct(DataReg d))) =
        !           289:     (case sizeint i of
        !           290:        Byte => emitword(28672 + 512 * d + signedbyte i)
        !           291:      | _ => (emitword(8192+512*reg dest+64*mode dest+8*mode src+reg src);
        !           292:             emitext src))
        !           293:   (* MOVEA *)
        !           294:   | movl (Address lab,Direct(AddrReg a)) = jump(LEA(8256+512*a),lab)
        !           295:   | movl (src,Direct(AddrReg a)) =
        !           296:     (emitword(8256 + a * 512 + mode src * 8 + reg src); emitext src)
        !           297:   (* general MOVE *)
        !           298:   | movl (src,dest) =
        !           299:     (emitword(8192 + 512 * reg dest + 64 * mode dest + 8 * mode src + reg src);
        !           300:      emitext src;
        !           301:      emitext dest)
        !           302: 
        !           303: fun exg (Direct (DataReg a), Direct(DataReg b)) = emitword(49472+a*512+b)
        !           304:   | exg (Direct (AddrReg a), Direct(AddrReg b)) = emitword(49480+a*512+b)
        !           305:   | exg (Direct (DataReg a), Direct(AddrReg b)) = emitword(49544+a*512+b)
        !           306:   | exg (Direct (AddrReg a), Direct(DataReg b)) = emitword(49544+b*512+a)
        !           307: 
        !           308: (* DEBUG val movl = diag "movl" movl *)
        !           309: 
        !           310: fun addl (_,Immed _) = raise Illegal
        !           311:   (* ADDQ/ADDA *)
        !           312:   | addl (src as (Immed i),dest as (Direct(AddrReg a))) =
        !           313:     if i <= 8 andalso i >= 1
        !           314:     then emitword(20608 + 512 * (i mod 8) + 8 * mode dest + reg dest)
        !           315:     else (emitword(53696 + 512 * a + 8 * mode src + reg src); emitext src)
        !           316:   | addl (src,Direct(AddrReg a)) =
        !           317:     (emitword(53696 + 512 * a + 8 * mode src + reg src); emitext src)
        !           318:   (* ADDQ/ADDI *)
        !           319:   | addl (src as (Immed i),dest) =
        !           320:     if i <= 8 andalso i >= 1
        !           321:     then (emitword(20608+512*(i mod 8)+8*mode dest+reg dest); emitext dest)
        !           322:     else (emitword(1664 + 8 * mode dest + reg dest); emitext src; emitext dest)
        !           323:   (* general ADD *)
        !           324:   | addl (src,Direct(DataReg d)) = 
        !           325:     (emitword(53376 + 512 * d + reg src + 8 * mode src); emitext src)
        !           326:   | addl (Direct(DataReg d),dest) =
        !           327:     (emitword(53632 + 512 * d  + reg dest + 8 * mode dest); emitext dest)
        !           328: 
        !           329: (* DEBUG val addl = diag "addl" addl *)
        !           330: 
        !           331: fun lea (Direct _,_) = raise Illegal
        !           332:   | lea (PreDec _,_) = raise Illegal
        !           333:   | lea (PostInc _,_) = raise Illegal
        !           334:   | lea (Immed _,_) = raise Illegal
        !           335:   | lea (Address lab,Direct(AddrReg a)) = jump(LEA(16832+512*a),lab)
        !           336:   | lea (src,Direct(AddrReg a)) =
        !           337:         (emitword(16832 + 512 * a + 8 * mode src + reg src); emitext src)
        !           338:   | lea (Displace(a, i), dest as (Direct(DataReg _))) =
        !           339:        (movl(Immed(i), dest); addl(Direct(a), dest))
        !           340:   | lea _ = raise Illegal
        !           341: 
        !           342: (* DEBUG val lea = diag "lea" lea *)
        !           343: 
        !           344: fun subl (_,Immed _) = raise Illegal
        !           345:   (* SUBQ/SUBA *)
        !           346:   | subl (src  as (Immed i),dest as (Direct(AddrReg a))) =
        !           347:     if i <= 8 andalso i >= 1
        !           348:     then emitword(20864 + 512 * (i mod 8) + 8 * mode dest + reg dest)
        !           349:     else (emitword(37312 + 512 * a + 8 * mode src + reg src); emitext src)
        !           350:   (* SUBA *)
        !           351:   | subl (src,Direct(AddrReg a)) =
        !           352:     (emitword(37312 + 512 * a + 8 * mode src + reg src); emitext src)
        !           353:   (* SUBQ/SUBI *)
        !           354:   | subl (src as (Immed i),dest) =
        !           355:     if i <= 8 andalso i >= 1
        !           356:     then (emitword(20864+512*(i mod 8)+8 * mode dest + reg dest); emitext dest)
        !           357:     else (emitword(1152 + reg dest + 8 * mode dest); emitext src; emitext dest)
        !           358:   (* general SUB *)
        !           359:   | subl (src,Direct(DataReg d)) = 
        !           360:     (emitword(36992 + 512 * d + reg src + 8 * mode src); emitext src)
        !           361:   | subl (Direct(DataReg d),dest) = 
        !           362:     (emitword(37248 + 512 * d + reg dest + 8 * mode dest); emitext dest)
        !           363: 
        !           364: (* DEBUG val subl = diag "subl" subl *)
        !           365: 
        !           366: fun eorl (_, Direct(AddrReg _)) = raise Illegal
        !           367:   | eorl (Immed i, dest) =
        !           368:     if i<65536
        !           369:     then (emitword(2624 + reg dest + 8*mode dest); emitword i)
        !           370:     else raise Match
        !           371:   | eorl (Direct(DataReg d), dest) =
        !           372:        (emitword(45440 + 512*d + 8*mode dest + reg dest); emitext dest)
        !           373:   | eorl _ = raise Illegal
        !           374: 
        !           375: (* DEBUG val eorl = diag "eorl" eorl *)
        !           376: 
        !           377: fun orl (_, Direct(AddrReg _)) = raise Illegal
        !           378:   | orl (Immed i, dest) =
        !           379:     if i<65536
        !           380:     then (emitword(64 + reg dest + 8*mode dest); emitword i)
        !           381:     else raise Match
        !           382:   | orl (src, Direct(DataReg d)) =
        !           383:        (emitword(32896 + 512*d + 8*mode src + reg src); emitext src)
        !           384:   | orl (Direct(DataReg d), dest) =
        !           385:        (emitword(33152 + 512*d + 8*mode dest + reg dest); emitext dest)
        !           386:   | orl _ = raise Illegal
        !           387: 
        !           388: (* DEBUG val orl = diag "orl" orl *)
        !           389: 
        !           390: fun andl (_, Direct(AddrReg _)) = raise Illegal
        !           391:   | andl (Immed i, dest) =
        !           392:        if i<65536
        !           393:        then (emitword(576 + reg dest + 8*mode dest); emitword i)
        !           394:        else raise Match
        !           395:   | andl (src, Direct(DataReg d)) =
        !           396:        (emitword(49280 + 512*d + 8*mode src + reg src); emitext src)
        !           397:   | andl (Direct(DataReg d), dest) =
        !           398:        (emitword(49536 + 512*d + 8*mode dest + reg dest); emitext dest)
        !           399:   | andl _ = raise Illegal
        !           400: 
        !           401: (* DEBUG val andl = diag "andl" andl *)
        !           402: 
        !           403: fun mull (src,Direct(DataReg d)) =
        !           404:        (emitword(19456 + reg src + 8 * mode src);
        !           405:         emitword(2048+4096*d);
        !           406:         emitext src)
        !           407: 
        !           408: (* DEBUG val mull = diag "mull" mull *)
        !           409: 
        !           410: fun divl (src,Direct(DataReg d)) =
        !           411:        (emitword(19520 + reg src + 8 * mode src);
        !           412:          emitword(2048 + 4097 (*yes, 4097!*) * d);
        !           413:         emitext src)
        !           414: 
        !           415: (* DEBUG val divl = diag "divl" divl *)
        !           416: 
        !           417: fun movb (_,Immed _) = raise Illegal
        !           418:   (* labels not implemented *)
        !           419:   | movb (Address _,_) = raise Illegal
        !           420:   | movb (_,Address _) = raise Illegal
        !           421:   (* CLR *)
        !           422:   | movb (Immed 0, dest) =
        !           423:     (emitword(16896 + reg dest + 8 * mode dest); emitext dest)
        !           424:   (* general MOVE *)
        !           425:   | movb (src,dest) =
        !           426:     (emitword(4096 + 512 * reg dest + 64 * mode dest + 8 * mode src + reg src);
        !           427:      emitext src;
        !           428:      emitext dest)
        !           429: 
        !           430: (* DEBUG val movb = diag "movb" movb *)
        !           431: 
        !           432: fun shift dir =
        !           433:  let val dr = dir * 256
        !           434:      fun f (Immed 0, _) = ()
        !           435:        | f (Immed 8, Direct(DataReg d)) = emitword(57472+dr+d)
        !           436:        | f (Immed i, Direct(DataReg d)) =
        !           437:         if  i<1 orelse i>7 then raise Illegal else emitword(57472+dr + 512*i + d)
        !           438:        | f (Immed 1, Direct _) = raise Illegal
        !           439:        | f (Immed 1, dest) =
        !           440:           (emitword(57536 + dr + 8*mode dest + reg dest); emitext dest)
        !           441:        | f (Direct(DataReg s), Direct(DataReg d)) = (emitword(57504+dr + 512*s + d))
        !           442:        | f _ = raise Illegal
        !           443:  in f
        !           444:  end
        !           445: 
        !           446: val asll = shift 1
        !           447: val asrl = shift 0
        !           448: 
        !           449: fun cmpl (_,Immed _) = raise Illegal
        !           450:   (* CMP *)
        !           451:   | cmpl (src,Direct(DataReg d)) =
        !           452:     (emitword(45184 + 512 * d + 8 * mode src + reg src); emitext src)
        !           453:   (* CMPA *)
        !           454:   | cmpl (src,Direct(AddrReg a)) =
        !           455:     (emitword(45504 + 512 * a + 8 * mode src + reg src); emitext src)
        !           456:   (* CMPI *)
        !           457:   | cmpl (Immed i,dest) =
        !           458:     (emitword(3200 + 8 * mode dest + reg dest); emitext dest)
        !           459:   (* CMPM *)
        !           460:   | cmpl (PostInc(AddrReg y),PostInc(AddrReg x)) = emitword(45448 + 512 * x + y)
        !           461: 
        !           462: (* DEBUG val cmpl = diag "cmpl" cmpl *)
        !           463: 
        !           464: fun btst (_,Direct(AddrReg _)) = raise Illegal
        !           465:   | btst (_,Immed _) = raise Illegal
        !           466:   | btst (Direct(DataReg d),dest) =
        !           467:     (emitword(256 + 512 * d + 8 * mode dest + reg dest); emitext dest)
        !           468:   | btst (Immed i,dest) =
        !           469:     (emitword(2048 + 8 * mode dest + reg dest); emitword i; emitext dest)
        !           470: 
        !           471: (* DEBUG val btst = diag "btst" btst *)
        !           472: 
        !           473: fun emitlab (i,lab) = jump(LABPTR i, lab)
        !           474: 
        !           475: fun jne (Address lab) = jump (Jcc(26112),lab)
        !           476: fun jeq (Address lab) = jump (Jcc(26368),lab)
        !           477: fun jgt (Address lab) = jump (Jcc(28160),lab)
        !           478: fun jge (Address lab) = jump (Jcc(27648),lab)
        !           479: fun jlt (Address lab) = jump (Jcc(27904),lab)
        !           480: fun jle (Address lab) = jump (Jcc(28416),lab)
        !           481: 
        !           482: fun jra (Address lab) = jump (Jcc(24576),lab)
        !           483:   | jra (arg as (Displace(AddrReg _,_))) = 
        !           484:            (emitword (20160 + 8 * mode arg + reg arg); emitext arg)
        !           485:   | jra (arg as Index _) =
        !           486:            (emitword (20160 + 8 * mode arg + reg arg); emitext arg)
        !           487: 
        !           488: fun jbsr (Address lab) = jump (Jcc(24832),lab)
        !           489:   | jbsr (dest as (Displace(AddrReg _,_))) =
        !           490:     (emitword(20096 + 8 * mode dest + reg dest); emitext dest)
        !           491:            (* doesn't handle >16bit displacement *)
        !           492: 
        !           493: (* 68881 float operations *)
        !           494: (* Some src/dest combinations are illegal, but not caught here. *)
        !           495: fun fjne (Address lab) = jump (FJcc(14),lab)
        !           496: fun fjeq (Address lab) = jump (FJcc(1),lab)
        !           497: fun fjgt (Address lab) = jump (FJcc(18),lab)
        !           498: fun fjge (Address lab) = jump (FJcc(19),lab)
        !           499: fun fjlt (Address lab) = jump (FJcc(20),lab)
        !           500: fun fjle (Address lab) = jump (FJcc(21),lab)
        !           501: 
        !           502: fun fcmpd (src,dest) = emitF(56,src,dest)
        !           503: fun faddd (src,dest) = emitF(34,src,dest)
        !           504: fun fsubd (src,dest) = emitF(40,src,dest)
        !           505: fun fmuld (src,dest) = emitF(35,src,dest)
        !           506: fun fdivd (src,dest) = emitF(32,src,dest)
        !           507: fun fnegd (src,dest) = emitF(26,src,dest)
        !           508: fun fmoved (src,dest as Direct(FloatReg f)) = emitF(0,src,dest)
        !           509:   | fmoved (src as Direct(FloatReg f),dest) = emitF(8192,src,dest)
        !           510: 
        !           511: fun trapv() = emitword(20086)
        !           512: fun trapmi() = emitword 23548
        !           513: 
        !           514: fun push ea = movl(ea,PreDec sp)
        !           515: 
        !           516: fun pop ea = movl(PostInc sp,ea)
        !           517: 
        !           518: val pusha = pea
        !           519: 
        !           520: fun comment _ = ()
        !           521: 
        !           522: end (* Coder *)
        !           523: 
        !           524: val finish = Emitter.finish
        !           525: 
        !           526: end (* structure MCode *)

unix.superglobalmegacorp.com

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