summaryrefslogtreecommitdiffstats
path: root/compiler/utils
diff options
context:
space:
mode:
authorSerguei Katkov <serguei.i.katkov@intel.com>2015-04-07 17:04:50 +0600
committerRoland Levillain <rpl@google.com>2015-04-13 11:30:02 +0000
commit2d45b4df3838d9c0e5a213305ccd1d7009e01437 (patch)
treeb3893899a540ba9f4c8cd70e69536d0239a9d3ef /compiler/utils
parent1576be32be4a99a1cffdaaf209a3cd67e8b2f88a (diff)
downloadandroid_art-2d45b4df3838d9c0e5a213305ccd1d7009e01437.tar.gz
android_art-2d45b4df3838d9c0e5a213305ccd1d7009e01437.tar.bz2
android_art-2d45b4df3838d9c0e5a213305ccd1d7009e01437.zip
Optimizing: Fix long-to-fp conversion on x86.
long-to-fp conversion implemented using SSE loses the precision. The test is included. CL uses FPU to provide the correct result. Change-Id: I8eaf3c46819a8cb52642a7e7d7c4e3e0edbc88db Signed-off-by: Serguei Katkov <serguei.i.katkov@intel.com>
Diffstat (limited to 'compiler/utils')
-rw-r--r--compiler/utils/x86/assembler_x86.cc7
-rw-r--r--compiler/utils/x86/assembler_x86.h1
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc7
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h1
4 files changed, 16 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc
index 4cca529258..7b206a3ffd 100644
--- a/compiler/utils/x86/assembler_x86.cc
+++ b/compiler/utils/x86/assembler_x86.cc
@@ -883,6 +883,13 @@ void X86Assembler::fildl(const Address& src) {
}
+void X86Assembler::filds(const Address& src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0xDB);
+ EmitOperand(0, src);
+}
+
+
void X86Assembler::fincstp() {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitUint8(0xD9);
diff --git a/compiler/utils/x86/assembler_x86.h b/compiler/utils/x86/assembler_x86.h
index f3675aeceb..a933474a39 100644
--- a/compiler/utils/x86/assembler_x86.h
+++ b/compiler/utils/x86/assembler_x86.h
@@ -349,6 +349,7 @@ class X86Assembler FINAL : public Assembler {
void fistpl(const Address& dst);
void fistps(const Address& dst);
void fildl(const Address& src);
+ void filds(const Address& src);
void fincstp();
void ffree(const Immediate& index);
diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc
index 2e0d9e1840..699b0b22f7 100644
--- a/compiler/utils/x86_64/assembler_x86_64.cc
+++ b/compiler/utils/x86_64/assembler_x86_64.cc
@@ -984,6 +984,13 @@ void X86_64Assembler::fildl(const Address& src) {
}
+void X86_64Assembler::filds(const Address& src) {
+ AssemblerBuffer::EnsureCapacity ensured(&buffer_);
+ EmitUint8(0xDB);
+ EmitOperand(0, src);
+}
+
+
void X86_64Assembler::fincstp() {
AssemblerBuffer::EnsureCapacity ensured(&buffer_);
EmitUint8(0xD9);
diff --git a/compiler/utils/x86_64/assembler_x86_64.h b/compiler/utils/x86_64/assembler_x86_64.h
index a786a6cbff..3df095091a 100644
--- a/compiler/utils/x86_64/assembler_x86_64.h
+++ b/compiler/utils/x86_64/assembler_x86_64.h
@@ -389,6 +389,7 @@ class X86_64Assembler FINAL : public Assembler {
void fistpl(const Address& dst);
void fistps(const Address& dst);
void fildl(const Address& src);
+ void filds(const Address& src);
void fincstp();
void ffree(const Immediate& index);