alu-n-tst.h 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260
  1. #ifndef N
  2. #error "N must be #defined"
  3. #endif
  4. #include "symcat.h"
  5. /* NOTE: see end of file for #undef of these macros */
  6. #define unsignedN XCONCAT3(uint,N,_t)
  7. #define MAX_INT XCONCAT2(MAX_INT,N)
  8. #define MIN_INT XCONCAT2(MIN_INT,N)
  9. #define alu_N_tests XCONCAT3(alu_,N,_tests)
  10. #define do_alu_N_tests XCONCAT3(do_alu_,N,_tests)
  11. #define OP_BEGIN XCONCAT3(ALU,N,_BEGIN)
  12. #define OP_ADDC XCONCAT3(ALU,N,_ADDC)
  13. #define OP_ADDC_C XCONCAT3(ALU,N,_ADDC_C)
  14. #define OP_SUBC XCONCAT3(ALU,N,_SUBC)
  15. #define OP_SUBB XCONCAT3(ALU,N,_SUBB)
  16. #define OP_SUBB_B XCONCAT3(ALU,N,_SUBB_B)
  17. #define OP_SUBC_X XCONCAT3(ALU,N,_SUBC_X)
  18. #define OP_NEGC XCONCAT3(ALU,N,_NEGC)
  19. #define OP_NEGB XCONCAT3(ALU,N,_NEGB)
  20. #define HAD_CARRY_BORROW (XCONCAT3(ALU,N,_HAD_CARRY_BORROW) != 0)
  21. #define HAD_OVERFLOW (XCONCAT3(ALU,N,_HAD_OVERFLOW) != 0)
  22. #define RESULT XCONCAT3(ALU,N,_RESULT)
  23. #define CARRY_BORROW_RESULT XCONCAT3(ALU,N,_CARRY_BORROW_RESULT)
  24. #define OVERFLOW_RESULT XCONCAT3(ALU,N,_OVERFLOW_RESULT)
  25. #define do_op_N XCONCAT2(do_op_,N)
  26. void
  27. do_op_N (const alu_test *tst)
  28. {
  29. const alu_op *op;
  30. int borrow_p = 0;
  31. OP_BEGIN (tst->begin);
  32. print_hex (tst->begin, N);
  33. for (op = tst->ops; op->op != NULL; op++)
  34. {
  35. printf (" %s ", op->op);
  36. print_hex (op->arg, N);
  37. if (strcmp (op->op, "ADDC") == 0)
  38. OP_ADDC (op->arg);
  39. else if (strcmp (op->op, "ADDC_C0") == 0)
  40. OP_ADDC_C (op->arg, 0);
  41. else if (strcmp (op->op, "ADDC_C1") == 0)
  42. OP_ADDC_C (op->arg, 1);
  43. else if (strcmp (op->op, "SUBC") == 0)
  44. OP_SUBC (op->arg);
  45. else if (strcmp (op->op, "SUBC_X0") == 0)
  46. OP_SUBC_X (op->arg, 0);
  47. else if (strcmp (op->op, "SUBC_X1") == 0)
  48. OP_SUBC_X (op->arg, 1);
  49. else if (strcmp (op->op, "SUBB") == 0)
  50. {
  51. OP_SUBB (op->arg);
  52. borrow_p ++;
  53. }
  54. else if (strcmp (op->op, "SUBB_B0") == 0)
  55. {
  56. OP_SUBB_B (op->arg, 0);
  57. borrow_p ++;
  58. }
  59. else if (strcmp (op->op, "SUBB_B1") == 0)
  60. {
  61. OP_SUBB_B (op->arg, 1);
  62. borrow_p ++;
  63. }
  64. else if (strcmp (op->op, "NEGC") == 0)
  65. OP_NEGC ();
  66. else if (strcmp (op->op, "NEGB") == 0)
  67. {
  68. OP_NEGB ();
  69. borrow_p ++;
  70. }
  71. else
  72. {
  73. printf (" -- operator unknown\n");
  74. abort ();
  75. }
  76. }
  77. printf (" = ");
  78. print_hex (tst->result, N);
  79. if (borrow_p)
  80. printf (" B:%d", tst->carry_borrow);
  81. else
  82. printf (" C:%d", tst->carry_borrow);
  83. printf (" V:%d", tst->overflow);
  84. if (tst->carry_borrow != HAD_CARRY_BORROW)
  85. {
  86. if (borrow_p)
  87. printf (" -- borrow (%d) wrong", HAD_CARRY_BORROW);
  88. else
  89. printf (" -- carry (%d) wrong", HAD_CARRY_BORROW);
  90. errors ++;
  91. }
  92. if (tst->overflow != HAD_OVERFLOW)
  93. {
  94. printf (" -- overflow (%d) wrong", HAD_OVERFLOW);
  95. errors ++;
  96. }
  97. if ((unsignedN) CARRY_BORROW_RESULT != (unsignedN) tst->result)
  98. {
  99. printf (" -- result for carry/borrow wrong ");
  100. print_hex (CARRY_BORROW_RESULT, N);
  101. errors ++;
  102. }
  103. if ((unsignedN) OVERFLOW_RESULT != (unsignedN) tst->result)
  104. {
  105. printf (" -- result for overflow wrong ");
  106. print_hex (OVERFLOW_RESULT, N);
  107. errors ++;
  108. }
  109. if ((unsignedN) RESULT != (unsignedN) tst->result)
  110. {
  111. printf (" -- result wrong ");
  112. print_hex (RESULT, N);
  113. errors ++;
  114. }
  115. printf ("\n");
  116. }
  117. const alu_test alu_N_tests[] = {
  118. /* 0 + 0; 0 + 1; 1 + 0; 1 + 1 */
  119. { 0, { { "ADDC", 0 }, }, 0, 0, 0, },
  120. { 0, { { "ADDC", 1 }, }, 1, 0, 0, },
  121. { 1, { { "ADDC", 0 }, }, 1, 0, 0, },
  122. { 1, { { "ADDC", 1 }, }, 2, 0, 0, },
  123. /* 0 + 0 + 0; 0 + 0 + 1; 0 + 1 + 0; 0 + 1 + 1 */
  124. /* 1 + 0 + 0; 1 + 0 + 1; 1 + 1 + 0; 1 + 1 + 1 */
  125. { 0, { { "ADDC_C0", 0 }, }, 0, 0, 0, },
  126. { 0, { { "ADDC_C0", 1 }, }, 1, 0, 0, },
  127. { 0, { { "ADDC_C1", 0 }, }, 1, 0, 0, },
  128. { 0, { { "ADDC_C1", 1 }, }, 2, 0, 0, },
  129. { 1, { { "ADDC_C0", 0 }, }, 1, 0, 0, },
  130. { 1, { { "ADDC_C0", 1 }, }, 2, 0, 0, },
  131. { 1, { { "ADDC_C1", 0 }, }, 2, 0, 0, },
  132. { 1, { { "ADDC_C1", 1 }, }, 3, 0, 0, },
  133. /* */
  134. { MAX_INT, { { "ADDC", 1 }, }, MIN_INT, 0, 1, },
  135. { MIN_INT, { { "ADDC", -1 }, }, MAX_INT, 1, 1, },
  136. { MAX_INT, { { "ADDC", MIN_INT }, }, -1, 0, 0, },
  137. { MIN_INT, { { "ADDC", MAX_INT }, }, -1, 0, 0, },
  138. { MAX_INT, { { "ADDC", MAX_INT }, }, MAX_INT << 1, 0, 1, },
  139. { MIN_INT, { { "ADDC", MIN_INT }, }, 0, 1, 1, },
  140. /* */
  141. { 0, { { "ADDC_C1", -1 }, }, 0, 1, 0, },
  142. { 0, { { "ADDC_C1", -2 }, }, -1, 0, 0, },
  143. { -1, { { "ADDC_C1", 0 }, }, 0, 1, 0, },
  144. { 0, { { "ADDC_C0", 0 }, }, 0, 0, 0, },
  145. { -1, { { "ADDC_C1", -1 }, }, -1, 1, 0, },
  146. { -1, { { "ADDC_C1", 1 }, }, 1, 1, 0, },
  147. { 0, { { "ADDC_C1", MAX_INT }, }, MIN_INT, 0, 1, },
  148. { MAX_INT, { { "ADDC_C1", 1 }, }, MIN_INT + 1, 0, 1, },
  149. { MAX_INT, { { "ADDC_C1", MIN_INT }, }, 0, 1, 0, },
  150. { MAX_INT, { { "ADDC_C1", MAX_INT }, }, (MAX_INT << 1) + 1, 0, 1, },
  151. { MAX_INT, { { "ADDC_C0", MAX_INT }, }, MAX_INT << 1, 0, 1, },
  152. /* 0 - 0 */
  153. { 0, { { "SUBC", 0 }, }, 0, 1, 0, },
  154. { 0, { { "SUBB", 0 }, }, 0, 0, 0, },
  155. /* 0 - 1 */
  156. { 0, { { "SUBC", 1 }, }, -1, 0, 0, },
  157. { 0, { { "SUBB", 1 }, }, -1, 1, 0, },
  158. /* 1 - 0 */
  159. { 1, { { "SUBC", 0 }, }, 1, 1, 0, },
  160. { 1, { { "SUBB", 0 }, }, 1, 0, 0, },
  161. /* 1 - 1 */
  162. { 1, { { "SUBC", 1 }, }, 0, 1, 0, },
  163. { 1, { { "SUBB", 1 }, }, 0, 0, 0, },
  164. /* 0 - 0 - 0 */
  165. { 0, { { "SUBC_X0", 0 }, }, -1, 0, 0, },
  166. { 0, { { "SUBB_B0", 0 }, }, 0, 0, 0, },
  167. /* 0 - 0 - 1 */
  168. { 0, { { "SUBC_X0", 1 }, }, -2, 0, 0, },
  169. { 0, { { "SUBB_B0", 1 }, }, -1, 1, 0, },
  170. /* 0 - 1 - 0 */
  171. { 0, { { "SUBC_X1", 0 }, }, 0, 1, 0, },
  172. { 0, { { "SUBB_B1", 0 }, }, -1, 1, 0, },
  173. /* 0 - 1 - 1 */
  174. { 0, { { "SUBC_X1", 1 }, }, -1, 0, 0, },
  175. { 0, { { "SUBB_B1", 1 }, }, -2, 1, 0, },
  176. /* 1 - 0 - 0 */
  177. { 1, { { "SUBC_X0", 0 }, }, 0, 1, 0, },
  178. { 1, { { "SUBB_B0", 0 }, }, 1, 0, 0, },
  179. /* 1 - 0 - 1 */
  180. { 1, { { "SUBC_X0", 1 }, }, -1, 0, 0, },
  181. { 1, { { "SUBB_B0", 1 }, }, 0, 0, 0, },
  182. /* 1 - 1 - 0 */
  183. { 1, { { "SUBC_X1", 0 }, }, 1, 1, 0, },
  184. { 1, { { "SUBB_B1", 0 }, }, 0, 0, 0, },
  185. /* 1 - 1 - 1 */
  186. { 1, { { "SUBC_X1", 1 }, }, 0, 1, 0, },
  187. { 1, { { "SUBB_B1", 1 }, }, -1, 1, 0, },
  188. /* */
  189. { 0, { { "SUBC", MIN_INT }, }, MIN_INT, 0, 1, },
  190. { MIN_INT, { { "SUBC", 1 }, }, MAX_INT, 1, 1, },
  191. { MAX_INT, { { "SUBC", MAX_INT }, }, 0, 1, 0, },
  192. /* */
  193. { 0, { { "SUBC_X0", MIN_INT }, }, MAX_INT, 0, 0, },
  194. { MIN_INT, { { "SUBC_X1", 0 }, }, MIN_INT, 1, 0, },
  195. { MAX_INT, { { "SUBC_X0", MAX_INT }, }, -1, 0, 0, },
  196. /* */
  197. { MAX_INT, { { "NEGC", 0 }, }, MIN_INT + 1, 0, 0, },
  198. { MAX_INT, { { "NEGC", 0 }, }, MIN_INT + 1, 0, 0, },
  199. { MIN_INT, { { "NEGC", 0 }, }, MIN_INT, 0, 1, },
  200. { 0, { { "NEGC", 0 }, }, 0, 1, 0, },
  201. { -1, { { "NEGC", 0 }, }, 1, 0, 0, },
  202. { 1, { { "NEGC", 0 }, }, -1, 0, 0, },
  203. };
  204. static void
  205. do_alu_N_tests (void)
  206. {
  207. int i;
  208. for (i = 0; i < sizeof (alu_N_tests) / sizeof (*alu_N_tests); i++)
  209. {
  210. const alu_test *tst = &alu_N_tests[i];
  211. do_op_N (tst);
  212. }
  213. }
  214. #undef OP_BEGIN
  215. #undef OP_ADDC
  216. #undef OP_ADDC_C
  217. #undef OP_SUBB
  218. #undef OP_SUBC
  219. #undef OP_SUBC_X
  220. #undef OP_SUBB_B
  221. #undef HAD_OVERFLOW
  222. #undef HAD_CARRY_BORROW
  223. #undef OVERFLOW_RESULT
  224. #undef CARRY_BORROW_RESULT
  225. #undef RESULT
  226. #undef do_op_N
  227. #undef unsignedN
  228. #undef MAX_INT
  229. #undef MIN_INT
  230. #undef alu_N_tests
  231. #undef do_alu_N_tests