19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* libs/opengles/iterators.S
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Copyright 2006, The Android Open Source Project
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the "License");
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** you may not use this file except in compliance with the License.
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** You may obtain a copy of the License at
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**     http://www.apache.org/licenses/LICENSE-2.0
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project**
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** Unless required by applicable law or agreed to in writing, software
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** distributed under the License is distributed on an "AS IS" BASIS,
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** See the License for the specific language governing permissions and
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project** limitations under the License.
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project*/
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    .text
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    .align
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    .arm
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    .global iterators0032
2489fe245e0402db9b0101ad969af5698e1d6fe311Doug Kwan    .type iterators0032, %function
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * iterators0032
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * MUST BE CALLED FROM ARM CODE
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * r0: const compute_iterators_t* (this)
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 + 0: m_dx01
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 + 4: m_dy10
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 + 8: m_dx20
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 +12: m_dy02
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 +16: m_x0
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 +20: m_y0
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r0 +24: m_area
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *		r0 +28: m_scale
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *		r0 +29: m_area_scale;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * r1: int32_t* (out)
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r1 + 0: c
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r1 + 4: dcdx
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      r1 + 8: dcdy
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   r2: c0
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *   r3: c1
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * [sp]: c2
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectiterators0032:
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        stmfd	sp!, {r4, r5, r6, r7, r8, lr}
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r4, [sp, #4*6]
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldrb    r12, [r0, #29]
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sub     r3, r3, r2
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sub     r4, r4, r2
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        sub     r12, r12, #16
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mov     r3, r3, asr r12
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mov     r4, r4, asr r12
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r5, [r0, #0]
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r12, [r0, #4]
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        smull   r8, lr, r4, r5
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r5, [r0, #8]
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        smull   r6, r7, r4, r12
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r12, [r0, #12]
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        smlal   r8, lr, r3, r5
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        smlal   r6, r7, r3, r12
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r3, [r0, #16]        // m_x0
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldr     r4, [r0, #20]        // m_x1
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str     r6, [r1, #4]
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str     r8, [r1, #8]
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        umull   r6, r5, r3, r6
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        umull   r8, r0, r4, r8
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mla     r7, r3, r7, r5
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mla     lr, r4, lr, r0
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        adds    r6, r6, r8
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        adc     r7, r7, lr
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        movs    r6, r6, lsr #4
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        adc     r6, r6, r7, lsl #28
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        rsb     r6, r6, r2, lsl #16
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        str     r6, [r1, #0]
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ldmfd	sp!, {r4, r5, r6, r7, r8, pc}
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
90