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