OSDN Git Service

Exercise the x86 and x86-64 FILD and FISTP instructions.
authorRoland Levillain <rpl@google.com>
Mon, 13 Apr 2015 16:00:20 +0000 (17:00 +0100)
committerRoland Levillain <rpl@google.com>
Mon, 13 Apr 2015 16:00:20 +0000 (17:00 +0100)
- Ensure the double- and quadword x87 (FPU) instructions for
  integer loading (resp. fildl and fildll) are properly
  generated by the x86 and x86-64 generators (resp.
  X86Assembler::filds/X86_64Assembler::filds and
  X86Assembler::fildl/X86_64Assembler::fildl).
- Ensure the double- and quadword x87 (FPU) instructions for
  integer storing & popping (resp. filstpl and fistpll) are
  properly generated by the x86 and x86-64 generators (resp.
  X86Assembler::fistps/X86_64Assembler::fistps and
  X86Assembler::fistpl/X86_64Assembler::fistpl).

These instructions can be used in the implementation of the
long-to-float and long-to-double Dex type conversions.

Change-Id: Iade52a9aee326d189d77d3dbd352a2b5dab52e46

compiler/utils/x86/assembler_x86.cc
compiler/utils/x86/assembler_x86.h
compiler/utils/x86/assembler_x86_test.cc
compiler/utils/x86_64/assembler_x86_64.cc
compiler/utils/x86_64/assembler_x86_64.h
compiler/utils/x86_64/assembler_x86_64_test.cc

index 51cc7ac..329698c 100644 (file)
@@ -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);
index f3675ae..a933474 100644 (file)
@@ -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);
index dba3b6b..f326e49 100644 (file)
@@ -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
index 638659d..32204a9 100644 (file)
@@ -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);
index 15b8b15..16ef70b 100644 (file)
@@ -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);
index 116190a..5ca0373 100644 (file)
@@ -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 //
 ////////////////