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/x86/mltree/x86.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/x86/mltree/x86.sml

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1155, Wed Mar 20 20:52:51 2002 UTC revision 1156, Thu Mar 21 22:01:11 2002 UTC
# Line 1125  Line 1125 
1125    
1126            (* generate code for floating point compare and branch *)            (* generate code for floating point compare and branch *)
1127        and fbranch(fty, fcc, t1, t2, lab, an) =        and fbranch(fty, fcc, t1, t2, lab, an) =
1128              let fun j cc = mark(I.JCC{cond=cc, opnd=immedLabel lab},an)
1129              in  fbranching(fty, fcc, t1, t2, j)
1130              end
1131    
1132          and fbranching(fty, fcc, t1, t2, j) =
1133            let fun ignoreOrder (T.FREG _) = true            let fun ignoreOrder (T.FREG _) = true
1134                  | ignoreOrder (T.FLOAD _) = true                  | ignoreOrder (T.FLOAD _) = true
1135                  | ignoreOrder (T.FMARK(e,_)) = ignoreOrder e                  | ignoreOrder (T.FMARK(e,_)) = ignoreOrder e
# Line 1146  Line 1151 
1151                        val rsrc = foperand(fty, t2)                        val rsrc = foperand(fty, t2)
1152                        val fsize = fsize fty                        val fsize = fsize fty
1153                        fun cmp(lsrc, rsrc, fcc) =                        fun cmp(lsrc, rsrc, fcc) =
1154                            (emit(I.FCMP{fsize=fsize,lsrc=lsrc,rsrc=rsrc}); fcc)                        let val i = !arch <> Pentium
1155                          in  emit(I.FCMP{i=i,fsize=fsize,lsrc=lsrc,rsrc=rsrc});
1156                              fcc
1157                          end
1158                    in  case (lsrc, rsrc) of                    in  case (lsrc, rsrc) of
1159                           (I.FPR _, I.FPR _) => cmp(lsrc, rsrc, fcc)                           (I.FPR _, I.FPR _) => cmp(lsrc, rsrc, fcc)
1160                         | (I.FPR _, mem) => cmp(mem,lsrc,T.Basis.swapFcond fcc)                         | (I.FPR _, mem) => cmp(mem,lsrc,T.Basis.swapFcond fcc)
# Line 1167  Line 1175 
1175                fun testil i = emit(I.TESTL{lsrc=eax,rsrc=I.Immed(i)})                fun testil i = emit(I.TESTL{lsrc=eax,rsrc=I.Immed(i)})
1176                fun xoril i = emit(I.BINARY{binOp=I.XORL,src=I.Immed(i),dst=eax})                fun xoril i = emit(I.BINARY{binOp=I.XORL,src=I.Immed(i),dst=eax})
1177                fun cmpil i = emit(I.CMPL{rsrc=I.Immed(i), lsrc=eax})                fun cmpil i = emit(I.CMPL{rsrc=I.Immed(i), lsrc=eax})
               fun j(cc, lab) = mark(I.JCC{cond=cc, opnd=immedLabel lab},an)  
1178                fun sahf() = emit(I.SAHF)                fun sahf() = emit(I.SAHF)
1179                fun branch(fcc) =                fun branch(fcc) =
1180                    case fcc                    case fcc
1181                    of T.==   => (andil 0x4400; xoril 0x4000; j(I.EQ, lab))                    of T.==   => (andil 0x4400; xoril 0x4000; j(I.EQ))
1182                     | T.?<>  => (andil 0x4400; xoril 0x4000; j(I.NE, lab))                     | T.?<>  => (andil 0x4400; xoril 0x4000; j(I.NE))
1183                     | T.?    => (sahf(); j(I.P,lab))                     | T.?    => (sahf(); j(I.P))
1184                     | T.<=>  => (sahf(); j(I.NP,lab))                     | T.<=>  => (sahf(); j(I.NP))
1185                     | T.>    => (testil 0x4500;  j(I.EQ,lab))                     | T.>    => (testil 0x4500;  j(I.EQ))
1186                     | T.?<=  => (testil 0x4500;  j(I.NE,lab))                     | T.?<=  => (testil 0x4500;  j(I.NE))
1187                     | T.>=   => (testil 0x500; j(I.EQ,lab))                     | T.>=   => (testil 0x500; j(I.EQ))
1188                     | T.?<   => (testil 0x500; j(I.NE,lab))                     | T.?<   => (testil 0x500; j(I.NE))
1189                     | T.<    => (andil 0x4500; cmpil 0x100; j(I.EQ,lab))                     | T.<    => (andil 0x4500; cmpil 0x100; j(I.EQ))
1190                     | T.?>=  => (andil 0x4500; cmpil 0x100; j(I.NE,lab))                     | T.?>=  => (andil 0x4500; cmpil 0x100; j(I.NE))
1191                     | T.<=   => (andil 0x4100; cmpil 0x100; j(I.EQ,lab);                     | T.<=   => (andil 0x4100; cmpil 0x100; j(I.EQ);
1192                                  cmpil 0x4000; j(I.EQ,lab))                                  cmpil 0x4000; j(I.EQ))
1193                     | T.?>   => (sahf(); j(I.P,lab); testil 0x4100; j(I.EQ,lab))                     | T.?>   => (sahf(); j(I.P); testil 0x4100; j(I.EQ))
1194                     | T.<>   => (testil 0x4400; j(I.EQ,lab))                     | T.<>   => (testil 0x4400; j(I.EQ))
1195                     | T.?=   => (testil 0x4400; j(I.NE,lab))                     | T.?=   => (testil 0x4400; j(I.NE))
1196                       | _      => error(concat[
1197                                      "fbranch(", T.Basis.fcondToString fcc, ")"
1198                                    ])
1199                     (*esac*)
1200    
1201                  (*
1202                   *             P  Z  C
1203                   * x < y       0  0  1
1204                   * x > y       0  0  0
1205                   * x = y       0  1  0
1206                   * unordered   1  1  1
1207                   * When it's unordered, all three flags, P, Z, C are set.
1208                   *)
1209    
1210                  fun fast_branch(fcc) =
1211                      case fcc
1212                      of T.==   => orderedOnly(I.EQ)
1213                       | T.?<>  => (j(I.P); j(I.NE))
1214                       | T.?    => j(I.P)
1215                       | T.<=>  => j(I.NP)
1216                       | T.>    => orderedOnly(I.A)
1217                       | T.?<=  => j(I.BE)
1218                       | T.>=   => orderedOnly(I.AE)
1219                       | T.?<   => j(I.B)
1220                       | T.<    => orderedOnly(I.B)
1221                       | T.?>=  => (j(I.P); j(I.AE))
1222                       | T.<=   => orderedOnly(I.BE)
1223                       | T.?>   => (j(I.P); j(I.A))
1224                       | T.<>   => orderedOnly(I.NE)
1225                       | T.?=   => j(I.EQ)
1226                     | _      => error(concat[                     | _      => error(concat[
1227                                    "fbranch(", T.Basis.fcondToString fcc, ")"                                    "fbranch(", T.Basis.fcondToString fcc, ")"
1228                                  ])                                  ])
1229                   (*esac*)                   (*esac*)
1230                  and orderedOnly fcc =
1231                  let val label = Label.anon()
1232                  in  emit(I.JCC{cond=I.P, opnd=immedLabel label});
1233                      j fcc;
1234                      defineLabel label
1235                  end
1236    
1237                val fcc = compare()                val fcc = compare()
1238            in  emit I.FNSTSW;            in  if !arch <> Pentium andalso
1239                     (enableFastFPMode andalso !fast_floating_point) then
1240                    fast_branch(fcc)
1241                  else
1242                    (emit I.FNSTSW;
1243                branch(fcc)                branch(fcc)
1244                    )
1245            end            end
1246    
1247        (*========================================================        (*========================================================

Legend:
Removed from v.1155  
changed lines
  Added in v.1156

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0