OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 "src/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <memory> | 7 #include <memory> |
8 | 8 |
9 #include "src/bailout-reason.h" | 9 #include "src/bailout-reason.h" |
10 #include "src/crankshaft/hydrogen.h" | 10 #include "src/crankshaft/hydrogen.h" |
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
328 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; | 328 << timer.Elapsed().InMillisecondsF() << " ms]" << std::endl; |
329 } | 329 } |
330 return code; | 330 return code; |
331 } | 331 } |
332 | 332 |
333 | 333 |
334 template <> | 334 template <> |
335 HValue* CodeStubGraphBuilder<NumberToStringStub>::BuildCodeStub() { | 335 HValue* CodeStubGraphBuilder<NumberToStringStub>::BuildCodeStub() { |
336 info()->MarkAsSavesCallerDoubles(); | 336 info()->MarkAsSavesCallerDoubles(); |
337 HValue* number = GetParameter(Descriptor::kArgument); | 337 HValue* number = GetParameter(Descriptor::kArgument); |
338 return BuildNumberToString(number, Type::Number()); | 338 return BuildNumberToString(number, AstType::Number()); |
339 } | 339 } |
340 | 340 |
341 | 341 |
342 Handle<Code> NumberToStringStub::GenerateCode() { | 342 Handle<Code> NumberToStringStub::GenerateCode() { |
343 return DoGenerateCode(this); | 343 return DoGenerateCode(this); |
344 } | 344 } |
345 | 345 |
346 | 346 |
347 template <> | 347 template <> |
348 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { | 348 HValue* CodeStubGraphBuilder<FastCloneShallowArrayStub>::BuildCodeStub() { |
(...skipping 907 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 return DoGenerateCode(this); | 1256 return DoGenerateCode(this); |
1257 } | 1257 } |
1258 | 1258 |
1259 template <> | 1259 template <> |
1260 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { | 1260 HValue* CodeStubGraphBuilder<BinaryOpICStub>::BuildCodeInitializedStub() { |
1261 BinaryOpICState state = casted_stub()->state(); | 1261 BinaryOpICState state = casted_stub()->state(); |
1262 | 1262 |
1263 HValue* left = GetParameter(Descriptor::kLeft); | 1263 HValue* left = GetParameter(Descriptor::kLeft); |
1264 HValue* right = GetParameter(Descriptor::kRight); | 1264 HValue* right = GetParameter(Descriptor::kRight); |
1265 | 1265 |
1266 Type* left_type = state.GetLeftType(); | 1266 AstType* left_type = state.GetLeftType(); |
1267 Type* right_type = state.GetRightType(); | 1267 AstType* right_type = state.GetRightType(); |
1268 Type* result_type = state.GetResultType(); | 1268 AstType* result_type = state.GetResultType(); |
1269 | 1269 |
1270 DCHECK(!left_type->Is(Type::None()) && !right_type->Is(Type::None()) && | 1270 DCHECK(!left_type->Is(AstType::None()) && !right_type->Is(AstType::None()) && |
1271 (state.HasSideEffects() || !result_type->Is(Type::None()))); | 1271 (state.HasSideEffects() || !result_type->Is(AstType::None()))); |
1272 | 1272 |
1273 HValue* result = NULL; | 1273 HValue* result = NULL; |
1274 HAllocationMode allocation_mode(NOT_TENURED); | 1274 HAllocationMode allocation_mode(NOT_TENURED); |
1275 if (state.op() == Token::ADD && | 1275 if (state.op() == Token::ADD && (left_type->Maybe(AstType::String()) || |
1276 (left_type->Maybe(Type::String()) || right_type->Maybe(Type::String())) && | 1276 right_type->Maybe(AstType::String())) && |
1277 !left_type->Is(Type::String()) && !right_type->Is(Type::String())) { | 1277 !left_type->Is(AstType::String()) && !right_type->Is(AstType::String())) { |
1278 // For the generic add stub a fast case for string addition is performance | 1278 // For the generic add stub a fast case for string addition is performance |
1279 // critical. | 1279 // critical. |
1280 if (left_type->Maybe(Type::String())) { | 1280 if (left_type->Maybe(AstType::String())) { |
1281 IfBuilder if_leftisstring(this); | 1281 IfBuilder if_leftisstring(this); |
1282 if_leftisstring.If<HIsStringAndBranch>(left); | 1282 if_leftisstring.If<HIsStringAndBranch>(left); |
1283 if_leftisstring.Then(); | 1283 if_leftisstring.Then(); |
1284 { | 1284 { |
1285 Push(BuildBinaryOperation(state.op(), left, right, Type::String(), | 1285 Push(BuildBinaryOperation(state.op(), left, right, AstType::String(), |
1286 right_type, result_type, | 1286 right_type, result_type, |
1287 state.fixed_right_arg(), allocation_mode)); | 1287 state.fixed_right_arg(), allocation_mode)); |
1288 } | 1288 } |
1289 if_leftisstring.Else(); | 1289 if_leftisstring.Else(); |
1290 { | 1290 { |
1291 Push(BuildBinaryOperation(state.op(), left, right, left_type, | 1291 Push(BuildBinaryOperation(state.op(), left, right, left_type, |
1292 right_type, result_type, | 1292 right_type, result_type, |
1293 state.fixed_right_arg(), allocation_mode)); | 1293 state.fixed_right_arg(), allocation_mode)); |
1294 } | 1294 } |
1295 if_leftisstring.End(); | 1295 if_leftisstring.End(); |
1296 result = Pop(); | 1296 result = Pop(); |
1297 } else { | 1297 } else { |
1298 IfBuilder if_rightisstring(this); | 1298 IfBuilder if_rightisstring(this); |
1299 if_rightisstring.If<HIsStringAndBranch>(right); | 1299 if_rightisstring.If<HIsStringAndBranch>(right); |
1300 if_rightisstring.Then(); | 1300 if_rightisstring.Then(); |
1301 { | 1301 { |
1302 Push(BuildBinaryOperation(state.op(), left, right, left_type, | 1302 Push(BuildBinaryOperation(state.op(), left, right, left_type, |
1303 Type::String(), result_type, | 1303 AstType::String(), result_type, |
1304 state.fixed_right_arg(), allocation_mode)); | 1304 state.fixed_right_arg(), allocation_mode)); |
1305 } | 1305 } |
1306 if_rightisstring.Else(); | 1306 if_rightisstring.Else(); |
1307 { | 1307 { |
1308 Push(BuildBinaryOperation(state.op(), left, right, left_type, | 1308 Push(BuildBinaryOperation(state.op(), left, right, left_type, |
1309 right_type, result_type, | 1309 right_type, result_type, |
1310 state.fixed_right_arg(), allocation_mode)); | 1310 state.fixed_right_arg(), allocation_mode)); |
1311 } | 1311 } |
1312 if_rightisstring.End(); | 1312 if_rightisstring.End(); |
1313 result = Pop(); | 1313 result = Pop(); |
(...skipping 20 matching lines...) Expand all Loading... |
1334 | 1334 |
1335 | 1335 |
1336 template <> | 1336 template <> |
1337 HValue* CodeStubGraphBuilder<BinaryOpWithAllocationSiteStub>::BuildCodeStub() { | 1337 HValue* CodeStubGraphBuilder<BinaryOpWithAllocationSiteStub>::BuildCodeStub() { |
1338 BinaryOpICState state = casted_stub()->state(); | 1338 BinaryOpICState state = casted_stub()->state(); |
1339 | 1339 |
1340 HValue* allocation_site = GetParameter(Descriptor::kAllocationSite); | 1340 HValue* allocation_site = GetParameter(Descriptor::kAllocationSite); |
1341 HValue* left = GetParameter(Descriptor::kLeft); | 1341 HValue* left = GetParameter(Descriptor::kLeft); |
1342 HValue* right = GetParameter(Descriptor::kRight); | 1342 HValue* right = GetParameter(Descriptor::kRight); |
1343 | 1343 |
1344 Type* left_type = state.GetLeftType(); | 1344 AstType* left_type = state.GetLeftType(); |
1345 Type* right_type = state.GetRightType(); | 1345 AstType* right_type = state.GetRightType(); |
1346 Type* result_type = state.GetResultType(); | 1346 AstType* result_type = state.GetResultType(); |
1347 HAllocationMode allocation_mode(allocation_site); | 1347 HAllocationMode allocation_mode(allocation_site); |
1348 | 1348 |
1349 return BuildBinaryOperation(state.op(), left, right, left_type, right_type, | 1349 return BuildBinaryOperation(state.op(), left, right, left_type, right_type, |
1350 result_type, state.fixed_right_arg(), | 1350 result_type, state.fixed_right_arg(), |
1351 allocation_mode); | 1351 allocation_mode); |
1352 } | 1352 } |
1353 | 1353 |
1354 | 1354 |
1355 Handle<Code> BinaryOpWithAllocationSiteStub::GenerateCode() { | 1355 Handle<Code> BinaryOpWithAllocationSiteStub::GenerateCode() { |
1356 return DoGenerateCode(this); | 1356 return DoGenerateCode(this); |
1357 } | 1357 } |
1358 | 1358 |
1359 | 1359 |
1360 HValue* CodeStubGraphBuilderBase::BuildToString(HValue* input, bool convert) { | 1360 HValue* CodeStubGraphBuilderBase::BuildToString(HValue* input, bool convert) { |
1361 if (!convert) return BuildCheckString(input); | 1361 if (!convert) return BuildCheckString(input); |
1362 IfBuilder if_inputissmi(this); | 1362 IfBuilder if_inputissmi(this); |
1363 HValue* inputissmi = if_inputissmi.If<HIsSmiAndBranch>(input); | 1363 HValue* inputissmi = if_inputissmi.If<HIsSmiAndBranch>(input); |
1364 if_inputissmi.Then(); | 1364 if_inputissmi.Then(); |
1365 { | 1365 { |
1366 // Convert the input smi to a string. | 1366 // Convert the input smi to a string. |
1367 Push(BuildNumberToString(input, Type::SignedSmall())); | 1367 Push(BuildNumberToString(input, AstType::SignedSmall())); |
1368 } | 1368 } |
1369 if_inputissmi.Else(); | 1369 if_inputissmi.Else(); |
1370 { | 1370 { |
1371 HValue* input_map = | 1371 HValue* input_map = |
1372 Add<HLoadNamedField>(input, inputissmi, HObjectAccess::ForMap()); | 1372 Add<HLoadNamedField>(input, inputissmi, HObjectAccess::ForMap()); |
1373 HValue* input_instance_type = Add<HLoadNamedField>( | 1373 HValue* input_instance_type = Add<HLoadNamedField>( |
1374 input_map, inputissmi, HObjectAccess::ForMapInstanceType()); | 1374 input_map, inputissmi, HObjectAccess::ForMapInstanceType()); |
1375 IfBuilder if_inputisstring(this); | 1375 IfBuilder if_inputisstring(this); |
1376 if_inputisstring.If<HCompareNumericAndBranch>( | 1376 if_inputisstring.If<HCompareNumericAndBranch>( |
1377 input_instance_type, Add<HConstant>(FIRST_NONSTRING_TYPE), Token::LT); | 1377 input_instance_type, Add<HConstant>(FIRST_NONSTRING_TYPE), Token::LT); |
(...skipping 566 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1944 return Pop(); | 1944 return Pop(); |
1945 } | 1945 } |
1946 | 1946 |
1947 | 1947 |
1948 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 1948 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
1949 return DoGenerateCode(this); | 1949 return DoGenerateCode(this); |
1950 } | 1950 } |
1951 | 1951 |
1952 } // namespace internal | 1952 } // namespace internal |
1953 } // namespace v8 | 1953 } // namespace v8 |
OLD | NEW |