| Index: test/cctest/interpreter/test-interpreter.cc | 
| diff --git a/test/cctest/interpreter/test-interpreter.cc b/test/cctest/interpreter/test-interpreter.cc | 
| index 3e7a1c470a57c1c73d9e51188827d8eea4837c54..5e7764348db2e65ddfae7adf29d68ff872f40033 100644 | 
| --- a/test/cctest/interpreter/test-interpreter.cc | 
| +++ b/test/cctest/interpreter/test-interpreter.cc | 
| @@ -340,7 +340,7 @@ TEST(InterpreterLoadLiteral) { | 
| TEST(InterpreterLoadStoreRegisters) { | 
| HandleAndZoneScope handles; | 
| Handle<Object> true_value = handles.main_isolate()->factory()->true_value(); | 
| -  for (int i = 0; i <= Register::kMaxRegisterIndex; i++) { | 
| +  for (int i = 0; i <= kMaxInt8; i++) { | 
| BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 
| builder.set_locals_count(i + 1); | 
| builder.set_context_count(0); | 
| @@ -361,6 +361,117 @@ TEST(InterpreterLoadStoreRegisters) { | 
| } | 
|  | 
|  | 
| +TEST(InterpreterExchangeRegisters) { | 
| +  for (int locals_count = 2; locals_count < 300; locals_count += 126) { | 
| +    HandleAndZoneScope handles; | 
| +    for (int exchanges = 1; exchanges < 4; exchanges++) { | 
| +      BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 
| +      builder.set_locals_count(locals_count); | 
| +      builder.set_context_count(0); | 
| +      builder.set_parameter_count(0); | 
| + | 
| +      Register r0(0); | 
| +      Register r1(locals_count - 1); | 
| +      builder.LoadTrue(); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| +      builder.ExchangeRegisters(r0, r1); | 
| +      builder.LoadFalse(); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| + | 
| +      bool expected = false; | 
| +      for (int i = 0; i < exchanges; i++) { | 
| +        builder.ExchangeRegisters(r0, r1); | 
| +        expected = !expected; | 
| +      } | 
| +      builder.LoadAccumulatorWithRegister(r0); | 
| +      builder.Return(); | 
| +      Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 
| +      InterpreterTester tester(handles.main_isolate(), bytecode_array); | 
| +      auto callable = tester.GetCallable<>(); | 
| +      Handle<Object> return_val = callable().ToHandleChecked(); | 
| +      Handle<Object> expected_val = | 
| +          handles.main_isolate()->factory()->ToBoolean(expected); | 
| +      CHECK(return_val.is_identical_to(expected_val)); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST(InterpreterExchangeRegistersWithParameter) { | 
| +  for (int locals_count = 2; locals_count < 300; locals_count += 126) { | 
| +    HandleAndZoneScope handles; | 
| +    for (int exchanges = 1; exchanges < 4; exchanges++) { | 
| +      BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 
| +      builder.set_locals_count(locals_count); | 
| +      builder.set_context_count(0); | 
| +      builder.set_parameter_count(3); | 
| + | 
| +      Register r0 = Register::FromParameterIndex(2, 3); | 
| +      Register r1(locals_count - 1); | 
| +      builder.LoadTrue(); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| +      builder.ExchangeRegisters(r0, r1); | 
| +      builder.LoadFalse(); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| + | 
| +      bool expected = false; | 
| +      for (int i = 0; i < exchanges; i++) { | 
| +        builder.ExchangeRegisters(r0, r1); | 
| +        expected = !expected; | 
| +      } | 
| +      builder.LoadAccumulatorWithRegister(r0); | 
| +      builder.Return(); | 
| +      Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 
| +      InterpreterTester tester(handles.main_isolate(), bytecode_array); | 
| +      auto callable = tester.GetCallable<>(); | 
| +      Handle<Object> return_val = callable().ToHandleChecked(); | 
| +      Handle<Object> expected_val = | 
| +          handles.main_isolate()->factory()->ToBoolean(expected); | 
| +      CHECK(return_val.is_identical_to(expected_val)); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| + | 
| +TEST(InterpreterExchangeWideRegisters) { | 
| +  for (int locals_count = 3; locals_count < 300; locals_count += 126) { | 
| +    HandleAndZoneScope handles; | 
| +    for (int exchanges = 0; exchanges < 7; exchanges++) { | 
| +      BytecodeArrayBuilder builder(handles.main_isolate(), handles.main_zone()); | 
| +      builder.set_locals_count(locals_count); | 
| +      builder.set_context_count(0); | 
| +      builder.set_parameter_count(0); | 
| + | 
| +      Register r0(0); | 
| +      Register r1(locals_count - 1); | 
| +      Register r2(locals_count - 2); | 
| +      builder.LoadLiteral(Smi::FromInt(200)); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| +      builder.ExchangeRegisters(r0, r1); | 
| +      builder.LoadLiteral(Smi::FromInt(100)); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| +      builder.ExchangeRegisters(r0, r2); | 
| +      builder.LoadLiteral(Smi::FromInt(0)); | 
| +      builder.StoreAccumulatorInRegister(r0); | 
| +      for (int i = 0; i < exchanges; i++) { | 
| +        builder.ExchangeRegisters(r1, r2); | 
| +        builder.ExchangeRegisters(r0, r1); | 
| +      } | 
| +      builder.LoadAccumulatorWithRegister(r0); | 
| +      builder.Return(); | 
| +      Handle<BytecodeArray> bytecode_array = builder.ToBytecodeArray(); | 
| +      InterpreterTester tester(handles.main_isolate(), bytecode_array); | 
| +      auto callable = tester.GetCallable<>(); | 
| +      Handle<Object> return_val = callable().ToHandleChecked(); | 
| +      Handle<Object> expected_val = | 
| +          handles.main_isolate()->factory()->NewNumberFromInt(100 * | 
| +                                                              (exchanges % 3)); | 
| +      CHECK(return_val.is_identical_to(expected_val)); | 
| +    } | 
| +  } | 
| +} | 
| + | 
| + | 
| static const Token::Value kShiftOperators[] = { | 
| Token::Value::SHL, Token::Value::SAR, Token::Value::SHR}; | 
|  | 
|  |