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 1043, Mon Jan 28 21:26:03 2002 UTC
# Line 68  Line 68 
68      val mem = T.Region.memory      val mem = T.Region.memory
69      val stack = T.Region.memory      val stack = T.Region.memory
70    
71        val paramAreaOffset = 68
72    
73      fun LI i = T.LI (T.I.fromInt (32, i))      fun LI i = T.LI (T.I.fromInt (32, i))
74    
75      val GP = C.GPReg      val GP = C.GPReg
# Line 93  Line 95 
95                | _ => T.ADD (32, x, T.LI d')                | _ => T.ADD (32, x, T.LI d')
96          end          end
97    
98        fun argaddr n = addli (spreg, paramAreaOffset + 4*n)
99    
100      (* temp location for transfers through memory *)      (* temp location for transfers through memory *)
101      val tmpaddr = addli (spreg, 72)      val tmpaddr = argaddr 1
102    
103      fun roundup (i, a) = a * ((i + a - 1) div a)      fun roundup (i, a) = a * ((i + a - 1) div a)
104    
# Line 132  Line 136 
136              pack (0, 1, l)              pack (0, 1, l)
137          end          end
138    
139      fun genCall { name, proto, structRet, saveRestoreDedicated,      fun genCall { name, proto, paramAlloc, structRet, saveRestoreDedicated,
140                    callComment, args } = let                    callComment, args } = let
141          val { conv, retTy, paramTys } = proto          val { conv, retTy, paramTys } = proto
142          val _ = case conv of          val _ = case conv of
# Line 245  Line 249 
249                | loop (t :: tl, a :: al, n, ss, asc, cpc) = let                | loop (t :: tl, a :: al, n, ss, asc, cpc) = let
250                      fun wordassign a =                      fun wordassign a =
251                          if n < 6 then T.MV (32, oreg n, a)                          if n < 6 then T.MV (32, oreg n, a)
252                          else T.STORE (32, addli (spreg, 68+4*n), a, stack)                          else T.STORE (32, argaddr n, a, stack)
253                      fun wordarg (a, cpc, ss) =                      fun wordarg (a, cpc, ss) =
254                          loop (tl, al, n + 1, ss, wordassign a :: asc, cpc)                          loop (tl, al, n + 1, ss, wordassign a :: asc, cpc)
255    
# Line 254  Line 258 
258                              T.MV (32, oreg n, T.LOAD (32, addr, region))                              T.MV (32, oreg n, T.LOAD (32, addr, region))
259                          fun tomem (n, addr) =                          fun tomem (n, addr) =
260                              T.STORE (32,                              T.STORE (32,
261                                       addli (spreg, 68+4*n),                                       argaddr n,
262                                       T.LOAD (32, addr, region),                                       T.LOAD (32, addr, region),
263                                       stack)                                       stack)
264                          fun toany (n, addr) =                          fun toany (n, addr) =
265                              if n < 6 then toreg (n, addr) else tomem (n, addr)                              if n < 6 then toreg (n, addr) else tomem (n, addr)
266                      in                      in
267                            (* if n < 6 andalso n div 2 = 0 then
268                             *     use ldd here once MLRISC gets its usage right
269                             * else
270                             *   ... *)
271                          loop (tl, al, n+2, ss,                          loop (tl, al, n+2, ss,
272                                tmpstore @                                tmpstore @
273                                toany (n, addr)                                toany (n, addr)
# Line 267  Line 275 
275                                :: asc,                                :: asc,
276                                cpc)                                cpc)
277                      end                      end
278                        fun dwordarg mkstore =
279                            if n > 6 andalso n div 2 = 1 then
280                                (* 8-byte aligned memory *)
281                                loop (tl, al, n+2, ss,
282                                      mkstore (argaddr n) :: asc,
283                                      cpc)
284                            else dwordmemarg (tmpaddr, stack, [mkstore tmpaddr])
285                  in                  in
286                      case (t, a) of                      case (t, a) of
287                          ((Ty.C_void | Ty.C_PTR | Ty.C_ARRAY _ |                          ((Ty.C_void | Ty.C_PTR | Ty.C_ARRAY _ |
# Line 286  Line 301 
301                          (case a of                          (case a of
302                               T.LOAD (_, addr, region) =>                               T.LOAD (_, addr, region) =>
303                               dwordmemarg (addr, region, [])                               dwordmemarg (addr, region, [])
304                             | _ => dwordmemarg                             | _ => dwordarg (fn addr =>
305                                        (tmpaddr, stack,                                                 T.STORE (64, addr, a, stack)))
                                        [T.STORE (64, tmpaddr, a, stack)]))  
306                        | (Ty.C_float, FARG a) =>                        | (Ty.C_float, FARG a) =>
307                          (* we use the stack region reserved for storing                          (* we use the stack region reserved for storing
308                           * %o0-%o5 as temporary storage for transferring                           * %o0-%o5 as temporary storage for transferring
# Line 305  Line 319 
319                                   loop (tl, al, n + 1, ss, cp :: ld :: asc, cpc)                                   loop (tl, al, n + 1, ss, cp :: ld :: asc, cpc)
320                               end                               end
321                               else loop (tl, al, n + 1, ss,                               else loop (tl, al, n + 1, ss,
322                                          T.FSTORE (32, addli (spreg, 68+4*n),                                          T.FSTORE (32, argaddr n, a, stack)
323                                                    a, stack) :: asc,                                          :: asc,
324                                          cpc))                                          cpc))
325                        | (Ty.C_double, FARG a) =>                        | (Ty.C_double, FARG a) =>
326                          dwordmemarg (tmpaddr, stack,                          (case a of
327                                       [T.FSTORE (64, tmpaddr, a, stack)])                               T.FLOAD (_, addr, region) =>
328                                 dwordmemarg (addr, region, [])
329                               | _ => dwordarg (fn addr =>
330                                                   T.FSTORE (64, addr, a, stack)))
331                        | (Ty.C_long_double, FARG a) => let                        | (Ty.C_long_double, FARG a) => let
332                              (* Copy 128-bit floating point value (16 bytes)                              (* Copy 128-bit floating point value (16 bytes)
333                               * 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.1043

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