rotate90CW_4x4_16v6.S revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1/*
2**
3** Copyright 2006, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18
19    .text
20    .align
21
22    .global rotate90CW_4x4_16v6
23
24// Rotates 90deg CW a 4x4 block of 16bpp pixels using ARMv6
25// src and dst must be 4 pixels-aligned (2-pixels aligned might
26// actually work)
27//
28// The code below is complicated by ARM's little endianness.
29
30rotate90CW_4x4_16v6:
31    // r0 = dst
32    // r1 = src
33    // r2 = dst stride in pixels
34    // r3 = src stride in pixels
35
36    stmfd   sp!, {r4,r5, r6,r7, r8,r9, r10,r11, lr}
37    add     r14, r3, r3
38    add     r12, r2, r2
39
40    ldrd    r2, r3, [r1], r14
41    ldrd    r4, r5, [r1], r14
42    ldrd    r6, r7, [r1], r14
43    ldrd    r8, r9, [r1]
44
45    pkhbt   r10, r8, r6, lsl #16
46    pkhbt   r11, r4, r2, lsl #16
47    strd    r10, r11, [r0], r12
48
49    pkhtb   r10, r6, r8, asr #16
50    pkhtb   r11, r2, r4, asr #16
51
52    strd    r10, r11, [r0], r12
53    pkhbt   r10, r9, r7, lsl #16
54    pkhbt   r11, r5, r3, lsl #16
55
56    strd    r10, r11, [r0], r12
57
58    pkhtb   r10, r7, r9, asr #16
59    pkhtb   r11, r3, r5, asr #16
60    strd    r10, r11, [r0]
61
62    ldmfd   sp!, {r4,r5, r6,r7, r8,r9, r10,r11, pc}
63