Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(7)

Side by Side Diff: src/trusted/validator_arm/inst_classes_testers.cc

Issue 10381030: Clean up testing of instructions. Allow testing to quit if test pattern tests (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/trusted/validator_arm/inst_classes_testers.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (c) 2012 The Native Client Authors. All rights reserved. 2 * Copyright (c) 2012 The Native Client Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 #ifndef NACL_TRUSTED_BUT_NOT_TCB 6 #ifndef NACL_TRUSTED_BUT_NOT_TCB
7 #error This file is not meant for use in the TCB 7 #error This file is not meant for use in the TCB
8 #endif 8 #endif
9 9
10 #include "native_client/src/trusted/validator_arm/inst_classes_testers.h" 10 #include "native_client/src/trusted/validator_arm/inst_classes_testers.h"
11 11
12 #include "gtest/gtest.h" 12 #include "gtest/gtest.h"
13 #include "native_client/src/trusted/validator_arm/decoder_tester.h" 13 #include "native_client/src/trusted/validator_arm/decoder_tester.h"
14 14
15 using nacl_arm_dec::kRegisterFlags; 15 using nacl_arm_dec::kRegisterFlags;
16 using nacl_arm_dec::kRegisterNone; 16 using nacl_arm_dec::kRegisterNone;
17 using nacl_arm_dec::kRegisterPc; 17 using nacl_arm_dec::kRegisterPc;
18 using nacl_arm_dec::kRegisterStack; 18 using nacl_arm_dec::kRegisterStack;
19 using nacl_arm_dec::Instruction; 19 using nacl_arm_dec::Instruction;
20 20
21 namespace nacl_arm_test { 21 namespace nacl_arm_test {
22 22
23 // Unary1RegisterImmediateOpTester 23 // Unary1RegisterImmediateOpTester
24 Unary1RegisterImmediateOpTester::Unary1RegisterImmediateOpTester( 24 Unary1RegisterImmediateOpTester::Unary1RegisterImmediateOpTester(
25 const NamedClassDecoder& decoder) 25 const NamedClassDecoder& decoder)
26 : Arm32DecoderTester(decoder) {} 26 : Arm32DecoderTester(decoder) {}
27 27
28 void Unary1RegisterImmediateOpTester:: 28 bool Unary1RegisterImmediateOpTester::
29 ApplySanityChecks(Instruction inst, 29 ApplySanityChecks(Instruction inst,
30 const NamedClassDecoder& decoder) { 30 const NamedClassDecoder& decoder) {
31 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder; 31 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder;
32 32
33 // Check that condition is defined correctly. 33 // Check that condition is defined correctly.
34 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 34 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
35 35
36 // Didn't parse undefined conditional. 36 // Didn't parse undefined conditional.
37 if (expected_decoder.cond.undefined(inst) && 37 if (expected_decoder.cond.undefined(inst)) {
38 (&ExpectedDecoder() != &decoder)) 38 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
39 return; 39 }
40 40
41 // Check if expected class name found. 41 // Check if expected class name found.
42 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 42 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
43 43
44 // Check Registers and flags used in DataProc. 44 // Check Registers and flags used in DataProc.
45 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 45 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
46 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 46 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
47 if (expected_decoder.flags.is_updated(inst)) { 47 if (expected_decoder.flags.is_updated(inst)) {
48 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 48 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
49 } else { 49 } else {
50 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 50 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
51 } 51 }
52 52
53 // Check that immediate value is computed correctly. 53 // Check that immediate value is computed correctly.
54 EXPECT_EQ(expected_decoder.imm4.value(inst), inst.bits(19, 16)); 54 EXPECT_EQ(expected_decoder.imm4.value(inst), inst.bits(19, 16));
55 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.bits(11, 0)); 55 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.bits(11, 0));
56 EXPECT_EQ(expected_decoder.ImmediateValue(inst), 56 EXPECT_EQ(expected_decoder.ImmediateValue(inst),
57 (inst.bits(19, 16) << 12) | inst.bits(11, 0)); 57 (inst.bits(19, 16) << 12) | inst.bits(11, 0));
58 EXPECT_LT(expected_decoder.ImmediateValue(inst), (uint32_t) 0x10000); 58 EXPECT_LT(expected_decoder.ImmediateValue(inst), (uint32_t) 0x10000);
59 59
60 // Other NaCl constraints about this instruction. 60 // Other NaCl constraints about this instruction.
61 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 61 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
62 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 62 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
63
64 return true;
63 } 65 }
64 66
65 // Unary1RegisterImmediateOpTesterRegsNotPc 67 // Unary1RegisterImmediateOpTesterRegsNotPc
66 Unary1RegisterImmediateOpTesterRegsNotPc:: 68 Unary1RegisterImmediateOpTesterRegsNotPc::
67 Unary1RegisterImmediateOpTesterRegsNotPc( 69 Unary1RegisterImmediateOpTesterRegsNotPc(
68 const NamedClassDecoder& decoder) 70 const NamedClassDecoder& decoder)
69 : Unary1RegisterImmediateOpTester(decoder) {} 71 : Unary1RegisterImmediateOpTester(decoder) {}
70 72
71 void Unary1RegisterImmediateOpTesterRegsNotPc:: 73 bool Unary1RegisterImmediateOpTesterRegsNotPc::
72 ApplySanityChecks(Instruction inst, 74 ApplySanityChecks(Instruction inst,
73 const NamedClassDecoder& decoder) { 75 const NamedClassDecoder& decoder) {
74 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder; 76 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder;
75 Unary1RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); 77
78 NC_PRECOND(Unary1RegisterImmediateOpTester::ApplySanityChecks(inst, decoder));
76 79
77 // Other ARM constraints about this instruction. 80 // Other ARM constraints about this instruction.
78 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 81 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
79 << "Expected Unpredictable for " << InstContents(); 82 << "Expected Unpredictable for " << InstContents();
83
84 return true;
80 } 85 }
81 86
82 Binary2RegisterImmediateOpTester::Binary2RegisterImmediateOpTester( 87 Binary2RegisterImmediateOpTester::Binary2RegisterImmediateOpTester(
83 const NamedClassDecoder& decoder) 88 const NamedClassDecoder& decoder)
84 : Arm32DecoderTester(decoder), apply_rd_is_pc_check_(true) {} 89 : Arm32DecoderTester(decoder), apply_rd_is_pc_check_(true) {}
85 90
86 void Binary2RegisterImmediateOpTester:: 91 bool Binary2RegisterImmediateOpTester::
87 ApplySanityChecks(Instruction inst, 92 ApplySanityChecks(Instruction inst,
88 const NamedClassDecoder& decoder) { 93 const NamedClassDecoder& decoder) {
89 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder; 94 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder;
90 95
91 // Check that condition is defined correctly. 96 // Check that condition is defined correctly.
92 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 97 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
93 98
94 // Didn't parse undefined conditional. 99 // Didn't parse undefined conditional.
95 if (expected_decoder.cond.undefined(inst) && 100 if (expected_decoder.cond.undefined(inst)) {
96 (&ExpectedDecoder() != &decoder)) 101 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
97 return; 102 }
98 103
99 // Check if expected class name found. 104 // Check if expected class name found.
100 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 105 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
101 106
102 // Check Registers and flags used in DataProc. 107 // Check Registers and flags used in DataProc.
103 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 108 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
104 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 109 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
105 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 110 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
106 if (expected_decoder.flags.is_updated(inst)) { 111 if (expected_decoder.flags.is_updated(inst)) {
107 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 112 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
108 } else { 113 } else {
109 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 114 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
110 } 115 }
111 116
112 // Check that immediate value is computed correctly. 117 // Check that immediate value is computed correctly.
113 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); 118 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0));
114 119
115 // Other NaCl constraints about this instruction. 120 // Other NaCl constraints about this instruction.
116 if (apply_rd_is_pc_check_) { 121 if (apply_rd_is_pc_check_) {
117 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 122 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
118 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 123 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
119 } 124 }
125
126 return true;
120 } 127 }
121 128
122 // Binary2RegisterImmediateOpTesterNotRdIsPcAndS 129 // Binary2RegisterImmediateOpTesterNotRdIsPcAndS
123 Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: 130 Binary2RegisterImmediateOpTesterNotRdIsPcAndS::
124 Binary2RegisterImmediateOpTesterNotRdIsPcAndS( 131 Binary2RegisterImmediateOpTesterNotRdIsPcAndS(
125 const NamedClassDecoder& decoder) 132 const NamedClassDecoder& decoder)
126 : Binary2RegisterImmediateOpTester(decoder) {} 133 : Binary2RegisterImmediateOpTester(decoder) {}
127 134
128 void Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: 135 bool Binary2RegisterImmediateOpTesterNotRdIsPcAndS::
129 ApplySanityChecks(Instruction inst, 136 ApplySanityChecks(Instruction inst,
130 const NamedClassDecoder& decoder) { 137 const NamedClassDecoder& decoder) {
131 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder; 138 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder;
132 139
133 // Check that we don't parse when Rd=15 and S=1. 140 // Check that we don't parse when Rd=15 and S=1.
134 if ((expected_decoder.d.reg(inst) == kRegisterPc) && 141 if ((expected_decoder.d.reg(inst) == kRegisterPc) &&
135 expected_decoder.flags.is_updated(inst) && 142 expected_decoder.flags.is_updated(inst)) {
136 (&ExpectedDecoder() != &decoder)) 143 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
137 return; 144 }
138 Binary2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); 145
146 return Binary2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder);
139 } 147 }
140 148
141 // Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS 149 // Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS
142 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS:: 150 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS::
143 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS( 151 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS(
144 const NamedClassDecoder& decoder) 152 const NamedClassDecoder& decoder)
145 : Binary2RegisterImmediateOpTesterNotRdIsPcAndS(decoder) { 153 : Binary2RegisterImmediateOpTesterNotRdIsPcAndS(decoder) {
146 apply_rd_is_pc_check_ = false; 154 apply_rd_is_pc_check_ = false;
147 } 155 }
148 156
149 // BinaryRegisterImmediateTestTester 157 // BinaryRegisterImmediateTestTester
150 BinaryRegisterImmediateTestTester::BinaryRegisterImmediateTestTester( 158 BinaryRegisterImmediateTestTester::BinaryRegisterImmediateTestTester(
151 const NamedClassDecoder& decoder) 159 const NamedClassDecoder& decoder)
152 : Arm32DecoderTester(decoder) {} 160 : Arm32DecoderTester(decoder) {}
153 161
154 void BinaryRegisterImmediateTestTester:: 162 bool BinaryRegisterImmediateTestTester::
155 ApplySanityChecks(Instruction inst, 163 ApplySanityChecks(Instruction inst,
156 const NamedClassDecoder& decoder) { 164 const NamedClassDecoder& decoder) {
157 nacl_arm_dec::BinaryRegisterImmediateTest expected_decoder; 165 nacl_arm_dec::BinaryRegisterImmediateTest expected_decoder;
158 166
159 // Check that condition is defined correctly. 167 // Check that condition is defined correctly.
160 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 168 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
161 169
162 // Didn't parse undefined conditional. 170 // Didn't parse undefined conditional.
163 if (expected_decoder.cond.undefined(inst) && 171 if (expected_decoder.cond.undefined(inst)) {
164 (&ExpectedDecoder() != &decoder)) 172 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
165 return; 173 }
166 174
167 // Check if expected class name found. 175 // Check if expected class name found.
168 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 176 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
169 177
170 // Check Registers and flags used in DataProc. 178 // Check Registers and flags used in DataProc.
171 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 179 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
172 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 180 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
173 if (expected_decoder.flags.is_updated(inst)) { 181 if (expected_decoder.flags.is_updated(inst)) {
174 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 182 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
175 } else { 183 } else {
176 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 184 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
177 } 185 }
178 186
179 // Check that immediate value is computed correctly. 187 // Check that immediate value is computed correctly.
180 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); 188 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0));
189
190 return true;
181 } 191 }
182 192
183 // Unary2RegisterOpTester 193 // Unary2RegisterOpTester
184 Unary2RegisterOpTester::Unary2RegisterOpTester( 194 Unary2RegisterOpTester::Unary2RegisterOpTester(
185 const NamedClassDecoder& decoder) 195 const NamedClassDecoder& decoder)
186 : Arm32DecoderTester(decoder) {} 196 : Arm32DecoderTester(decoder) {}
187 197
188 void Unary2RegisterOpTester:: 198 bool Unary2RegisterOpTester::
189 ApplySanityChecks(Instruction inst, 199 ApplySanityChecks(Instruction inst,
190 const NamedClassDecoder& decoder) { 200 const NamedClassDecoder& decoder) {
191 nacl_arm_dec::Unary2RegisterOp expected_decoder; 201 nacl_arm_dec::Unary2RegisterOp expected_decoder;
192 202
193 // Check that condition is defined correctly. 203 // Check that condition is defined correctly.
194 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 204 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
195 205
196 // Didn't parse undefined conditional. 206 // Didn't parse undefined conditional.
197 if (expected_decoder.cond.undefined(inst) && 207 if (expected_decoder.cond.undefined(inst)) {
198 (&ExpectedDecoder() != &decoder)) 208 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
199 return; 209 }
200 210
201 // Check if expected class name found. 211 // Check if expected class name found.
202 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 212 NC_PRECOND(!Arm32DecoderTester::ApplySanityChecks(inst, decoder));
203 213
204 // Check Registers and flags used in DataProc. 214 // Check Registers and flags used in DataProc.
205 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 215 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
206 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 216 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
207 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 217 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
208 if (expected_decoder.flags.is_updated(inst)) { 218 if (expected_decoder.flags.is_updated(inst)) {
209 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 219 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
210 } else { 220 } else {
211 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 221 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
212 } 222 }
213 223
214 // Other NaCl constraints about this instruction. 224 // Other NaCl constraints about this instruction.
215 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 225 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
216 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 226 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
227
228 return true;
217 } 229 }
218 230
219 // Unary2RegisterOpTesterNotRdIsPcAndS 231 // Unary2RegisterOpTesterNotRdIsPcAndS
220 Unary2RegisterOpTesterNotRdIsPcAndS::Unary2RegisterOpTesterNotRdIsPcAndS( 232 Unary2RegisterOpTesterNotRdIsPcAndS::Unary2RegisterOpTesterNotRdIsPcAndS(
221 const NamedClassDecoder& decoder) 233 const NamedClassDecoder& decoder)
222 : Unary2RegisterOpTester(decoder) {} 234 : Unary2RegisterOpTester(decoder) {}
223 235
224 236
225 void Unary2RegisterOpTesterNotRdIsPcAndS:: 237 bool Unary2RegisterOpTesterNotRdIsPcAndS::
226 ApplySanityChecks(Instruction inst, 238 ApplySanityChecks(Instruction inst,
227 const NamedClassDecoder& decoder) { 239 const NamedClassDecoder& decoder) {
228 nacl_arm_dec::Unary2RegisterOp expected_decoder; 240 nacl_arm_dec::Unary2RegisterOp expected_decoder;
229 241
230 // Check that we don't parse when Rd=15 and S=1. 242 // Check that we don't parse when Rd=15 and S=1.
231 if ((expected_decoder.d.reg(inst) == kRegisterPc) && 243 if ((expected_decoder.d.reg(inst) == kRegisterPc) &&
232 expected_decoder.flags.is_updated(inst) && 244 expected_decoder.flags.is_updated(inst)) {
233 (&ExpectedDecoder() != &decoder)) 245 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
234 return; 246 }
235 Unary2RegisterOpTester::ApplySanityChecks(inst, decoder); 247
248 return Unary2RegisterOpTester::ApplySanityChecks(inst, decoder);
236 } 249 }
237 250
238 // Binary3RegisterOpTester 251 // Binary3RegisterOpTester
239 Binary3RegisterOpTester::Binary3RegisterOpTester( 252 Binary3RegisterOpTester::Binary3RegisterOpTester(
240 const NamedClassDecoder& decoder) 253 const NamedClassDecoder& decoder)
241 : Arm32DecoderTester(decoder) {} 254 : Arm32DecoderTester(decoder) {}
242 255
243 void Binary3RegisterOpTester:: 256 bool Binary3RegisterOpTester::
244 ApplySanityChecks(Instruction inst, 257 ApplySanityChecks(Instruction inst,
245 const NamedClassDecoder& decoder) { 258 const NamedClassDecoder& decoder) {
246 nacl_arm_dec::Binary3RegisterOp expected_decoder; 259 nacl_arm_dec::Binary3RegisterOp expected_decoder;
247 260
248 // Check that condition is defined correctly. 261 // Check that condition is defined correctly.
249 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 262 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
250 263
251 // Didn't parse undefined conditional. 264 // Didn't parse undefined conditional.
252 if (expected_decoder.cond.undefined(inst) && 265 if (expected_decoder.cond.undefined(inst)) {
253 (&ExpectedDecoder() != &decoder)) 266 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
254 return; 267 }
255 268
256 // Check if expected class name found. 269 // Check if expected class name found.
257 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 270 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
258 271
259 // Check Registers and flags used in DataProc. 272 // Check Registers and flags used in DataProc.
260 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 273 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
261 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(11, 8)); 274 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(11, 8));
262 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(3, 0)); 275 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(3, 0));
263 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 276 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
264 if (expected_decoder.flags.is_updated(inst)) { 277 if (expected_decoder.flags.is_updated(inst)) {
265 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 278 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
266 } else { 279 } else {
267 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 280 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
268 } 281 }
269 282
270 // Other NaCl constraints about this instruction. 283 // Other NaCl constraints about this instruction.
271 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 284 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
272 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 285 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
286
287 return true;
273 } 288 }
274 289
275 // Binary3RegisterOpTesterRegsNotPc 290 // Binary3RegisterOpTesterRegsNotPc
276 Binary3RegisterOpTesterRegsNotPc::Binary3RegisterOpTesterRegsNotPc( 291 Binary3RegisterOpTesterRegsNotPc::Binary3RegisterOpTesterRegsNotPc(
277 const NamedClassDecoder& decoder) 292 const NamedClassDecoder& decoder)
278 : Binary3RegisterOpTester(decoder) {} 293 : Binary3RegisterOpTester(decoder) {}
279 294
280 void Binary3RegisterOpTesterRegsNotPc:: 295 bool Binary3RegisterOpTesterRegsNotPc::
281 ApplySanityChecks(Instruction inst, 296 ApplySanityChecks(Instruction inst,
282 const NamedClassDecoder& decoder) { 297 const NamedClassDecoder& decoder) {
283 nacl_arm_dec::Binary3RegisterOp expected_decoder; 298 nacl_arm_dec::Binary3RegisterOp expected_decoder;
284 Binary3RegisterOpTester::ApplySanityChecks(inst, decoder); 299
300 NC_PRECOND(Binary3RegisterOpTester::ApplySanityChecks(inst, decoder));
285 301
286 // Other ARM constraints about this instruction. 302 // Other ARM constraints about this instruction.
287 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 303 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
288 << "Expected Unpredictable for " << InstContents(); 304 << "Expected Unpredictable for " << InstContents();
289 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15) 305 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15)
290 << "Expected Unpredictable for " << InstContents(); 306 << "Expected Unpredictable for " << InstContents();
291 EXPECT_NE(expected_decoder.n.number(inst), (uint32_t) 15) 307 EXPECT_NE(expected_decoder.n.number(inst), (uint32_t) 15)
292 << "Expected Unpredictable for " << InstContents(); 308 << "Expected Unpredictable for " << InstContents();
309
310 return true;
293 } 311 }
294 312
295 // Unary2RegisterImmedShiftedOpTester 313 // Unary2RegisterImmedShiftedOpTester
296 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester( 314 Unary2RegisterImmedShiftedOpTester::Unary2RegisterImmedShiftedOpTester(
297 const NamedClassDecoder& decoder) 315 const NamedClassDecoder& decoder)
298 : Arm32DecoderTester(decoder) {} 316 : Arm32DecoderTester(decoder) {}
299 317
300 void Unary2RegisterImmedShiftedOpTester:: 318 bool Unary2RegisterImmedShiftedOpTester::
301 ApplySanityChecks(Instruction inst, 319 ApplySanityChecks(Instruction inst,
302 const NamedClassDecoder& decoder) { 320 const NamedClassDecoder& decoder) {
303 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; 321 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder;
304 322
305 // Check that condition is defined correctly. 323 // Check that condition is defined correctly.
306 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 324 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
307 325
308 // Didn't parse undefined conditional. 326 // Didn't parse undefined conditional.
309 if (expected_decoder.cond.undefined(inst) && 327 if (expected_decoder.cond.undefined(inst)) {
310 (&ExpectedDecoder() != &decoder)) 328 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
311 return; 329 }
312 330
313 // Check if expected class name found. 331 // Check if expected class name found.
314 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 332 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
315 333
316 // Check Registers and flags used in DataProc. 334 // Check Registers and flags used in DataProc.
317 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 335 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
318 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 336 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
319 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 337 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
320 if (expected_decoder.flags.is_updated(inst)) { 338 if (expected_decoder.flags.is_updated(inst)) {
321 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 339 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
322 } else { 340 } else {
323 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 341 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
324 } 342 }
325 343
326 // Check that immediate value is computed correctly. 344 // Check that immediate value is computed correctly.
327 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); 345 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7));
328 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); 346 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5));
329 347
330 // Other NaCl constraints about this instruction. 348 // Other NaCl constraints about this instruction.
331 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 349 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
332 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 350 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
351
352 return true;
333 } 353 }
334 354
335 // Unary2RegisterImmedShiftedOpTesterImm5NotZero 355 // Unary2RegisterImmedShiftedOpTesterImm5NotZero
336 Unary2RegisterImmedShiftedOpTesterImm5NotZero:: 356 Unary2RegisterImmedShiftedOpTesterImm5NotZero::
337 Unary2RegisterImmedShiftedOpTesterImm5NotZero( 357 Unary2RegisterImmedShiftedOpTesterImm5NotZero(
338 const NamedClassDecoder& decoder) 358 const NamedClassDecoder& decoder)
339 : Unary2RegisterImmedShiftedOpTester(decoder) {} 359 : Unary2RegisterImmedShiftedOpTester(decoder) {}
340 360
341 void Unary2RegisterImmedShiftedOpTesterImm5NotZero:: 361 bool Unary2RegisterImmedShiftedOpTesterImm5NotZero::
342 ApplySanityChecks(Instruction inst, 362 ApplySanityChecks(Instruction inst,
343 const NamedClassDecoder& decoder) { 363 const NamedClassDecoder& decoder) {
344 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; 364 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder;
345 365
346 // Check that we don't parse when imm5=0. 366 // Check that we don't parse when imm5=0.
347 if ((0 == expected_decoder.imm.value(inst)) && 367 if (0 == expected_decoder.imm.value(inst)) {
348 (&ExpectedDecoder() != &decoder)) 368 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
349 return; 369 }
350 Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); 370
371 return Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder);
351 } 372 }
352 373
353 // Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS 374 // Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS
354 Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS:: 375 Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS::
355 Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS( 376 Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS(
356 const NamedClassDecoder& decoder) 377 const NamedClassDecoder& decoder)
357 : Unary2RegisterImmedShiftedOpTester(decoder) {} 378 : Unary2RegisterImmedShiftedOpTester(decoder) {}
358 379
359 void Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS:: 380 bool Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS::
360 ApplySanityChecks(Instruction inst, 381 ApplySanityChecks(Instruction inst,
361 const NamedClassDecoder& decoder) { 382 const NamedClassDecoder& decoder) {
362 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; 383 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder;
363 384
364 // Check that we don't parse when Rd=15 and S=1. 385 // Check that we don't parse when Rd=15 and S=1.
365 if ((expected_decoder.d.reg(inst) == kRegisterPc) && 386 if ((expected_decoder.d.reg(inst) == kRegisterPc) &&
366 expected_decoder.flags.is_updated(inst) && 387 expected_decoder.flags.is_updated(inst)) {
367 (&ExpectedDecoder() != &decoder)) 388 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
368 return; 389 }
369 Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); 390
391 return Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder);
370 } 392 }
371 393
372 // Unary3RegisterShiftedOpTester 394 // Unary3RegisterShiftedOpTester
373 Unary3RegisterShiftedOpTester::Unary3RegisterShiftedOpTester( 395 Unary3RegisterShiftedOpTester::Unary3RegisterShiftedOpTester(
374 const NamedClassDecoder& decoder) 396 const NamedClassDecoder& decoder)
375 : Arm32DecoderTester(decoder) {} 397 : Arm32DecoderTester(decoder) {}
376 398
377 void Unary3RegisterShiftedOpTester:: 399 bool Unary3RegisterShiftedOpTester::
378 ApplySanityChecks(Instruction inst, 400 ApplySanityChecks(Instruction inst,
379 const NamedClassDecoder& decoder) { 401 const NamedClassDecoder& decoder) {
380 nacl_arm_dec::Unary3RegisterShiftedOp expected_decoder; 402 nacl_arm_dec::Unary3RegisterShiftedOp expected_decoder;
381 403
382 // Check that condition is defined correctly. 404 // Check that condition is defined correctly.
383 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 405 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
384 406
385 // Didn't parse undefined conditional. 407 // Didn't parse undefined conditional.
386 if (expected_decoder.cond.undefined(inst) && 408 if (expected_decoder.cond.undefined(inst)) {
387 (&ExpectedDecoder() != &decoder)) 409 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
388 return; 410 }
389 411
390 // Check if expected class name found. 412 // Check if expected class name found.
391 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 413 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
392 414
393 // Check Registers and flags used in DataProc. 415 // Check Registers and flags used in DataProc.
394 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 416 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
395 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); 417 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8));
396 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 418 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
397 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 419 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
398 if (expected_decoder.flags.is_updated(inst)) { 420 if (expected_decoder.flags.is_updated(inst)) {
399 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 421 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
400 } else { 422 } else {
401 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 423 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
402 } 424 }
403 425
404 // Check the shift type. 426 // Check the shift type.
405 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); 427 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5));
406 428
407 // Other NaCl constraints about this instruction. 429 // Other NaCl constraints about this instruction.
408 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 430 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
409 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 431 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
432
433 return true;
410 } 434 }
411 435
412 // Unary3RegisterShiftedOpTesterRegsNotPc 436 // Unary3RegisterShiftedOpTesterRegsNotPc
413 Unary3RegisterShiftedOpTesterRegsNotPc::Unary3RegisterShiftedOpTesterRegsNotPc( 437 Unary3RegisterShiftedOpTesterRegsNotPc::Unary3RegisterShiftedOpTesterRegsNotPc(
414 const NamedClassDecoder& decoder) 438 const NamedClassDecoder& decoder)
415 : Unary3RegisterShiftedOpTester(decoder) {} 439 : Unary3RegisterShiftedOpTester(decoder) {}
416 440
417 void Unary3RegisterShiftedOpTesterRegsNotPc:: 441 bool Unary3RegisterShiftedOpTesterRegsNotPc::
418 ApplySanityChecks(Instruction inst, 442 ApplySanityChecks(Instruction inst,
419 const NamedClassDecoder& decoder) { 443 const NamedClassDecoder& decoder) {
420 nacl_arm_dec::Unary3RegisterShiftedOp expected_decoder; 444 nacl_arm_dec::Unary3RegisterShiftedOp expected_decoder;
421 445
422 Unary3RegisterShiftedOpTester::ApplySanityChecks(inst, decoder); 446 NC_PRECOND(Unary3RegisterShiftedOpTester::ApplySanityChecks(inst, decoder));
423 447
424 // Other ARM constraints about this instruction. 448 // Other ARM constraints about this instruction.
425 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 449 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
426 << "Expected Unpredictable for " << InstContents(); 450 << "Expected Unpredictable for " << InstContents();
427 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15) 451 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15)
428 << "Expected Unpredictable for " << InstContents(); 452 << "Expected Unpredictable for " << InstContents();
429 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15) 453 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15)
430 << "Expected Unpredictable for " << InstContents(); 454 << "Expected Unpredictable for " << InstContents();
455
456 return true;
431 } 457 }
432 458
433 // Binary3RegisterImmedShiftedOpTester 459 // Binary3RegisterImmedShiftedOpTester
434 Binary3RegisterImmedShiftedOpTester::Binary3RegisterImmedShiftedOpTester( 460 Binary3RegisterImmedShiftedOpTester::Binary3RegisterImmedShiftedOpTester(
435 const NamedClassDecoder& decoder) 461 const NamedClassDecoder& decoder)
436 : Arm32DecoderTester(decoder) {} 462 : Arm32DecoderTester(decoder) {}
437 463
438 void Binary3RegisterImmedShiftedOpTester:: 464 bool Binary3RegisterImmedShiftedOpTester::
439 ApplySanityChecks(Instruction inst, 465 ApplySanityChecks(Instruction inst,
440 const NamedClassDecoder& decoder) { 466 const NamedClassDecoder& decoder) {
441 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder; 467 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder;
442 468
443 // Check that condition is defined correctly. 469 // Check that condition is defined correctly.
444 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 470 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
445 471
446 // Didn't parse undefined conditional. 472 // Didn't parse undefined conditional.
447 if (expected_decoder.cond.undefined(inst) && 473 if (expected_decoder.cond.undefined(inst)) {
448 (&ExpectedDecoder() != &decoder)) 474 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
449 return; 475 }
450 476
451 // Check if expected class name found. 477 // Check if expected class name found.
452 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 478 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
453 479
454 // Check Registers and flags used in DataProc. 480 // Check Registers and flags used in DataProc.
455 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 481 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
456 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 482 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
457 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 483 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
458 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 484 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
459 if (expected_decoder.flags.is_updated(inst)) { 485 if (expected_decoder.flags.is_updated(inst)) {
460 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 486 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
461 } else { 487 } else {
462 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 488 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
463 } 489 }
464 490
465 // Check that immediate value is computed correctly. 491 // Check that immediate value is computed correctly.
466 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); 492 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7));
467 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); 493 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5));
468 494
469 // Other NaCl constraints about this instruction. 495 // Other NaCl constraints about this instruction.
470 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 496 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
471 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 497 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
498
499 return true;
472 } 500 }
473 501
474 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS 502 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS
475 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: 503 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS::
476 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS( 504 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS(
477 const NamedClassDecoder& decoder) 505 const NamedClassDecoder& decoder)
478 : Binary3RegisterImmedShiftedOpTester(decoder) {} 506 : Binary3RegisterImmedShiftedOpTester(decoder) {}
479 507
480 void Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: 508 bool Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS::
481 ApplySanityChecks(Instruction inst, 509 ApplySanityChecks(Instruction inst,
482 const NamedClassDecoder& decoder) { 510 const NamedClassDecoder& decoder) {
483 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder; 511 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder;
484 512
485 // Check that we don't parse when Rd=15 and S=1. 513 // Check that we don't parse when Rd=15 and S=1.
486 if ((expected_decoder.d.reg(inst) == kRegisterPc) && 514 if ((expected_decoder.d.reg(inst) == kRegisterPc) &&
487 expected_decoder.flags.is_updated(inst) && 515 expected_decoder.flags.is_updated(inst)) {
488 (&ExpectedDecoder() != &decoder)) 516 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
489 return; 517 }
490 Binary3RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); 518
519 return Binary3RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder);
491 } 520 }
492 521
493 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp 522 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp
494 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp:: 523 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp::
495 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp( 524 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp(
496 const NamedClassDecoder& decoder) 525 const NamedClassDecoder& decoder)
497 : Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS(decoder) {} 526 : Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS(decoder) {}
498 527
499 void Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp:: 528 bool Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndSOrRnIsSp::
500 ApplySanityChecks(Instruction inst, 529 ApplySanityChecks(Instruction inst,
501 const NamedClassDecoder& decoder) { 530 const NamedClassDecoder& decoder) {
502 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder; 531 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder;
503 532
504 // Check that we don't parse when Rn=13 533 // Check that we don't parse when Rn=13
505 if ((expected_decoder.n.reg(inst) == kRegisterStack) && 534 if (expected_decoder.n.reg(inst) == kRegisterStack) {
506 (&ExpectedDecoder() != &decoder)) 535 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
507 return; 536 }
508 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: 537
538 return Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS::
509 ApplySanityChecks(inst, decoder); 539 ApplySanityChecks(inst, decoder);
510 } 540 }
511 541
512 // Binary4RegisterShiftedOpTester 542 // Binary4RegisterShiftedOpTester
513 Binary4RegisterShiftedOpTester::Binary4RegisterShiftedOpTester( 543 Binary4RegisterShiftedOpTester::Binary4RegisterShiftedOpTester(
514 const NamedClassDecoder& decoder) 544 const NamedClassDecoder& decoder)
515 : Arm32DecoderTester(decoder) {} 545 : Arm32DecoderTester(decoder) {}
516 546
517 void Binary4RegisterShiftedOpTester:: 547 bool Binary4RegisterShiftedOpTester::
518 ApplySanityChecks(Instruction inst, 548 ApplySanityChecks(Instruction inst,
519 const NamedClassDecoder& decoder) { 549 const NamedClassDecoder& decoder) {
520 nacl_arm_dec::Binary4RegisterShiftedOp expected_decoder; 550 nacl_arm_dec::Binary4RegisterShiftedOp expected_decoder;
521 551
522 // Check that condition is defined correctly. 552 // Check that condition is defined correctly.
523 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 553 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
524 554
525 // Didn't parse undefined conditional. 555 // Didn't parse undefined conditional.
526 if (expected_decoder.cond.undefined(inst) && 556 if (expected_decoder.cond.undefined(inst)) {
527 (&ExpectedDecoder() != &decoder)) 557 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
528 return; 558 }
529 559
530 // Check if expected class name found. 560 // Check if expected class name found.
531 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 561 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
532 562
533 // Check Registers and flags used in DataProc. 563 // Check Registers and flags used in DataProc.
534 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 564 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
535 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); 565 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12));
536 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); 566 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8));
537 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 567 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
538 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 568 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
539 if (expected_decoder.flags.is_updated(inst)) { 569 if (expected_decoder.flags.is_updated(inst)) {
540 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 570 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
541 } else { 571 } else {
542 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 572 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
543 } 573 }
544 574
545 // Other NaCl constraints about this instruction. 575 // Other NaCl constraints about this instruction.
546 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) 576 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15)
547 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); 577 << "Expected FORBIDDEN_OPERANDS for " << InstContents();
578
579 return true;
548 } 580 }
549 581
550 // Binary4RegisterShiftedOpTesterRegsNotPc 582 // Binary4RegisterShiftedOpTesterRegsNotPc
551 Binary4RegisterShiftedOpTesterRegsNotPc:: 583 Binary4RegisterShiftedOpTesterRegsNotPc::
552 Binary4RegisterShiftedOpTesterRegsNotPc( 584 Binary4RegisterShiftedOpTesterRegsNotPc(
553 const NamedClassDecoder& decoder) 585 const NamedClassDecoder& decoder)
554 : Binary4RegisterShiftedOpTester(decoder) {} 586 : Binary4RegisterShiftedOpTester(decoder) {}
555 587
556 void Binary4RegisterShiftedOpTesterRegsNotPc:: 588 bool Binary4RegisterShiftedOpTesterRegsNotPc::
557 ApplySanityChecks(Instruction inst, 589 ApplySanityChecks(Instruction inst,
558 const NamedClassDecoder& decoder) { 590 const NamedClassDecoder& decoder) {
559 nacl_arm_dec::Binary4RegisterShiftedOp expected_decoder; 591 nacl_arm_dec::Binary4RegisterShiftedOp expected_decoder;
560 Binary4RegisterShiftedOpTester::ApplySanityChecks(inst, decoder); 592
593 NC_PRECOND(Binary4RegisterShiftedOpTester::ApplySanityChecks(inst, decoder));
561 594
562 // Other ARM constraints about this instruction. 595 // Other ARM constraints about this instruction.
563 EXPECT_NE(expected_decoder.n.reg(inst), kRegisterPc) 596 EXPECT_NE(expected_decoder.n.reg(inst), kRegisterPc)
564 << "Expected Unpredictable for " << InstContents(); 597 << "Expected Unpredictable for " << InstContents();
565 EXPECT_NE(expected_decoder.d.reg(inst), kRegisterPc) 598 EXPECT_NE(expected_decoder.d.reg(inst), kRegisterPc)
566 << "Expected Unpredictable for " << InstContents(); 599 << "Expected Unpredictable for " << InstContents();
567 EXPECT_NE(expected_decoder.s.reg(inst), kRegisterPc) 600 EXPECT_NE(expected_decoder.s.reg(inst), kRegisterPc)
568 << "Expected Unpredictable for " << InstContents(); 601 << "Expected Unpredictable for " << InstContents();
569 EXPECT_NE(expected_decoder.m.reg(inst), kRegisterPc) 602 EXPECT_NE(expected_decoder.m.reg(inst), kRegisterPc)
570 << "Expected Unpredictable for " << InstContents(); 603 << "Expected Unpredictable for " << InstContents();
604
605 return true;
571 } 606 }
572 607
573 // Binary2RegisterImmedShiftedTestTester 608 // Binary2RegisterImmedShiftedTestTester
574 Binary2RegisterImmedShiftedTestTester::Binary2RegisterImmedShiftedTestTester( 609 Binary2RegisterImmedShiftedTestTester::Binary2RegisterImmedShiftedTestTester(
575 const NamedClassDecoder& decoder) 610 const NamedClassDecoder& decoder)
576 : Arm32DecoderTester(decoder) {} 611 : Arm32DecoderTester(decoder) {}
577 612
578 void Binary2RegisterImmedShiftedTestTester:: 613 bool Binary2RegisterImmedShiftedTestTester::
579 ApplySanityChecks(Instruction inst, 614 ApplySanityChecks(Instruction inst,
580 const NamedClassDecoder& decoder) { 615 const NamedClassDecoder& decoder) {
581 nacl_arm_dec::Binary2RegisterImmedShiftedTest expected_decoder; 616 nacl_arm_dec::Binary2RegisterImmedShiftedTest expected_decoder;
582 617
583 // Check that condition is defined correctly. 618 // Check that condition is defined correctly.
584 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 619 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
585 620
586 // Didn't parse undefined conditional. 621 // Didn't parse undefined conditional.
587 if (expected_decoder.cond.undefined(inst) && 622 if (expected_decoder.cond.undefined(inst)) {
588 (&ExpectedDecoder() != &decoder)) 623 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
589 return; 624 }
590 625
591 // Check if expected class name found. 626 // Check if expected class name found.
592 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 627 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
593 628
594 // Check Registers and flags used in DataProc. 629 // Check Registers and flags used in DataProc.
595 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 630 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
596 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 631 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
597 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 632 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
598 if (expected_decoder.flags.is_updated(inst)) { 633 if (expected_decoder.flags.is_updated(inst)) {
599 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 634 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
600 } else { 635 } else {
601 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 636 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
602 } 637 }
603 638
604 // Check that immediate value is computed correctly. 639 // Check that immediate value is computed correctly.
605 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); 640 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7));
606 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); 641 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5));
642
643 return true;
607 } 644 }
608 645
609 // Binary3RegisterShiftedTestTester 646 // Binary3RegisterShiftedTestTester
610 Binary3RegisterShiftedTestTester::Binary3RegisterShiftedTestTester( 647 Binary3RegisterShiftedTestTester::Binary3RegisterShiftedTestTester(
611 const NamedClassDecoder& decoder) 648 const NamedClassDecoder& decoder)
612 : Arm32DecoderTester(decoder) {} 649 : Arm32DecoderTester(decoder) {}
613 650
614 void Binary3RegisterShiftedTestTester:: 651 bool Binary3RegisterShiftedTestTester::
615 ApplySanityChecks(Instruction inst, 652 ApplySanityChecks(Instruction inst,
616 const NamedClassDecoder& decoder) { 653 const NamedClassDecoder& decoder) {
617 nacl_arm_dec::Binary3RegisterShiftedTest expected_decoder; 654 nacl_arm_dec::Binary3RegisterShiftedTest expected_decoder;
618 655
619 // Check that condition is defined correctly. 656 // Check that condition is defined correctly.
620 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28)); 657 EXPECT_EQ(expected_decoder.cond.value(inst), inst.bits(31, 28));
621 658
622 // Didn't parse undefined conditional. 659 // Didn't parse undefined conditional.
623 if (expected_decoder.cond.undefined(inst) && 660 if (expected_decoder.cond.undefined(inst)) {
624 (&ExpectedDecoder() != &decoder)) 661 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
625 return; 662 }
626 663
627 // Check if expected class name found. 664 // Check if expected class name found.
628 Arm32DecoderTester::ApplySanityChecks(inst, decoder); 665 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
629 666
630 // Check Registers and flags used in DataProc. 667 // Check Registers and flags used in DataProc.
631 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); 668 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16));
632 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); 669 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8));
633 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); 670 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0));
634 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); 671 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20));
635 if (expected_decoder.flags.is_updated(inst)) { 672 if (expected_decoder.flags.is_updated(inst)) {
636 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); 673 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags);
637 } else { 674 } else {
638 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); 675 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone);
639 } 676 }
640 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); 677 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5));
678
679 return true;
641 } 680 }
642 681
643 // Binary3RegisterShiftedTestTesterRegsNotPc 682 // Binary3RegisterShiftedTestTesterRegsNotPc
644 Binary3RegisterShiftedTestTesterRegsNotPc:: 683 Binary3RegisterShiftedTestTesterRegsNotPc::
645 Binary3RegisterShiftedTestTesterRegsNotPc( 684 Binary3RegisterShiftedTestTesterRegsNotPc(
646 const NamedClassDecoder& decoder) 685 const NamedClassDecoder& decoder)
647 : Binary3RegisterShiftedTestTester(decoder) {} 686 : Binary3RegisterShiftedTestTester(decoder) {}
648 687
649 void Binary3RegisterShiftedTestTesterRegsNotPc:: 688 bool Binary3RegisterShiftedTestTesterRegsNotPc::
650 ApplySanityChecks(Instruction inst, 689 ApplySanityChecks(Instruction inst,
651 const NamedClassDecoder& decoder) { 690 const NamedClassDecoder& decoder) {
652 nacl_arm_dec::Binary3RegisterShiftedTest expected_decoder; 691 nacl_arm_dec::Binary3RegisterShiftedTest expected_decoder;
653 Binary3RegisterShiftedTestTester::ApplySanityChecks(inst, decoder); 692
693 NC_PRECOND(Binary3RegisterShiftedTestTester::ApplySanityChecks(
694 inst, decoder));
654 695
655 // Other ARM constraints about this instruction. 696 // Other ARM constraints about this instruction.
656 EXPECT_NE(expected_decoder.n.number(inst), (uint32_t) 15) 697 EXPECT_NE(expected_decoder.n.number(inst), (uint32_t) 15)
657 << "Expected Unpredictable for " << InstContents(); 698 << "Expected Unpredictable for " << InstContents();
658 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15) 699 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15)
659 << "Expected Unpredictable for " << InstContents(); 700 << "Expected Unpredictable for " << InstContents();
660 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15) 701 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15)
661 << "Expected Unpredictable for " << InstContents(); 702 << "Expected Unpredictable for " << InstContents();
703
704 return true;
662 } 705 }
663 706
664 } // namespace 707 } // namespace
OLDNEW
« no previous file with comments | « src/trusted/validator_arm/inst_classes_testers.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698