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