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
|