Author: [email protected]
Date: Fri Feb 20 09:42:04 2009
New Revision: 1332

Modified:
    branches/bleeding_edge/src/assembler-ia32.cc
    branches/bleeding_edge/src/assembler-ia32.h
    branches/bleeding_edge/src/codegen-ia32.cc
    branches/bleeding_edge/test/mjsunit/toint32.js

Log:
Revert 1330:1331.

[email protected]
Review URL: http://codereview.chromium.org/24026

Modified: branches/bleeding_edge/src/assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/assembler-ia32.cc        (original)
+++ branches/bleeding_edge/src/assembler-ia32.cc        Fri Feb 20 09:42:04 2009
@@ -1614,14 +1614,6 @@
  }


-void Assembler::fisttp_d(const Operand& adr) {
-  EnsureSpace ensure_space(this);
-  last_pc_ = pc_;
-  EMIT(0xDD);
-  emit_operand(ecx, adr);
-}
-
-
  void Assembler::fist_s(const Operand& adr) {
    EnsureSpace ensure_space(this);
    last_pc_ = pc_;
@@ -1814,14 +1806,6 @@
    last_pc_ = pc_;
    EMIT(0xD9);
    EMIT(0xFC);
-}
-
-
-void Assembler::fnclex() {
-  EnsureSpace ensure_space(this);
-  last_pc_ = pc_;
-  EMIT(0xDB);
-  EMIT(0xE2);
  }



Modified: branches/bleeding_edge/src/assembler-ia32.h
==============================================================================
--- branches/bleeding_edge/src/assembler-ia32.h (original)
+++ branches/bleeding_edge/src/assembler-ia32.h Fri Feb 20 09:42:04 2009
@@ -635,8 +635,6 @@
    void fistp_s(const Operand& adr);
    void fistp_d(const Operand& adr);

-  void fisttp_d(const Operand& adr);
-
    void fabs();
    void fchs();

@@ -665,7 +663,6 @@
    void fcompp();
    void fnstsw_ax();
    void fwait();
-  void fnclex();

    void frndint();


Modified: branches/bleeding_edge/src/codegen-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-ia32.cc  (original)
+++ branches/bleeding_edge/src/codegen-ia32.cc  Fri Feb 20 09:42:04 2009
@@ -4482,29 +4482,31 @@
        FloatingPointHelper::CheckFloatOperands(masm, &call_runtime, ebx);
        FloatingPointHelper::LoadFloatOperands(masm, ecx);

-      Label non_smi_result, skip_allocation, operands_failed_conversion;
-
+      Label non_int32_operands, non_smi_result, skip_allocation;
        // Reserve space for converted numbers.
-      __ sub(Operand(esp), Immediate(4 * kPointerSize));
+      __ sub(Operand(esp), Immediate(2 * kPointerSize));

-      // Convert right operand to int32.
-      __ fnclex();
-      __ fisttp_d(Operand(esp, 2 * kPointerSize));
+      // Check if right operand is int32.
+      __ fist_s(Operand(esp, 1 * kPointerSize));
+      __ fild_s(Operand(esp, 1 * kPointerSize));
+      __ fucompp();
        __ fnstsw_ax();
-      __ test(eax, Immediate(1));
-      __ j(not_zero, &operands_failed_conversion);
-
-      // Convert left operand to int32.
-      __ fisttp_d(Operand(esp, 0 * kPointerSize));
+      __ sahf();
+      __ j(not_zero, &non_int32_operands);
+      __ j(parity_even, &non_int32_operands);
+
+      // Check if left operand is int32.
+      __ fist_s(Operand(esp, 0 * kPointerSize));
+      __ fild_s(Operand(esp, 0 * kPointerSize));
+      __ fucompp();
        __ fnstsw_ax();
-      __ test(eax, Immediate(1));
-      __ j(not_zero, &operands_failed_conversion);
+      __ sahf();
+      __ j(not_zero, &non_int32_operands);
+      __ j(parity_even, &non_int32_operands);

        // Get int32 operands and perform bitop.
        __ pop(eax);
-      __ add(Operand(esp), Immediate(kPointerSize));
        __ pop(ecx);
-      __ add(Operand(esp), Immediate(kPointerSize));
        switch (op_) {
          case Token::BIT_OR:  __ or_(eax, Operand(ecx)); break;
          case Token::BIT_AND: __ and_(eax, Operand(ecx)); break;
@@ -4552,11 +4554,10 @@
          __ fstp_d(FieldOperand(eax, HeapNumber::kValueOffset));
          __ ret(2 * kPointerSize);
        }
-
-      // Free ST(0) before calling runtime.
-      __ bind(&operands_failed_conversion);
-      __ add(Operand(esp), Immediate(4 * kPointerSize));
+      __ bind(&non_int32_operands);
+      // Restore stacks and operands before calling runtime.
        __ ffree(0);
+      __ add(Operand(esp), Immediate(2 * kPointerSize));

        // SHR should return uint32 - go to runtime for non-smi/negative  
result.
        if (op_ == Token::SHR) __ bind(&non_smi_result);

Modified: branches/bleeding_edge/test/mjsunit/toint32.js
==============================================================================
--- branches/bleeding_edge/test/mjsunit/toint32.js      (original)
+++ branches/bleeding_edge/test/mjsunit/toint32.js      Fri Feb 20 09:42:04 2009
@@ -78,95 +78,3 @@
  assertEquals(1294967296, toInt32(-3000000000.25));
  assertEquals(1294967296, toInt32(-3000000000.5));
  assertEquals(1294967296, toInt32(-3000000000.75));
-
-var base = Math.pow(2, 64);
-assertEquals(0, toInt32(base + 0));
-assertEquals(0, toInt32(base + 1117));
-assertEquals(4096, toInt32(base + 2234));
-assertEquals(4096, toInt32(base + 3351));
-assertEquals(4096, toInt32(base + 4468));
-assertEquals(4096, toInt32(base + 5585));
-assertEquals(8192, toInt32(base + 6702));
-assertEquals(8192, toInt32(base + 7819));
-assertEquals(8192, toInt32(base + 8936));
-assertEquals(8192, toInt32(base + 10053));
-assertEquals(12288, toInt32(base + 11170));
-assertEquals(12288, toInt32(base + 12287));
-assertEquals(12288, toInt32(base + 13404));
-assertEquals(16384, toInt32(base + 14521));
-assertEquals(16384, toInt32(base + 15638));
-assertEquals(16384, toInt32(base + 16755));
-assertEquals(16384, toInt32(base + 17872));
-assertEquals(20480, toInt32(base + 18989));
-assertEquals(20480, toInt32(base + 20106));
-assertEquals(20480, toInt32(base + 21223));
-assertEquals(20480, toInt32(base + 22340));
-assertEquals(24576, toInt32(base + 23457));
-assertEquals(24576, toInt32(base + 24574));
-assertEquals(24576, toInt32(base + 25691));
-assertEquals(28672, toInt32(base + 26808));
-assertEquals(28672, toInt32(base + 27925));
-assertEquals(28672, toInt32(base + 29042));
-assertEquals(28672, toInt32(base + 30159));
-assertEquals(32768, toInt32(base + 31276));
-assertEquals(32768, toInt32(base + 32393));
-assertEquals(32768, toInt32(base + 33510));
-assertEquals(32768, toInt32(base + 34627));
-assertEquals(36864, toInt32(base + 35744));
-assertEquals(36864, toInt32(base + 36861));
-assertEquals(36864, toInt32(base + 37978));
-assertEquals(40960, toInt32(base + 39095));
-assertEquals(40960, toInt32(base + 40212));
-assertEquals(40960, toInt32(base + 41329));
-assertEquals(40960, toInt32(base + 42446));
-assertEquals(45056, toInt32(base + 43563));
-assertEquals(45056, toInt32(base + 44680));
-assertEquals(45056, toInt32(base + 45797));
-assertEquals(45056, toInt32(base + 46914));
-assertEquals(49152, toInt32(base + 48031));
-assertEquals(49152, toInt32(base + 49148));
-assertEquals(49152, toInt32(base + 50265));
-assertEquals(53248, toInt32(base + 51382));
-assertEquals(53248, toInt32(base + 52499));
-assertEquals(53248, toInt32(base + 53616));
-assertEquals(53248, toInt32(base + 54733));
-assertEquals(57344, toInt32(base + 55850));
-assertEquals(57344, toInt32(base + 56967));
-assertEquals(57344, toInt32(base + 58084));
-assertEquals(57344, toInt32(base + 59201));
-assertEquals(61440, toInt32(base + 60318));
-assertEquals(61440, toInt32(base + 61435));
-assertEquals(61440, toInt32(base + 62552));
-assertEquals(65536, toInt32(base + 63669));
-assertEquals(65536, toInt32(base + 64786));
-assertEquals(65536, toInt32(base + 65903));
-assertEquals(65536, toInt32(base + 67020));
-assertEquals(69632, toInt32(base + 68137));
-assertEquals(69632, toInt32(base + 69254));
-assertEquals(69632, toInt32(base + 70371));
-assertEquals(69632, toInt32(base + 71488));
-assertEquals(73728, toInt32(base + 72605));
-assertEquals(73728, toInt32(base + 73722));
-assertEquals(73728, toInt32(base + 74839));
-assertEquals(77824, toInt32(base + 75956));
-assertEquals(77824, toInt32(base + 77073));
-assertEquals(77824, toInt32(base + 78190));
-assertEquals(77824, toInt32(base + 79307));
-assertEquals(81920, toInt32(base + 80424));
-assertEquals(81920, toInt32(base + 81541));
-assertEquals(81920, toInt32(base + 82658));
-assertEquals(81920, toInt32(base + 83775));
-assertEquals(86016, toInt32(base + 84892));
-assertEquals(86016, toInt32(base + 86009));
-assertEquals(86016, toInt32(base + 87126));
-assertEquals(90112, toInt32(base + 88243));
-assertEquals(90112, toInt32(base + 89360));
-assertEquals(90112, toInt32(base + 90477));
-assertEquals(90112, toInt32(base + 91594));
-assertEquals(94208, toInt32(base + 92711));
-assertEquals(94208, toInt32(base + 93828));
-assertEquals(94208, toInt32(base + 94945));
-assertEquals(94208, toInt32(base + 96062));
-assertEquals(98304, toInt32(base + 97179));
-assertEquals(98304, toInt32(base + 98296));
-assertEquals(98304, toInt32(base + 99413));

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

Reply via email to