62 lines
1.7 KiB
ArmAsm
62 lines
1.7 KiB
ArmAsm
|
/* 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
|