LLVM API Documentation

Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

PPC32InstrInfo.cpp

Go to the documentation of this file.
00001 //===- PPC32InstrInfo.cpp - PowerPC32 Instruction Information ---*- C++ -*-===//
00002 // 
00003 //                     The LLVM Compiler Infrastructure
00004 //
00005 // This file was developed by the LLVM research group and is distributed under
00006 // the University of Illinois Open Source License. See LICENSE.TXT for details.
00007 // 
00008 //===----------------------------------------------------------------------===//
00009 //
00010 // This file contains the PowerPC implementation of the TargetInstrInfo class.
00011 //
00012 //===----------------------------------------------------------------------===//
00013 
00014 #include "PPC32InstrInfo.h"
00015 #include "PPC32GenInstrInfo.inc"
00016 #include "PowerPC.h"
00017 #include "llvm/CodeGen/MachineInstrBuilder.h"
00018 #include <iostream>
00019 using namespace llvm;
00020 
00021 PPC32InstrInfo::PPC32InstrInfo()
00022   : TargetInstrInfo(PPC32Insts, sizeof(PPC32Insts)/sizeof(PPC32Insts[0])) {}
00023 
00024 bool PPC32InstrInfo::isMoveInstr(const MachineInstr& MI,
00025                                  unsigned& sourceReg,
00026                                  unsigned& destReg) const {
00027   MachineOpCode oc = MI.getOpcode();
00028   if (oc == PPC::OR) {                      // or r1, r2, r2
00029     assert(MI.getNumOperands() == 3 &&
00030            MI.getOperand(0).isRegister() &&
00031            MI.getOperand(1).isRegister() &&
00032            MI.getOperand(2).isRegister() &&
00033            "invalid PPC OR instruction!");
00034     if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) {
00035       sourceReg = MI.getOperand(1).getReg();
00036       destReg = MI.getOperand(0).getReg();
00037       return true;
00038     }
00039   } else if (oc == PPC::ADDI) {             // addi r1, r2, 0
00040     assert(MI.getNumOperands() == 3 &&
00041            MI.getOperand(0).isRegister() &&
00042            MI.getOperand(2).isImmediate() &&
00043            "invalid PPC ADDI instruction!");
00044     if (MI.getOperand(1).isRegister() && MI.getOperand(2).getImmedValue()==0) {
00045       sourceReg = MI.getOperand(1).getReg();
00046       destReg = MI.getOperand(0).getReg();
00047       return true;
00048     }
00049   } else if (oc == PPC::ORI) {             // ori r1, r2, 0
00050     assert(MI.getNumOperands() == 3 &&
00051            MI.getOperand(0).isRegister() &&
00052            MI.getOperand(1).isRegister() &&
00053            MI.getOperand(2).isImmediate() &&
00054            "invalid PPC ORI instruction!");
00055     if (MI.getOperand(2).getImmedValue()==0) {
00056       sourceReg = MI.getOperand(1).getReg();
00057       destReg = MI.getOperand(0).getReg();
00058       return true;
00059     }
00060   } else if (oc == PPC::FMR) {              // fmr r1, r2
00061     assert(MI.getNumOperands() == 2 &&
00062            MI.getOperand(0).isRegister() &&
00063            MI.getOperand(1).isRegister() &&
00064            "invalid PPC FMR instruction");
00065     sourceReg = MI.getOperand(1).getReg();
00066     destReg = MI.getOperand(0).getReg();
00067     return true;
00068   }
00069   return false;
00070 }