1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     gfx_CommandUtil.cpp
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 #include "precompiled.h"
19 
20 #include <nw/gfx/gfx_CommandUtil.h>
21 
22 namespace nw
23 {
24 namespace gfx
25 {
26 
27 namespace internal
28 {
29 
30 #include <nn/hw/ARM/code32.h>
31 
32 //--------------------------------------------------------------------------------
33 asm void
NWCopyVec4Reverse(f32 *,const f32 *)34 NWCopyVec4Reverse(
35     f32*        /* dst */,
36     const f32*  /* src */)
37 {
38     VLDMIA      r1!,{s0-s3}
39     VSTR.F32    s0,[r0,#12]
40     VSTR.F32    s1,[r0,#8]
41     VSTR.F32    s2,[r0,#4]
42     VSTR.F32    s3,[r0,#0]
43     BX      lr
44 }
45 
46 //--------------------------------------------------------------------------------
47 asm void
NWCopyVec4WithHeader(f32 *,const f32 *,u32)48 NWCopyVec4WithHeader(
49     f32*        /* dst */,
50     const f32*  /* src */,
51     u32   /* header */ )
52 {
53     VLDMIA      r1!,{s0-s3}
54     STR         r2,[r0,#4]
55     VSTR.F32    s0,[r0,#16]
56     VSTR.F32    s1,[r0,#12]
57     VSTR.F32    s2,[r0,#8]
58     VSTR.F32    s3,[r0,#0]
59     BX      lr
60 }
61 
62 //--------------------------------------------------------------------------------
63 asm void
NWCopyMtx24Reverse(f32 *,const f32 *)64 NWCopyMtx24Reverse(
65     f32*        /* dst */,
66     const f32*  /* src */)
67 {
68     VLDMIA      r1!,{s0-s7}
69     VSTR.F32    s0,[r0,#12]
70     VSTR.F32    s1,[r0,#8]
71     VSTR.F32    s2,[r0,#4]
72     VSTR.F32    s3,[r0,#0]
73     VSTR.F32    s4,[r0,#28]
74     VSTR.F32    s5,[r0,#24]
75     VSTR.F32    s6,[r0,#20]
76     VSTR.F32    s7,[r0,#16]
77     BX      lr
78 }
79 
80 //--------------------------------------------------------------------------------
81 asm void
NWCopyMtx24WithHeader(f32 *,const f32 *,u32)82 NWCopyMtx24WithHeader(
83     f32*        /* dst */,
84     const f32*  /* src */,
85     u32   /* header */ )
86 {
87     VLDMIA      r1!,{s0-s7}
88     STR         r2,[r0,#4]
89     VSTR.F32    s0,[r0,#16]
90     VSTR.F32    s1,[r0,#12]
91     VSTR.F32    s2,[r0,#8]
92     VSTR.F32    s3,[r0,#0]
93     VSTR.F32    s4,[r0,#32]
94     VSTR.F32    s5,[r0,#28]
95     VSTR.F32    s6,[r0,#24]
96     VSTR.F32    s7,[r0,#20]
97     BX      lr
98 }
99 
100 //--------------------------------------------------------------------------------
101 asm void
NWCopyMtx34Reverse(f32 *,const f32 *)102 NWCopyMtx34Reverse(
103     f32*        /* dst */,
104     const f32*  /* src */)
105 {
106     VLDMIA      r1!,{s0-s11}
107     VSTR.F32    s0,[r0,#12]
108     VSTR.F32    s1,[r0,#8]
109     VSTR.F32    s2,[r0,#4]
110     VSTR.F32    s3,[r0,#0]
111     VSTR.F32    s4,[r0,#28]
112     VSTR.F32    s5,[r0,#24]
113     VSTR.F32    s6,[r0,#20]
114     VSTR.F32    s7,[r0,#16]
115     VSTR.F32    s8,[r0,#44]
116     VSTR.F32    s9,[r0,#40]
117     VSTR.F32    s10,[r0,#36]
118     VSTR.F32    s11,[r0,#32]
119     BX      lr
120 }
121 
122 //--------------------------------------------------------------------------------
123 asm void
NWCopyMtx34WithHeader(f32 *,const f32 *,u32)124 NWCopyMtx34WithHeader(
125     f32*  /* dst */,
126     const f32*  /* src */,
127     u32   /* header */ )
128 {
129     VLDMIA      r1!,{s0-s11}
130     STR         r2,[r0,#4]
131     VSTR.F32    s0,[r0,#16]
132     VSTR.F32    s1,[r0,#12]
133     VSTR.F32    s2,[r0,#8]
134     VSTR.F32    s3,[r0,#0]
135     VSTR.F32    s4,[r0,#32]
136     VSTR.F32    s5,[r0,#28]
137     VSTR.F32    s6,[r0,#24]
138     VSTR.F32    s7,[r0,#20]
139     VSTR.F32    s8,[r0,#48]
140     VSTR.F32    s9,[r0,#44]
141     VSTR.F32    s10,[r0,#40]
142     VSTR.F32    s11,[r0,#36]
143     BX      lr
144 }
145 
146 //--------------------------------------------------------------------------------
147 asm void
NWCopyMtx44Reverse(f32 *,const f32 *)148 NWCopyMtx44Reverse(
149     f32*        /* dst */,
150     const f32*  /* src */)
151 {
152     VLDMIA      r1!,{s0-s15}
153     VSTR.F32    s0,[r0,#12]
154     VSTR.F32    s1,[r0,#8]
155     VSTR.F32    s2,[r0,#4]
156     VSTR.F32    s3,[r0,#0]
157     VSTR.F32    s4,[r0,#28]
158     VSTR.F32    s5,[r0,#24]
159     VSTR.F32    s6,[r0,#20]
160     VSTR.F32    s7,[r0,#16]
161     VSTR.F32    s8,[r0,#44]
162     VSTR.F32    s9,[r0,#40]
163     VSTR.F32    s10,[r0,#36]
164     VSTR.F32    s11,[r0,#32]
165     VSTR.F32    s12,[r0,#60]
166     VSTR.F32    s13,[r0,#56]
167     VSTR.F32    s14,[r0,#52]
168     VSTR.F32    s15,[r0,#48]
169     BX      lr
170 }
171 
172 //--------------------------------------------------------------------------------
NWCopyMtx44WithHeader(f32 *,const f32 *,u32)173 asm void NWCopyMtx44WithHeader(
174     f32*        /* dst */,
175     const f32*  /* src */,
176     u32         /* header */ )
177 {
178     VLDMIA      r1!,{s0-s15}
179     STR         r2,[r0,#4]
180     VSTR.F32    s0,[r0,#16]
181     VSTR.F32    s1,[r0,#12]
182     VSTR.F32    s2,[r0,#8]
183     VSTR.F32    s3,[r0,#0]
184     VSTR.F32    s4,[r0,#32]
185     VSTR.F32    s5,[r0,#28]
186     VSTR.F32    s6,[r0,#24]
187     VSTR.F32    s7,[r0,#20]
188     VSTR.F32    s8,[r0,#48]
189     VSTR.F32    s9,[r0,#44]
190     VSTR.F32    s10,[r0,#40]
191     VSTR.F32    s11,[r0,#36]
192     VSTR.F32    s12,[r0,#64]
193     VSTR.F32    s13,[r0,#60]
194     VSTR.F32    s14,[r0,#56]
195     VSTR.F32    s15,[r0,#52]
196     BX      lr
197 }
198 
199 //--------------------------------------------------------------------------------
200 asm void
NWCopyVec3Reverse(f32 *,const f32 *)201 NWCopyVec3Reverse(
202     f32*        /* dst */,
203     const f32*  /* src */)
204 {
205     VLDMIA      r1!,{s0-s2}
206     MOV         r3, #0
207     STR         r3,[r0,#0]
208 
209     VSTR.F32    s0,[r0,#12]
210     VSTR.F32    s1,[r0,#8]
211     VSTR.F32    s2,[r0,#4]
212     BX      lr
213 }
214 
215 //--------------------------------------------------------------------------------
216 asm void
NWCopyVec3WithHeader(f32 *,const f32 *,u32)217 NWCopyVec3WithHeader(
218     f32*        /* dst */,
219     const f32*  /* src */,
220     u32   /* header */ )
221 {
222     VLDMIA      r1!,{s0-s2}
223     MOV         r3, #0
224     STR         r2,[r0,#4]
225     STR         r3,[r0,#0]
226 
227     VSTR.F32    s0,[r0,#16]
228     VSTR.F32    s1,[r0,#12]
229     VSTR.F32    s2,[r0,#8]
230     BX      lr
231 }
232 
233 //--------------------------------------------------------------------------------
234 asm void
NWCopyMtx23Reverse(f32 *,const f32 *)235 NWCopyMtx23Reverse(
236     f32*        /* dst */,
237     const f32*  /* src */)
238 {
239     VLDMIA      r1!,{s0-s5}
240     MOV         r3, #0
241     STR         r3,[r0,#0]
242     STR         r3,[r0,#16]
243 
244     VSTR.F32    s0,[r0,#12]
245     VSTR.F32    s1,[r0,#8]
246     VSTR.F32    s2,[r0,#4]
247     VSTR.F32    s3,[r0,#28]
248     VSTR.F32    s4,[r0,#24]
249     VSTR.F32    s5,[r0,#20]
250     BX      lr
251 }
252 
253 //--------------------------------------------------------------------------------
254 asm void
NWCopyMtx23WithHeader(f32 *,const f32 *,u32)255 NWCopyMtx23WithHeader(
256     f32*        /* dst */,
257     const f32*  /* src */,
258     u32   /* header */ )
259 {
260     VLDMIA      r1!,{s0-s5}
261     MOV         r3, #0
262     STR         r2, [r0,#4]
263     STR         r3, [r0,#0]
264     STR         r3, [r0,#20]
265 
266     VSTR.F32    s0, [r0,#16]
267     VSTR.F32    s1, [r0,#12]
268     VSTR.F32    s2, [r0,#8]
269     VSTR.F32    s3, [r0,#32]
270     VSTR.F32    s4, [r0,#28]
271     VSTR.F32    s5, [r0,#24]
272     BX      lr
273 }
274 
275 //--------------------------------------------------------------------------------
276 asm void
NWCopyMtx33Reverse(f32 *,const f32 *)277 NWCopyMtx33Reverse(
278     f32*        /* dst */,
279     const f32*  /* src */)
280 {
281     VLDMIA      r1!,{s0-s8}
282     MOV         r3, #0
283     STR         r3, [r0,#0]
284     STR         r3, [r0,#16]
285     STR         r3, [r0,#32]
286 
287     VSTR.F32    s0, [r0,#12]
288     VSTR.F32    s1, [r0,#8]
289     VSTR.F32    s2, [r0,#4]
290     VSTR.F32    s3, [r0,#28]
291     VSTR.F32    s4, [r0,#24]
292     VSTR.F32    s5, [r0,#20]
293     VSTR.F32    s6, [r0,#44]
294     VSTR.F32    s7, [r0,#40]
295     VSTR.F32    s8, [r0,#36]
296     BX      lr
297 }
298 
299 //--------------------------------------------------------------------------------
300 asm void
NWCopyMtx33WithHeader(f32 *,const f32 *,u32)301 NWCopyMtx33WithHeader(
302     f32*  /* dst */,
303     const f32*  /* src */,
304     u32   /* header */ )
305 {
306     VLDMIA      r1!,{s0-s8}
307     MOV         r3, #0
308     STR         r2, [r0,#4]
309     STR         r3, [r0,#0]
310     STR         r3, [r0,#20]
311     STR         r3, [r0,#36]
312 
313     VSTR.F32    s0,[r0,#16]
314     VSTR.F32    s1,[r0,#12]
315     VSTR.F32    s2,[r0,#8]
316     VSTR.F32    s3,[r0,#32]
317     VSTR.F32    s4,[r0,#28]
318     VSTR.F32    s5,[r0,#24]
319     VSTR.F32    s6,[r0,#48]
320     VSTR.F32    s7,[r0,#44]
321     VSTR.F32    s8,[r0,#40]
322     BX      lr
323 }
324 
325 //--------------------------------------------------------------------------------
326 asm void
NWCopyMtx43Reverse(f32 *,const f32 *)327 NWCopyMtx43Reverse(
328     f32*        /* dst */,
329     const f32*  /* src */)
330 {
331     VLDMIA      r1!,{s0-s11}
332     MOV         r3, #0
333     STR         r3, [r0,#0]
334     STR         r3, [r0,#16]
335     STR         r3, [r0,#32]
336     STR         r3, [r0,#48]
337 
338     VSTR.F32    s0, [r0,#12]
339     VSTR.F32    s1, [r0,#8]
340     VSTR.F32    s2, [r0,#4]
341     VSTR.F32    s3, [r0,#28]
342     VSTR.F32    s4, [r0,#24]
343     VSTR.F32    s5, [r0,#20]
344     VSTR.F32    s6, [r0,#44]
345     VSTR.F32    s7, [r0,#40]
346     VSTR.F32    s8, [r0,#36]
347     VSTR.F32    s9, [r0,#60]
348     VSTR.F32    s10, [r0,#56]
349     VSTR.F32    s11, [r0,#52]
350     BX      lr
351 }
352 
353 //--------------------------------------------------------------------------------
354 asm void
NWCopyMtx43WithHeader(f32 *,const f32 *,u32)355 NWCopyMtx43WithHeader(
356     f32*  /* dst */,
357     const f32*  /* src */,
358     u32   /* header */ )
359 {
360     VLDMIA      r1!,{s0-s11}
361     MOV         r3, #0
362     STR         r2, [r0,#4]
363     STR         r3, [r0,#0]
364     STR         r3, [r0,#20]
365     STR         r3, [r0,#36]
366     STR         r3, [r0,#52]
367 
368     VSTR.F32    s0, [r0,#16]
369     VSTR.F32    s1, [r0,#12]
370     VSTR.F32    s2, [r0,#8]
371     VSTR.F32    s3, [r0,#32]
372     VSTR.F32    s4, [r0,#28]
373     VSTR.F32    s5, [r0,#24]
374     VSTR.F32    s6, [r0,#48]
375     VSTR.F32    s7, [r0,#44]
376     VSTR.F32    s8, [r0,#40]
377     VSTR.F32    s9, [r0,#64]
378     VSTR.F32    s10, [r0,#60]
379     VSTR.F32    s11, [r0,#56]
380     BX      lr
381 }
382 
383 //--------------------------------------------------------------------------------
384 asm void
NWCopyVec2Reverse(f32 *,const f32 *)385 NWCopyVec2Reverse(
386     f32*        /* dst */,
387     const f32*  /* src */)
388 {
389     VLDMIA      r1!,{s0-s1}
390     MOV         r3, #0
391     STR         r3, [r0,#0]
392     STR         r3, [r0,#4]
393 
394     VSTR.F32    s0, [r0,#12]
395     VSTR.F32    s1, [r0,#8]
396     BX      lr
397 }
398 
399 //--------------------------------------------------------------------------------
400 asm void
NWCopyVec2WithHeader(f32 *,const f32 *,u32)401 NWCopyVec2WithHeader(
402     f32*        /* dst */,
403     const f32*  /* src */,
404     u32   /* header */ )
405 {
406     VLDMIA      r1!,{s0-s1}
407     MOV         r3, #0
408     STR         r2, [r0,#4]
409     STR         r3, [r0,#0]
410     STR         r3, [r0,#8]
411 
412     VSTR.F32    s0, [r0,#16]
413     VSTR.F32    s1, [r0,#12]
414     BX      lr
415 }
416 
417 //--------------------------------------------------------------------------------
418 asm void
NWCopyMtx22Reverse(f32 *,const f32 *)419 NWCopyMtx22Reverse(
420     f32*        /* dst */,
421     const f32*  /* src */)
422 {
423     VLDMIA      r1!,{s0-s3}
424     MOV         r3, #0
425     STR         r3, [r0,#0]
426     STR         r3, [r0,#4]
427     STR         r3, [r0,#16]
428     STR         r3, [r0,#20]
429 
430     VSTR.F32    s0, [r0,#12]
431     VSTR.F32    s1, [r0,#8]
432     VSTR.F32    s2, [r0,#28]
433     VSTR.F32    s3, [r0,#24]
434     BX      lr
435 }
436 
437 //--------------------------------------------------------------------------------
438 asm void
NWCopyMtx22WithHeader(f32 *,const f32 *,u32)439 NWCopyMtx22WithHeader(
440     f32*        /* dst */,
441     const f32*  /* src */,
442     u32   /* header */ )
443 {
444     VLDMIA      r1!,{s0-s3}
445     MOV         r3, #0
446     STR         r2, [r0,#4]
447     STR         r3, [r0,#0]
448     STR         r3, [r0,#8]
449     STR         r3, [r0,#20]
450     STR         r3, [r0,#24]
451 
452 
453     VSTR.F32    s0, [r0,#16]
454     VSTR.F32    s1, [r0,#12]
455     VSTR.F32    s2, [r0,#32]
456     VSTR.F32    s3, [r0,#28]
457     BX      lr
458 }
459 
460 //--------------------------------------------------------------------------------
461 asm void
NWCopyMtx32Reverse(f32 *,const f32 *)462 NWCopyMtx32Reverse(
463     f32*        /* dst */,
464     const f32*  /* src */)
465 {
466     VLDMIA      r1!,{s0-s5}
467     MOV         r3, #0
468     STR         r3, [r0,#0]
469     STR         r3, [r0,#4]
470     STR         r3, [r0,#16]
471     STR         r3, [r0,#20]
472     STR         r3, [r0,#32]
473     STR         r3, [r0,#36]
474 
475     VSTR.F32    s0, [r0,#12]
476     VSTR.F32    s1, [r0,#8]
477     VSTR.F32    s2, [r0,#28]
478     VSTR.F32    s3, [r0,#24]
479     VSTR.F32    s4, [r0,#44]
480     VSTR.F32    s5, [r0,#40]
481     BX      lr
482 }
483 
484 //--------------------------------------------------------------------------------
485 asm void
NWCopyMtx32WithHeader(f32 *,const f32 *,u32)486 NWCopyMtx32WithHeader(
487     f32*  /* dst */,
488     const f32*  /* src */,
489     u32   /* header */ )
490 {
491     VLDMIA      r1!,{s0-s5}
492     MOV         r3, #0
493     STR         r2, [r0,#4]
494     STR         r3, [r0,#0]
495     STR         r3, [r0,#8]
496     STR         r3, [r0,#20]
497     STR         r3, [r0,#24]
498     STR         r3, [r0,#36]
499     STR         r3, [r0,#40]
500 
501     VSTR.F32    s0, [r0,#16]
502     VSTR.F32    s1, [r0,#12]
503     VSTR.F32    s2, [r0,#32]
504     VSTR.F32    s3, [r0,#28]
505     VSTR.F32    s4, [r0,#48]
506     VSTR.F32    s5, [r0,#44]
507     BX      lr
508 }
509 
510 //--------------------------------------------------------------------------------
511 asm void
NWCopyMtx42Reverse(f32 *,const f32 *)512 NWCopyMtx42Reverse(
513     f32*        /* dst */,
514     const f32*  /* src */)
515 {
516     VLDMIA      r1!,{s0-s7}
517     MOV         r3, #0
518     STR         r3, [r0,#0]
519     STR         r3, [r0,#4]
520     STR         r3, [r0,#16]
521     STR         r3, [r0,#20]
522     STR         r3, [r0,#32]
523     STR         r3, [r0,#36]
524     STR         r3, [r0,#48]
525     STR         r3, [r0,#52]
526 
527     VSTR.F32    s0, [r0,#12]
528     VSTR.F32    s1, [r0,#8]
529     VSTR.F32    s2, [r0,#28]
530     VSTR.F32    s3, [r0,#24]
531     VSTR.F32    s4, [r0,#44]
532     VSTR.F32    s5, [r0,#40]
533     VSTR.F32    s6, [r0,#60]
534     VSTR.F32    s7, [r0,#56]
535     BX      lr
536 }
537 
538 //--------------------------------------------------------------------------------
539 asm void
NWCopyMtx42WithHeader(f32 *,const f32 *,u32)540 NWCopyMtx42WithHeader(
541     f32*  /* dst */,
542     const f32*  /* src */,
543     u32   /* header */ )
544 {
545     VLDMIA      r1!,{s0-s7}
546     MOV         r3, #0
547     STR         r2, [r0,#4]
548     STR         r3, [r0,#0]
549     STR         r3, [r0,#8]
550     STR         r3, [r0,#20]
551     STR         r3, [r0,#24]
552     STR         r3, [r0,#36]
553     STR         r3, [r0,#40]
554     STR         r3, [r0,#52]
555     STR         r3, [r0,#56]
556 
557     VSTR.F32    s0, [r0,#16]
558     VSTR.F32    s1, [r0,#12]
559     VSTR.F32    s2, [r0,#32]
560     VSTR.F32    s3, [r0,#28]
561     VSTR.F32    s4, [r0,#48]
562     VSTR.F32    s5, [r0,#44]
563     VSTR.F32    s6, [r0,#64]
564     VSTR.F32    s7, [r0,#60]
565     BX      lr
566 }
567 
568 //--------------------------------------------------------------------------------
569 asm void
NWCopyVec1Reverse(f32 *,const f32 *)570 NWCopyVec1Reverse(
571     f32*        /* dst */,
572     const f32*  /* src */)
573 {
574     VLDR.F32    s0, [r1]
575     MOV         r3, #0
576     STR         r3, [r0,#0]
577     STR         r3, [r0,#4]
578     STR         r3, [r0,#8]
579 
580     VSTR.F32    s0, [r0,#12]
581     BX      lr
582 }
583 
584 //--------------------------------------------------------------------------------
585 asm void
NWCopyVec1WithHeader(f32 *,const f32 *,u32)586 NWCopyVec1WithHeader(
587     f32*        /* dst */,
588     const f32*  /* src */,
589     u32   /* header */ )
590 {
591     VLDR.F32    s0, [r1]
592     MOV         r3, #0
593     STR         r2, [r0,#4]
594     STR         r3, [r0,#0]
595     STR         r3, [r0,#8]
596     STR         r3, [r0,#12]
597 
598     VSTR.F32    s0, [r0,#16]
599     BX      lr
600 }
601 
602 //--------------------------------------------------------------------------------
603 asm void
NWCopyMtx21Reverse(f32 *,const f32 *)604 NWCopyMtx21Reverse(
605     f32*        /* dst */,
606     const f32*  /* src */)
607 {
608     VLDMIA      r1!,{s0-s1}
609     MOV         r3, #0
610     STR         r3, [r0,#0]
611     STR         r3, [r0,#4]
612     STR         r3, [r0,#8]
613     STR         r3, [r0,#16]
614     STR         r3, [r0,#20]
615     STR         r3, [r0,#24]
616 
617     VSTR.F32    s0, [r0,#12]
618     VSTR.F32    s1, [r0,#28]
619     BX      lr
620 }
621 
622 //--------------------------------------------------------------------------------
623 asm void
NWCopyMtx21WithHeader(f32 *,const f32 *,u32)624 NWCopyMtx21WithHeader(
625     f32*        /* dst */,
626     const f32*  /* src */,
627     u32   /* header */ )
628 {
629     VLDMIA      r1!,{s0-s1}
630     MOV         r3, #0
631     STR         r2, [r0,#4]
632     STR         r3, [r0,#0]
633     STR         r3, [r0,#8]
634     STR         r3, [r0,#12]
635     STR         r3, [r0,#20]
636     STR         r3, [r0,#24]
637     STR         r3, [r0,#28]
638 
639     VSTR.F32    s0, [r0,#16]
640     VSTR.F32    s1, [r0,#32]
641     BX      lr
642 }
643 
644 //--------------------------------------------------------------------------------
645 asm void
NWCopyMtx31Reverse(f32 *,const f32 *)646 NWCopyMtx31Reverse(
647     f32*        /* dst */,
648     const f32*  /* src */)
649 {
650     VLDMIA      r1!,{s0-s2}
651     MOV         r3, #0
652     STR         r3, [r0,#0]
653     STR         r3, [r0,#4]
654     STR         r3, [r0,#8]
655     STR         r3, [r0,#16]
656     STR         r3, [r0,#20]
657     STR         r3, [r0,#24]
658     STR         r3, [r0,#32]
659     STR         r3, [r0,#36]
660     STR         r3, [r0,#40]
661 
662     VSTR.F32    s0, [r0,#12]
663     VSTR.F32    s1, [r0,#28]
664     VSTR.F32    s2, [r0,#44]
665     BX      lr
666 }
667 
668 //--------------------------------------------------------------------------------
669 asm void
NWCopyMtx31WithHeader(f32 *,const f32 *,u32)670 NWCopyMtx31WithHeader(
671     f32*  /* dst */,
672     const f32*  /* src */,
673     u32   /* header */ )
674 {
675     VLDMIA      r1!,{s0-s2}
676     MOV         r3, #0
677     STR         r2, [r0,#4]
678     STR         r3, [r0,#0]
679     STR         r3, [r0,#8]
680     STR         r3, [r0,#12]
681     STR         r3, [r0,#20]
682     STR         r3, [r0,#24]
683     STR         r3, [r0,#28]
684     STR         r3, [r0,#36]
685     STR         r3, [r0,#40]
686     STR         r3, [r0,#44]
687 
688     VSTR.F32    s0, [r0,#16]
689     VSTR.F32    s1, [r0,#32]
690     VSTR.F32    s2, [r0,#48]
691     BX      lr
692 }
693 
694 //--------------------------------------------------------------------------------
695 asm void
NWCopyMtx41Reverse(f32 *,const f32 *)696 NWCopyMtx41Reverse(
697     f32*        /* dst */,
698     const f32*  /* src */)
699 {
700     VLDMIA      r1!,{s0-s3}
701     MOV         r3, #0
702     STR         r3, [r0,#0]
703     STR         r3, [r0,#4]
704     STR         r3, [r0,#8]
705     STR         r3, [r0,#16]
706     STR         r3, [r0,#20]
707     STR         r3, [r0,#24]
708     STR         r3, [r0,#32]
709     STR         r3, [r0,#36]
710     STR         r3, [r0,#40]
711     STR         r3, [r0,#48]
712     STR         r3, [r0,#52]
713     STR         r3, [r0,#56]
714 
715     VSTR.F32    s0,[r0,#12]
716     VSTR.F32    s1,[r0,#28]
717     VSTR.F32    s2,[r0,#44]
718     VSTR.F32    s3,[r0,#60]
719     BX      lr
720 }
721 
722 //--------------------------------------------------------------------------------
723 asm void
NWCopyMtx41WithHeader(f32 *,const f32 *,u32)724 NWCopyMtx41WithHeader(
725     f32*  /* dst */,
726     const f32*  /* src */,
727     u32   /* header */ )
728 {
729     VLDMIA      r1!,{s0-s3}
730     MOV         r3, #0
731     STR         r2, [r0,#4]
732     STR         r3, [r0,#0]
733     STR         r3, [r0,#8]
734     STR         r3, [r0,#12]
735     STR         r3, [r0,#20]
736     STR         r3, [r0,#24]
737     STR         r3, [r0,#28]
738     STR         r3, [r0,#36]
739     STR         r3, [r0,#40]
740     STR         r3, [r0,#44]
741     STR         r3, [r0,#52]
742     STR         r3, [r0,#56]
743     STR         r3, [r0,#60]
744 
745     VSTR.F32    s0, [r0,#12]
746     VSTR.F32    s1, [r0,#28]
747     VSTR.F32    s2, [r0,#44]
748     VSTR.F32    s3, [r0,#60]
749     BX      lr
750 }
751 
752 #include <nn/hw/ARM/codereset.h>
753 
754 } // namespace internal
755 } // namespace gfx
756 } // namespace nw
757