[Avida-cvs] [Avida2-svn] r341 - in trunk: Avida2.xcodeproj source source/cpu source/main source/support source/tools source/viewers

brysonda@myxo.css.msu.edu brysonda at myxo.css.msu.edu
Thu Oct 13 12:55:05 PDT 2005


Author: brysonda
Date: 2005-10-13 15:55:04 -0400 (Thu, 13 Oct 2005)
New Revision: 341

Modified:
   trunk/Avida2.xcodeproj/project.pbxproj
   trunk/source/cpu/cHardwareSMT.cc
   trunk/source/cpu/cHardwareSMT.h
   trunk/source/cpu/nHardwareSMT.h
   trunk/source/defs.hh
   trunk/source/main/avida.cc
   trunk/source/main/avida.h
   trunk/source/main/primitive.cc
   trunk/source/support/inst_set.smt
   trunk/source/tools/cString.h
   trunk/source/viewers/viewer.cc
Log:
Add in optional SMT fully associative instruction set support, revamp version display to list out enabled features.

Modified: trunk/Avida2.xcodeproj/project.pbxproj
===================================================================
--- trunk/Avida2.xcodeproj/project.pbxproj	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/Avida2.xcodeproj/project.pbxproj	2005-10-13 19:55:04 UTC (rev 341)
@@ -3385,7 +3385,7 @@
 				GCC_FAST_MATH = YES;
 				GCC_MODEL_CPU = G4;
 				GCC_OPTIMIZATION_LEVEL = 0;
-				GCC_PREPROCESSOR_DEFINITIONS = "";
+				GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
 				GCC_UNROLL_LOOPS = YES;
 				HEADER_SEARCH_PATHS = source/event/;
 				INSTALL_PATH = "$(BUILT_PRODUCTS_DIR)/work";

Modified: trunk/source/cpu/cHardwareSMT.cc
===================================================================
--- trunk/source/cpu/cHardwareSMT.cc	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/cpu/cHardwareSMT.cc	2005-10-13 19:55:04 UTC (rev 341)
@@ -68,27 +68,27 @@
     cInstEntry("Val-Sub", &cHardwareSMT::Inst_Val_Sub), // 10
     cInstEntry("Val-Mult", &cHardwareSMT::Inst_Val_Mult), // 11
     cInstEntry("Val-Div", &cHardwareSMT::Inst_Val_Div), // 12
-    cInstEntry("SetMemory", &cHardwareSMT::Inst_SetMemory), // 13
-    cInstEntry("Divide", &cHardwareSMT::Inst_Divide), // 14
-    cInstEntry("Inst-Read", &cHardwareSMT::Inst_HeadRead), // 15
-    cInstEntry("Inst-Write", &cHardwareSMT::Inst_HeadWrite), // 16
-    cInstEntry("If-Equal", &cHardwareSMT::Inst_IfEqual), // 17
-    cInstEntry("If-Not-Equal", &cHardwareSMT::Inst_IfNotEqual), // 18
-    cInstEntry("If-Less", &cHardwareSMT::Inst_IfLess), // 19
-    cInstEntry("If-Greater", &cHardwareSMT::Inst_IfGreater), // 20
-    cInstEntry("Head-Push", &cHardwareSMT::Inst_HeadPush), // 21
-    cInstEntry("Head-Pop", &cHardwareSMT::Inst_HeadPop), // 22
-    cInstEntry("Head-Move", &cHardwareSMT::Inst_HeadMove), // 23
-    cInstEntry("Search", &cHardwareSMT::Inst_Search), // 24
-    cInstEntry("Push-Next", &cHardwareSMT::Inst_PushNext), // 25
-    cInstEntry("Push-Prev", &cHardwareSMT::Inst_PushPrevious), // 26
-    cInstEntry("Push-Comp", &cHardwareSMT::Inst_PushComplement), // 27
-    cInstEntry("Val-Delete", &cHardwareSMT::Inst_ValDelete), // 28
-    cInstEntry("Val-Copy", &cHardwareSMT::Inst_ValCopy), // 29
-    cInstEntry("ThreadFork", &cHardwareSMT::Inst_ForkThread), // 30
-    cInstEntry("Val-Inc", &cHardwareSMT::Inst_Increment), // 31
-    cInstEntry("Val-Dec", &cHardwareSMT::Inst_Decrement), // 32
-    cInstEntry("Val-Mod", &cHardwareSMT::Inst_Mod), // 33
+    cInstEntry("Val-Mod", &cHardwareSMT::Inst_Val_Mod), // 13
+    cInstEntry("Val-Inc", &cHardwareSMT::Inst_Val_Inc), // 14
+    cInstEntry("Val-Dec", &cHardwareSMT::Inst_Val_Dec), // 15
+    cInstEntry("SetMemory", &cHardwareSMT::Inst_SetMemory), // 16
+    cInstEntry("Divide", &cHardwareSMT::Inst_Divide), // 17
+    cInstEntry("Inst-Read", &cHardwareSMT::Inst_HeadRead), // 18
+    cInstEntry("Inst-Write", &cHardwareSMT::Inst_HeadWrite), // 19
+    cInstEntry("If-Equal", &cHardwareSMT::Inst_IfEqual), // 20
+    cInstEntry("If-Not-Equal", &cHardwareSMT::Inst_IfNotEqual), // 21
+    cInstEntry("If-Less", &cHardwareSMT::Inst_IfLess), // 22
+    cInstEntry("If-Greater", &cHardwareSMT::Inst_IfGreater), // 23
+    cInstEntry("Head-Push", &cHardwareSMT::Inst_HeadPush), // 24
+    cInstEntry("Head-Pop", &cHardwareSMT::Inst_HeadPop), // 25
+    cInstEntry("Head-Move", &cHardwareSMT::Inst_HeadMove), // 26
+    cInstEntry("Search", &cHardwareSMT::Inst_Search), // 27
+    cInstEntry("Push-Next", &cHardwareSMT::Inst_PushNext), // 28
+    cInstEntry("Push-Prev", &cHardwareSMT::Inst_PushPrevious), // 29
+    cInstEntry("Push-Comp", &cHardwareSMT::Inst_PushComplement), // 30
+    cInstEntry("Val-Delete", &cHardwareSMT::Inst_ValDelete), // 31
+    cInstEntry("Val-Copy", &cHardwareSMT::Inst_ValCopy), // 32
+    cInstEntry("ThreadFork", &cHardwareSMT::Inst_ForkThread), // 33
     cInstEntry("ThreadKill", &cHardwareSMT::Inst_KillThread), // 34
     cInstEntry("IO", &cHardwareSMT::Inst_IO), // 35
     cInstEntry("Inject", &cHardwareSMT::Inst_Inject) // 36
@@ -1146,6 +1146,48 @@
   return default_stack;
 }
 
+inline int cHardwareSMT::FindModifiedNextStack(int default_stack)
+{
+  assert(default_stack < nHardwareSMT::NUM_STACKS);  // Stack ID too high.
+	
+  if (GetInstSet().IsNop(IP().GetNextInst())) {
+    IP().Advance();
+    default_stack = GetInstSet().GetNopMod(IP().GetInst());
+    IP().FlagExecuted() = true;
+  } else {
+    default_stack = FindNextStack(default_stack);
+  }
+  return default_stack;
+}
+
+inline int cHardwareSMT::FindModifiedPreviousStack(int default_stack)
+{
+  assert(default_stack < nHardwareSMT::NUM_STACKS);  // Stack ID too high.
+	
+  if (GetInstSet().IsNop(IP().GetNextInst())) {
+    IP().Advance();
+    default_stack = GetInstSet().GetNopMod(IP().GetInst());
+    IP().FlagExecuted() = true;
+  } else {
+    default_stack = FindPreviousStack(default_stack);
+  }
+  return default_stack;
+}
+
+inline int cHardwareSMT::FindModifiedComplementStack(int default_stack)
+{
+  assert(default_stack < nHardwareSMT::NUM_STACKS);  // Stack ID too high.
+	
+  if (GetInstSet().IsNop(IP().GetNextInst())) {
+    IP().Advance();
+    default_stack = GetInstSet().GetNopMod(IP().GetInst());
+    IP().FlagExecuted() = true;
+  } else {
+    default_stack = FindPreviousStack(default_stack);
+  }
+  return default_stack;
+}
+
 inline int cHardwareSMT::FindModifiedHead(int default_head)
 {
   assert(default_head < nHardware::NUM_HEADS); // Head ID too high.
@@ -1159,10 +1201,19 @@
   return default_head;
 }
 
+inline int cHardwareSMT::FindNextStack(int default_stack)
+{
+  return (default_stack + 1) % nHardwareSMT::NUM_STACKS;
+}
+
+inline int cHardwareSMT::FindPreviousStack(int default_stack)
+{
+  return (default_stack + nHardwareSMT::NUM_STACKS - 1) % nHardwareSMT::NUM_STACKS;
+}
+
 inline int cHardwareSMT::FindComplementStack(int base_stack)
 {
-  const int comp_stack = base_stack + 2;
-  return comp_stack % nHardwareSMT::NUM_STACKS;
+  return (base_stack + 2) % nHardwareSMT::NUM_STACKS;
 }
 
 inline void cHardwareSMT::Fault(int fault_loc, int fault_type, cString fault_desc)
@@ -1587,64 +1638,109 @@
 //6
 bool cHardwareSMT::Inst_ShiftR()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int value = Stack(stack_used).Pop();
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
+  int value = Stack(src).Pop();
   value >>= 1;
-  Stack(stack_used).Push(value);
+  Stack(dst).Push(value);
   return true;
 }
 
 //7
 bool cHardwareSMT::Inst_ShiftL()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int value = Stack(stack_used).Pop();
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
+  int value = Stack(src).Pop();
   value <<= 1;
-  Stack(stack_used).Push(value);
+  Stack(dst).Push(value);
   return true;
 }
 
 //8
 bool cHardwareSMT::Inst_Val_Nand()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  Stack(stack_used).Push(~(Stack(nHardwareSMT::STACK_BX).Top() & Stack(nHardwareSMT::STACK_CX).Top()));
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  Stack(dst).Push(~(Stack(op1).Top() & Stack(op2).Top()));
   return true;
 }
 
 //9
 bool cHardwareSMT::Inst_Val_Add()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  Stack(stack_used).Push(Stack(nHardwareSMT::STACK_BX).Top() + Stack(nHardwareSMT::STACK_CX).Top());
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  Stack(dst).Push(Stack(op1).Top() + Stack(op2).Top());
   return true;
 }
 
 //10
 bool cHardwareSMT::Inst_Val_Sub()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  Stack(stack_used).Push(Stack(nHardwareSMT::STACK_BX).Top() - Stack(nHardwareSMT::STACK_CX).Top());
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  Stack(dst).Push(Stack(op1).Top() - Stack(op2).Top());
   return true;
 }
 
 //11
 bool cHardwareSMT::Inst_Val_Mult()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  Stack(stack_used).Push(Stack(nHardwareSMT::STACK_BX).Top() * Stack(nHardwareSMT::STACK_CX).Top());
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  Stack(dst).Push(Stack(op1).Top() * Stack(op2).Top());
   return true;
 }
 
 //12
 bool cHardwareSMT::Inst_Val_Div()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  if (Stack(nHardwareSMT::STACK_CX).Top() != 0) {
-    if (0-INT_MAX > Stack(nHardwareSMT::STACK_BX).Top() && Stack(nHardwareSMT::STACK_CX).Top() == -1)
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  if (Stack(op2).Top() != 0) {
+    if (0-INT_MAX > Stack(op1).Top() && Stack(op2).Top() == -1)
       Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "div: Float exception");
     else
-      Stack(stack_used).Push(Stack(nHardwareSMT::STACK_BX).Top() / Stack(nHardwareSMT::STACK_CX).Top());
+      Stack(dst).Push(Stack(op1).Top() / Stack(op2).Top());
   } else {
     Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "div: dividing by 0");
     return false;
@@ -1652,6 +1748,57 @@
   return true;
 }
 
+//32
+bool cHardwareSMT::Inst_Val_Inc()
+{
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
+  int value = Stack(src).Pop();
+  Stack(dst).Push(++value);
+  return true;
+}
+
+//33
+bool cHardwareSMT::Inst_Val_Dec()
+{
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
+  int value = Stack(src).Pop();
+  Stack(dst).Push(--value);
+  return true;
+}
+
+//34
+bool cHardwareSMT::Inst_Val_Mod()
+{
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op1 = nHardwareSMT::STACK_BX;
+  const int op2 = nHardwareSMT::STACK_CX;
+#endif
+  if (Stack(op2).Top() != 0) {
+    if(Stack(op2).Top() == -1)
+      Stack(dst).Push(0);
+    else
+      Stack(dst).Push(Stack(op1).Top() % Stack(op2).Top());
+  } else {
+    Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "mod: modding by 0");
+		return false;
+  }
+  return true;
+}
+
 //13 
 bool cHardwareSMT::Inst_SetMemory() 
 {
@@ -1681,6 +1828,12 @@
 bool cHardwareSMT::Inst_HeadRead()
 {
   const int head_id = FindModifiedHead(nHardware::HEAD_READ);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_AX);
+#else
+  const int dst = nHardwareSMT::STACK_AX;
+#endif
+  
   GetHead(head_id).Adjust();
   sCPUStats & cpu_stats = organism->CPUStats();
 	
@@ -1692,7 +1845,7 @@
   } else {
     read_inst = GetHead(head_id).GetInst().GetOp();
   }
-  Stack(nHardwareSMT::STACK_AX).Push(read_inst);
+  Stack(dst).Push(read_inst);
   ReadInst(read_inst);
 	
   cpu_stats.mut_stats.copies_exec++;  // @CAO, this too..
@@ -1704,6 +1857,12 @@
 bool cHardwareSMT::Inst_HeadWrite()
 {
   const int head_id = FindModifiedHead(nHardware::HEAD_WRITE);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(nHardwareSMT::STACK_AX);
+#else
+  const int src = nHardwareSMT::STACK_AX;
+#endif
+
   cHeadMultiMem & active_head = GetHead(head_id);
   int mem_space_used = active_head.GetMemSpace();
   
@@ -1715,8 +1874,8 @@
 	
   active_head.Adjust();
 	
-  int value = Stack(nHardwareSMT::STACK_AX).Pop();
-  if (value < 0 || value >= GetNumInst()) value = 0;
+  int value = Stack(src).Pop();
+  if (value < 0 || value >= GetNumInst()) value = nHardwareSMT::NOPX;
 	
   active_head.SetInst(cInstruction(value));
   active_head.FlagCopied() = true;
@@ -1765,36 +1924,52 @@
 //17
 bool cHardwareSMT::Inst_IfEqual()      // Execute next if bx == ?cx?
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_AX);
-  const int stack_used2 = (stack_used+1) % nHardwareSMT::NUM_STACKS;
-  if (Stack(stack_used).Top() != Stack(stack_used2).Top())  IP().Advance();
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_AX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op2 = FindNextStack(op1);
+#endif
+  if (Stack(op1).Top() != Stack(op2).Top())  IP().Advance();
   return true;
 }
 
 //18
 bool cHardwareSMT::Inst_IfNotEqual()     // Execute next if bx != ?cx?
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_AX);
-  const int stack_used2 = (stack_used+1) % nHardwareSMT::NUM_STACKS;
-  if (Stack(stack_used).Top() == Stack(stack_used2).Top())  IP().Advance();
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_AX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op2 = FindNextStack(op1);
+#endif
+  if (Stack(op1).Top() == Stack(op2).Top())  IP().Advance();
   return true;
 }
 
 //19
 bool cHardwareSMT::Inst_IfLess()       // Execute next if ?bx? < ?cx?
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_AX);
-  const int stack_used2 = (stack_used+1) % nHardwareSMT::NUM_STACKS;
-  if (Stack(stack_used).Top() >=  Stack(stack_used2).Top())  IP().Advance();
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_AX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op2 = FindNextStack(op1);
+#endif
+  if (Stack(op1).Top() >=  Stack(op2).Top())  IP().Advance();
   return true;
 }
 
 //20
 bool cHardwareSMT::Inst_IfGreater()       // Execute next if bx > ?cx?
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_AX);
-  const int stack_used2 = (stack_used+1) % nHardwareSMT::NUM_STACKS;
-  if (Stack(stack_used).Top() <= Stack(stack_used2).Top())  IP().Advance();
+  const int op1 = FindModifiedStack(nHardwareSMT::STACK_AX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int op2 = FindModifiedNextStack(op1);
+#else
+  const int op2 = FindNextStack(op1);
+#endif
+  if (Stack(op1).Top() <= Stack(op2).Top())  IP().Advance();
   return true;
 }
 
@@ -1802,7 +1977,12 @@
 bool cHardwareSMT::Inst_HeadPush()
 {
   const int head_used = FindModifiedHead(nHardware::HEAD_IP);
-  Stack(nHardwareSMT::STACK_BX).Push(GetHead(head_used).GetPosition());
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#else
+  const int dst = nHardwareSMT::STACK_BX;
+#endif
+  Stack(dst).Push(GetHead(head_used).GetPosition());
   return true;
 }
 
@@ -1810,8 +1990,12 @@
 bool cHardwareSMT::Inst_HeadPop()
 {
   const int head_used = FindModifiedHead(nHardware::HEAD_IP);
-  GetHead(head_used).Set(Stack(nHardwareSMT::STACK_BX).Pop(), 
-												 GetHead(head_used).GetMemSpace(), this);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(nHardwareSMT::STACK_BX);
+#else
+  const int src = nHardwareSMT::STACK_BX;
+#endif
+  GetHead(head_used).Set(Stack(src).Pop(), GetHead(head_used).GetMemSpace(), this);
   return true;
 }
 
@@ -1858,27 +2042,42 @@
 //25
 bool cHardwareSMT::Inst_PushNext() 
 {
-  int stack_used = FindModifiedStack(nHardwareSMT::STACK_AX);
-  int successor = (stack_used + 1) % nHardwareSMT::NUM_STACKS;
-  Stack(successor).Push(Stack(stack_used).Pop());
+  // DDD - Should this allow modified next, or be eliminated in favor of just 'Push'
+  const int src = FindModifiedStack(nHardwareSMT::STACK_AX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedNextStack(src);
+#else
+  const int dst = FindNextStack(src);
+#endif
+  Stack(dst).Push(Stack(src).Pop());
   return true;
 }
 
 //26
 bool cHardwareSMT::Inst_PushPrevious() 
 {
-  int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int predecessor = (stack_used + nHardwareSMT::NUM_STACKS - 1) % nHardwareSMT::NUM_STACKS;
-  Stack(predecessor).Push(Stack(stack_used).Pop());
+  // DDD - Should this allow modified previous, or be eliminated in favor of just 'Push'
+  const int src = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedPreviousStack(src);
+#else
+  const int dst = FindPreviousStack(src);
+#endif
+  Stack(dst).Push(Stack(src).Pop());
   return true;
 }
 
 //27
 bool cHardwareSMT::Inst_PushComplement() 
 {
-  int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int complement = FindComplementStack(stack_used);
-  Stack(complement).Push(Stack(stack_used).Pop());
+  // DDD - Should this allow modified complement, or be eliminated in favor of just 'Push'
+  int src = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int dst = FindModifiedComplementStack(src);
+#else
+  const int dst = FindComplementStack(src);
+#endif
+  Stack(dst).Push(Stack(src).Pop());
   return true;
 }
 
@@ -1893,8 +2092,13 @@
 //29
 bool cHardwareSMT::Inst_ValCopy()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  Stack(stack_used).Push(Stack(stack_used).Top());
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
+  Stack(dst).Push(Stack(src).Top());
   return true;
 }
 
@@ -1917,40 +2121,6 @@
   return true;
 }
 
-//32
-bool cHardwareSMT::Inst_Increment()
-{
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int value = Stack(stack_used).Pop();
-  Stack(stack_used).Push(++value);
-  return true;
-}
-
-//33
-bool cHardwareSMT::Inst_Decrement()
-{
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  int value = Stack(stack_used).Pop();
-  Stack(stack_used).Push(--value);
-  return true;
-}
-
-//34
-bool cHardwareSMT::Inst_Mod()
-{
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
-  if (Stack(nHardwareSMT::STACK_CX).Top() != 0) {
-    if(Stack(nHardwareSMT::STACK_CX).Top() == -1)
-      Stack(stack_used).Push(0);
-    else
-      Stack(stack_used).Push(Stack(nHardwareSMT::STACK_BX).Top() % Stack(nHardwareSMT::STACK_CX).Top());
-  } else {
-    Fault(FAULT_LOC_MATH, FAULT_TYPE_ERROR, "mod: modding by 0");
-		return false;
-  }
-  return true;
-}
-
 //35
 bool cHardwareSMT::Inst_KillThread()
 {
@@ -1962,15 +2132,20 @@
 //36
 bool cHardwareSMT::Inst_IO()
 {
-  const int stack_used = FindModifiedStack(nHardwareSMT::STACK_BX);
+  const int dst = FindModifiedStack(nHardwareSMT::STACK_BX);
+#ifdef SMT_FULLY_ASSOCIATIVE
+  const int src = FindModifiedStack(dst);
+#else
+  const int src = dst;
+#endif
 	
   // Do the "put" component
-  const int value_out = Stack(stack_used).Top();
+  const int value_out = Stack(src).Top();
   organism->DoOutput(value_out);  // Check for tasks compleated.
 	
   // Do the "get" component
   const int value_in = organism->GetNextInput();
-  Stack(stack_used).Push(value_in);
+  Stack(dst).Push(value_in);
   organism->DoInput(value_in);
   return true;
 }

Modified: trunk/source/cpu/cHardwareSMT.h
===================================================================
--- trunk/source/cpu/cHardwareSMT.h	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/cpu/cHardwareSMT.h	2005-10-13 19:55:04 UTC (rev 341)
@@ -239,7 +239,12 @@
 private:
   /////////---------- Instruction Helpers ------------//////////
   int FindModifiedStack(int default_stack);
+  int FindModifiedNextStack(int default_stack);
+  int FindModifiedPreviousStack(int default_stack);
+  int FindModifiedComplementStack(int default_stack);
   int FindModifiedHead(int default_head);
+  int FindNextStack(int default_stack);
+  int FindPreviousStack(int default_stack);
   int FindComplementStack(int base_stack);
   int FindMemorySpaceLabel(int mem_space);
 	
@@ -266,6 +271,9 @@
   bool Inst_Val_Sub();
   bool Inst_Val_Mult();
   bool Inst_Val_Div();
+  bool Inst_Val_Mod();
+  bool Inst_Val_Inc();
+  bool Inst_Val_Dec();
   bool Inst_SetMemory();
   bool Inst_Divide();
   bool Inst_HeadRead();
@@ -286,9 +294,6 @@
   bool Inst_ValCopy();
   bool Inst_ForkThread();
   bool Inst_IfLabel();
-  bool Inst_Increment();
-  bool Inst_Decrement();
-  bool Inst_Mod();
   bool Inst_KillThread();
   bool Inst_IO();
   bool Inst_Inject();

Modified: trunk/source/cpu/nHardwareSMT.h
===================================================================
--- trunk/source/cpu/nHardwareSMT.h	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/cpu/nHardwareSMT.h	2005-10-13 19:55:04 UTC (rev 341)
@@ -20,6 +20,7 @@
   enum tStacks { STACK_AX = 0, STACK_BX, STACK_CX, STACK_DX };
   
   static const int NUM_NOPS = 4;
+  static const int NOPX = 4;
   static const int MAX_MEMSPACE_LABEL = 3;
   
   // Performance Constants

Modified: trunk/source/defs.hh
===================================================================
--- trunk/source/defs.hh	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/defs.hh	2005-10-13 19:55:04 UTC (rev 341)
@@ -8,6 +8,12 @@
 #ifndef DEFS_HH
 #define DEFS_HH
 
+#ifndef VERSION
+#define VERSION "2.3.1"
+#endif
+#define VERSION_TAG "Padawan"
+
+
 #define DEFAULT_DIR "../work/"
 
 /*
@@ -59,26 +65,13 @@
 
 // old compiler //
 //#define explicit
-//#define static_cast(type,expr)      (type)(expr)
-//#define const_cast(type,expr)       (type)(expr)
-//#define reinterpret_cast(type,expr) (type)(expr)
 //#define LONGINT int
 
 // snazzy compiler //
-#define static_cast(type,expr)      static_cast<type>(expr)
-#define const_cast(type,expr)       const_cast<type>(expr)
-#define reinterpret_cast(type,expr) reinterpret_cast<type>(expr)
 #define LONGINT long int
 
 
 ////// Don't change anything below this line. /////
-// the macro VERSION is defined by automake (in the file 'configure.in' in
-// the top-level directory).
-#ifndef VERSION
- #define VERSION "2.3.1"
-#endif
-#define AVIDA_VERSION "2.3.1 (Padawan)"
-
 #ifdef QUICK_BASE_TEST_CPU
 #define QUICK_TEST_CPU
 #endif

Modified: trunk/source/main/avida.cc
===================================================================
--- trunk/source/main/avida.cc	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/main/avida.cc	2005-10-13 19:55:04 UTC (rev 341)
@@ -21,6 +21,7 @@
 #ifndef DEFS_HH
 #include "defs.hh"
 #endif
+#include "cString.h"
 #ifndef ENVIRONMENT_HH
 #include "cEnvironment.h"
 #endif
@@ -51,7 +52,36 @@
 
 using namespace std;
 
+cString AvidaVersion()
+{
+  cString version("Avida ");
+  version += VERSION;
+  version += " (";
+  version += VERSION_TAG;
+  version += ")";
 
+#ifdef DEBUG
+  version += " debug";
+#endif
+#ifdef BREAKPOINTS
+  version += " breakp";
+#endif
+#ifdef EXECUTION_ERRORS
+  version += " exec_err";
+#endif
+#ifdef INSTRUCTION_COSTS
+  version += " inst_cost";
+#endif
+#ifdef INSTRUCTION_COUNT
+  version += " inst_cnt";
+#endif
+#ifdef SMT_FULLY_ASSOCIATIVE
+  version += " smt_fa";
+#endif
+  
+  return version;
+}
+
 void ExitAvida(int exit_code)
 {
   signal(SIGINT, SIG_IGN);          // Ignore all future interupts.

Modified: trunk/source/main/avida.h
===================================================================
--- trunk/source/main/avida.h	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/main/avida.h	2005-10-13 19:55:04 UTC (rev 341)
@@ -10,7 +10,10 @@
 
 class cEnvironment;
 class cPopulationInterface;
+class cString;
 
+cString AvidaVersion();
+
 /**
  * This function properly shuts down the Avida program.
  **/

Modified: trunk/source/main/primitive.cc
===================================================================
--- trunk/source/main/primitive.cc	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/main/primitive.cc	2005-10-13 19:55:04 UTC (rev 341)
@@ -69,10 +69,10 @@
   signal(SIGINT, ExitAvida);
 
   // output copyright message
-  cout << "Avida " << AVIDA_VERSION << endl;
+  cout << AvidaVersion() << endl;
   cout << "----------------------------------------------------------------------" << endl;
+  cout << "Copyright (C) 1999-2005 Michigan State University." << endl << endl;
   cout << "Copyright (C) 1993-2003 California Institute of Technology." << endl;
-  cout << "Copyright (C) 1999-2005 Michigan State University." << endl << endl;
   
   cout << "Avida comes with ABSOLUTELY NO WARRANTY." << endl;
   cout << "This is free software, and you are welcome to redistribute it" << endl;

Modified: trunk/source/support/inst_set.smt
===================================================================
--- trunk/source/support/inst_set.smt	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/support/inst_set.smt	2005-10-13 19:55:04 UTC (rev 341)
@@ -2,35 +2,35 @@
 Nop-B         1  #2  (b)
 Nop-C         1  #3  (c)
 Nop-D         1  #4  (d)
-#Nop-X        1  #5  ()
-Val-Shift-R   1  #6  (e)
-Val-Shift-L   1  #7  (f)
-Val-Nand      1  #8  (g)
-Val-Add       1  #9  (h)
-Val-Sub       1  #10 (i)
-Val-Mult      1  #11 (j)
-Val-Div       1  #12 (k)
-SetMemory    	1  #13 (l)
-Divide        1  #14 (m)
-Inst-Read     1  #15 (n)
-Inst-Write    1  #16 (o)
-If-Equal      1  #17 (p)
-If-Not-Equal  1  #18 (q)
-If-Less       1  #19 (r)
-If-Greater    1  #20 (s)
-Head-Push     1  #21 (t)
-Head-Pop      1  #22 (u)
-Head-Move     1  #23 (v)
-Search        1  #24 (w)
-Push-Next     1  #25 (x)
-Push-Prev     1  #26 (y)
-Push-Comp     1  #27 (z)
-Val-Delete    1  #28 (A)
-Val-Copy      1  #29 (B)
-#ThreadFork   1  #30 ()
-Val-Inc       1  #31 (C)
-Val-Dec       1  #32 (D)
-Val-Mod       1  #33 (E)
+Nop-X         1  #5  (e)
+Val-Shift-R   1  #6  (f)
+Val-Shift-L   1  #7  (g)
+Val-Nand      1  #8  (h)
+Val-Add       1  #9  (i)
+Val-Sub       1  #10 (j)
+Val-Mult      1  #11 (k)
+Val-Div       1  #12 (l)
+Val-Mod       1  #13 (m)
+Val-Inc       1  #14 (n)
+Val-Dec       1  #15 (o)
+SetMemory    	1  #16 (p)
+Divide        1  #17 (q)
+Inst-Read     1  #18 (r)
+Inst-Write    1  #19 (s)
+If-Equal      1  #20 (t)
+If-Not-Equal  1  #21 (u)
+If-Less       1  #22 (v)
+If-Greater    1  #23 (w)
+Head-Push     1  #24 (x)
+Head-Pop      1  #25 (y)
+Head-Move     1  #26 (z)
+Search        1  #27 (A)
+Push-Next     1  #28 (B)
+Push-Prev     1  #29 (C)
+Push-Comp     1  #30 (D)
+Val-Delete    1  #31 (E)
+Val-Copy      1  #32 (F)
+#ThreadFork   1  #33 ()
 #ThreadKill   1  #34 ()
-IO            1  #35 (F)
-#Inject        1  #36 (G)
+IO            1  #35 (G)
+#Inject       1  #36 ()

Modified: trunk/source/tools/cString.h
===================================================================
--- trunk/source/tools/cString.h	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/tools/cString.h	2005-10-13 19:55:04 UTC (rev 341)
@@ -298,9 +298,7 @@
 
   // Individal Char Access
   inline char operator[] (int index) const {
-    return (char)((*value)[index]);
-    // Below should work, but fails in HP CC -- TCC
-    //    return const_cast(const cStringData&, *value)[index];
+    return static_cast<char>((*value)[index]);
   }
   cCharProxy operator[] (int index) { return cCharProxy(*this,index); }
 
@@ -619,9 +617,7 @@
 }
 
 cString::cCharProxy::operator char () const {  // rvalue
-  return (char)((*(string.value))[index]);
-  // Below should work, but fails in HP CC -- TCC
-  //   return const_cast(const cStringData&, *(string.value))[index];
+  return static_cast<char>((*(string.value))[index]);
 }
 
 #endif

Modified: trunk/source/viewers/viewer.cc
===================================================================
--- trunk/source/viewers/viewer.cc	2005-10-11 23:02:51 UTC (rev 340)
+++ trunk/source/viewers/viewer.cc	2005-10-13 19:55:04 UTC (rev 341)
@@ -32,10 +32,10 @@
   signal(SIGINT, ExitAvida);
 
   // output copyright message
-  cout << "Avida " << AVIDA_VERSION << endl;
+  cout << AvidaVersion() << endl;
   cout << "----------------------------------------------------------------------" << endl;
+  cout << "Copyright (C) 1999-2005 Michigan State University." << endl << endl;
   cout << "Copyright (C) 1993-2003 California Institute of Technology." << endl;
-  cout << "Copyright (C) 1999-2005 Michigan State University." << endl << endl;
   
   cout << "Avida comes with ABSOLUTELY NO WARRANTY." << endl;
   cout << "This is free software, and you are welcome to redistribute it" << endl;




More information about the Avida-cvs mailing list