From b2e8a96e21a958aa1f022d712ed9d224acda1415 Mon Sep 17 00:00:00 2001 From: Flatmush Date: Wed, 16 Mar 2011 10:56:29 +0000 Subject: Fixed some compiler errors in int64.h. Fixed and tested ARM assembler version of fix16_mul. --- libfixmath/fix16.c | 9 +++++---- libfixmath/int64.h | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 14 deletions(-) diff --git a/libfixmath/fix16.c b/libfixmath/fix16.c index df6a732..de9bbf1 100644 --- a/libfixmath/fix16.c +++ b/libfixmath/fix16.c @@ -16,16 +16,17 @@ fix16_t fix16_sadd(fix16_t inArg0, fix16_t inArg1) { #if defined(__arm__) || defined(_ARM) || defined(__thumb2__) fix16_t fix16_mul(int32_t inArg0, int32_t inArg1) { - fix16_t res; + register fix16_t res; + register fix16_t tmp; asm( - "smull %0, r0, %1, %2\n\t" + "smull %0, %3, %1, %2\n\t" #ifndef FIXMATH_NO_ROUNDING "add %0, %0, #0x8000\n\t" #endif "mov %0, %0, lsr #16\n\t" - "orr %0, %0, r0, lsl #16" + "orr %0, %0, %3, lsl #16" : "=r"(res) - : "r"(inArg0), "r"(inArg1) + : "r"(inArg0), "r"(inArg1), "r"(tmp) : "r0"); return res; } diff --git a/libfixmath/int64.h b/libfixmath/int64.h index 95b2269..4d716bf 100644 --- a/libfixmath/int64.h +++ b/libfixmath/int64.h @@ -40,6 +40,13 @@ static inline __int64_t int64_from_int32(int32_t x) { return (__int64_t){ (x < 0 static inline int32_t int64_hi(__int64_t x) { return x.hi; } static inline uint32_t int64_lo(__int64_t x) { return x.lo; } +static inline int int64_cmp_eq(__int64_t x, __int64_t y) { return ((x.hi == y.hi) && (x.lo == y.lo)); } +static inline int int64_cmp_ne(__int64_t x, __int64_t y) { return ((x.hi != y.hi) || (x.lo != y.lo)); } +static inline int int64_cmp_gt(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo > y.lo))); } +static inline int int64_cmp_ge(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo >= y.lo))); } +static inline int int64_cmp_lt(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo < y.lo))); } +static inline int int64_cmp_le(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo <= y.lo))); } + static inline __int64_t int64_add(__int64_t x, __int64_t y) { __int64_t ret; ret.hi = x.hi + y.hi; @@ -129,28 +136,21 @@ static inline __int64_t int64_div_i64_i32(__int64_t x, int32_t y) { __int64_t _y = int64_from_int32(y); __int64_t i; - for(i = int64_from_int32(1); _y < x; _y = int64_shift(_y, 1), i = int64_shift(i, 1)); + for(i = int64_from_int32(1); int64_cmp_lt(_y, x); _y = int64_shift(_y, 1), i = int64_shift(i, 1)); while(x.hi) { _y = int64_shift(_y, -1); i = int64_shift(i, -1); - if(in64_cmp_ge(x, _y)) { + if(int64_cmp_ge(x, _y)) { x = int64_sub(x, _y); ret = int64_add(ret, i); } } - ret = int64_add(ret, int64_from_int32(x.lo / y)) + ret = int64_add(ret, int64_from_int32(x.lo / y)); return (neg ? int64_neg(ret) : ret); } -static inline int int64_cmp_eq(__int64_t x, __int64_t y) { return ((x.hi == y.hi) && (x.lo == y.lo)); } -static inline int int64_cmp_ne(__int64_t x, __int64_t y) { return ((x.hi != y.hi) || (x.lo != y.lo)); } -static inline int int64_cmp_gt(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo > y.lo))); } -static inline int int64_cmp_ge(__int64_t x, __int64_t y) { return ((x.hi > y.hi) || ((x.hi == y.hi) && (x.lo >= y.lo))); } -static inline int int64_cmp_lt(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo < y.lo))); } -static inline int int64_cmp_le(__int64_t x, __int64_t y) { return ((x.hi < y.hi) || ((x.hi == y.hi) && (x.lo <= y.lo))); } - #define int64_t __int64_t #endif -- cgit v1.2.3