1c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Copyright 2008 Google Inc.
2c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Author: Lincoln Smith
3c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
4c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Licensed under the Apache License, Version 2.0 (the "License");
5c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// you may not use this file except in compliance with the License.
6c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// You may obtain a copy of the License at
7c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
8c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//      http://www.apache.org/licenses/LICENSE-2.0
9c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
10c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unless required by applicable law or agreed to in writing, software
11c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// distributed under the License is distributed on an "AS IS" BASIS,
12c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// See the License for the specific language governing permissions and
14c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// limitations under the License.
15c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott//
16c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott// Unit tests for the class VCDiffInstructionMap, found in instruction_map.h.
17c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
18c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include <config.h>
19c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "instruction_map.h"
20c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "codetable.h"
21c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "testing.h"
22c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott#include "vcdiff_defs.h"
23c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
24c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace open_vcdiff {
25c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottnamespace {
26c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
27c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottclass InstructionMapTest : public testing::Test {
28c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott protected:
29c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void SetUpTestCase();
30c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void TearDownTestCase();
31c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
32c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static void AddExerciseOpcode(unsigned char inst1,
33c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char mode1,
34c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char size1,
35c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char inst2,
36c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char mode2,
37c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                unsigned char size2,
38c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                int opcode);
39c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
40c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void VerifyExerciseFirstInstruction(unsigned char expected_opcode,
41c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      unsigned char inst,
42c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      unsigned char size,
43c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                      unsigned char mode);
44c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
45c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  void VerifyExerciseSecondInstruction(unsigned char expected_opcode,
46c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char inst1,
47c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char size1,
48c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char mode1,
49c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char inst2,
50c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char size2,
51c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       unsigned char mode2);
52c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
53c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This value is designed so that the total number of inst values and modes
54c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // will equal 8 (VCD_NOOP, VCD_ADD, VCD_RUN, VCD_COPY modes 0 - 4).
55c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Eight combinations of inst and mode, times two possible size values,
56c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // squared (because there are two instructions per opcode), makes
57c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // exactly 256 possible instruction combinations, which fits kCodeTableSize
58c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (the number of opcodes in the table.)
59c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const int kLastExerciseMode = 4;
60c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
61c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // A code table that exercises as many combinations as possible:
62c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // 2 instructions, each is a NOOP, ADD, RUN, or one of 5 copy modes
63c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // (== 8 total combinations of inst and mode), and each has
64c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // size == 0 or 255 (2 possibilities.)
65c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static VCDiffCodeTableData* g_exercise_code_table_;
66c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
67c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The instruction map corresponding to kDefaultCodeTableData.
68c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const VCDiffInstructionMap* default_map;
69c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
70c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The instruction map corresponding to g_exercise_code_table_.
71c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  static const VCDiffInstructionMap* exercise_map;
72c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
73c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  size_t out_index;
74c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott};
75c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
76c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottVCDiffCodeTableData* InstructionMapTest::g_exercise_code_table_ = NULL;
77c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst VCDiffInstructionMap* InstructionMapTest::default_map = NULL;
78c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottconst VCDiffInstructionMap* InstructionMapTest::exercise_map = NULL;
79c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
80c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InstructionMapTest::SetUpTestCase() {
81c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_ = new VCDiffCodeTableData;
82c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int opcode = 0;
83c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (unsigned char inst_mode1 = 0;
84c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       inst_mode1 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
85c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       ++inst_mode1) {
86c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char inst1 = inst_mode1;
87c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char mode1 = 0;
88c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (inst_mode1 > VCD_COPY) {
89c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      inst1 = VCD_COPY;
90c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      mode1 = inst_mode1 - VCD_COPY;
91c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
92c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (unsigned char inst_mode2 = 0;
93c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         inst_mode2 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
94c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         ++inst_mode2) {
95c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char inst2 = inst_mode2;
96c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char mode2 = 0;
97c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (inst_mode2 > VCD_COPY) {
98c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        inst2 = VCD_COPY;
99c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mode2 = inst_mode2 - VCD_COPY;
100c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      }
101c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 0, opcode++);
102c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      AddExerciseOpcode(inst1, mode1, 0, inst2, mode2, 255, opcode++);
103c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 0, opcode++);
104c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      AddExerciseOpcode(inst1, mode1, 255, inst2, mode2, 255, opcode++);
105c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
106c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
107c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This is a CHECK rather than an EXPECT because it validates only
108c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the logic of the test, not of the code being tested.
109c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CHECK_EQ(VCDiffCodeTableData::kCodeTableSize, opcode);
110c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
111c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(VCDiffCodeTableData::kDefaultCodeTableData.Validate());
112c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_TRUE(g_exercise_code_table_->Validate(kLastExerciseMode));
113c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  default_map = VCDiffInstructionMap::GetDefaultInstructionMap();
114c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  exercise_map = new VCDiffInstructionMap(*g_exercise_code_table_,
115c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                          kLastExerciseMode);
116c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
117c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
118c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InstructionMapTest::TearDownTestCase() {
119c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delete exercise_map;
120c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  delete g_exercise_code_table_;
121c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
122c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
123c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InstructionMapTest::AddExerciseOpcode(unsigned char inst1,
124c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           unsigned char mode1,
125c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           unsigned char size1,
126c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           unsigned char inst2,
127c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           unsigned char mode2,
128c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           unsigned char size2,
129c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                           int opcode) {
130c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->inst1[opcode] = inst1;
131c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->mode1[opcode] = mode1;
132c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->size1[opcode] = (inst1 == VCD_NOOP) ? 0 : size1;
133c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->inst2[opcode] = inst2;
134c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->mode2[opcode] = mode2;
135c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  g_exercise_code_table_->size2[opcode] = (inst2 == VCD_NOOP) ? 0 : size2;
136c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
137c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
138c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InstructionMapTest::VerifyExerciseFirstInstruction(
139c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char expected_opcode,
140c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char inst,
141c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char size,
142c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char mode) {
143c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int found_opcode = exercise_map->LookupFirstOpcode(inst, size, mode);
144c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  if (g_exercise_code_table_->inst1[found_opcode] == VCD_NOOP) {
145c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    // The opcode is backwards: (VCD_NOOP, [instruction])
146c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_GE(expected_opcode, found_opcode);
147c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(inst, g_exercise_code_table_->inst2[found_opcode]);
148c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(size, g_exercise_code_table_->size2[found_opcode]);
149c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(mode, g_exercise_code_table_->mode2[found_opcode]);
150c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VCD_NOOP, g_exercise_code_table_->inst1[found_opcode]);
151c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, g_exercise_code_table_->size1[found_opcode]);
152c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, g_exercise_code_table_->mode1[found_opcode]);
153c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  } else {
154c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(expected_opcode, found_opcode);
155c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(inst, g_exercise_code_table_->inst1[found_opcode]);
156c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(size, g_exercise_code_table_->size1[found_opcode]);
157c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(mode, g_exercise_code_table_->mode1[found_opcode]);
158c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(VCD_NOOP, g_exercise_code_table_->inst2[found_opcode]);
159c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, g_exercise_code_table_->size2[found_opcode]);
160c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    EXPECT_EQ(0, g_exercise_code_table_->mode2[found_opcode]);
161c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
162c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
163c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
164c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scottvoid InstructionMapTest::VerifyExerciseSecondInstruction(
165c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char expected_opcode,
166c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char inst1,
167c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char size1,
168c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char mode1,
169c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char inst2,
170c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char size2,
171c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char mode2) {
172c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int first_opcode = exercise_map->LookupFirstOpcode(inst1, size1, mode1);
173c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_NE(kNoOpcode, first_opcode);
174c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(expected_opcode,
175c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott            exercise_map->LookupSecondOpcode(first_opcode,
176c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             inst2,
177c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             size2,
178c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                             mode2));
179c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
180c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
181c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstNoop) {
182c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 0, 0));
183c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 0, 255));
184c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 255, 0));
185c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_NOOP, 255, 255));
186c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
187c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
188c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstAdd) {
189c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 0));
190c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(3, default_map->LookupFirstOpcode(VCD_ADD, 2, 0));
191c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(4, default_map->LookupFirstOpcode(VCD_ADD, 3, 0));
192c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(5, default_map->LookupFirstOpcode(VCD_ADD, 4, 0));
193c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(6, default_map->LookupFirstOpcode(VCD_ADD, 5, 0));
194c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(7, default_map->LookupFirstOpcode(VCD_ADD, 6, 0));
195c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(8, default_map->LookupFirstOpcode(VCD_ADD, 7, 0));
196c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(9, default_map->LookupFirstOpcode(VCD_ADD, 8, 0));
197c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(10, default_map->LookupFirstOpcode(VCD_ADD, 9, 0));
198c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(11, default_map->LookupFirstOpcode(VCD_ADD, 10, 0));
199c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(12, default_map->LookupFirstOpcode(VCD_ADD, 11, 0));
200c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(13, default_map->LookupFirstOpcode(VCD_ADD, 12, 0));
201c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(14, default_map->LookupFirstOpcode(VCD_ADD, 13, 0));
202c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(15, default_map->LookupFirstOpcode(VCD_ADD, 14, 0));
203c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(16, default_map->LookupFirstOpcode(VCD_ADD, 15, 0));
204c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(17, default_map->LookupFirstOpcode(VCD_ADD, 16, 0));
205c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(18, default_map->LookupFirstOpcode(VCD_ADD, 17, 0));
206c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_ADD, 100, 0));
207c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_ADD, 255, 0));
208c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(1, default_map->LookupFirstOpcode(VCD_ADD, 0, 0));
209c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Value of "mode" should not matter
210c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 2));
211c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(2, default_map->LookupFirstOpcode(VCD_ADD, 1, 255));
212c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
213c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
214c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstRun) {
215c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, default_map->LookupFirstOpcode(VCD_RUN, 0, 0));
216c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_RUN, 1, 0));
217c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_RUN, 255, 0));
218c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Value of "mode" should not matter
219c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(0, default_map->LookupFirstOpcode(VCD_RUN, 0, 2));
220c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
221c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
222c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode0) {
223c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(19, default_map->LookupFirstOpcode(VCD_COPY, 0, 0));
224c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(20, default_map->LookupFirstOpcode(VCD_COPY, 4, 0));
225c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(21, default_map->LookupFirstOpcode(VCD_COPY, 5, 0));
226c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(22, default_map->LookupFirstOpcode(VCD_COPY, 6, 0));
227c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(23, default_map->LookupFirstOpcode(VCD_COPY, 7, 0));
228c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(24, default_map->LookupFirstOpcode(VCD_COPY, 8, 0));
229c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(25, default_map->LookupFirstOpcode(VCD_COPY, 9, 0));
230c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(26, default_map->LookupFirstOpcode(VCD_COPY, 10, 0));
231c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(27, default_map->LookupFirstOpcode(VCD_COPY, 11, 0));
232c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(28, default_map->LookupFirstOpcode(VCD_COPY, 12, 0));
233c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(29, default_map->LookupFirstOpcode(VCD_COPY, 13, 0));
234c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(30, default_map->LookupFirstOpcode(VCD_COPY, 14, 0));
235c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(31, default_map->LookupFirstOpcode(VCD_COPY, 15, 0));
236c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(32, default_map->LookupFirstOpcode(VCD_COPY, 16, 0));
237c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(33, default_map->LookupFirstOpcode(VCD_COPY, 17, 0));
238c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(34, default_map->LookupFirstOpcode(VCD_COPY, 18, 0));
239c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
240c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
241c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode1) {
242c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(35, default_map->LookupFirstOpcode(VCD_COPY, 0, 1));
243c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(36, default_map->LookupFirstOpcode(VCD_COPY, 4, 1));
244c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(37, default_map->LookupFirstOpcode(VCD_COPY, 5, 1));
245c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(38, default_map->LookupFirstOpcode(VCD_COPY, 6, 1));
246c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(39, default_map->LookupFirstOpcode(VCD_COPY, 7, 1));
247c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(40, default_map->LookupFirstOpcode(VCD_COPY, 8, 1));
248c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(41, default_map->LookupFirstOpcode(VCD_COPY, 9, 1));
249c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(42, default_map->LookupFirstOpcode(VCD_COPY, 10, 1));
250c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(43, default_map->LookupFirstOpcode(VCD_COPY, 11, 1));
251c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(44, default_map->LookupFirstOpcode(VCD_COPY, 12, 1));
252c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(45, default_map->LookupFirstOpcode(VCD_COPY, 13, 1));
253c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(46, default_map->LookupFirstOpcode(VCD_COPY, 14, 1));
254c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(47, default_map->LookupFirstOpcode(VCD_COPY, 15, 1));
255c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(48, default_map->LookupFirstOpcode(VCD_COPY, 16, 1));
256c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(49, default_map->LookupFirstOpcode(VCD_COPY, 17, 1));
257c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(50, default_map->LookupFirstOpcode(VCD_COPY, 18, 1));
258c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
259c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
260c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode2) {
261c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(51, default_map->LookupFirstOpcode(VCD_COPY, 0, 2));
262c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(52, default_map->LookupFirstOpcode(VCD_COPY, 4, 2));
263c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(53, default_map->LookupFirstOpcode(VCD_COPY, 5, 2));
264c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(54, default_map->LookupFirstOpcode(VCD_COPY, 6, 2));
265c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(55, default_map->LookupFirstOpcode(VCD_COPY, 7, 2));
266c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(56, default_map->LookupFirstOpcode(VCD_COPY, 8, 2));
267c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(57, default_map->LookupFirstOpcode(VCD_COPY, 9, 2));
268c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(58, default_map->LookupFirstOpcode(VCD_COPY, 10, 2));
269c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(59, default_map->LookupFirstOpcode(VCD_COPY, 11, 2));
270c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(60, default_map->LookupFirstOpcode(VCD_COPY, 12, 2));
271c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(61, default_map->LookupFirstOpcode(VCD_COPY, 13, 2));
272c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(62, default_map->LookupFirstOpcode(VCD_COPY, 14, 2));
273c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(63, default_map->LookupFirstOpcode(VCD_COPY, 15, 2));
274c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(64, default_map->LookupFirstOpcode(VCD_COPY, 16, 2));
275c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(65, default_map->LookupFirstOpcode(VCD_COPY, 17, 2));
276c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(66, default_map->LookupFirstOpcode(VCD_COPY, 18, 2));
277c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
278c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
279c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode3) {
280c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(67, default_map->LookupFirstOpcode(VCD_COPY, 0, 3));
281c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(68, default_map->LookupFirstOpcode(VCD_COPY, 4, 3));
282c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(69, default_map->LookupFirstOpcode(VCD_COPY, 5, 3));
283c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(70, default_map->LookupFirstOpcode(VCD_COPY, 6, 3));
284c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(71, default_map->LookupFirstOpcode(VCD_COPY, 7, 3));
285c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(72, default_map->LookupFirstOpcode(VCD_COPY, 8, 3));
286c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(73, default_map->LookupFirstOpcode(VCD_COPY, 9, 3));
287c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(74, default_map->LookupFirstOpcode(VCD_COPY, 10, 3));
288c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(75, default_map->LookupFirstOpcode(VCD_COPY, 11, 3));
289c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(76, default_map->LookupFirstOpcode(VCD_COPY, 12, 3));
290c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(77, default_map->LookupFirstOpcode(VCD_COPY, 13, 3));
291c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(78, default_map->LookupFirstOpcode(VCD_COPY, 14, 3));
292c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(79, default_map->LookupFirstOpcode(VCD_COPY, 15, 3));
293c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(80, default_map->LookupFirstOpcode(VCD_COPY, 16, 3));
294c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(81, default_map->LookupFirstOpcode(VCD_COPY, 17, 3));
295c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(82, default_map->LookupFirstOpcode(VCD_COPY, 18, 3));
296c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
297c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
298c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode4) {
299c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(83, default_map->LookupFirstOpcode(VCD_COPY, 0, 4));
300c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(84, default_map->LookupFirstOpcode(VCD_COPY, 4, 4));
301c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(85, default_map->LookupFirstOpcode(VCD_COPY, 5, 4));
302c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(86, default_map->LookupFirstOpcode(VCD_COPY, 6, 4));
303c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(87, default_map->LookupFirstOpcode(VCD_COPY, 7, 4));
304c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(88, default_map->LookupFirstOpcode(VCD_COPY, 8, 4));
305c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(89, default_map->LookupFirstOpcode(VCD_COPY, 9, 4));
306c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(90, default_map->LookupFirstOpcode(VCD_COPY, 10, 4));
307c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(91, default_map->LookupFirstOpcode(VCD_COPY, 11, 4));
308c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(92, default_map->LookupFirstOpcode(VCD_COPY, 12, 4));
309c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(93, default_map->LookupFirstOpcode(VCD_COPY, 13, 4));
310c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(94, default_map->LookupFirstOpcode(VCD_COPY, 14, 4));
311c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(95, default_map->LookupFirstOpcode(VCD_COPY, 15, 4));
312c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(96, default_map->LookupFirstOpcode(VCD_COPY, 16, 4));
313c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(97, default_map->LookupFirstOpcode(VCD_COPY, 17, 4));
314c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(98, default_map->LookupFirstOpcode(VCD_COPY, 18, 4));
315c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
316c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
317c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode5) {
318c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(99, default_map->LookupFirstOpcode(VCD_COPY, 0, 5));
319c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(100, default_map->LookupFirstOpcode(VCD_COPY, 4, 5));
320c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(101, default_map->LookupFirstOpcode(VCD_COPY, 5, 5));
321c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(102, default_map->LookupFirstOpcode(VCD_COPY, 6, 5));
322c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(103, default_map->LookupFirstOpcode(VCD_COPY, 7, 5));
323c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(104, default_map->LookupFirstOpcode(VCD_COPY, 8, 5));
324c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(105, default_map->LookupFirstOpcode(VCD_COPY, 9, 5));
325c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(106, default_map->LookupFirstOpcode(VCD_COPY, 10, 5));
326c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(107, default_map->LookupFirstOpcode(VCD_COPY, 11, 5));
327c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(108, default_map->LookupFirstOpcode(VCD_COPY, 12, 5));
328c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(109, default_map->LookupFirstOpcode(VCD_COPY, 13, 5));
329c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(110, default_map->LookupFirstOpcode(VCD_COPY, 14, 5));
330c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(111, default_map->LookupFirstOpcode(VCD_COPY, 15, 5));
331c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(112, default_map->LookupFirstOpcode(VCD_COPY, 16, 5));
332c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(113, default_map->LookupFirstOpcode(VCD_COPY, 17, 5));
333c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(114, default_map->LookupFirstOpcode(VCD_COPY, 18, 5));
334c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
335c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
336c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode6) {
337c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(115, default_map->LookupFirstOpcode(VCD_COPY, 0, 6));
338c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(116, default_map->LookupFirstOpcode(VCD_COPY, 4, 6));
339c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(117, default_map->LookupFirstOpcode(VCD_COPY, 5, 6));
340c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(118, default_map->LookupFirstOpcode(VCD_COPY, 6, 6));
341c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(119, default_map->LookupFirstOpcode(VCD_COPY, 7, 6));
342c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(120, default_map->LookupFirstOpcode(VCD_COPY, 8, 6));
343c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(121, default_map->LookupFirstOpcode(VCD_COPY, 9, 6));
344c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(122, default_map->LookupFirstOpcode(VCD_COPY, 10, 6));
345c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(123, default_map->LookupFirstOpcode(VCD_COPY, 11, 6));
346c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(124, default_map->LookupFirstOpcode(VCD_COPY, 12, 6));
347c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(125, default_map->LookupFirstOpcode(VCD_COPY, 13, 6));
348c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(126, default_map->LookupFirstOpcode(VCD_COPY, 14, 6));
349c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(127, default_map->LookupFirstOpcode(VCD_COPY, 15, 6));
350c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(128, default_map->LookupFirstOpcode(VCD_COPY, 16, 6));
351c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(129, default_map->LookupFirstOpcode(VCD_COPY, 17, 6));
352c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(130, default_map->LookupFirstOpcode(VCD_COPY, 18, 6));
353c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
354c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
355c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode7) {
356c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(131, default_map->LookupFirstOpcode(VCD_COPY, 0, 7));
357c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(132, default_map->LookupFirstOpcode(VCD_COPY, 4, 7));
358c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(133, default_map->LookupFirstOpcode(VCD_COPY, 5, 7));
359c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(134, default_map->LookupFirstOpcode(VCD_COPY, 6, 7));
360c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(135, default_map->LookupFirstOpcode(VCD_COPY, 7, 7));
361c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(136, default_map->LookupFirstOpcode(VCD_COPY, 8, 7));
362c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(137, default_map->LookupFirstOpcode(VCD_COPY, 9, 7));
363c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(138, default_map->LookupFirstOpcode(VCD_COPY, 10, 7));
364c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(139, default_map->LookupFirstOpcode(VCD_COPY, 11, 7));
365c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(140, default_map->LookupFirstOpcode(VCD_COPY, 12, 7));
366c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(141, default_map->LookupFirstOpcode(VCD_COPY, 13, 7));
367c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(142, default_map->LookupFirstOpcode(VCD_COPY, 14, 7));
368c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(143, default_map->LookupFirstOpcode(VCD_COPY, 15, 7));
369c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(144, default_map->LookupFirstOpcode(VCD_COPY, 16, 7));
370c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(145, default_map->LookupFirstOpcode(VCD_COPY, 17, 7));
371c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(146, default_map->LookupFirstOpcode(VCD_COPY, 18, 7));
372c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
373c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
374c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyMode8) {
375c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(147, default_map->LookupFirstOpcode(VCD_COPY, 0, 8));
376c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(148, default_map->LookupFirstOpcode(VCD_COPY, 4, 8));
377c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(149, default_map->LookupFirstOpcode(VCD_COPY, 5, 8));
378c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(150, default_map->LookupFirstOpcode(VCD_COPY, 6, 8));
379c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(151, default_map->LookupFirstOpcode(VCD_COPY, 7, 8));
380c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(152, default_map->LookupFirstOpcode(VCD_COPY, 8, 8));
381c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(153, default_map->LookupFirstOpcode(VCD_COPY, 9, 8));
382c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(154, default_map->LookupFirstOpcode(VCD_COPY, 10, 8));
383c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(155, default_map->LookupFirstOpcode(VCD_COPY, 11, 8));
384c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(156, default_map->LookupFirstOpcode(VCD_COPY, 12, 8));
385c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(157, default_map->LookupFirstOpcode(VCD_COPY, 13, 8));
386c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(158, default_map->LookupFirstOpcode(VCD_COPY, 14, 8));
387c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(159, default_map->LookupFirstOpcode(VCD_COPY, 15, 8));
388c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(160, default_map->LookupFirstOpcode(VCD_COPY, 16, 8));
389c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(161, default_map->LookupFirstOpcode(VCD_COPY, 17, 8));
390c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(162, default_map->LookupFirstOpcode(VCD_COPY, 18, 8));
391c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
392c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
393c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupFirstCopyInvalid) {
394c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 3, 0));
395c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 3, 3));
396c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupFirstOpcode(VCD_COPY, 255, 0));
397c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
398c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
399c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondNoop) {
400c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // The second opcode table does not store entries for NOOP instructions.
401c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Just make sure that a NOOP does not crash the lookup code.
402c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 0, 0));
403c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 0, 255));
404c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 255, 0));
405c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_NOOP, 255, 255));
406c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
407c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
408c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondAdd) {
409c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 0));
410c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(248, default_map->LookupSecondOpcode(36, VCD_ADD, 1, 0));
411c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(249, default_map->LookupSecondOpcode(52, VCD_ADD, 1, 0));
412c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(250, default_map->LookupSecondOpcode(68, VCD_ADD, 1, 0));
413c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(251, default_map->LookupSecondOpcode(84, VCD_ADD, 1, 0));
414c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(252, default_map->LookupSecondOpcode(100, VCD_ADD, 1, 0));
415c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(253, default_map->LookupSecondOpcode(116, VCD_ADD, 1, 0));
416c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(254, default_map->LookupSecondOpcode(132, VCD_ADD, 1, 0));
417c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(255, default_map->LookupSecondOpcode(148, VCD_ADD, 1, 0));
418c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Value of "mode" should not matter
419c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 2));
420c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(247, default_map->LookupSecondOpcode(20, VCD_ADD, 1, 255));
421c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Only valid 2nd ADD opcode has size 1
422c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 0, 0));
423c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 0, 255));
424c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_ADD, 255, 0));
425c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_ADD, 1, 0));
426c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(1, VCD_ADD, 1, 0));
427c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(247, VCD_ADD, 1, 0));
428c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_ADD, 1, 0));
429c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
430c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
431c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondRun) {
432c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_RUN, 0, 0));
433c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 0, 0));
434c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 0, 255));
435c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 255, 0));
436c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(20, VCD_RUN, 255, 255));
437c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_RUN, 0, 0));
438c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
439c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
440c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode0) {
441c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(163, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 0));
442c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(164, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 0));
443c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(165, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 0));
444c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(166, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 0));
445c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(167, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 0));
446c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(168, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 0));
447c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(169, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 0));
448c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(170, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 0));
449c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(171, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 0));
450c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(172, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 0));
451c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(173, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 0));
452c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(174, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 0));
453c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
454c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
455c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode1) {
456c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(175, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 1));
457c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(176, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 1));
458c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(177, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 1));
459c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(178, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 1));
460c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(179, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 1));
461c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(180, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 1));
462c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(181, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 1));
463c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(182, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 1));
464c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(183, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 1));
465c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(184, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 1));
466c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(185, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 1));
467c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(186, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 1));
468c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
469c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
470c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode2) {
471c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(187, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 2));
472c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(188, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 2));
473c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(189, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 2));
474c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(190, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 2));
475c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(191, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 2));
476c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(192, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 2));
477c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(193, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 2));
478c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(194, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 2));
479c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(195, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 2));
480c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(196, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 2));
481c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(197, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 2));
482c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(198, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 2));
483c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
484c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
485c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode3) {
486c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(199, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 3));
487c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(200, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 3));
488c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(201, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 3));
489c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(202, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 3));
490c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(203, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 3));
491c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(204, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 3));
492c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(205, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 3));
493c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(206, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 3));
494c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(207, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 3));
495c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(208, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 3));
496c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(209, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 3));
497c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(210, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 3));
498c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
499c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
500c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode4) {
501c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(211, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 4));
502c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(212, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 4));
503c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(213, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 4));
504c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(214, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 4));
505c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(215, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 4));
506c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(216, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 4));
507c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(217, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 4));
508c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(218, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 4));
509c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(219, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 4));
510c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(220, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 4));
511c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(221, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 4));
512c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(222, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 4));
513c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
514c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
515c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode5) {
516c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(223, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 5));
517c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(224, default_map->LookupSecondOpcode(2, VCD_COPY, 5, 5));
518c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(225, default_map->LookupSecondOpcode(2, VCD_COPY, 6, 5));
519c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(226, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 5));
520c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(227, default_map->LookupSecondOpcode(3, VCD_COPY, 5, 5));
521c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(228, default_map->LookupSecondOpcode(3, VCD_COPY, 6, 5));
522c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(229, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 5));
523c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(230, default_map->LookupSecondOpcode(4, VCD_COPY, 5, 5));
524c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(231, default_map->LookupSecondOpcode(4, VCD_COPY, 6, 5));
525c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(232, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 5));
526c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(233, default_map->LookupSecondOpcode(5, VCD_COPY, 5, 5));
527c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(234, default_map->LookupSecondOpcode(5, VCD_COPY, 6, 5));
528c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
529c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
530c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode6) {
531c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(235, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 6));
532c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(236, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 6));
533c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(237, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 6));
534c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(238, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 6));
535c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(239, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 7));
536c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
537c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
538c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode7) {
539c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(240, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 7));
540c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(241, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 7));
541c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(242, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 7));
542c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
543c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
544c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyMode8) {
545c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(243, default_map->LookupSecondOpcode(2, VCD_COPY, 4, 8));
546c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(244, default_map->LookupSecondOpcode(3, VCD_COPY, 4, 8));
547c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(245, default_map->LookupSecondOpcode(4, VCD_COPY, 4, 8));
548c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(246, default_map->LookupSecondOpcode(5, VCD_COPY, 4, 8));
549c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
550c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
551c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, DefaultMapLookupSecondCopyInvalid) {
552c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 0, 0));
553c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 255, 0));
554c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(2, VCD_COPY, 255, 255));
555c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(0, VCD_COPY, 4, 0));
556c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  EXPECT_EQ(kNoOpcode, default_map->LookupSecondOpcode(255, VCD_COPY, 4, 0));
557c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
558c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
559c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick ScottTEST_F(InstructionMapTest, ExerciseTableLookup) {
560c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  int opcode = 0;
561c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This loop has the same bounds as the one in SetUpTestCase.
562c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // Look up each instruction type and make sure it returns
563c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the proper opcode.
564c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  for (unsigned char inst_mode1 = 0;
565c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       inst_mode1 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
566c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott       ++inst_mode1) {
567c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char inst1 = inst_mode1;
568c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    unsigned char mode1 = 0;
569c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    if (inst_mode1 > VCD_COPY) {
570c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      inst1 = VCD_COPY;
571c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      mode1 = inst_mode1 - VCD_COPY;
572c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
573c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    for (unsigned char inst_mode2 = 0;
574c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         inst_mode2 <= VCD_LAST_INSTRUCTION_TYPE + kLastExerciseMode;
575c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott         ++inst_mode2) {
576c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char inst2 = inst_mode2;
577c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      unsigned char mode2 = 0;
578c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (inst_mode2 > VCD_COPY) {
579c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        inst2 = VCD_COPY;
580c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        mode2 = inst_mode2 - VCD_COPY;
581c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      }
582c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      if (inst2 == VCD_NOOP) {
583c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseFirstInstruction(opcode, inst1, 0, mode1);
584c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseFirstInstruction(opcode + 2,
585c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       inst1,
586c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       ((inst1 == VCD_NOOP) ? 0 : 255),
587c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                       mode1);
588c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      } else if (inst1 != VCD_NOOP) {
589c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseSecondInstruction(opcode,
590c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst1,
591c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        0,
592c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode1,
593c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst2,
594c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        0,
595c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode2);
596c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseSecondInstruction(opcode + 1,
597c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst1,
598c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        0,
599c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode1,
600c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst2,
601c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        255,
602c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode2);
603c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseSecondInstruction(opcode + 2,
604c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst1,
605c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        255,
606c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode1,
607c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst2,
608c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        0,
609c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode2);
610c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott        VerifyExerciseSecondInstruction(opcode + 3,
611c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst1,
612c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        255,
613c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode1,
614c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        inst2,
615c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        255,
616c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott                                        mode2);
617c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      }
618c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott      opcode += 4;
619c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott    }
620c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  }
621c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // This is a CHECK rather than an EXPECT because it validates only
622c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  // the logic of the test, not of the code being tested.
623c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott  CHECK_EQ(VCDiffCodeTableData::kCodeTableSize, opcode);
624c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}
625c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott
626c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // unnamed namespace
627c7f5f8508d98d5952d42ed7648c2a8f30a4da156Patrick Scott}  // namespace open_vcdiff
628