signature TEMP =
sig
type temp
- datatype size = Byte | Word | Long | Quad
val reset : unit -> unit (* resets temp numbering *)
- val new : string -> size -> temp (* returns a unique new temp *)
+ val new : string -> temp (* returns a unique new temp *)
val name : temp -> string (* returns the name of a temp *)
- val size : temp -> size (* returns the size of a temp *)
val compare : temp * temp -> order (* comparison function *)
val eq : temp * temp -> bool
- val cmpsize : size * size -> order
- val sfx : size -> string
- val sts : int -> size
end
structure Temp :> TEMP =
struct
- datatype size = Byte | Word | Long | Quad
- type temp = int * string * size
+ type temp = int * string
local
val counter = ref 1
in
(* warning: calling reset() may jeopardize uniqueness of temps! *)
fun reset () = ( counter := 1 )
- fun new str size = (!counter, str, size) before ( counter := !counter + 1 )
+ fun new str = (!counter, str) before ( counter := !counter + 1 )
end
- fun sfx Byte = "b"
- | sfx Word = "w"
- | sfx Long = "l"
- | sfx Quad = "q"
-
- fun name (t,s, sz) = "+t" ^ Int.toString t ^ "[" ^ s ^ "]" ^ sfx sz
- fun size (t, s, sz) = sz
- fun compare ((t1,_,_),(t2,_,_)) = Int.compare (t1,t2)
-
- fun eq ((t1,_,_), (t2,_,_)) = t1 = t2
-
- fun cmpsize (Quad,Quad) = EQUAL
- | cmpsize (Quad,_) = GREATER
- | cmpsize (_,Quad) = LESS
- | cmpsize (Long,Long) = EQUAL
- | cmpsize (Long,_) = GREATER
- | cmpsize (_,Long) = LESS
- | cmpsize (Word,Word) = EQUAL
- | cmpsize (Word,_) = GREATER
- | cmpsize (_,Word) = LESS
- | cmpsize (Byte,Byte) = EQUAL
-
- fun sts 8 = Quad
- | sts 4 = Long
- | sts 2 = Word
- | sts 1 = Byte
- | sts _ = raise ErrorMsg.InternalError "Temp.sts: invalid size"
+ fun name (t,s) = "+t" ^ Int.toString t ^ "[" ^ s ^ "]"
+ fun compare ((t1,_),(t2,_)) = Int.compare (t1,t2)
+ fun eq ((t1,_), (t2,_)) = t1 = t2
end