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

Unified Diff: src/trusted/validator_arm/inst_classes_testers.cc

Issue 10459058: Define a baseline and testing patterns for ARM load_store_word_byte table. (Closed) Base URL: svn://svn.chromium.org/native_client/trunk/src/native_client/
Patch Set: Created 8 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/trusted/validator_arm/inst_classes_testers.h ('k') | src/trusted/validator_arm/testdata/test_loads.err » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/trusted/validator_arm/inst_classes_testers.cc
===================================================================
--- src/trusted/validator_arm/inst_classes_testers.cc (revision 8812)
+++ src/trusted/validator_arm/inst_classes_testers.cc (working copy)
@@ -744,14 +744,14 @@
return true;
}
-// LoadStore2RegisterImmediateOpTester
-LoadStore2RegisterImmediateOpTester::LoadStore2RegisterImmediateOpTester(
+// LoadStore2RegisterImm8OpTester
+LoadStore2RegisterImm8OpTester::LoadStore2RegisterImm8OpTester(
const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
-bool LoadStore2RegisterImmediateOpTester::
+bool LoadStore2RegisterImm8OpTester::
ApplySanityChecks(Instruction inst,
const NamedClassDecoder& decoder) {
- nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder;
+ nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
// Check that condition is defined correctly.
EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
@@ -780,11 +780,16 @@
EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
<< "Expected UNPREDICTABLE for " << InstContents();
- EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
- (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
- expected_decoder.n.reg(inst).Equals(
- expected_decoder.t.reg(inst))))
- << "Expected UNPREDICTABLE for " << InstContents();
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and store.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t.reg(inst))))
+ // << "Expected UNPREDICTABLE for " << InstContents();
// Other NaCl constraints about this instruction.
EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
@@ -793,38 +798,38 @@
return true;
}
-// LoadStore2RegisterImmediateOpTesterNotRnIsPc
-LoadStore2RegisterImmediateOpTesterNotRnIsPc::
-LoadStore2RegisterImmediateOpTesterNotRnIsPc(
+// LoadStore2RegisterImm8OpTesterNotRnIsPc
+LoadStore2RegisterImm8OpTesterNotRnIsPc::
+LoadStore2RegisterImm8OpTesterNotRnIsPc(
const NamedClassDecoder& decoder)
- : LoadStore2RegisterImmediateOpTester(decoder) {}
+ : LoadStore2RegisterImm8OpTester(decoder) {}
-bool LoadStore2RegisterImmediateOpTesterNotRnIsPc::
+bool LoadStore2RegisterImm8OpTesterNotRnIsPc::
ApplySanityChecks(Instruction inst,
const NamedClassDecoder& decoder) {
- nacl_arm_dec::LoadStore2RegisterImmediateOp expected_decoder;
+ nacl_arm_dec::LoadStore2RegisterImm8Op expected_decoder;
// Check that we don't parse when Rn=15.
if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
}
- return LoadStore2RegisterImmediateOpTester::ApplySanityChecks(inst, decoder);
+ return LoadStore2RegisterImm8OpTester::ApplySanityChecks(inst, decoder);
}
-// LoadStore2RegisterImmediateDoubleOpTester
-LoadStore2RegisterImmediateDoubleOpTester::
-LoadStore2RegisterImmediateDoubleOpTester(const NamedClassDecoder& decoder)
- : LoadStore2RegisterImmediateOpTester(decoder) {}
+// LoadStore2RegisterImm8DoubleOpTester
+LoadStore2RegisterImm8DoubleOpTester::
+LoadStore2RegisterImm8DoubleOpTester(const NamedClassDecoder& decoder)
+ : LoadStore2RegisterImm8OpTester(decoder) {}
-bool LoadStore2RegisterImmediateDoubleOpTester::
+bool LoadStore2RegisterImm8DoubleOpTester::
ApplySanityChecks(Instruction inst,
const NamedClassDecoder& decoder) {
- NC_PRECOND(LoadStore2RegisterImmediateOpTester::
+ NC_PRECOND(LoadStore2RegisterImm8OpTester::
ApplySanityChecks(inst, decoder));
// Check Registers and flags used.
- nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder;
+ nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
EXPECT_EQ(expected_decoder.t.number(inst) + 1,
expected_decoder.t2.number(inst));
@@ -832,34 +837,115 @@
EXPECT_TRUE(expected_decoder.t.IsEven(inst));
EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
<< "Expected UNPREDICTABLE for " << InstContents();
- EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
- expected_decoder.n.reg(inst).Equals(
- expected_decoder.t2.reg(inst)))
- << "Expected UNPREDICTABLE for " << InstContents();
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and store.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t2.reg(inst)))
+ // << "Expected UNPREDICTABLE for " << InstContents();
+
return true;
}
-// LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc
-LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc::
-LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc(
+// LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc
+LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
+LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc(
const NamedClassDecoder& decoder)
- : LoadStore2RegisterImmediateDoubleOpTester(decoder) {}
+ : LoadStore2RegisterImm8DoubleOpTester(decoder) {}
-bool LoadStore2RegisterImmediateDoubleOpTesterNotRnIsPc::
+bool LoadStore2RegisterImm8DoubleOpTesterNotRnIsPc::
ApplySanityChecks(Instruction inst,
const NamedClassDecoder& decoder) {
- nacl_arm_dec::LoadStore2RegisterImmediateDoubleOp expected_decoder;
+ nacl_arm_dec::LoadStore2RegisterImm8DoubleOp expected_decoder;
// Check that we don't parse when Rn=15.
if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
}
- return LoadStore2RegisterImmediateDoubleOpTester::
+ return LoadStore2RegisterImm8DoubleOpTester::
ApplySanityChecks(inst, decoder);
}
+// LoadStore2RegisterImm12OpTester
+LoadStore2RegisterImm12OpTester::LoadStore2RegisterImm12OpTester(
+ const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
+
+bool LoadStore2RegisterImm12OpTester::
+ApplySanityChecks(Instruction inst,
+ const NamedClassDecoder& decoder) {
+ nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
+ // Check that condition is defined correctly.
+ EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
+
+ // Didn't parse undefined conditional.
+ if (expected_decoder.cond.undefined(inst)) {
+ NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
+ }
+
+ // Should not parse if P=0 && W=1.
+ if (expected_decoder.indexing.IsPostIndexing(inst) &&
+ expected_decoder.writes.IsDefined(inst)) {
+ NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
+ }
+
+ // Check if expected class name found.
+ NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
+
+ // Check Registers and flags used.
+ EXPECT_EQ(expected_decoder.imm12.value(inst), inst.Bits(11, 0));
+ EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
+ EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
+ EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
+ EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
+ EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
+
+ // Other ARM constraints about this instruction.
+ EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
+ << "Expected UNPREDICTABLE for " << InstContents();
+
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and store.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t.reg(inst))))
+ // << "Expected UNPREDICTABLE for " << InstContents();
+
+ // Other NaCl constraints about this instruction.
+ EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
+ << "Expected FORBIDDEN_OPERANDS for " << InstContents();
+
+ return true;
+}
+
+// LoadStore2RegisterImm12OpTesterNotRnIsPc
+LoadStore2RegisterImm12OpTesterNotRnIsPc::
+LoadStore2RegisterImm12OpTesterNotRnIsPc(
+ const NamedClassDecoder& decoder)
+ : LoadStore2RegisterImm12OpTester(decoder) {}
+
+bool LoadStore2RegisterImm12OpTesterNotRnIsPc::
+ApplySanityChecks(Instruction inst,
+ const NamedClassDecoder& decoder) {
+ nacl_arm_dec::LoadStore2RegisterImm12Op expected_decoder;
+
+ // Check that we don't parse when Rn=15.
+ if (expected_decoder.n.reg(inst).Equals(kRegisterPc)) {
+ NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
+ }
+
+ return LoadStore2RegisterImm12OpTester::ApplySanityChecks(inst, decoder);
+}
+
+
// LoadStore3RegisterOpTester
LoadStore3RegisterOpTester::LoadStore3RegisterOpTester(
const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
@@ -899,12 +985,18 @@
<< "Expected UNPREDICTABLE for " << InstContents();
EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
<< "Expected UNPREDICTABLE for " << InstContents();
- EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
- (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
- expected_decoder.n.reg(inst).Equals(
- expected_decoder.t.reg(inst))))
- << "Expected UNPREDICTABLE for " << InstContents();
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and stores.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t.reg(inst))))
+ // << "Expected UNPREDICTABLE for " << InstContents();
+
// Other NaCl constraints about this instruction.
EXPECT_FALSE(expected_decoder.indexing.IsPreIndexing(inst))
<< "Expected FORBIDDEN for " << InstContents();
@@ -935,11 +1027,76 @@
EXPECT_TRUE(expected_decoder.t.IsEven(inst));
EXPECT_NE(expected_decoder.t2.number(inst), static_cast<uint32_t>(15))
<< "Expected UNPREDICTABLE for " << InstContents();
- EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
- expected_decoder.n.reg(inst).Equals(
- expected_decoder.t2.reg(inst)))
+
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and stores.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t2.reg(inst)))
+ // << "Expected UNPREDICTABLE for " << InstContents();
+
+ return true;
+}
+
+// LoadStore3RegisterImm5OpTester
+LoadStore3RegisterImm5OpTester::LoadStore3RegisterImm5OpTester(
+ const NamedClassDecoder& decoder) : Arm32DecoderTester(decoder) {}
+
+bool LoadStore3RegisterImm5OpTester::
+ApplySanityChecks(Instruction inst,
+ const NamedClassDecoder& decoder) {
+ nacl_arm_dec::LoadStore3RegisterImm5Op expected_decoder;
+ // Check that condition is defined correctly.
+ EXPECT_EQ(expected_decoder.cond.value(inst), inst.Bits(31, 28));
+
+ // Didn't parse undefined conditional.
+ if (expected_decoder.cond.undefined(inst)) {
+ NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
+ }
+
+ // Should not parse if P=0 && W=1.
+ if (expected_decoder.indexing.IsPostIndexing(inst) &&
+ expected_decoder.writes.IsDefined(inst)) {
+ NC_EXPECT_NE_PRECOND(&ExpectedDecoder(), &decoder);
+ }
+
+ // Check if expected class name found.
+ NC_PRECOND(Arm32DecoderTester::ApplySanityChecks(inst, decoder));
+
+ // Check Registers and flags used.
+ EXPECT_TRUE(expected_decoder.m.reg(inst).Equals(inst.Reg(3, 0)));
+ EXPECT_TRUE(expected_decoder.t.reg(inst).Equals(inst.Reg(15, 12)));
+ EXPECT_TRUE(expected_decoder.n.reg(inst).Equals(inst.Reg(19, 16)));
+ EXPECT_EQ(expected_decoder.writes.IsDefined(inst), inst.Bit(21));
+ EXPECT_EQ(expected_decoder.direction.IsAdd(inst), inst.Bit(23));
+ EXPECT_EQ(expected_decoder.indexing.IsPreIndexing(inst), inst.Bit(24));
+
+ // Check that immediate value is computed correctly.
+ EXPECT_EQ(expected_decoder.imm.value(inst), inst.Bits(11, 7));
+ EXPECT_EQ(expected_decoder.shift_type.value(inst), inst.Bits(6, 5));
+
+ // Other ARM constraints about this instruction.
+ EXPECT_FALSE(expected_decoder.t.reg(inst).Equals(kRegisterPc))
<< "Expected UNPREDICTABLE for " << InstContents();
+ // NOTE: The manual states that that it is also unpredictable
+ // when HasWriteBack(i) and Rn=Rt. However, the compilers
+ // may not check for this. For the moment, we are changing
+ // the code to ignore this case for loads and store.
+ // TODO(karl): Should we not allow this?
+ // EXPECT_FALSE(expected_decoder.HasWriteBack(inst) &&
+ // (expected_decoder.n.reg(inst).Equals(kRegisterPc) ||
+ // expected_decoder.n.reg(inst).Equals(
+ // expected_decoder.t.reg(inst))))
+ // << "Expected UNPREDICTABLE for " << InstContents();
+
+ // Other NaCl constraints about this instruction.
+ EXPECT_FALSE(ExpectedDecoder().defs(inst).Contains(kRegisterPc))
+ << "Expected FORBIDDEN_OPERANDS for " << InstContents();
+
return true;
}
« no previous file with comments | « src/trusted/validator_arm/inst_classes_testers.h ('k') | src/trusted/validator_arm/testdata/test_loads.err » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698