Define unaligned load and store.  


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@137515 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Target/Mips/MipsAsmPrinter.cpp b/lib/Target/Mips/MipsAsmPrinter.cpp
index 049a939..4013d6c 100644
--- a/lib/Target/Mips/MipsAsmPrinter.cpp
+++ b/lib/Target/Mips/MipsAsmPrinter.cpp
@@ -25,6 +25,7 @@
 #include "llvm/CodeGen/MachineConstantPool.h"
 #include "llvm/CodeGen/MachineFrameInfo.h"
 #include "llvm/CodeGen/MachineInstr.h"
+#include "llvm/CodeGen/MachineMemOperand.h"
 #include "llvm/MC/MCStreamer.h"
 #include "llvm/MC/MCAsmInfo.h"
 #include "llvm/MC/MCInst.h"
@@ -54,6 +55,22 @@
   MipsMCInstLower MCInstLowering(Mang, *MF, *this);
   MCInst TmpInst0;
   MCInstLowering.Lower(MI, TmpInst0);
+  unsigned Opc = MI->getOpcode();
+  
+  // Convert aligned loads/stores to their unaligned counterparts.
+  // FIXME: expand other unaligned memory accesses too.
+  if ((Opc == Mips::LW || Opc == Mips::SW) && !MI->memoperands_empty() &&
+      (*MI->memoperands_begin())->getAlignment() < 4) {
+    MCInst Directive;
+    Directive.setOpcode(Mips::MACRO);
+    OutStreamer.EmitInstruction(Directive);
+    TmpInst0.setOpcode(Opc == Mips::LW ? Mips::ULW : Mips::USW);
+    OutStreamer.EmitInstruction(TmpInst0);
+    Directive.setOpcode(Mips::NOMACRO);
+    OutStreamer.EmitInstruction(Directive);
+    return;
+  }
+
   OutStreamer.EmitInstruction(TmpInst0);
 }