| Index: test/cctest/test-code-stubs.cc
|
| diff --git a/test/mjsunit/double-truncation.js b/test/cctest/test-code-stubs.cc
|
| similarity index 54%
|
| copy from test/mjsunit/double-truncation.js
|
| copy to test/cctest/test-code-stubs.cc
|
| index b43e1e6c6353ae0497667312fc6956b08148efa2..405069626bec4d076173f9a1441b62b3554e0498 100644
|
| --- a/test/mjsunit/double-truncation.js
|
| +++ b/test/cctest/test-code-stubs.cc
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2012 the V8 project authors. All rights reserved.
|
| +// Copyright 2013 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -25,14 +25,68 @@
|
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
|
| -// Flags: --allow-natives-syntax
|
| +#include <stdlib.h>
|
|
|
| -function RunOneTruncationTest(a, b) {
|
| - var temp = a | 0;
|
| - assertEquals(b, temp);
|
| +#include <limits>
|
| +
|
| +#include "v8.h"
|
| +
|
| +#include "cctest.h"
|
| +#include "code-stubs.h"
|
| +#include "test-code-stubs.h"
|
| +#include "factory.h"
|
| +#include "macro-assembler.h"
|
| +#include "platform.h"
|
| +
|
| +using namespace v8::internal;
|
| +
|
| +
|
| +int STDCALL ConvertDToICVersion(double d) {
|
| + Address double_ptr = reinterpret_cast<Address>(&d);
|
| + uint32_t exponent_bits = Memory::uint32_at(double_ptr + kDoubleSize / 2);
|
| + int32_t shifted_mask = static_cast<int32_t>(Double::kExponentMask >> 32);
|
| + int32_t exponent = (((exponent_bits & shifted_mask) >>
|
| + (Double::kPhysicalSignificandSize - 32)) -
|
| + HeapNumber::kExponentBias);
|
| + uint32_t unsigned_exponent = static_cast<uint32_t>(exponent);
|
| + int result = 0;
|
| + uint32_t max_exponent =
|
| + static_cast<uint32_t>(Double::kPhysicalSignificandSize);
|
| + if (unsigned_exponent >= max_exponent) {
|
| + if ((exponent - Double::kPhysicalSignificandSize) < 32) {
|
| + result = Memory::uint32_at(double_ptr) <<
|
| + (exponent - Double::kPhysicalSignificandSize);
|
| + }
|
| + } else {
|
| + uint64_t big_result =
|
| + (BitCast<uint64_t>(d) & Double::kSignificandMask) | Double::kHiddenBit;
|
| + big_result = big_result >> (Double::kPhysicalSignificandSize - exponent);
|
| + result = static_cast<uint32_t>(big_result);
|
| + }
|
| + if (static_cast<int32_t>(exponent_bits) < 0) {
|
| + return (0 - result);
|
| + } else {
|
| + return result;
|
| + }
|
| }
|
|
|
| -function RunAllTruncationTests() {
|
| +
|
| +void RunOneTruncationTestWithTest(ConvertDToIFunc func,
|
| + double from,
|
| + double raw) {
|
| + uint64_t to = static_cast<int64_t>(raw);
|
| + int result = (*func)(from);
|
| + CHECK_EQ(static_cast<int>(to), result);
|
| +}
|
| +
|
| +
|
| +// #define NaN and Infinity so that it's possible to cut-and-paste these tests
|
| +// directly to a .js file and run them.
|
| +#define NaN (OS::nan_value())
|
| +#define Infinity (std::numeric_limits<double>::infinity())
|
| +#define RunOneTruncationTest(p1, p2) RunOneTruncationTestWithTest(func, p1, p2)
|
| +
|
| +void RunAllTruncationTests(ConvertDToIFunc func) {
|
| RunOneTruncationTest(0, 0);
|
| RunOneTruncationTest(0.5, 0);
|
| RunOneTruncationTest(-0.5, 0);
|
| @@ -65,14 +119,12 @@ function RunAllTruncationTests() {
|
| RunOneTruncationTest(4.8357078901445341e+24, -1073741824);
|
| RunOneTruncationTest(-4.8357078901445341e+24, 1073741824);
|
|
|
| - RunOneTruncationTest(9.6714111686030497e+24, -2147483648);
|
| - RunOneTruncationTest(-9.6714111686030497e+24, -2147483648);
|
| - RunOneTruncationTest(9.6714157802890681e+24, -2147483648);
|
| - RunOneTruncationTest(-9.6714157802890681e+24, -2147483648);
|
| + RunOneTruncationTest(9.6714111686030497e+24, -2147483648.0);
|
| + RunOneTruncationTest(-9.6714111686030497e+24, -2147483648.0);
|
| + RunOneTruncationTest(9.6714157802890681e+24, -2147483648.0);
|
| + RunOneTruncationTest(-9.6714157802890681e+24, -2147483648.0);
|
| }
|
|
|
| -RunAllTruncationTests();
|
| -RunAllTruncationTests();
|
| -%OptimizeFunctionOnNextCall(RunOneTruncationTest);
|
| -RunAllTruncationTests();
|
| -RunAllTruncationTests();
|
| +#undef NaN
|
| +#undef Infinity
|
| +#undef RunOneTruncationTest
|
|
|