File: vararg-call.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 (116 lines) | stat: -rw-r--r-- 3,449 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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
(* vararg-call.sml
 *
 * Infrastructure for calling varargs functions for each supported architecture.
 *)

structure VarargCall =
  struct

    val regNum = CellsBasis.physicalRegisterNum

  (* x86 *)
    local
    structure X86SA = StagedAllocationFn (
                         type reg_id = int
			 datatype loc_kind = datatype CLocKind.loc_kind
			 val memSize = 8)
    structure X86Convention = X86CConventionFn(
			        type reg_id = int
				val eax = regNum X86Cells.eax
				val edx = regNum X86Cells.edx
				val st0 = regNum X86Cells.ST0
				structure SA = X86SA)
    in
    structure X86VarargCall = VarargCallFn (
			          val params = X86Convention.params
				  val returns = X86Convention.returns
				  val store0 = X86Convention.store0
				  val bitWidthOfPointer = 32
				  val alignBOfPointer = 4
				  val alignBOfInt = 4
				  val alignBOfDouble = 4
				  val kindOfInt = CLocKind.GPR
				  val kindOfPointer = CLocKind.GPR
				  val kindOfDouble = CLocKind.FPR
				  structure SA = X86SA
			      )
    end (* x86 *)

  (* x86 64 *)
    local
    structure X86_64SA = StagedAllocationFn (
                         type reg_id = int
			 datatype loc_kind = datatype CLocKind.loc_kind
			 val memSize = 8)
    structure X86_64Convention = X86_64CConventionFn(
			        type reg_id = int
				val rax = regNum AMD64Cells.rax
				val rdi = regNum AMD64Cells.rdi
				val rsi = regNum AMD64Cells.rsi
				val rdx = regNum AMD64Cells.rdx
				val rcx = regNum AMD64Cells.rcx
				val r8 = regNum AMD64Cells.r8
				val r9 = regNum AMD64Cells.r9
				val xmm0 = regNum AMD64Cells.xmm0
				val xmm1 = regNum AMD64Cells.xmm1
				val xmm2 = regNum AMD64Cells.xmm2
				val xmm3 = regNum AMD64Cells.xmm3
				val xmm4 = regNum AMD64Cells.xmm4
				val xmm5 = regNum AMD64Cells.xmm5
				val xmm6 = regNum AMD64Cells.xmm6
				val xmm7 = regNum AMD64Cells.xmm7
				structure SA = X86_64SA)
    in
    structure X86_64VarargCall = VarargCallFn (
			          val params = X86_64Convention.params
				  val returns = X86_64Convention.returns
				  val store0 = X86_64Convention.store0
				  val bitWidthOfPointer = 64
				  val alignBOfPointer = 8
				  val alignBOfInt = 8
				  val alignBOfDouble = 8
				  val kindOfInt = CLocKind.GPR
				  val kindOfPointer = CLocKind.GPR
				  val kindOfDouble = CLocKind.FPR
				  structure SA = X86_64SA
			      )
    end (* x86 64 *)

  (* sparc *)
    local
    structure SparcSA = StagedAllocationFn (
                         type reg_id = int
			 datatype loc_kind = datatype CLocKind.loc_kind
			 val memSize = 4)
    val GP = regNum o SparcCells.GPReg
    val FP = regNum o SparcCells.FPReg
    fun freg r = FP r
    fun oreg r = GP (r + 8)
    structure SparcConvention = SparcCConventionFn(
			        type reg_id = int
				val r8 = oreg 0
				val r9 = oreg 1
				val r10 = oreg 2
				val r11 = oreg 3
				val r12 = oreg 4
				val r13 = oreg 5
				val f0 = freg 0
				val f1 = freg 1
				structure SA = SparcSA)
    in
    structure SparcVarargCall = VarargCallFn (
			          val params = SparcConvention.params
				  val returns = SparcConvention.return
				  val store0 = SparcConvention.store0
				  val bitWidthOfPointer = 32
				  val alignBOfPointer = 4
				  val alignBOfInt = 4
				  val alignBOfDouble = 4
				  val kindOfInt = CLocKind.GPR
				  val kindOfPointer = CLocKind.GPR
				  val kindOfDouble = CLocKind.FPR
				  structure SA = SparcSA
			      )
    end (* sparc *)

  end