| OLD | NEW |
| 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::kConditions; |
| 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) |
| (...skipping 10 matching lines...) Expand all Loading... |
| 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 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 38 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 39 } | 39 } |
| 40 | 40 |
| 41 // Check if expected class name found. | 41 // Check if expected class name found. |
| 42 NC_PRECOND(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.conditions.is_updated(inst), inst.bit(20)); |
| 47 if (expected_decoder.flags.is_updated(inst)) { | 47 if (expected_decoder.conditions.is_updated(inst)) { |
| 48 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 48 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 49 } else { | 49 } else { |
| 50 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 50 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 51 kRegisterNone); |
| 51 } | 52 } |
| 52 | 53 |
| 53 // Check that immediate value is computed correctly. | 54 // Check that immediate value is computed correctly. |
| 54 EXPECT_EQ(expected_decoder.imm4.value(inst), inst.bits(19, 16)); | 55 EXPECT_EQ(expected_decoder.imm4.value(inst), inst.bits(19, 16)); |
| 55 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.bits(11, 0)); | 56 EXPECT_EQ(expected_decoder.imm12.value(inst), inst.bits(11, 0)); |
| 56 EXPECT_EQ(expected_decoder.ImmediateValue(inst), | 57 EXPECT_EQ(expected_decoder.ImmediateValue(inst), |
| 57 (inst.bits(19, 16) << 12) | inst.bits(11, 0)); | 58 (inst.bits(19, 16) << 12) | inst.bits(11, 0)); |
| 58 EXPECT_LT(expected_decoder.ImmediateValue(inst), (uint32_t) 0x10000); | 59 EXPECT_LT(expected_decoder.ImmediateValue(inst), (uint32_t) 0x10000); |
| 59 | 60 |
| 60 // Other NaCl constraints about this instruction. | 61 // Other NaCl constraints about this instruction. |
| (...skipping 29 matching lines...) Expand all Loading... |
| 90 const NamedClassDecoder& decoder) | 91 const NamedClassDecoder& decoder) |
| 91 : Unary1RegisterImmediateOpTester(decoder) {} | 92 : Unary1RegisterImmediateOpTester(decoder) {} |
| 92 | 93 |
| 93 bool Unary1RegisterImmediateOpTesterNotRdIsPcAndS:: | 94 bool Unary1RegisterImmediateOpTesterNotRdIsPcAndS:: |
| 94 ApplySanityChecks(Instruction inst, | 95 ApplySanityChecks(Instruction inst, |
| 95 const NamedClassDecoder& decoder) { | 96 const NamedClassDecoder& decoder) { |
| 96 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder; | 97 nacl_arm_dec::Unary1RegisterImmediateOp expected_decoder; |
| 97 | 98 |
| 98 // Check that we don't parse when Rd=15 and S=1. | 99 // Check that we don't parse when Rd=15 and S=1. |
| 99 if ((expected_decoder.d.reg(inst) == kRegisterPc) && | 100 if ((expected_decoder.d.reg(inst) == kRegisterPc) && |
| 100 expected_decoder.flags.is_updated(inst)) { | 101 expected_decoder.conditions.is_updated(inst)) { |
| 101 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 102 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 102 } | 103 } |
| 103 | 104 |
| 104 return Unary1RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); | 105 return Unary1RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); |
| 105 } | 106 } |
| 106 | 107 |
| 107 // Binary2RegisterImmediateOpTester | 108 // Binary2RegisterImmediateOpTester |
| 108 Binary2RegisterImmediateOpTester::Binary2RegisterImmediateOpTester( | 109 Binary2RegisterImmediateOpTester::Binary2RegisterImmediateOpTester( |
| 109 const NamedClassDecoder& decoder) | 110 const NamedClassDecoder& decoder) |
| 110 : Arm32DecoderTester(decoder), apply_rd_is_pc_check_(true) {} | 111 : Arm32DecoderTester(decoder), apply_rd_is_pc_check_(true) {} |
| (...skipping 10 matching lines...) Expand all Loading... |
| 121 if (expected_decoder.cond.undefined(inst)) { | 122 if (expected_decoder.cond.undefined(inst)) { |
| 122 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 123 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 123 } | 124 } |
| 124 | 125 |
| 125 // Check if expected class name found. | 126 // Check if expected class name found. |
| 126 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 127 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 127 | 128 |
| 128 // Check Registers and flags used in DataProc. | 129 // Check Registers and flags used in DataProc. |
| 129 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 130 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 130 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 131 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 131 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 132 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 132 if (expected_decoder.flags.is_updated(inst)) { | 133 if (expected_decoder.conditions.is_updated(inst)) { |
| 133 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 134 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 134 } else { | 135 } else { |
| 135 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 136 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 137 kRegisterNone); |
| 136 } | 138 } |
| 137 | 139 |
| 138 // Check that immediate value is computed correctly. | 140 // Check that immediate value is computed correctly. |
| 139 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); | 141 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); |
| 140 | 142 |
| 141 // Other NaCl constraints about this instruction. | 143 // Other NaCl constraints about this instruction. |
| 142 if (apply_rd_is_pc_check_) { | 144 if (apply_rd_is_pc_check_) { |
| 143 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 145 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 144 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 146 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 145 } | 147 } |
| 146 | 148 |
| 147 return true; | 149 return true; |
| 148 } | 150 } |
| 149 | 151 |
| 150 // Binary2RegisterImmediateOpTesterNotRdIsPcAndS | 152 // Binary2RegisterImmediateOpTesterNotRdIsPcAndS |
| 151 Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: | 153 Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: |
| 152 Binary2RegisterImmediateOpTesterNotRdIsPcAndS( | 154 Binary2RegisterImmediateOpTesterNotRdIsPcAndS( |
| 153 const NamedClassDecoder& decoder) | 155 const NamedClassDecoder& decoder) |
| 154 : Binary2RegisterImmediateOpTester(decoder) {} | 156 : Binary2RegisterImmediateOpTester(decoder) {} |
| 155 | 157 |
| 156 bool Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: | 158 bool Binary2RegisterImmediateOpTesterNotRdIsPcAndS:: |
| 157 ApplySanityChecks(Instruction inst, | 159 ApplySanityChecks(Instruction inst, |
| 158 const NamedClassDecoder& decoder) { | 160 const NamedClassDecoder& decoder) { |
| 159 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder; | 161 nacl_arm_dec::Binary2RegisterImmediateOp expected_decoder; |
| 160 | 162 |
| 161 // Check that we don't parse when Rd=15 and S=1. | 163 // Check that we don't parse when Rd=15 and S=1. |
| 162 if ((expected_decoder.d.reg(inst) == kRegisterPc) && | 164 if ((expected_decoder.d.reg(inst) == kRegisterPc) && |
| 163 expected_decoder.flags.is_updated(inst)) { | 165 expected_decoder.conditions.is_updated(inst)) { |
| 164 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 166 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 165 } | 167 } |
| 166 | 168 |
| 167 return Binary2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); | 169 return Binary2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder); |
| 168 } | 170 } |
| 169 | 171 |
| 170 // Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS | 172 // Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS |
| 171 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS:: | 173 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS:: |
| 172 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS( | 174 Binary2RegisterImmediateOpTesterRdCanBePcAndNotRdIsPcAndS( |
| 173 const NamedClassDecoder& decoder) | 175 const NamedClassDecoder& decoder) |
| (...skipping 17 matching lines...) Expand all Loading... |
| 191 // Didn't parse undefined conditional. | 193 // Didn't parse undefined conditional. |
| 192 if (expected_decoder.cond.undefined(inst)) { | 194 if (expected_decoder.cond.undefined(inst)) { |
| 193 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 195 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 194 } | 196 } |
| 195 | 197 |
| 196 // Check if expected class name found. | 198 // Check if expected class name found. |
| 197 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 199 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 198 | 200 |
| 199 // Check Registers and flags used in DataProc. | 201 // Check Registers and flags used in DataProc. |
| 200 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 202 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 201 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 203 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 202 if (expected_decoder.flags.is_updated(inst)) { | 204 if (expected_decoder.conditions.is_updated(inst)) { |
| 203 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 205 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 204 } else { | 206 } else { |
| 205 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 207 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 208 kRegisterNone); |
| 206 } | 209 } |
| 207 | 210 |
| 208 // Check that immediate value is computed correctly. | 211 // Check that immediate value is computed correctly. |
| 209 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); | 212 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 0)); |
| 210 | 213 |
| 211 return true; | 214 return true; |
| 212 } | 215 } |
| 213 | 216 |
| 214 // Unary2RegisterOpTester | 217 // Unary2RegisterOpTester |
| 215 Unary2RegisterOpTester::Unary2RegisterOpTester( | 218 Unary2RegisterOpTester::Unary2RegisterOpTester( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 228 if (expected_decoder.cond.undefined(inst)) { | 231 if (expected_decoder.cond.undefined(inst)) { |
| 229 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 232 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 230 } | 233 } |
| 231 | 234 |
| 232 // Check if expected class name found. | 235 // Check if expected class name found. |
| 233 NC_PRECOND(!Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 236 NC_PRECOND(!Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 234 | 237 |
| 235 // Check Registers and flags used in DataProc. | 238 // Check Registers and flags used in DataProc. |
| 236 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 239 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 237 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 240 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 238 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 241 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 239 if (expected_decoder.flags.is_updated(inst)) { | 242 if (expected_decoder.conditions.is_updated(inst)) { |
| 240 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 243 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 241 } else { | 244 } else { |
| 242 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 245 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 246 kRegisterNone); |
| 243 } | 247 } |
| 244 | 248 |
| 245 // Other NaCl constraints about this instruction. | 249 // Other NaCl constraints about this instruction. |
| 246 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 250 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 247 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 251 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 248 | 252 |
| 249 return true; | 253 return true; |
| 250 } | 254 } |
| 251 | 255 |
| 252 // Unary2RegisterOpTesterNotRdIsPcAndS | 256 // Unary2RegisterOpTesterNotRdIsPcAndS |
| 253 Unary2RegisterOpTesterNotRdIsPcAndS::Unary2RegisterOpTesterNotRdIsPcAndS( | 257 Unary2RegisterOpTesterNotRdIsPcAndS::Unary2RegisterOpTesterNotRdIsPcAndS( |
| 254 const NamedClassDecoder& decoder) | 258 const NamedClassDecoder& decoder) |
| 255 : Unary2RegisterOpTester(decoder) {} | 259 : Unary2RegisterOpTester(decoder) {} |
| 256 | 260 |
| 257 | 261 |
| 258 bool Unary2RegisterOpTesterNotRdIsPcAndS:: | 262 bool Unary2RegisterOpTesterNotRdIsPcAndS:: |
| 259 ApplySanityChecks(Instruction inst, | 263 ApplySanityChecks(Instruction inst, |
| 260 const NamedClassDecoder& decoder) { | 264 const NamedClassDecoder& decoder) { |
| 261 nacl_arm_dec::Unary2RegisterOp expected_decoder; | 265 nacl_arm_dec::Unary2RegisterOp expected_decoder; |
| 262 | 266 |
| 263 // Check that we don't parse when Rd=15 and S=1. | 267 // Check that we don't parse when Rd=15 and S=1. |
| 264 if ((expected_decoder.d.reg(inst) == kRegisterPc) && | 268 if ((expected_decoder.d.reg(inst) == kRegisterPc) && |
| 265 expected_decoder.flags.is_updated(inst)) { | 269 expected_decoder.conditions.is_updated(inst)) { |
| 266 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 270 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 267 } | 271 } |
| 268 | 272 |
| 269 return Unary2RegisterOpTester::ApplySanityChecks(inst, decoder); | 273 return Unary2RegisterOpTester::ApplySanityChecks(inst, decoder); |
| 270 } | 274 } |
| 271 | 275 |
| 272 // Binary3RegisterOpTester | 276 // Binary3RegisterOpTester |
| 273 Binary3RegisterOpTester::Binary3RegisterOpTester( | 277 Binary3RegisterOpTester::Binary3RegisterOpTester( |
| 274 const NamedClassDecoder& decoder) | 278 const NamedClassDecoder& decoder) |
| 275 : Arm32DecoderTester(decoder) {} | 279 : Arm32DecoderTester(decoder) {} |
| (...skipping 11 matching lines...) Expand all Loading... |
| 287 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 291 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 288 } | 292 } |
| 289 | 293 |
| 290 // Check if expected class name found. | 294 // Check if expected class name found. |
| 291 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 295 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 292 | 296 |
| 293 // Check Registers and flags used in DataProc. | 297 // Check Registers and flags used in DataProc. |
| 294 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 298 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 295 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(11, 8)); | 299 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(11, 8)); |
| 296 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(3, 0)); | 300 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(3, 0)); |
| 297 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 301 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 298 if (expected_decoder.flags.is_updated(inst)) { | 302 if (expected_decoder.conditions.is_updated(inst)) { |
| 299 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 303 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 300 } else { | 304 } else { |
| 301 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 305 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 306 kRegisterNone); |
| 302 } | 307 } |
| 303 | 308 |
| 304 // Other NaCl constraints about this instruction. | 309 // Other NaCl constraints about this instruction. |
| 305 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 310 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 306 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 311 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 307 | 312 |
| 308 return true; | 313 return true; |
| 309 } | 314 } |
| 310 | 315 |
| 311 // Binary3RegisterOpTesterRegsNotPc | 316 // Binary3RegisterOpTesterRegsNotPc |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 if (expected_decoder.cond.undefined(inst)) { | 353 if (expected_decoder.cond.undefined(inst)) { |
| 349 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 354 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 350 } | 355 } |
| 351 | 356 |
| 352 // Check if expected class name found. | 357 // Check if expected class name found. |
| 353 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 358 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 354 | 359 |
| 355 // Check Registers and flags used in DataProc. | 360 // Check Registers and flags used in DataProc. |
| 356 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 361 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 357 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 362 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 358 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 363 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 359 if (expected_decoder.flags.is_updated(inst)) { | 364 if (expected_decoder.conditions.is_updated(inst)) { |
| 360 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 365 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 361 } else { | 366 } else { |
| 362 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 367 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 368 kRegisterNone); |
| 363 } | 369 } |
| 364 | 370 |
| 365 // Check that immediate value is computed correctly. | 371 // Check that immediate value is computed correctly. |
| 366 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); | 372 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); |
| 367 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); | 373 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); |
| 368 | 374 |
| 369 // Other NaCl constraints about this instruction. | 375 // Other NaCl constraints about this instruction. |
| 370 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 376 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 371 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 377 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 372 | 378 |
| (...skipping 25 matching lines...) Expand all Loading... |
| 398 const NamedClassDecoder& decoder) | 404 const NamedClassDecoder& decoder) |
| 399 : Unary2RegisterImmedShiftedOpTester(decoder) {} | 405 : Unary2RegisterImmedShiftedOpTester(decoder) {} |
| 400 | 406 |
| 401 bool Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS:: | 407 bool Unary2RegisterImmedShiftedOpTesterNotRdIsPcAndS:: |
| 402 ApplySanityChecks(Instruction inst, | 408 ApplySanityChecks(Instruction inst, |
| 403 const NamedClassDecoder& decoder) { | 409 const NamedClassDecoder& decoder) { |
| 404 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; | 410 nacl_arm_dec::Unary2RegisterImmedShiftedOp expected_decoder; |
| 405 | 411 |
| 406 // Check that we don't parse when Rd=15 and S=1. | 412 // Check that we don't parse when Rd=15 and S=1. |
| 407 if ((expected_decoder.d.reg(inst) == kRegisterPc) && | 413 if ((expected_decoder.d.reg(inst) == kRegisterPc) && |
| 408 expected_decoder.flags.is_updated(inst)) { | 414 expected_decoder.conditions.is_updated(inst)) { |
| 409 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 415 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 410 } | 416 } |
| 411 | 417 |
| 412 return Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); | 418 return Unary2RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); |
| 413 } | 419 } |
| 414 | 420 |
| 415 // Unary3RegisterShiftedOpTester | 421 // Unary3RegisterShiftedOpTester |
| 416 Unary3RegisterShiftedOpTester::Unary3RegisterShiftedOpTester( | 422 Unary3RegisterShiftedOpTester::Unary3RegisterShiftedOpTester( |
| 417 const NamedClassDecoder& decoder) | 423 const NamedClassDecoder& decoder) |
| 418 : Arm32DecoderTester(decoder) {} | 424 : Arm32DecoderTester(decoder) {} |
| (...skipping 11 matching lines...) Expand all Loading... |
| 430 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 436 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 431 } | 437 } |
| 432 | 438 |
| 433 // Check if expected class name found. | 439 // Check if expected class name found. |
| 434 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 440 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 435 | 441 |
| 436 // Check Registers and flags used in DataProc. | 442 // Check Registers and flags used in DataProc. |
| 437 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 443 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 438 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); | 444 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); |
| 439 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 445 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 440 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 446 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 441 if (expected_decoder.flags.is_updated(inst)) { | 447 if (expected_decoder.conditions.is_updated(inst)) { |
| 442 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 448 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 443 } else { | 449 } else { |
| 444 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 450 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 451 kRegisterNone); |
| 445 } | 452 } |
| 446 | 453 |
| 447 // Check the shift type. | 454 // Check the shift type. |
| 448 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); | 455 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); |
| 449 | 456 |
| 450 // Other NaCl constraints about this instruction. | 457 // Other NaCl constraints about this instruction. |
| 451 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 458 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 452 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 459 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 453 | 460 |
| 454 return true; | 461 return true; |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 495 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 502 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 496 } | 503 } |
| 497 | 504 |
| 498 // Check if expected class name found. | 505 // Check if expected class name found. |
| 499 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 506 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 500 | 507 |
| 501 // Check Registers and flags used in DataProc. | 508 // Check Registers and flags used in DataProc. |
| 502 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 509 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 503 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 510 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 504 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 511 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 505 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 512 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 506 if (expected_decoder.flags.is_updated(inst)) { | 513 if (expected_decoder.conditions.is_updated(inst)) { |
| 507 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 514 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 508 } else { | 515 } else { |
| 509 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 516 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 517 kRegisterNone); |
| 510 } | 518 } |
| 511 | 519 |
| 512 // Check that immediate value is computed correctly. | 520 // Check that immediate value is computed correctly. |
| 513 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); | 521 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); |
| 514 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); | 522 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); |
| 515 | 523 |
| 516 // Other NaCl constraints about this instruction. | 524 // Other NaCl constraints about this instruction. |
| 517 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 525 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 518 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 526 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 519 | 527 |
| 520 return true; | 528 return true; |
| 521 } | 529 } |
| 522 | 530 |
| 523 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS | 531 // Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS |
| 524 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: | 532 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: |
| 525 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS( | 533 Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS( |
| 526 const NamedClassDecoder& decoder) | 534 const NamedClassDecoder& decoder) |
| 527 : Binary3RegisterImmedShiftedOpTester(decoder) {} | 535 : Binary3RegisterImmedShiftedOpTester(decoder) {} |
| 528 | 536 |
| 529 bool Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: | 537 bool Binary3RegisterImmedShiftedOpTesterNotRdIsPcAndS:: |
| 530 ApplySanityChecks(Instruction inst, | 538 ApplySanityChecks(Instruction inst, |
| 531 const NamedClassDecoder& decoder) { | 539 const NamedClassDecoder& decoder) { |
| 532 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder; | 540 nacl_arm_dec::Binary3RegisterImmedShiftedOp expected_decoder; |
| 533 | 541 |
| 534 // Check that we don't parse when Rd=15 and S=1. | 542 // Check that we don't parse when Rd=15 and S=1. |
| 535 if ((expected_decoder.d.reg(inst) == kRegisterPc) && | 543 if ((expected_decoder.d.reg(inst) == kRegisterPc) && |
| 536 expected_decoder.flags.is_updated(inst)) { | 544 expected_decoder.conditions.is_updated(inst)) { |
| 537 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 545 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 538 } | 546 } |
| 539 | 547 |
| 540 return Binary3RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); | 548 return Binary3RegisterImmedShiftedOpTester::ApplySanityChecks(inst, decoder); |
| 541 } | 549 } |
| 542 | 550 |
| 543 // Binary4RegisterShiftedOpTester | 551 // Binary4RegisterShiftedOpTester |
| 544 Binary4RegisterShiftedOpTester::Binary4RegisterShiftedOpTester( | 552 Binary4RegisterShiftedOpTester::Binary4RegisterShiftedOpTester( |
| 545 const NamedClassDecoder& decoder) | 553 const NamedClassDecoder& decoder) |
| 546 : Arm32DecoderTester(decoder) {} | 554 : Arm32DecoderTester(decoder) {} |
| (...skipping 12 matching lines...) Expand all Loading... |
| 559 } | 567 } |
| 560 | 568 |
| 561 // Check if expected class name found. | 569 // Check if expected class name found. |
| 562 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 570 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 563 | 571 |
| 564 // Check Registers and flags used in DataProc. | 572 // Check Registers and flags used in DataProc. |
| 565 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 573 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 566 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); | 574 EXPECT_EQ(expected_decoder.d.number(inst), inst.bits(15, 12)); |
| 567 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); | 575 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); |
| 568 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 576 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 569 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 577 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 570 if (expected_decoder.flags.is_updated(inst)) { | 578 if (expected_decoder.conditions.is_updated(inst)) { |
| 571 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 579 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 572 } else { | 580 } else { |
| 573 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 581 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 582 kRegisterNone); |
| 574 } | 583 } |
| 575 | 584 |
| 576 // Other NaCl constraints about this instruction. | 585 // Other NaCl constraints about this instruction. |
| 577 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) | 586 EXPECT_NE(expected_decoder.d.number(inst), (uint32_t) 15) |
| 578 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); | 587 << "Expected FORBIDDEN_OPERANDS for " << InstContents(); |
| 579 | 588 |
| 580 return true; | 589 return true; |
| 581 } | 590 } |
| 582 | 591 |
| 583 // Binary4RegisterShiftedOpTesterRegsNotPc | 592 // Binary4RegisterShiftedOpTesterRegsNotPc |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 623 if (expected_decoder.cond.undefined(inst)) { | 632 if (expected_decoder.cond.undefined(inst)) { |
| 624 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 633 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 625 } | 634 } |
| 626 | 635 |
| 627 // Check if expected class name found. | 636 // Check if expected class name found. |
| 628 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 637 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 629 | 638 |
| 630 // Check Registers and flags used in DataProc. | 639 // Check Registers and flags used in DataProc. |
| 631 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 640 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 632 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 641 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 633 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 642 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 634 if (expected_decoder.flags.is_updated(inst)) { | 643 if (expected_decoder.conditions.is_updated(inst)) { |
| 635 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 644 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 636 } else { | 645 } else { |
| 637 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 646 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 647 kRegisterNone); |
| 638 } | 648 } |
| 639 | 649 |
| 640 // Check that immediate value is computed correctly. | 650 // Check that immediate value is computed correctly. |
| 641 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); | 651 EXPECT_EQ(expected_decoder.imm.value(inst), inst.bits(11, 7)); |
| 642 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); | 652 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); |
| 643 | 653 |
| 644 return true; | 654 return true; |
| 645 } | 655 } |
| 646 | 656 |
| 647 // Binary3RegisterShiftedTestTester | 657 // Binary3RegisterShiftedTestTester |
| (...skipping 14 matching lines...) Expand all Loading... |
| 662 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); | 672 NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder); |
| 663 } | 673 } |
| 664 | 674 |
| 665 // Check if expected class name found. | 675 // Check if expected class name found. |
| 666 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); | 676 NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder)); |
| 667 | 677 |
| 668 // Check Registers and flags used in DataProc. | 678 // Check Registers and flags used in DataProc. |
| 669 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); | 679 EXPECT_EQ(expected_decoder.n.number(inst), inst.bits(19, 16)); |
| 670 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); | 680 EXPECT_EQ(expected_decoder.s.number(inst), inst.bits(11, 8)); |
| 671 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); | 681 EXPECT_EQ(expected_decoder.m.number(inst), inst.bits(3, 0)); |
| 672 EXPECT_EQ(expected_decoder.flags.is_updated(inst), inst.bit(20)); | 682 EXPECT_EQ(expected_decoder.conditions.is_updated(inst), inst.bit(20)); |
| 673 if (expected_decoder.flags.is_updated(inst)) { | 683 if (expected_decoder.conditions.is_updated(inst)) { |
| 674 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterFlags); | 684 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), kConditions); |
| 675 } else { | 685 } else { |
| 676 EXPECT_EQ(expected_decoder.flags.reg_if_updated(inst), kRegisterNone); | 686 EXPECT_EQ(expected_decoder.conditions.conds_if_updated(inst), |
| 687 kRegisterNone); |
| 677 } | 688 } |
| 678 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); | 689 EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.bits(6, 5)); |
| 679 | 690 |
| 680 return true; | 691 return true; |
| 681 } | 692 } |
| 682 | 693 |
| 683 // Binary3RegisterShiftedTestTesterRegsNotPc | 694 // Binary3RegisterShiftedTestTesterRegsNotPc |
| 684 Binary3RegisterShiftedTestTesterRegsNotPc:: | 695 Binary3RegisterShiftedTestTesterRegsNotPc:: |
| 685 Binary3RegisterShiftedTestTesterRegsNotPc( | 696 Binary3RegisterShiftedTestTesterRegsNotPc( |
| 686 const NamedClassDecoder& decoder) | 697 const NamedClassDecoder& decoder) |
| (...skipping 12 matching lines...) Expand all Loading... |
| 699 << "Expected Unpredictable for " << InstContents(); | 710 << "Expected Unpredictable for " << InstContents(); |
| 700 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15) | 711 EXPECT_NE(expected_decoder.s.number(inst), (uint32_t) 15) |
| 701 << "Expected Unpredictable for " << InstContents(); | 712 << "Expected Unpredictable for " << InstContents(); |
| 702 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15) | 713 EXPECT_NE(expected_decoder.m.number(inst), (uint32_t) 15) |
| 703 << "Expected Unpredictable for " << InstContents(); | 714 << "Expected Unpredictable for " << InstContents(); |
| 704 | 715 |
| 705 return true; | 716 return true; |
| 706 } | 717 } |
| 707 | 718 |
| 708 } // namespace | 719 } // namespace |
| OLD | NEW |