diff options
author | Roland Levillain <rpl@google.com> | 2015-04-13 17:50:33 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2015-04-13 17:50:34 +0000 |
commit | 87222de25ac8590e420cdbbb3fbdfe001ed83cc8 (patch) | |
tree | 0341ad8ca6e3cd14528f118dfe0c7b389f2f4da6 /compiler/utils | |
parent | 4b5673b7387804947a1605a906deee132ab28f14 (diff) | |
parent | 0a18601f141d864a26d4b74ff5613e69ae411483 (diff) | |
download | android_art-87222de25ac8590e420cdbbb3fbdfe001ed83cc8.tar.gz android_art-87222de25ac8590e420cdbbb3fbdfe001ed83cc8.tar.bz2 android_art-87222de25ac8590e420cdbbb3fbdfe001ed83cc8.zip |
Merge "Exercise the x86 and x86-64 FILD and FISTP instructions."
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/assembler_x86_test.cc | 18 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.cc | 7 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64.h | 1 | ||||
-rw-r--r-- | compiler/utils/x86_64/assembler_x86_64_test.cc | 18 |
6 files changed, 52 insertions, 0 deletions
diff --git a/compiler/utils/x86/assembler_x86.cc b/compiler/utils/x86/assembler_x86.cc index 51cc7acbd0..329698ce1e 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/assembler_x86_test.cc b/compiler/utils/x86/assembler_x86_test.cc index dba3b6ba67..f326e496d4 100644 --- a/compiler/utils/x86/assembler_x86_test.cc +++ b/compiler/utils/x86/assembler_x86_test.cc @@ -172,4 +172,22 @@ TEST_F(AssemblerX86Test, LockCmpxchg8b) { DriverStr(expected, "lock_cmpxchg8b"); } +TEST_F(AssemblerX86Test, FPUIntegerLoad) { + GetAssembler()->filds(x86::Address(x86::Register(x86::ESP), 4)); + GetAssembler()->fildl(x86::Address(x86::Register(x86::ESP), 12)); + const char* expected = + "fildl 0x4(%ESP)\n" + "fildll 0xc(%ESP)\n"; + DriverStr(expected, "FPUIntegerLoad"); +} + +TEST_F(AssemblerX86Test, FPUIntegerStore) { + GetAssembler()->fistps(x86::Address(x86::Register(x86::ESP), 16)); + GetAssembler()->fistpl(x86::Address(x86::Register(x86::ESP), 24)); + const char* expected = + "fistpl 0x10(%ESP)\n" + "fistpll 0x18(%ESP)\n"; + DriverStr(expected, "FPUIntegerStore"); +} + } // namespace art diff --git a/compiler/utils/x86_64/assembler_x86_64.cc b/compiler/utils/x86_64/assembler_x86_64.cc index 638659d635..32204a9970 100644 --- a/compiler/utils/x86_64/assembler_x86_64.cc +++ b/compiler/utils/x86_64/assembler_x86_64.cc @@ -988,6 +988,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 15b8b15c74..16ef70b85e 100644 --- a/compiler/utils/x86_64/assembler_x86_64.h +++ b/compiler/utils/x86_64/assembler_x86_64.h @@ -448,6 +448,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); diff --git a/compiler/utils/x86_64/assembler_x86_64_test.cc b/compiler/utils/x86_64/assembler_x86_64_test.cc index 116190a832..5ca0373a6a 100644 --- a/compiler/utils/x86_64/assembler_x86_64_test.cc +++ b/compiler/utils/x86_64/assembler_x86_64_test.cc @@ -849,6 +849,24 @@ TEST_F(AssemblerX86_64Test, X87) { DriverFn(&x87_fn, "x87"); } +TEST_F(AssemblerX86_64Test, FPUIntegerLoad) { + GetAssembler()->filds(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 4)); + GetAssembler()->fildl(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 12)); + const char* expected = + "fildl 0x4(%RSP)\n" + "fildll 0xc(%RSP)\n"; + DriverStr(expected, "FPUIntegerLoad"); +} + +TEST_F(AssemblerX86_64Test, FPUIntegerStore) { + GetAssembler()->fistps(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 16)); + GetAssembler()->fistpl(x86_64::Address(x86_64::CpuRegister(x86_64::RSP), 24)); + const char* expected = + "fistpl 0x10(%RSP)\n" + "fistpll 0x18(%RSP)\n"; + DriverStr(expected, "FPUIntegerStore"); +} + //////////////// // CALL / JMP // //////////////// |