146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//=== MC/MCRegisterInfo.cpp - Target Register Description -------*- C++ -*-===//
246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//
346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//                     The LLVM Compiler Infrastructure
446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//
546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen// This file is distributed under the University of Illinois Open Source
646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen// License. See LICENSE.TXT for details.
746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//
846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
946c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//
1046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen// This file implements MCRegisterInfo functions.
1146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//
1246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen//===----------------------------------------------------------------------===//
1346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
1446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen#include "llvm/MC/MCRegisterInfo.h"
1546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
1646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenusing namespace llvm;
1746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
1846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenunsigned MCRegisterInfo::getMatchingSuperReg(unsigned Reg, unsigned SubIdx,
1946c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen                                             const MCRegisterClass *RC) const {
2046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  for (MCSuperRegIterator Supers(Reg, this); Supers.isValid(); ++Supers)
2146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen    if (RC->contains(*Supers) && Reg == getSubReg(*Supers, SubIdx))
2246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen      return *Supers;
2346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return 0;
2446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
2546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
2646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenunsigned MCRegisterInfo::getSubReg(unsigned Reg, unsigned Idx) const {
2759f45e4610e64b88bcee4cd46816ef64e815ff7eJakob Stoklund Olesen  assert(Idx && Idx < getNumSubRegIndices() &&
2859f45e4610e64b88bcee4cd46816ef64e815ff7eJakob Stoklund Olesen         "This is not a subregister index");
2946c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  // Get a pointer to the corresponding SubRegIndices list. This list has the
3046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  // name of each sub-register in the same order as MCSubRegIterator.
3146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
3246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
3346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen    if (*SRI == Idx)
3446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen      return *Subs;
3546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return 0;
3646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
3746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
3846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenunsigned MCRegisterInfo::getSubRegIndex(unsigned Reg, unsigned SubReg) const {
3959f45e4610e64b88bcee4cd46816ef64e815ff7eJakob Stoklund Olesen  assert(SubReg && SubReg < getNumRegs() && "This is not a register");
4046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  // Get a pointer to the corresponding SubRegIndices list. This list has the
4146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  // name of each sub-register in the same order as MCSubRegIterator.
4246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const uint16_t *SRI = SubRegIndices + get(Reg).SubRegIndices;
4346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  for (MCSubRegIterator Subs(Reg, this); Subs.isValid(); ++Subs, ++SRI)
4446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen    if (*Subs == SubReg)
4546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen      return *SRI;
4646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return 0;
4746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
4846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
4923ed37a6b76e79272194fb46597f7280661b828fAhmed Bougachaunsigned MCRegisterInfo::getSubRegIdxSize(unsigned Idx) const {
50bed23081860275c79137f65d592920e7991b8198Ahmed Bougacha  assert(Idx && Idx < getNumSubRegIndices() &&
51bed23081860275c79137f65d592920e7991b8198Ahmed Bougacha         "This is not a subregister index");
5223ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha  return SubRegIdxRanges[Idx].Size;
5323ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha}
5423ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha
5523ed37a6b76e79272194fb46597f7280661b828fAhmed Bougachaunsigned MCRegisterInfo::getSubRegIdxOffset(unsigned Idx) const {
5623ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha  assert(Idx && Idx < getNumSubRegIndices() &&
5723ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha         "This is not a subregister index");
5823ed37a6b76e79272194fb46597f7280661b828fAhmed Bougacha  return SubRegIdxRanges[Idx].Offset;
59bed23081860275c79137f65d592920e7991b8198Ahmed Bougacha}
60bed23081860275c79137f65d592920e7991b8198Ahmed Bougacha
6146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenint MCRegisterInfo::getDwarfRegNum(unsigned RegNum, bool isEH) const {
6246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const DwarfLLVMRegPair *M = isEH ? EHL2DwarfRegs : L2DwarfRegs;
6346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  unsigned Size = isEH ? EHL2DwarfRegsSize : L2DwarfRegsSize;
6446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
6546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  DwarfLLVMRegPair Key = { RegNum, 0 };
6646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
6746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  if (I == M+Size || I->FromReg != RegNum)
6846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen    return -1;
6946c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return I->ToReg;
7046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
7146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
7246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenint MCRegisterInfo::getLLVMRegNum(unsigned RegNum, bool isEH) const {
7346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const DwarfLLVMRegPair *M = isEH ? EHDwarf2LRegs : Dwarf2LRegs;
7446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  unsigned Size = isEH ? EHDwarf2LRegsSize : Dwarf2LRegsSize;
7546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
7646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  DwarfLLVMRegPair Key = { RegNum, 0 };
7746c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const DwarfLLVMRegPair *I = std::lower_bound(M, M+Size, Key);
7846c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  assert(I != M+Size && I->FromReg == RegNum && "Invalid RegNum");
7946c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return I->ToReg;
8046c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
8146c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen
8246c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesenint MCRegisterInfo::getSEHRegNum(unsigned RegNum) const {
8346c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  const DenseMap<unsigned, int>::const_iterator I = L2SEHRegs.find(RegNum);
8446c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  if (I == L2SEHRegs.end()) return (int)RegNum;
8546c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen  return I->second;
8646c0dc7858da65707340ca62b258f8956def78e8Jakob Stoklund Olesen}
87