Fixed some compiler errors in int64.h.

Fixed and tested ARM assembler version of fix16_mul.
This commit is contained in:
Flatmush 2011-03-16 10:56:29 +00:00
parent 39d1029807
commit b2e8a96e21
2 changed files with 15 additions and 14 deletions

View File

@ -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;
}

View File

@ -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