Annotation of researchv10no/cmd/sml/src/mips/mipsreal.nw, revision 1.1.1.1

1.1       root        1: \subsection{Handling IEEE floating point constants}
                      2: Here we take care of converting floating point constants from
                      3: string representation to 64-bit IEEE representation.
                      4: We use the machinery developed for the Sparc by John Reppy.
                      5: 
                      6: Reppy's functor accepts a simple structure with a single value,
                      7: [[emitWord : int -> unit]], which emits a 16-bit word.
                      8: It produces a [[PRIMREAL]].
                      9: When [[RealConst]] is applied to the result, it produces a 
                     10: structure containing a single function, [[val realconst : string -> unit]].
                     11: This function, when applied to a string, emits the four sixteen-bit words
                     12: of the IEEE representation, most significant first.
                     13: 
                     14: Our job will be to convert this to something that emits the two 32-bit
                     15: words of the constant, least significant word first.
                     16: First, let's consider the state information that has to be retained
                     17: while the halfwords are being emitted, and functions that change that state.
                     18: <<state info>>=
                     19: val halfwords = ref nil : int list ref         (* halfwords already out *)
                     20: val count = ref 0                              (* length of halfwords *)
                     21: fun reset_state () = (halfwords := nil; count := 0)
                     22: fun add_half h = (count := !count + 1; halfwords := h :: (!halfwords))
                     23: 
                     24: <<emitting a halfword>>=
                     25: fun emit_half h = 
                     26:     if !count = 3 then (emit_four (h::(!halfwords)); reset_state())
                     27:     else add_half h
                     28: 
                     29: @ To emit the whole list, we have to emit the words, one at a time.
                     30: We use descriptive names to remind ourselves what is signficant
                     31: (highest is most significant).
                     32: <<emitting four halfwords>>=
                     33: fun emit_four [lowest,low,high,highest] = 
                     34:                        (emit_word(low,lowest);emit_word(highest,high))
                     35:   | emit_four _ = ErrorMsg.impossible "bad floating pt constant in mips"
                     36: 
                     37: @ Now, we bundle up the whole thing in a functor that
                     38: gets passed a structure holding [[emit_word]] and returns 
                     39: one containing [[realconst]].
                     40: <<*>>=
                     41: functor MipsReal(E: sig val emit_word : int * int -> unit end) : REALCONST = 
                     42: struct
                     43:     open E
                     44:     <<state info>>
                     45:     <<emitting four halfwords>>
                     46:     <<emitting a halfword>>
                     47:     structure IEEERealConst =
                     48:        RealConst(IEEEReal(struct val emitWord = emit_half end))
                     49:     val realconst = IEEERealConst.realconst
                     50: end
                     51: 
                     52: 
                     53: 
                     54: 

unix.superglobalmegacorp.com

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