X86: Add test for movw

Test: SOONG_ALLOW_MISSING_DEPENDENCIES=true TARGET_BUILD_UNBUNDLED=true m test-art-host-gtest
Change-Id: I5296ef734484c6cf3c441f96fc3a64572b5909dc
diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc
index d7bedd0..5d34a51 100644
--- a/compiler/utils/x86/assembler_x86_test.cc
+++ b/compiler/utils/x86/assembler_x86_test.cc
@@ -34,6 +34,12 @@
   ASSERT_EQ(static_cast<size_t>(5), buffer.Size());
 }
 
+struct X86RegisterCompare {
+    bool operator()(const x86::Register& a, const x86::Register& b) const {
+        return static_cast<int32_t>(a) < static_cast<int32_t>(b);
+    }
+};
+
 //
 // Test fixture.
 //
@@ -81,6 +87,7 @@
       addresses_.push_back(x86::Address(x86::ESP, 1));
       addresses_.push_back(x86::Address(x86::ESP, 987654321));
     }
+
     if (registers_.size() == 0) {
       registers_.insert(end(registers_),
                         {
@@ -93,6 +100,20 @@
                           new x86::Register(x86::ESI),
                           new x86::Register(x86::EDI)
                         });
+
+      secondary_register_names_.emplace(x86::Register(x86::EAX), "ax");
+      secondary_register_names_.emplace(x86::Register(x86::EBX), "bx");
+      secondary_register_names_.emplace(x86::Register(x86::ECX), "cx");
+      secondary_register_names_.emplace(x86::Register(x86::EDX), "dx");
+      secondary_register_names_.emplace(x86::Register(x86::EBP), "bp");
+      secondary_register_names_.emplace(x86::Register(x86::ESP), "sp");
+      secondary_register_names_.emplace(x86::Register(x86::ESI), "si");
+      secondary_register_names_.emplace(x86::Register(x86::EDI), "di");
+
+      tertiary_register_names_.emplace(x86::Register(x86::EAX), "al");
+      tertiary_register_names_.emplace(x86::Register(x86::EBX), "bl");
+      tertiary_register_names_.emplace(x86::Register(x86::ECX), "cl");
+      tertiary_register_names_.emplace(x86::Register(x86::EDX), "dl");
     }
 
     if (fp_registers_.size() == 0) {
@@ -132,11 +153,23 @@
     return x86::Immediate(imm_value);
   }
 
+  std::string GetSecondaryRegisterName(const x86::Register& reg) override {
+    CHECK(secondary_register_names_.find(reg) != secondary_register_names_.end());
+    return secondary_register_names_[reg];
+  }
+
+  std::string GetTertiaryRegisterName(const x86::Register& reg) override {
+    CHECK(tertiary_register_names_.find(reg) != tertiary_register_names_.end());
+    return tertiary_register_names_[reg];
+  }
+
   std::vector<x86::Address> addresses_singleton_;
 
  private:
   std::vector<x86::Address> addresses_;
   std::vector<x86::Register*> registers_;
+  std::map<x86::Register, std::string, X86RegisterCompare> secondary_register_names_;
+  std::map<x86::Register, std::string, X86RegisterCompare> tertiary_register_names_;
   std::vector<x86::XmmRegister*> fp_registers_;
 };
 
@@ -267,6 +300,10 @@
   DriverStr(RepeatAI(&x86::X86Assembler::addw, /*imm_bytes*/ 2U, "addw ${imm}, {mem}"), "addw");
 }
 
+TEST_F(AssemblerX86Test, MovwStore) {
+  DriverStr(RepeatAr(&x86::X86Assembler::movw, "movw %{reg}, {mem}"), "movw-store");
+}
+
 TEST_F(AssemblerX86Test, MovlStore) {
   DriverStr(RepeatAR(&x86::X86Assembler::movl, "movl %{reg}, {mem}"), "movl-store");
 }