Ulrich Weigand | 5f613df | 2013-05-06 16:15:19 +0000 | [diff] [blame] | 1 | //=- SystemZCallingConv.td - Calling conventions for SystemZ -*- tablegen -*-=// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file is distributed under the University of Illinois Open Source |
| 6 | // License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // This describes the calling conventions for the SystemZ ABI. |
| 10 | //===----------------------------------------------------------------------===// |
| 11 | |
| 12 | class CCIfExtend<CCAction A> |
| 13 | : CCIf<"ArgFlags.isSExt() || ArgFlags.isZExt()", A>; |
| 14 | |
| 15 | //===----------------------------------------------------------------------===// |
Richard Sandiford | 02bb0ec | 2014-07-10 11:44:37 +0000 | [diff] [blame] | 16 | // z/Linux return value calling convention |
Ulrich Weigand | 5f613df | 2013-05-06 16:15:19 +0000 | [diff] [blame] | 17 | //===----------------------------------------------------------------------===// |
| 18 | def RetCC_SystemZ : CallingConv<[ |
| 19 | // Promote i32 to i64 if it has an explicit extension type. |
| 20 | CCIfType<[i32], CCIfExtend<CCPromoteToType<i64>>>, |
| 21 | |
| 22 | // ABI-compliant code returns 64-bit integers in R2. Make the other |
| 23 | // call-clobbered argument registers available for code that doesn't |
| 24 | // care about the ABI. (R6 is an argument register too, but is |
| 25 | // call-saved and therefore not suitable for return values.) |
Richard Sandiford | 7789b08 | 2013-09-30 08:48:38 +0000 | [diff] [blame] | 26 | CCIfType<[i32], CCAssignToReg<[R2L, R3L, R4L, R5L]>>, |
Ulrich Weigand | 5f613df | 2013-05-06 16:15:19 +0000 | [diff] [blame] | 27 | CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D]>>, |
| 28 | |
| 29 | // ABI-complaint code returns float and double in F0. Make the |
| 30 | // other floating-point argument registers available for code that |
| 31 | // doesn't care about the ABI. All floating-point argument registers |
| 32 | // are call-clobbered, so we can use all of them here. |
| 33 | CCIfType<[f32], CCAssignToReg<[F0S, F2S, F4S, F6S]>>, |
| 34 | CCIfType<[f64], CCAssignToReg<[F0D, F2D, F4D, F6D]>> |
| 35 | |
| 36 | // ABI-compliant code returns long double by reference, but that conversion |
| 37 | // is left to higher-level code. Perhaps we could add an f128 definition |
| 38 | // here for code that doesn't care about the ABI? |
| 39 | ]>; |
| 40 | |
| 41 | //===----------------------------------------------------------------------===// |
Richard Sandiford | 02bb0ec | 2014-07-10 11:44:37 +0000 | [diff] [blame] | 42 | // z/Linux argument calling conventions |
Ulrich Weigand | 5f613df | 2013-05-06 16:15:19 +0000 | [diff] [blame] | 43 | //===----------------------------------------------------------------------===// |
| 44 | def CC_SystemZ : CallingConv<[ |
| 45 | // Promote i32 to i64 if it has an explicit extension type. |
| 46 | // The convention is that true integer arguments that are smaller |
| 47 | // than 64 bits should be marked as extended, but structures that |
| 48 | // are smaller than 64 bits shouldn't. |
| 49 | CCIfType<[i32], CCIfExtend<CCPromoteToType<i64>>>, |
| 50 | |
| 51 | // Force long double values to the stack and pass i64 pointers to them. |
| 52 | CCIfType<[f128], CCPassIndirect<i64>>, |
| 53 | |
| 54 | // The first 5 integer arguments are passed in R2-R6. Note that R6 |
| 55 | // is call-saved. |
Richard Sandiford | 7789b08 | 2013-09-30 08:48:38 +0000 | [diff] [blame] | 56 | CCIfType<[i32], CCAssignToReg<[R2L, R3L, R4L, R5L, R6L]>>, |
Ulrich Weigand | 5f613df | 2013-05-06 16:15:19 +0000 | [diff] [blame] | 57 | CCIfType<[i64], CCAssignToReg<[R2D, R3D, R4D, R5D, R6D]>>, |
| 58 | |
| 59 | // The first 4 float and double arguments are passed in even registers F0-F6. |
| 60 | CCIfType<[f32], CCAssignToReg<[F0S, F2S, F4S, F6S]>>, |
| 61 | CCIfType<[f64], CCAssignToReg<[F0D, F2D, F4D, F6D]>>, |
| 62 | |
| 63 | // Other arguments are passed in 8-byte-aligned 8-byte stack slots. |
| 64 | CCIfType<[i32, i64, f32, f64], CCAssignToStack<8, 8>> |
| 65 | ]>; |
Richard Sandiford | 02bb0ec | 2014-07-10 11:44:37 +0000 | [diff] [blame] | 66 | |
| 67 | //===----------------------------------------------------------------------===// |
| 68 | // z/Linux callee-saved registers |
| 69 | //===----------------------------------------------------------------------===// |
| 70 | def CSR_SystemZ : CalleeSavedRegs<(add (sequence "R%dD", 6, 15), |
| 71 | (sequence "F%dD", 8, 15))>; |