|
|
|
|
@ -22,6 +22,12 @@ void PrintStackAccess(std::ostream& os, const char* mnemonic, PhysReg reg,
|
|
|
|
|
<< "]\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PrintStackPairAccess(std::ostream& os, const char* mnemonic, PhysReg reg0, PhysReg reg1,
|
|
|
|
|
int offset) {
|
|
|
|
|
os << " " << mnemonic << " " << PhysRegName(reg0) << " " << PhysRegName(reg1) << ", [x29, #" << offset
|
|
|
|
|
<< "]\n";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
void PrintAsm(const MachineFunction& function, std::ostream& os) {
|
|
|
|
|
@ -50,6 +56,10 @@ void PrintAsm(const MachineFunction& function, std::ostream& os) {
|
|
|
|
|
os << " mov " << PhysRegName(ops.at(0).GetReg()) << ", #"
|
|
|
|
|
<< ops.at(1).GetImm() << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::MovReg:
|
|
|
|
|
os << " mov " << PhysRegName(ops.at(0).GetReg())
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::LoadStack: {
|
|
|
|
|
const auto& slot = GetFrameSlot(function, ops.at(1));
|
|
|
|
|
PrintStackAccess(os, "ldur", ops.at(0).GetReg(), slot.offset);
|
|
|
|
|
@ -60,14 +70,137 @@ void PrintAsm(const MachineFunction& function, std::ostream& os) {
|
|
|
|
|
PrintStackAccess(os, "stur", ops.at(0).GetReg(), slot.offset);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Opcode::LoadStackPair: {
|
|
|
|
|
PrintStackPairAccess(os, "ldp", ops.at(0).GetReg(), ops.at(1).GetReg(), 16);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Opcode::StoreStackPair: {
|
|
|
|
|
PrintStackPairAccess(os, "stp", ops.at(0).GetReg(), ops.at(1).GetReg(), -16);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
case Opcode::AddRR:
|
|
|
|
|
os << " add " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::AddRI:
|
|
|
|
|
os << " add " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", #"
|
|
|
|
|
<< ops.at(2).GetImm() << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::SubRR:
|
|
|
|
|
os << " sub " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::SubRI:
|
|
|
|
|
os << " sub " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", #"
|
|
|
|
|
<< ops.at(2).GetImm() << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::MulRR:
|
|
|
|
|
os << " mul " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::SDivRR:
|
|
|
|
|
os << " sdiv " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::UDivRR:
|
|
|
|
|
os << " udiv " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FAddRR:
|
|
|
|
|
os << " fadd " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FSubRR:
|
|
|
|
|
os << " fsub " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FMulRR:
|
|
|
|
|
os << " fmul " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FDivRR:
|
|
|
|
|
os << " fdiv " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::CmpRR:
|
|
|
|
|
os << " cmp " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::CmpRI:
|
|
|
|
|
os << " cmp " << PhysRegName(ops.at(0).GetReg()) << ", #"
|
|
|
|
|
<< ops.at(1).GetImm() << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FCmpRR:
|
|
|
|
|
os << " fcmp " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::SIToFP:
|
|
|
|
|
os << " scvtf " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::FPToSI:
|
|
|
|
|
os << " fcvtzs " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::ZExt:
|
|
|
|
|
os << " and " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", #1\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::AndRR:
|
|
|
|
|
os << " and " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::OrRR:
|
|
|
|
|
os << " orr " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::EorRR:
|
|
|
|
|
os << " eor " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::LslRR:
|
|
|
|
|
os << " lsl " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::LsrRR:
|
|
|
|
|
os << " lsr " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::AsrRR:
|
|
|
|
|
os << " asr " << PhysRegName(ops.at(0).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(1).GetReg()) << ", "
|
|
|
|
|
<< PhysRegName(ops.at(2).GetReg()) << "\n";
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::Nop:
|
|
|
|
|
os << " nop \n";
|
|
|
|
|
break;
|
|
|
|
|
// TODO: 控制流
|
|
|
|
|
case Opcode::B:
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::BCond:
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::Call:
|
|
|
|
|
break;
|
|
|
|
|
case Opcode::Ret:
|
|
|
|
|
os << " ret\n";
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|