Revision: 16600
Author:   ol...@chromium.org
Date:     Mon Sep  9 16:57:35 2013 UTC
Log:      Extend assembler and codegen with more fpu arithmetic

BUG=
R=mvstan...@chromium.org

Review URL: https://codereview.chromium.org/21509003
http://code.google.com/p/v8/source/detail?r=16600

Modified:
 /branches/bleeding_edge/src/ia32/assembler-ia32.cc
 /branches/bleeding_edge/src/ia32/assembler-ia32.h
 /branches/bleeding_edge/src/ia32/disasm-ia32.cc
 /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc

=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.cc Mon Aug 26 09:37:39 2013 UTC +++ /branches/bleeding_edge/src/ia32/assembler-ia32.cc Mon Sep 9 16:57:35 2013 UTC
@@ -1719,12 +1719,24 @@
   EnsureSpace ensure_space(this);
   emit_farith(0xDC, 0xC0, i);
 }
+
+
+void Assembler::fadd_i(int i) {
+  EnsureSpace ensure_space(this);
+  emit_farith(0xD8, 0xC0, i);
+}


 void Assembler::fsub(int i) {
   EnsureSpace ensure_space(this);
   emit_farith(0xDC, 0xE8, i);
 }
+
+
+void Assembler::fsub_i(int i) {
+  EnsureSpace ensure_space(this);
+  emit_farith(0xD8, 0xE0, i);
+}


 void Assembler::fisub_s(const Operand& adr) {
@@ -1750,6 +1762,12 @@
   EnsureSpace ensure_space(this);
   emit_farith(0xDC, 0xF8, i);
 }
+
+
+void Assembler::fdiv_i(int i) {
+  EnsureSpace ensure_space(this);
+  emit_farith(0xD8, 0xF0, i);
+}


 void Assembler::faddp(int i) {
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.h Mon Sep 2 09:30:54 2013 UTC +++ /branches/bleeding_edge/src/ia32/assembler-ia32.h Mon Sep 9 16:57:35 2013 UTC
@@ -956,10 +956,13 @@
   void fninit();

   void fadd(int i);
+  void fadd_i(int i);
   void fsub(int i);
+  void fsub_i(int i);
   void fmul(int i);
   void fmul_i(int i);
   void fdiv(int i);
+  void fdiv_i(int i);

   void fisub_s(const Operand& adr);

=======================================
--- /branches/bleeding_edge/src/ia32/disasm-ia32.cc Mon Aug 26 16:48:23 2013 UTC +++ /branches/bleeding_edge/src/ia32/disasm-ia32.cc Mon Sep 9 16:57:35 2013 UTC
@@ -743,7 +743,14 @@

   switch (escape_opcode) {
     case 0xD8:
-      UnimplementedInstruction();
+      has_register = true;
+      switch (modrm_byte & 0xF8) {
+        case 0xC0: mnem = "fadd_i"; break;
+        case 0xE0: mnem = "fsub_i"; break;
+        case 0xC8: mnem = "fmul_i"; break;
+        case 0xF0: mnem = "fdiv_i"; break;
+        default: UnimplementedInstruction();
+      }
       break;

     case 0xD9:
@@ -767,6 +774,7 @@
             case 0xEE: mnem = "fldz"; break;
             case 0xF0: mnem = "f2xm1"; break;
             case 0xF1: mnem = "fyl2x"; break;
+            case 0xF4: mnem = "fxtract"; break;
             case 0xF5: mnem = "fprem1"; break;
             case 0xF7: mnem = "fincstp"; break;
             case 0xF8: mnem = "fprem"; break;
@@ -815,6 +823,7 @@
       has_register = true;
       switch (modrm_byte & 0xF8) {
         case 0xC0: mnem = "ffree"; break;
+        case 0xD0: mnem = "fst"; break;
         case 0xD8: mnem = "fstp"; break;
         default: UnimplementedInstruction();
       }
@@ -1448,6 +1457,7 @@
         data += D1D3C1Instruction(data);
         break;

+      case 0xD8:  // fall through
       case 0xD9:  // fall through
       case 0xDA:  // fall through
       case 0xDB:  // fall through
=======================================
--- /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Sep 9 16:34:40 2013 UTC +++ /branches/bleeding_edge/src/ia32/lithium-codegen-ia32.cc Mon Sep 9 16:57:35 2013 UTC
@@ -2232,11 +2232,36 @@
     X87Register left = ToX87Register(instr->left());
     X87Register right = ToX87Register(instr->right());
     X87Register result = ToX87Register(instr->result());
-    X87PrepareBinaryOp(left, right, result);
+    if (instr->op() != Token::MOD) {
+      X87PrepareBinaryOp(left, right, result);
+    }
     switch (instr->op()) {
+      case Token::ADD:
+        __ fadd_i(1);
+        break;
+      case Token::SUB:
+        __ fsub_i(1);
+        break;
       case Token::MUL:
         __ fmul_i(1);
         break;
+      case Token::DIV:
+        __ fdiv_i(1);
+        break;
+      case Token::MOD: {
+        // Pass two doubles as arguments on the stack.
+        __ PrepareCallCFunction(4, eax);
+        X87Mov(Operand(esp, 1 * kDoubleSize), right);
+        X87Mov(Operand(esp, 0), left);
+        X87PrepareToWrite(result);
+        __ CallCFunction(
+            ExternalReference::double_fp_operation(Token::MOD, isolate()),
+            4);
+
+        // Return value is in st(0) on ia32.
+        X87CommitWrite(result);
+        break;
+      }
       default:
         UNREACHABLE();
         break;

--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to