xref: /freebsd-src/contrib/llvm-project/llvm/lib/Target/X86/X86GenRegisterBankInfo.def (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
10b57cec5SDimitry Andric//===- X86GenRegisterBankInfo.def ----------------------------*- C++ -*-==//
20b57cec5SDimitry Andric//
30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric//
70b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric/// \file
90b57cec5SDimitry Andric/// This file defines all the static objects used by X86RegisterBankInfo.
100b57cec5SDimitry Andric/// \todo This should be generated by TableGen.
110b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric#ifdef GET_TARGET_REGBANK_INFO_IMPL
140b57cec5SDimitry AndricRegisterBankInfo::PartialMapping X86GenRegisterBankInfo::PartMappings[]{
150b57cec5SDimitry Andric    /* StartIdx, Length, RegBank */
160b57cec5SDimitry Andric    // GPR value
170b57cec5SDimitry Andric    {0, 8, X86::GPRRegBank},   // :0
180b57cec5SDimitry Andric    {0, 16, X86::GPRRegBank},  // :1
190b57cec5SDimitry Andric    {0, 32, X86::GPRRegBank},  // :2
200b57cec5SDimitry Andric    {0, 64, X86::GPRRegBank},  // :3
210b57cec5SDimitry Andric    // FR32/64 , xmm registers
220b57cec5SDimitry Andric    {0, 32, X86::VECRRegBank},  // :4
230b57cec5SDimitry Andric    {0, 64, X86::VECRRegBank},  // :5
240b57cec5SDimitry Andric    // VR128/256/512
250b57cec5SDimitry Andric    {0, 128, X86::VECRRegBank}, // :6
260b57cec5SDimitry Andric    {0, 256, X86::VECRRegBank}, // :7
270b57cec5SDimitry Andric    {0, 512, X86::VECRRegBank}, // :8
28*0fca6ea1SDimitry Andric    // RFP32/64/80
29*0fca6ea1SDimitry Andric    {0, 32, X86::PSRRegBank},   // :9
30*0fca6ea1SDimitry Andric    {0, 64, X86::PSRRegBank},   // :10
31*0fca6ea1SDimitry Andric    {0, 80, X86::PSRRegBank},   // :11
320b57cec5SDimitry Andric};
330b57cec5SDimitry Andric#endif // GET_TARGET_REGBANK_INFO_IMPL
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric#ifdef GET_TARGET_REGBANK_INFO_CLASS
360b57cec5SDimitry Andricenum PartialMappingIdx {
370b57cec5SDimitry Andric  PMI_None = -1,
380b57cec5SDimitry Andric  PMI_GPR8,
390b57cec5SDimitry Andric  PMI_GPR16,
400b57cec5SDimitry Andric  PMI_GPR32,
410b57cec5SDimitry Andric  PMI_GPR64,
420b57cec5SDimitry Andric  PMI_FP32,
430b57cec5SDimitry Andric  PMI_FP64,
440b57cec5SDimitry Andric  PMI_VEC128,
450b57cec5SDimitry Andric  PMI_VEC256,
46*0fca6ea1SDimitry Andric  PMI_VEC512,
47*0fca6ea1SDimitry Andric  PMI_PSR32,
48*0fca6ea1SDimitry Andric  PMI_PSR64,
49*0fca6ea1SDimitry Andric  PMI_PSR80
500b57cec5SDimitry Andric};
510b57cec5SDimitry Andric#endif // GET_TARGET_REGBANK_INFO_CLASS
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric#ifdef GET_TARGET_REGBANK_INFO_IMPL
540b57cec5SDimitry Andric#define INSTR_3OP(INFO) INFO, INFO, INFO,
550b57cec5SDimitry Andric#define BREAKDOWN(INDEX, NUM)                                                  \
560b57cec5SDimitry Andric  { &X86GenRegisterBankInfo::PartMappings[INDEX], NUM }
570b57cec5SDimitry Andric// ValueMappings.
580b57cec5SDimitry AndricRegisterBankInfo::ValueMapping X86GenRegisterBankInfo::ValMappings[]{
590b57cec5SDimitry Andric    /* BreakDown, NumBreakDowns */
600b57cec5SDimitry Andric    // 3-operands instructions (all binary operations should end up with one of
610b57cec5SDimitry Andric    // those mapping).
620b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_GPR8, 1))  // 0: GPR_8
630b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_GPR16, 1)) // 3: GPR_16
640b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_GPR32, 1)) // 6: GPR_32
650b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_GPR64, 1)) // 9: GPR_64
660b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_FP32, 1))   // 12: Fp32
670b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_FP64, 1))   // 15: Fp64
680b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_VEC128, 1)) // 18: Vec128
690b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_VEC256, 1)) // 21: Vec256
700b57cec5SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_VEC512, 1)) // 24: Vec512
71*0fca6ea1SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_PSR32, 1))  // 25: Rfp32
72*0fca6ea1SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_PSR64, 1))  // 26: Rfp64
73*0fca6ea1SDimitry Andric    INSTR_3OP(BREAKDOWN(PMI_PSR80, 1))  // 27: Rfp80
740b57cec5SDimitry Andric};
750b57cec5SDimitry Andric#undef INSTR_3OP
760b57cec5SDimitry Andric#undef BREAKDOWN
770b57cec5SDimitry Andric#endif // GET_TARGET_REGBANK_INFO_IMPL
780b57cec5SDimitry Andric
790b57cec5SDimitry Andric#ifdef GET_TARGET_REGBANK_INFO_CLASS
800b57cec5SDimitry Andricenum ValueMappingIdx {
810b57cec5SDimitry Andric  VMI_None = -1,
820b57cec5SDimitry Andric  VMI_3OpsGpr8Idx =  PMI_GPR8  * 3,
830b57cec5SDimitry Andric  VMI_3OpsGpr16Idx = PMI_GPR16 * 3,
840b57cec5SDimitry Andric  VMI_3OpsGpr32Idx = PMI_GPR32 * 3,
850b57cec5SDimitry Andric  VMI_3OpsGpr64Idx = PMI_GPR64 * 3,
860b57cec5SDimitry Andric  VMI_3OpsFp32Idx = PMI_FP32 * 3,
870b57cec5SDimitry Andric  VMI_3OpsFp64Idx = PMI_FP64 * 3,
880b57cec5SDimitry Andric  VMI_3OpsVec128Idx = PMI_VEC128 * 3,
890b57cec5SDimitry Andric  VMI_3OpsVec256Idx = PMI_VEC256 * 3,
900b57cec5SDimitry Andric  VMI_3OpsVec512Idx = PMI_VEC512 * 3,
91*0fca6ea1SDimitry Andric  VMI_3OpsPs32Idx = PMI_PSR32 * 3,
92*0fca6ea1SDimitry Andric  VMI_3OpsPs64Idx = PMI_PSR64 * 3,
93*0fca6ea1SDimitry Andric  VMI_3OpsPs80Idx = PMI_PSR80 * 3,
940b57cec5SDimitry Andric};
950b57cec5SDimitry Andric#undef GET_TARGET_REGBANK_INFO_CLASS
960b57cec5SDimitry Andric#endif // GET_TARGET_REGBANK_INFO_CLASS
970b57cec5SDimitry Andric
980b57cec5SDimitry Andric#ifdef GET_TARGET_REGBANK_INFO_IMPL
990b57cec5SDimitry Andric#undef GET_TARGET_REGBANK_INFO_IMPL
1000b57cec5SDimitry Andricconst RegisterBankInfo::ValueMapping *
1010b57cec5SDimitry AndricX86GenRegisterBankInfo::getValueMapping(PartialMappingIdx Idx,
1020b57cec5SDimitry Andric                                        unsigned NumOperands) {
1030b57cec5SDimitry Andric
1040b57cec5SDimitry Andric  // We can use VMI_3Ops Mapping for all the cases.
105*0fca6ea1SDimitry Andric  if (NumOperands <= 3 && (Idx >= PMI_GPR8 && Idx <= PMI_PSR80))
1060b57cec5SDimitry Andric    return &ValMappings[(unsigned)Idx * 3];
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andric  llvm_unreachable("Unsupported PartialMappingIdx.");
1090b57cec5SDimitry Andric}
1100b57cec5SDimitry Andric
1110b57cec5SDimitry Andric#endif // GET_TARGET_REGBANK_INFO_IMPL
1120b57cec5SDimitry Andric
113