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%