x86/x86_64: Add rep_movs instructions
x86: This patch adds rep_movsb with tests
x86_64: This patch adds rep_movsb, rep_movsl with tests
Test: $ANDROID_HOST_OUT/nativetest{64}/art_compiler_host_tests/art_compiler_host_tests
Signed-off-by: Shalini Salomi Bodapati <shalini.salomi.bodapati@intel.com>
Change-Id: Ie49434c88e690007bdb7e773f746eae66b197574
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index 4b64e92..861b27e 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -3735,6 +3735,11 @@
EmitUint8(0xA5);
}
+void X86Assembler::rep_movsl() {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0xF3);
+ EmitUint8(0xA5);
+}
X86Assembler* X86Assembler::lock() {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h
index dc2427d..c346ba9 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -871,6 +871,7 @@
void repe_cmpsw();
void repe_cmpsl();
void rep_movsb();
+ void rep_movsl();
void rep_movsw();
X86Assembler* lock();
diff --git a/compiler/utils/x86/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc
index 5db2b65..89c73c0 100644
--- a/compiler/utils/x86/assembler_x86_test.cc
+++ b/compiler/utils/x86/assembler_x86_test.cc
@@ -464,6 +464,12 @@
DriverStr(expected, "rep_movsw");
}
+TEST_F(AssemblerX86Test, RepMovsl) {
+ GetAssembler()->rep_movsl();
+ const char* expected = "rep movsl\n";
+ DriverStr(expected, "rep_movsl");
+}
+
TEST_F(AssemblerX86Test, Blsmask) {
DriverStr(RepeatRR(&x86::X86Assembler::blsmsk, "blsmsk %{reg2}, %{reg1}"), "blsmsk");
}
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index 966d9e4..21a4481 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -4981,6 +4981,17 @@
EmitUint8(0xA5);
}
+void X86_64Assembler::rep_movsb() {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0xF3);
+ EmitUint8(0xA4);
+}
+
+void X86_64Assembler::rep_movsl() {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0xF3);
+ EmitUint8(0xA5);
+}
X86_64Assembler* X86_64Assembler::lock() {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h
index 7d61500..ea944c2 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -981,6 +981,8 @@
void repe_cmpsl();
void repe_cmpsq();
void rep_movsw();
+ void rep_movsb();
+ void rep_movsl();
void ud2();
diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc
index 53febca..f7e890d 100644
--- a/compiler/utils/x86_64/assembler_x86_64_test.cc
+++ b/compiler/utils/x86_64/assembler_x86_64_test.cc
@@ -1226,12 +1226,24 @@
DriverStr(expected, "repne_scasw");
}
+TEST_F(AssemblerX86_64Test, RepMovsb) {
+ GetAssembler()->rep_movsb();
+ const char* expected = "rep movsb\n";
+ DriverStr(expected, "rep_movsb");
+}
+
TEST_F(AssemblerX86_64Test, RepMovsw) {
GetAssembler()->rep_movsw();
const char* expected = "rep movsw\n";
DriverStr(expected, "rep_movsw");
}
+TEST_F(AssemblerX86_64Test, RepMovsl) {
+ GetAssembler()->rep_movsl();
+ const char* expected = "rep movsl\n";
+ DriverStr(expected, "rep_movsl");
+}
+
TEST_F(AssemblerX86_64Test, Movsxd) {
DriverStr(RepeatRr(&x86_64::X86_64Assembler::movsxd, "movslq %{reg2}, %{reg1}"), "movsxd");
}