summaryrefslogtreecommitdiff
path: root/opengl/libagl/arch-mips/fixed_asm.S
blob: e1a53bc74544df0c6cbf22b31652ccc337b56696 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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