ADDS{D|S}rr_Int and MULS{D|S}rr_Int are not commutable. The users of these intrinsics...
[oota-llvm.git] / lib / Target / Mips / MipsCallingConv.td
1 //===- MipsCallingConv.td - Calling Conventions for Mips --------*- C++ -*-===//
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 Mips architecture.
10 //===----------------------------------------------------------------------===//
11
12 /// CCIfSubtarget - Match if the current subtarget has a feature F.
13 class CCIfSubtarget<string F, CCAction A>: 
14   CCIf<!strconcat("State.getTarget().getSubtarget<MipsSubtarget>().", F), A>;
15
16 //===----------------------------------------------------------------------===//
17 // Mips O32 Calling Convention
18 //===----------------------------------------------------------------------===//
19 def CC_MipsO32 : CallingConv<[
20   // Promote i8/i16 arguments to i32.
21   CCIfType<[i8, i16], CCPromoteToType<i32>>,
22
23   // The first 4 integer arguments are passed in integer registers.
24   CCIfType<[i32], CCAssignToReg<[A0, A1, A2, A3]>>,
25
26   // Integer values get stored in stack slots that are 4 bytes in
27   // size and 4-byte aligned.
28   CCIfType<[i32], CCAssignToStack<4, 4>>
29 ]>;
30
31 def RetCC_MipsO32 : CallingConv<[
32   // i32 are returned in registers V0, V1
33   CCIfType<[i32], CCAssignToReg<[V0, V1]>>,
34
35   // f32 are returned in registers F0, F1
36   CCIfType<[f32], CCAssignToReg<[F0, F1]>>,
37
38   // f64 are returned in register D0
39   CCIfType<[f64], CCIfSubtarget<"isNotSingleFloat()", CCAssignToReg<[D0]>>>
40 ]>;
41
42 //===----------------------------------------------------------------------===//
43 // Mips EABI Calling Convention
44 //===----------------------------------------------------------------------===//
45 def CC_MipsEABI : CallingConv<[
46   // Promote i8/i16 arguments to i32.
47   CCIfType<[i8, i16], CCPromoteToType<i32>>,
48
49   // Integer arguments are passed in integer registers.
50   CCIfType<[i32], CCAssignToReg<[A0, A1, A2, A3, T0, T1, T2, T3]>>,
51
52   // Single fp arguments are passed in pairs within 32-bit mode 
53   CCIfType<[f32], CCIfSubtarget<"isSingleFloat()", 
54                   CCAssignToReg<[F12, F13, F14, F15, F16, F17, F18, F19]>>>,
55
56   CCIfType<[f32], CCIfSubtarget<"isNotSingleFloat()", 
57                   CCAssignToReg<[F12, F14, F16, F18]>>>,
58
59   // The first 4 doubl fp arguments are passed in single fp registers.
60   CCIfType<[f64], CCIfSubtarget<"isNotSingleFloat()", 
61                   CCAssignToReg<[D6, D7, D8, D9]>>>,
62
63   // Integer values get stored in stack slots that are 4 bytes in
64   // size and 4-byte aligned.
65   CCIfType<[i32, f32], CCAssignToStack<4, 4>>,
66
67   // Integer values get stored in stack slots that are 8 bytes in
68   // size and 8-byte aligned.
69   CCIfType<[f64], CCIfSubtarget<"isNotSingleFloat()", CCAssignToStack<8, 8>>>
70 ]>;
71
72 def RetCC_MipsEABI : CallingConv<[
73   // i32 are returned in registers V0, V1
74   CCIfType<[i32], CCAssignToReg<[V0, V1]>>,
75
76   // f32 are returned in registers F0, F1
77   CCIfType<[f32], CCAssignToReg<[F0, F1]>>,
78
79   // f64 are returned in register D0
80   CCIfType<[f64], CCIfSubtarget<"isNotSingleFloat()", CCAssignToReg<[D0]>>>
81 ]>;
82
83 //===----------------------------------------------------------------------===//
84 // Mips Calling Convention Dispatch
85 //===----------------------------------------------------------------------===//
86
87 def CC_Mips : CallingConv<[
88   CCIfSubtarget<"isABI_EABI()", CCDelegateTo<CC_MipsEABI>>,
89   CCDelegateTo<CC_MipsO32>
90 ]>;
91
92 def RetCC_Mips : CallingConv<[
93   CCIfSubtarget<"isABI_EABI()", CCDelegateTo<RetCC_MipsEABI>>,
94   CCDelegateTo<RetCC_MipsO32>
95 ]>;