mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-08 19:25:47 +00:00
If we're about to emit something like:
%f0 = fmovs %f0 %f1 = fmovs %f1 then just delete the FpMOVD pseudo-instruction instead. Also, add statistics and debug printouts. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@18383 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -15,11 +15,13 @@
|
|||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
|
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
|
||||||
|
Statistic<> SkippedFpMOVDs ("fpmover", "# FpMOVD instructions skipped");
|
||||||
|
|
||||||
struct FPMover : public MachineFunctionPass {
|
struct FPMover : public MachineFunctionPass {
|
||||||
/// Target machine description which we query for reg. names, data
|
/// Target machine description which we query for reg. names, data
|
||||||
@@ -70,21 +72,31 @@ static void doubleToSingleRegPair(unsigned doubleReg, unsigned &singleReg1, unsi
|
|||||||
bool FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
|
bool FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
|
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
|
||||||
if (V8::FpMOVD == I->getOpcode()) {
|
if (V8::FpMOVD == I->getOpcode ()) {
|
||||||
I->setOpcode (V8::FMOVS);
|
unsigned NewSrcReg0, NewSrcReg1, NewDestReg0, NewDestReg1;
|
||||||
unsigned DestReg = I->getOperand(0).getReg();
|
doubleToSingleRegPair (I->getOperand (0).getReg (), NewDestReg0,
|
||||||
unsigned SrcReg = I->getOperand(1).getReg();
|
NewDestReg1);
|
||||||
unsigned NewSrcReg0, NewSrcReg1;
|
doubleToSingleRegPair (I->getOperand (1).getReg (), NewSrcReg0,
|
||||||
unsigned NewDestReg0, NewDestReg1;
|
NewSrcReg1);
|
||||||
doubleToSingleRegPair (DestReg, NewDestReg0, NewDestReg1);
|
|
||||||
doubleToSingleRegPair (SrcReg, NewSrcReg0, NewSrcReg1);
|
|
||||||
I->SetMachineOperandReg (0, NewDestReg0);
|
|
||||||
I->SetMachineOperandReg (1, NewSrcReg0);
|
|
||||||
// Insert copy for the other half of the double:
|
|
||||||
MachineBasicBlock::iterator J = I;
|
MachineBasicBlock::iterator J = I;
|
||||||
++J;
|
++J;
|
||||||
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg(NewSrcReg1);
|
if (!(NewDestReg0 == NewSrcReg0 && NewDestReg1 == NewSrcReg1)) {
|
||||||
++NumFpMOVDs;
|
I->setOpcode (V8::FMOVS);
|
||||||
|
I->SetMachineOperandReg (0, NewDestReg0);
|
||||||
|
I->SetMachineOperandReg (1, NewSrcReg0);
|
||||||
|
DEBUG (std::cerr << "FPMover: new dest reg. is: " << NewDestReg0
|
||||||
|
<< "; modified instr is: " << *I);
|
||||||
|
// Insert copy for the other half of the double:
|
||||||
|
MachineInstr *MI2 =
|
||||||
|
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg (NewSrcReg1);
|
||||||
|
DEBUG (std::cerr << "FPMover: new dest reg. is " << NewDestReg1
|
||||||
|
<< "; inserted instr is: " << *MI2);
|
||||||
|
++NumFpMOVDs;
|
||||||
|
} else {
|
||||||
|
MBB.erase (I);
|
||||||
|
++SkippedFpMOVDs;
|
||||||
|
}
|
||||||
|
I = J;
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
|
@@ -15,11 +15,13 @@
|
|||||||
#include "llvm/CodeGen/MachineFunctionPass.h"
|
#include "llvm/CodeGen/MachineFunctionPass.h"
|
||||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||||
#include "llvm/ADT/Statistic.h"
|
#include "llvm/ADT/Statistic.h"
|
||||||
|
#include "llvm/Support/Debug.h"
|
||||||
|
|
||||||
using namespace llvm;
|
using namespace llvm;
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
|
Statistic<> NumFpMOVDs ("fpmover", "# FpMOVD instructions translated");
|
||||||
|
Statistic<> SkippedFpMOVDs ("fpmover", "# FpMOVD instructions skipped");
|
||||||
|
|
||||||
struct FPMover : public MachineFunctionPass {
|
struct FPMover : public MachineFunctionPass {
|
||||||
/// Target machine description which we query for reg. names, data
|
/// Target machine description which we query for reg. names, data
|
||||||
@@ -70,21 +72,31 @@ static void doubleToSingleRegPair(unsigned doubleReg, unsigned &singleReg1, unsi
|
|||||||
bool FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
|
bool FPMover::runOnMachineBasicBlock (MachineBasicBlock &MBB) {
|
||||||
bool Changed = false;
|
bool Changed = false;
|
||||||
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
|
for (MachineBasicBlock::iterator I = MBB.begin (); I != MBB.end (); ++I)
|
||||||
if (V8::FpMOVD == I->getOpcode()) {
|
if (V8::FpMOVD == I->getOpcode ()) {
|
||||||
I->setOpcode (V8::FMOVS);
|
unsigned NewSrcReg0, NewSrcReg1, NewDestReg0, NewDestReg1;
|
||||||
unsigned DestReg = I->getOperand(0).getReg();
|
doubleToSingleRegPair (I->getOperand (0).getReg (), NewDestReg0,
|
||||||
unsigned SrcReg = I->getOperand(1).getReg();
|
NewDestReg1);
|
||||||
unsigned NewSrcReg0, NewSrcReg1;
|
doubleToSingleRegPair (I->getOperand (1).getReg (), NewSrcReg0,
|
||||||
unsigned NewDestReg0, NewDestReg1;
|
NewSrcReg1);
|
||||||
doubleToSingleRegPair (DestReg, NewDestReg0, NewDestReg1);
|
|
||||||
doubleToSingleRegPair (SrcReg, NewSrcReg0, NewSrcReg1);
|
|
||||||
I->SetMachineOperandReg (0, NewDestReg0);
|
|
||||||
I->SetMachineOperandReg (1, NewSrcReg0);
|
|
||||||
// Insert copy for the other half of the double:
|
|
||||||
MachineBasicBlock::iterator J = I;
|
MachineBasicBlock::iterator J = I;
|
||||||
++J;
|
++J;
|
||||||
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg(NewSrcReg1);
|
if (!(NewDestReg0 == NewSrcReg0 && NewDestReg1 == NewSrcReg1)) {
|
||||||
++NumFpMOVDs;
|
I->setOpcode (V8::FMOVS);
|
||||||
|
I->SetMachineOperandReg (0, NewDestReg0);
|
||||||
|
I->SetMachineOperandReg (1, NewSrcReg0);
|
||||||
|
DEBUG (std::cerr << "FPMover: new dest reg. is: " << NewDestReg0
|
||||||
|
<< "; modified instr is: " << *I);
|
||||||
|
// Insert copy for the other half of the double:
|
||||||
|
MachineInstr *MI2 =
|
||||||
|
BuildMI (MBB, J, V8::FMOVS, 1, NewDestReg1).addReg (NewSrcReg1);
|
||||||
|
DEBUG (std::cerr << "FPMover: new dest reg. is " << NewDestReg1
|
||||||
|
<< "; inserted instr is: " << *MI2);
|
||||||
|
++NumFpMOVDs;
|
||||||
|
} else {
|
||||||
|
MBB.erase (I);
|
||||||
|
++SkippedFpMOVDs;
|
||||||
|
}
|
||||||
|
I = J;
|
||||||
Changed = true;
|
Changed = true;
|
||||||
}
|
}
|
||||||
return Changed;
|
return Changed;
|
||||||
|
Reference in New Issue
Block a user