Add support for yield instruction. (#132)

Add an explicit yield() method to the assembler and macro-assembler, and use
them to test disassembly and simulation.
diff --git a/src/aarch64/assembler-aarch64.cc b/src/aarch64/assembler-aarch64.cc
index 8e7cee5..56f18b0 100644
--- a/src/aarch64/assembler-aarch64.cc
+++ b/src/aarch64/assembler-aarch64.cc
@@ -6133,6 +6133,8 @@
   Emit(0xce60c800 | Rd(vd) | Rn(vn) | Rm(vm));
 }
 
+void Assembler::yield() { hint(YIELD); }
+
 // Note:
 // For all ToImm instructions below, a difference in case
 // for the same letter indicates a negated bit.
diff --git a/src/aarch64/assembler-aarch64.h b/src/aarch64/assembler-aarch64.h
index 441a528..d443cb0 100644
--- a/src/aarch64/assembler-aarch64.h
+++ b/src/aarch64/assembler-aarch64.h
@@ -2081,6 +2081,9 @@
   // Prefetch from pc + imm19 << 2 (allowing unallocated hints).
   void prfm(int op, int64_t imm19);
 
+  // Yield.
+  void yield();
+
   // Move instructions. The default shift of -1 indicates that the move
   // instruction will calculate an appropriate 16-bit immediate and left shift
   // that is equal to the 64-bit immediate argument. If an explicit left shift
diff --git a/src/aarch64/macro-assembler-aarch64.h b/src/aarch64/macro-assembler-aarch64.h
index 1763f49..22ddf46 100644
--- a/src/aarch64/macro-assembler-aarch64.h
+++ b/src/aarch64/macro-assembler-aarch64.h
@@ -7880,6 +7880,12 @@
   void Umax(const Register& rd, const Register& rn, const Operand& op);
   void Umin(const Register& rd, const Register& rn, const Operand& op);
 
+  void Yield() {
+    VIXL_ASSERT(allow_macro_instructions_);
+    SingleEmissionCheckScope guard(this);
+    yield();
+  }
+
   template <typename T>
   Literal<T>* CreateLiteralDestroyedWithPool(T value) {
     return new Literal<T>(value,
diff --git a/test/aarch64/test-assembler-aarch64.cc b/test/aarch64/test-assembler-aarch64.cc
index a86b32e..fb01644 100644
--- a/test/aarch64/test-assembler-aarch64.cc
+++ b/test/aarch64/test-assembler-aarch64.cc
@@ -7611,6 +7611,7 @@
   __ Nop();
   __ Esb();
   __ Csdb();
+  __ Yield();
   END();
 
   if (CAN_RUN()) {
diff --git a/test/aarch64/test-disasm-aarch64.cc b/test/aarch64/test-disasm-aarch64.cc
index 40abef1..60e8d9f 100644
--- a/test/aarch64/test-disasm-aarch64.cc
+++ b/test/aarch64/test-disasm-aarch64.cc
@@ -3130,6 +3130,8 @@
   COMPARE_MACRO(Hint(42), "hint #42");
   COMPARE_MACRO(Hint(127), "hint #127");
 
+  COMPARE_MACRO(Yield(), "yield");
+
   CLEANUP();
 }
 
diff --git a/tools/code_coverage.log b/tools/code_coverage.log
index d787f6f..d27656f 100644
--- a/tools/code_coverage.log
+++ b/tools/code_coverage.log
@@ -33,3 +33,4 @@
 1722595938 82.94% 97.78% 94.72%
 1728570468 82.94% 97.78% 94.71%
 1736874659 82.94% 97.63% 94.78%
+1740505459 82.95% 97.61% 94.76%