diff options
Diffstat (limited to 'opengl/libagl/arch-mips/fixed_asm.S')
-rw-r--r-- | opengl/libagl/arch-mips/fixed_asm.S | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/opengl/libagl/arch-mips/fixed_asm.S b/opengl/libagl/arch-mips/fixed_asm.S new file mode 100644 index 0000000..e1a53bc --- /dev/null +++ b/opengl/libagl/arch-mips/fixed_asm.S @@ -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 |