[Avida-SVN] r3149 - development/source/cpu
grabow38 at myxo.css.msu.edu
grabow38 at myxo.css.msu.edu
Mon Feb 16 07:01:26 PST 2009
Author: grabow38
Date: 2009-02-16 10:01:25 -0500 (Mon, 16 Feb 2009)
New Revision: 3149
Modified:
development/source/cpu/cHardwareCPU.cc
development/source/cpu/cHardwareCPU.h
Log:
Adding if-grt-X and if-eq-X instructions. Value to compare to is determined by the nop label: default=1, nop-A=-1, nop-B=2, nop-C=4.
Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc 2009-02-12 13:51:44 UTC (rev 3148)
+++ development/source/cpu/cHardwareCPU.cc 2009-02-16 15:01:25 UTC (rev 3149)
@@ -104,7 +104,9 @@
tInstLibEntry<tMethod>("if-B!=C", &cHardwareCPU::Inst_IfBNotEqC),
tInstLibEntry<tMethod>("if-A!=C", &cHardwareCPU::Inst_IfANotEqC),
tInstLibEntry<tMethod>("if-bit-1", &cHardwareCPU::Inst_IfBit1),
-
+ tInstLibEntry<tMethod>("if-grt-X", &cHardwareCPU::Inst_IfGrX),
+ tInstLibEntry<tMethod>("if-equ-X", &cHardwareCPU::Inst_IfEquX),
+
tInstLibEntry<tMethod>("jump-f", &cHardwareCPU::Inst_JumpF),
tInstLibEntry<tMethod>("jump-b", &cHardwareCPU::Inst_JumpB),
tInstLibEntry<tMethod>("call", &cHardwareCPU::Inst_Call),
@@ -1883,6 +1885,68 @@
return true;
}
+bool cHardwareCPU::Inst_IfGrX(cAvidaContext& ctx) // Execute next if BX > X; X value set according to NOP label
+{
+ // Compares value in BX to a specific value. The value to compare to is determined by the nop label as follows:
+ // no nop label (default): valueToCompare = 1; nop-A: valueToCompare = -1
+ // nop-B: valueToCompare = 2; nop-C: valueToCompare = 4
+ // @LMG 2/13/2009
+
+ int valueToCompare = 1;
+
+ if (m_inst_set->IsNop(IP().GetNextInst())) {
+ IP().Advance();
+ switch (m_inst_set->GetNopMod(IP().GetInst())) {
+
+ case REG_AX:
+ valueToCompare = -1; break;
+ case REG_BX:
+ valueToCompare = 2; break;
+ case REG_CX:
+ valueToCompare = 4; break;
+ default:
+ valueToCompare = 1; break;
+ }
+ IP().SetFlagExecuted();
+
+ }
+
+ if (GetRegister(REG_BX) <= valueToCompare) IP().Advance();
+
+ return true;
+}
+
+bool cHardwareCPU::Inst_IfEquX(cAvidaContext& ctx) // Execute next if BX == X; X value set according to NOP label
+{
+ // Compares value in BX to a specific value. The value to compare to is determined by the nop label as follows:
+ // no nop label (default): valueToCompare = 1; nop-A: valueToCompare = -1
+ // nop-B: valueToCompare = 2; nop-C: valueToCompare = 4
+ // @LMG 2/13/2009
+
+ int valueToCompare = 1;
+
+ if (m_inst_set->IsNop(IP().GetNextInst())) {
+ IP().Advance();
+ switch (m_inst_set->GetNopMod(IP().GetInst())) {
+
+ case REG_AX:
+ valueToCompare = -1; break;
+ case REG_BX:
+ valueToCompare = 2; break;
+ case REG_CX:
+ valueToCompare = 4; break;
+ default:
+ valueToCompare = 1; break;
+ }
+ IP().SetFlagExecuted();
+
+ }
+
+ if (GetRegister(REG_BX) != valueToCompare) IP().Advance();
+
+ return true;
+}
+
bool cHardwareCPU::Inst_JumpF(cAvidaContext& ctx)
{
ReadLabel();
Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h 2009-02-12 13:51:44 UTC (rev 3148)
+++ development/source/cpu/cHardwareCPU.h 2009-02-16 15:01:25 UTC (rev 3149)
@@ -337,7 +337,9 @@
bool Inst_IfANotEqB(cAvidaContext& ctx);
bool Inst_IfBNotEqC(cAvidaContext& ctx);
bool Inst_IfANotEqC(cAvidaContext& ctx);
-
+ bool Inst_IfGrX(cAvidaContext& ctx);
+ bool Inst_IfEquX(cAvidaContext& ctx);
+
bool Inst_JumpF(cAvidaContext& ctx);
bool Inst_JumpB(cAvidaContext& ctx);
bool Inst_Call(cAvidaContext& ctx);
More information about the Avida-cvs
mailing list