fixed_asm.S revision edbf3b6af777b721cd2a1ef461947e51e88241e1
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 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project .global gglFloatToFixedFast 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Converts a float to a s15.16 fixed-point number. 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * this doesn't handle floats out of the [-32768, +32768[ range 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * and doesn't performs round-to-nearest. 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * however, it's very fast :-) 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectgglFloatToFixedFast: 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project movs r1, r0, lsl #1 /* remove bit sign */ 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r2, #0x8E /* 127 + 15 */ 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sub r1, r2, r1, lsr #24 /* compute shift */ 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r2, r0, lsl #8 /* mantissa<<8 */ 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project orr r2, r2, #0x80000000 /* add the missing 1 */ 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r0, r2, lsr r1 /* scale to 16.16 */ 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsbcs r0, r0, #0 /* negate if needed */ 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bx lr 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * this version rounds-to-nearest and saturates numbers 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * outside the range (but not NaNs). 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectgglFloatToFixed: 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r1, r0, lsl #1 /* remove bit sign */ 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r2, #0x8E /* 127 + 15 */ 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project subs r1, r2, r1, lsr #24 /* compute shift */ 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bls 0f /* too big */ 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r2, r0, lsl #8 /* mantissa<<8 */ 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project orr r2, r2, #0x80000000 /* add the missing 1 */ 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mov r3, r0 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project movs r0, r2, lsr r1 /* scale to 16.16 */ 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project addcs r0, r0, #1 /* round-to-nearest */ 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project tst r3, #0x80000000 /* negative? */ 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project rsbne r0, r0, #0 /* negate if needed */ 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bx lr 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project0: ands r0, r0, #0x80000000 /* keep only the sign bit */ 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project moveq r0, #0x7fffffff /* positive, maximum value */ 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project bx lr 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 66