[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
|
LOCAL_CFLAGS += -fstrict-aliasing
|
||||||
endif
|
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>
|
# we need to access the private Bionic header <bionic_tls.h>
|
||||||
LOCAL_C_INCLUDES += bionic/libc/private
|
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) {
|
GGLfixed gglFloatToFixed(float v) {
|
||||||
return GGLfixed(floorf(v * 65536.0f + 0.5f));
|
return GGLfixed(floorf(v * 65536.0f + 0.5f));
|
||||||
}
|
}
|
||||||
|
@ -74,6 +74,30 @@ GLfixed vsquare3(GLfixed a, GLfixed b, GLfixed c)
|
|||||||
);
|
);
|
||||||
return r;
|
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
|
#else
|
||||||
|
|
||||||
return (( int64_t(a)*a +
|
return (( int64_t(a)*a +
|
||||||
@ -136,6 +160,26 @@ static inline GLfixed mla3a( GLfixed a0, GLfixed b0,
|
|||||||
);
|
);
|
||||||
return r;
|
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
|
#else
|
||||||
|
|
||||||
return (( int64_t(a0)*b0 +
|
return (( int64_t(a0)*b0 +
|
||||||
|
Loading…
Reference in New Issue
Block a user