using namespace llvm;
+static bool isUnalignedLoadStore(unsigned Opc) {
+ return Opc == Mips::ULW || Opc == Mips::ULH || Opc == Mips::ULHu ||
+ Opc == Mips::USW || Opc == Mips::USH;
+}
+
void MipsAsmPrinter::EmitInstruction(const MachineInstr *MI) {
SmallString<128> Str;
raw_svector_ostream OS(Str);
MCInst TmpInst0;
MCInstLowering.Lower(MI, TmpInst0);
- // Convert aligned loads/stores to their unaligned counterparts.
- if (!MI->memoperands_empty()) {
- unsigned NaturalAlignment, UnalignedOpc;
-
- switch (Opc) {
- case Mips::LW: NaturalAlignment = 4; UnalignedOpc = Mips::ULW; break;
- case Mips::SW: NaturalAlignment = 4; UnalignedOpc = Mips::USW; break;
- case Mips::LH: NaturalAlignment = 2; UnalignedOpc = Mips::ULH; break;
- case Mips::LHu: NaturalAlignment = 2; UnalignedOpc = Mips::ULHu; break;
- case Mips::SH: NaturalAlignment = 2; UnalignedOpc = Mips::USH; break;
- default: NaturalAlignment = 0;
- }
-
- if ((*MI->memoperands_begin())->getAlignment() < NaturalAlignment) {
- MCInst Directive;
- Directive.setOpcode(Mips::MACRO);
- OutStreamer.EmitInstruction(Directive);
- TmpInst0.setOpcode(UnalignedOpc);
- OutStreamer.EmitInstruction(TmpInst0);
- Directive.setOpcode(Mips::NOMACRO);
- OutStreamer.EmitInstruction(Directive);
- return;
- }
+ // Enclose unaligned load or store with .macro & .nomacro directives.
+ if (isUnalignedLoadStore(Opc)) {
+ MCInst Directive;
+ Directive.setOpcode(Mips::MACRO);
+ OutStreamer.EmitInstruction(Directive);
+ OutStreamer.EmitInstruction(TmpInst0);
+ Directive.setOpcode(Mips::NOMACRO);
+ OutStreamer.EmitInstruction(Directive);
+ return;
}
OutStreamer.EmitInstruction(TmpInst0);