altos: Add 64-bit subtraction
authorKeith Packard <keithp@keithp.com>
Thu, 23 May 2013 01:20:54 +0000 (19:20 -0600)
committerKeith Packard <keithp@keithp.com>
Mon, 26 Aug 2013 05:24:01 +0000 (22:24 -0700)
Signed-off-by: Keith Packard <keithp@keithp.com>
src/core/ao_int64.c
src/core/ao_int64.h
src/test/ao_int64_test.c

index 5307342df90704c35e94d93880a3f42357222450..07cdb35731be63d927b963870fa56864efb1b0ac 100644 (file)
@@ -27,6 +27,17 @@ void ao_plus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b) {
        r->low = t;
 }
 
        r->low = t;
 }
 
+void ao_minus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b) {
+       uint32_t        t;
+
+
+       r->high = a->high - b->high;
+       t = a->low - b->low;
+       if (t > a->low)
+               r->high--;
+       r->low = t;
+}
+
 void ao_rshift64(ao_int64_t *r, ao_int64_t *a, uint8_t d) {
        if (d < 32) {
                r->low = a->low >> d;
 void ao_rshift64(ao_int64_t *r, ao_int64_t *a, uint8_t d) {
        if (d < 32) {
                r->low = a->low >> d;
index e5eee823b9e6ea0e3e1031d2c22aa9a8d21cdba7..cf12f0d84d46788848835e9021952f1d292ebc9a 100644 (file)
@@ -26,6 +26,7 @@ typedef struct {
 } ao_int64_t;
 
 void ao_plus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
 } ao_int64_t;
 
 void ao_plus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
+void ao_minus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
 void ao_neg64(ao_int64_t *r, ao_int64_t *a);
 void ao_lshift64_16(ao_int64_t *r, uint16_t a, uint8_t d);
 void ao_rshift64(ao_int64_t *r, ao_int64_t *a, uint8_t d);
 void ao_neg64(ao_int64_t *r, ao_int64_t *a);
 void ao_lshift64_16(ao_int64_t *r, uint16_t a, uint8_t d);
 void ao_rshift64(ao_int64_t *r, ao_int64_t *a, uint8_t d);
@@ -33,6 +34,7 @@ void ao_lshift64(ao_int64_t *r, ao_int64_t *a, uint8_t d);
 void ao_mul64_64_64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
 void ao_mul64_32_32(ao_int64_t *r, int32_t a, int32_t b);
 void ao_mul64_64_16(ao_int64_t *r, ao_int64_t *a, uint16_t b);
 void ao_mul64_64_64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
 void ao_mul64_32_32(ao_int64_t *r, int32_t a, int32_t b);
 void ao_mul64_64_16(ao_int64_t *r, ao_int64_t *a, uint16_t b);
+void ao_mul64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b);
 
 #define ao_int64_init32(r, a) (((r)->high = 0), (r)->low = (a))
 #define ao_int64_init64(r, a, b) (((r)->high = (a)), (r)->low = (b))
 
 #define ao_int64_init32(r, a) (((r)->high = 0), (r)->low = (a))
 #define ao_int64_init64(r, a, b) (((r)->high = (a)), (r)->low = (b))
index 4c88b1a13047b69e309c443ac0e24511d0cc4275..c26a63b0c1f8d968ba197c1403beaffbcdc4ec4d 100644 (file)
@@ -65,6 +65,10 @@ do_test(int trial, int64_t a, int64_t b)
        test_a(+, ao_plus64, a, b, &ao_a, &ao_b);
        test_b(+, ao_plus64, a, b, &ao_a, &ao_b);
        test_x(+, ao_plus64, a, b, &ao_a, &ao_b);
        test_a(+, ao_plus64, a, b, &ao_a, &ao_b);
        test_b(+, ao_plus64, a, b, &ao_a, &ao_b);
        test_x(+, ao_plus64, a, b, &ao_a, &ao_b);
+       test(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_a(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_b(-, ao_minus64, a, b, &ao_a, &ao_b);
+       test_x(-, ao_minus64, a, b, &ao_a, &ao_b);
        test(*, ao_mul64_32_32,(int64_t) (int32_t) a, (int32_t) b, (int32_t) a, (int32_t) b);
        test(*, ao_mul64, a, b, &ao_a, &ao_b);
        test_a(*, ao_mul64, a, b, &ao_a, &ao_b);
        test(*, ao_mul64_32_32,(int64_t) (int32_t) a, (int32_t) b, (int32_t) a, (int32_t) b);
        test(*, ao_mul64, a, b, &ao_a, &ao_b);
        test_a(*, ao_mul64, a, b, &ao_a, &ao_b);