Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 "src/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/execution.h" | 7 #include "src/execution.h" |
| 8 #include "src/handles.h" | 8 #include "src/handles.h" |
| 9 #include "src/interpreter/bytecode-array-builder.h" | 9 #include "src/interpreter/bytecode-array-builder.h" |
| 10 #include "src/interpreter/bytecode-array-iterator.h" | 10 #include "src/interpreter/bytecode-array-iterator.h" |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 274 Register reg(0); | 274 Register reg(0); |
| 275 int lhs = lhs_inputs[l]; | 275 int lhs = lhs_inputs[l]; |
| 276 int rhs = rhs_inputs[r]; | 276 int rhs = rhs_inputs[r]; |
| 277 builder.LoadLiteral(Smi::FromInt(lhs)) | 277 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 278 .StoreAccumulatorInRegister(reg) | 278 .StoreAccumulatorInRegister(reg) |
| 279 .LoadLiteral(Smi::FromInt(rhs)) | 279 .LoadLiteral(Smi::FromInt(rhs)) |
| 280 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot)) | 280 .BinaryOperation(kShiftOperators[o], reg, vector->GetIndex(slot)) |
| 281 .Return(); | 281 .Return(); |
| 282 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 282 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 283 | 283 |
| 284 InterpreterTester tester(isolate, bytecode_array); | 284 InterpreterTester tester(isolate, bytecode_array, vector); |
| 285 auto callable = tester.GetCallable<>(); | 285 auto callable = tester.GetCallable<>(); |
| 286 Handle<Object> return_value = callable().ToHandleChecked(); | 286 Handle<Object> return_value = callable().ToHandleChecked(); |
| 287 Handle<Object> expected_value = | 287 Handle<Object> expected_value = |
| 288 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs)); | 288 factory->NewNumber(BinaryOpC(kShiftOperators[o], lhs, rhs)); |
| 289 CHECK(return_value->SameValue(*expected_value)); | 289 CHECK(return_value->SameValue(*expected_value)); |
| 290 } | 290 } |
| 291 } | 291 } |
| 292 } | 292 } |
| 293 } | 293 } |
| 294 | 294 |
| (...skipping 19 matching lines...) Expand all Loading... | |
| 314 int lhs = lhs_inputs[l]; | 314 int lhs = lhs_inputs[l]; |
| 315 int rhs = rhs_inputs[r]; | 315 int rhs = rhs_inputs[r]; |
| 316 builder.LoadLiteral(Smi::FromInt(lhs)) | 316 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 317 .StoreAccumulatorInRegister(reg) | 317 .StoreAccumulatorInRegister(reg) |
| 318 .LoadLiteral(Smi::FromInt(rhs)) | 318 .LoadLiteral(Smi::FromInt(rhs)) |
| 319 .BinaryOperation(kArithmeticOperators[o], reg, | 319 .BinaryOperation(kArithmeticOperators[o], reg, |
| 320 vector->GetIndex(slot)) | 320 vector->GetIndex(slot)) |
| 321 .Return(); | 321 .Return(); |
| 322 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 322 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 323 | 323 |
| 324 InterpreterTester tester(isolate, bytecode_array); | 324 InterpreterTester tester(isolate, bytecode_array, vector); |
| 325 auto callable = tester.GetCallable<>(); | 325 auto callable = tester.GetCallable<>(); |
| 326 Handle<Object> return_value = callable().ToHandleChecked(); | 326 Handle<Object> return_value = callable().ToHandleChecked(); |
| 327 Handle<Object> expected_value = | 327 Handle<Object> expected_value = |
| 328 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 328 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 329 CHECK(return_value->SameValue(*expected_value)); | 329 CHECK(return_value->SameValue(*expected_value)); |
| 330 } | 330 } |
| 331 } | 331 } |
| 332 } | 332 } |
| 333 } | 333 } |
| 334 | 334 |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 355 double lhs = lhs_inputs[l]; | 355 double lhs = lhs_inputs[l]; |
| 356 double rhs = rhs_inputs[r]; | 356 double rhs = rhs_inputs[r]; |
| 357 builder.LoadLiteral(factory->NewNumber(lhs)) | 357 builder.LoadLiteral(factory->NewNumber(lhs)) |
| 358 .StoreAccumulatorInRegister(reg) | 358 .StoreAccumulatorInRegister(reg) |
| 359 .LoadLiteral(factory->NewNumber(rhs)) | 359 .LoadLiteral(factory->NewNumber(rhs)) |
| 360 .BinaryOperation(kArithmeticOperators[o], reg, | 360 .BinaryOperation(kArithmeticOperators[o], reg, |
| 361 vector->GetIndex(slot)) | 361 vector->GetIndex(slot)) |
| 362 .Return(); | 362 .Return(); |
| 363 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 363 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 364 | 364 |
| 365 InterpreterTester tester(isolate, bytecode_array); | 365 InterpreterTester tester(isolate, bytecode_array, vector); |
| 366 auto callable = tester.GetCallable<>(); | 366 auto callable = tester.GetCallable<>(); |
| 367 Handle<Object> return_value = callable().ToHandleChecked(); | 367 Handle<Object> return_value = callable().ToHandleChecked(); |
| 368 Handle<Object> expected_value = | 368 Handle<Object> expected_value = |
| 369 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); | 369 factory->NewNumber(BinaryOpC(kArithmeticOperators[o], lhs, rhs)); |
| 370 CHECK(return_value->SameValue(*expected_value)); | 370 CHECK(return_value->SameValue(*expected_value)); |
| 371 } | 371 } |
| 372 } | 372 } |
| 373 } | 373 } |
| 374 } | 374 } |
| 375 | 375 |
| (...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 502 Handle<Smi> arg6 = Handle<Smi>(Smi::FromInt(6), handles.main_isolate()); | 502 Handle<Smi> arg6 = Handle<Smi>(Smi::FromInt(6), handles.main_isolate()); |
| 503 Handle<Smi> arg7 = Handle<Smi>(Smi::FromInt(7), handles.main_isolate()); | 503 Handle<Smi> arg7 = Handle<Smi>(Smi::FromInt(7), handles.main_isolate()); |
| 504 Handle<Smi> arg8 = Handle<Smi>(Smi::FromInt(8), handles.main_isolate()); | 504 Handle<Smi> arg8 = Handle<Smi>(Smi::FromInt(8), handles.main_isolate()); |
| 505 // Check for Smis. | 505 // Check for Smis. |
| 506 Handle<Object> return_val = | 506 Handle<Object> return_val = |
| 507 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) | 507 callable(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) |
| 508 .ToHandleChecked(); | 508 .ToHandleChecked(); |
| 509 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); | 509 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(36)); |
| 510 } | 510 } |
| 511 | 511 |
| 512 TEST(InterpreterBinaryOpTypeFeedback) { | 512 TEST(InterpreterBinaryOpTypeFeedback) { |
|
rmcilroy
2016/08/23 10:28:53
Could you add a variant of these tests which take
epertoso
2016/08/23 13:24:28
Done.
| |
| 513 HandleAndZoneScope handles; | 513 HandleAndZoneScope handles; |
| 514 i::Isolate* isolate = handles.main_isolate(); | 514 i::Isolate* isolate = handles.main_isolate(); |
| 515 i::Zone zone(isolate->allocator()); | 515 i::Zone zone(isolate->allocator()); |
| 516 | 516 |
| 517 struct BinaryOpExpectation { | 517 struct BinaryOpExpectation { |
| 518 Token::Value op; | 518 Token::Value op; |
| 519 Handle<Object> arg1; | 519 Handle<Object> arg1; |
| 520 Handle<Object> arg2; | 520 Handle<Object> arg2; |
| 521 Handle<Object> result; | 521 Handle<Object> result; |
| 522 int32_t feedback; | 522 int32_t feedback; |
| (...skipping 202 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 725 CHECK_EQ(BinaryOperationFeedback::kNumber, | 725 CHECK_EQ(BinaryOperationFeedback::kNumber, |
| 726 static_cast<Smi*>(feedback2)->value()); | 726 static_cast<Smi*>(feedback2)->value()); |
| 727 | 727 |
| 728 Object* feedback3 = vector->Get(slot3); | 728 Object* feedback3 = vector->Get(slot3); |
| 729 CHECK(feedback3->IsSmi()); | 729 CHECK(feedback3->IsSmi()); |
| 730 CHECK_EQ(BinaryOperationFeedback::kAny, | 730 CHECK_EQ(BinaryOperationFeedback::kAny, |
| 731 static_cast<Smi*>(feedback3)->value()); | 731 static_cast<Smi*>(feedback3)->value()); |
| 732 } | 732 } |
| 733 } | 733 } |
| 734 | 734 |
| 735 TEST(InterpreterBitwiseTypeFeedback) { | 735 TEST(InterpreterBitwiseTypeFeedback) { |
|
rmcilroy
2016/08/23 10:28:53
Ditto with the bitwise SMI variants.
epertoso
2016/08/23 13:24:28
Done.
| |
| 736 HandleAndZoneScope handles; | 736 HandleAndZoneScope handles; |
| 737 i::Isolate* isolate = handles.main_isolate(); | 737 i::Isolate* isolate = handles.main_isolate(); |
| 738 i::Zone zone(isolate->allocator()); | 738 i::Zone zone(isolate->allocator()); |
| 739 const Token::Value kBitwiseBinaryOperators[] = { | 739 const Token::Value kBitwiseBinaryOperators[] = { |
| 740 Token::Value::BIT_OR, Token::Value::BIT_XOR, Token::Value::BIT_AND, | 740 Token::Value::BIT_OR, Token::Value::BIT_XOR, Token::Value::BIT_AND, |
| 741 Token::Value::SHL, Token::Value::SHR, Token::Value::SAR}; | 741 Token::Value::SHL, Token::Value::SHR, Token::Value::SAR}; |
| 742 | 742 |
| 743 for (Token::Value op : kBitwiseBinaryOperators) { | 743 for (Token::Value op : kBitwiseBinaryOperators) { |
| 744 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); | 744 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 4, 0, 0); |
| 745 | 745 |
| (...skipping 558 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1304 .Jump(&label[2]); | 1304 .Jump(&label[2]); |
| 1305 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); | 1305 SetRegister(builder, reg, 2048, scratch).Bind(&label[1]); |
| 1306 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1)) | 1306 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot1)) |
| 1307 .Jump(&label[0]); | 1307 .Jump(&label[0]); |
| 1308 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); | 1308 SetRegister(builder, reg, 4096, scratch).Bind(&label[2]); |
| 1309 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2)) | 1309 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot2)) |
| 1310 .LoadAccumulatorWithRegister(reg) | 1310 .LoadAccumulatorWithRegister(reg) |
| 1311 .Return(); | 1311 .Return(); |
| 1312 | 1312 |
| 1313 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1313 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 1314 InterpreterTester tester(isolate, bytecode_array); | 1314 InterpreterTester tester(isolate, bytecode_array, vector); |
| 1315 auto callable = tester.GetCallable<>(); | 1315 auto callable = tester.GetCallable<>(); |
| 1316 Handle<Object> return_value = callable().ToHandleChecked(); | 1316 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1317 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | 1317 CHECK_EQ(Smi::cast(*return_value)->value(), 7); |
| 1318 } | 1318 } |
| 1319 | 1319 |
| 1320 | 1320 |
| 1321 TEST(InterpreterConditionalJumps) { | 1321 TEST(InterpreterConditionalJumps) { |
| 1322 HandleAndZoneScope handles; | 1322 HandleAndZoneScope handles; |
| 1323 Isolate* isolate = handles.main_isolate(); | 1323 Isolate* isolate = handles.main_isolate(); |
| 1324 Zone zone(isolate->allocator()); | 1324 Zone zone(isolate->allocator()); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1354 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) | 1354 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) |
| 1355 .LoadFalse() | 1355 .LoadFalse() |
| 1356 .JumpIfTrue(&done1); | 1356 .JumpIfTrue(&done1); |
| 1357 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) | 1357 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) |
| 1358 .LoadAccumulatorWithRegister(reg) | 1358 .LoadAccumulatorWithRegister(reg) |
| 1359 .Bind(&done) | 1359 .Bind(&done) |
| 1360 .Bind(&done1) | 1360 .Bind(&done1) |
| 1361 .Return(); | 1361 .Return(); |
| 1362 | 1362 |
| 1363 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1363 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 1364 InterpreterTester tester(isolate, bytecode_array); | 1364 InterpreterTester tester(isolate, bytecode_array, vector); |
| 1365 auto callable = tester.GetCallable<>(); | 1365 auto callable = tester.GetCallable<>(); |
| 1366 Handle<Object> return_value = callable().ToHandleChecked(); | 1366 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1367 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | 1367 CHECK_EQ(Smi::cast(*return_value)->value(), 7); |
| 1368 } | 1368 } |
| 1369 | 1369 |
| 1370 TEST(InterpreterConditionalJumps2) { | 1370 TEST(InterpreterConditionalJumps2) { |
| 1371 // TODO(oth): Add tests for all conditional jumps near and far. | 1371 // TODO(oth): Add tests for all conditional jumps near and far. |
| 1372 HandleAndZoneScope handles; | 1372 HandleAndZoneScope handles; |
| 1373 Isolate* isolate = handles.main_isolate(); | 1373 Isolate* isolate = handles.main_isolate(); |
| 1374 Zone zone(isolate->allocator()); | 1374 Zone zone(isolate->allocator()); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 1404 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) | 1404 IncrementRegister(builder, reg, 2, scratch, vector->GetIndex(slot3)) |
| 1405 .LoadFalse() | 1405 .LoadFalse() |
| 1406 .JumpIfTrue(&done1); | 1406 .JumpIfTrue(&done1); |
| 1407 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) | 1407 IncrementRegister(builder, reg, 4, scratch, vector->GetIndex(slot4)) |
| 1408 .LoadAccumulatorWithRegister(reg) | 1408 .LoadAccumulatorWithRegister(reg) |
| 1409 .Bind(&done) | 1409 .Bind(&done) |
| 1410 .Bind(&done1) | 1410 .Bind(&done1) |
| 1411 .Return(); | 1411 .Return(); |
| 1412 | 1412 |
| 1413 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); | 1413 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(isolate); |
| 1414 InterpreterTester tester(isolate, bytecode_array); | 1414 InterpreterTester tester(isolate, bytecode_array, vector); |
| 1415 auto callable = tester.GetCallable<>(); | 1415 auto callable = tester.GetCallable<>(); |
| 1416 Handle<Object> return_value = callable().ToHandleChecked(); | 1416 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1417 CHECK_EQ(Smi::cast(*return_value)->value(), 7); | 1417 CHECK_EQ(Smi::cast(*return_value)->value(), 7); |
| 1418 } | 1418 } |
| 1419 | 1419 |
| 1420 TEST(InterpreterJumpConstantWith16BitOperand) { | 1420 TEST(InterpreterJumpConstantWith16BitOperand) { |
| 1421 HandleAndZoneScope handles; | 1421 HandleAndZoneScope handles; |
| 1422 Isolate* isolate = handles.main_isolate(); | 1422 Isolate* isolate = handles.main_isolate(); |
| 1423 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 257); | 1423 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 257); |
| 1424 | 1424 |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1462 while (!iterator.done()) { | 1462 while (!iterator.done()) { |
| 1463 if (iterator.current_bytecode() == Bytecode::kJumpConstant && | 1463 if (iterator.current_bytecode() == Bytecode::kJumpConstant && |
| 1464 iterator.current_operand_scale() == OperandScale::kDouble) { | 1464 iterator.current_operand_scale() == OperandScale::kDouble) { |
| 1465 found_16bit_constant_jump = true; | 1465 found_16bit_constant_jump = true; |
| 1466 break; | 1466 break; |
| 1467 } | 1467 } |
| 1468 iterator.Advance(); | 1468 iterator.Advance(); |
| 1469 } | 1469 } |
| 1470 CHECK(found_16bit_constant_jump); | 1470 CHECK(found_16bit_constant_jump); |
| 1471 | 1471 |
| 1472 InterpreterTester tester(isolate, bytecode_array); | 1472 InterpreterTester tester(isolate, bytecode_array, vector); |
| 1473 auto callable = tester.GetCallable<>(); | 1473 auto callable = tester.GetCallable<>(); |
| 1474 Handle<Object> return_value = callable().ToHandleChecked(); | 1474 Handle<Object> return_value = callable().ToHandleChecked(); |
| 1475 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256)); | 1475 CHECK_EQ(Smi::cast(*return_value)->value(), 256.0 / 2 * (1 + 256)); |
| 1476 } | 1476 } |
| 1477 | 1477 |
| 1478 TEST(InterpreterJumpWith32BitOperand) { | 1478 TEST(InterpreterJumpWith32BitOperand) { |
| 1479 HandleAndZoneScope handles; | 1479 HandleAndZoneScope handles; |
| 1480 Isolate* isolate = handles.main_isolate(); | 1480 Isolate* isolate = handles.main_isolate(); |
| 1481 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); | 1481 BytecodeArrayBuilder builder(isolate, handles.main_zone(), 1, 0, 1); |
| 1482 Register reg(0); | 1482 Register reg(0); |
| (...skipping 3093 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4576 auto callable = tester.GetCallable<>(); | 4576 auto callable = tester.GetCallable<>(); |
| 4577 | 4577 |
| 4578 Handle<i::Object> return_value = callable().ToHandleChecked(); | 4578 Handle<i::Object> return_value = callable().ToHandleChecked(); |
| 4579 CHECK(return_value->SameValue(*tests[i].second)); | 4579 CHECK(return_value->SameValue(*tests[i].second)); |
| 4580 } | 4580 } |
| 4581 } | 4581 } |
| 4582 | 4582 |
| 4583 } // namespace interpreter | 4583 } // namespace interpreter |
| 4584 } // namespace internal | 4584 } // namespace internal |
| 4585 } // namespace v8 | 4585 } // namespace v8 |
| OLD | NEW |