/* libs/opengles/iterators.S | |
** | |
** Copyright 2006, The Android Open Source Project | |
** | |
** Licensed under the Apache License, Version 2.0 (the "License"); | |
** you may not use this file except in compliance with the License. | |
** You may obtain a copy of the License at | |
** | |
** http://www.apache.org/licenses/LICENSE-2.0 | |
** | |
** Unless required by applicable law or agreed to in writing, software | |
** distributed under the License is distributed on an "AS IS" BASIS, | |
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
** See the License for the specific language governing permissions and | |
** limitations under the License. | |
*/ | |
.text | |
.align | |
.arm | |
.global iterators0032 | |
.type iterators0032, %function | |
/* | |
* iterators0032 | |
* | |
* MUST BE CALLED FROM ARM CODE | |
* | |
* r0: const compute_iterators_t* (this) | |
* r0 + 0: m_dx01 | |
* r0 + 4: m_dy10 | |
* r0 + 8: m_dx20 | |
* r0 +12: m_dy02 | |
* r0 +16: m_x0 | |
* r0 +20: m_y0 | |
* r0 +24: m_area | |
* r0 +28: m_scale | |
* r0 +29: m_area_scale; | |
* r1: int32_t* (out) | |
* r1 + 0: c | |
* r1 + 4: dcdx | |
* r1 + 8: dcdy | |
* r2: c0 | |
* r3: c1 | |
* [sp]: c2 | |
*/ | |
iterators0032: | |
stmfd sp!, {r4, r5, r6, r7, r8, lr} | |
ldr r4, [sp, #4*6] | |
ldrb r12, [r0, #29] | |
sub r3, r3, r2 | |
sub r4, r4, r2 | |
sub r12, r12, #16 | |
mov r3, r3, asr r12 | |
mov r4, r4, asr r12 | |
ldr r5, [r0, #0] | |
ldr r12, [r0, #4] | |
smull r8, lr, r4, r5 | |
ldr r5, [r0, #8] | |
smull r6, r7, r4, r12 | |
ldr r12, [r0, #12] | |
smlal r8, lr, r3, r5 | |
smlal r6, r7, r3, r12 | |
ldr r3, [r0, #16] // m_x0 | |
ldr r4, [r0, #20] // m_x1 | |
str r6, [r1, #4] | |
str r8, [r1, #8] | |
umull r6, r5, r3, r6 | |
umull r8, r0, r4, r8 | |
mla r7, r3, r7, r5 | |
mla lr, r4, lr, r0 | |
adds r6, r6, r8 | |
adc r7, r7, lr | |
movs r6, r6, lsr #4 | |
adc r6, r6, r7, lsl #28 | |
rsb r6, r6, r2, lsl #16 | |
str r6, [r1, #0] | |
ldmfd sp!, {r4, r5, r6, r7, r8, pc} | |