diff options
author | Serguei Katkov <serguei.i.katkov@intel.com> | 2015-04-07 17:04:50 +0600 |
---|---|---|
committer | Roland Levillain <rpl@google.com> | 2015-04-13 11:30:02 +0000 |
commit | 2d45b4df3838d9c0e5a213305ccd1d7009e01437 (patch) | |
tree | b3893899a540ba9f4c8cd70e69536d0239a9d3ef /compiler/utils | |
parent | 1576be32be4a99a1cffdaaf209a3cd67e8b2f88a (diff) | |
download | android_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.cc | 7 | ||||
-rw-r--r-- | compiler/utils/x86/assembler_x86.h | 1 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.cc | 7 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.h | 1 |
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); |