| 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::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 |
| OLD | NEW |