SparcRegisterInfo.cpp revision a98e0514175868cc4c6b5c31d02f36de8b973c8d
176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman//===- SparcV8RegisterInfo.cpp - SparcV8 Register Information ---*- C++ -*-===// 276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// 376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// The LLVM Compiler Infrastructure 476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// 54dc8a2aec63e4fb5ee2688544c4de323ed5de3efWichert Akkerman// This file was developed by the LLVM research group and is distributed under 676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// the University of Illinois Open Source License. See LICENSE.TXT for details. 776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// 876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman//===----------------------------------------------------------------------===// 976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// 1076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// This file contains the SparcV8 implementation of the MRegisterInfo class. 1176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman// 1276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman//===----------------------------------------------------------------------===// 1376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman 1476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "SparcV8.h" 1576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "SparcV8RegisterInfo.h" 1676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "llvm/CodeGen/MachineInstrBuilder.h" 1776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "llvm/CodeGen/MachineFunction.h" 1876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "llvm/Type.h" 1976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman#include "Support/STLExtras.h" 2076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanusing namespace llvm; 2176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman 2276baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert AkkermanSparcV8RegisterInfo::SparcV8RegisterInfo() 2376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman : SparcV8GenRegisterInfo(V8::ADJCALLSTACKDOWN, 2476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman V8::ADJCALLSTACKUP) {} 2576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman 2676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint SparcV8RegisterInfo::storeRegToStackSlot( 2776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman MachineBasicBlock &MBB, 2876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman MachineBasicBlock::iterator MBBI, 2976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman unsigned SrcReg, int FrameIdx, 3076baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman const TargetRegisterClass *RC) const 3176baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman{ 323454e4b463e6c22c7ea8c5461ef5a077f4650a54Denys Vlasenko abort(); 3376baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman return -1; 3476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman} 3576baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman 3676baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkermanint SparcV8RegisterInfo::loadRegFromStackSlot( 3776baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman MachineBasicBlock &MBB, 3876baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman MachineBasicBlock::iterator MBBI, 3976baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman unsigned DestReg, int FrameIdx, 4070b08530b80a6ee6591c38cf397fe0eeba1b4d7aRoland McGrath const TargetRegisterClass *RC) const 41f7db5dd876eb41a3f0d5fd223c831734acc8d8d1Denys Vlasenko{ 428470374cba7df0e70653d95c4f336a4082c68d82Denys Vlasenko abort(); 437b3346be42d6a1f539e95d385ee498f8b3c529f8Wichert Akkerman return -1; 447b3346be42d6a1f539e95d385ee498f8b3c529f8Wichert Akkerman} 45a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 4696d5a76109b4f1d1f4c9c76641e6ec896108083dDenys Vlasenkoint SparcV8RegisterInfo::copyRegToReg(MachineBasicBlock &MBB, 47418d66a847bda4867c59e604c0d07c64ed53e320Denys Vlasenko MachineBasicBlock::iterator MBBI, 48418d66a847bda4867c59e604c0d07c64ed53e320Denys Vlasenko unsigned DestReg, unsigned SrcReg, 4996d5a76109b4f1d1f4c9c76641e6ec896108083dDenys Vlasenko const TargetRegisterClass *RC) const { 50a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko abort(); 51a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko return -1; 52a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko} 53a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 54a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenkovoid SparcV8RegisterInfo:: 55a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys VlasenkoeliminateCallFramePseudoInstr(MachineFunction &MF, MachineBasicBlock &MBB, 56a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko MachineBasicBlock::iterator I) const { 57a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko abort(); 58a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko} 59a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 60a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenkovoid 61a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys VlasenkoSparcV8RegisterInfo::eliminateFrameIndex(MachineFunction &MF, 62a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko MachineBasicBlock::iterator II) const { 63a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko abort(); 64a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko} 65a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 66f44cce48bbbd573cc5ae801f69f857433160b03aDenys Vlasenkovoid SparcV8RegisterInfo:: 67a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys VlasenkoprocessFunctionBeforeFrameFinalized(MachineFunction &MF) const {} 68a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 69a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenkovoid SparcV8RegisterInfo::emitPrologue(MachineFunction &MF) const { 70a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko MachineBasicBlock &MBB = MF.front(); 713454e4b463e6c22c7ea8c5461ef5a077f4650a54Denys Vlasenko 7275422766d51cf96ea081977c9d0b26b2ba1a8adeDenys Vlasenko // Eventually this should emit the correct save instruction based on the 73a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko // number of bytes in the frame. For now we just hardcode it. 74a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko BuildMI(MBB, MBB.begin(), V8::SAVEi, 2, V8::SP).addImm(-122).addReg(V8::SP); 75a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko} 76a50d2a87a1a8df4471bbd93f2ce9ef0541b1124bDenys Vlasenko 77b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenkovoid SparcV8RegisterInfo::emitEpilogue(MachineFunction &MF, 78b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko MachineBasicBlock &MBB) const { 79b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko MachineBasicBlock::iterator MBBI = prior(MBB.end()); 80b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko assert(MBBI->getOpcode() == V8::JMPLi && 81b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko "Can only put epilog before return instruction!"); 82b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko BuildMI(MBB, MBBI, V8::RESTOREi, 2, V8::O0).addImm(0).addReg(V8::L7); 83b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko} 84b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko 85b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko 86b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko#include "SparcV8GenRegisterInfo.inc" 87b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko 88b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenkoconst TargetRegisterClass* 89b51581e8f0b11d8f1cce055cebb287f728a508a3Denys VlasenkoSparcV8RegisterInfo::getRegClassForType(const Type* Ty) const { 90b51581e8f0b11d8f1cce055cebb287f728a508a3Denys Vlasenko switch (Ty->getPrimitiveID()) { 91ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::FloatTyID: return &FPRegsInstance; 92ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::DoubleTyID: return &DFPRegsInstance; 93ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::LongTyID: 94ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::ULongTyID: assert(0 && "Long values can't fit in registers!"); 95ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko default: assert(0 && "Invalid type to getClass!"); 96ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::BoolTyID: 97ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::SByteTyID: 98ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::UByteTyID: 99ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::ShortTyID: 100ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::UShortTyID: 101ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::IntTyID: 102ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::UIntTyID: 103ecfe2f19f963b5c2f176c5e70d42654d7429ce3eDenys Vlasenko case Type::PointerTyID: return &IntRegsInstance; 10476baf7c9f6dd61a15524ad43c1b690c252cf5b7Wichert Akkerman } 10531fa8a22b17b2f898513b68e04269597147d2478Denys Vlasenko} 10631fa8a22b17b2f898513b68e04269597147d2478Denys Vlasenko 10731fa8a22b17b2f898513b68e04269597147d2478Denys Vlasenko