SparcInstrInfo.cpp revision b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0
1e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===- SparcV8InstrInfo.cpp - SparcV8 Instruction Information ---*- C++ -*-===//
2b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
3e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//                     The LLVM Compiler Infrastructure
4e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
5e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke// This file was developed by the LLVM research group and is distributed under
6e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke// the University of Illinois Open Source License. See LICENSE.TXT for details.
7b5f662fa0314f7e7e690aae8ebff7136cc3a5ab0Misha Brukman//
8e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
9e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
10e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke// This file contains the SparcV8 implementation of the TargetInstrInfo class.
11e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//
12e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke//===----------------------------------------------------------------------===//
13e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
14e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke#include "SparcV8InstrInfo.h"
151d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner#include "SparcV8.h"
16e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke#include "llvm/CodeGen/MachineInstrBuilder.h"
17e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke#include "SparcV8GenInstrInfo.inc"
181ddf475b6a3d748427546ab8f65a712c8eea3a0fChris Lattnerusing namespace llvm;
19e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
20e785e531f4495068ee46cabd926939eec15a565aBrian GaekeSparcV8InstrInfo::SparcV8InstrInfo()
21dce363d5ecf0f6add5541c853eb33214d910812fChris Lattner  : TargetInstrInfo(SparcV8Insts, sizeof(SparcV8Insts)/sizeof(SparcV8Insts[0])){
22e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke}
23e785e531f4495068ee46cabd926939eec15a565aBrian Gaeke
244658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaekestatic bool isZeroImmed (const MachineOperand &op) {
254658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  return (op.isImmediate() && op.getImmedValue() == 0);
264658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke}
274658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke
281d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// Return true if the instruction is a register to register move and
291d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner/// leave the source and dest operands in the passed parameters.
301d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner///
311d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattnerbool SparcV8InstrInfo::isMoveInstr(const MachineInstr &MI,
321d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner                                   unsigned &SrcReg, unsigned &DstReg) const {
334658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // We look for 3 kinds of patterns here:
344658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // or with G0 or 0
354658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // add with G0 or 0
364658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  // fmovs or FpMOVD (pseudo double move).
374658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  if (MI.getOpcode() == V8::ORrr || MI.getOpcode() == V8::ADDrr) {
384658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    if (MI.getOperand(1).getReg() == V8::G0) {
394658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      DstReg = MI.getOperand(0).getReg();
404658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      SrcReg = MI.getOperand(2).getReg();
414658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      return true;
424658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    } else if (MI.getOperand (2).getReg() == V8::G0) {
434658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      DstReg = MI.getOperand(0).getReg();
444658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      SrcReg = MI.getOperand(1).getReg();
454658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      return true;
464658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    }
474658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke  } else if (MI.getOpcode() == V8::ORri || MI.getOpcode() == V8::ADDri) {
484658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    if (isZeroImmed (MI.getOperand (1))) {
491d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner      DstReg = MI.getOperand(0).getReg();
501d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner      SrcReg = MI.getOperand(2).getReg();
519b8ed0e04aa2c2f18e39a4556006e08174c2eda1Brian Gaeke      return true;
524658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke    } else if (isZeroImmed (MI.getOperand (2))) {
534658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      DstReg = MI.getOperand(0).getReg();
544658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      SrcReg = MI.getOperand(1).getReg();
554658ba13a816f54f9a5e36fc6ae6456ed1b8e62dBrian Gaeke      return true;
561d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    }
579ed920437aa57886d7c9d98089955e464c3a75e0Brian Gaeke  } else if (MI.getOpcode() == V8::FMOVS || MI.getOpcode() == V8::FpMOVD) {
581d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    SrcReg = MI.getOperand(1).getReg();
591d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    DstReg = MI.getOperand(0).getReg();
601d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner    return true;
611d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner  }
621d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner  return false;
631d6dc974631a8920a4e5a801a6c7cd4753ae8a8eChris Lattner}
64