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