Annotation of researchv10no/cmd/sml/src/m68/m68mcode.sml, revision 1.1.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.