563f2602f4
- Should fix performance degradation caused because of the split - Thanks for all who noticed (amiconn et al.) git-svn-id: svn://svn.rockbox.org/rockbox/trunk@24266 a1c6a512-1295-4272-9138-f99709370657
96 lines
3.3 KiB
C
96 lines
3.3 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* Open \______ \ ____ ____ | | _\_ |__ _______ ___
|
|
* Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
|
|
* Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
|
|
* Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
|
|
* \/ \/ \/ \/ \/
|
|
* $Id$
|
|
*
|
|
* Copyright (C) 2009 Tomer Shalev
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
|
|
* KIND, either express or implied.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#ifndef _CPU_SH7043_H
|
|
#define _CPU_SH7043_H
|
|
|
|
inline static short muls16_asr10(short a, short b)
|
|
{
|
|
short r;
|
|
asm (
|
|
"muls %[a],%[b] \n"
|
|
"sts macl,%[r] \n"
|
|
"shlr8 %[r] \n"
|
|
"shlr2 %[r] \n"
|
|
: /* outputs */
|
|
[r]"=r"(r)
|
|
: /* inputs */
|
|
[a]"r"(a),
|
|
[b]"r"(b)
|
|
);
|
|
return r;
|
|
}
|
|
|
|
inline static long muls32_asr26(long a, long b)
|
|
{
|
|
long r, t1, t2, t3;
|
|
asm (
|
|
/* Signed 32bit * 32bit -> 64bit multiplication.
|
|
Notation: xxab * xxcd, where each letter represents 16 bits.
|
|
xx is the 64 bit sign extension. */
|
|
"swap.w %[a],%[t1] \n" /* t1 = ba */
|
|
"mulu %[t1],%[b] \n" /* a * d */
|
|
"swap.w %[b],%[t3] \n" /* t3 = dc */
|
|
"sts macl,%[t2] \n" /* t2 = a * d */
|
|
"mulu %[t1],%[t3] \n" /* a * c */
|
|
"sts macl,%[r] \n" /* hi = a * c */
|
|
"mulu %[a],%[t3] \n" /* b * c */
|
|
"clrt \n"
|
|
"sts macl,%[t3] \n" /* t3 = b * c */
|
|
"addc %[t2],%[t3] \n" /* t3 += t2, carry -> t2 */
|
|
"movt %[t2] \n"
|
|
"mulu %[a],%[b] \n" /* b * d */
|
|
"mov %[t3],%[t1] \n" /* t1t3 = t2t3 << 16 */
|
|
"xtrct %[t2],%[t1] \n"
|
|
"shll16 %[t3] \n"
|
|
"sts macl,%[t2] \n" /* lo = b * d */
|
|
"clrt \n" /* hi.lo += t1t3 */
|
|
"addc %[t3],%[t2] \n"
|
|
"addc %[t1],%[r] \n"
|
|
"cmp/pz %[a] \n" /* ab >= 0 ? */
|
|
"bt 1f \n"
|
|
"sub %[b],%[r] \n" /* no: hi -= cd (sign extension of ab is -1) */
|
|
"1: \n"
|
|
"cmp/pz %[b] \n" /* cd >= 0 ? */
|
|
"bt 2f \n"
|
|
"sub %[a],%[r] \n" /* no: hi -= ab (sign extension of cd is -1) */
|
|
"2: \n"
|
|
/* Shift right by 26 and return low 32 bits */
|
|
"shll2 %[r] \n" /* hi <<= 6 */
|
|
"shll2 %[r] \n"
|
|
"shll2 %[r] \n"
|
|
"shlr16 %[t2] \n" /* (unsigned)lo >>= 26 */
|
|
"shlr8 %[t2] \n"
|
|
"shlr2 %[t2] \n"
|
|
"or %[t2],%[r] \n" /* combine result */
|
|
: /* outputs */
|
|
[r] "=&r"(r),
|
|
[t1]"=&r"(t1),
|
|
[t2]"=&r"(t2),
|
|
[t3]"=&r"(t3)
|
|
: /* inputs */
|
|
[a] "r" (a),
|
|
[b] "r" (b)
|
|
);
|
|
return r;
|
|
}
|
|
|
|
#endif
|