//===- X86GenRegisterBankInfo.def ----------------------------*- C++ -*-==// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// \file /// This file defines all the static objects used by X86RegisterBankInfo. /// \todo This should be generated by TableGen. //===----------------------------------------------------------------------===// #ifdef GET_TARGET_REGBANK_INFO_IMPL RegisterBankInfo::PartialMapping X86GenRegisterBankInfo::PartMappings[]{ /* StartIdx, Length, RegBank */ // GPR value {0, 8, X86::GPRRegBank}, // :0 {0, 16, X86::GPRRegBank}, // :1 {0, 32, X86::GPRRegBank}, // :2 {0, 64, X86::GPRRegBank}, // :3 // FR32/64 , xmm registers {0, 32, X86::VECRRegBank}, // :4 {0, 64, X86::VECRRegBank}, // :5 // VR128/256/512 {0, 128, X86::VECRRegBank}, // :6 {0, 256, X86::VECRRegBank}, // :7 {0, 512, X86::VECRRegBank}, // :8 }; #endif // GET_TARGET_REGBANK_INFO_IMPL #ifdef GET_TARGET_REGBANK_INFO_CLASS enum PartialMappingIdx { PMI_None = -1, PMI_GPR8, PMI_GPR16, PMI_GPR32, PMI_GPR64, PMI_FP32, PMI_FP64, PMI_VEC128, PMI_VEC256, PMI_VEC512 }; #endif // GET_TARGET_REGBANK_INFO_CLASS #ifdef GET_TARGET_REGBANK_INFO_IMPL #define INSTR_3OP(INFO) INFO, INFO, INFO, #define BREAKDOWN(INDEX, NUM) \ { &X86GenRegisterBankInfo::PartMappings[INDEX], NUM } // ValueMappings. RegisterBankInfo::ValueMapping X86GenRegisterBankInfo::ValMappings[]{ /* BreakDown, NumBreakDowns */ // 3-operands instructions (all binary operations should end up with one of // those mapping). INSTR_3OP(BREAKDOWN(PMI_GPR8, 1)) // 0: GPR_8 INSTR_3OP(BREAKDOWN(PMI_GPR16, 1)) // 3: GPR_16 INSTR_3OP(BREAKDOWN(PMI_GPR32, 1)) // 6: GPR_32 INSTR_3OP(BREAKDOWN(PMI_GPR64, 1)) // 9: GPR_64 INSTR_3OP(BREAKDOWN(PMI_FP32, 1)) // 12: Fp32 INSTR_3OP(BREAKDOWN(PMI_FP64, 1)) // 15: Fp64 INSTR_3OP(BREAKDOWN(PMI_VEC128, 1)) // 18: Vec128 INSTR_3OP(BREAKDOWN(PMI_VEC256, 1)) // 21: Vec256 INSTR_3OP(BREAKDOWN(PMI_VEC512, 1)) // 24: Vec512 }; #undef INSTR_3OP #undef BREAKDOWN #endif // GET_TARGET_REGBANK_INFO_IMPL #ifdef GET_TARGET_REGBANK_INFO_CLASS enum ValueMappingIdx { VMI_None = -1, VMI_3OpsGpr8Idx = PMI_GPR8 * 3, VMI_3OpsGpr16Idx = PMI_GPR16 * 3, VMI_3OpsGpr32Idx = PMI_GPR32 * 3, VMI_3OpsGpr64Idx = PMI_GPR64 * 3, VMI_3OpsFp32Idx = PMI_FP32 * 3, VMI_3OpsFp64Idx = PMI_FP64 * 3, VMI_3OpsVec128Idx = PMI_VEC128 * 3, VMI_3OpsVec256Idx = PMI_VEC256 * 3, VMI_3OpsVec512Idx = PMI_VEC512 * 3, }; #undef GET_TARGET_REGBANK_INFO_CLASS #endif // GET_TARGET_REGBANK_INFO_CLASS #ifdef GET_TARGET_REGBANK_INFO_IMPL #undef GET_TARGET_REGBANK_INFO_IMPL const RegisterBankInfo::ValueMapping * X86GenRegisterBankInfo::getValueMapping(PartialMappingIdx Idx, unsigned NumOperands) { // We can use VMI_3Ops Mapping for all the cases. if (NumOperands <= 3 && (Idx >= PMI_GPR8 && Idx <= PMI_VEC512)) return &ValMappings[(unsigned)Idx * 3]; llvm_unreachable("Unsupported PartialMappingIdx."); } #endif // GET_TARGET_REGBANK_INFO_IMPL