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