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/sparc/c-calls/sparc-c-calls.sml
ViewVC logotype

Diff of /sml/trunk/src/MLRISC/sparc/c-calls/sparc-c-calls.sml

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

revision 840, Fri Jun 15 19:05:19 2001 UTC revision 841, Fri Jun 15 21:38:20 2001 UTC
# Line 93  Line 93 
93                | _ => T.ADD (32, x, T.LI d')                | _ => T.ADD (32, x, T.LI d')
94          end          end
95    
96        fun argaddr n = addli (spreg, 68+4*n)
97    
98      (* temp location for transfers through memory *)      (* temp location for transfers through memory *)
99      val tmpaddr = addli (spreg, 72)      val tmpaddr = argaddr 1
100    
101      fun roundup (i, a) = a * ((i + a - 1) div a)      fun roundup (i, a) = a * ((i + a - 1) div a)
102    
# Line 245  Line 247 
247                | loop (t :: tl, a :: al, n, ss, asc, cpc) = let                | loop (t :: tl, a :: al, n, ss, asc, cpc) = let
248                      fun wordassign a =                      fun wordassign a =
249                          if n < 6 then T.MV (32, oreg n, a)                          if n < 6 then T.MV (32, oreg n, a)
250                          else T.STORE (32, addli (spreg, 68+4*n), a, stack)                          else T.STORE (32, argaddr n, a, stack)
251                      fun wordarg (a, cpc, ss) =                      fun wordarg (a, cpc, ss) =
252                          loop (tl, al, n + 1, ss, wordassign a :: asc, cpc)                          loop (tl, al, n + 1, ss, wordassign a :: asc, cpc)
253    
# Line 254  Line 256 
256                              T.MV (32, oreg n, T.LOAD (32, addr, region))                              T.MV (32, oreg n, T.LOAD (32, addr, region))
257                          fun tomem (n, addr) =                          fun tomem (n, addr) =
258                              T.STORE (32,                              T.STORE (32,
259                                       addli (spreg, 68+4*n),                                       argaddr n,
260                                       T.LOAD (32, addr, region),                                       T.LOAD (32, addr, region),
261                                       stack)                                       stack)
262                          fun toany (n, addr) =                          fun toany (n, addr) =
263                              if n < 6 then toreg (n, addr) else tomem (n, addr)                              if n < 6 then toreg (n, addr) else tomem (n, addr)
264                      in                      in
265                            (* if n < 6 andalso n div 2 = 0 then
266                             *     use ldd here once MLRISC gets its usage right
267                             * else
268                             *   ... *)
269                          loop (tl, al, n+2, ss,                          loop (tl, al, n+2, ss,
270                                tmpstore @                                tmpstore @
271                                toany (n, addr)                                toany (n, addr)
# Line 267  Line 273 
273                                :: asc,                                :: asc,
274                                cpc)                                cpc)
275                      end                      end
276                        fun dwordarg mkstore =
277                            if n > 6 andalso n div 2 = 1 then
278                                (* 8-byte aligned memory *)
279                                loop (tl, al, n+2, ss,
280                                      mkstore (argaddr n) :: asc,
281                                      cpc)
282                            else dwordmemarg (tmpaddr, stack, [mkstore tmpaddr])
283                  in                  in
284                      case (t, a) of                      case (t, a) of
285                          ((Ty.C_void | Ty.C_PTR | Ty.C_ARRAY _ |                          ((Ty.C_void | Ty.C_PTR | Ty.C_ARRAY _ |
# Line 286  Line 299 
299                          (case a of                          (case a of
300                               T.LOAD (_, addr, region) =>                               T.LOAD (_, addr, region) =>
301                               dwordmemarg (addr, region, [])                               dwordmemarg (addr, region, [])
302                             | _ => dwordmemarg                             | _ => dwordarg (fn addr =>
303                                        (tmpaddr, stack,                                                 T.STORE (64, addr, a, stack)))
                                        [T.STORE (64, tmpaddr, a, stack)]))  
304                        | (Ty.C_float, FARG a) =>                        | (Ty.C_float, FARG a) =>
305                          (* we use the stack region reserved for storing                          (* we use the stack region reserved for storing
306                           * %o0-%o5 as temporary storage for transferring                           * %o0-%o5 as temporary storage for transferring
# Line 305  Line 317 
317                                   loop (tl, al, n + 1, ss, cp :: ld :: asc, cpc)                                   loop (tl, al, n + 1, ss, cp :: ld :: asc, cpc)
318                               end                               end
319                               else loop (tl, al, n + 1, ss,                               else loop (tl, al, n + 1, ss,
320                                          T.FSTORE (32, addli (spreg, 68+4*n),                                          T.FSTORE (32, argaddr n, a, stack)
321                                                    a, stack) :: asc,                                          :: asc,
322                                          cpc))                                          cpc))
323                        | (Ty.C_double, FARG a) =>                        | (Ty.C_double, FARG a) =>
324                          dwordmemarg (tmpaddr, stack,                          (case a of
325                                       [T.FSTORE (64, tmpaddr, a, stack)])                               T.FLOAD (_, addr, region) =>
326                                 dwordmemarg (addr, region, [])
327                               | _ => dwordarg (fn addr =>
328                                                   T.FSTORE (64, addr, a, stack)))
329                        | (Ty.C_long_double, FARG a) => let                        | (Ty.C_long_double, FARG a) => let
330                              (* Copy 128-bit floating point value (16 bytes)                              (* Copy 128-bit floating point value (16 bytes)
331                               * into scratch space (aligned at 8-byte boundary).                               * into scratch space (aligned at 8-byte boundary).

Legend:
Removed from v.840  
changed lines
  Added in v.841

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