Home | History | Annotate | Download | only in arch-mips
      1 /* libs/opengles/arch-mips/fixed_asm.S
      2 **
      3 ** Copyright 2012, The Android Open Source Project
      4 **
      5 ** Licensed under the Apache License, Version 2.0 (the "License");
      6 ** you may not use this file except in compliance with the License.
      7 ** You may obtain a copy of the License at
      8 **
      9 **     http://www.apache.org/licenses/LICENSE-2.0
     10 **
     11 ** Unless required by applicable law or agreed to in writing, software
     12 ** distributed under the License is distributed on an "AS IS" BASIS,
     13 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     14 ** See the License for the specific language governing permissions and
     15 ** limitations under the License.
     16 */
     17 
     18 
     19     .text
     20     .align
     21 
     22 /*
     23  * this version rounds-to-nearest and saturates numbers
     24  * outside the range (but not NaNs).
     25  */
     26 
     27 	.global	gglFloatToFixed
     28 	.ent	gglFloatToFixed
     29 	.type	gglFloatToFixed, @function
     30 gglFloatToFixed:
     31 #if !defined(__mips_soft_float)
     32 	mfc1	$a0,$f12
     33 #endif
     34 	srl	$t0,$a0,31		/* t0 <- sign bit */
     35 	srl	$t1,$a0,23
     36 	andi	$t1,$t1,0xff		/* get the e */
     37 	li	$t2,0x8e
     38 	subu	$t1,$t2,$t1		/* t1=127+15-e */
     39 	blez	$t1,0f			/* t1<=0? */
     40 	sll	$t2,$a0,8		/* mantissa<<8 */
     41 	lui	$t3,0x8000
     42 	or	$t2,$t2,$t3		/* add the missing 1 */
     43 	subu	$t1,$t1,1
     44 	srl	$v0,$t2,$t1
     45 	sltiu	$t3,$t1,32		/* t3=1 if t1<32, else t3=0. t1>=32 means the float value is too small. */
     46 	andi	$t4,$v0,0x1
     47 	srl	$v0,$v0,1		/* scale to 16.16 */
     48 	addu	$v0,$v0,$t4		/* round-to-nearest */
     49 	subu	$t2,$zero,$v0
     50 	movn	$v0,$t2,$t0		/* if negative? */
     51 	or	$t1,$a0,$zero		/* a0=0? */
     52 	movz	$v0,$zero,$t1
     53 	movz	$v0,$zero,$t3		/* t3=0 then res=0 */
     54 	jr	$ra
     55 0:
     56 	lui	$t1,0x8000
     57 	and	$v0,$a0,$t1		/* keep only the sign bit */
     58 	li	$t1,0x7fffffff
     59 	movz	$v0,$t1,$t0		/* positive, maximum value */
     60 	jr	$ra
     61 	.end	gglFloatToFixed
     62