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
20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    .align
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