summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Packard <keithp@keithp.com>2013-05-22 19:20:54 -0600
committerKeith Packard <keithp@keithp.com>2013-08-25 22:24:01 -0700
commitcb844328322fd7d9f4dafb58b322257a70b347e6 (patch)
tree86a01d45bde34a6801b9f997ed1b6a7adba84754
parent5ccd902d0fd2adc40c72982babb60fac4da6a087 (diff)
altos: Add 64-bit subtraction
Signed-off-by: Keith Packard <keithp@keithp.com>
-rw-r--r--src/core/ao_int64.c11
-rw-r--r--src/core/ao_int64.h2
-rw-r--r--src/test/ao_int64_test.c4
3 files changed, 17 insertions, 0 deletions
diff --git a/src/core/ao_int64.c b/src/core/ao_int64.c
index 5307342d..07cdb357 100644
--- a/src/core/ao_int64.c
+++ b/src/core/ao_int64.c
@@ -27,6 +27,17 @@ void ao_plus64(ao_int64_t *r, ao_int64_t *a, ao_int64_t *b) {
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;
diff --git a/src/core/ao_int64.h b/src/core/ao_int64.h
index e5eee823..cf12f0d8 100644
--- a/src/core/ao_int64.h
+++ b/src/core/ao_int64.h
@@ -26,6 +26,7 @@ typedef struct {
} 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);
@@ -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(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))
diff --git a/src/test/ao_int64_test.c b/src/test/ao_int64_test.c
index 4c88b1a1..c26a63b0 100644
--- a/src/test/ao_int64_test.c
+++ b/src/test/ao_int64_test.c
@@ -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(-, 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);