summaryrefslogtreecommitdiffstats
path: root/opengl/libagl/arch-mips/fixed_asm.S
diff options
context:
space:
mode:
Diffstat (limited to 'opengl/libagl/arch-mips/fixed_asm.S')
-rw-r--r--opengl/libagl/arch-mips/fixed_asm.S61
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