1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     math_Matrix43.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 <nn/math/math_Matrix43.h>
19 #include <nn/math/ARMv6/math_Matrix43.h>
20 
21 #if !defined(NN_MATH_AS_INLINE)
22 #include <nn/math/inline/math_Matrix43.ipp>
23 #include <nn/math/ARMv6/inline/math_Matrix43.ipp>
24 #endif
25 
26 
27 namespace nn {
28 namespace math {
29 namespace ARMv6 {
30 
31 #include <nn/hw/ARM/code32.h>
32 
33 NN_FUNC_ATTR_PRIVATE_SECTION
34 asm MTX43*
MTX43CopyAsm(MTX43 *,const MTX43 *)35 MTX43CopyAsm(MTX43* , const MTX43*)
36 {
37     CMP         r1,r0           // pとpOutは同じ?
38     BXEQ        lr              // 同じならコピーせず帰る
39     VLDMIA      r1,{s0-s11}     // レジスタ[S0-S11]にpを全て入れる
40     VSTMIA      r0,{s0-s11}     // レジスタ[S0-S11]をpOutに入れる
41     BX          lr
42 }
43 
44 NN_FUNC_ATTR_PRIVATE_SECTION
45 asm MTX43*
MTX43AddAsm(MTX43 *,const MTX43 *,const MTX43 *)46 MTX43AddAsm(MTX43* , const MTX43* , const MTX43* )
47 {
48     VPUSH       {d8-d9}             // レジスタの保存
49     VLDMIA      r2,{s0-s11}         // レジスタ[S0-S11]に行列p2を全て入れる
50     VLDMIA      r1!,{s12-s19}       // レジスタ[S12-S19]に行列p1を入れる
51 
52     VADD.F32    s0,s12,s0
53     VADD.F32    s1,s13,s1
54     VADD.F32    s2,s14,s2
55     VADD.F32    s3,s15,s3
56     VLDMIA      r1,{s12-s15}        // p1の続き
57 
58     VADD.F32    s4,s16,s4
59     VADD.F32    s5,s17,s5
60     VADD.F32    s6,s18,s6
61     VADD.F32    s7,s19,s7
62 
63     VADD.F32    s8,s12,s8
64     VADD.F32    s9,s13,s9
65     VADD.F32    s10,s14,s10
66     VADD.F32    s11,s15,s11
67 
68     VPOP        {d8-d9}             // レジスタの復帰
69     VSTMIA      r0,{s0-s11}         // 結果をストア
70     BX          lr                  // 戻る
71 }
72 
73 NN_FUNC_ATTR_PRIVATE_SECTION
74 asm MTX43*
MTX43MultAsm(MTX43 *,const MTX43 *,const MTX43 *)75 MTX43MultAsm(MTX43*, const MTX43*, const MTX43*)
76 {
77     VPUSH       {d8-d15}            // レジスタの保存
78 
79     VLDR.F32    s9,[r2,#3*3*4]      // 行列p2[3][0]
80     VLDR.F32    s10,[r2,#4+3*3*4]   // 行列p2[3][1]
81     VLDR.F32    s11,[r2,#8+3*3*4]   // 行列p2[3][2]
82 
83     VLDMIA      r1,{s12-s23}        // レジスタ[S12-S23]に行列p1を全て入れる
84     VLDMIA      r2!,{s24-s29}       // レジスタ[S24-S29]に行列p2を入れる
85 
86     VMUL.F32    s0,s12,s24
87     VMUL.F32    s1,s12,s25
88     VMUL.F32    s2,s12,s26
89 
90     VMUL.F32    s3,s15,s24
91     VMUL.F32    s4,s15,s25
92     VMUL.F32    s5,s15,s26
93 
94     VMUL.F32    s6,s18,s24
95     VMUL.F32    s7,s18,s25
96     VMUL.F32    s8,s18,s26
97 
98     VMLA.F32    s9,s21,s24
99     VMLA.F32    s10,s21,s25
100     VMLA.F32    s11,s21,s26
101 
102     VMLA.F32    s0,s13,s27
103     VMLA.F32    s1,s13,s28
104     VMLA.F32    s2,s13,s29
105 
106     VMLA.F32    s3,s16,s27
107     VMLA.F32    s4,s16,s28
108     VMLA.F32    s5,s16,s29
109 
110     VLDMIA      r2,{s24-s26}        // p2の続き
111 
112     VMLA.F32    s6,s19,s27
113     VMLA.F32    s7,s19,s28
114     VMLA.F32    s8,s19,s29
115 
116     VMLA.F32    s9,s22,s27
117     VMLA.F32    s10,s22,s28
118     VMLA.F32    s11,s22,s29
119 
120     VMLA.F32    s0,s14,s24
121     VMLA.F32    s1,s14,s25
122     VMLA.F32    s2,s14,s26
123 
124     VMLA.F32    s3,s17,s24
125     VMLA.F32    s4,s17,s25
126     VMLA.F32    s5,s17,s26
127 
128     VMLA.F32    s6,s20,s24
129     VMLA.F32    s7,s20,s25
130     VMLA.F32    s8,s20,s26
131 
132     VMLA.F32    s9,s23,s24
133     VMLA.F32    s10,s23,s25
134     VMLA.F32    s11,s23,s26
135 
136     VPOP        {d8-d15}            // レジスタ復帰
137     VSTMIA      r0,{s0-s11}         // 結果をストア
138     BX          lr                  // 戻る
139 
140 }
141 
142 NN_FUNC_ATTR_PRIVATE_SECTION
143 asm MTX43*
MTX43MultAsm(MTX43 *,const MTX43 *,f32)144 MTX43MultAsm(MTX43*, const MTX43*, f32)
145 {
146     VLDMIA      r1,{s1-s12}        // レジスタ[S1-S12]に行列pを入れる
147 
148     VMUL.F32    s1,s1,s0
149     VMUL.F32    s2,s2,s0
150     VMUL.F32    s3,s3,s0
151     VMUL.F32    s4,s4,s0
152 
153     VMUL.F32    s5,s5,s0
154     VMUL.F32    s6,s6,s0
155     VMUL.F32    s7,s7,s0
156     VMUL.F32    s8,s8,s0
157 
158     VMUL.F32    s9,s9,s0
159     VMUL.F32    s10,s10,s0
160     VMUL.F32    s11,s11,s0
161     VMUL.F32    s12,s12,s0
162 
163     VSTMIA      r0,{s1-s12}         // 結果をストア
164     BX          lr                  // 戻る
165 
166 }
167 
168 #include <nn/hw/ARM/codereset.h>
169 
170 }  // namespace ARMv6
171 }  // namespace math
172 }  // namespace nn
173