blob: 0fdea9071c290dd90eede8b2fd4c30633e5615d5 [file] [log] [blame]
//===- 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