Use ldr for movs out of stack slots (instead of mov reg, [sp/fp]).

So far we've been using ldr/str (32-bit) to load/store
the whole stack slot, independent of the variable type.

Toggle on some tests that didn't have an Om1 variant
previously. Didn't toggle everything since there are still
some problems with liveness from code being unimplemented.

BUG= https://code.google.com/p/nativeclient/issues/detail?id=4076
R=stichnot@chromium.org

Review URL: https://codereview.chromium.org/1144923008
diff --git a/src/IceInstARM32.cpp b/src/IceInstARM32.cpp
index 2c33c43..713df3a 100644
--- a/src/IceInstARM32.cpp
+++ b/src/IceInstARM32.cpp
@@ -313,8 +313,18 @@
   assert(getSrcSize() == 1);
   Variable *Dest = getDest();
   if (Dest->hasReg()) {
-    Str << "\t"
-        << "mov" << getPredicate() << "\t";
+    const char *Opcode = "mov";
+    Operand *Src0 = getSrc(0);
+    if (const auto *Src0V = llvm::dyn_cast<Variable>(Src0)) {
+      if (!Src0V->hasReg()) {
+        Opcode = "ldr"; // Always load the full stack slot (vs ldrb, ldrh).
+      }
+    } else {
+      // If Src isn't a variable, it shouldn't be a memory operand either
+      // (otherwise Opcode will have to be ldr).
+      assert(!llvm::isa<OperandARM32Mem>(Src0));
+    }
+    Str << "\t" << Opcode << getPredicate() << "\t";
     getDest()->emit(Func);
     Str << ", ";
     getSrc(0)->emit(Func);