1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     math_Matrix34.cpp
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  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   $Rev: 24870 $
14  *---------------------------------------------------------------------------*/
15 
16 #include <nn/math.h>
17 
18 #include <cmath>
19 #include <nn/math/ARMv6/math_Matrix34.h>
20 
21 #if !defined(NN_MATH_AS_INLINE)
22 #include <nn/math/ARMv6/inline/math_Matrix34.ipp>
23 #endif
24 
25 namespace nn {
26 namespace math {
27 namespace ARMv6 {
28 
29 #include <nn/hw/ARM/code32.h>
30 
31 NN_FUNC_ATTR_PRIVATE_SECTION
32 asm MTX34*
MTX34CopyAsm(MTX34 *,const MTX34 *)33 MTX34CopyAsm(MTX34* , const MTX34*)
34 {
35     CMP         r1,r0           // pとpOutは同じ?
36     BXEQ        lr              // 同じならコピーせず帰る
37     VLDMIA      r1,{s0-s11}     // レジスタ[S0-S11]にpを全て入れる
38     VSTMIA      r0,{s0-s11}     // レジスタ[S0-S11]をpOutに入れる
39     BX          lr
40 }
41 
42 NN_FUNC_ATTR_PRIVATE_SECTION
43 asm MTX34*
MTX34MultAsm_ORG(MTX34 *,const MTX34 *,const MTX34 *)44 MTX34MultAsm_ORG(MTX34*, const MTX34*, const MTX34*)
45 {
46     VPUSH       {d8-d15}            // レジスタの保存
47 
48     VLDMIA      r2,{s8-s19}         // レジスタ[S8-S19]に行列p2を全て入れる
49     VLDMIA      r1!,{s0-s7}         // レジスタ[S0-S7]に行列p1を入れる
50 
51     VMUL.F32    s20,s8,s0
52     VMUL.F32    s21,s9,s0
53     VMUL.F32    s22,s10,s0
54     VMUL.F32    s23,s11,s0
55 
56     VMUL.F32    s24,s8,s4
57     VMUL.F32    s25,s9,s4
58     VLDR.F32    s0,[r1,#0]          // p1の続き
59     VMUL.F32    s26,s10,s4
60     VMUL.F32    s27,s11,s4
61 
62     VMUL.F32    s28,s8,s0
63     VMUL.F32    s29,s9,s0
64     VMUL.F32    s30,s10,s0
65     VMUL.F32    s31,s11,s0
66 
67     VMLA.F32    s20,s12,s1
68     VMLA.F32    s21,s13,s1
69     VLDR.F32    s4,[r1,#4]          // p1の続き
70     VMLA.F32    s22,s14,s1
71     VMLA.F32    s23,s15,s1
72 
73     VMLA.F32    s24,s12,s5
74     VMLA.F32    s25,s13,s5
75     VMLA.F32    s26,s14,s5
76     VMLA.F32    s27,s15,s5
77 
78     VMLA.F32    s28,s12,s4
79     VMLA.F32    s29,s13,s4
80     VMLA.F32    s30,s14,s4
81     VMLA.F32    s31,s15,s4
82 
83     VLDR.F32    s1,[r1,#8]          // p1の続き
84     VMLA.F32    s23,s19,s2
85     VMLA.F32    s20,s16,s2
86     VMLA.F32    s21,s17,s2
87     VMLA.F32    s22,s18,s2
88 
89     VLDR.F32    s5,[r1,#12]         // p1の続き
90     VMLA.F32    s27,s19,s6
91     VMLA.F32    s24,s16,s6
92     VMLA.F32    s25,s17,s6
93     VMLA.F32    s26,s18,s6
94 
95     VADD.F32    s23,s23,s3
96 
97     VMLA.F32    s31,s19,s1
98     VMLA.F32    s28,s16,s1
99     VMLA.F32    s29,s17,s1
100     VMLA.F32    s30,s18,s1
101 
102     VADD.F32    s27,s27,s7
103     VADD.F32    s31,s31,s5
104 
105     VSTMIA      r0!,{s20-s23}       // 結果をストア
106     VPOP        {d8-d11}            // 分割POPした方が速い
107     VSTMIA      r0!,{s24-s27}       // 結果をストア
108     VPOP        {d12-d13}           // 細切れにした方が速い
109     VSTMIA      r0,{s28-s31}        // 結果をストア
110     VPOP        {d14-d15}           // ブツ切りした方が速い
111     BX          lr                  // 戻る
112 }
113 
114 NN_FUNC_ATTR_PRIVATE_SECTION
115 asm MTX34*
MTX34MultAsm(MTX34 *,const MTX34 *,const MTX34 *)116 MTX34MultAsm(MTX34*, const MTX34*, const MTX34*)
117 {
118     VPUSH       {d8-d10}            // レジスタの保存
119 
120     VLDR.F32    s3,[r1,#4*4*0+4*3]  // 行列p1[0][3]
121     VLDR.F32    s7,[r1,#4*4*1+4*3]  // 行列p1[1][3]
122     VLDR.F32    s11,[r1,#4*4*2+4*3] // 行列p1[2][3]
123 
124     VLDMIA      r2!,{s12-s15}       // レジスタ[S12-S15]に行列p2を入れる
125 
126     VLDR.F32    s20,[r1,#4*4*0+4*0] // 行列p1[0][0]
127     VLDR.F32    s21,[r1,#4*4*1+4*0] // 行列p1[1][0]
128     VMUL.F32    s0,s12,s20
129     VMUL.F32    s1,s13,s20
130     VMUL.F32    s2,s14,s20
131     VMLA.F32    s3,s15,s20
132 
133     VLDR.F32    s20,[r1,#4*4*2+4*0] // 行列p1[2][0]
134     VMUL.F32    s4,s12,s21
135     VMUL.F32    s5,s13,s21
136     VMUL.F32    s6,s14,s21
137     VMLA.F32    s7,s15,s21
138     VLDMIA      r2!,{s16-s19}       // レジスタ[S16-S19]に行列p2を入れる
139 
140     VLDR.F32    s21,[r1,#4*4*0+4*1] // 行列p1[0][1]
141     VMUL.F32    s8,s12,s20
142     VMUL.F32    s9,s13,s20
143     VMUL.F32    s10,s14,s20
144     VMLA.F32    s11,s15,s20
145     VLDMIA      r2,{s12-s15}        // レジスタ[S12-S15]に行列p2を入れる
146 
147     VLDR.F32    s20,[r1,#4*4*1+4*1] // 行列p1[1][1]
148     VMLA.F32    s0,s16,s21
149     VMLA.F32    s1,s17,s21
150     VMLA.F32    s2,s18,s21
151     VMLA.F32    s3,s19,s21
152 
153     VLDR.F32    s21,[r1,#4*4*2+4*1] // 行列p1[2][1]
154     VMLA.F32    s4,s16,s20
155     VMLA.F32    s5,s17,s20
156     VMLA.F32    s6,s18,s20
157     VMLA.F32    s7,s19,s20
158 
159     VLDR.F32    s20,[r1,#4*4*0+4*2] // 行列p1[0][2]
160     VMLA.F32    s8,s16,s21
161     VMLA.F32    s9,s17,s21
162     VMLA.F32    s10,s18,s21
163     VMLA.F32    s11,s19,s21
164 
165     VLDR.F32    s21,[r1,#4*4*1+4*2] // 行列p1[1][2]
166     VMLA.F32    s0,s12,s20
167     VMLA.F32    s1,s13,s20
168     VMLA.F32    s2,s14,s20
169     VMLA.F32    s3,s15,s20
170 
171     VLDR.F32    s20,[r1,#4*4*2+4*2] // 行列p1[2][2]
172     VMLA.F32    s4,s12,s21
173     VMLA.F32    s5,s13,s21
174     VMLA.F32    s6,s14,s21
175     VMLA.F32    s7,s15,s21
176 
177     VMLA.F32    s8,s12,s20
178     VMLA.F32    s9,s13,s20
179     VMLA.F32    s10,s14,s20
180     VMLA.F32    s11,s15,s20
181 
182     VPOP        {d8-d10}            // POP
183     MOV         r1,r0
184     VSTMIA      r1!,{s0-s3}         // 結果をストア
185     VSTMIA      r1,{s4-s11}         // 結果をストア
186     BX          lr                  // 戻る
187 }
188 
189 NN_FUNC_ATTR_PRIVATE_SECTION
190 asm MTX34*
MTX34MultAsm(MTX34 *,const MTX34 *,f32)191 MTX34MultAsm(MTX34*, const MTX34*, f32)
192 {
193     VLDMIA      r1,{s2-s13}         // レジスタ[S1-S12]に行列pを入れる
194 
195     VMUL.F32    s2,s2,s0
196     VMUL.F32    s3,s3,s0
197     VMUL.F32    s4,s4,s0
198     VMUL.F32    s5,s5,s0
199 
200     VMUL.F32    s6,s6,s0
201     VMUL.F32    s7,s7,s0
202     VMUL.F32    s8,s8,s0
203     VMUL.F32    s9,s9,s0
204 
205     VMUL.F32    s10,s10,s0
206     VMUL.F32    s11,s11,s0
207     VMUL.F32    s12,s12,s0
208     VMUL.F32    s13,s13,s0
209 
210     VSTMIA      r0,{s2-s13}         // 結果をストア
211     BX          lr                  // 戻る
212 }
213 
214 NN_FUNC_ATTR_PRIVATE_SECTION
215 asm MTX34*
MTX34AddAsm(MTX34 *,const MTX34 *,const MTX34 *)216 MTX34AddAsm(MTX34*, const MTX34*, const MTX34*)
217 {
218     VPUSH       {d8-d9}             // レジスタの保存
219     VLDMIA      r2,{s0-s11}         // レジスタ[S0-S11]に行列p2を全て入れる
220     VLDMIA      r1!,{s12-s19}       // レジスタ[S12-S19]に行列p1を入れる
221 
222     VADD.F32    s0,s12,s0
223     VADD.F32    s1,s13,s1
224     VADD.F32    s2,s14,s2
225 
226     VADD.F32    s3,s15,s3
227     VADD.F32    s4,s16,s4
228     VLDMIA      r1!,{s12-s15}       // p1の続き
229     VADD.F32    s5,s17,s5
230 
231     VADD.F32    s6,s18,s6
232     VADD.F32    s7,s19,s7
233     VADD.F32    s8,s12,s8
234 
235     VADD.F32    s9,s13,s9
236     VADD.F32    s10,s14,s10
237     VADD.F32    s11,s15,s11
238 
239     VPOP        {d8-d9}             // レジスタの復帰
240     VSTMIA      r0,{s0-s11}         // 結果をストア
241     BX          lr                  // 戻る
242 }
243 
244 NN_FUNC_ATTR_PRIVATE_SECTION
245 asm MTX34*
MTX34MAddAsm(MTX34 *,f32,const MTX34 *,const MTX34 *)246 MTX34MAddAsm(MTX34*, f32, const MTX34*, const MTX34*)
247 {
248     VPUSH       {d8-d10}            // レジスタの保存
249     VLDMIA      r2,{s2-s13}         // レジスタ[S2-S13]に行列p2を全て入れる
250     VLDMIA      r1!,{s14-s21}       // レジスタ[S14-S21]に行列p1を入れる
251 
252     VMLA.F32    s2,s14,s0
253     VMLA.F32    s3,s15,s0
254     VMLA.F32    s4,s16,s0
255     VMLA.F32    s5,s17,s0
256     VLDMIA      r1,{s14-s17}        // p1の続き
257 
258     VMLA.F32    s6,s18,s0
259     VMLA.F32    s7,s19,s0
260     VMLA.F32    s8,s20,s0
261     VMLA.F32    s9,s21,s0
262 
263     VMLA.F32    s10,s14,s0
264     VMLA.F32    s11,s15,s0
265     VMLA.F32    s12,s16,s0
266     VMLA.F32    s13,s17,s0
267 
268     VPOP        {d8-d10}            // レジスタの復帰
269     VSTMIA      r0,{s2-s13}         // 結果をストア
270     BX          lr                  // 戻る
271 }
272 
273 NN_FUNC_ATTR_PRIVATE_SECTION
274 asm MTX34*
MTX34MultScaleAsm(MTX34 *,const MTX34 *,const VEC3 *)275 MTX34MultScaleAsm(MTX34* , const MTX34* , const VEC3* )
276 {
277     VLDMIA      r1,{s0-s11}         // レジスタ[S0-S11]に行列pを入れる
278     VLDMIA      r2,{s12-s14}        // レジスタ[S12-S14]にVEC3を入れる
279 
280     VMUL.F32    s0,s0,s12
281     VMUL.F32    s1,s1,s13
282     VMUL.F32    s2,s2,s14
283 
284     VMUL.F32    s4,s4,s12
285     VMUL.F32    s5,s5,s13
286     VMUL.F32    s6,s6,s14
287 
288     VMUL.F32    s8,s8,s12
289     VMUL.F32    s9,s9,s13
290     VMUL.F32    s10,s10,s14
291 
292     VSTMIA      r0,{s0-s11}         // 結果をストア
293     BX          lr                  // 戻る
294 }
295 
296 NN_FUNC_ATTR_PRIVATE_SECTION
297 asm MTX34*
MTX34MultScaleAsm(MTX34 *,const VEC3 *,const MTX34 *)298 MTX34MultScaleAsm(MTX34* , const VEC3*, const MTX34* )
299 {
300     VLDMIA      r2,{s0-s11}         // レジスタ[S0-S11]に行列pを入れる
301     VLDMIA      r1,{s12-s14}        // レジスタ[S12-S14]にVEC3を入れる
302 
303     VMUL.F32    s0,s0,s12
304     VMUL.F32    s1,s1,s12
305     VMUL.F32    s2,s2,s12
306     VMUL.F32    s3,s3,s12
307 
308     VMUL.F32    s4,s4,s13
309     VMUL.F32    s5,s5,s13
310     VMUL.F32    s6,s6,s13
311     VMUL.F32    s7,s7,s13
312 
313     VMUL.F32    s8,s8,s14
314     VMUL.F32    s9,s9,s14
315     VMUL.F32    s10,s10,s14
316     VMUL.F32    s11,s11,s14
317 
318     VSTMIA      r0,{s0-s11}         // 結果をストア
319     BX          lr                  // 戻る
320 }
321 
322 NN_FUNC_ATTR_PRIVATE_SECTION
323 asm u32
MTX34InverseAsm(MTX34 *,const MTX34 *)324 MTX34InverseAsm(MTX34*, const MTX34* )
325 {
326     VLDMIA      r1,{s0-s2}
327     ADD         r1,#4*4
328     VLDMIA      r1,{s3-s5}
329     ADD         r1,#4*4
330     VLDMIA      r1,{s6-s8}
331 
332     VMUL.F32    s10,s0,s4
333     VMUL.F32    s11,s1,s5
334     VMUL.F32    s12,s2,s3
335     VMUL.F32    s13,s6,s4
336     VMUL.F32    s14,s3,s1
337     VMUL.F32    s15,s0,s7
338 
339     VMUL.F32    s10,s10,s8
340     VMUL.F32    s11,s11,s6
341     VMUL.F32    s12,s12,s7
342 
343     VMLS.F32    s10,s13,s2
344     VMLS.F32    s11,s14,s8
345     VMLS.F32    s12,s15,s5
346 
347     VADD.F32    s10,s10,s11
348     VLDR.F32    s15,=1.0
349     VADD.F32    s10,s10,s12
350 
351     FMRS        r2,s10
352     CMP         r2,#0x80000000
353     CMPNE       r2,#0
354     MOVEQ       r0,#0
355     BXEQ        lr
356 
357     VPUSH       {d8-d12}            // レジスタの保存
358     VDIV.F32    s15,s10
359 
360     VMUL.F32    s16,s4,s8
361     VMUL.F32    s17,s1,s8
362     VMUL.F32    s18,s1,s5
363 
364     VMUL.F32    s19,s3,s8
365     VMUL.F32    s20,s0,s8
366     VMUL.F32    s21,s0,s5
367 
368     VMUL.F32    s22,s3,s7
369     VMUL.F32    s23,s0,s7
370     VMUL.F32    s24,s0,s4
371 
372 
373     VMLS.F32    s16,s7,s5
374     VMLS.F32    s17,s7,s2
375     VMLS.F32    s18,s4,s2
376 
377     VMLS.F32    s19,s6,s5
378     VMLS.F32    s20,s6,s2
379     VMLS.F32    s21,s3,s2
380 
381     VMLS.F32    s22,s6,s4
382     VMLS.F32    s23,s6,s1
383     VMLS.F32    s24,s3,s1
384 
385 
386     VMUL.F32    s0,s16,s15          // m[0][0]
387     VNMUL.F32   s1,s17,s15          // m[0][1]
388     VMUL.F32    s2,s18,s15          // m[0][2]
389 
390     VNMUL.F32   s4,s19,s15          // m[1][0]
391     VMUL.F32    s5,s20,s15          // m[1][1]
392     VNMUL.F32   s6,s21,s15          // m[1][2]
393 
394     VMUL.F32    s8,s22,s15          // m[2][0]
395     VLDR.F32    s12,[r1,#4*3-(4*4*2)]// src[0][3]
396     VNMUL.F32   s9,s23,s15          // m[2][1]
397     VMUL.F32    s10,s24,s15         // m[2][2]
398 
399     VNMUL.F32   s3,s0,s12
400     VLDR.F32    s13,[r1,#4*3-(4*4)] // src[1][3]
401     VNMUL.F32   s7,s4,s12
402     VNMUL.F32   s11,s8,s12
403 
404     VMLS.F32    s3,s1,s13
405     VLDR.F32    s14,[r1,#4*3]       // src[2][3]
406     VMLS.F32    s7,s5,s13
407     VMLS.F32    s11,s9,s13
408 
409     VMLS.F32    s3,s2,s14
410     VMLS.F32    s7,s6,s14
411     VMLS.F32    s11,s10,s14
412 
413     VPOP        {d8-d12}            // レジスタの復帰
414     VSTMIA      r0,{s0-s11}         // 結果をストア
415     MOV         r0,#1
416     BX          lr                  // 戻る
417 }
418 
419 NN_FUNC_ATTR_PRIVATE_SECTION
420 asm u32
MTX34InvTransposeAsm(MTX34 *,const MTX34 *)421 MTX34InvTransposeAsm(MTX34*, const MTX34* )
422 {
423     VLDMIA      r1,{s0-s2}
424     ADD         r1,#4*4
425     VLDMIA      r1,{s3-s5}
426     ADD         r1,#4*4
427     VLDMIA      r1,{s6-s8}
428 
429     VMUL.F32    s10,s0,s4
430     VMUL.F32    s11,s1,s5
431     VMUL.F32    s12,s2,s3
432     VMUL.F32    s13,s6,s4
433     VMUL.F32    s14,s3,s1
434     VMUL.F32    s15,s0,s7
435 
436     VMUL.F32    s10,s10,s8
437     VMUL.F32    s11,s11,s6
438     VMUL.F32    s12,s12,s7
439 
440     VMLS.F32    s10,s13,s2
441     VMLS.F32    s11,s14,s8
442     VMLS.F32    s12,s15,s5
443 
444     VADD.F32    s10,s10,s11
445     VLDR.F32    s15,=1.0
446     VADD.F32    s10,s10,s12
447 
448     FMRS        r2,s10
449     CMP         r2,#0x80000000
450     CMPNE       r2,#0
451     MOVEQ       r0,#0
452     BXEQ        lr
453 
454     VPUSH       {d8-d12}            // レジスタの保存
455     VDIV.F32    s15,s10
456 
457     VMUL.F32    s16,s4,s8
458     VMUL.F32    s17,s3,s8
459     VMUL.F32    s18,s3,s7
460 
461     VMUL.F32    s19,s1,s8
462     VMUL.F32    s20,s0,s8
463     VMUL.F32    s21,s0,s7
464 
465     VMUL.F32    s22,s1,s5
466     VMUL.F32    s23,s0,s5
467     VMUL.F32    s24,s0,s4
468 
469 
470     VMLS.F32    s16,s7,s5
471     VMLS.F32    s17,s6,s5
472     VMLS.F32    s18,s6,s4
473 
474     VMLS.F32    s19,s7,s2
475     VMLS.F32    s20,s6,s2
476     VMLS.F32    s21,s6,s1
477 
478     VMLS.F32    s22,s4,s2
479     VMLS.F32    s23,s3,s2
480     VMLS.F32    s24,s3,s1
481 
482 
483     VMUL.F32    s0,s16,s15          // m[0][0]
484     VNMUL.F32   s1,s17,s15          // m[0][1]
485     VMUL.F32    s2,s18,s15          // m[0][2]
486 
487     VNMUL.F32   s4,s19,s15          // m[1][0]
488     VMUL.F32    s5,s20,s15          // m[1][1]
489     VNMUL.F32   s6,s21,s15          // m[1][2]
490 
491     VMUL.F32    s8,s22,s15          // m[2][0]
492     VNMUL.F32   s9,s23,s15          // m[2][1]
493     VMUL.F32    s10,s24,s15         // m[2][2]
494 
495     VLDR.F32    s3,=0.0
496     VLDR.F32    s7,=0.0
497     VLDR.F32    s11,=0.0
498 
499     VPOP        {d8-d12}            // レジスタの復帰
500     VSTMIA      r0,{s0-s11}         // 結果をストア
501     MOV         r0,#1
502     BX          lr                  // 戻る
503 
504 }
505 
506 NN_FUNC_ATTR_PRIVATE_SECTION
507 asm MTX34*
MTX34MultTranslateAsm(MTX34 *,const VEC3 *,const MTX34 *)508 MTX34MultTranslateAsm(MTX34*, const VEC3*, const MTX34*)
509 {
510     VLDMIA      r2,{s0-s11}         // レジスタ[S0-S11]に行列pMを全て入れる
511     VLDMIA      r1,{s12-s14}        // レジスタ[S0-S11]にベクトルを全て入れる
512 
513     VADD.F32    s3,s3,s12
514     VADD.F32    s7,s7,s13
515     VADD.F32    s11,s11,s14
516 
517     VSTMIA      r0,{s0-s11}         // 結果をストア
518     BX          lr                  // 戻る
519 }
520 
521 NN_FUNC_ATTR_PRIVATE_SECTION
522 asm MTX34*
MTX34MultTranslateAsm(MTX34 *,const MTX34 *,const VEC3 *)523 MTX34MultTranslateAsm(MTX34*, const MTX34*, const VEC3*)
524 {
525     VLDMIA      r1,{s0-s11}         // レジスタ[S0-S11]に行列pMを全て入れる
526     VLDMIA      r2,{s12-s14}        // レジスタ[S0-S11]にベクトルを全て入れる
527 
528     VMLA.F32    s3,s0,s12
529     VMLA.F32    s7,s4,s12
530     VMLA.F32    s11,s8,s12
531 
532     VMLA.F32    s3,s1,s13
533     VMLA.F32    s7,s5,s13
534     VMLA.F32    s11,s9,s13
535 
536     VMLA.F32    s3,s2,s14
537     VMLA.F32    s7,s6,s14
538     VMLA.F32    s11,s10,s14
539 
540     VSTMIA      r0,{s0-s11}         // 結果をストア
541     BX          lr                  // 戻る
542 
543 }
544 
545 NN_FUNC_ATTR_PRIVATE_SECTION
VEC3TransformAsm(VEC3 *,const MTX34 *,const VEC3 *)546 asm VEC3* VEC3TransformAsm(VEC3* , const MTX34* , const VEC3* )
547 {
548     VLDMIA      r1,{s0-s11}         // レジスタ[S0-S11]に行列pMを全て入れる
549     VLDMIA      r2,{s12-s14}        // レジスタ[S0-S11]にベクトルを全て入れる
550 
551     VMLA.F32    s3,s0,s12
552     VMLA.F32    s7,s4,s12
553     VMLA.F32    s11,s8,s12
554 
555     VMLA.F32    s3,s1,s13
556     VMLA.F32    s7,s5,s13
557     VMLA.F32    s11,s9,s13
558 
559     VMLA.F32    s3,s2,s14
560     VMLA.F32    s7,s6,s14
561     VMLA.F32    s11,s10,s14
562 
563     VSTR.F32    s3,[r0,#0]
564     VSTR.F32    s7,[r0,#4]
565     VSTR.F32    s11,[r0,#8]         // 結果をストア
566     BX          lr                  // 戻る
567 
568 }
569 
570 NN_FUNC_ATTR_PRIVATE_SECTION
571 asm MTX34*
MTX34TransposeAsm(MTX34 *,const MTX34 *)572 MTX34TransposeAsm(MTX34* , const MTX34* )
573 {
574     VLDR.F32    s0,[r1,#0*16+0*4]
575     VLDR.F32    s1,[r1,#1*16+0*4]
576     VLDR.F32    s2,[r1,#2*16+0*4]
577     VLDR.F32    s3,=0.0
578     VLDR.F32    s4,[r1,#0*16+1*4]
579     VLDR.F32    s5,[r1,#1*16+1*4]
580     VLDR.F32    s6,[r1,#2*16+1*4]
581     VLDR.F32    s7,=0.0
582     VLDR.F32    s8,[r1,#0*16+2*4]
583     VLDR.F32    s9,[r1,#1*16+2*4]
584     VLDR.F32    s10,[r1,#2*16+2*4]
585     VLDR.F32    s11,=0.0
586 
587     VSTMIA      r0,{s0-s11}         // 結果をストア
588     BX          lr                  // 戻る
589 }
590 
591 NN_FUNC_ATTR_PRIVATE_SECTION
592 asm MTX34*
MTX34ScaleAsm(MTX34 *,const VEC3 *)593 MTX34ScaleAsm(MTX34* , const VEC3* )
594 {
595     VLDR.F32    s0,[r1,#0]
596     VLDR.F32    s1,=0.0
597     VLDR.F32    s2,=0.0
598     VLDR.F32    s3,=0.0
599     VLDR.F32    s4,=0.0
600     VLDR.F32    s5,[r1,#4]
601     VLDR.F32    s6,=0.0
602     VLDR.F32    s7,=0.0
603     VLDR.F32    s8,=0.0
604     VLDR.F32    s9,=0.0
605     VLDR.F32    s10,[r1,#8]
606     VLDR.F32    s11,=0.0
607 
608     VSTMIA      r0,{s0-s11}         // 結果をストア
609     BX          lr                  // 戻る
610 }
611 
612 #include <nn/hw/ARM/codereset.h>
613 
614 }  // namespace ARMv6
615 }  // namespace math
616 }  // namespace nn
617