summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Shalini Salomi Bodapati <shalini.salomi.bodapati@intel.com> 2022-02-11 18:01:22 +0530
committer Ulya Trofimovich <skvadrik@google.com> 2022-02-14 11:07:59 +0000
commit927a996d99df01bbe052965ff6c746f8727db046 (patch)
tree1eb89189132ad1e8b14e54d1005e3744bf0e6f51
parent3bd485822201efe935173c769a84ae7be3b14928 (diff)
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
-rw-r--r--compiler/utils/x86/assembler_x86.cc5
-rw-r--r--compiler/utils/x86/assembler_x86.h1
-rw-r--r--compiler/utils/x86/assembler_x86_test.cc6
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc11
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h2
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc12
6 files changed, 37 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index 4b64e92136..861b27e6af 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -3735,6 +3735,11 @@ void X86Assembler::rep_movsw() {
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 dc2427d9d9..c346ba9235 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -871,6 +871,7 @@ class X86Assembler final : public Assembler {
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 5db2b65179..89c73c0ade 100644
--- a/compiler/utils/x86/assembler_x86_test.cc
+++ b/compiler/utils/x86/assembler_x86_test.cc
@@ -464,6 +464,12 @@ TEST_F(AssemblerX86Test, RepMovsw) {
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 966d9e4e7e..21a44810ba 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -4981,6 +4981,17 @@ void X86_64Assembler::rep_movsw() {
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 7d61500d07..ea944c200e 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -981,6 +981,8 @@ class X86_64Assembler final : public Assembler {
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 53febca629..f7e890d112 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 @@ TEST_F(AssemblerX86_64Test, RepneScasw) {
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");
}