Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Tracker SCM

SCM Repository

[smlnj] Diff of /sml/trunk/src/compiler/CodeGen/main/mlriscGen.sml
ViewVC logotype

Diff of /sml/trunk/src/compiler/CodeGen/main/mlriscGen.sml

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

revision 811, Fri Apr 20 13:38:05 2001 UTC revision 812, Fri Apr 20 15:07:30 2001 UTC
# Line 1766  Line 1766 
1766                                C_PTR),                                C_PTR),
1767                               v :: vl) =                               v :: vl) =
1768                            (CCalls.ARG (regbind v), vl)                            (CCalls.ARG (regbind v), vl)
 (* this would recursively traverse all structures fields, but we don't want  
  * to do that...  
                         | m (C_STRUCT tl, vl) = let val (al, vl') = ml (tl, vl)  
                                                 in (CCalls.ARGS al, vl') end  
 *)  
                         (* instead, we just pass the struct's address... *)  
1769                          | m (C_STRUCT _, v :: vl) =                          | m (C_STRUCT _, v :: vl) =
1770                              (* pass struct using the pointer to its beginning *)
1771                            (CCalls.ARG (regbind v), vl)                            (CCalls.ARG (regbind v), vl)
1772                          | m (_, []) = error "RCC: not enough ML args"                          | m (_, []) = error "RCC: not enough ML args"
1773                          | m _ = error "RCC: unexpected C-type"                          | m _ = error "RCC: unexpected C-type"
# Line 1802  Line 1797 
1797                    val { callseq, result } =                    val { callseq, result } =
1798                        CCalls.genCall                        CCalls.genCall
1799                            { name = f, proto = p, structRet = sr, args = a }                            { name = f, proto = p, structRet = sr, args = a }
1800    
1801                      fun withVSP f = let
1802                          (***** must be a real frame pointer once that is
1803                           * implemented!!*)
1804                          val frameptr = C.stackptr
1805    
1806                          val msp =
1807                              M.LOAD (addrTy, ea (frameptr, MS.ML_STATE_OFFSET),
1808                                      R.memory)
1809                          val vsp =
1810                              M.LOAD (addrTy, ea (msp, MS.VProcOffMSP), R.memory)
1811    
1812                          val vsp' = M.REG (addrTy, Cells.newReg ())
1813                          val inML =
1814                              M.LOAD (ity, ea (vsp', MS.InMLOffVSP),
1815                                      R.memory)
1816                          val LimitPtrMask =
1817                              M.LOAD (32, ea (vsp', MS.LimitPtrMaskOffVSP),
1818                                      R.memory)
1819                      in
1820                          (* move vsp to its register *)
1821                          emit (assign (vsp', vsp));
1822                          f { inML = inML, LimitPtrMask = LimitPtrMask }
1823                      end
1824    
1825                in                in
1826                    (* just for testing... *)                    (* just for testing... *)
1827                    print ("$$$ RCC: " ^ CProto.pshow p ^ "\n");                    print ("$$$ RCC: " ^ CProto.pshow p ^ "\n");
1828    
1829                    (* now do it! *)                    (* prepare for leaving ML *)
1830                      withVSP (fn { inML, LimitPtrMask } =>
1831                                  ((* set vp_limitPtrMask to ~1 *)
1832                                   emit (assign (LimitPtrMask, LW 0wxffffffff));
1833                                   (* set vp_inML to 0 *)
1834                                   emit (assign (inML, LW 0w0))));
1835    
1836                      (* now do the actual call! *)
1837                    app emit callseq;                    app emit callseq;
1838    
1839                      (* come back to ML, restore proper limit pointer *)
1840                      withVSP (fn { inML, LimitPtrMask } =>
1841                                  ((* set vp_inML back to 1 *)
1842                                   emit (assign (inML, LW 0w1));
1843                                   (* limitPtr := limitPtr & vp_limitPtrMask *)
1844                                   emit (assign (C.limitptr,
1845                                                 M.ANDB (pty, LimitPtrMask,
1846                                                              C.limitptr)))));
1847    
1848                    case (result, retTy) of                    case (result, retTy) of
1849                        (([] | [_]), (CTypes.C_void | CTypes.C_STRUCT _)) =>                        (([] | [_]), (CTypes.C_void | CTypes.C_STRUCT _)) =>
1850                        defI31 (w, mlZero, e, hp)                        defI31 (w, mlZero, e, hp)

Legend:
Removed from v.811  
changed lines
  Added in v.812

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