X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=lib%2FTarget%2FSystemZ%2FSystemZCallingConv.td;h=c4f641e7bdeccce355d5a2b513fe0f9282c4364b;hb=16658af535ed09169cb1079a474334dbf1cb8dc7;hp=34670467f1cdbd4f808773075b2a68c12f511218;hpb=a51752cbea5d57956f177470f463baeeee33f3d7;p=oota-llvm.git diff --git a/lib/Target/SystemZ/SystemZCallingConv.td b/lib/Target/SystemZ/SystemZCallingConv.td index 34670467f1c..c4f641e7bde 100644 --- a/lib/Target/SystemZ/SystemZCallingConv.td +++ b/lib/Target/SystemZ/SystemZCallingConv.td @@ -1,4 +1,4 @@ -//=- SystemZCallingConv.td - Calling Conventions for SystemZ -*- tablegen -*-=// +//=- SystemZCallingConv.td - Calling conventions for SystemZ -*- tablegen -*-=// // // The LLVM Compiler Infrastructure // @@ -6,34 +6,60 @@ // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// -// This describes the calling conventions for SystemZ architecture. +// This describes the calling conventions for the SystemZ ABI. //===----------------------------------------------------------------------===// +class CCIfExtend + : CCIf<"ArgFlags.isSExt() || ArgFlags.isZExt()", A>; + //===----------------------------------------------------------------------===// -// SystemZ Return Value Calling Convention +// SVR4 return value calling convention //===----------------------------------------------------------------------===// def RetCC_SystemZ : CallingConv<[ - // Promote i8/i16/i32 arguments to i64. - CCIfType<[i8, i16, i32], CCPromoteToType>, + // Promote i32 to i64 if it has an explicit extension type. + CCIfType<[i32], CCIfExtend>>, + + // ABI-compliant code returns 64-bit integers in R2. Make the other + // call-clobbered argument registers available for code that doesn't + // care about the ABI. (R6 is an argument register too, but is + // call-saved and therefore not suitable for return values.) + CCIfType<[i32], CCAssignToReg<[R2L, R3L, R4L, R5L]>>, + CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D]>>, - // i64 is returned in register R2 - CCIfType<[i64], CCAssignToReg<[R2D]>> + // ABI-complaint code returns float and double in F0. Make the + // other floating-point argument registers available for code that + // doesn't care about the ABI. All floating-point argument registers + // are call-clobbered, so we can use all of them here. + CCIfType<[f32], CCAssignToReg<[F0S, F2S, F4S, F6S]>>, + CCIfType<[f64], CCAssignToReg<[F0D, F2D, F4D, F6D]>> + + // ABI-compliant code returns long double by reference, but that conversion + // is left to higher-level code. Perhaps we could add an f128 definition + // here for code that doesn't care about the ABI? ]>; //===----------------------------------------------------------------------===// -// SystemZ Argument Calling Conventions +// SVR4 argument calling conventions //===----------------------------------------------------------------------===// def CC_SystemZ : CallingConv<[ - // Promote i8/i16/i32 arguments to i64. - CCIfType<[i8, i16, i32], CCPromoteToType>, - - // The first 5 integer arguments of non-varargs functions are passed in - // integer registers. - // FIXME: Check stuff for varagrs - CCIfNotVarArg>>, - - // Integer values get stored in stack slots that are 8 bytes in - // size and 8-byte aligned. - CCIfType<[i64], CCAssignToStack<8, 8>> + // Promote i32 to i64 if it has an explicit extension type. + // The convention is that true integer arguments that are smaller + // than 64 bits should be marked as extended, but structures that + // are smaller than 64 bits shouldn't. + CCIfType<[i32], CCIfExtend>>, + + // Force long double values to the stack and pass i64 pointers to them. + CCIfType<[f128], CCPassIndirect>, + + // The first 5 integer arguments are passed in R2-R6. Note that R6 + // is call-saved. + CCIfType<[i32], CCAssignToReg<[R2L, R3L, R4L, R5L, R6L]>>, + CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D, R6D]>>, + + // The first 4 float and double arguments are passed in even registers F0-F6. + CCIfType<[f32], CCAssignToReg<[F0S, F2S, F4S, F6S]>>, + CCIfType<[f64], CCAssignToReg<[F0D, F2D, F4D, F6D]>>, + + // Other arguments are passed in 8-byte-aligned 8-byte stack slots. + CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>> ]>;