The ARM NEON optimized filters does not compile on THUMB2
[WebKit-https.git] / Source / WebCore / platform / graphics / filters / arm / FECompositeArithmeticNEON.cpp
1 /*
2  * Copyright (C) 2011 University of Szeged
3  * Copyright (C) 2011 Felician Marton
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY UNIVERSITY OF SZEGED ``AS IS'' AND ANY
15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL UNIVERSITY OF SZEGED OR
18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28
29 #if ENABLE(FILTERS)
30 #include "FECompositeArithmeticNEON.h"
31
32 #if CPU(ARM_NEON) && CPU(ARM_TRADITIONAL) && COMPILER(GCC)
33
34 namespace WebCore {
35
36 #define ASSTRING(str) #str
37 #define TOSTRING(value) ASSTRING(value)
38
39 #define NL "\n"
40
41 #define SOURCE_R     "r0"
42 #define DEST_R       "r1"
43 #define END_R        "r2"
44 #define K_R          "r3"
45 #define NEXTPIXEL_R  "r12"
46
47 #define TEMP_Q       "q0"
48 #define TEMP_D0      "d0"
49 #define TEMP_D00     "d0[0]"
50 #define TEMP_D01     "d0[1]"
51 #define TEMP_D10     "d1[0]"
52 #define TEMP_D11     "d1[1]"
53 #define PIXEL1_Q     "q1"
54 #define PIXEL1_D0    "d2"
55 #define PIXEL1_D00   "d2[0]"
56 #define PIXEL2_Q     "q2"
57 #define PIXEL2_D0    "d4"
58 #define PIXEL2_D00   "d4[0]"
59 #define BYTEMAX_Q    "q3"
60 #define K1_Q         "q8"
61 #define K2_Q         "q9"
62 #define K3_Q         "q10"
63 #define K4_Q         "q11"
64
65 asm ( // NOLINT
66 ".globl " TOSTRING(neonDrawCompositeArithmetic) NL
67 TOSTRING(neonDrawCompositeArithmetic) ":" NL
68     "cmp " END_R ", #0" NL
69     "bxeq lr"  NL
70     // Set the end of the source register.
71     "add " END_R ", " SOURCE_R ", " END_R NL
72
73     "vld1.f32 {" TEMP_Q "}, [" K_R "]" NL
74     "ldr " K_R ", [" K_R "]" NL
75     "vdup.f32 " K1_Q ", " TEMP_D00 NL
76     "vdup.f32 " K2_Q ", " TEMP_D01 NL
77     "vdup.f32 " K3_Q ", " TEMP_D10 NL
78     "vdup.f32 " K4_Q ", " TEMP_D11 NL
79
80     "vmov.i32 " BYTEMAX_Q ", #0xFF" NL
81     "vcvt.f32.u32 " TEMP_Q ", " BYTEMAX_Q NL
82     "vmul.f32 " K4_Q ", " K4_Q ", " TEMP_Q NL
83
84     "mov " NEXTPIXEL_R ", #4" NL
85     "cmp " K_R ", #0" NL
86     "beq .arithmeticK1IsZero" NL
87
88     "vrecpe.f32 " TEMP_Q ", " TEMP_Q NL
89     "vmul.f32 " K1_Q ", " K1_Q ", " TEMP_Q NL
90
91 ".arithmeticK1IsNonZero:" NL
92
93     "vld1.u32 " PIXEL1_D00 ", [ " SOURCE_R "], " NEXTPIXEL_R NL
94     "vld1.u32 " PIXEL2_D00 ", [" DEST_R "]" NL
95
96     "vmovl.u8 " PIXEL1_Q ", " PIXEL1_D0 NL
97     "vmovl.u16 " PIXEL1_Q ", " PIXEL1_D0 NL
98     "vcvt.f32.u32 " PIXEL1_Q ", " PIXEL1_Q NL
99     "vmovl.u8 " PIXEL2_Q ", " PIXEL2_D0 NL
100     "vmovl.u16 " PIXEL2_Q ", " PIXEL2_D0 NL
101     "vcvt.f32.u32 " PIXEL2_Q ", " PIXEL2_Q NL
102
103     "vmul.f32 " TEMP_Q ", " PIXEL1_Q ", " PIXEL2_Q NL
104     "vmul.f32 " TEMP_Q ", " TEMP_Q ", " K1_Q NL
105     "vmla.f32 " TEMP_Q ", " PIXEL1_Q ", " K2_Q NL
106     "vmla.f32 " TEMP_Q ", " PIXEL2_Q ", " K3_Q NL
107     "vadd.f32 " TEMP_Q ", " K4_Q NL
108
109     // Convert result to uint so negative values are converted to zero.
110     "vcvt.u32.f32 " TEMP_Q ", " TEMP_Q NL
111     "vmin.u32 " TEMP_Q ", " TEMP_Q ", " BYTEMAX_Q NL
112     "vmovn.u32 " TEMP_D0 ", " TEMP_Q NL
113     "vmovn.u16 " TEMP_D0 ", " TEMP_Q NL
114
115     "vst1.u32 " TEMP_D00 ", [" DEST_R "], " NEXTPIXEL_R NL
116
117     "cmp " SOURCE_R ", " END_R NL
118     "bcc .arithmeticK1IsNonZero" NL
119     "bx lr" NL
120
121 ".arithmeticK1IsZero:" NL
122
123     "vld1.u32 " PIXEL1_D00 ", [ " SOURCE_R "], " NEXTPIXEL_R NL
124     "vld1.u32 " PIXEL2_D00 ", [" DEST_R "]" NL
125
126     "vmovl.u8 " PIXEL1_Q ", " PIXEL1_D0 NL
127     "vmovl.u16 " PIXEL1_Q ", " PIXEL1_D0 NL
128     "vcvt.f32.u32 " PIXEL1_Q ", " PIXEL1_Q NL
129     "vmovl.u8 " PIXEL2_Q ", " PIXEL2_D0 NL
130     "vmovl.u16 " PIXEL2_Q ", " PIXEL2_D0 NL
131     "vcvt.f32.u32 " PIXEL2_Q ", " PIXEL2_Q NL
132
133     "vmul.f32 " TEMP_Q ", " PIXEL1_Q ", " K2_Q NL
134     "vmla.f32 " TEMP_Q ", " PIXEL2_Q ", " K3_Q NL
135     "vadd.f32 " TEMP_Q ", " K4_Q NL
136
137     // Convert result to uint so negative values are converted to zero.
138     "vcvt.u32.f32 " TEMP_Q ", " TEMP_Q NL
139     "vmin.u32 " TEMP_Q ", " TEMP_Q ", " BYTEMAX_Q NL
140     "vmovn.u32 " TEMP_D0 ", " TEMP_Q NL
141     "vmovn.u16 " TEMP_D0 ", " TEMP_Q NL
142
143     "vst1.u32 " TEMP_D00 ", [" DEST_R "], " NEXTPIXEL_R NL
144
145     "cmp " SOURCE_R ", " END_R NL
146     "bcc .arithmeticK1IsZero" NL
147     "bx lr" NL
148 ); // NOLINT
149
150 } // namespace WebCore
151
152 #endif // CPU(ARM_NEON) && COMPILER(GCC)
153
154 #endif // ENABLE(FILTERS)
155