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