| Misha Brukman | 5dfe3a9 | 2004-06-21 16:55:25 +0000 | [diff] [blame] | 1 | //===- PowerPCInstrInfo.cpp - PowerPC Instruction Information ---*- C++ -*-===// |
| 2 | // |
| 3 | // The LLVM Compiler Infrastructure |
| 4 | // |
| 5 | // This file was developed by the LLVM research group and is distributed under |
| 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. |
| 7 | // |
| 8 | //===----------------------------------------------------------------------===// |
| 9 | // |
| 10 | // This file contains the PowerPC implementation of the TargetInstrInfo class. |
| 11 | // |
| 12 | //===----------------------------------------------------------------------===// |
| 13 | |
| 14 | #include "PowerPCInstrInfo.h" |
| 15 | #include "PowerPC.h" |
| Misha Brukman | 5dfe3a9 | 2004-06-21 16:55:25 +0000 | [diff] [blame] | 16 | #include "PowerPCGenInstrInfo.inc" |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 17 | #include "llvm/CodeGen/MachineInstrBuilder.h" |
| Misha Brukman | 01d46e9 | 2004-07-16 20:51:55 +0000 | [diff] [blame] | 18 | #include <iostream> |
| Misha Brukman | 5dfe3a9 | 2004-06-21 16:55:25 +0000 | [diff] [blame] | 19 | using namespace llvm; |
| 20 | |
| Misha Brukman | a6ecd9e | 2004-08-11 23:45:43 +0000 | [diff] [blame] | 21 | PowerPCInstrInfo::PowerPCInstrInfo(bool is64b) |
| 22 | : TargetInstrInfo(PowerPCInsts, sizeof(PowerPCInsts)/sizeof(PowerPCInsts[0])), |
| 23 | RI(is64b), |
| 24 | is64bit(is64b) |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 25 | { } |
| Misha Brukman | 01d46e9 | 2004-07-16 20:51:55 +0000 | [diff] [blame] | 26 | |
| 27 | bool PowerPCInstrInfo::isMoveInstr(const MachineInstr& MI, |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 28 | unsigned& sourceReg, |
| 29 | unsigned& destReg) const { |
| Misha Brukman | 01d46e9 | 2004-07-16 20:51:55 +0000 | [diff] [blame] | 30 | MachineOpCode oc = MI.getOpcode(); |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 31 | if (oc == PPC::OR) { // or r1, r2, r2 |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 32 | assert(MI.getNumOperands() == 3 && |
| 33 | MI.getOperand(0).isRegister() && |
| 34 | MI.getOperand(1).isRegister() && |
| 35 | MI.getOperand(2).isRegister() && |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 36 | "invalid PPC OR instruction!"); |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 37 | if (MI.getOperand(1).getReg() == MI.getOperand(2).getReg()) { |
| Misha Brukman | 01d46e9 | 2004-07-16 20:51:55 +0000 | [diff] [blame] | 38 | sourceReg = MI.getOperand(1).getReg(); |
| 39 | destReg = MI.getOperand(0).getReg(); |
| 40 | return true; |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 41 | } |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 42 | } else if (oc == PPC::ADDI) { // addi r1, r2, 0 |
| Misha Brukman | 8790d47 | 2004-07-26 21:35:58 +0000 | [diff] [blame] | 43 | assert(MI.getNumOperands() == 3 && |
| 44 | MI.getOperand(0).isRegister() && |
| Misha Brukman | 8790d47 | 2004-07-26 21:35:58 +0000 | [diff] [blame] | 45 | MI.getOperand(2).isImmediate() && |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 46 | "invalid PPC ADDI instruction!"); |
| Misha Brukman | 3ada3e3 | 2004-07-26 21:50:38 +0000 | [diff] [blame] | 47 | if (MI.getOperand(1).isRegister() && MI.getOperand(2).getImmedValue()==0) { |
| Misha Brukman | 774a297 | 2004-07-26 21:29:00 +0000 | [diff] [blame] | 48 | sourceReg = MI.getOperand(1).getReg(); |
| 49 | destReg = MI.getOperand(0).getReg(); |
| 50 | return true; |
| 51 | } |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 52 | } else if (oc == PPC::FMR) { // fmr r1, r2 |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 53 | assert(MI.getNumOperands() == 2 && |
| 54 | MI.getOperand(0).isRegister() && |
| 55 | MI.getOperand(1).isRegister() && |
| Misha Brukman | 5b57081 | 2004-08-10 22:47:03 +0000 | [diff] [blame] | 56 | "invalid PPC FMR instruction"); |
| Misha Brukman | be15f67 | 2004-07-16 20:54:25 +0000 | [diff] [blame] | 57 | sourceReg = MI.getOperand(1).getReg(); |
| 58 | destReg = MI.getOperand(0).getReg(); |
| 59 | return true; |
| Misha Brukman | 01d46e9 | 2004-07-16 20:51:55 +0000 | [diff] [blame] | 60 | } |
| 61 | return false; |
| 62 | } |