| /* s32a_d565_opaque.S |
| ** |
| ** Copyright 2009, 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 |
| |
| .global s32a_d565_opaque_arm |
| |
| // void s32a_d565_opaque_arm(uint16_t*, uint32_t*, size_t) |
| // r0: dst ptr |
| // r1: src prt |
| // r2: count |
| |
| s32a_d565_opaque_arm: |
| stmdb sp!, {r4, r5, r6, r7, lr} |
| subs r4, r2, #0 |
| mov r7, r1 |
| ble 1f |
| 4: ldr r1, [r7], #4 // r1=*src; src++ |
| cmp r1, #0 |
| mov lr, r1, lsr #24 |
| beq 2f // get next src |
| |
| cmp lr, #255 // 0xff |
| mov r2, r1, lsl #8 |
| mov r6, r2 |
| moveq r2, r1, lsr #5 |
| andeq r3, r6, #63488 // 0xf800 |
| andeq r2, r2, #2016 // 0x7e0 |
| orreq r3, r3, r2 |
| orreq r3, r3, r6, lsr #27 |
| streqh r3, [r0], #2 // *dst = r3; dst++ |
| beq 3f // go to count-- |
| |
| mov r3, r1, lsl #16 |
| rsb ip, lr, #255 // 0xff |
| mov r5, r3, lsr #24 |
| ldrh r3, [r0] // r3 = *dst |
| mov lr, r6, lsr #24 |
| and r6, r1, #255 // 0xff |
| |
| mov r1, r3, lsr #5 |
| and r2, r1, #63 |
| smulbb r1, r2, ip |
| add r2, r1, #32 |
| mov r1, r3, lsr #11 |
| add r2, r2, r2, lsr #6 |
| |
| smulbb r1, r1, ip |
| add r2, r5, r2, lsr #6 |
| add r1, r1, #16 |
| and r3, r3, #31 // 0x1f |
| add r1, r1, r1, lsr #5 |
| |
| smulbb r3, r3, ip |
| add r1, r6, r1, lsr #5 |
| mov ip, r2, lsr #2 |
| add r3, r3, #16 // 0x10 |
| mov r1, r1, lsr #3 |
| |
| add r3, r3, r3, lsr #5 |
| mov r2, ip, lsl #5 |
| add r3, lr, r3, lsr #5 |
| orr ip, r2, r1, lsl #11 |
| orr r1, ip, r3, lsr #3 |
| strh r1, [r0] |
| |
| 2: add r0, r0, #2 // dst++ |
| 3: subs r4, r4, #1 // r4 = --count |
| bne 4b |
| |
| 1: ldmia sp!, {r4, r5, r6, r7, pc} |
| |