| 1 | //===-- ARMBaseInfo.cpp - ARM Base encoding information------------===// |
| 2 | // |
| 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 |
| 6 | // |
| 7 | //===----------------------------------------------------------------------===// |
| 8 | // |
| 9 | // This file provides basic encoding and assembly information for ARM. |
| 10 | // |
| 11 | //===----------------------------------------------------------------------===// |
| 12 | #include "ARMBaseInfo.h" |
| 13 | |
| 14 | using namespace llvm; |
| 15 | namespace llvm { |
| 16 | ARM::PredBlockMask expandPredBlockMask(ARM::PredBlockMask BlockMask, |
| 17 | ARMVCC::VPTCodes Kind) { |
| 18 | using PredBlockMask = ARM::PredBlockMask; |
| 19 | assert(Kind != ARMVCC::None && "Cannot expand a mask with None!" ); |
| 20 | assert(llvm::countr_zero((unsigned)BlockMask) != 0 && "Mask is already full" ); |
| 21 | |
| 22 | auto ChooseMask = [&](PredBlockMask AddedThen, PredBlockMask AddedElse) { |
| 23 | return Kind == ARMVCC::Then ? AddedThen : AddedElse; |
| 24 | }; |
| 25 | |
| 26 | switch (BlockMask) { |
| 27 | case PredBlockMask::T: |
| 28 | return ChooseMask(PredBlockMask::TT, PredBlockMask::TE); |
| 29 | case PredBlockMask::TT: |
| 30 | return ChooseMask(PredBlockMask::TTT, PredBlockMask::TTE); |
| 31 | case PredBlockMask::TE: |
| 32 | return ChooseMask(PredBlockMask::TET, PredBlockMask::TEE); |
| 33 | case PredBlockMask::TTT: |
| 34 | return ChooseMask(PredBlockMask::TTTT, PredBlockMask::TTTE); |
| 35 | case PredBlockMask::TTE: |
| 36 | return ChooseMask(PredBlockMask::TTET, PredBlockMask::TTEE); |
| 37 | case PredBlockMask::TET: |
| 38 | return ChooseMask(PredBlockMask::TETT, PredBlockMask::TETE); |
| 39 | case PredBlockMask::TEE: |
| 40 | return ChooseMask(PredBlockMask::TEET, PredBlockMask::TEEE); |
| 41 | default: |
| 42 | llvm_unreachable("Unknown Mask" ); |
| 43 | } |
| 44 | } |
| 45 | |
| 46 | namespace ARMSysReg { |
| 47 | |
| 48 | // lookup system register using 12-bit SYSm value. |
| 49 | // Note: the search is uniqued using M1 mask |
| 50 | const MClassSysReg *lookupMClassSysRegBy12bitSYSmValue(unsigned SYSm) { |
| 51 | return lookupMClassSysRegByM1Encoding12(M1Encoding12: SYSm); |
| 52 | } |
| 53 | |
| 54 | // returns APSR with _<bits> qualifier. |
| 55 | // Note: ARMv7-M deprecates using MSR APSR without a _<bits> qualifier |
| 56 | const MClassSysReg *lookupMClassSysRegAPSRNonDeprecated(unsigned SYSm) { |
| 57 | return lookupMClassSysRegByM2M3Encoding8(M2M3Encoding8: (1<<9)|(SYSm & 0xFF)); |
| 58 | } |
| 59 | |
| 60 | // lookup system registers using 8-bit SYSm value |
| 61 | const MClassSysReg *lookupMClassSysRegBy8bitSYSmValue(unsigned SYSm) { |
| 62 | return ARMSysReg::lookupMClassSysRegByM2M3Encoding8(M2M3Encoding8: (1<<8)|(SYSm & 0xFF)); |
| 63 | } |
| 64 | |
| 65 | #define GET_MClassSysRegsList_IMPL |
| 66 | #include "ARMGenSystemRegister.inc" |
| 67 | |
| 68 | } // end namespace ARMSysReg |
| 69 | |
| 70 | namespace ARMBankedReg { |
| 71 | #define GET_BankedRegsList_IMPL |
| 72 | #include "ARMGenSystemRegister.inc" |
| 73 | } // end namespce ARMSysReg |
| 74 | } // end namespace llvm |
| 75 | |