summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/alpha-dis.c2
-rw-r--r--src/determine_slotting.c77
-rw-r--r--test/Makefile17
-rw-r--r--test/test-determine_slotting.c170
4 files changed, 188 insertions, 78 deletions
diff --git a/src/alpha-dis.c b/src/alpha-dis.c
index 8b7a6fa..72e70e4 100644
--- a/src/alpha-dis.c
+++ b/src/alpha-dis.c
@@ -109,7 +109,7 @@ print_insn_alpha (memaddr, info)
(*info->memory_error_func) (status, memaddr, info);
return -1;
}
- insn = bfd_getl32 (buffer);
+ memcpy(&insn, buffer, 4);
}
/* Get the major opcode of the instruction. */
diff --git a/src/determine_slotting.c b/src/determine_slotting.c
index 32d6927..d79162b 100644
--- a/src/determine_slotting.c
+++ b/src/determine_slotting.c
@@ -7,62 +7,6 @@
#define CLUSTER_0 0
#define CLUSTER_1 1
-#if defined DEBUG && DEBUG == 1
-
-#include <stdio.h>
-
-#define PRINT_DEBUG printf("%c%c%c%c\n", octaword.instr[3].slot, octaword.instr[2].slot, octaword.instr[1].slot, octaword.instr[0].slot)
-
-#define RULE1() \
- octaword.instr[3].slot = 'U'; \
- octaword.instr[2].slot = 'U'; \
- octaword.instr[1].slot = 'U'; \
- octaword.instr[0].slot = 'U'
-
-#define RULE2() \
- octaword.instr[3].slot = 'E'; \
- octaword.instr[2].slot = 'U'; \
- octaword.instr[1].slot = 'U'; \
- octaword.instr[0].slot = 'U'
-
-#define RULE3() \
- octaword.instr[3].slot = 'U'; \
- octaword.instr[2].slot = 'U'; \
- octaword.instr[1].slot = 'E'; \
- octaword.instr[0].slot = 'L'
-
-#define RULE3B() \
- octaword.instr[3].slot = 'E'; \
- octaword.instr[2].slot = 'E'; \
- octaword.instr[1].slot = 'L'; \
- octaword.instr[0].slot = 'L'
-
-#define RULE4C() \
- octaword.instr[3].slot = 'E'; \
- octaword.instr[2].slot = 'E'; \
- octaword.instr[1].slot = 'E'; \
- octaword.instr[0].slot = 'U'
-
-#define RULE4A() \
- octaword.instr[3].slot = 'E'; \
- octaword.instr[2].slot = 'L'; \
- octaword.instr[1].slot = 'E'; \
- octaword.instr[0].slot = 'U'
-
-#define RULE4AD() \
- octaword.instr[3].slot = 'U'; \
- octaword.instr[2].slot = 'L'; \
- octaword.instr[1].slot = 'E'; \
- octaword.instr[0].slot = 'E'
-
-#define RULE4CD() \
- octaword.instr[3].slot = 'E'; \
- octaword.instr[2].slot = 'E'; \
- octaword.instr[1].slot = 'E'; \
- octaword.instr[0].slot = 'E'
-
-#endif /* DEBUG */
-
struct octaword_t
{
struct {
@@ -236,24 +180,3 @@ determine_slotting(struct octaword_t octaword)
return octaword;
}
-
-#if defined DEBUG && DEBUG == 1
-int main() {
- struct octaword_t octaword;
-
-// RULE3();
-// RULE3B();
-// RULE4C();
- RULE4A();
-// RULE4AD();
-// RULE4CD();
-
- PRINT_DEBUG;
-
- octaword = determine_slotting(octaword);
-
- PRINT_DEBUG;
-
- return 0;
-}
-#endif
diff --git a/test/Makefile b/test/Makefile
new file mode 100644
index 0000000..ebd4364
--- /dev/null
+++ b/test/Makefile
@@ -0,0 +1,17 @@
+CC=gcc
+MYCFLAGS=-O3 -mcpu=ev67 -pipe
+WARN=-Wunused -Wextra -Wall -std=gnu99 -pedantic
+INC=-I ../include/
+MYLDFLAGS=-Wl,-z,now $(LDFLAGS)
+
+OBJS=test-determine_slotting.o
+
+all: $(DEPS) $(OBJS)
+
+clean:
+ /bin/rm -f cleanbench sysinfo.c $(OBJS)
+
+remake: clean all
+
+%: %.c
+ $(CC) $(MYCFLAGS) $(WARN) $<
diff --git a/test/test-determine_slotting.c b/test/test-determine_slotting.c
new file mode 100644
index 0000000..e54a4bf
--- /dev/null
+++ b/test/test-determine_slotting.c
@@ -0,0 +1,170 @@
+#include "../src/determine_slotting.c"
+
+#include <stdio.h>
+
+#define EXPAND(__octaword) \
+ __octaword.instr[3].slot, \
+ __octaword.instr[2].slot, \
+ __octaword.instr[1].slot, \
+ __octaword.instr[0].slot
+
+#define PRINT_DEBUG(__rule, __start, __end, __check) printf("%s: %c%c%c%c -> %c%c%c%c (%c%c%c%c)\n", __rule, __start, __end, __check)
+
+#define RULE(__octaword, _3, _2, _1, _0) \
+ __octaword.instr[3].slot = _3; \
+ __octaword.instr[2].slot = _2; \
+ __octaword.instr[1].slot = _1; \
+ __octaword.instr[0].slot = _0
+
+#define DEFINE(__start3, __start2, __start1, __start0, __end3, __end2, __end1, __end0, __rule) \
+ { \
+ .start.instr[3].slot = SLOT_##__start3, \
+ .start.instr[2].slot = SLOT_##__start2, \
+ .start.instr[1].slot = SLOT_##__start1, \
+ .start.instr[0].slot = SLOT_##__start0, \
+ .end.instr[3].slot = SLOT_##__end3, \
+ .end.instr[2].slot = SLOT_##__end2, \
+ .end.instr[1].slot = SLOT_##__end1, \
+ .end.instr[0].slot = SLOT_##__end0, \
+ .rule = __rule \
+ }
+
+struct {
+ struct octaword_t start;
+ struct octaword_t end;
+ const char rule[8];
+} test[] = {
+ DEFINE(U, U, U, U, U, U, U, U, "1A "),
+
+ DEFINE(L, L, L, L, L, L, L, L, "1B "),
+
+ DEFINE(E, U, U, U, L, U, U, U, "2A "),
+ DEFINE(U, E, U, U, U, L, U, U, "2A "),
+ DEFINE(U, U, E, U, U, U, L, U, "2A "),
+ DEFINE(U, U, U, E, U, U, U, L, "2A "),
+ DEFINE(L, U, U, U, L, U, U, U, "2A "),
+ DEFINE(U, L, U, U, U, L, U, U, "2A "),
+ DEFINE(U, U, L, U, U, U, L, U, "2A "),
+ DEFINE(U, U, U, L, U, U, U, L, "2A "),
+
+ DEFINE(E, L, L, L, U, L, L, L, "2B "),
+ DEFINE(L, E, L, L, L, U, L, L, "2B "),
+ DEFINE(L, L, E, L, L, L, U, L, "2B "),
+ DEFINE(L, L, L, E, L, L, L, U, "2B "),
+ DEFINE(U, L, L, L, U, L, L, L, "2B "),
+ DEFINE(L, U, L, L, L, U, L, L, "2B "),
+ DEFINE(L, L, U, L, L, L, U, L, "2B "),
+ DEFINE(L, L, L, U, L, L, L, U, "2B "),
+
+ DEFINE(U, U, E, E, U, U, L, L, "3A "),
+ DEFINE(U, U, E, L, U, U, L, L, "3A "),
+ DEFINE(U, U, L, E, U, U, L, L, "3A "),
+ DEFINE(U, E, U, E, U, L, U, L, "3A "),
+ DEFINE(U, E, U, L, U, L, U, L, "3A "),
+ DEFINE(U, L, U, E, U, L, U, L, "3A "),
+ DEFINE(U, E, E, U, U, L, L, U, "3A "),
+ DEFINE(U, E, L, U, U, L, L, U, "3A "),
+ DEFINE(U, L, E, U, U, L, L, U, "3A "),
+ DEFINE(E, U, U, E, L, U, U, L, "3A "),
+ DEFINE(E, U, U, L, L, U, U, L, "3A "),
+ DEFINE(L, U, U, E, L, U, U, L, "3A "),
+ DEFINE(E, U, E, U, L, U, L, U, "3A "),
+ DEFINE(L, U, E, U, L, U, L, U, "3A "),
+ DEFINE(E, U, L, U, L, U, L, U, "3A "),
+ DEFINE(E, E, U, U, L, L, U, U, "3A "),
+ DEFINE(E, L, U, U, L, L, U, U, "3A "),
+ DEFINE(L, E, U, U, L, L, U, U, "3A "),
+
+ DEFINE(L, L, E, E, L, L, U, U, "3B "),
+ DEFINE(L, L, E, U, L, L, U, U, "3B "),
+ DEFINE(L, L, U, E, L, L, U, U, "3B "),
+ DEFINE(L, E, L, E, L, U, L, U, "3B "),
+ DEFINE(L, U, L, E, L, U, L, U, "3B "),
+ DEFINE(L, E, L, U, L, U, L, U, "3B "),
+ DEFINE(L, E, E, L, L, U, U, L, "3B "),
+ DEFINE(L, U, E, L, L, U, U, L, "3B "),
+ DEFINE(L, E, U, L, L, U, U, L, "3B "),
+ DEFINE(E, L, L, E, U, L, L, U, "3B "),
+ DEFINE(E, L, L, U, U, L, L, U, "3B "),
+ DEFINE(U, L, L, E, U, L, L, U, "3B "),
+ DEFINE(E, L, E, L, U, L, U, L, "3B "),
+ DEFINE(E, L, U, L, U, L, U, L, "3B "),
+ DEFINE(U, L, E, L, U, L, U, L, "3B "),
+ DEFINE(E, E, L, L, U, U, L, L, "3B "),
+ DEFINE(E, U, L, L, U, U, L, L, "3B "),
+ DEFINE(U, E, L, L, U, U, L, L, "3B "),
+
+ DEFINE(U, U, L, L, U, U, L, L, "3AB "),
+ DEFINE(U, L, U, L, U, L, U, L, "3AB "),
+ DEFINE(U, L, L, U, U, L, L, U, "3AB "),
+ DEFINE(L, U, U, L, L, U, U, L, "3AB "),
+ DEFINE(L, U, L, U, L, U, L, U, "3AB "),
+ DEFINE(L, L, U, U, L, L, U, U, "3AB "),
+
+ DEFINE(E, L, E, U, U, L, L, U, "4AB "),
+ DEFINE(E, L, U, E, U, L, U, L, "4AB "),
+ DEFINE(E, U, E, L, L, U, U, L, "4AB "),
+ DEFINE(E, U, L, E, L, U, L, U, "4AB "),
+ DEFINE(U, E, E, L, U, L, U, L, "4AB "),
+ DEFINE(U, E, L, E, U, L, L, U, "4AB "),
+ DEFINE(L, E, E, U, L, U, L, U, "4AB "),
+ DEFINE(L, E, U, E, L, U, U, L, "4AB "),
+
+ DEFINE(E, U, E, E, L, U, L, U, "4AD "),
+ DEFINE(U, E, E, E, U, L, U, L, "4AD "),
+ DEFINE(E, L, E, E, U, L, U, L, "4BD "),
+ DEFINE(L, E, E, E, L, U, L, U, "4BD "),
+
+ DEFINE(L, U, E, E, L, U, L, U, "4ABD"),
+ DEFINE(U, L, E, E, U, L, U, L, "4ABD"),
+
+ DEFINE(E, E, E, U, U, L, L, U, "4CA "),
+ DEFINE(E, E, U, E, U, L, U, L, "4CA "),
+
+ DEFINE(E, E, L, E, U, L, L, U, "4CB "),
+ DEFINE(E, E, E, L, U, L, U, L, "4CB "),
+
+ DEFINE(E, E, U, L, U, L, U, L, "4CAB"),
+ DEFINE(E, E, L, U, U, L, L, U, "4CAB"),
+
+ DEFINE(E, E, E, E, U, L, U, L, "4CD "),
+};
+
+int main() {
+ struct octaword_t check;
+
+ const char * fail = "FAILURE, -> ";
+ const char * succ = " ";
+ const char * which;
+
+ int i;
+ for (i = 0; i < sizeof(test) / sizeof(test[0]); i++) {
+ check = determine_slotting(test[i].start);
+ if ((test[i].end.instr[3].slot != check.instr[3].slot)
+ || (test[i].end.instr[2].slot != check.instr[2].slot)
+ || (test[i].end.instr[1].slot != check.instr[1].slot)
+ || (test[i].end.instr[0].slot != check.instr[0].slot))
+ {
+ which = fail;
+ } else {
+ which = succ;
+ }
+ printf("%s", which);
+ PRINT_DEBUG(test[i].rule, EXPAND(test[i].start), EXPAND(test[i].end), EXPAND(check));
+ }
+
+#if 0
+ /* A.1 Rule 1 - Four of a Kind */
+ RULE(start, SLOT_U, SLOT_U, SLOT_U, SLOT_U);
+ end = determine_slotting(start);
+ PRINT_DEBUG("Rule 1A", EXPAND(start), EXPAND(end));
+
+ RULE(start, SLOT_L, SLOT_L, SLOT_L, SLOT_L);
+ end = determine_slotting(start);
+ PRINT_DEBUG("Rule 1B", EXPAND(start), EXPAND(end));
+
+ /* A.2 Rule 2 - Three of a Kind */
+#endif
+
+ return 0;
+}