diff options
| author | Flatmush <Flatmush@googlemail.com> | 2011-03-16 10:56:29 +0000 |
|---|---|---|
| committer | Flatmush <Flatmush@googlemail.com> | 2011-03-16 10:56:29 +0000 |
| commit | b2e8a96e21a958aa1f022d712ed9d224acda1415 (patch) | |
| tree | cdd505387b3de0dfc18a75a842630f095c419f04 | |
| parent | 39d1029807fb9b9d57d7810649a15c32dd2769e7 (diff) | |
| download | libfixmath-b2e8a96e21a958aa1f022d712ed9d224acda1415.tar.gz | |
Fixed some compiler errors in int64.h.
Fixed and tested ARM assembler version of fix16_mul.
| -rw-r--r-- | libfixmath/fix16.c | 9 | ||||
| -rw-r--r-- | 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
|
