1/*
2 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7// Canned instruction sequences for use with the DCP
8
9.macro dcp_fadd_m rz,rx,ry
10  WXYU \rx,\ry
11  ADD0
12  ADD1
13  NRDF
14  RDFA \rz
15.endm
16
17.macro dcp_fsub_m rz,rx,ry
18  WXYU \rx,\ry
19  ADD0
20  SUB1
21  NRDF
22  RDFS \rz
23.endm
24
25.macro dcp_fmul_m rz,rx,ry,ra,rb
26  WXYU \rx,\ry
27  RXYH \ra,\rb
28  umull \ra,\rb,\ra,\rb
29  WXFM \ra,\rb
30  NRDF
31  RDFM \rz
32.endm
33
34.macro dcp_fxprod_m rzl,rzh,rx,ry,ra,rb
35  WXYU \rx,\ry
36  RXYH \ra,\rb
37  umull \ra,\rb,\ra,\rb
38  WXMO \ra,\rb
39  NRDD
40  RDDM \rzl,\rzh
41.endm
42
43.macro dcp_fdiv_fast_m rz,rx,ry,ra,rb,rc
44  WXYU \rx,\ry
45  RYMR \ra,\rb
46  umull \rb,\rc,\ra,\rb
47  mvn \rc,\rc,lsl #2
48  smmlar \ra,\rc,\ra,\ra
49  smmulr \rc,\rc,\rc
50  smmlar \ra,\rc,\ra,\ra
51  RXYH \rb,\rc
52  umull \ra,\rb,\ra,\rb
53  WXFD \rb,\rb
54  NRDF
55  RDFD \rz
56.endm
57
58.macro dcp_fdiv_m rz,rx,ry,ra,rb,rc,rd
59  WXYU \rx,\ry
60  RYMR \ra,\rb
61  umull \rb,\rc,\ra,\rb
62  mvn \rc,\rc,lsl #2
63  smmlar \ra,\rc,\ra,\ra
64  smmulr \rc,\rc,\rc
65  smmlar \ra,\rc,\ra,\ra
66  RXYH \rb,\rc
67  umull \rd,\ra,\ra,\rb
68  orr \ra,\ra,\ra,lsr #24
69  bic \ra,\ra,\ra,lsr #25
70  bic \ra,\ra,#15
71  mov \rc,\rc,lsr #7
72  mul \rd,\ra,\rc
73  rsb \rd,\rd,\rb,lsl #22
74  sub \ra,\ra,\rd,lsr #31
75  WXFD \ra,\ra
76  NRDF
77  RDFD \rz
78.endm
79
80.macro dcp_fsqrt_fast_m rz,rx,ra,rb,rc,rd
81  WXYU \rx,\rx
82  SQR0
83  RXMQ \rc,\rd
84  umull \ra,\rb,\rc,\rc
85  umull \ra,\rb,\rb,\rd
86  mov \rb,\rb,lsl #3
87  sub \rb,\rb,#2147483648
88  smmlsr \rc,\rc,\rb,\rc
89  umull \ra,\rb,\rc,\rc
90  umull \ra,\rb,\rb,\rd
91  movs \ra,\ra,lsr #28
92  adc \rb,\ra,\rb,lsl #4
93  smmulr \ra,\rb,\rc
94  sub \rc,\rc,\ra,asr #1
95  umull \ra,\rb,\rc,\rd
96  WXFQ \ra,\rb
97  NRDF
98  RDFQ \rz
99.endm
100
101.macro dcp_fsqrt_m rz,rx,ra,rb,rc,rd
102  WXYU \rx,\rx
103  SQR0
104  RXMQ \rc,\rd
105  umull \ra,\rb,\rc,\rc
106  umull \ra,\rb,\rb,\rd
107  mov \rb,\rb,lsl #3
108  sub \rb,\rb,#2147483648
109  smmlsr \rc,\rc,\rb,\rc
110  umull \ra,\rb,\rc,\rc
111  umull \ra,\rb,\rb,\rd
112  movs \ra,\ra,lsr #28
113  adc \rb,\ra,\rb,lsl #4
114  smmulr \ra,\rb,\rc
115  sub \rc,\rc,\ra,asr #1
116  umull \ra,\rb,\rc,\rd
117  orr \rb,\rb,#63
118  mov \ra,\rb,lsr #5
119  mul \ra,\ra,\ra
120  rsb \ra,\ra,\rd,lsl #18
121  bic \rb,\rb,\ra,lsr #26
122  WXFQ \ra,\rb
123  NRDF
124  RDFQ \rz
125.endm
126
127.macro dcp_fclassify_m rz,rx
128  WXYU \rx,\rx
129  RXVD \rz
130.endm
131
132.macro dcp_fcmp_m rz,rx,ry
133  WXYU \rx,\ry
134  ADD0
135  RCMP \rz
136.endm
137
138.macro dcp_dadd_m rzl,rzh,rxl,rxh,ryl,ryh
139  WXUP \rxl,\rxh
140  WYUP \ryl,\ryh
141  ADD0
142  ADD1
143  NRDD
144  RDDA \rzl,\rzh
145.endm
146
147.macro dcp_dsub_m rzl,rzh,rxl,rxh,ryl,ryh
148  WXUP \rxl,\rxh
149  WYUP \ryl,\ryh
150  ADD0
151  SUB1
152  NRDD
153  RDDS \rzl,\rzh
154.endm
155
156.macro dcp_dmul_m rzl,rzh,rxl,rxh,ryl,ryh,ra,rb,rc,rd,re,rf,rg
157  WXUP \rxl,\rxh
158  WYUP \ryl,\ryh
159  RXMS \ra,\rb,0
160  RYMS \rc,\rd,0
161  umull \re,\rf,\ra,\rc
162  movs \rg,#0
163  umlal \rf,\rg,\ra,\rd
164  umlal \rf,\rg,\rb,\rc
165  WXMS \re,\rf
166  movs \re,#0
167  umlal \rg,\re,\rb,\rd
168  WXMO \rg,\re
169  NRDD
170  RDDM \rzl,\rzh
171.endm
172
173.macro dcp_ddiv_fast_m rzl,rzh,rxl,rxh,ryl,ryh,ra,rb,rc,rd,re
174  WXUP \rxl,\rxh
175  WYUP \ryl,\ryh
176  RYMR \ra,\rb
177  umull \rb,\rc,\ra,\rb
178  mvn \rc,\rc,lsl #2
179  smmlar \ra,\rc,\ra,\ra
180  smmulr \rc,\rc,\rc
181  smmlar \ra,\rc,\ra,\ra
182  sub \re,\ra,\ra,lsr #31
183  RXMS \rc,\rd,0
184  smmulr \rb,\re,\rd
185  RYMS \rc,\rd,1
186  umull \rc,\ra,\rb,\rc
187  mla \ra,\rb,\rd,\ra
188  RXMS \rc,\rd,4
189  sub \ra,\rc,\ra
190  smmulr \rc,\ra,\re
191  mov \rd,\rb,lsr #4
192  adds \ra,\rc,\rb,lsl #28
193  adc \rb,\rd,\rc,asr #31
194  WXDD \ra,\rb
195  NRDD
196  RDDD \rzl,\rzh
197.endm
198
199.macro dcp_ddiv_m rzl,rzh,rxl,rxh,ryl,ryh,ra,rb,rc,rd,re
200  WXUP \rxl,\rxh
201  WYUP \ryl,\ryh
202  RYMR \ra,\rb
203  umull \rb,\rc,\ra,\rb
204  mvn \rc,\rc,lsl #2
205  smmlar \ra,\rc,\ra,\ra
206  smmulr \rc,\rc,\rc
207  smmlar \ra,\rc,\ra,\ra
208  sub \re,\ra,\ra,lsr #31
209  RXMS \rc,\rd,0
210  smmulr \rb,\re,\rd
211  RYMS \rc,\rd,1
212  umull \rc,\ra,\rb,\rc
213  mla \ra,\rb,\rd,\ra
214  RXMS \rc,\rd,4
215  sub \ra,\rc,\ra
216  smmulr \rc,\ra,\re
217  mov \rd,\rb,lsr #4
218  adds \ra,\rc,\rb,lsl #28
219  adc \rb,\rd,\rc,asr #31
220  orr \ra,\ra,\rb,lsr #21
221  bic \ra,\ra,\rb,lsr #22
222  bic \ra,\ra,#7
223  RYMS \rc,\rd,7
224  umull \rd,\re,\ra,\rc
225  RYMS \rc,\rd,7
226  mla \re,\ra,\rd,\re
227  mla \re,\rb,\rc,\re
228  RXMS \rc,\rd,0
229  sub \re,\re,\rc,lsl #18
230  orr \ra,\ra,\re,lsr #29
231  sub \ra,\ra,#1
232  WXDD \ra,\rb
233  NRDD
234  RDDD \rzl,\rzh
235.endm
236
237.macro dcp_dsqrt_fast_m rzl,rzh,rxl,rxh,ra,rb,rc,rd,re
238  WXUP \rxl,\rxh
239  SQR0
240  RXMQ \rc,\rd
241  umull \ra,\rb,\rc,\rc
242  umull \ra,\rb,\rb,\rd
243  mov \rb,\rb,lsl #3
244  sub \rb,\rb,#2147483648
245  smmlsr \rc,\rc,\rb,\rc
246  umull \ra,\rb,\rc,\rc
247  umull \ra,\rb,\rb,\rd
248  movs \ra,\ra,lsr #28
249  adc \rb,\ra,\rb,lsl #4
250  smmulr \ra,\rb,\rc
251  sub \rc,\rc,\ra,asr #1
252  umull \ra,\rb,\rc,\rd
253  mov \rb,\rb,lsr #1
254  umull \rd,\ra,\rb,\rb
255  RXMS \ra,\re,6
256  sub \ra,\ra,\rd
257  smmulr \ra,\ra,\rc
258  add \rb,\rb,\ra,asr #28
259  mov \ra,\ra,lsl #4
260  WXDQ \ra,\rb
261  NRDD
262  RDDQ \rzl,\rzh
263.endm
264
265.macro dcp_dsqrt_m rzl,rzh,rxl,rxh,ra,rb,rc,rd,re
266  WXUP \rxl,\rxh
267  SQR0
268  RXMQ \rc,\rd
269  umull \ra,\rb,\rc,\rc
270  umull \ra,\rb,\rb,\rd
271  mov \rb,\rb,lsl #3
272  sub \rb,\rb,#2147483648
273  smmlsr \rc,\rc,\rb,\rc
274  umull \ra,\rb,\rc,\rc
275  umull \ra,\rb,\rb,\rd
276  movs \ra,\ra,lsr #28
277  adc \rb,\ra,\rb,lsl #4
278  smmulr \ra,\rb,\rc
279  sub \rc,\rc,\ra,asr #1
280  umull \ra,\rb,\rc,\rd
281  mov \rb,\rb,lsr #1
282  umull \rd,\ra,\rb,\rb
283  RXMS \ra,\re,6
284  sub \rd,\ra,\rd
285  smmulr \rd,\rd,\rc
286  add \rb,\rb,\rd,asr #28
287  mov \rd,\rd,lsl #4
288  bic \rd,\rd,#255
289  orr \rd,\rd,#128
290  umull \re,\rc,\rd,\rd
291  mul \re,\rb,\rb
292  umlal \rc,\re,\rb,\rd
293  umlal \rc,\re,\rb,\rd
294  sub \re,\re,\ra
295  orr \rd,\rd,\re,lsr #24
296  sub \rd,\rd,#11
297  WXDQ \rd,\rb
298  NRDD
299  RDDQ \rzl,\rzh
300.endm
301
302.macro dcp_dclassify_m rz,rxl,rxh
303  WXUP \rxl,\rxh
304  RXVD \rz
305.endm
306
307.macro dcp_dcmp_m rz,rxl,rxh,ryl,ryh
308  WXUP \rxl,\rxh
309  WYUP \ryl,\ryh
310  ADD0
311  RCMP \rz
312.endm
313
314.macro dcp_float2double_m rzl,rzh,rx
315  WXYU \rx,\rx
316  NRDD
317  RDDG \rzl,\rzh
318.endm
319
320.macro dcp_double2float_m rz,rxl,rxh
321  WXUP \rxl,\rxh
322  NRDF
323  RDFG \rz
324.endm
325
326.macro dcp_int2double_m rzl,rzh,rx
327  WXIC \rx,\rx
328  ADD0
329  SUB1
330  NRDD
331  RDDS \rzl,\rzh
332.endm
333
334.macro dcp_uint2double_m rzl,rzh,rx
335  WXUC \rx,\rx
336  ADD0
337  SUB1
338  NRDD
339  RDDS \rzl,\rzh
340.endm
341
342.macro dcp_int2float_m rz,rx
343  WXIC \rx,\rx
344  ADD0
345  SUB1
346  NRDF
347  RDFS \rz
348.endm
349
350.macro dcp_uint2float_m rz,rx
351  WXUC \rx,\rx
352  ADD0
353  SUB1
354  NRDF
355  RDFS \rz
356.endm
357
358.macro dcp_double2int_m rz,rxl,rxh
359  WXDC \rxl,\rxh
360  ADD0
361  ADD1
362  NTDC
363  RDIC \rz
364.endm
365
366.macro dcp_double2uint_m rz,rxl,rxh
367  WXDC \rxl,\rxh
368  ADD0
369  ADD1
370  NTDC
371  RDUC \rz
372.endm
373
374.macro dcp_float2int_m rz,rx
375  WXFC \rx,\rx
376  ADD0
377  ADD1
378  NTDC
379  RDIC \rz
380.endm
381
382.macro dcp_float2uint_m rz,rx
383  WXFC \rx,\rx
384  ADD0
385  ADD1
386  NTDC
387  RDUC \rz
388.endm
389
390.macro dcp_double2int_r_m rz,rxl,rxh
391  WXDC \rxl,\rxh
392  ADD0
393  ADD1
394  NRDC
395  RDIC \rz
396.endm
397
398.macro dcp_double2uint_r_m rz,rxl,rxh
399  WXDC \rxl,\rxh
400  ADD0
401  ADD1
402  NRDC
403  RDUC \rz
404.endm
405
406.macro dcp_float2int_r_m rz,rx
407  WXFC \rx,\rx
408  ADD0
409  ADD1
410  NRDC
411  RDIC \rz
412.endm
413
414.macro dcp_float2uint_r_m rz,rx
415  WXFC \rx,\rx
416  ADD0
417  ADD1
418  NRDC
419  RDUC \rz
420.endm
421