Project Ne10
An Open Optimized Software Library Project for the ARM Architecture
Loading...
Searching...
No Matches
NE10_detmat.c.h
1/*
2 * Copyright 2011-15 ARM Limited and Contributors.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of ARM Limited nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
15 *
16 * THIS SOFTWARE IS PROVIDED BY ARM LIMITED AND CONTRIBUTORS "AS IS" AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL ARM LIMITED AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26 */
27
28/*
29 * NE10 Library : math/NE10_detmat.c.h
30 */
31
32#ifndef __NE10_DETMAT_C_H__
33#define __NE10_DETMAT_C_H__
34
35#include "NE10_types.h"
36#include "macros.h"
37
38#include <assert.h>
39
40static inline ne10_float32_t DET2x2( ne10_mat2x2f_t * mat )
41{
42 // 2x2 matrix layout
43 // c1r1 c2r1
44 // c1r2 c2r2
45
46 return ( (mat->c1.r1 * mat->c2.r2)
47 -(mat->c2.r1 * mat->c1.r2) );
48}
49
50static inline ne10_float32_t DET3x3( ne10_mat3x3f_t * mat )
51{
52 // 3x3 matrix layout
53 // c1r1 c2r1 c3r1
54 // c1r2 c2r2 c3r2
55 // c1r3 c2r3 c3r3
56
57 ne10_mat2x2f_t subm11 = { {mat->c2.r2, mat->c2.r3}, {mat->c3.r2, mat->c3.r3} };
58 ne10_mat2x2f_t subm21 = { {mat->c1.r2, mat->c1.r3}, {mat->c3.r2, mat->c3.r3} };
59 ne10_mat2x2f_t subm31 = { {mat->c1.r2, mat->c1.r3}, {mat->c2.r2, mat->c2.r3} };
60 return (mat->c1.r1*DET2x2( &subm11 ))
61 - (mat->c2.r1*DET2x2( &subm21 ))
62 + (mat->c3.r1*DET2x2( &subm31 ));
63}
64
65static inline ne10_float32_t DET4x4( ne10_mat4x4f_t * mat )
66{
67 // 4x4 matrix layout
68 // c1r1 c2r1 c3r1 c4r1
69 // c1r2 c2r2 c3r2 c4r2
70 // c1r3 c2r3 c3r3 c4r3
71 // c1r4 c2r4 c3r4 c4r4
72
73 ne10_mat3x3f_t subm11 = { {mat->c2.r2, mat->c2.r3, mat->c2.r4},
74 {mat->c3.r2, mat->c3.r3, mat->c3.r4},
75 {mat->c4.r2, mat->c4.r3, mat->c4.r4} };
76
77 ne10_mat3x3f_t subm21 = { {mat->c1.r2, mat->c1.r3, mat->c1.r4},
78 {mat->c3.r2, mat->c3.r3, mat->c3.r4},
79 {mat->c4.r2, mat->c4.r3, mat->c4.r4} };
80
81 ne10_mat3x3f_t subm31 = { {mat->c1.r2, mat->c1.r3, mat->c1.r4},
82 {mat->c2.r2, mat->c2.r3, mat->c2.r4},
83 {mat->c4.r2, mat->c4.r3, mat->c4.r4} };
84
85 ne10_mat3x3f_t subm41 = { {mat->c1.r2, mat->c1.r3, mat->c1.r4},
86 {mat->c2.r2, mat->c2.r3, mat->c2.r4},
87 {mat->c3.r2, mat->c3.r3, mat->c3.r4} };
88
89 return (mat->c1.r1*DET3x3( &subm11 ))
90 - (mat->c2.r1*DET3x3( &subm21 ))
91 + (mat->c3.r1*DET3x3( &subm31 ))
92 - (mat->c4.r1*DET3x3( &subm41 ));
93}
94
95
96
97
98#endif