Chromium Code Reviews| Index: src/interpreter/interpreter.cc |
| diff --git a/src/interpreter/interpreter.cc b/src/interpreter/interpreter.cc |
| index 61cd7a44c085df9ff28be9c40a4ae11affec3f7a..60ba5c55a51294244fba249ccfd3a84dbfe1d4ad 100644 |
| --- a/src/interpreter/interpreter.cc |
| +++ b/src/interpreter/interpreter.cc |
| @@ -282,6 +282,15 @@ void Interpreter::DoBinaryOp(Runtime::FunctionId function_id, |
| } |
| +void Interpreter::DoCompareOp(Token::Value op, |
| + compiler::InterpreterAssembler* assembler) { |
| + // TODO(oth): placeholder until compare path fixed. |
| + // The accumulator should be set to true on success (or false otherwise) |
| + // by the comparisons so it can be used for conditional jumps. |
| + DoLdaTrue(assembler); |
| +} |
| + |
| + |
| // Add <src> |
| // |
| // Add register <src> to accumulator. |
| @@ -338,6 +347,164 @@ void Interpreter::DoCall(compiler::InterpreterAssembler* assembler) { |
| } |
| +// TestEqual <src> |
| +// |
| +// 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.
|
| +void Interpreter::DoTestEqual(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::EQ, assembler); |
| +} |
| + |
| + |
| +// TestNotEqual <src> |
| +// |
| +// Test if register not equal to the accumulator. |
| +void Interpreter::DoTestNotEqual(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::NE, assembler); |
| +} |
| + |
| + |
| +// TestEqualStrict <src> |
| +// |
| +// 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.
|
| +void Interpreter::DoTestEqualStrict(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::EQ_STRICT, assembler); |
| +} |
| + |
| + |
| +// TestNotEqualStrict <src> |
| +// |
| +// Test if register not strictly equal to the accumulator. |
| +void Interpreter::DoTestNotEqualStrict( |
| + compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::NE_STRICT, assembler); |
| +} |
| + |
| + |
| +// TestLessThan <src> |
| +// |
| +// Test if register is less than the accumulator. |
| +void Interpreter::DoTestLessThan(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::LT, assembler); |
| +} |
| + |
| + |
| +// TestGreaterThan <src> |
| +// |
| +// Test if register is greater than the accumulator. |
| +void Interpreter::DoTestGreaterThan(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::GT, assembler); |
| +} |
| + |
| + |
| +// TestLessThanEqual <src> |
| +// |
| +// Test if register is less than or equal to the accumulator. |
| +void Interpreter::DoTestLessThanEqual( |
| + compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::LTE, assembler); |
| +} |
| + |
| + |
| +// TestGreaterThanEqual <src> |
| +// |
| +// Test if register is greater than or equal to the accumulator. |
| +void Interpreter::DoTestGreaterThanEqual( |
| + compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::GTE, assembler); |
| +} |
| + |
| + |
| +// TestIn <src> |
| +// |
| +// Test if register is in the collection referenced by the accumulator. |
| +void Interpreter::DoTestIn(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::IN, assembler); |
| +} |
| + |
| + |
| +// TestInstanceOf <src> |
| +// |
| +// Test if object referenced by register is an an instance of type referenced |
| +// by the accumulator. |
| +void Interpreter::DoTestInstanceOf(compiler::InterpreterAssembler* assembler) { |
| + DoCompareOp(Token::Value::INSTANCEOF, assembler); |
| +} |
| + |
| + |
| +// JumpSmi8 <imm8> |
| +// |
| +// Jump by number of bytes represented by an immediate operand. |
| +void Interpreter::DoJumpSmi8(compiler::InterpreterAssembler* assembler) { |
| + 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
|
| + __ Jump(int_value); |
| +} |
| + |
| + |
| +// JumpConstant <idx> |
| +// |
| +// Jump by number of bytes in the Smi in the |idx| entry in the constant pool. |
| +void Interpreter::DoJumpConstant(compiler::InterpreterAssembler* assembler) { |
| + Node* index = __ BytecodeOperandIdx(0); |
| + Node* constant = __ LoadConstantPoolEntry(index); |
| + Node* int_value = __ SmiUntag(constant); |
| + __ Jump(int_value); |
| +} |
| + |
| + |
| +// JumpIfTrueSmi8 <imm8> |
| +// |
| +// Jump by number of bytes represented by an immediate operand if the |
| +// accumulator contains true. |
| +void Interpreter::DoJumpIfTrueSmi8(compiler::InterpreterAssembler* assembler) { |
| + Node* accumulator = __ GetAccumulator(); |
| + Node* relative_jump = __ BytecodeOperandImm8(0); |
| + Node* boolean_value = __ BooleanConstant(true); |
| + __ JumpIfEqual(accumulator, boolean_value, relative_jump); |
| +} |
| + |
| + |
| +// JumpIfTrueConstant <idx> |
| +// |
| +// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| +// if the accumulator contains true. |
| +void Interpreter::DoJumpIfTrueConstant( |
| + compiler::InterpreterAssembler* assembler) { |
| + Node* accumulator = __ GetAccumulator(); |
| + Node* index = __ BytecodeOperandIdx(0); |
| + Node* constant = __ LoadConstantPoolEntry(index); |
| + Node* relative_jump = __ SmiUntag(constant); |
| + Node* boolean_value = __ BooleanConstant(true); |
| + __ JumpIfEqual(accumulator, boolean_value, relative_jump); |
| +} |
| + |
| + |
| +// JumpIfFalseSmi8 <imm8> |
| +// |
| +// Jump by number of bytes represented by an immediate operand if the |
| +// accumulator contains false. |
| +void Interpreter::DoJumpIfFalseSmi8(compiler::InterpreterAssembler* assembler) { |
| + Node* accumulator = __ GetAccumulator(); |
| + Node* relative_jump = __ BytecodeOperandImm8(0); |
| + Node* boolean_value = __ BooleanConstant(false); |
| + __ JumpIfEqual(accumulator, boolean_value, relative_jump); |
| +} |
| + |
| + |
| +// JumpIfFalseConstant <idx> |
| +// |
| +// Jump by number of bytes in the Smi in the |idx| entry in the constant pool |
| +// if the accumulator contains false. |
| +void Interpreter::DoJumpIfFalseConstant( |
| + compiler::InterpreterAssembler* assembler) { |
| + Node* accumulator = __ GetAccumulator(); |
| + Node* index = __ BytecodeOperandIdx(0); |
| + Node* constant = __ LoadConstantPoolEntry(index); |
| + Node* relative_jump = __ SmiUntag(constant); |
| + Node* boolean_value = __ BooleanConstant(false); |
| + __ JumpIfEqual(accumulator, boolean_value, relative_jump); |
| +} |
| + |
| + |
| // Return |
| // |
| // Return the value in register 0. |