Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(563)

Side by Side Diff: test/cctest/test-code-stub-assembler.cc

Issue 2805783003: [csa] Fix CSA::ToUint32 rounding for negative HeapNumbers (Closed)
Patch Set: Fix Smi::IsValid test Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « test/cctest/compiler/function-tester.cc ('k') | test/mjsunit/string-split.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2015 the V8 project authors. All rights reserved. 1 // Copyright 2015 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <cmath>
6
5 #include "src/api.h" 7 #include "src/api.h"
6 #include "src/base/utils/random-number-generator.h" 8 #include "src/base/utils/random-number-generator.h"
7 #include "src/builtins/builtins-promise-gen.h" 9 #include "src/builtins/builtins-promise-gen.h"
8 #include "src/code-factory.h" 10 #include "src/code-factory.h"
9 #include "src/code-stub-assembler.h" 11 #include "src/code-stub-assembler.h"
10 #include "src/compiler/node.h" 12 #include "src/compiler/node.h"
11 #include "src/debug/debug.h" 13 #include "src/debug/debug.h"
12 #include "src/isolate.h" 14 #include "src/isolate.h"
13 #include "src/objects-inl.h" 15 #include "src/objects-inl.h"
14 #include "test/cctest/compiler/code-assembler-tester.h" 16 #include "test/cctest/compiler/code-assembler-tester.h"
15 #include "test/cctest/compiler/function-tester.h" 17 #include "test/cctest/compiler/function-tester.h"
16 18
17 namespace v8 { 19 namespace v8 {
18 namespace internal { 20 namespace internal {
19 21
20 using compiler::CodeAssemblerTester; 22 using compiler::CodeAssemblerTester;
21 using compiler::FunctionTester; 23 using compiler::FunctionTester;
22 using compiler::Node; 24 using compiler::Node;
23 using compiler::CodeAssemblerLabel; 25 using compiler::CodeAssemblerLabel;
24 using compiler::CodeAssemblerVariable; 26 using compiler::CodeAssemblerVariable;
25 using compiler::CodeAssemblerVariableList; 27 using compiler::CodeAssemblerVariableList;
26 28
29 namespace {
30
31 void CheckToUint32Result(uint32_t expected, Handle<Object> result) {
32 const int64_t result_int64 = NumberToInt64(*result);
33 const uint32_t result_uint32 = NumberToUint32(*result);
34
35 CHECK_EQ(static_cast<int64_t>(result_uint32), result_int64);
36 CHECK_EQ(expected, result_uint32);
37
38 // Ensure that the result is normalized to a Smi, i.e. a HeapNumber is only
39 // returned if the result is not within Smi range.
40 const bool expected_fits_into_intptr =
41 static_cast<int64_t>(expected) <=
42 static_cast<int64_t>(std::numeric_limits<intptr_t>::max());
43 if (expected_fits_into_intptr &&
44 Smi::IsValid(static_cast<intptr_t>(expected))) {
45 CHECK(result->IsSmi());
46 } else {
47 CHECK(result->IsHeapNumber());
48 }
49 }
50
51 } // namespace
52
53 TEST(ToUint32) {
54 Isolate* isolate(CcTest::InitIsolateOnce());
55 Factory* factory = isolate->factory();
56
57 const int kNumParams = 1;
58 CodeAssemblerTester data(isolate, kNumParams);
59 CodeStubAssembler m(data.state());
60
61 const int kContextOffset = 2;
62 Node* const context = m.Parameter(kNumParams + kContextOffset);
63 Node* const input = m.Parameter(0);
64 m.Return(m.ToUint32(context, input));
65
66 Handle<Code> code = data.GenerateCode();
67 FunctionTester ft(code, kNumParams);
68
69 // clang-format off
70 double inputs[] = {
71 std::nan("-1"), std::nan("1"), std::nan("2"),
72 -std::numeric_limits<double>::infinity(),
73 std::numeric_limits<double>::infinity(),
74 -0.0, -0.001, -0.5, -0.999, -1.0,
75 0.0, 0.001, 0.5, 0.999, 1.0,
76 -2147483647.9, -2147483648.0, -2147483648.5, -2147483648.9, // SmiMin.
77 2147483646.9, 2147483647.0, 2147483647.5, 2147483647.9, // SmiMax.
78 -4294967295.9, -4294967296.0, -4294967296.5, -4294967297.0, // - 2^32.
79 4294967295.9, 4294967296.0, 4294967296.5, 4294967297.0, // 2^32.
80 };
81
82 uint32_t expectations[] = {
83 0, 0, 0,
84 0,
85 0,
86 0, 0, 0, 0, 4294967295,
87 0, 0, 0, 0, 1,
88 2147483649, 2147483648, 2147483648, 2147483648,
89 2147483646, 2147483647, 2147483647, 2147483647,
90 1, 0, 0, 4294967295,
91 4294967295, 0, 0, 1,
92 };
93 // clang-format on
94
95 STATIC_ASSERT(arraysize(inputs) == arraysize(expectations));
96
97 const int test_count = arraysize(inputs);
98 for (int i = 0; i < test_count; i++) {
99 Handle<Object> input_obj = factory->NewNumber(inputs[i]);
100 Handle<HeapNumber> input_num;
101
102 // Check with Smi input.
103 if (input_obj->IsSmi()) {
104 Handle<Smi> input_smi = Handle<Smi>::cast(input_obj);
105 Handle<Object> result = ft.Call(input_smi).ToHandleChecked();
106 CheckToUint32Result(expectations[i], result);
107 input_num = factory->NewHeapNumber(inputs[i]);
108 } else {
109 input_num = Handle<HeapNumber>::cast(input_obj);
110 }
111
112 // Check with HeapNumber input.
113 {
114 CHECK(input_num->IsHeapNumber());
115 Handle<Object> result = ft.Call(input_num).ToHandleChecked();
116 CheckToUint32Result(expectations[i], result);
117 }
118 }
119
120 // A couple of final cases for ToNumber conversions.
121 CheckToUint32Result(0, ft.Call(factory->undefined_value()).ToHandleChecked());
122 CheckToUint32Result(0, ft.Call(factory->null_value()).ToHandleChecked());
123 CheckToUint32Result(0, ft.Call(factory->false_value()).ToHandleChecked());
124 CheckToUint32Result(1, ft.Call(factory->true_value()).ToHandleChecked());
125 CheckToUint32Result(
126 42,
127 ft.Call(factory->NewStringFromAsciiChecked("0x2A")).ToHandleChecked());
128
129 ft.CheckThrows(factory->match_symbol());
130 }
131
27 TEST(FixedArrayAccessSmiIndex) { 132 TEST(FixedArrayAccessSmiIndex) {
28 Isolate* isolate(CcTest::InitIsolateOnce()); 133 Isolate* isolate(CcTest::InitIsolateOnce());
29 CodeAssemblerTester data(isolate); 134 CodeAssemblerTester data(isolate);
30 CodeStubAssembler m(data.state()); 135 CodeStubAssembler m(data.state());
31 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5); 136 Handle<FixedArray> array = isolate->factory()->NewFixedArray(5);
32 array->set(4, Smi::FromInt(733)); 137 array->set(4, Smi::FromInt(733));
33 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array), 138 m.Return(m.LoadFixedArrayElement(m.HeapConstant(array),
34 m.SmiTag(m.Int32Constant(4)), 0, 139 m.SmiTag(m.Int32Constant(4)), 0,
35 CodeStubAssembler::SMI_PARAMETERS)); 140 CodeStubAssembler::SMI_PARAMETERS));
36 Handle<Code> code = data.GenerateCode(); 141 Handle<Code> code = data.GenerateCode();
(...skipping 2459 matching lines...) Expand 10 before | Expand all | Expand 10 after
2496 m.Return(m.SmiConstant(0)); 2601 m.Return(m.SmiConstant(0));
2497 2602
2498 Handle<Code> code = data.GenerateCode(); 2603 Handle<Code> code = data.GenerateCode();
2499 CHECK(!code.is_null()); 2604 CHECK(!code.is_null());
2500 FunctionTester ft(code, kNumParams); 2605 FunctionTester ft(code, kNumParams);
2501 CHECK_EQ(1, Handle<Smi>::cast(ft.Call().ToHandleChecked())->value()); 2606 CHECK_EQ(1, Handle<Smi>::cast(ft.Call().ToHandleChecked())->value());
2502 } 2607 }
2503 2608
2504 } // namespace internal 2609 } // namespace internal
2505 } // namespace v8 2610 } // namespace v8
OLDNEW
« no previous file with comments | « test/cctest/compiler/function-tester.cc ('k') | test/mjsunit/string-split.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698