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 /MLRISC/trunk/amd64/mltree/amd64-gen.sml
ViewVC logotype

Diff of /MLRISC/trunk/amd64/mltree/amd64-gen.sml

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

revision 2790, Tue Oct 2 23:26:59 2007 UTC revision 2791, Wed Oct 3 23:25:20 2007 UTC
# Line 163  Line 163 
163                 else mark' (I.COPY {k=CB.GP, sz=ty, src=[s], dst=[d], tmp=NONE}, an)                 else mark' (I.COPY {k=CB.GP, sz=ty, src=[s], dst=[d], tmp=NONE}, an)
164            | move' (ty, I.Immed 0, dst as I.Direct _, an) =            | move' (ty, I.Immed 0, dst as I.Direct _, an) =
165              mark' (I.binary {binOp=O.xorOp ty, src=dst, dst=dst}, an)              mark' (I.binary {binOp=O.xorOp ty, src=dst, dst=dst}, an)
166              | move' (ty, src as I.ImmedLabel _ , dst as I.Direct _, an) = emitInstr (move64 (src, dst))
167            | move' (ty, src as I.ImmedLabel _ , dst, an) = let            | move' (ty, src as I.ImmedLabel _ , dst, an) = let
168              val tmp = newReg ()              val tmp = newReg ()
169              val tmpR = I.Direct (64, tmp)              val tmpR = I.Direct (64, tmp)
# Line 254  Line 255 
255                | doEAImmed(trees, n, b, i, s, I.Immed m) =                | doEAImmed(trees, n, b, i, s, I.Immed m) =
256                  doEA(trees, b, i, s, I.Immed(n+m))                  doEA(trees, b, i, s, I.Immed(n+m))
257                | doEAImmed(trees, n, b, i, s, I.ImmedLabel le) =                | doEAImmed(trees, n, b, i, s, I.ImmedLabel le) =
258                  doEA(trees, b, i, s, I.ImmedLabel (T.ADD(ty,le,T.LI(T.I.fromInt32(ty, n)))))                  doEA(trees, b, i, s,
259                         I.ImmedLabel(T.ADD(ty,le,T.LI(T.I.fromInt32(ty, n)))))
260                | doEAImmed(trees, n, b, i, s, _) = error "doEAImmed"                | doEAImmed(trees, n, b, i, s, _) = error "doEAImmed"
261    
262              (* Add a label expression.              (* Add a label expression.
263               * NOTE: Labels in the AMD64 can be 64 bits, but operands can only handle 32 constants.               * NOTE: Labels in the AMD64 can be 64 bits, but operands can only handle 32-bit constants.
264               * We have to spill label expressions to temporaries to be correct.               * We have to spill label expressions to temporaries to be correct.
265               * TODO: eliminate the extra register-register move from genExpr               * TODO: eliminate the extra register-register move from genExpr
266               *)               *)
267              and doEALabel (trees, le, b, i, s, d) = let              and doEALabel (trees, le, b, i, s, d) = let
268                  val le = (case b                  val le = (case b
269                              of NONE => le                              of NONE => le
270                               | SOME base => T.ADD (ty, le, T.REG (ty, base))                               | SOME base => T.ADD (ty, T.REG (ty, base), le)
271                            (* end case *))                            (* end case *))
                 val b' = genExpr le  
272                  in                  in
273                    (case d                    (case d
274                      of I.Immed 0 => doEA(trees, SOME b', i, s, I.Immed 0)                      of I.Immed 0 => doEA(trees, SOME (genExpr le), i, s, I.Immed 0)
275                       | I.Immed m => (doEA (trees,                       | I.Immed m => (doEA (trees,
276                                SOME (genExpr (T.ADD (ty, T.REG(ty, b'), T.LI(T.I.fromInt32(ty, m))))),                                SOME (genExpr (T.ADD (ty, le, T.LI(T.I.fromInt32(ty, m))))),
277                           i, s, I.Immed 0)                           i, s, I.Immed 0)
278                         handle Overflow => error "doEALabel: constant too large")                         handle Overflow => error "doEALabel: constant too large")
279                       | I.ImmedLabel le' => doEA (trees,                       | I.ImmedLabel le' => doEA (trees,
280                                SOME (genExpr (T.ADD (ty, T.REG(ty, b'), le'))),                                SOME (genExpr (T.ADD (ty, le', le))),
281                           i, s, I.Immed 0)                           i, s, I.Immed 0)
282                       | _ => error "doEALabel"                       | _ => error "doEALabel"
283                    (* end case *))                    (* end case *))
# Line 332  Line 333 
333            in            in
334              case doEA ([ea], NONE, NONE, 0, I.Immed 0)              case doEA ([ea], NONE, NONE, 0, I.Immed 0)
335               of I.Immed _ => raise EA               of I.Immed _ => raise EA
336                | I.ImmedLabel le => I.Displace {base=genExpr le, disp=I.Immed 0, mem=mem}                | I.ImmedLabel le => I.LabelEA le (*I.Displace {base=genExpr le, disp=I.Immed 0, mem=mem}*)
337                | ea => ea                | ea => ea
338            end (* address' *)            end (* address' *)
339    
# Line 888  Line 889 
889               | _ => error "convertf2f"               | _ => error "convertf2f"
890              (* end case *))              (* end case *))
891              in              in
892                mark (I.FMOVE {fmvOp=fmvOp, dst=I.FDirect d,                mark (I.FMOVE {fmvOp=fmvOp, dst=I.FDirect d, src=foperand (fromTy, e)}, an)
                              src=foperand (fromTy, e)}, an)  
893              end (* convertf2f *)              end (* convertf2f *)
894    
895          and converti2f (fty, ty, e, d, an) = let          and converti2f (fty, ty, e, d, an) = let
# Line 899  Line 899 
899                             | (64, 32) => I.CVTSI2SSQ                             | (64, 32) => I.CVTSI2SSQ
900                             | (64, 64) => I.CVTSI2SDQ                             | (64, 64) => I.CVTSI2SDQ
901                           (* end case *))                           (* end case *))
902                val src = regOrMem (ty, operand ty e)
903              in              in
904                mark (I.FMOVE {fmvOp=fmvOp, dst=I.FDirect d,                mark (I.FMOVE {fmvOp=fmvOp, dst=I.FDirect d, src=src}, an)
                              src=operand ty e}, an)  
905              end (* converti2f *)              end (* converti2f *)
906    
907          and fexpr (fty, d, e, an) = ( floatingPointUsed := true;          and fexpr (fty, d, e, an) = ( floatingPointUsed := true;
# Line 946  Line 946 
946                   | NONE => return(set, an)                   | NONE => return(set, an)
947                  (* end case *))                  (* end case *))
948              in              in
949                mark(I.CALL{opnd=operand 32 ea,defs=cellset def,uses=cellset use,                mark(I.CALL{opnd=operand 64 ea,defs=cellset def,uses=cellset use,
950                            return=return (C.empty,an),cutsTo=cutsTo,mem=mem,                            return=return (C.empty,an),cutsTo=cutsTo,mem=mem,
951                            pops=pops},an)                            pops=pops},an)
952              end (* call *)              end (* call *)
# Line 1042  Line 1042 
1042                (* end case *))                (* end case *))
1043              end (* store *)              end (* store *)
1044    
1045            (* floating-point branch for
1046             *   if (t1 fcc t2)
1047             *      goto lab
1048             *)
1049          and fbranch (fty, fcc, t1, t2, lab, an) = let          and fbranch (fty, fcc, t1, t2, lab, an) = let
1050              fun j cc = mark (I.JCC {cond=cc, opnd=immedLabel lab}, an)              fun j cc = mark (I.JCC {cond=cc, opnd=immedLabel lab}, an)
1051              in              in
# Line 1067  Line 1071 
1071                   | _      => error(concat[                   | _      => error(concat[
1072                                  "fbranch(", T.Basis.fcondToString fcc, ")"])                                  "fbranch(", T.Basis.fcondToString fcc, ")"])
1073                 (*esac*))                 (*esac*))
1074                (* compare for condition  (x op y)
1075                 *
1076                 *              (y)          (x)
1077                 * ucomiss/d    xmm1/m32,  xmm2
1078                 *)
1079                 fun compare () = let                 fun compare () = let
1080                     val l = foperand (fty, t1)                     val r = foperand (fty, t1)
1081                     val r = foperand (fty, t2)                     val l = foperand (fty, t2)
1082                     fun cmp (l, r, fcc) = (                     fun cmp (l, r, fcc) = (
1083                         emit (I.FCOM {comOp=O.ucomOp fty, src=r, dst=l});                         emit (I.FCOM {comOp=O.ucomOp fty, src=r, dst=l});
1084                         fcc)                         fcc)
# Line 1228  Line 1237 
1237          and stmt' (s, an) = (case s          and stmt' (s, an) = (case s
1238              of T.MV (ty, d, e) => expr' (ty, e, d, an)              of T.MV (ty, d, e) => expr' (ty, e, d, an)
1239               | T.FMV (fty, d, e) => fexpr (fty, d, e, an)               | T.FMV (fty, d, e) => fexpr (fty, d, e, an)
1240               | T.CCMV (ccd, e) => raise Fail "todo"               | T.CCMV (ccd, e) => doCCexpr (e, ccd, an)
1241               | T.COPY (ty, dst, src) => copy (ty, dst, src, an)               | T.COPY (ty, dst, src) => copy (ty, dst, src, an)
1242               | T.FCOPY (fty, dst, src) => fcopy (fty, dst, src, an)               | T.FCOPY (fty, dst, src) => fcopy (fty, dst, src, an)
1243               | T.JMP (e, labs) => jmp (e, labs, an)               | T.JMP (e, labs) => jmp (e, labs, an)
# Line 1276  Line 1285 
1285                end                end
1286    
1287          and reducer () = TS.REDUCER{          and reducer () = TS.REDUCER{
1288                  reduceRexp    = fn _ => raise Fail "todo",                  reduceRexp    = genExpr,
1289                  reduceFexp    = fn _ => raise Fail "todo",                  reduceFexp    = fn e => fexpToReg (64, e),
1290                  reduceCCexp   = ccExpr,                  reduceCCexp   = ccExpr,
1291                  reduceStm     = stmt',                  reduceStm     = stmt',
1292                  operand       = operand 64,                  operand       = operand 64,

Legend:
Removed from v.2790  
changed lines
  Added in v.2791

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