Revision: 3100
Author: [email protected]
Date: Wed Oct 21 02:24:25 2009
Log: Commit fucomip change 197037 http://codereview.chromium.org/197037/show
http://code.google.com/p/v8/source/detail?r=3100

Modified:
  /branches/bleeding_edge/src/ia32/assembler-ia32.cc
  /branches/bleeding_edge/src/ia32/assembler-ia32.h
  /branches/bleeding_edge/src/ia32/codegen-ia32.cc
  /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc
  /branches/bleeding_edge/src/x64/assembler-x64.cc
  /branches/bleeding_edge/src/x64/assembler-x64.h
  /branches/bleeding_edge/src/x64/codegen-x64.cc
  /branches/bleeding_edge/src/x64/macro-assembler-x64.cc

=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.cc  Thu Oct  8 00:09:46  
2009
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.cc  Wed Oct 21 02:24:25  
2009
@@ -1848,6 +1848,14 @@
    EMIT(0xDA);
    EMIT(0xE9);
  }
+
+
+void Assembler::fucomip() {
+  EnsureSpace ensure_space(this);
+  last_pc_ = pc_;
+  EMIT(0xDF);
+  EMIT(0xE9);
+}


  void Assembler::fcompp() {
=======================================
--- /branches/bleeding_edge/src/ia32/assembler-ia32.h   Thu Oct  8 07:27:46  
2009
+++ /branches/bleeding_edge/src/ia32/assembler-ia32.h   Wed Oct 21 02:24:25  
2009
@@ -702,6 +702,7 @@
    void ftst();
    void fucomp(int i);
    void fucompp();
+  void fucomip();
    void fcompp();
    void fnstsw_ax();
    void fwait();
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Tue Oct 20 08:26:17  
2009
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc    Wed Oct 21 02:24:25  
2009
@@ -6500,11 +6500,7 @@
    __ j(not_equal, &true_result);
    __ fldz();
    __ fld_d(FieldOperand(eax, HeapNumber::kValueOffset));
-  __ fucompp();
-  __ push(eax);
-  __ fnstsw_ax();
-  __ sahf();
-  __ pop(eax);
+  __ FCmp();
    __ j(zero, &false_result);
    // Fall through to |true_result|.

@@ -6908,18 +6904,14 @@
          // Check if right operand is int32.
          __ fist_s(Operand(esp, 0 * kPointerSize));
          __ fild_s(Operand(esp, 0 * kPointerSize));
-        __ fucompp();
-        __ fnstsw_ax();
-        __ sahf();
+        __ FCmp();
          __ j(not_zero, &operand_conversion_failure);
          __ j(parity_even, &operand_conversion_failure);

          // Check if left operand is int32.
          __ fist_s(Operand(esp, 1 * kPointerSize));
          __ fild_s(Operand(esp, 1 * kPointerSize));
-        __ fucompp();
-        __ fnstsw_ax();
-        __ sahf();
+        __ FCmp();
          __ j(not_zero, &operand_conversion_failure);
          __ j(parity_even, &operand_conversion_failure);
        }
=======================================
--- /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Tue Oct 20  
08:26:17 2009
+++ /branches/bleeding_edge/src/ia32/macro-assembler-ia32.cc    Wed Oct 21  
02:24:25 2009
@@ -319,11 +319,17 @@


  void MacroAssembler::FCmp() {
-  fucompp();
-  push(eax);
-  fnstsw_ax();
-  sahf();
-  pop(eax);
+  if (CpuFeatures::IsSupported(CpuFeatures::CMOV)) {
+    fucomip();
+    ffree(0);
+    fincstp();
+  } else {
+    fucompp();
+    push(eax);
+    fnstsw_ax();
+    sahf();
+    pop(eax);
+  }
  }


=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.cc    Tue Oct 20 08:26:17  
2009
+++ /branches/bleeding_edge/src/x64/assembler-x64.cc    Wed Oct 21 02:24:25  
2009
@@ -2227,6 +2227,14 @@
    emit(0xDA);
    emit(0xE9);
  }
+
+
+void Assembler::fucomip() {
+  EnsureSpace ensure_space(this);
+  last_pc_ = pc_;
+  emit(0xDF);
+  emit(0xE9);
+}


  void Assembler::fcompp() {
=======================================
--- /branches/bleeding_edge/src/x64/assembler-x64.h     Tue Oct 20 08:26:17 2009
+++ /branches/bleeding_edge/src/x64/assembler-x64.h     Wed Oct 21 02:24:25 2009
@@ -1049,6 +1049,8 @@
    void ftst();
    void fucomp(int i);
    void fucompp();
+  void fucomip();
+
    void fcompp();
    void fnstsw_ax();
    void fwait();
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc      Tue Oct 20 08:26:17 2009
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc      Wed Oct 21 02:24:25 2009
@@ -6206,16 +6206,11 @@
    // These three cases set C3 when compared to zero in the FPU.
    __ CompareRoot(rdx, Heap::kHeapNumberMapRootIndex);
    __ j(not_equal, &true_result);
-  // TODO(x64): Don't use fp stack, use MMX registers?
    __ fldz();  // Load zero onto fp stack
    // Load heap-number double value onto fp stack
    __ fld_d(FieldOperand(rax, HeapNumber::kValueOffset));
-  __ fucompp();  // Compare and pop both values.
-  __ movq(kScratchRegister, rax);
-  __ fnstsw_ax();  // Store fp status word in ax, no checking for  
exceptions.
-  __ testl(rax, Immediate(0x4000));  // Test FP condition flag C3, bit 16.
-  __ movq(rax, kScratchRegister);
-  __ j(not_zero, &false_result);
+  __ FCmp();
+  __ j(zero, &false_result);
    // Fall through to |true_result|.

    // Return 1/0 for true/false in rax.
@@ -7512,31 +7507,16 @@
          // Check if right operand is int32.
          __ fist_s(Operand(rsp, 0 * kPointerSize));
          __ fild_s(Operand(rsp, 0 * kPointerSize));
-        __ fucompp();
-        __ fnstsw_ax();
-        if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
-          __ sahf();
-          __ j(not_zero, &operand_conversion_failure);
-          __ j(parity_even, &operand_conversion_failure);
-        } else {
-          __ and_(rax, Immediate(0x4400));
-          __ cmpl(rax, Immediate(0x4000));
-          __ j(not_zero, &operand_conversion_failure);
-        }
+        __ FCmp();
+        __ j(not_zero, &operand_conversion_failure);
+        __ j(parity_even, &operand_conversion_failure);
+
          // Check if left operand is int32.
          __ fist_s(Operand(rsp, 1 * kPointerSize));
          __ fild_s(Operand(rsp, 1 * kPointerSize));
-        __ fucompp();
-        __ fnstsw_ax();
-        if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
-          __ sahf();
-          __ j(not_zero, &operand_conversion_failure);
-          __ j(parity_even, &operand_conversion_failure);
-        } else {
-          __ and_(rax, Immediate(0x4400));
-          __ cmpl(rax, Immediate(0x4000));
-          __ j(not_zero, &operand_conversion_failure);
-        }
+        __ FCmp();
+        __ j(not_zero, &operand_conversion_failure);
+        __ j(parity_even, &operand_conversion_failure);
        }

        // Get int32 operands and perform bitop.
=======================================
--- /branches/bleeding_edge/src/x64/macro-assembler-x64.cc      Tue Oct 20  
08:26:17 2009
+++ /branches/bleeding_edge/src/x64/macro-assembler-x64.cc      Wed Oct 21  
02:24:25 2009
@@ -1421,18 +1421,9 @@


  void MacroAssembler::FCmp() {
-  fucompp();
-  push(rax);
-  fnstsw_ax();
-  if (CpuFeatures::IsSupported(CpuFeatures::SAHF)) {
-    sahf();
-  } else {
-    shrl(rax, Immediate(8));
-    and_(rax, Immediate(0xFF));
-    push(rax);
-    popfq();
-  }
-  pop(rax);
+  fucomip();
+  ffree(0);
+  fincstp();
  }



--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to