| 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/interpreter.h" | 10 #include "src/interpreter/interpreter.h" |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 343 | 343 |
| 344 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 344 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 345 auto callable = tester.GetCallable<>(); | 345 auto callable = tester.GetCallable<>(); |
| 346 Handle<Object> return_val = callable().ToHandleChecked(); | 346 Handle<Object> return_val = callable().ToHandleChecked(); |
| 347 CHECK(return_val.is_identical_to(true_value)); | 347 CHECK(return_val.is_identical_to(true_value)); |
| 348 } | 348 } |
| 349 } | 349 } |
| 350 | 350 |
| 351 | 351 |
| 352 static const Token::Value kArithmeticOperators[] = { | 352 static const Token::Value kArithmeticOperators[] = { |
| 353 Token::Value::ADD, Token::Value::SUB, Token::Value::MUL, Token::Value::DIV, | 353 Token::Value::BIT_OR, Token::Value::BIT_XOR, Token::Value::BIT_AND, |
| 354 Token::Value::MOD}; | 354 Token::Value::ADD, Token::Value::SUB, Token::Value::MUL, |
| 355 Token::Value::DIV, Token::Value::MOD}; |
| 355 | 356 |
| 356 | 357 |
| 357 static double BinaryOpC(Token::Value op, double lhs, double rhs) { | 358 static double BinaryOpC(Token::Value op, double lhs, double rhs) { |
| 358 switch (op) { | 359 switch (op) { |
| 360 case Token::Value::BIT_OR: |
| 361 return (v8::internal::DoubleToInt32(lhs) | |
| 362 v8::internal::DoubleToInt32(rhs)); |
| 363 case Token::Value::BIT_XOR: |
| 364 return (v8::internal::DoubleToInt32(lhs) ^ |
| 365 v8::internal::DoubleToInt32(rhs)); |
| 366 case Token::Value::BIT_AND: |
| 367 return (v8::internal::DoubleToInt32(lhs) & |
| 368 v8::internal::DoubleToInt32(rhs)); |
| 359 case Token::Value::ADD: | 369 case Token::Value::ADD: |
| 360 return lhs + rhs; | 370 return lhs + rhs; |
| 361 case Token::Value::SUB: | 371 case Token::Value::SUB: |
| 362 return lhs - rhs; | 372 return lhs - rhs; |
| 363 case Token::Value::MUL: | 373 case Token::Value::MUL: |
| 364 return lhs * rhs; | 374 return lhs * rhs; |
| 365 case Token::Value::DIV: | 375 case Token::Value::DIV: |
| 366 return lhs / rhs; | 376 return lhs / rhs; |
| 367 case Token::Value::MOD: | 377 case Token::Value::MOD: |
| 368 return std::fmod(lhs, rhs); | 378 return std::fmod(lhs, rhs); |
| (...skipping 11 matching lines...) Expand all Loading... |
| 380 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 390 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
| 381 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 391 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
| 382 HandleAndZoneScope handles; | 392 HandleAndZoneScope handles; |
| 383 i::Factory* factory = handles.main_isolate()->factory(); | 393 i::Factory* factory = handles.main_isolate()->factory(); |
| 384 BytecodeArrayBuilder builder(handles.main_isolate(), | 394 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 385 handles.main_zone()); | 395 handles.main_zone()); |
| 386 builder.set_locals_count(1); | 396 builder.set_locals_count(1); |
| 387 builder.set_parameter_count(1); | 397 builder.set_parameter_count(1); |
| 388 Register reg(0); | 398 Register reg(0); |
| 389 int lhs = lhs_inputs[l]; | 399 int lhs = lhs_inputs[l]; |
| 390 int rhs = rhs_inputs[l]; | 400 int rhs = rhs_inputs[r]; |
| 391 builder.LoadLiteral(Smi::FromInt(lhs)) | 401 builder.LoadLiteral(Smi::FromInt(lhs)) |
| 392 .StoreAccumulatorInRegister(reg) | 402 .StoreAccumulatorInRegister(reg) |
| 393 .LoadLiteral(Smi::FromInt(rhs)) | 403 .LoadLiteral(Smi::FromInt(rhs)) |
| 394 .BinaryOperation(kArithmeticOperators[o], reg) | 404 .BinaryOperation(kArithmeticOperators[o], reg) |
| 395 .Return(); | 405 .Return(); |
| 396 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 406 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 397 | 407 |
| 398 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 408 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 399 auto callable = tester.GetCallable<>(); | 409 auto callable = tester.GetCallable<>(); |
| 400 Handle<Object> return_value = callable().ToHandleChecked(); | 410 Handle<Object> return_value = callable().ToHandleChecked(); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 415 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { | 425 for (size_t r = 0; r < arraysize(rhs_inputs); r++) { |
| 416 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { | 426 for (size_t o = 0; o < arraysize(kArithmeticOperators); o++) { |
| 417 HandleAndZoneScope handles; | 427 HandleAndZoneScope handles; |
| 418 i::Factory* factory = handles.main_isolate()->factory(); | 428 i::Factory* factory = handles.main_isolate()->factory(); |
| 419 BytecodeArrayBuilder builder(handles.main_isolate(), | 429 BytecodeArrayBuilder builder(handles.main_isolate(), |
| 420 handles.main_zone()); | 430 handles.main_zone()); |
| 421 builder.set_locals_count(1); | 431 builder.set_locals_count(1); |
| 422 builder.set_parameter_count(1); | 432 builder.set_parameter_count(1); |
| 423 Register reg(0); | 433 Register reg(0); |
| 424 double lhs = lhs_inputs[l]; | 434 double lhs = lhs_inputs[l]; |
| 425 double rhs = rhs_inputs[l]; | 435 double rhs = rhs_inputs[r]; |
| 426 builder.LoadLiteral(factory->NewNumber(lhs)) | 436 builder.LoadLiteral(factory->NewNumber(lhs)) |
| 427 .StoreAccumulatorInRegister(reg) | 437 .StoreAccumulatorInRegister(reg) |
| 428 .LoadLiteral(factory->NewNumber(rhs)) | 438 .LoadLiteral(factory->NewNumber(rhs)) |
| 429 .BinaryOperation(kArithmeticOperators[o], reg) | 439 .BinaryOperation(kArithmeticOperators[o], reg) |
| 430 .Return(); | 440 .Return(); |
| 431 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 441 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 432 | 442 |
| 433 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 443 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 434 auto callable = tester.GetCallable<>(); | 444 auto callable = tester.GetCallable<>(); |
| 435 Handle<Object> return_value = callable().ToHandleChecked(); | 445 Handle<Object> return_value = callable().ToHandleChecked(); |
| (...skipping 868 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1304 .CallRuntime(Runtime::kAdd, Register(0), 2) | 1314 .CallRuntime(Runtime::kAdd, Register(0), 2) |
| 1305 .Return(); | 1315 .Return(); |
| 1306 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 1316 Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); |
| 1307 | 1317 |
| 1308 InterpreterTester tester(handles.main_isolate(), bytecode_array); | 1318 InterpreterTester tester(handles.main_isolate(), bytecode_array); |
| 1309 auto callable = tester.GetCallable<>(); | 1319 auto callable = tester.GetCallable<>(); |
| 1310 | 1320 |
| 1311 Handle<Object> return_val = callable().ToHandleChecked(); | 1321 Handle<Object> return_val = callable().ToHandleChecked(); |
| 1312 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(55)); | 1322 CHECK_EQ(Smi::cast(*return_val), Smi::FromInt(55)); |
| 1313 } | 1323 } |
| OLD | NEW |