+++ /dev/null
-signature X86 =
-sig
- datatype reg =
- EAX | EBX | ECX | EDX | ESI | EDI | EBP | RSP | R8D | R9D | R10D | R11D | R12D | R13D | R14D | R15D
- datatype oper = REG of reg | TEMP of Temp.temp | CONST of Word32.word | REL of (reg * int)
- datatype insn =
- DIRECTIVE of string |
- COMMENT of string |
- MOVL of oper * oper |
- SUBL of oper * oper |
- IMUL of oper * oper |
- IMUL3 of oper * oper * Word32.word |
- ADDL of oper * oper |
- LEAL of oper * oper * oper |
- IDIVL of oper |
- NEG of oper |
- CLTD |
- RET
-
- val cmpoper : oper * oper -> order
- val opereq : oper * oper -> bool
- val regname : reg -> string
- val regtonum : reg -> int
- val numtoreg : int -> reg
- val prettyprint_oper : oper -> string
- val prettyprint : insn -> string
-end
-
-structure x86 :> X86 =
-struct
- datatype reg =
- EAX | EBX | ECX | EDX | ESI | EDI | EBP | RSP | R8D | R9D | R10D | R11D | R12D | R13D | R14D | R15D
- datatype oper = REG of reg | TEMP of Temp.temp | CONST of Word32.word | REL of (reg * int)
- datatype insn =
- DIRECTIVE of string |
- COMMENT of string |
- MOVL of oper * oper |
- SUBL of oper * oper |
- IMUL of oper * oper |
- IMUL3 of oper * oper * Word32.word |
- ADDL of oper * oper |
- LEAL of oper * oper * oper |
- IDIVL of oper |
- NEG of oper |
- CLTD |
- RET
-
- fun regname EAX = "eax"
- | regname EBX = "ebx"
- | regname ECX = "ecx"
- | regname EDX = "edx"
- | regname ESI = "esi"
- | regname EDI = "edi"
- | regname EBP = "ebp"
- | regname RSP = "rsp"
- | regname R8D = "r8d"
- | regname R9D = "r9d"
- | regname R10D = "r10d"
- | regname R11D = "r11d"
- | regname R12D = "r12d"
- | regname R13D = "r13d"
- | regname R14D = "r14d"
- | regname R15D = "r15d"
-
- fun regtonum EAX = 0
- | regtonum EBX = 1
- | regtonum ECX = 2
- | regtonum EDX = 3
- | regtonum ESI = 4
- | regtonum EDI = 5
- | regtonum R8D = 6
- | regtonum R9D = 7
- | regtonum R10D = 8
- | regtonum R11D = 9
- | regtonum R12D = 10
- | regtonum R13D = 11
- | regtonum R14D = 12
- | regtonum R15D = 13
- | regtonum EBP = 14 (* Dummy numbers -- not permitted for allocation, but there so that we can compare *)
- | regtonum RSP = 15
-
- fun numtoreg 0 = EAX
- | numtoreg 1 = EBX
- | numtoreg 2 = ECX
- | numtoreg 3 = EDX
- | numtoreg 4 = ESI
- | numtoreg 5 = EDI
- | numtoreg 6 = R8D
- | numtoreg 7 = R9D
- | numtoreg 8 = R10D
- | numtoreg 9 = R11D
- | numtoreg 10 = R12D
- | numtoreg 11 = R13D
- | numtoreg 12 = R14D
- | numtoreg 13 = R15D
- | numtoreg n = raise ErrorMsg.InternalError ("numtoreg: Unknown register "^(Int.toString n))
-
- fun regcmp (r1, r2) = Int.compare (regtonum r1, regtonum r2)
-
- fun cmpoper (REG(reg1), REG(reg2)) = regcmp (reg1, reg2)
- | cmpoper (TEMP(temp1), TEMP(temp2)) = Temp.compare (temp1,temp2)
- | cmpoper (CONST(const1), CONST(const2)) = Word32.compare (const1, const2)
- | cmpoper (REL (r1, i1), REL (r2, i2)) =
- let
- val regorder = regcmp (r1, r2)
- val intorder = Int.compare (i1, i2)
- in
- if (regorder = EQUAL) then intorder
- else regorder
- end
- | cmpoper (CONST _, _) = LESS
- | cmpoper (REG _, _) = LESS
- | cmpoper (REL _, _) = LESS
- | cmpoper (_, _) = GREATER
-
- fun opereq (a, b) = cmpoper (a, b) = EQUAL
-
- fun moreDifferentToString (i) =
- if (i >= 0) then Int.toString i
- else "-" ^ (Int.toString (~i))
-
- fun prettyprint_oper (REG r) = "%" ^ (regname r)
- | prettyprint_oper (TEMP t) = Temp.name t
- | prettyprint_oper (CONST c) = "$0x" ^ (Word32.toString c)
- | prettyprint_oper (REL (r, i)) = (moreDifferentToString i) ^ "(%" ^ (regname r) ^ ")"
-
- fun prettyprint (DIRECTIVE(str)) = str ^ "\n"
- | prettyprint (COMMENT(str)) = "// " ^ str ^ "\n"
- | prettyprint (MOVL(src, dst)) = "\tMOVL\t" ^ (prettyprint_oper src) ^ ", " ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (SUBL(src, dst)) = "\tSUBL\t" ^ (prettyprint_oper src) ^ ", " ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (IMUL(src, dst)) = "\tIMUL\t" ^ (prettyprint_oper src) ^ ", " ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (IMUL3(dst, tmp, const)) = "\tIMUL\t" ^ (prettyprint_oper (CONST const)) ^ ", " ^ (prettyprint_oper tmp) ^ ", " ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (ADDL(src, dst)) = "\tADDL\t" ^ (prettyprint_oper src) ^ ", " ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (LEAL(src1, src2, dst)) = "\tLEAL\t(" ^ (prettyprint_oper src1) ^ "," ^ (prettyprint_oper src2) ^ ")," ^ (prettyprint_oper dst) ^ "\n"
- | prettyprint (IDIVL(src)) = "\tIDIVL\t" ^ (prettyprint_oper src) ^ "\n"
- | prettyprint (NEG (src)) = "\tNEG\t" ^ (prettyprint_oper src) ^ "\n"
- | prettyprint (CLTD) = "\tCLTD\n"
- | prettyprint (RET) = "\tRET\n"
-(* | prettyprint _ = raise ErrorMsg.InternalError ("prettyprint: unknown instruction")*)
-end