
SearchableTable is the legacy version that does not appear to be well documented. Not sure if the plan was to delete it eventually. The enum from SearchableTable does not appear to be used so I did not add a GenericEnum. MClassSysReg assigned EnumValueField 3 times, but rather than creating 3 enums, this overwrites the previous assignment. We can eventually use the PrimaryKey feature of GenericTable to remove one of the SearchIndex declarations. This will sort the generated table by the primary key and remove the separately generated indexing table to reduce .rodata size. This patch is just the mechanical migration. The size savings will be done in follow ups.
75 lines
2.6 KiB
C++
75 lines
2.6 KiB
C++
//===-- ARMBaseInfo.cpp - ARM Base encoding information------------===//
|
|
//
|
|
// 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
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This file provides basic encoding and assembly information for ARM.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#include "ARMBaseInfo.h"
|
|
|
|
using namespace llvm;
|
|
namespace llvm {
|
|
ARM::PredBlockMask expandPredBlockMask(ARM::PredBlockMask BlockMask,
|
|
ARMVCC::VPTCodes Kind) {
|
|
using PredBlockMask = ARM::PredBlockMask;
|
|
assert(Kind != ARMVCC::None && "Cannot expand a mask with None!");
|
|
assert(llvm::countr_zero((unsigned)BlockMask) != 0 && "Mask is already full");
|
|
|
|
auto ChooseMask = [&](PredBlockMask AddedThen, PredBlockMask AddedElse) {
|
|
return Kind == ARMVCC::Then ? AddedThen : AddedElse;
|
|
};
|
|
|
|
switch (BlockMask) {
|
|
case PredBlockMask::T:
|
|
return ChooseMask(PredBlockMask::TT, PredBlockMask::TE);
|
|
case PredBlockMask::TT:
|
|
return ChooseMask(PredBlockMask::TTT, PredBlockMask::TTE);
|
|
case PredBlockMask::TE:
|
|
return ChooseMask(PredBlockMask::TET, PredBlockMask::TEE);
|
|
case PredBlockMask::TTT:
|
|
return ChooseMask(PredBlockMask::TTTT, PredBlockMask::TTTE);
|
|
case PredBlockMask::TTE:
|
|
return ChooseMask(PredBlockMask::TTET, PredBlockMask::TTEE);
|
|
case PredBlockMask::TET:
|
|
return ChooseMask(PredBlockMask::TETT, PredBlockMask::TETE);
|
|
case PredBlockMask::TEE:
|
|
return ChooseMask(PredBlockMask::TEET, PredBlockMask::TEEE);
|
|
default:
|
|
llvm_unreachable("Unknown Mask");
|
|
}
|
|
}
|
|
|
|
namespace ARMSysReg {
|
|
|
|
// lookup system register using 12-bit SYSm value.
|
|
// Note: the search is uniqued using M1 mask
|
|
const MClassSysReg *lookupMClassSysRegBy12bitSYSmValue(unsigned SYSm) {
|
|
return lookupMClassSysRegByM1Encoding12(SYSm);
|
|
}
|
|
|
|
// returns APSR with _<bits> qualifier.
|
|
// Note: ARMv7-M deprecates using MSR APSR without a _<bits> qualifier
|
|
const MClassSysReg *lookupMClassSysRegAPSRNonDeprecated(unsigned SYSm) {
|
|
return lookupMClassSysRegByM2M3Encoding8((1<<9)|(SYSm & 0xFF));
|
|
}
|
|
|
|
// lookup system registers using 8-bit SYSm value
|
|
const MClassSysReg *lookupMClassSysRegBy8bitSYSmValue(unsigned SYSm) {
|
|
return ARMSysReg::lookupMClassSysRegByM2M3Encoding8((1<<8)|(SYSm & 0xFF));
|
|
}
|
|
|
|
#define GET_MClassSysRegsList_IMPL
|
|
#include "ARMGenSystemRegister.inc"
|
|
|
|
} // end namespace ARMSysReg
|
|
|
|
namespace ARMBankedReg {
|
|
#define GET_BankedRegsList_IMPL
|
|
#include "ARMGenSystemRegister.inc"
|
|
} // end namespce ARMSysReg
|
|
} // end namespace llvm
|