Home My Page Projects Code Snippets Project Openings SML/NJ
 Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

# SCM Repository

[smlnj] Diff of /sml/trunk/src/MLRISC/mltree/mltree-gen.sml
 [smlnj] / sml / trunk / src / MLRISC / mltree / mltree-gen.sml

# Diff of /sml/trunk/src/MLRISC/mltree/mltree-gen.sml

revision 1183, Fri Mar 29 19:09:48 2002 UTC revision 1184, Fri Mar 29 22:22:22 2002 UTC
# Line 87  Line 87
87     end     end
88
89     (* Implement division with round-to-negative-infinity in terms     (* Implement division with round-to-negative-infinity in terms
90      * of division with round-to-zero. *)      * of division with round-to-zero.
91        * The logic is as follows:
92        *    - if q > 0, then we are done since any rounding was
93        *      at the same time TO_ZERO and TO_NEGINF
94        *    - otherwise we calculate r and see if it is zero; if so, no adjustment
95        *    - finally if r and b have the same sign (i.e., r XOR b >= 0)
96        *      we still don't need adjustment
97        *    - otherwise adjust *)
98     fun divinf (xdiv, ty, aexp, bexp) = let     fun divinf (xdiv, ty, aexp, bexp) = let
99         val a = Cells.newReg ()         val a = Cells.newReg ()
100         val b = Cells.newReg ()         val b = Cells.newReg ()
# Line 96  Line 103
103         val zero = T.LI T.I.int_0         val zero = T.LI T.I.int_0
104         val one = T.LI T.I.int_1         val one = T.LI T.I.int_1
105     in     in
106         T.LET (T.SEQ [T.MV (ty, a, aexp),         T.LET
107            (T.SEQ
108             [T.MV (ty, a, aexp),
109                       T.MV (ty, b, bexp),                       T.MV (ty, b, bexp),
110                       T.MV (ty, q, xdiv (T.DIV_TO_ZERO, ty, T.REG (ty, a),            T.MV (ty, q, xdiv (T.DIV_TO_ZERO, ty, T.REG (ty, a), T.REG (ty, b))),
111                                                             T.REG (ty, b))),            T.IF (T.CMP (ty, T.Basis.GT, T.REG (ty, q), zero),
T.IF (T.CMP (ty, T.Basis.GE, T.REG (ty, q), zero),
112                             T.SEQ [],                             T.SEQ [],
113                             T.IF (T.CMP (ty, T.Basis.EQ,                  T.SEQ
114                                              T.REG (ty, a),                   [T.MV (ty, r, T.SUB (ty, T.REG (ty, a),
115                                              T.MULS (ty, T.REG (ty, q),                                            T.MULS (ty, T.REG (ty, b),
116                                                          T.REG (ty, b))),                                                        T.REG (ty, q)))),
117                      T.IF (T.CMP (ty, T.Basis.EQ, T.REG (ty, r), zero),
118                            T.SEQ [],
119                            T.IF (T.CMP (ty, T.Basis.GE,
120                                         T.XORB (ty, T.REG (ty, b), T.REG (ty, r)),
121                                         zero),
122                                   T.SEQ [],                                   T.SEQ [],
123                                   T.MV (ty, q, T.SUB (ty, T.REG (ty, q),                                   T.MV (ty, q, T.SUB (ty, T.REG (ty, q),
124                                                           one))))],                                                        one))))])],
125                T.REG(ty,q))                T.REG(ty,q))
126     end     end
127
128     (* Same for rem when rounding to negative infinity.     (* Same for rem when rounding to negative infinity.
129      * The odd case is when a = MININT and b = -1 in which case the DIVS op      * The odd case is when a = MININT and b = -1 in which case the DIVS op
130      * will overflow.  But the subsequent MULS will overflow in such a way that      * will overflow and trap on some machines.  On others the result
131      * the results cancel.  Thus, the correct result of 0 will come out. *)      * will be bogus.  Should we fix that? *)
132     fun reminf (ty, aexp, bexp) = let     fun reminf (ty, aexp, bexp) = let
133         val a = Cells.newReg ()         val a = Cells.newReg ()
134         val b = Cells.newReg ()         val b = Cells.newReg ()
# Line 123  Line 136
136         val r = Cells.newReg ()         val r = Cells.newReg ()
137         val zero = T.LI T.I.int_0         val zero = T.LI T.I.int_0
138     in     in
139         T.LET (T.SEQ [T.MV (ty, a, aexp),         T.LET
140            (T.SEQ
141             [T.MV (ty, a, aexp),
142                       T.MV (ty, b, bexp),                       T.MV (ty, b, bexp),
143                       T.MV (ty, q, T.DIVS (T.DIV_TO_ZERO, ty, T.REG (ty, a),                       T.MV (ty, q, T.DIVS (T.DIV_TO_ZERO, ty, T.REG (ty, a),
144                                                               T.REG (ty, b))),                                                               T.REG (ty, b))),
145                       T.MV (ty, r, T.SUB (ty, T.REG (ty, a),                       T.MV (ty, r, T.SUB (ty, T.REG (ty, a),
146                                               T.MULS (ty, T.REG (ty, q),                                               T.MULS (ty, T.REG (ty, q),
147                                                           T.REG (ty, b)))),                                                           T.REG (ty, b)))),
148                       T.IF (T.CMP (ty, T.Basis.GE, T.REG (ty, q), zero),            T.IF (T.CMP (ty, T.Basis.GT, T.REG (ty, q), zero),
149                             T.SEQ [],                             T.SEQ [],
150                             T.IF (T.CMP (ty, T.Basis.EQ, T.REG (ty, r), zero),                             T.IF (T.CMP (ty, T.Basis.EQ, T.REG (ty, r), zero),
151                                   T.SEQ [],                                   T.SEQ [],
152                          T.IF (T.CMP (ty, T.Basis.GE,
153                                       T.XORB (ty, T.REG (ty, b), T.REG (ty, r)),
154                                       zero),
155                                T.SEQ [],
156                                   T.MV (ty, r, T.ADD (ty, T.REG (ty, r),                                   T.MV (ty, r, T.ADD (ty, T.REG (ty, r),
157                                                           T.REG (ty, b)))))],                                                      T.REG (ty, b))))))],
158                T.REG (ty, r))                T.REG (ty, r))
159     end     end
160

Legend:
 Removed from v.1183 changed lines Added in v.1184