[Avida-cvs] [avida-svn] r939 - in development/source: . cpu

brysonda at myxo.css.msu.edu brysonda at myxo.css.msu.edu
Sun Sep 10 16:57:59 PDT 2006


Author: brysonda
Date: 2006-09-10 19:57:58 -0400 (Sun, 10 Sep 2006)
New Revision: 939

Modified:
   development/source/cpu/cHardwareCPU.cc
   development/source/cpu/cHardwareCPU.h
   development/source/defs.h
Log:
Implement fully associative support in cHardwareCPU.  This is disabled by default.

Also fix accidently committed change to the default number of nops and registers.

Modified: development/source/cpu/cHardwareCPU.cc
===================================================================
--- development/source/cpu/cHardwareCPU.cc	2006-09-10 20:07:11 UTC (rev 938)
+++ development/source/cpu/cHardwareCPU.cc	2006-09-10 23:57:58 UTC (rev 939)
@@ -167,7 +167,6 @@
     cInstEntryCPU("square",    &cHardwareCPU::Inst_Square),
     cInstEntryCPU("sqrt",      &cHardwareCPU::Inst_Sqrt),
     cInstEntryCPU("not",       &cHardwareCPU::Inst_Not),
-    cInstEntryCPU("minus-17",  &cHardwareCPU::Inst_Minus17),
     
     cInstEntryCPU("add",       &cHardwareCPU::Inst_Add, true,
                   "Add BX to CX and place the result in ?BX?"),
@@ -1030,7 +1029,35 @@
   return default_register;
 }
 
+inline int cHardwareCPU::FindModifiedNextRegister(int default_register)
+{
+  assert(default_register < NUM_REGISTERS);  // Reg ID too high.
+  
+  if (m_inst_set->IsNop(IP().GetNextInst())) {
+    IP().Advance();
+    default_register = m_inst_set->GetNopMod(IP().GetInst());
+    IP().SetFlagExecuted();
+  } else {
+    default_register = (default_register + 1) % NUM_REGISTERS;
+  }
+  return default_register;
+}
 
+inline int cHardwareCPU::FindModifiedPreviousRegister(int default_register)
+{
+  assert(default_register < NUM_REGISTERS);  // Reg ID too high.
+  
+  if (m_inst_set->IsNop(IP().GetNextInst())) {
+    IP().Advance();
+    default_register = m_inst_set->GetNopMod(IP().GetInst());
+    IP().SetFlagExecuted();
+  } else {
+    default_register = (default_register + NUM_REGISTERS - 1) % NUM_REGISTERS;
+  }
+  return default_register;
+}
+
+
 inline int cHardwareCPU::FindModifiedHead(int default_head)
 {
   assert(default_head < nHardware::NUM_HEADS); // Head ID too high.
@@ -1044,10 +1071,9 @@
 }
 
 
-inline int cHardwareCPU::FindComplementRegister(int base_reg)
+inline int cHardwareCPU::FindNextRegister(int base_reg)
 {
-  const int comp_reg = base_reg + 1;
-  return (comp_reg  == NUM_REGISTERS) ? 0 : comp_reg;
+  return (base_reg + 1) % NUM_REGISTERS;
 }
 
 
@@ -1299,17 +1325,25 @@
 
 bool cHardwareCPU::Inst_IfEqu(cAvidaContext& ctx)      // Execute next if bx == ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) != GetRegister(reg_used2))  IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) != GetRegister(op2))  IP().Advance();
   return true;
 }
 
 bool cHardwareCPU::Inst_IfNEqu(cAvidaContext& ctx)     // Execute next if bx != ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) == GetRegister(reg_used2))  IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) == GetRegister(op2))  IP().Advance();
   return true;
 }
 
@@ -1322,9 +1356,13 @@
 
 bool cHardwareCPU::Inst_IfGr(cAvidaContext& ctx)       // Execute next if bx > ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) <= GetRegister(reg_used2))  IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) <= GetRegister(op2))  IP().Advance();
   return true;
 }
 
@@ -1337,9 +1375,13 @@
 
 bool cHardwareCPU::Inst_IfGrEqu(cAvidaContext& ctx)       // Execute next if bx > ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) < GetRegister(reg_used2)) IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) < GetRegister(op2)) IP().Advance();
   return true;
 }
 
@@ -1352,9 +1394,13 @@
 
 bool cHardwareCPU::Inst_IfLess(cAvidaContext& ctx)       // Execute next if ?bx? < ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) >=  GetRegister(reg_used2))  IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) >=  GetRegister(op2))  IP().Advance();
   return true;
 }
 
@@ -1367,9 +1413,13 @@
 
 bool cHardwareCPU::Inst_IfLsEqu(cAvidaContext& ctx)       // Execute next if bx > ?cx?
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int reg_used2 = FindComplementRegister(reg_used);
-  if (GetRegister(reg_used) >  GetRegister(reg_used2))  IP().Advance();
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  if (GetRegister(op1) >  GetRegister(op2))  IP().Advance();
   return true;
 }
 
@@ -1377,7 +1427,7 @@
 {
   const int reg_used = FindModifiedRegister(REG_BX);
   if ((GetRegister(reg_used) & 1) == 0)  IP().Advance();
-return true;
+  return true;
 }
 
 bool cHardwareCPU::Inst_IfANotEqB(cAvidaContext& ctx)     // Execute next if AX != BX
@@ -1599,9 +1649,13 @@
 
 bool cHardwareCPU::Inst_Swap(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int other_reg = FindComplementRegister(reg_used);
-  nFunctions::Swap(GetRegister(reg_used), GetRegister(other_reg));
+  const int op1 = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op2 = FindNextRegister(op1);
+#endif
+  nFunctions::Swap(GetRegister(op1), GetRegister(op2));
   return true;
 }
 
@@ -1620,9 +1674,13 @@
 
 bool cHardwareCPU::Inst_CopyReg(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int other_reg = FindComplementRegister(reg_used);
-  GetRegister(other_reg) = GetRegister(reg_used);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedNextRegister(src);
+#else
+  const int dst = FindNextRegister(src);
+#endif
+  GetRegister(dst) = GetRegister(src);
   return true;
 }
 
@@ -1741,23 +1799,38 @@
 
 bool cHardwareCPU::Inst_Neg(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = 0 - GetRegister(reg_used);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  GetRegister(dst) = -GetRegister(src);
   return true;
 }
 
 bool cHardwareCPU::Inst_Square(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = GetRegister(reg_used) * GetRegister(reg_used);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  GetRegister(dst) = GetRegister(src) * GetRegister(src);
   return true;
 }
 
 bool cHardwareCPU::Inst_Sqrt(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int value = GetRegister(reg_used);
-  if (value > 1) GetRegister(reg_used) = (int) sqrt((double) value);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  const int value = GetRegister(src);
+  if (value > 1) GetRegister(dst) = static_cast<int>(sqrt(static_cast<double>(value)));
   else if (value < 0) {
     organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "sqrt: value is negative");
     return false;
@@ -1767,9 +1840,14 @@
 
 bool cHardwareCPU::Inst_Log(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int value = GetRegister(reg_used);
-  if (value >= 1) GetRegister(reg_used) = (int) log((double) value);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  const int value = GetRegister(src);
+  if (value >= 1) GetRegister(dst) = static_cast<int>(log(static_cast<double>(value)));
   else if (value < 0) {
     organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "log: value is negative");
     return false;
@@ -1779,9 +1857,14 @@
 
 bool cHardwareCPU::Inst_Log10(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  const int value = GetRegister(reg_used);
-  if (value >= 1) GetRegister(reg_used) = (int) log10((double) value);
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  const int value = GetRegister(src);
+  if (value >= 1) GetRegister(dst) = static_cast<int>(log10(static_cast<double>(value)));
   else if (value < 0) {
     organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "log10: value is negative");
     return false;
@@ -1789,42 +1872,63 @@
   return true;
 }
 
-bool cHardwareCPU::Inst_Minus17(cAvidaContext& ctx)
-{
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) -= 17;
-  return true;
-}
-
 bool cHardwareCPU::Inst_Add(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = GetRegister(REG_BX) + GetRegister(REG_CX);
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = GetRegister(op1) + GetRegister(op2);
   return true;
 }
 
 bool cHardwareCPU::Inst_Sub(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = GetRegister(REG_BX) - GetRegister(REG_CX);
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = GetRegister(op1) - GetRegister(op2);
   return true;
 }
 
 bool cHardwareCPU::Inst_Mult(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = GetRegister(REG_BX) * GetRegister(REG_CX);
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = GetRegister(op1) * GetRegister(op2);
   return true;
 }
 
 bool cHardwareCPU::Inst_Div(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  if (GetRegister(REG_CX) != 0) {
-    if (0-INT_MAX > GetRegister(REG_BX) && GetRegister(REG_CX) == -1)
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  if (GetRegister(op2) != 0) {
+    if (0-INT_MAX > GetRegister(op1) && GetRegister(op2) == -1)
       organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "div: Float exception");
     else
-      GetRegister(reg_used) = GetRegister(REG_BX) / GetRegister(REG_CX);
+      GetRegister(dst) = GetRegister(op1) / GetRegister(op2);
   } else {
     organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "div: dividing by 0");
     return false;
@@ -1834,9 +1938,16 @@
 
 bool cHardwareCPU::Inst_Mod(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  if (GetRegister(REG_CX) != 0) {
-    GetRegister(reg_used) = GetRegister(REG_BX) % GetRegister(REG_CX);
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  if (GetRegister(op2) != 0) {
+    GetRegister(dst) = GetRegister(op1) % GetRegister(op2);
   } else {
     organism->Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "mod: modding by 0");
     return false;
@@ -1847,52 +1958,100 @@
 
 bool cHardwareCPU::Inst_Nand(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = ~(GetRegister(REG_BX) & GetRegister(REG_CX));
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = ~(GetRegister(op1) & GetRegister(op2));
   return true;
 }
 
 bool cHardwareCPU::Inst_Nor(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = ~(GetRegister(REG_BX) | GetRegister(REG_CX));
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = ~(GetRegister(op1) | GetRegister(op2));
   return true;
 }
 
 bool cHardwareCPU::Inst_And(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = (GetRegister(REG_BX) & GetRegister(REG_CX));
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = (GetRegister(op1) & GetRegister(op2));
   return true;
 }
 
 bool cHardwareCPU::Inst_Not(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = ~(GetRegister(reg_used));
+  const int src = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(src);
+#else
+  const int dst = src;
+#endif
+  GetRegister(dst) = ~(GetRegister(src));
   return true;
 }
 
 bool cHardwareCPU::Inst_Order(cAvidaContext& ctx)
 {
-  if (GetRegister(REG_BX) > GetRegister(REG_CX)) {
-    nFunctions::Swap(GetRegister(REG_BX), GetRegister(REG_CX));
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_BX);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  if (GetRegister(op1) > GetRegister(op2)) {
+    nFunctions::Swap(GetRegister(op1), GetRegister(op2));
   }
   return true;
 }
 
 bool cHardwareCPU::Inst_Xor(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  GetRegister(reg_used) = GetRegister(REG_BX) ^ GetRegister(REG_CX);
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(dst);
+  const int op2 = FindModifiedNextRegister(op1);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_CX;
+#endif
+  GetRegister(dst) = GetRegister(op1) ^ GetRegister(op2);
   return true;
 }
 
 bool cHardwareCPU::Inst_Copy(cAvidaContext& ctx)
 {
-  const cHeadCPU from(this, GetRegister(REG_BX));
-  cHeadCPU to(this, GetRegister(REG_AX) + GetRegister(REG_BX));
-  sCPUStats & cpu_stats = organism->CPUStats();
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_BX);
+  const int op2 = FindModifiedRegister(REG_AX);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_AX;
+#endif
+
+  const cHeadCPU from(this, GetRegister(op1));
+  cHeadCPU to(this, GetRegister(op2) + GetRegister(op1));
+  sCPUStats& cpu_stats = organism->CPUStats();
   
   if (organism->TestCopyMut(ctx)) {
     to.SetInst(m_inst_set->GetRandomInst(ctx));
@@ -1913,22 +2072,36 @@
 
 bool cHardwareCPU::Inst_ReadInst(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_CX);
-  const cHeadCPU from(this,GetRegister(REG_BX));
+  const int dst = FindModifiedRegister(REG_CX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int src = FindModifiedRegister(REG_BX);
+#else
+  const int src = REG_BX;
+#endif
+
+  const cHeadCPU from(this, GetRegister(src));
   
   // Dis-allowing mutations on read, for the moment (write only...)
   // @CAO This allows perfect error-correction...
-  GetRegister(reg_used) = from.GetInst().GetOp();
+  GetRegister(dst) = from.GetInst().GetOp();
   return true;
 }
 
 bool cHardwareCPU::Inst_WriteInst(cAvidaContext& ctx)
 {
-  cHeadCPU to(this, GetRegister(REG_AX) + GetRegister(REG_BX));
-  const int reg_used = FindModifiedRegister(REG_CX);
-  const int value = Mod(GetRegister(reg_used), m_inst_set->GetSize());
-  sCPUStats & cpu_stats = organism->CPUStats();
+  const int src = FindModifiedRegister(REG_CX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_BX);
+  const int op2 = FindModifiedRegister(REG_AX);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_AX;
+#endif
 
+  cHeadCPU to(this, GetRegister(op2) + GetRegister(op1));
+  const int value = Mod(GetRegister(src), m_inst_set->GetSize());
+  sCPUStats& cpu_stats = organism->CPUStats();
+
   // Change value on a mutation...
   if (organism->TestCopyMut(ctx)) {
     to.SetInst(m_inst_set->GetRandomInst(ctx));
@@ -1957,10 +2130,15 @@
 
 bool cHardwareCPU::Inst_StackWriteInst(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_BX);
-  cHeadCPU to(this, GetRegister(REG_AX) + GetRegister(reg_used));
+  const int dst = FindModifiedRegister(REG_BX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_AX);
+#else
+  const int op1 = REG_AX;
+#endif
+  cHeadCPU to(this, GetRegister(op1) + GetRegister(dst));
   const int value = Mod(StackPop(), m_inst_set->GetSize());
-  sCPUStats & cpu_stats = organism->CPUStats();
+  sCPUStats& cpu_stats = organism->CPUStats();
   
   // Change value on a mutation...
   if (organism->TestCopyMut(ctx)) {
@@ -1982,9 +2160,17 @@
 
 bool cHardwareCPU::Inst_Compare(cAvidaContext& ctx)
 {
-  const int reg_used = FindModifiedRegister(REG_CX);
-  cHeadCPU from(this, GetRegister(REG_BX));
-  cHeadCPU to(this, GetRegister(REG_AX) + GetRegister(REG_BX));
+  const int dst = FindModifiedRegister(REG_CX);
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_BX);
+  const int op2 = FindModifiedRegister(REG_AX);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_AX;
+#endif
+
+  cHeadCPU from(this, GetRegister(op1));
+  cHeadCPU to(this, GetRegister(op2) + GetRegister(op1));
   
   // Compare is dangerous -- it can cause mutations!
   if (organism->TestCopyMut(ctx)) {
@@ -1994,15 +2180,23 @@
                                   //organism->GetPhenotype().IsMutated() = true;
   }
   
-  GetRegister(reg_used) = from.GetInst().GetOp() - to.GetInst().GetOp();
+  GetRegister(dst) = from.GetInst().GetOp() - to.GetInst().GetOp();
   
   return true;
 }
 
 bool cHardwareCPU::Inst_IfNCpy(cAvidaContext& ctx)
 {
-  const cHeadCPU from(this, GetRegister(REG_BX));
-  const cHeadCPU to(this, GetRegister(REG_AX) + GetRegister(REG_BX));
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedRegister(REG_BX);
+  const int op2 = FindModifiedRegister(REG_AX);
+#else
+  const int op1 = REG_BX;
+  const int op2 = REG_AX;
+#endif
+
+  const cHeadCPU from(this, GetRegister(op1));
+  const cHeadCPU to(this, GetRegister(op2) + GetRegister(op1));
   
   // Allow for errors in this test...
   if (organism->TestCopyMut(ctx)) {
@@ -2015,16 +2209,28 @@
 
 bool cHardwareCPU::Inst_Allocate(cAvidaContext& ctx)   // Allocate bx more space...
 {
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int src = FindModifiedRegister(REG_BX);
+  const int dst = FindModifiedRegister(REG_AX);
+#else
+  const int src = REG_BX;
+  const int dst = REG_AX;
+#endif
   const int size = GetMemory().GetSize();
-  if( Allocate_Main(ctx, GetRegister(REG_BX)) ) {
-  GetRegister(REG_AX) = size;
-  return true;
-} else return false;
+  if (Allocate_Main(ctx, GetRegister(src))) {
+    GetRegister(dst) = size;
+    return true;
+  } else return false;
 }
 
 bool cHardwareCPU::Inst_Divide(cAvidaContext& ctx)  
 { 
-  return Divide_Main(ctx, GetRegister(REG_AX));    
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int src = FindModifiedRegister(REG_AX);
+#else
+  const int src = REG_AX;
+#endif
+  return Divide_Main(ctx, GetRegister(src));    
 }
 
 /*
@@ -2037,7 +2243,12 @@
 
 bool cHardwareCPU::Inst_DivideRS(cAvidaContext& ctx)  
 { 
-  return Divide_MainRS(ctx, GetRegister(REG_AX));    
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int src = FindModifiedRegister(REG_AX);
+#else
+  const int src = REG_AX;
+#endif
+  return Divide_MainRS(ctx, GetRegister(src));    
 }
 
 
@@ -2053,11 +2264,16 @@
 
 bool cHardwareCPU::Inst_MaxAlloc(cAvidaContext& ctx)   // Allocate maximal more
 {
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(REG_AX);
+#else
+  const int dst = REG_AX;
+#endif
   const int cur_size = GetMemory().GetSize();
   const int alloc_size = Min((int) (m_world->GetConfig().CHILD_SIZE_RANGE.Get() * cur_size),
                              MAX_CREATURE_SIZE - cur_size);
-  if( Allocate_Main(ctx, alloc_size) ) {
-    GetRegister(REG_AX) = cur_size;
+  if (Allocate_Main(ctx, alloc_size)) {
+    GetRegister(dst) = cur_size;
     return true;
   } else return false;
 }
@@ -2066,7 +2282,7 @@
 bool cHardwareCPU::Inst_Repro(cAvidaContext& ctx)
 {
   // Setup child
-  cCPUMemory & child_genome = organism->ChildGenome();
+  cCPUMemory& child_genome = organism->ChildGenome();
   child_genome = GetMemory();
   organism->GetPhenotype().SetLinesCopied(GetMemory().GetSize());
   
@@ -2326,7 +2542,7 @@
 
 bool cHardwareCPU::Inst_Sense(cAvidaContext& ctx)
 {
-  const tArray<double> & res_count = organism->GetOrgInterface().GetResources();
+  const tArray<double>& res_count = organism->GetOrgInterface().GetResources();
   const int reg_used = FindModifiedRegister(REG_BX);
   
   // If there are no resources to measure, this instruction fails.
@@ -2342,7 +2558,7 @@
   return true;
 }
 
-void cHardwareCPU::DoDonate(cOrganism * to_org)
+void cHardwareCPU::DoDonate(cOrganism* to_org)
 {
   assert(to_org != NULL);
   
@@ -2401,7 +2617,7 @@
   if (max_dist != -1) {
     int max_id = neighbor_id + num_neighbors;
     bool found = false;
-    cGenotype * genotype = organism->GetGenotype();
+    cGenotype* genotype = organism->GetGenotype();
     while (neighbor_id < max_id) {
       neighbor = organism->GetNeighbor();
       if (neighbor != NULL &&
@@ -2437,7 +2653,7 @@
   // Turn to face a random neighbor
   int neighbor_id = ctx.GetRandom().GetInt(num_neighbors);
   for (int i = 0; i < neighbor_id; i++) organism->Rotate(1);
-  cOrganism * neighbor = organism->GetNeighbor();
+  cOrganism* neighbor = organism->GetNeighbor();
   
   // If there is no max edit distance, take the random neighbor we're facing.
   const int max_dist = m_world->GetConfig().MAX_DONATE_EDIT_DIST.Get();
@@ -2579,15 +2795,14 @@
 {
   const int reg_used = FindModifiedRegister(REG_BX);
   const int new_mut_rate = Max(GetRegister(reg_used), 1 );
-  organism->SetCopyMutProb(((double) new_mut_rate) / 10000.0);
+  organism->SetCopyMutProb(static_cast<double>(new_mut_rate) / 10000.0);
   return true;
 }
 
 bool cHardwareCPU::Inst_ModCopyMut(cAvidaContext& ctx)
 {
   const int reg_used = FindModifiedRegister(REG_BX);
-  const double new_mut_rate = organism->GetCopyMutProb() +
-    ((double)GetRegister(reg_used)) / 10000.0;
+  const double new_mut_rate = organism->GetCopyMutProb() + static_cast<double>(GetRegister(reg_used)) / 10000.0;
   if (new_mut_rate > 0.0) organism->SetCopyMutProb(new_mut_rate);
   return true;
 }
@@ -2773,6 +2988,12 @@
 
 bool cHardwareCPU::Inst_HeadRead(cAvidaContext& ctx)
 {
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedRegister(REG_BX);
+#else
+  const int dst = REG_BX;
+#endif
+  
   const int head_id = FindModifiedHead(nHardware::HEAD_READ);
   GetHead(head_id).Adjust();
   sCPUStats & cpu_stats = organism->CPUStats();
@@ -2785,7 +3006,7 @@
   } else {
     read_inst = GetHead(head_id).GetInst().GetOp();
   }
-  GetRegister(REG_BX) = read_inst;
+  GetRegister(dst) = read_inst;
   ReadInst(read_inst);
   
   cpu_stats.mut_stats.copies_exec++;  // @CAO, this too..
@@ -2795,12 +3016,17 @@
 
 bool cHardwareCPU::Inst_HeadWrite(cAvidaContext& ctx)
 {
+#if CLASSIC_FULLY_ASSOCIATIVE
+  const int src = FindModifiedRegister(REG_BX);
+#else
+  const int src = REG_BX;
+#endif
   const int head_id = FindModifiedHead(nHardware::HEAD_WRITE);
-  cHeadCPU & active_head = GetHead(head_id);
+  cHeadCPU& active_head = GetHead(head_id);
   
   active_head.Adjust();
   
-  int value = GetRegister(REG_BX);
+  int value = GetRegister(src);
   if (value < 0 || value >= m_inst_set->GetSize()) value = 0;
   
   active_head.SetInst(cInstruction(value));

Modified: development/source/cpu/cHardwareCPU.h
===================================================================
--- development/source/cpu/cHardwareCPU.h	2006-09-10 20:07:11 UTC (rev 938)
+++ development/source/cpu/cHardwareCPU.h	2006-09-10 23:57:58 UTC (rev 939)
@@ -66,9 +66,9 @@
 
 protected:
   // --------  Structure Constants  --------
-  static const int NUM_REGISTERS = 4;
+  static const int NUM_REGISTERS = 3;
   enum tRegisters { REG_AX = 0, REG_BX, REG_CX, REG_DX, REG_EX, REG_FX };
-  static const int NUM_NOPS = 4;
+  static const int NUM_NOPS = 3;
   
   // --------  Data Structures  --------
   struct cLocalThread
@@ -158,8 +158,10 @@
   
   // ---------- Instruction Helpers -----------
   int FindModifiedRegister(int default_register);
+  int FindModifiedNextRegister(int default_register);
+  int FindModifiedPreviousRegister(int default_register);
   int FindModifiedHead(int default_head);
-  int FindComplementRegister(int base_reg);
+  int FindNextRegister(int base_reg);
   
   bool Allocate_Necro(const int new_size);
   bool Allocate_Random(cAvidaContext& ctx, const int old_size, const int new_size);

Modified: development/source/defs.h
===================================================================
--- development/source/defs.h	2006-09-10 20:07:11 UTC (rev 938)
+++ development/source/defs.h	2006-09-10 23:57:58 UTC (rev 939)
@@ -28,6 +28,9 @@
 #ifndef INSTRUCTION_COUNT
 #define INSTRUCTION_COUNT 1
 #endif
+#ifndef CLASSIC_FULLY_ASSOCIATIVE
+#define CLASSIC_FULLY_ASSOCIATIVE 0
+#endif
 #ifndef SMT_FULLY_ASSOCIATIVE
 #define SMT_FULLY_ASSOCIATIVE 1
 #endif




More information about the Avida-cvs mailing list