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