Initial version of libomxil-vc4 for RPI3
[platform/adaptation/broadcom/libomxil-vc4.git] / host_applications / linux / apps / hello_pi / hello_fft / qasm / gpu_fft_128k.qasm
1 # BCM2835 "GPU_FFT" release 3.0
2 #
3 # Copyright (c) 2015, Andrew Holme.
4 # All rights reserved.
5 #
6 # Redistribution and use in source and binary forms, with or without
7 # modification, are permitted provided that the following conditions are met:
8 #     * Redistributions of source code must retain the above copyright
9 #       notice, this list of conditions and the following disclaimer.
10 #     * 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 #     * Neither the name of the copyright holder nor the
14 #       names of its contributors may be used to endorse or promote products
15 #       derived from this software without specific prior written permission.
16 #
17 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
18 # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY
21 # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
26 # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28 .set STAGES, 17
29
30 .include "gpu_fft_ex.qinc"
31
32 ##############################################################################
33 # Twiddles: src
34
35 .set TW32_BASE,     0   # rx_tw_shared
36 .set TW16_BASE,     1
37 .set TW16_P2_STEP,  2
38 .set TW16_P3_STEP,  3
39 .set TW16_P4_STEP,  4
40
41 .set TW16_P4_BASE,  0   # rx_tw_unique
42
43 ##############################################################################
44 # Twiddles: dst
45
46 .set TW16_STEP, 0  # 1
47 .set TW32_STEP, 1  # 1
48 .set TW16,      2  # 5
49 .set TW32,      7  # 2
50
51 ##############################################################################
52 # Registers
53
54 .set ra_link_0,         ra0
55 .set rb_vdw_16,         rb0
56 .set ra_save_ptr,       ra1
57 .set rb_vdw_32,         rb1
58 .set ra_temp,           ra2
59 .set rb_vpm_lo,         rb2
60 .set ra_addr_x,         ra3
61 .set rb_addr_y,         rb3
62 .set ra_save_16,        ra4
63 .set rx_save_slave_16,  rb4
64 .set ra_load_idx,       ra5
65 .set rb_inst,           rb5
66 .set ra_sync,           ra6
67 .set rx_sync_slave,     rb6
68 .set ra_points,         ra7
69 .set rb_vpm_hi,         rb7
70 .set ra_link_1,         ra8
71 .set rb_STAGES,         rb8
72 .set ra_32_re,          ra9
73 .set rb_32_im,          rb9
74 .set ra_save_32,        ra10
75 .set rx_save_slave_32,  rb10
76
77 .set rx_tw_shared,      ra11
78 .set rx_tw_unique,      rb11
79
80 .set ra_tw_re,          ra12 # 9
81 .set rb_tw_im,          rb12 # 9
82
83 .set ra_vpm_lo,         ra25
84 .set ra_vpm_hi,         ra26
85 .set ra_vdw_16,         ra27
86 .set ra_vdw_32,         ra28
87
88 .set rx_0x55555555,     ra29
89 .set rx_0x33333333,     ra30
90 .set rx_0x0F0F0F0F,     ra31
91 .set rx_0x00FF00FF,     rb24
92 .set rx_0x0000FFFF,     rb25
93
94 .set rb_0x10,           rb26
95 .set rb_0x40,           rb27
96 .set rb_0x80,           rb28
97 .set rb_0xF0,           rb29
98 .set rb_0x100,          rb30
99 .set rb_0xFFF,          rb31
100
101 ##############################################################################
102 # Constants
103
104 mov rb_STAGES,  STAGES
105
106 mov rb_0x10,    0x10
107 mov rb_0x40,    0x40
108 mov rb_0x80,    0x80
109 mov rb_0xF0,    0xF0
110 mov rb_0x100,   0x100
111 mov rb_0xFFF,   0xFFF
112
113 mov rx_0x55555555, 0x55555555
114 mov rx_0x33333333, 0x33333333
115 mov rx_0x0F0F0F0F, 0x0F0F0F0F
116 mov rx_0x00FF00FF, 0x00FF00FF
117 mov rx_0x0000FFFF, 0x0000FFFF
118
119 mov ra_vdw_16, vdw_setup_0(16, 16, dma_h32( 0,0))
120 mov rb_vdw_16, vdw_setup_0(16, 16, dma_h32(32,0))
121 mov ra_vdw_32, vdw_setup_0(32, 16, dma_h32( 0,0))
122 mov rb_vdw_32, vdw_setup_0(32, 16, dma_h32(32,0))
123
124 ##############################################################################
125 # Twiddles: ptr
126
127 mov rx_tw_shared, unif
128 mov rx_tw_unique, unif
129
130 ##############################################################################
131 # Instance
132
133 mov rb_inst, unif
134 inst_vpm rb_inst, ra_vpm_lo, ra_vpm_hi, rb_vpm_lo, rb_vpm_hi
135
136 ##############################################################################
137 # Master/slave procedures
138
139 proc ra_save_16, r:1f
140 body_ra_save_16 ra_vpm_lo, ra_vdw_16
141 :1
142
143 proc rx_save_slave_16, r:1f
144 body_rx_save_slave_16 ra_vpm_lo
145 :1
146
147 proc ra_save_32, r:1f
148 body_ra_save_32
149 :1
150
151 proc rx_save_slave_32, r:1f
152 body_rx_save_slave_32
153 :1
154
155 proc ra_sync, r:1f
156 body_ra_sync
157 :1
158
159 proc rx_sync_slave, r:main
160 body_rx_sync_slave
161
162 ##############################################################################
163 # Subroutines
164
165 :fft_16
166     body_fft_16
167
168 :pass_1
169     body_pass_32 LOAD_REVERSED
170
171 :pass_2
172 :pass_3
173 :pass_4
174     body_pass_16 LOAD_STRAIGHT
175
176 ##############################################################################
177 # Top level
178
179 :main
180     mov.setf r0, rb_inst
181     sub r0, r0, 1
182     shl r0, r0, 5
183     add.ifnz ra_sync, rx_sync_slave, r0
184     mov.ifnz ra_save_16, rx_save_slave_16
185     mov.ifnz ra_save_32, rx_save_slave_32
186
187 :loop
188     mov.setf ra_addr_x, unif # Ping buffer or null
189     mov      rb_addr_y, unif # Pong buffer or IRQ enable
190
191     brr.allz -, r:end
192
193 ##############################################################################
194 # Pass 1
195
196     load_tw rx_tw_shared, TW16+3, TW16_BASE
197     load_tw rx_tw_shared, TW32+0, TW32_BASE
198     init_stage 5
199     read_rev rb_0x10
200
201         brr ra_link_1, r:pass_1
202         nop
203         nop
204         add ra_points, ra_points, rb_0x100
205
206         shr.setf -, ra_points, rb_STAGES
207
208         brr.allz -, r:pass_1
209         nop
210         nop
211         add ra_points, ra_points, rb_0x100
212
213     bra ra_link_1, ra_sync
214     nop
215     ldtmu0
216     ldtmu0
217
218 ##############################################################################
219 # Pass 2
220
221     swap_buffers
222     load_tw rx_tw_shared, TW16+3, TW16_BASE
223     load_tw rx_tw_shared, TW16_STEP, TW16_P2_STEP
224     init_stage 4
225     read_lin rb_0x80
226
227         brr ra_link_1, r:pass_2
228         nop
229         nop
230         add ra_points, ra_points, rb_0x80
231
232         and.setf -, ra_points, rb_0xFFF
233
234         brr.allnz -, r:pass_2
235         nop
236         nop
237         add.ifnz ra_points, ra_points, rb_0x80
238
239         next_twiddles_16
240
241         shr.setf -, ra_points, rb_STAGES
242
243         brr.allz -, r:pass_2
244         nop
245         nop
246         add ra_points, ra_points, rb_0x80
247
248     bra ra_link_1, ra_sync
249     nop
250     ldtmu0
251     ldtmu0
252
253 ##############################################################################
254 # Pass 3
255
256     swap_buffers
257     load_tw rx_tw_shared, TW16+3, TW16_BASE
258     load_tw rx_tw_shared, TW16_STEP, TW16_P3_STEP
259     init_stage 4
260     read_lin rb_0x80
261
262     .rep i, 2
263         brr ra_link_1, r:pass_3
264         nop
265         nop
266         add ra_points, ra_points, rb_0x80
267     .endr
268
269         next_twiddles_16
270
271         shr.setf -, ra_points, rb_STAGES
272
273         brr.allz -, r:pass_3
274         mov r0, 4*8
275         sub ra_link_1, ra_link_1, r0
276         add ra_points, ra_points, rb_0x80
277
278     bra ra_link_1, ra_sync
279     nop
280     ldtmu0
281     ldtmu0
282
283 ##############################################################################
284 # Pass 4
285
286     swap_buffers
287     load_tw rx_tw_unique, TW16+3, TW16_P4_BASE
288     load_tw rx_tw_shared, TW16_STEP, TW16_P4_STEP
289     init_stage 4
290     read_lin rb_0x80
291
292         brr ra_link_1, r:pass_4
293         nop
294         nop
295         add ra_points, ra_points, rb_0x80
296
297         next_twiddles_16
298
299         shr.setf -, ra_points, rb_STAGES
300
301         brr.allz -, r:pass_4
302         nop
303         nop
304         add ra_points, ra_points, rb_0x80
305
306     bra ra_link_1, ra_sync
307     nop
308     ldtmu0
309     ldtmu0
310
311 ##############################################################################
312
313     brr -, r:loop
314     nop
315     nop
316     nop
317
318 :end
319     exit rb_addr_y