1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* libs/opengles/fixed_asm.S
2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Copyright 2006, The Android Open Source Project
4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** you may not use this file except in compliance with the License.
7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** You may obtain a copy of the License at
8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project**
11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** See the License for the specific language governing permissions and
15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project** limitations under the License.
16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project*/
17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    .text
20dd46c864c12f592896e4da14758accbcd54afd10synergy dev    .align 2
21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    .global gglFloatToFixed
239054ddfcd7a159ec6720a8592e9a35205e0a9865Doug Kwan    .type gglFloatToFixed, %function
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    .global gglFloatToFixedFast
259054ddfcd7a159ec6720a8592e9a35205e0a9865Doug Kwan    .type gglFloatToFixedFast, %function
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Converts a float to a s15.16 fixed-point number.
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * this doesn't handle floats out of the [-32768, +32768[ range
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * and doesn't performs round-to-nearest.
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * however, it's very fast :-)
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectgglFloatToFixedFast:
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        movs    r1, r0, lsl #1          /* remove bit sign */
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r2, #0x8E               /* 127 + 15 */
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        sub     r1, r2, r1, lsr #24     /* compute shift */
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r2, r0, lsl #8          /* mantissa<<8 */
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        orr     r2, r2, #0x80000000     /* add the missing 1 */
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r0, r2, lsr r1          /* scale to 16.16 */
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsbcs   r0, r0, #0              /* negate if needed */
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bx      lr
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/*
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * this version rounds-to-nearest and saturates numbers
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * outside the range (but not NaNs).
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectgglFloatToFixed:
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r1, r0, lsl #1          /* remove bit sign */
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r2, #0x8E               /* 127 + 15 */
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        subs    r1, r2, r1, lsr #24     /* compute shift */
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bls     0f                      /* too big */
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r2, r0, lsl #8          /* mantissa<<8 */
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        orr     r2, r2, #0x80000000     /* add the missing 1 */
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mov     r3, r0
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        movs    r0, r2, lsr r1          /* scale to 16.16 */
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        addcs   r0, r0, #1              /* round-to-nearest */
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        tst     r3, #0x80000000         /* negative? */
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        rsbne   r0, r0, #0              /* negate if needed */
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bx      lr
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project0:      ands    r0, r0, #0x80000000     /* keep only the sign bit */
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        moveq   r0, #0x7fffffff         /* positive, maximum value */
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        bx      lr
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
68