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 1551, Fri Jul 16 03:26:38 2004 UTC revision 1552, Fri Jul 16 18:00:22 2004 UTC
# Line 137  Line 137 
137          in          in
138              pack (0, 1, l)              pack (0, 1, l)
139          end          end
140          | szal (Ty.C_UNION l) =
141            let (* m: current max size
142                 * a: current total alignment *)
143                fun overlay (m, a, []) = (roundup (m, a), a)
144                  | overlay (m, a, t :: tl) =
145                    let val (ts, ta) = szal t
146                    in
147                        overlay (Int.max (m, ts), Int.max (a, ta), tl)
148                    end
149            in
150                overlay (0, 1, l)
151            end
152    
153  (**** START NEW CODE ****)  (**** START NEW CODE ****)
154    
# Line 173  Line 185 
185                                          String.toString conv, "\""])                                          String.toString conv, "\""])
186          val res_szal =          val res_szal =
187              case retTy of              case retTy of
188                  (Ty.C_long_double | Ty.C_STRUCT _) => SOME (szal retTy)                  (Ty.C_long_double | Ty.C_STRUCT _ | Ty.C_UNION _) =>
189                      SOME (szal retTy)
190                | _ => NONE                | _ => NONE
191    
192          val nargwords = let          val nargwords = let
# Line 199  Line 212 
212           * in to_off. *)           * in to_off. *)
213          fun struct_copy (sz, al, ARG a, t, to_off, cpc) =          fun struct_copy (sz, al, ARG a, t, to_off, cpc) =
214              (* Two main cases here:              (* Two main cases here:
215               *   1. t is C_STRUCT _: in this case "a" computes the address               *   1. t is C_STRUCT _ or C_UNION _;
216                 *      in this case "a" computes the address
217               *      of the struct to be copied.               *      of the struct to be copied.
218               *   2. t is some other non-floating type; "a" computes the               *   2. t is some other non-floating type; "a" computes the
219               *      the corresponding value (i.e., not its address).               *      the corresponding value (i.e., not its address).
# Line 218  Line 232 
232                       Ty.C_unsigned Ty.I_long_long) => ldst 64                       Ty.C_unsigned Ty.I_long_long) => ldst 64
233                    | (Ty.C_ARRAY _) =>                    | (Ty.C_ARRAY _) =>
234                      error "ARRAY within gather/scatter struct"                      error "ARRAY within gather/scatter struct"
235                    | (Ty.C_STRUCT _) =>                    | (Ty.C_STRUCT _ | Ty.C_UNION _) =>
236                      (* Here we have to do the equivalent of a "memcpy". *)                      (* Here we have to do the equivalent of a "memcpy". *)
237                      let val from = a (* argument is address of struct *)                      let val from = a (* argument is address of struct *)
238                          fun cp (ty, incr) = let                          fun cp (ty, incr) = let
# Line 246  Line 260 
260                    | (Ty.C_float | Ty.C_double | Ty.C_long_double) =>                    | (Ty.C_float | Ty.C_double | Ty.C_long_double) =>
261                      error "floating point type does not match ARG"                      error "floating point type does not match ARG"
262              end              end
263    (*
264            | struct_copy (_, _, ARGS args, Ty.C_STRUCT tl, to_off, cpc) =            | struct_copy (_, _, ARGS args, Ty.C_STRUCT tl, to_off, cpc) =
265              (* gather/scatter case *)              (* gather/scatter case *)
266              let fun loop ([], [], _, cpc) = cpc              let fun loop ([], [], _, cpc) = cpc
# Line 261  Line 276 
276              in              in
277                  loop (tl, args, to_off, cpc)                  loop (tl, args, to_off, cpc)
278              end              end
279    *)
280            | struct_copy (_, _, ARGS _, _, _, _) =            | struct_copy (_, _, ARGS _, _, _, _) =
281              error "gather/scatter for non-struct"                error "gather/scatter (ARGS) not supported (obsolete)"
282            | struct_copy (sz, al, FARG a, t, to_off, cpc) =            | struct_copy (sz, al, FARG a, t, to_off, cpc) =
283              let fun fldst ty =              let fun fldst ty =
284                     T.FSTORE (ty, addli (spreg, to_off), a, stack) :: cpc                     T.FSTORE (ty, addli (spreg, to_off), a, stack) :: cpc
# Line 371  Line 387 
387                                       T.FSTORE (128, ssaddr, a, stack) :: cpc,                                       T.FSTORE (128, ssaddr, a, stack) :: cpc,
388                                       ss' + 16)                                       ss' + 16)
389                          end                          end
390                        | (t as Ty.C_STRUCT _, a) => let                        | (t as (Ty.C_STRUCT _ | Ty.C_UNION _), a) => let
391                              (* copy entire struct into scratch space                              (* copy entire struct into scratch space
392                               * (aligned according to struct's alignment                               * (aligned according to struct's alignment
393                               * requirements).  The address of the scratch                               * requirements).  The address of the scratch
# Line 418  Line 434 
434                  Ty.C_float => [T.FPR (T.FREG (32, FP 0))]                  Ty.C_float => [T.FPR (T.FREG (32, FP 0))]
435                | Ty.C_double => [T.FPR (T.FREG (64, FP 0))] (* %f0/%f1 *)                | Ty.C_double => [T.FPR (T.FREG (64, FP 0))] (* %f0/%f1 *)
436                | Ty.C_long_double => []                | Ty.C_long_double => []
437                | Ty.C_STRUCT _ => []                | (Ty.C_STRUCT _ | Ty.C_UNION _) => []
438                | Ty.C_ARRAY _ => error "array return type"                | Ty.C_ARRAY _ => error "array return type"
439                | (Ty.C_PTR | Ty.C_void |                | (Ty.C_PTR | Ty.C_void |
440                   Ty.C_signed (Ty.I_int | Ty.I_long) |                   Ty.C_signed (Ty.I_int | Ty.I_long) |

Legend:
Removed from v.1551  
changed lines
  Added in v.1552

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