summaryrefslogtreecommitdiffstats
path: root/libpixelflinger/rotate90CW_4x4_16v6.S
blob: 8e3e142c07fee4488493e5b4243c4ed921ef28bd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/*
**
** 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
    
    .global rotate90CW_4x4_16v6

// Rotates 90deg CW a 4x4 block of 16bpp pixels using ARMv6
// src and dst must be 4 pixels-aligned (2-pixels aligned might
// actually work)
//
// The code below is complicated by ARM's little endianness. 

rotate90CW_4x4_16v6:
    // r0 = dst
    // r1 = src
    // r2 = dst stride in pixels
    // r3 = src stride in pixels

    stmfd   sp!, {r4,r5, r6,r7, r8,r9, r10,r11, lr}
    add     r14, r3, r3
    add     r12, r2, r2

    ldrd    r2, r3, [r1], r14
    ldrd    r4, r5, [r1], r14
    ldrd    r6, r7, [r1], r14
    ldrd    r8, r9, [r1]

    pkhbt   r10, r8, r6, lsl #16
    pkhbt   r11, r4, r2, lsl #16
    strd    r10, r11, [r0], r12  

    pkhtb   r10, r6, r8, asr #16
    pkhtb   r11, r2, r4, asr #16

    strd    r10, r11, [r0], r12  
    pkhbt   r10, r9, r7, lsl #16
    pkhbt   r11, r5, r3, lsl #16

    strd    r10, r11, [r0], r12  

    pkhtb   r10, r7, r9, asr #16
    pkhtb   r11, r3, r5, asr #16
    strd    r10, r11, [r0]

    ldmfd   sp!, {r4,r5, r6,r7, r8,r9, r10,r11, pc}