WebAssemblyRegisterInfo.cpp revision 286684
1233294Sstas//===-- WebAssemblyRegisterInfo.cpp - WebAssembly Register Information ----===//
272445Sassar//
3233294Sstas//                     The LLVM Compiler Infrastructure
455682Smarkm//
555682Smarkm// This file is distributed under the University of Illinois Open Source
655682Smarkm// License. See LICENSE.TXT for details.
7234027Sstas//
855682Smarkm//===----------------------------------------------------------------------===//
9233294Sstas///
10233294Sstas/// \file
1155682Smarkm/// \brief This file contains the WebAssembly implementation of the
1255682Smarkm/// TargetRegisterInfo class.
1355682Smarkm///
1455682Smarkm//===----------------------------------------------------------------------===//
1555682Smarkm
1655682Smarkm#include "WebAssemblyRegisterInfo.h"
1755682Smarkm#include "MCTargetDesc/WebAssemblyMCTargetDesc.h"
1855682Smarkm#include "WebAssemblyFrameLowering.h"
1955682Smarkm#include "WebAssemblyInstrInfo.h"
2055682Smarkm#include "WebAssemblyMachineFunctionInfo.h"
2155682Smarkm#include "WebAssemblySubtarget.h"
2255682Smarkm#include "llvm/CodeGen/MachineFrameInfo.h"
2355682Smarkm#include "llvm/CodeGen/MachineInstrBuilder.h"
2455682Smarkm#include "llvm/CodeGen/MachineRegisterInfo.h"
2555682Smarkm#include "llvm/IR/Function.h"
2655682Smarkm#include "llvm/Support/raw_ostream.h"
2755682Smarkm#include "llvm/Target/TargetFrameLowering.h"
2855682Smarkm#include "llvm/Target/TargetOptions.h"
2955682Smarkmusing namespace llvm;
3055682Smarkm
3155682Smarkm#define DEBUG_TYPE "wasm-reg-info"
3255682Smarkm
3355682Smarkm#define GET_REGINFO_TARGET_DESC
3455682Smarkm#include "WebAssemblyGenRegisterInfo.inc"
3555682Smarkm
3655682SmarkmWebAssemblyRegisterInfo::WebAssemblyRegisterInfo(const Triple &TT)
3755682Smarkm    : WebAssemblyGenRegisterInfo(0), TT(TT) {}
3855682Smarkm
3955682Smarkmconst MCPhysReg *
4055682SmarkmWebAssemblyRegisterInfo::getCalleeSavedRegs(const MachineFunction *) const {
4155682Smarkm  static const MCPhysReg CalleeSavedRegs[] = {0};
4255682Smarkm  return CalleeSavedRegs;
4355682Smarkm}
4455682Smarkm
4555682SmarkmBitVector
4655682SmarkmWebAssemblyRegisterInfo::getReservedRegs(const MachineFunction &MF) const {
4755682Smarkm  BitVector Reserved(getNumRegs());
4855682Smarkm  for (auto Reg : {WebAssembly::SP32, WebAssembly::SP64, WebAssembly::FP32,
4955682Smarkm                   WebAssembly::FP64})
5055682Smarkm    Reserved.set(Reg);
5155682Smarkm  return Reserved;
5255682Smarkm}
5355682Smarkm
5455682Smarkmvoid WebAssemblyRegisterInfo::eliminateFrameIndex(
5555682Smarkm    MachineBasicBlock::iterator II, int SPAdj, unsigned FIOperandNum,
5655682Smarkm    RegScavenger *RS) const {
57234027Sstas  llvm_unreachable("WebAssemblyRegisterInfo::eliminateFrameIndex"); // FIXME
5855682Smarkm}
5955682Smarkm
6055682Smarkmunsigned
6155682SmarkmWebAssemblyRegisterInfo::getFrameRegister(const MachineFunction &MF) const {
6255682Smarkm  static const unsigned Regs[2][2] = {
6355682Smarkm      /*            !isArch64Bit       isArch64Bit      */
6455682Smarkm      /* !hasFP */ {WebAssembly::SP32, WebAssembly::SP64},
6555682Smarkm      /*  hasFP */ {WebAssembly::FP32, WebAssembly::FP64}};
6655682Smarkm  const WebAssemblyFrameLowering *TFI = getFrameLowering(MF);
6755682Smarkm  return Regs[TFI->hasFP(MF)][TT.isArch64Bit()];
6855682Smarkm}
6955682Smarkm
7055682Smarkmbool WebAssemblyRegisterInfo::canRealignStack(const MachineFunction &MF) const {
7155682Smarkm  return !MF.getFunction()->hasFnAttribute("no-realign-stack");
7255682Smarkm}
7355682Smarkm
7455682Smarkm// FIXME: share this with other backends with identical implementation?
7555682Smarkmbool WebAssemblyRegisterInfo::needsStackRealignment(
7655682Smarkm    const MachineFunction &MF) const {
7755682Smarkm  const MachineFrameInfo *MFI = MF.getFrameInfo();
7855682Smarkm  const WebAssemblyFrameLowering *TFI = getFrameLowering(MF);
7955682Smarkm  const Function *F = MF.getFunction();
8055682Smarkm  unsigned StackAlign = TFI->getStackAlignment();
8155682Smarkm  bool requiresRealignment =
8255682Smarkm      ((MFI->getMaxAlignment() > StackAlign) ||
8355682Smarkm       F->getAttributes().hasAttribute(AttributeSet::FunctionIndex,
8455682Smarkm                                       Attribute::StackAlignment));
8555682Smarkm
8655682Smarkm  return requiresRealignment && canRealignStack(MF);
8755682Smarkm}
8855682Smarkm