| Index: test/unittests/compiler/interpreter-assembler-unittest.cc | 
| diff --git a/test/unittests/compiler/interpreter-assembler-unittest.cc b/test/unittests/compiler/interpreter-assembler-unittest.cc | 
| index a68527adf2d4eef5cbe3d080b32f6c976114a455..a869f7ebb1121450022f63395029c5567b55bbce 100644 | 
| --- a/test/unittests/compiler/interpreter-assembler-unittest.cc | 
| +++ b/test/unittests/compiler/interpreter-assembler-unittest.cc | 
| @@ -23,10 +23,31 @@ const interpreter::Bytecode kBytecodes[] = { | 
| }; | 
|  | 
|  | 
| -Graph* | 
| -InterpreterAssemblerTest::InterpreterAssemblerForTest::GetCompletedGraph() { | 
| -  End(); | 
| -  return graph(); | 
| +Matcher<Node*> IsIntPtrAdd(const Matcher<Node*>& lhs_matcher, | 
| +                           const Matcher<Node*>& rhs_matcher) { | 
| +  return kPointerSize == 8 ? IsInt64Add(lhs_matcher, rhs_matcher) | 
| +                           : IsInt32Add(lhs_matcher, rhs_matcher); | 
| +} | 
| + | 
| + | 
| +Matcher<Node*> IsIntPtrSub(const Matcher<Node*>& lhs_matcher, | 
| +                           const Matcher<Node*>& rhs_matcher) { | 
| +  return kPointerSize == 8 ? IsInt64Sub(lhs_matcher, rhs_matcher) | 
| +                           : IsInt32Sub(lhs_matcher, rhs_matcher); | 
| +} | 
| + | 
| + | 
| +Matcher<Node*> IsWordShl(const Matcher<Node*>& lhs_matcher, | 
| +                         const Matcher<Node*>& rhs_matcher) { | 
| +  return kPointerSize == 8 ? IsWord64Shl(lhs_matcher, rhs_matcher) | 
| +                           : IsWord32Shl(lhs_matcher, rhs_matcher); | 
| +} | 
| + | 
| + | 
| +Matcher<Node*> IsWordSar(const Matcher<Node*>& lhs_matcher, | 
| +                         const Matcher<Node*>& rhs_matcher) { | 
| +  return kPointerSize == 8 ? IsWord64Sar(lhs_matcher, rhs_matcher) | 
| +                           : IsWord32Sar(lhs_matcher, rhs_matcher); | 
| } | 
|  | 
|  | 
| @@ -48,24 +69,33 @@ Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest::IsStore( | 
| } | 
|  | 
|  | 
| -Matcher<Node*> IsIntPtrAdd(const Matcher<Node*>& lhs_matcher, | 
| -                           const Matcher<Node*>& rhs_matcher) { | 
| -  return kPointerSize == 8 ? IsInt64Add(lhs_matcher, rhs_matcher) | 
| -                           : IsInt32Add(lhs_matcher, rhs_matcher); | 
| +Matcher<Node*> | 
| +InterpreterAssemblerTest::InterpreterAssemblerForTest::IsBytecodeOperand( | 
| +    int operand) { | 
| +  return IsLoad( | 
| +      kMachUint8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 
| +      IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 
| +                  IsInt32Constant(1 + operand))); | 
| } | 
|  | 
|  | 
| -Matcher<Node*> IsIntPtrSub(const Matcher<Node*>& lhs_matcher, | 
| -                           const Matcher<Node*>& rhs_matcher) { | 
| -  return kPointerSize == 8 ? IsInt64Sub(lhs_matcher, rhs_matcher) | 
| -                           : IsInt32Sub(lhs_matcher, rhs_matcher); | 
| +Matcher<Node*> InterpreterAssemblerTest::InterpreterAssemblerForTest:: | 
| +    IsBytecodeOperandSignExtended(int operand) { | 
| +  Matcher<Node*> load_matcher = IsLoad( | 
| +      kMachInt8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 
| +      IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 
| +                  IsInt32Constant(1 + operand))); | 
| +  if (kPointerSize == 8) { | 
| +    load_matcher = IsChangeInt32ToInt64(load_matcher); | 
| +  } | 
| +  return load_matcher; | 
| } | 
|  | 
|  | 
| -Matcher<Node*> IsWordShl(const Matcher<Node*>& lhs_matcher, | 
| -                         const Matcher<Node*>& rhs_matcher) { | 
| -  return kPointerSize == 8 ? IsWord64Shl(lhs_matcher, rhs_matcher) | 
| -                           : IsWord32Shl(lhs_matcher, rhs_matcher); | 
| +Graph* | 
| +InterpreterAssemblerTest::InterpreterAssemblerForTest::GetCompletedGraph() { | 
| +  End(); | 
| +  return graph(); | 
| } | 
|  | 
|  | 
| @@ -138,34 +168,19 @@ TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperand) { | 
| InterpreterAssemblerForTest m(this, bytecode); | 
| int number_of_operands = interpreter::Bytecodes::NumberOfOperands(bytecode); | 
| for (int i = 0; i < number_of_operands; i++) { | 
| -      Node* load_arg_node = m.BytecodeOperand(i); | 
| -      EXPECT_THAT( | 
| -          load_arg_node, | 
| -          m.IsLoad( | 
| -              kMachUint8, | 
| -              IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 
| -              IsIntPtrAdd( | 
| -                  IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 
| -                  IsInt32Constant(1 + i)))); | 
| -    } | 
| -  } | 
| -} | 
| - | 
| - | 
| -TARGET_TEST_F(InterpreterAssemblerTest, BytecodeOperandSignExtended) { | 
| -  TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
| -    InterpreterAssemblerForTest m(this, bytecode); | 
| -    int number_of_operands = interpreter::Bytecodes::NumberOfOperands(bytecode); | 
| -    for (int i = 0; i < number_of_operands; i++) { | 
| -      Node* load_arg_node = m.BytecodeOperandSignExtended(i); | 
| -      Matcher<Node*> load_matcher = m.IsLoad( | 
| -          kMachInt8, IsParameter(Linkage::kInterpreterBytecodeArrayParameter), | 
| -          IsIntPtrAdd(IsParameter(Linkage::kInterpreterBytecodeOffsetParameter), | 
| -                      IsInt32Constant(1 + i))); | 
| -      if (kPointerSize == 8) { | 
| -        load_matcher = IsChangeInt32ToInt64(load_matcher); | 
| +      switch (interpreter::Bytecodes::GetOperandType(bytecode, i)) { | 
| +        case interpreter::OperandType::kImm8: | 
| +          EXPECT_THAT(m.BytecodeOperandImm8(i), | 
| +                      m.IsBytecodeOperandSignExtended(i)); | 
| +          break; | 
| +        case interpreter::OperandType::kReg: | 
| +          EXPECT_THAT(m.BytecodeOperandReg(i), | 
| +                      m.IsBytecodeOperandSignExtended(i)); | 
| +          break; | 
| +        case interpreter::OperandType::kNone: | 
| +          UNREACHABLE(); | 
| +          break; | 
| } | 
| -      EXPECT_THAT(load_arg_node, load_matcher); | 
| } | 
| } | 
| } | 
| @@ -230,6 +245,18 @@ TARGET_TEST_F(InterpreterAssemblerTest, StoreRegister) { | 
| } | 
| } | 
|  | 
| + | 
| +TARGET_TEST_F(InterpreterAssemblerTest, SmiTag) { | 
| +  TRACED_FOREACH(interpreter::Bytecode, bytecode, kBytecodes) { | 
| +    InterpreterAssemblerForTest m(this, bytecode); | 
| +    Node* value = m.Int32Constant(44); | 
| +    EXPECT_THAT(m.SmiTag(value), | 
| +                IsWordShl(value, IsInt32Constant(kSmiShiftSize + kSmiTagSize))); | 
| +    EXPECT_THAT(m.SmiUntag(value), | 
| +                IsWordSar(value, IsInt32Constant(kSmiShiftSize + kSmiTagSize))); | 
| +  } | 
| +} | 
| + | 
| }  // namespace compiler | 
| }  // namespace internal | 
| }  // namespace v8 | 
|  |