1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

* Fn args passed in registers are now recorded as used by the call instruction

`-> asm printer updated to not print out those registers with the call instr

All of Shootout tests now work.  Great thanks to Nate Begeman for the patch!

llvm-svn: 15015
This commit is contained in:
Misha Brukman 2004-07-20 00:42:19 +00:00
parent fdc633a29b
commit bec77933fa
2 changed files with 36 additions and 12 deletions

View File

@ -492,14 +492,29 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
"Instruction requires 64 bit support");
++EmittedInsts;
// CALLpcrel and CALLindirect are handled specially here to print only the
// appropriate number of args that the assembler expects. This is because
// may have many arguments appended to record the uses of registers that are
// holding arguments to the called function.
if (Opcode == PPC32::IMPLICIT_DEF) {
O << "; IMPLICIT DEF ";
printOp(MI->getOperand(0));
O << "\n";
return;
}
} else if (Opcode == PPC32::CALLpcrel) {
O << TII.getName(MI->getOpcode()) << " ";
printOp(MI->getOperand(0));
O << "\n";
return;
} else if (Opcode == PPC32::CALLindirect) {
O << TII.getName(MI->getOpcode()) << " ";
printOp(MI->getOperand(0));
O << ", ";
printOp(MI->getOperand(1));
O << "\n";
return;
} else if (Opcode == PPC32::MovePCtoLR) {
// FIXME: should probably be converted to cout.width and cout.fill
if (Opcode == PPC32::MovePCtoLR) {
O << "bl \"L0000" << labelNumber << "$pb\"\n";
O << "\"L0000" << labelNumber << "$pb\":\n";
O << "\tmflr ";
@ -509,9 +524,6 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
}
O << TII.getName(MI->getOpcode()) << " ";
DEBUG(std::cerr << TII.getName(MI->getOpcode()) << " expects "
<< ArgCount << " args\n");
if (Opcode == PPC32::LOADLoAddr) {
printOp(MI->getOperand(0));
O << ", lo16(";

View File

@ -492,14 +492,29 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
"Instruction requires 64 bit support");
++EmittedInsts;
// CALLpcrel and CALLindirect are handled specially here to print only the
// appropriate number of args that the assembler expects. This is because
// may have many arguments appended to record the uses of registers that are
// holding arguments to the called function.
if (Opcode == PPC32::IMPLICIT_DEF) {
O << "; IMPLICIT DEF ";
printOp(MI->getOperand(0));
O << "\n";
return;
}
} else if (Opcode == PPC32::CALLpcrel) {
O << TII.getName(MI->getOpcode()) << " ";
printOp(MI->getOperand(0));
O << "\n";
return;
} else if (Opcode == PPC32::CALLindirect) {
O << TII.getName(MI->getOpcode()) << " ";
printOp(MI->getOperand(0));
O << ", ";
printOp(MI->getOperand(1));
O << "\n";
return;
} else if (Opcode == PPC32::MovePCtoLR) {
// FIXME: should probably be converted to cout.width and cout.fill
if (Opcode == PPC32::MovePCtoLR) {
O << "bl \"L0000" << labelNumber << "$pb\"\n";
O << "\"L0000" << labelNumber << "$pb\":\n";
O << "\tmflr ";
@ -509,9 +524,6 @@ void Printer::printMachineInstruction(const MachineInstr *MI) {
}
O << TII.getName(MI->getOpcode()) << " ";
DEBUG(std::cerr << TII.getName(MI->getOpcode()) << " expects "
<< ArgCount << " args\n");
if (Opcode == PPC32::LOADLoAddr) {
printOp(MI->getOperand(0));
O << ", lo16(";