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