Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fd5ef3e authored by Keun-young Park's avatar Keun-young Park Committed by Android Git Automerger
Browse files

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

* commit 'e3a396b2':
  [MIPS] Add MIPS architecture support to libagl
parents ea116f1a e3a396b2
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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 −0
Original line number Diff line number Diff line
/* 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
+1 −1
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@

// ----------------------------------------------------------------------------

#if !defined(__arm__)
#if !defined(__arm__) && !defined(__mips__)
GGLfixed gglFloatToFixed(float v) {   
    return GGLfixed(floorf(v * 65536.0f + 0.5f));
}
+44 −0
Original line number Diff line number Diff line
@@ -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 +