|  | /* 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 4 | 
|  |  | 
|  | /* | 
|  | * 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 |