1 //===- PPCGenRegisterBankInfo.def
-------------------------------*- C
++ -*-==//
3 // Part of the LLVM Project
, under the Apache License v2.0 with LLVM Exceptions.
4 // See https
://llvm.org
/LICENSE.txt for license information.
5 // SPDX
-License
-Identifier
: Apache
-2.0 WITH LLVM
-exception
7 //===----------------------------------------------------------------------===//
9 /// This file defines all the static objects used by PPCRegisterBankInfo.
10 /// \todo This should be generated by TableGen
, because the logic here can be
11 /// derived from register bank definition. Not yet implemented.
12 //===----------------------------------------------------------------------===//
15 const RegisterBankInfo
::PartialMapping PPCGenRegisterBankInfo
::PartMappings
[]{
16 /* StartIdx
, Length
, RegBank
*/
17 // 0: GPR
32-bit value.
18 {0, 32, PPC
::GPRRegBank
},
19 // 1: GPR
64-bit value.
20 {0, 64, PPC
::GPRRegBank
},
21 // 2: FPR
32-bit value
22 {0, 32, PPC
::FPRRegBank
},
23 // 3: FPR
64-bit value
24 {0, 64, PPC
::FPRRegBank
},
25 // 4: 128-bit
vector (VSX
, Altivec
)
26 {0, 128, PPC
::VECRegBank
},
28 {0, 4, PPC
::CRRegBank
},
32 // Pointers to the entries in this array are returned by
getValueMapping() and
35 // The array has the following structure
:
36 // - At index
0 is the invalid entry.
37 // - After that
, the mappings for the register types from PartialMappingIdx
38 // follow. Each mapping consists of
3 entries
, which is needed to cover
39 // 3-operands instructions.
40 // - Last
, mappings for cross
-register bank moves follow. Since COPY has only
41 // 2 operands
, a mapping consists of
2 entries.
42 const RegisterBankInfo
::ValueMapping PPCGenRegisterBankInfo
::ValMappings
[]{
43 /* BreakDown
, NumBreakDowns
*/
46 // 1: GPR
32-bit value.
47 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR32
- PMI_Min
], 1},
48 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR32
- PMI_Min
], 1},
49 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR32
- PMI_Min
], 1},
50 // 4: GPR
64-bit value.
51 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR64
- PMI_Min
], 1},
52 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR64
- PMI_Min
], 1},
53 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_GPR64
- PMI_Min
], 1},
54 // 7: FPR
32-bit value.
55 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR32
- PMI_Min
], 1},
56 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR32
- PMI_Min
], 1},
57 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR32
- PMI_Min
], 1},
58 // 10: FPR
64-bit value.
59 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR64
- PMI_Min
], 1},
60 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR64
- PMI_Min
], 1},
61 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_FPR64
- PMI_Min
], 1},
62 // 13: 128-bit vector.
63 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_VEC128
- PMI_Min
], 1},
64 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_VEC128
- PMI_Min
], 1},
65 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_VEC128
- PMI_Min
], 1},
66 // 16: CR
4-bit value.
67 {&PPCGenRegisterBankInfo
::PartMappings
[PMI_CR
- PMI_Min
], 1},
71 const RegisterBankInfo
::ValueMapping
*
72 PPCGenRegisterBankInfo
::getValueMapping(PartialMappingIdx RBIdx
) {
73 assert(RBIdx
!= PartialMappingIdx
::PMI_None
&& "No mapping needed for that");
75 unsigned ValMappingIdx
= RBIdx
- PMI_Min
;
77 return
&ValMappings
[1 + 3 * ValMappingIdx
];
80 const PPCGenRegisterBankInfo
::PartialMappingIdx
81 PPCGenRegisterBankInfo
::BankIDToCopyMapIdx
[]{
89 const RegisterBankInfo
::ValueMapping
*
90 PPCGenRegisterBankInfo
::getCopyMapping(unsigned DstBankID
, unsigned SrcBankID
,
92 assert(DstBankID
< PPC
::NumRegisterBanks
&& "Invalid bank ID");
93 assert(SrcBankID
< PPC
::NumRegisterBanks
&& "Invalid bank ID");
94 PartialMappingIdx DstRBIdx
= BankIDToCopyMapIdx
[DstBankID
];
95 PartialMappingIdx SrcRBIdx
= BankIDToCopyMapIdx
[SrcBankID
];
96 assert(DstRBIdx
!= PMI_None
&& "No such mapping");
97 assert(SrcRBIdx
!= PMI_None
&& "No such mapping");
99 if (DstRBIdx
== SrcRBIdx
)
100 return
getValueMapping(DstRBIdx
);
102 assert(Size
<= 128 && "Can currently handle types up to 128 bits (vectors)!");
103 // TODO
: This function needs to be updated to handle all cases for
104 // GPRs
, FPRs and vectors. It currently only handles bitcasting to
105 // the same type and has only mainly been tested for bitcasting
106 // between different vector types.
107 unsigned ValMappingIdx
= DstRBIdx
- PMI_Min
;
109 return
&ValMappings
[1 + 3 * ValMappingIdx
];