summaryrefslogtreecommitdiff
path: root/n/asserv/src/dsp_check2.c
diff options
context:
space:
mode:
Diffstat (limited to 'n/asserv/src/dsp_check2.c')
-rw-r--r--n/asserv/src/dsp_check2.c70
1 files changed, 61 insertions, 9 deletions
diff --git a/n/asserv/src/dsp_check2.c b/n/asserv/src/dsp_check2.c
index 76d5cfe..92f2be0 100644
--- a/n/asserv/src/dsp_check2.c
+++ b/n/asserv/src/dsp_check2.c
@@ -45,6 +45,41 @@ check_mul_f824 (int a, int b, int r)
printf (" | %08x %08x %08x\n", a, b, r);
}
+void
+check_div_f824 (int d, int v, int r)
+{
+ long long m;
+ if (v == 0)
+ {
+ printf ("zero div %d / %d", d, v);
+ }
+ else
+ {
+ m = (((long long) d) << 24) / v;
+ if (m > (1LL << 31) - 1 || m < -(1LL << 31))
+ printf ("overflow %d / %d = %d (%Ld)", d, v, r, m);
+ else if (m == r)
+ printf ("pass %d / %d = %d", d, v, r);
+ else
+ {
+ printf ("fail %d / %d = %d (%Ld)", d, v, r, m);
+ failled = 1;
+ }
+ }
+ printf (" | %08x %08x %08x\n", d, v, r);
+}
+
+int
+peek (void)
+{
+ int ret;
+ char cs;
+ ret = scanf (" %c", &cs);
+ if (ret != 1) return 0;
+ ungetc (cs, stdin);
+ return cs;
+}
+
int
get (int c, int *v)
{
@@ -61,19 +96,36 @@ int
main (void)
{
int incomplete = 0;
- int a, b, r1, r2, r3, r4;
+ int a, b, r1, r2, r3, r4, c;
while (!feof (stdin))
{
- if (get ('A', &a) && get ('B', &b) && get ('r', &r1) && get ('r', &r2)
- && get ('r', &r3) && get ('r', &r4))
+ c = peek ();
+ if (c == 'A')
+ {
+ if (get ('A', &a) && get ('B', &b) && get ('r', &r1) && get ('r', &r2)
+ && get ('r', &r3) && get ('r', &r4))
+ {
+ check_mul_f824 (a, b, r1);
+ check_mul_f824 (-a, b, r2);
+ check_mul_f824 (a, -b, r3);
+ check_mul_f824 (-a, -b, r4);
+ }
+ else if (!feof (stdin))
+ incomplete++;
+ }
+ else if (c == 'd')
{
- check_mul_f824 (a, b, r1);
- check_mul_f824 (-a, b, r2);
- check_mul_f824 (a, -b, r3);
- check_mul_f824 (-a, -b, r4);
+ if (get ('d', &a) && get ('v', &b) && get ('r', &r1) && get ('r', &r2)
+ && get ('r', &r3) && get ('r', &r4))
+ {
+ check_div_f824 (a, b, r1);
+ check_div_f824 (-a, b, r1);
+ check_div_f824 (a, -b, r1);
+ check_div_f824 (-a, -b, r1);
+ }
+ else if (!feof (stdin))
+ incomplete++;
}
- else if (!feof (stdin))
- incomplete++;
}
if (incomplete)
printf ("%d incomplete tests\n", incomplete);