diff options
| -rw-r--r-- | src/core/ao_int64.c | 11 | ||||
| -rw-r--r-- | src/core/ao_int64.h | 2 | ||||
| -rw-r--r-- | src/test/ao_int64_test.c | 4 | 
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); | 
