| 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..055d7c695d36df49f7c783b0420cc3498d2520bf 100644
|
| --- a/test/cctest/interpreter/test-interpreter.cc
|
| +++ b/test/cctest/interpreter/test-interpreter.cc
|
| @@ -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};
|
|
|
|
|