am 7fd5ef3e: am e3a396b2: am 906bd042: Merge "[MIPS] Add MIPS architecture support to libagl"

* commit '7fd5ef3ecad09e71756720bc0666cd4552508d9c':
  [MIPS] Add MIPS architecture support to libagl
This commit is contained in:
Keun-young Park 2013-03-29 00:16:25 -07:00 committed by Android Git Automerger
commit 85b8fb58e7
4 changed files with 113 additions and 1 deletions

View File

@ -34,6 +34,13 @@ ifeq ($(TARGET_ARCH),arm)
LOCAL_CFLAGS += -fstrict-aliasing
endif
ifeq ($(TARGET_ARCH),mips)
LOCAL_SRC_FILES += arch-$(TARGET_ARCH)/fixed_asm.S
LOCAL_CFLAGS += -fstrict-aliasing
# The graphics code can generate division by zero
LOCAL_CFLAGS += -mno-check-zero-division
endif
# we need to access the private Bionic header <bionic_tls.h>
LOCAL_C_INCLUDES += bionic/libc/private

View File

@ -0,0 +1,61 @@
/* libs/opengles/arch-mips/fixed_asm.S
**
** Copyright 2012, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
.text
.align
/*
* this version rounds-to-nearest and saturates numbers
* outside the range (but not NaNs).
*/
.global gglFloatToFixed
.ent gglFloatToFixed
.type gglFloatToFixed, @function
gglFloatToFixed:
#if !defined(__mips_soft_float)
mfc1 $a0,$f12
#endif
srl $t0,$a0,31 /* t0 <- sign bit */
srl $t1,$a0,23
andi $t1,$t1,0xff /* get the e */
li $t2,0x8e
subu $t1,$t2,$t1 /* t1=127+15-e */
blez $t1,0f /* t1<=0? */
sll $t2,$a0,8 /* mantissa<<8 */
lui $t3,0x8000
or $t2,$t2,$t3 /* add the missing 1 */
subu $t1,$t1,1
srl $v0,$t2,$t1
sltiu $t3,$t1,32 /* t3=1 if t1<32, else t3=0. t1>=32 means the float value is too small. */
andi $t4,$v0,0x1
srl $v0,$v0,1 /* scale to 16.16 */
addu $v0,$v0,$t4 /* round-to-nearest */
subu $t2,$zero,$v0
movn $v0,$t2,$t0 /* if negative? */
or $t1,$a0,$zero /* a0=0? */
movz $v0,$zero,$t1
movz $v0,$zero,$t3 /* t3=0 then res=0 */
jr $ra
0:
lui $t1,0x8000
and $v0,$a0,$t1 /* keep only the sign bit */
li $t1,0x7fffffff
movz $v0,$t1,$t0 /* positive, maximum value */
jr $ra
.end gglFloatToFixed

View File

@ -19,7 +19,7 @@
// ----------------------------------------------------------------------------
#if !defined(__arm__)
#if !defined(__arm__) && !defined(__mips__)
GGLfixed gglFloatToFixed(float v) {
return GGLfixed(floorf(v * 65536.0f + 0.5f));
}

View File

@ -74,6 +74,30 @@ GLfixed vsquare3(GLfixed a, GLfixed b, GLfixed c)
);
return r;
#elif defined(__mips__)
GLfixed res;
int32_t t1,t2,t3;
asm(
"mult %[a], %[a] \r\n"
"li %[res],0x8000 \r\n"
"madd %[b],%[b] \r\n"
"move %[t3],$zero \r\n"
"madd %[c],%[c] \r\n"
"mflo %[t1]\r\n"
"mfhi %[t2]\r\n"
"addu %[t1],%[res],%[t1]\r\n" /*add 0x8000*/
"sltu %[t3],%[t1],%[res]\r\n"
"addu %[t2],%[t2],%[t3]\r\n"
"srl %[res],%[t1],16\r\n"
"sll %[t2],%[t2],16\r\n"
"or %[res],%[res],%[t2]\r\n"
: [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2),[t3]"=&r"(t3)
: [a] "r" (a),[b] "r" (b),[c] "r" (c)
: "%hi","%lo"
);
return res;
#else
return (( int64_t(a)*a +
@ -136,6 +160,26 @@ static inline GLfixed mla3a( GLfixed a0, GLfixed b0,
);
return r;
#elif defined(__mips__)
GLfixed res;
int32_t t1,t2;
asm(
"mult %[a0],%[b0] \r\n"
"madd %[a1],%[b1] \r\n"
"madd %[a2],%[b2] \r\n"
"mflo %[t2]\r\n"
"mfhi %[t1]\r\n"
"srl %[t2],%[t2],16\r\n"
"sll %[t1],%[t1],16\r\n"
"or %[t2],%[t2],%[t1]\r\n"
"addu %[res],%[t2],%[c]"
: [res]"=&r"(res),[t1]"=&r"(t1),[t2]"=&r"(t2)
: [a0] "r" (a0),[b0] "r" (b0),[a1] "r" (a1),[b1] "r" (b1),[a2] "r" (a2),[b2] "r" (b2),[c] "r" (c)
: "%hi","%lo"
);
return res;
#else
return (( int64_t(a0)*b0 +