Annotation of researchv10no/cmd/sml/src/sparc/sparcas.sml, revision 1.1

1.1     ! root        1: (* Copyright 1989 by AT&T Bell Laboratories *)
        !             2: (* sparcas.sml
        !             3:  *
        !             4:  * J.H. Reppy
        !             5:  * Cornell University
        !             6:  * Ithaca, NY 14853
        !             7:  * [email protected]
        !             8:  *
        !             9:  * HISTORY:
        !            10:  *   11/20/89  created
        !            11:  *
        !            12:  *    The SPARC assembly code emitter.
        !            13:  *)
        !            14: 
        !            15: structure SparcAsCode =
        !            16: struct
        !            17:     val outfile = ref std_out
        !            18: end (* SparcAsCode *)
        !            19: 
        !            20: 
        !            21: structure SparcAsEmit : EMITTER =
        !            22: struct
        !            23: 
        !            24:     open SparcAsCode SparcInstr
        !            25: 
        !            26:   (** The location counter **)
        !            27:     val loc = ref 0
        !            28:     fun advance n = (loc := !loc + n)
        !            29:     fun advance4 () = (loc := !loc + 4)
        !            30: 
        !            31:   (** utility routines **)
        !            32:     local
        !            33:       val hexDigits = "0123456789abcdef"
        !            34:       fun f (0, l) = l
        !            35:        | f (n, l) = (
        !            36:            f (Bits.rshift(n, 4), chr(ordof(hexDigits, Bits.andb(n, 15))) :: l))
        !            37:       fun cvt 0 = ["0", "x", "0"]
        !            38:        | cvt n = ("0" :: "x" :: f(n, nil))
        !            39:     in
        !            40:     fun atoi i = implode(if (i < 0) then "-" :: cvt(~i) else cvt i)
        !            41:     end
        !            42: 
        !            43:     fun emit s = output (!outfile) s
        !            44: 
        !            45:     fun newLine () = emit "\n"
        !            46: 
        !            47:     val emitLabel = emit o nameOf
        !            48: 
        !            49:     fun emitOffset 0 = ()
        !            50:       | emitOffset i = (if (i < 0)
        !            51:          then (emit "-"; emit(atoi(~i)))
        !            52:          else (emit "+"; emit(atoi i)))
        !            53: 
        !            54: 
        !            55:     fun emitLong i = (emit "\t.long\t"; emit(atoi i); newLine(); advance4())
        !            56: 
        !            57:     local
        !            58:       fun oct i = let
        !            59:            val m = Integer.makestring
        !            60:            in
        !            61:              m(i div 64)^m((i div 8)mod 8)^m(i mod 8)
        !            62:            end
        !            63:       fun c_char "\n" = "\\n"
        !            64:        | c_char "\t" = "\\t"
        !            65:        | c_char "\\" = "\\\\"
        !            66:        | c_char "\"" = "\\\""
        !            67:        | c_char c = if ord c < 32 then "\\"^oct(ord c) else c
        !            68:       fun a_str s = implode(map c_char (explode s))
        !            69:     in
        !            70:     fun emitString s = (
        !            71:          emit "\t.ascii \""; emit(a_str s); emit "\"\n"; emit "\t.align\t4\n";
        !            72:          advance(size s))
        !            73:     end (* local *)
        !            74: 
        !            75:     fun emitReal r = (emit "\t.double\t"; emit r; newLine(); advance 8)
        !            76: 
        !            77:     fun emitAddr (lab as Label{addr = ref a, ...}, k) = (
        !            78:          emit "\t.long\t("; emitLabel lab; emit "-.)"; emitOffset k;
        !            79:          emit "\t| "; emit(atoi(k + a - !loc)); newLine();
        !            80:          advance4())
        !            81: 
        !            82:     fun define (lab as Label{addr=ref a, ...}) = (
        !            83: (*****
        !            84:          emitLabel lab;  emit ":\t| "; emit(atoi a); newLine())
        !            85: *****)
        !            86: emitLabel lab;  emit ":\t| .="; emit(atoi(!loc)); emit ", "; emit(atoi a); newLine())
        !            87: 
        !            88:     local
        !            89:       open System.Tags
        !            90:     in
        !            91:     fun mark () = (
        !            92:          emit "\t.long\t(((.-L0)/4+1)*power_tags)+tag_backptr\t| ";
        !            93:          emit (atoi (((!loc + 4) div 4) * power_tags + tag_backptr)); newLine();
        !            94:          advance4())
        !            95:     end (* local *)
        !            96: 
        !            97:     local
        !            98:       fun comma () = emit ","
        !            99: 
        !           100:       fun emitReg (REG i) = if (i < 16)
        !           101:            then if (i < 8)
        !           102:              then (emit "%g"; emit (makestring i))
        !           103:              else (emit "%o"; emit (makestring (i-8)))
        !           104:            else if (i < 24)
        !           105:              then (emit "%l"; emit (makestring (i-16)))
        !           106:              else (emit "%i"; emit (makestring (i-24)))
        !           107: 
        !           108:       fun emitFReg (FREG i) = (emit "%f"; emit (makestring i))
        !           109: 
        !           110:       fun emitCond EQL = emit "e" | emitCond NEQ = emit "ne"
        !           111:        | emitCond LSS = emit "l" | emitCond LEQ = emit "le"
        !           112:        | emitCond GTR = emit "g" | emitCond GEQ = emit "ge"
        !           113: 
        !           114:       fun emitLExp (LABELexp{base, dst, offset=0}) = (
        !           115:            emitLabel dst; emit "-"; emitLabel base)
        !           116:        | emitLExp (LABELexp{base, dst, offset}) = (
        !           117:            emit "("; emitLabel dst; emitOffset offset; emit ")-"; emitLabel base)
        !           118: 
        !           119:       fun emitRand (REGrand r) = emitReg r
        !           120:        | emitRand (IMrand i) = emit (atoi i)
        !           121:        | emitRand (LABrand lexp) = emitLExp lexp
        !           122:        | emitRand (LOrand lexp) = (emit "%lo("; emitLExp lexp; emit ")")
        !           123:        | emitRand (HIrand lexp) = (emit "%hi("; emitLExp lexp; emit ")")
        !           124: 
        !           125:       fun emitArgs (r1, arg, rd) = (
        !           126:            emitReg r1; comma(); emitRand arg; comma(); emitReg rd)
        !           127: 
        !           128:       fun emitAddr (r1, b) = (emitReg r1;
        !           129:            case b
        !           130:             of REGrand(REG 0) => ()
        !           131:              | REGrand r2 => (emit "+"; emitReg r2)
        !           132:              | IMrand i => emitOffset i
        !           133:              | LABrand l => (emit "+"; emitLExp l)
        !           134:              | LOrand l => (emit "+%lo("; emitLExp l; emit ")")
        !           135:              | _ => (ErrorMsg.impossible "[emitAddr]"))
        !           136: 
        !           137:       fun emitMemAddr args = (emit "["; emitAddr args; emit "]")
        !           138: 
        !           139:       fun emitFArgs (f1, f2, fd) = (
        !           140:            emitFReg f1; comma(); emitFReg f2; comma(); emitFReg fd)
        !           141: 
        !           142:     in
        !           143: 
        !           144:     fun emitInstr I = (
        !           145:          emit "\t";
        !           146:          case I
        !           147:           of (I_nop) => emit "nop"
        !           148:            | (I_ld(a, b, c)) => (emit "ld "; emitMemAddr(a, b); comma(); emitReg c)
        !           149:            | (I_ldb(a, b, c)) => (emit "ldub "; emitMemAddr(a, b); comma(); emitReg c)
        !           150:            | (I_ldf(a, b, c)) => (emit "ldf "; emitMemAddr(a, b); comma(); emitFReg c)
        !           151:            | (I_st(a, b, c)) => (emit "st "; emitReg c; comma(); emitMemAddr(a, b))
        !           152:            | (I_stb(a, b, c)) => (emit "stb "; emitReg c; comma(); emitMemAddr(a, b))
        !           153:            | (I_stf(a, b, c)) => (emit "stf "; emitFReg c; comma(); emitMemAddr(a, b))
        !           154:            | (I_sethi(x, rd)) => (
        !           155:                emit "sethi ";
        !           156:                case x
        !           157:                 of IMrand i => emit(atoi i)
        !           158:                  | HIrand _ => emitRand x
        !           159:                  | _ => ErrorMsg.impossible "[emitInstr.sethi]";
        !           160:                comma(); emitReg rd)
        !           161:            | (I_ba l) => (emit "ba "; emitLabel l)
        !           162:            | (I_bcc(cc, l)) => (emit "b"; emitCond cc; emit " "; emitLabel l)
        !           163:            | (I_fbcc(cc, l)) => (emit "fb"; emitCond cc; emit " "; emitLabel l)
        !           164:            | (I_jmpl(a, b, REG 0)) => (emit "jmp "; emitAddr(a, b))
        !           165:            | (I_jmpl(a, b, rd)) => (emit "jmpl "; emitAddr(a, b); comma(); emitReg rd)
        !           166:            | (I_add args) => (emit "add "; emitArgs args)
        !           167:            | (I_addcc args) => (emit "addcc "; emitArgs args)
        !           168:            | (I_taddcctv args) => (emit "taddcctv "; emitArgs args)
        !           169:            | (I_sub args) => (emit "sub "; emitArgs args)
        !           170:            | (I_subcc(a, b, REG 0)) => (
        !           171:                emit "cmp "; emitReg a; comma();
        !           172:                case b
        !           173:                 of REGrand r2 => emitReg r2
        !           174:                  | IMrand i => emit(atoi i)
        !           175:                  | _ => ErrorMsg.impossible "[emitInstr.addcc]")
        !           176:            | (I_subcc args) => (emit "subcc "; emitArgs args)
        !           177:            | (I_sll args) => (emit "sll "; emitArgs args)
        !           178:            | (I_sra args) => (emit "sra "; emitArgs args)
        !           179:            | (I_and args) => (emit "and "; emitArgs args)
        !           180:            | (I_andcc(a, b, REG 0)) => (
        !           181:                emit "btst "; emitReg a; comma();
        !           182:                case b
        !           183:                 of REGrand r2 => emitReg r2
        !           184:                  | IMrand i => emit(atoi i)
        !           185:                  | _ => ErrorMsg.impossible "[emitInstr.andcc]")
        !           186:            | (I_andcc args) => (emit "andcc "; emitArgs args)
        !           187:            | (I_or(REG 0, arg, rd)) => (emit "mov "; emitRand arg; comma(); emitReg rd)
        !           188:            | (I_or args) => (emit "or "; emitArgs args)
        !           189:            | (I_xor args) => (emit "xor "; emitArgs args)
        !           190:            | (I_not(r1, rd)) => (emit "not "; emitReg r1; comma(); emitReg rd)
        !           191:            | (I_tvs) => emit "tvs ST_INT_OVERFLOW"
        !           192:            | (I_fadd args) => (emit "faddd "; emitFArgs args)
        !           193:            | (I_fsub args) => (emit "fsubd "; emitFArgs args)
        !           194:            | (I_fmul args) => (emit "fmuld "; emitFArgs args)
        !           195:            | (I_fdiv args) => (emit "fdivd "; emitFArgs args)
        !           196:            | (I_fneg(f1, f2)) => (emit "fneg "; emitFReg f1; comma(); emitFReg f2)
        !           197:            | (I_fcmp(f1, f2)) => (emit "fcmp "; emitFReg f1; comma(); emitFReg f2)
        !           198:          (* end of case *);
        !           199:          emit "\t| .="; emit(atoi(!loc));
        !           200:          newLine();
        !           201:          advance4())
        !           202: 
        !           203:     end (* local *)
        !           204: 
        !           205:     fun comment s = emit s
        !           206: 
        !           207:     fun init (n : int) = (
        !           208:          loc := 0;
        !           209:          emit "| code size = "; emit(makestring n); emit " bytes\n")
        !           210: 
        !           211: end (* structure SparcAsEmit *)

unix.superglobalmegacorp.com

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