[MIPS] Add MIPS architecture support to libagl
Change-Id: I30eb92857a2a6ea867fe0ee45109f17609043aae
This commit is contained in:
parent
cd91024ca1
commit
b43722c3dd
@ -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
|
||||
|
||||
|
61
opengl/libagl/arch-mips/fixed_asm.S
Normal file
61
opengl/libagl/arch-mips/fixed_asm.S
Normal 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
|
@ -19,7 +19,7 @@
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
#if !defined(__arm__)
|
||||
#if !defined(__arm__) && !defined(__mips__)
|
||||
GGLfixed gglFloatToFixed(float v) {
|
||||
return GGLfixed(floorf(v * 65536.0f + 0.5f));
|
||||
}
|
||||
|
@ -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 +
|
||||
|
Loading…
Reference in New Issue
Block a user