summaryrefslogtreecommitdiffstats
path: root/compiler/utils
diff options
context:
space:
mode:
authorRoland Levillain <rpl@google.com>2015-04-13 17:50:33 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2015-04-13 17:50:34 +0000
commit87222de25ac8590e420cdbbb3fbdfe001ed83cc8 (patch)
tree0341ad8ca6e3cd14528f118dfe0c7b389f2f4da6 /compiler/utils
parent4b5673b7387804947a1605a906deee132ab28f14 (diff)
parent0a18601f141d864a26d4b74ff5613e69ae411483 (diff)
downloadandroid_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.cc7
-rw-r--r--compiler/utils/x86/assembler_x86.h1
-rw-r--r--compiler/utils/x86/assembler_x86_test.cc18
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.cc7
-rw-r--r--compiler/utils/x86_64/assembler_x86_64.h1
-rw-r--r--compiler/utils/x86_64/assembler_x86_64_test.cc18
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 //
////////////////