[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