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

Side by Side Diff: src/interpreter/interpreter.cc

Issue 1343363002: [Interpreter] Basic flow control. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Clarify comment and diff reduction. Created 5 years, 3 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
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 "src/interpreter/interpreter.h" 5 #include "src/interpreter/interpreter.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/compiler.h" 8 #include "src/compiler.h"
9 #include "src/compiler/interpreter-assembler.h" 9 #include "src/compiler/interpreter-assembler.h"
10 #include "src/factory.h" 10 #include "src/factory.h"
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
275 // operations, instead of calling builtins directly. 275 // operations, instead of calling builtins directly.
276 Node* reg_index = __ BytecodeOperandReg(0); 276 Node* reg_index = __ BytecodeOperandReg(0);
277 Node* lhs = __ LoadRegister(reg_index); 277 Node* lhs = __ LoadRegister(reg_index);
278 Node* rhs = __ GetAccumulator(); 278 Node* rhs = __ GetAccumulator();
279 Node* result = __ CallRuntime(function_id, lhs, rhs); 279 Node* result = __ CallRuntime(function_id, lhs, rhs);
280 __ SetAccumulator(result); 280 __ SetAccumulator(result);
281 __ Dispatch(); 281 __ Dispatch();
282 } 282 }
283 283
284 284
285 void Interpreter::DoCompareOp(Token::Value op,
286 compiler::InterpreterAssembler* assembler) {
287 // TODO(oth): placeholder until compare path fixed.
288 // The accumulator should be set to true on success (or false otherwise)
289 // by the comparisons so it can be used for conditional jumps.
290 DoLdaTrue(assembler);
291 }
292
293
285 // Add <src> 294 // Add <src>
286 // 295 //
287 // Add register <src> to accumulator. 296 // Add register <src> to accumulator.
288 void Interpreter::DoAdd(compiler::InterpreterAssembler* assembler) { 297 void Interpreter::DoAdd(compiler::InterpreterAssembler* assembler) {
289 DoBinaryOp(Runtime::kAdd, assembler); 298 DoBinaryOp(Runtime::kAdd, assembler);
290 } 299 }
291 300
292 301
293 // Sub <src> 302 // Sub <src>
294 // 303 //
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
331 Node* function = __ LoadRegister(function_reg); 340 Node* function = __ LoadRegister(function_reg);
332 Node* receiver_reg = __ BytecodeOperandReg(1); 341 Node* receiver_reg = __ BytecodeOperandReg(1);
333 Node* first_arg = __ RegisterLocation(receiver_reg); 342 Node* first_arg = __ RegisterLocation(receiver_reg);
334 Node* args_count = __ BytecodeOperandCount(2); 343 Node* args_count = __ BytecodeOperandCount(2);
335 Node* result = __ CallJS(function, first_arg, args_count); 344 Node* result = __ CallJS(function, first_arg, args_count);
336 __ SetAccumulator(result); 345 __ SetAccumulator(result);
337 __ Dispatch(); 346 __ Dispatch();
338 } 347 }
339 348
340 349
350 // TestEqual <src>
351 //
352 // Test if register equals the accumulator.
rmcilroy 2015/09/18 10:42:24 nit (for all comments) - /s/Test if register/Test
oth 2015/09/23 10:46:56 Done.
353 void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) {
354 DoCompareOp(Token::Value::EQ, assembler);
355 }
356
357
358 // TestNotEqual <src>
359 //
360 // Test if register not equal to the accumulator.
361 void Interpreter::DoTestNotEqual(compiler::InterpreterAssembler* assembler) {
362 DoCompareOp(Token::Value::NE, assembler);
363 }
364
365
366 // TestEqualStrict <src>
367 //
368 // Test if register strictly equal to the accumulator.
rmcilroy 2015/09/18 10:42:24 /s/strictly/is strictly (and below)
oth 2015/09/23 10:46:56 Done.
369 void Interpreter::DoTestEqualStrict(compiler::InterpreterAssembler* assembler) {
370 DoCompareOp(Token::Value::EQ_STRICT, assembler);
371 }
372
373
374 // TestNotEqualStrict <src>
375 //
376 // Test if register not strictly equal to the accumulator.
377 void Interpreter::DoTestNotEqualStrict(
378 compiler::InterpreterAssembler* assembler) {
379 DoCompareOp(Token::Value::NE_STRICT, assembler);
380 }
381
382
383 // TestLessThan <src>
384 //
385 // Test if register is less than the accumulator.
386 void Interpreter::DoTestLessThan(compiler::InterpreterAssembler* assembler) {
387 DoCompareOp(Token::Value::LT, assembler);
388 }
389
390
391 // TestGreaterThan <src>
392 //
393 // Test if register is greater than the accumulator.
394 void Interpreter::DoTestGreaterThan(compiler::InterpreterAssembler* assembler) {
395 DoCompareOp(Token::Value::GT, assembler);
396 }
397
398
399 // TestLessThanEqual <src>
400 //
401 // Test if register is less than or equal to the accumulator.
402 void Interpreter::DoTestLessThanEqual(
403 compiler::InterpreterAssembler* assembler) {
404 DoCompareOp(Token::Value::LTE, assembler);
405 }
406
407
408 // TestGreaterThanEqual <src>
409 //
410 // Test if register is greater than or equal to the accumulator.
411 void Interpreter::DoTestGreaterThanEqual(
412 compiler::InterpreterAssembler* assembler) {
413 DoCompareOp(Token::Value::GTE, assembler);
414 }
415
416
417 // TestIn <src>
418 //
419 // Test if register is in the collection referenced by the accumulator.
420 void Interpreter::DoTestIn(compiler::InterpreterAssembler* assembler) {
421 DoCompareOp(Token::Value::IN, assembler);
422 }
423
424
425 // TestInstanceOf <src>
426 //
427 // Test if object referenced by register is an an instance of type referenced
428 // by the accumulator.
429 void Interpreter::DoTestInstanceOf(compiler::InterpreterAssembler* assembler) {
430 DoCompareOp(Token::Value::INSTANCEOF, assembler);
431 }
432
433
434 // JumpSmi8 <imm8>
435 //
436 // Jump by number of bytes represented by an immediate operand.
437 void Interpreter::DoJumpSmi8(compiler::InterpreterAssembler* assembler) {
438 Node* int_value = __ BytecodeOperandImm8(0);
rmcilroy 2015/09/18 10:42:24 nit - /s/int_value/jump_delta (and below)
oth 2015/09/23 10:46:56 Done. s/int_value/relative_jump/ to match code fur
439 __ Jump(int_value);
440 }
441
442
443 // JumpConstant <idx>
444 //
445 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool.
446 void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) {
447 Node* index = __ BytecodeOperandIdx(0);
448 Node* constant = __ LoadConstantPoolEntry(index);
449 Node* int_value = __ SmiUntag(constant);
450 __ Jump(int_value);
451 }
452
453
454 // JumpIfTrueSmi8 <imm8>
455 //
456 // Jump by number of bytes represented by an immediate operand if the
457 // accumulator contains true.
458 void Interpreter::DoJumpIfTrueSmi8(compiler::InterpreterAssembler* assembler) {
459 Node* accumulator = __ GetAccumulator();
460 Node* relative_jump = __ BytecodeOperandImm8(0);
461 Node* boolean_value = __ BooleanConstant(true);
462 __ JumpIfEqual(accumulator, boolean_value, relative_jump);
463 }
464
465
466 // JumpIfTrueConstant <idx>
467 //
468 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool
469 // if the accumulator contains true.
470 void Interpreter::DoJumpIfTrueConstant(
471 compiler::InterpreterAssembler* assembler) {
472 Node* accumulator = __ GetAccumulator();
473 Node* index = __ BytecodeOperandIdx(0);
474 Node* constant = __ LoadConstantPoolEntry(index);
475 Node* relative_jump = __ SmiUntag(constant);
476 Node* boolean_value = __ BooleanConstant(true);
477 __ JumpIfEqual(accumulator, boolean_value, relative_jump);
478 }
479
480
481 // JumpIfFalseSmi8 <imm8>
482 //
483 // Jump by number of bytes represented by an immediate operand if the
484 // accumulator contains false.
485 void Interpreter::DoJumpIfFalseSmi8(compiler::InterpreterAssembler* assembler) {
486 Node* accumulator = __ GetAccumulator();
487 Node* relative_jump = __ BytecodeOperandImm8(0);
488 Node* boolean_value = __ BooleanConstant(false);
489 __ JumpIfEqual(accumulator, boolean_value, relative_jump);
490 }
491
492
493 // JumpIfFalseConstant <idx>
494 //
495 // Jump by number of bytes in the Smi in the |idx| entry in the constant pool
496 // if the accumulator contains false.
497 void Interpreter::DoJumpIfFalseConstant(
498 compiler::InterpreterAssembler* assembler) {
499 Node* accumulator = __ GetAccumulator();
500 Node* index = __ BytecodeOperandIdx(0);
501 Node* constant = __ LoadConstantPoolEntry(index);
502 Node* relative_jump = __ SmiUntag(constant);
503 Node* boolean_value = __ BooleanConstant(false);
504 __ JumpIfEqual(accumulator, boolean_value, relative_jump);
505 }
506
507
341 // Return 508 // Return
342 // 509 //
343 // Return the value in register 0. 510 // Return the value in register 0.
344 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) { 511 void Interpreter::DoReturn(compiler::InterpreterAssembler* assembler) {
345 __ Return(); 512 __ Return();
346 } 513 }
347 514
348 515
349 } // namespace interpreter 516 } // namespace interpreter
350 } // namespace internal 517 } // namespace internal
351 } // namespace v8 518 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698