File: located-arg-fn.sml

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (84 lines) | stat: -rw-r--r-- 3,306 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
(* located-arg-fn.sml
 *
 * Create located arguments.
 *)

functor LocatedArgFn (
    structure SA : STAGED_ALLOCATION
	where type reg_id = int
        where type loc_kind = CLocKind.loc_kind
  ) :> sig

    type located_arg = { 
	       k : CLocKind.loc_kind, 
	       width : int,                (* bit width of the argument *)
	       narrowing : int option,     (* bit width to convert the argument to *)
	       loc : int,                  (* register id or stack offset *)
	       offset : int,               (* offset if the argument is split between two locations *)
	       arg : Vararg.arg            (* the argument *)
             }

  (* converts a sequence of arguments and staged allocation locations to located arguments *)
    val mkLocatedArgs : (Vararg.arg list * SA.loc list) -> located_arg list

    val toString : located_arg -> string

  end = struct

    structure V = Vararg
    structure CK = CLocKind
    structure SA = SA

    type located_arg = { 
	       k : CK.loc_kind, 
	       width : int,                (* bit width of the argument *)
	       narrowing : int option,     (* bit width to convert the argument to *)
	       loc : int,                  (* register id or stack offset *)
	       offset : int,               (* offset if the argument is split between two locations *)
	       arg : Vararg.arg            (* the argument *)
             }

    fun narrowLocdArg narrowing {arg, k, width, loc, offset, narrowing=n} =
	    {arg=arg, k=k, width=width, loc=loc, offset=offset, narrowing=SOME narrowing}

    fun narrowLocdArgs (narrowing, locdArgs) =
	    List.map (narrowLocdArg narrowing) locdArgs

    fun combineLocdArg ({arg, k, width, loc, offset, narrowing} : located_arg, (i, locdArgs)) = let
	    val offset = offset + i
	    val locdArg = {arg=arg, k=k, width=width, loc=loc, offset=offset, narrowing=narrowing}
            in
	       (i + 1, locdArg :: locdArgs)
	    end

    val combineLocdArgs = List.rev o #2 o List.foldl combineLocdArg (0, []) 

  (* take an argument and a location and return a located argument *)
    fun mkLocatedArg (arg:V.arg, SA.REG (w, k, r)) = 
	    [{arg=arg, k=k, width=w, narrowing=NONE, loc=r, offset=0}]
      | mkLocatedArg (arg, SA.BLOCK_OFFSET (w, (CK.GPR | CK.STK), off)) = 
	    [{arg=arg, k=CK.STK, width=w, narrowing=NONE, loc=off, offset=0}]
      | mkLocatedArg (arg, SA.BLOCK_OFFSET (w, (CK.FPR | CK.FSTK), off)) = 
	    [{arg=arg, k=CK.FSTK, width=w, narrowing=NONE, loc=off, offset=0}]
      | mkLocatedArg (arg, SA.NARROW (loc, narrowing, k)) = 
	    narrowLocdArgs (narrowing, mkLocatedArg (arg, loc))
      | mkLocatedArg (arg, SA.COMBINE (l1, l2)) = let
	    val locdArgs1 = mkLocatedArg (arg, l1)
	    val locdArgs2 = mkLocatedArg (arg, l2)
	    in
	        combineLocdArgs (locdArgs1 @ locdArgs2)
	    end

  (* converts a sequence of arguments and staged allocation locations to located arguments *)
    val mkLocatedArgs = List.concat o ListPair.mapEq mkLocatedArg

    fun k2s CK.GPR = "GPR"
      | k2s CK.FPR = "FPR"
      | k2s CK.STK = "STK"
      | k2s CK.FSTK = "FSTK"
    val i2s = Int.toString

    fun toString {k, width, narrowing, offset, arg, loc} =
	"{k="^k2s k^",width="^i2s width^",narrowing="^i2s (Option.getOpt(narrowing, width))^",offset="^i2s offset^",loc="^i2s loc^"}"

  end