diff options
author | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-02 05:23:57 +0000 |
---|---|---|
committer | Anton Korobeynikov <asl@math.spbu.ru> | 2008-04-02 05:23:57 +0000 |
commit | 67073f1cbd95f61a8db01ac479f5e60c0a048ac0 (patch) | |
tree | 959c502ec8fecc71adff7f78e0b50e764d464188 /lib | |
parent | 52b1733df4bb3cafa7a81384da7e81a1fa66cea5 (diff) |
Add new CC lowering rule: provide a list of registers, which can be 'shadowed',
when some another register is used for argument passing.
Currently is used on Win64.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@49079 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Target/TargetCallingConv.td | 8 | ||||
-rw-r--r-- | lib/Target/X86/X86CallingConv.td | 19 |
2 files changed, 21 insertions, 6 deletions
diff --git a/lib/Target/TargetCallingConv.td b/lib/Target/TargetCallingConv.td index 05d505a88d..908e16ed5e 100644 --- a/lib/Target/TargetCallingConv.td +++ b/lib/Target/TargetCallingConv.td @@ -59,6 +59,14 @@ class CCAssignToReg<list<Register> regList> : CCAction { list<Register> RegList = regList; } +/// CCAssignToRegWithShadow - Same as CCAssignToReg, but with list of registers +/// which became shadowed, when some register is used. +class CCAssignToRegWithShadow<list<Register> regList, + list<Register> shadowList> : CCAction { + list<Register> RegList = regList; + list<Register> ShadowRegList = shadowList; +} + /// CCAssignToStack - This action always matches: it assigns the value to a /// stack slot of the specified size and alignment on the stack. If size is /// zero then the ABI size is used; if align is zero then the ABI alignment diff --git a/lib/Target/X86/X86CallingConv.td b/lib/Target/X86/X86CallingConv.td index 310dbb7671..c60611d065 100644 --- a/lib/Target/X86/X86CallingConv.td +++ b/lib/Target/X86/X86CallingConv.td @@ -158,22 +158,29 @@ def CC_X86_64_C : CallingConv<[ def CC_X86_Win64_C : CallingConv<[ // FIXME: Handle byval stuff. // FIXME: Handle fp80. - // FIXME: Handle shadowed arguments. - // FIXME: Handle nested functions. + // FIXME: Handle varargs. // Promote i8/i16 arguments to i32. CCIfType<[i8, i16], CCPromoteToType<i32>>, + // The 'nest' parameter, if any, is passed in R10. + CCIfNest<CCAssignToReg<[R10]>>, + // The first 4 integer arguments are passed in integer registers. - CCIfType<[i32], CCAssignToReg<[ECX, EDX, R8D, R9D]>>, - CCIfType<[i64], CCAssignToReg<[RCX, RDX, R8 , R9 ]>>, + CCIfType<[i32], CCAssignToRegWithShadow<[ECX , EDX , R8D , R9D ], + [XMM0, XMM1, XMM2, XMM3]>>, + CCIfType<[i64], CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ], + [XMM0, XMM1, XMM2, XMM3]>>, // The first 4 FP/Vector arguments are passed in XMM registers. CCIfType<[f32, f64, v16i8, v8i16, v4i32, v2i64, v4f32, v2f64], - CCAssignToReg<[XMM0, XMM1, XMM2, XMM3]>>, + CCAssignToRegWithShadow<[XMM0, XMM1, XMM2, XMM3], + [RCX , RDX , R8 , R9 ]>>, // The first 4 MMX vector arguments are passed in GPRs. - CCIfType<[v8i8, v4i16, v2i32, v1i64], CCAssignToReg<[RCX, RDX, R8, R9]>>, + CCIfType<[v8i8, v4i16, v2i32, v1i64], + CCAssignToRegWithShadow<[RCX , RDX , R8 , R9 ], + [XMM0, XMM1, XMM2, XMM3]>>, // Integer/FP values get stored in stack slots that are 8 bytes in size and // 16-byte aligned if there are no more registers to hold them. |