summaryrefslogtreecommitdiffstats
path: root/compiler/utils
diff options
context:
space:
mode:
authorCalin Juravle <calin@google.com>2015-04-09 12:46:58 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-04-09 12:46:59 +0000
commit96159860fc6c4bf68a51a8a57941971f122685d6 (patch)
treeef2465ab2d84b9076ab57ad239333910f68abd2b /compiler/utils
parent0c51da5db821493bcef4617ccab04ea367ecc444 (diff)
parent0f88e87085b7cf6544dadff3f555773966a6853e (diff)
downloadart-96159860fc6c4bf68a51a8a57941971f122685d6.zip
art-96159860fc6c4bf68a51a8a57941971f122685d6.tar.gz
art-96159860fc6c4bf68a51a8a57941971f122685d6.tar.bz2
Merge "Speedup div/rem by constants on x86 and x86_64"
Diffstat (limited to 'compiler/utils')
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc8
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h1
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc4
3 files changed, 13 insertions, 0 deletions
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index 2e0d9e1..30e8218 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -1620,6 +1620,14 @@ void X86_64Assembler::imull(CpuRegister reg) {
}
+void X86_64Assembler::imulq(CpuRegister reg) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitRex64(reg);
+ EmitUint8(0xF7);
+ EmitOperand(5, Operand(reg));
+}
+
+
void X86_64Assembler::imull(const Address& address) {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitOptionalRex32(address);
diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h
index a786a6c..d357a81 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -468,6 +468,7 @@ class X86_64Assembler FINAL : public Assembler {
void imull(CpuRegister reg, const Immediate& imm);
void imull(CpuRegister reg, const Address& address);
+ void imulq(CpuRegister src);
void imulq(CpuRegister dst, CpuRegister src);
void imulq(CpuRegister reg, const Immediate& imm);
void imulq(CpuRegister reg, const Address& address);
diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc
index a79bd09..86bdf20 100644
--- a/compiler/utils/x86_64/assembler_x86_64_test.cc
+++ b/compiler/utils/x86_64/assembler_x86_64_test.cc
@@ -269,6 +269,10 @@ TEST_F(AssemblerX86_64Test, AddlImm) {
DriverStr(Repeatri(&x86_64::X86_64Assembler::addl, 4U, "add ${imm}, %{reg}"), "addli");
}
+TEST_F(AssemblerX86_64Test, ImulqReg1) {
+ DriverStr(RepeatR(&x86_64::X86_64Assembler::imulq, "imulq %{reg}"), "imulq");
+}
+
TEST_F(AssemblerX86_64Test, ImulqRegs) {
DriverStr(RepeatRR(&x86_64::X86_64Assembler::imulq, "imulq %{reg2}, %{reg1}"), "imulq");
}