[LLVMdev] llvm backend porting question ,
huangjie
huangjielg at gmail.com
Fri Jan 18 07:14:45 PST 2013
I start my porting for picoblaze,the soft cpu for fpga ,which is
designed by XILINX from MSP430 porting .
After some day's work , somethinig looks good , for it can generate
for some simple C program:
eg :
int f1(int a)
{
return a+1;
}
but it failed with this :
char f()
{
char a;
a++; a++; a++; a++; a++; a++; a++; a++; a++; a++; a++;
a++; a++; a++; a++; a++; a++; a++; a++; a++; a++; a++;
return a;
}
I think something is wrong with
PicoblazeInstrInfo::storeRegToStackSlot and
PicoblazeInstrInfo::loadRegFromStackSlot ,since if I remove some
a++ from the above c program,
It can generate the right picoblaze asm code .
below is my code , the whole porting with this error can by found at github :
https://github.com/huangjielg/llvm-picoblaze/tree/a667350354ca1f8d23da5e76b598b8327ef239bc/lib/Target/Picoblaze
/******************************/
void PicoblazeInstrInfo::storeRegToStackSlot(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
unsigned SrcReg, bool
isKill, int FrameIdx,
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI
) const
{
PR_FUNCTION();
DebugLoc DL;
if (MI != MBB.end()) DL = MI->getDebugLoc();
MachineFunction &MF = *MBB.getParent();MF.dump();
MachineFrameInfo &MFI = *MF.getFrameInfo();
unsigned Align = MFI.getObjectAlignment(MVT::i8);
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(MVT::i8),
MachineMemOperand::MOStore,
MFI.getObjectSize(MVT::i8),
Align);
BuildMI(MBB, MI, DL, get(Picoblaze::STORETOSTACK ));//.addMemOperand(MMO);
if (RC == &Picoblaze::GR8RegClass)
{
// BuildMI(MBB, MI, DL, get(Picoblaze::ADD8ri ))
// .addReg(Picoblaze::BP)
// .addImm(FrameIdx);
BuildMI(MBB, MI, DL, get(Picoblaze::STORE_I))
.addImm(FrameIdx)
.addReg(SrcReg,getKillRegState(isKill))
;
// .addMemOperand(MMO); ;//addReg(Picoblaze::BP);
// BuildMI(MBB, MI, DL, get(Picoblaze::ADD8ri ))
// .addReg(Picoblaze::BP)
// .addImm(-FrameIdx);
}
else
llvm_unreachable("Cannot store this register to stack slot!");
BuildMI(MBB, MI, DL, get(Picoblaze::REGXXSTACKEND
));//.addMemOperand(MMO); ;
MF.dump();
}
void PicoblazeInstrInfo::loadRegFromStackSlot(MachineBasicBlock &MBB,
MachineBasicBlock::iterator MI,
unsigned DestReg, int FrameIdx,
const TargetRegisterClass *RC,
const TargetRegisterInfo *TRI) const
{
PR_FUNCTION();
DebugLoc DL;
if (MI != MBB.end()) DL = MI->getDebugLoc();
MachineFunction &MF = *MBB.getParent();
MF.dump();
MachineFrameInfo &MFI = *MF.getFrameInfo();
unsigned Align = MFI.getObjectAlignment(MVT::i8);
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(MVT::i8),
MachineMemOperand::MOLoad,
MFI.getObjectSize(MVT::i8),
Align);
BuildMI(MBB, MI, DL, get(Picoblaze::LOADFROMSTACK ));//.addMemOperand(MMO);
if (RC == &Picoblaze::GR8RegClass)
{
//BuildMI(MBB, MI, DL, get(Picoblaze::ADD8ri ),Picoblaze::BP)
// .addReg(Picoblaze::BP)
// .addImm(FrameIdx);
//BuildMI(MBB, MI, DL, get(Picoblaze::FETCH_R), DestReg)
// .addImm(FrameIdx);
//.addReg(Picoblaze::BP);
//BuildMI(MBB, MI, DL, get(Picoblaze::ADD8ri ),Picoblaze::BP)
// .addImm(-FrameIdx);
BuildMI(MBB, MI, DL, get(Picoblaze::FETCH_FRAMEI), DestReg)
.addImm(FrameIdx)
;//.addMemOperand(MMO);
}
else
llvm_unreachable("Cannot store this register to stack slot!");
BuildMI(MBB, MI, DL, get(Picoblaze::REGXXSTACKEND
));//.addMemOperand(MMO);
MF.dump();
}
/******************************/
More information about the llvm-dev
mailing list