PPCInstrInfo.h revision 408396014742a05cad1c91949d2226169e3f9d80
1c16257f05391b8aeccef62d6b543f1cb5a8185feChris Lattner//===- PPCInstrInfo.h - PowerPC Instruction Information ---------*- C++ -*-===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//                     The LLVM Compiler Infrastructure
4f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
5f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// This file was developed by the LLVM research group and is distributed under
6f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
9f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
10f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman// This file contains the PowerPC implementation of the TargetInstrInfo class.
11f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//
12f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman//===----------------------------------------------------------------------===//
13f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
14f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#ifndef POWERPC32_INSTRUCTIONINFO_H
15f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#define POWERPC32_INSTRUCTIONINFO_H
16f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
172668959b8879097db368aec7d76c455260abc75bChris Lattner#include "PPC.h"
18617742b1b8b7fbb07b4ab5db7c292bff78d709f6Chris Lattner#include "llvm/Target/TargetInstrInfo.h"
1916e71f2f70811c69c56052dd146324fe20e31db5Chris Lattner#include "PPCRegisterInfo.h"
20f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
21f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmannamespace llvm {
22617742b1b8b7fbb07b4ab5db7c292bff78d709f6Chris Lattner
2321e463b2bf864671a87ebe386cb100ef9349a540Nate Begemanclass PPCInstrInfo : public TargetInstrInfo {
2421e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman  const PPCRegisterInfo RI;
25f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukmanpublic:
2621e463b2bf864671a87ebe386cb100ef9349a540Nate Begeman  PPCInstrInfo();
27f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
28f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  /// getRegisterInfo - TargetInstrInfo is a superset of MRegister info.  As
29f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  /// such, whenever a client has an instance of instruction info, it should
30f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  /// always be able to get register info as well (through this method).
31f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  ///
32f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  virtual const MRegisterInfo &getRegisterInfo() const { return RI; }
33f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
34f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  //
35f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // Return true if the instruction is a register to register move and
36f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  // leave the source and dest operands in the passed parameters.
37f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  //
38f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  virtual bool isMoveInstr(const MachineInstr& MI,
39f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                           unsigned& sourceReg,
40f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman                           unsigned& destReg) const;
41f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
42408396014742a05cad1c91949d2226169e3f9d80Chris Lattner  unsigned isLoadFromStackSlot(MachineInstr *MI, int &FrameIndex) const;
43408396014742a05cad1c91949d2226169e3f9d80Chris Lattner
44043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner  // commuteInstruction - We can commute rlwimi instructions, but only if the
45043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner  // rotate amt is zero.  We also have to munge the immediates a bit.
46043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner  virtual MachineInstr *commuteInstruction(MachineInstr *MI) const;
47043870dd85ea41e8972c304b122070a417c8a4bcChris Lattner
48f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  static unsigned invertPPCBranchOpcode(unsigned Opcode) {
49f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    switch (Opcode) {
50f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    default: assert(0 && "Unknown PPC branch opcode!");
51f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BEQ: return PPC::BNE;
52f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BNE: return PPC::BEQ;
53f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BLT: return PPC::BGE;
54f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BGE: return PPC::BLT;
55f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BGT: return PPC::BLE;
56f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman    case PPC::BLE: return PPC::BGT;
57e44b2d16ee088c44ebbe6f21a2af8b5321b68e48Chris Lattner    case PPC::BNU: return PPC::BUN;
58e44b2d16ee088c44ebbe6f21a2af8b5321b68e48Chris Lattner    case PPC::BUN: return PPC::BNU;
59b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman    }
60f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman  }
61f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman};
62f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
63f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman}
64f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman
65f2ccb77ee9d8ab35866dae111fa36929689c7511Misha Brukman#endif
66