bd4038ed91997339de5e161996e4879e11a5df8f
[platform/upstream/nodejs.git] / deps / v8 / test / cctest / compiler / test-run-intrinsics.cc
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "src/v8.h"
6
7 #include "test/cctest/compiler/function-tester.h"
8
9 using namespace v8::internal;
10 using namespace v8::internal::compiler;
11 uint32_t flags = CompilationInfo::kInliningEnabled;
12
13 TEST(IsSmi) {
14   FLAG_turbo_deoptimization = true;
15   FunctionTester T("(function(a) { return %_IsSmi(a); })", flags);
16
17   T.CheckTrue(T.Val(1));
18   T.CheckFalse(T.Val(1.1));
19   T.CheckFalse(T.Val(-0.0));
20   T.CheckTrue(T.Val(-2));
21   T.CheckFalse(T.Val(-2.3));
22   T.CheckFalse(T.undefined());
23 }
24
25
26 TEST(IsNonNegativeSmi) {
27   FLAG_turbo_deoptimization = true;
28   FunctionTester T("(function(a) { return %_IsNonNegativeSmi(a); })", flags);
29
30   T.CheckTrue(T.Val(1));
31   T.CheckFalse(T.Val(1.1));
32   T.CheckFalse(T.Val(-0.0));
33   T.CheckFalse(T.Val(-2));
34   T.CheckFalse(T.Val(-2.3));
35   T.CheckFalse(T.undefined());
36 }
37
38
39 TEST(IsMinusZero) {
40   FLAG_turbo_deoptimization = true;
41   FunctionTester T("(function(a) { return %_IsMinusZero(a); })", flags);
42
43   T.CheckFalse(T.Val(1));
44   T.CheckFalse(T.Val(1.1));
45   T.CheckTrue(T.Val(-0.0));
46   T.CheckFalse(T.Val(-2));
47   T.CheckFalse(T.Val(-2.3));
48   T.CheckFalse(T.undefined());
49 }
50
51
52 TEST(IsArray) {
53   FLAG_turbo_deoptimization = true;
54   FunctionTester T("(function(a) { return %_IsArray(a); })", flags);
55
56   T.CheckFalse(T.NewObject("(function() {})"));
57   T.CheckTrue(T.NewObject("([1])"));
58   T.CheckFalse(T.NewObject("({})"));
59   T.CheckFalse(T.NewObject("(/x/)"));
60   T.CheckFalse(T.undefined());
61   T.CheckFalse(T.null());
62   T.CheckFalse(T.Val("x"));
63   T.CheckFalse(T.Val(1));
64 }
65
66
67 TEST(IsObject) {
68   FLAG_turbo_deoptimization = true;
69   FunctionTester T("(function(a) { return %_IsObject(a); })", flags);
70
71   T.CheckFalse(T.NewObject("(function() {})"));
72   T.CheckTrue(T.NewObject("([1])"));
73   T.CheckTrue(T.NewObject("({})"));
74   T.CheckTrue(T.NewObject("(/x/)"));
75   T.CheckFalse(T.undefined());
76   T.CheckTrue(T.null());
77   T.CheckFalse(T.Val("x"));
78   T.CheckFalse(T.Val(1));
79 }
80
81
82 TEST(IsFunction) {
83   FLAG_turbo_deoptimization = true;
84   FunctionTester T("(function(a) { return %_IsFunction(a); })", flags);
85
86   T.CheckTrue(T.NewObject("(function() {})"));
87   T.CheckFalse(T.NewObject("([1])"));
88   T.CheckFalse(T.NewObject("({})"));
89   T.CheckFalse(T.NewObject("(/x/)"));
90   T.CheckFalse(T.undefined());
91   T.CheckFalse(T.null());
92   T.CheckFalse(T.Val("x"));
93   T.CheckFalse(T.Val(1));
94 }
95
96
97 TEST(IsRegExp) {
98   FLAG_turbo_deoptimization = true;
99   FunctionTester T("(function(a) { return %_IsRegExp(a); })", flags);
100
101   T.CheckFalse(T.NewObject("(function() {})"));
102   T.CheckFalse(T.NewObject("([1])"));
103   T.CheckFalse(T.NewObject("({})"));
104   T.CheckTrue(T.NewObject("(/x/)"));
105   T.CheckFalse(T.undefined());
106   T.CheckFalse(T.null());
107   T.CheckFalse(T.Val("x"));
108   T.CheckFalse(T.Val(1));
109 }
110
111
112 TEST(ClassOf) {
113   FLAG_turbo_deoptimization = true;
114   FunctionTester T("(function(a) { return %_ClassOf(a); })", flags);
115
116   T.CheckCall(T.Val("Function"), T.NewObject("(function() {})"));
117   T.CheckCall(T.Val("Array"), T.NewObject("([1])"));
118   T.CheckCall(T.Val("Object"), T.NewObject("({})"));
119   T.CheckCall(T.Val("RegExp"), T.NewObject("(/x/)"));
120   T.CheckCall(T.null(), T.undefined());
121   T.CheckCall(T.null(), T.null());
122   T.CheckCall(T.null(), T.Val("x"));
123   T.CheckCall(T.null(), T.Val(1));
124 }
125
126
127 TEST(ObjectEquals) {
128   FLAG_turbo_deoptimization = true;
129   FunctionTester T("(function(a,b) { return %_ObjectEquals(a,b); })", flags);
130   CompileRun("var o = {}");
131
132   T.CheckTrue(T.NewObject("(o)"), T.NewObject("(o)"));
133   T.CheckTrue(T.Val("internal"), T.Val("internal"));
134   T.CheckTrue(T.true_value(), T.true_value());
135   T.CheckFalse(T.true_value(), T.false_value());
136   T.CheckFalse(T.NewObject("({})"), T.NewObject("({})"));
137   T.CheckFalse(T.Val("a"), T.Val("b"));
138 }
139
140
141 TEST(ValueOf) {
142   FLAG_turbo_deoptimization = true;
143   FunctionTester T("(function(a) { return %_ValueOf(a); })", flags);
144
145   T.CheckCall(T.Val("a"), T.Val("a"));
146   T.CheckCall(T.Val("b"), T.NewObject("(new String('b'))"));
147   T.CheckCall(T.Val(123), T.Val(123));
148   T.CheckCall(T.Val(456), T.NewObject("(new Number(456))"));
149 }
150
151
152 TEST(SetValueOf) {
153   FLAG_turbo_deoptimization = true;
154   FunctionTester T("(function(a,b) { return %_SetValueOf(a,b); })", flags);
155
156   T.CheckCall(T.Val("a"), T.NewObject("(new String)"), T.Val("a"));
157   T.CheckCall(T.Val(123), T.NewObject("(new Number)"), T.Val(123));
158   T.CheckCall(T.Val("x"), T.undefined(), T.Val("x"));
159 }
160
161
162 TEST(StringCharFromCode) {
163   FLAG_turbo_deoptimization = true;
164   FunctionTester T("(function(a) { return %_StringCharFromCode(a); })", flags);
165
166   T.CheckCall(T.Val("a"), T.Val(97));
167   T.CheckCall(T.Val("\xE2\x9D\x8A"), T.Val(0x274A));
168   T.CheckCall(T.Val(""), T.undefined());
169 }
170
171
172 TEST(StringCharAt) {
173   FLAG_turbo_deoptimization = true;
174   FunctionTester T("(function(a,b) { return %_StringCharAt(a,b); })", flags);
175
176   T.CheckCall(T.Val("e"), T.Val("huge fan!"), T.Val(3));
177   T.CheckCall(T.Val("f"), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
178   T.CheckCall(T.Val(""), T.Val("not a fan!"), T.Val(23));
179 }
180
181
182 TEST(StringCharCodeAt) {
183   FLAG_turbo_deoptimization = true;
184   FunctionTester T("(function(a,b) { return %_StringCharCodeAt(a,b); })",
185                    flags);
186
187   T.CheckCall(T.Val('e'), T.Val("huge fan!"), T.Val(3));
188   T.CheckCall(T.Val('f'), T.Val("\xE2\x9D\x8A fan!"), T.Val(2));
189   T.CheckCall(T.nan(), T.Val("not a fan!"), T.Val(23));
190 }
191
192
193 TEST(StringAdd) {
194   FLAG_turbo_deoptimization = true;
195   FunctionTester T("(function(a,b) { return %_StringAdd(a,b); })", flags);
196
197   T.CheckCall(T.Val("aaabbb"), T.Val("aaa"), T.Val("bbb"));
198   T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(""));
199   T.CheckCall(T.Val("bbb"), T.Val(""), T.Val("bbb"));
200 }
201
202
203 TEST(StringSubString) {
204   FLAG_turbo_deoptimization = true;
205   FunctionTester T("(function(a,b) { return %_SubString(a,b,b+3); })", flags);
206
207   T.CheckCall(T.Val("aaa"), T.Val("aaabbb"), T.Val(0.0));
208   T.CheckCall(T.Val("abb"), T.Val("aaabbb"), T.Val(2));
209   T.CheckCall(T.Val("aaa"), T.Val("aaa"), T.Val(0.0));
210 }
211
212
213 TEST(StringCompare) {
214   FLAG_turbo_deoptimization = true;
215   FunctionTester T("(function(a,b) { return %_StringCompare(a,b); })", flags);
216
217   T.CheckCall(T.Val(-1), T.Val("aaa"), T.Val("bbb"));
218   T.CheckCall(T.Val(0.0), T.Val("bbb"), T.Val("bbb"));
219   T.CheckCall(T.Val(+1), T.Val("ccc"), T.Val("bbb"));
220 }
221
222
223 TEST(CallFunction) {
224   FLAG_turbo_deoptimization = true;
225   FunctionTester T("(function(a,b) { return %_CallFunction(a, 1, 2, 3, b); })",
226                    flags);
227   CompileRun("function f(a,b,c) { return a + b + c + this.d; }");
228
229   T.CheckCall(T.Val(129), T.NewObject("({d:123})"), T.NewObject("f"));
230   T.CheckCall(T.Val("6x"), T.NewObject("({d:'x'})"), T.NewObject("f"));
231 }