[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