1
1
//! 4x4 matrix inverse
2
2
// Code ported from the `packed_simd` crate
3
3
// Run this code with `cargo test --example matrix_inversion`
4
- #![ feature(
5
- array_chunks,
6
- portable_simd,
7
- ) ]
4
+ #![ feature( array_chunks, portable_simd) ]
8
5
use core_simd:: * ;
9
6
10
7
// Gotta define our own 4x4 matrix since Rust doesn't ship multidim arrays yet :^)
@@ -15,27 +12,29 @@ pub struct Matrix4x4([[f32; 4]; 4]);
15
12
pub fn scalar_inv4x4 ( m : Matrix4x4 ) -> Option < Matrix4x4 > {
16
13
let m = m. 0 ;
17
14
15
+ #[ rustfmt:: skip]
18
16
let mut inv = [
19
- [ // row 0:
17
+ // row 0:
18
+ [
20
19
// 0,0:
21
- m[ 1 ] [ 1 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] -
22
- m[ 1 ] [ 1 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] -
23
- m[ 2 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] +
24
- m[ 2 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] +
25
- m[ 3 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 2 ] [ 3 ] -
26
- m[ 3 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 2 ] [ 2 ] ,
20
+ m[ 1 ] [ 1 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] -
21
+ m[ 1 ] [ 1 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] -
22
+ m[ 2 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] +
23
+ m[ 2 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] +
24
+ m[ 3 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 2 ] [ 3 ] -
25
+ m[ 3 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 2 ] [ 2 ] ,
27
26
// 0,1:
28
- -m[ 0 ] [ 1 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] +
29
- m[ 0 ] [ 1 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] +
30
- m[ 2 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] -
31
- m[ 2 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] -
27
+ -m[ 0 ] [ 1 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] +
28
+ m[ 0 ] [ 1 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] +
29
+ m[ 2 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] -
30
+ m[ 2 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] -
32
31
m[ 3 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 2 ] [ 3 ] +
33
32
m[ 3 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 2 ] [ 2 ] ,
34
33
// 0,2:
35
- m[ 0 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] -
36
- m[ 0 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] -
37
- m[ 1 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] +
38
- m[ 1 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] +
34
+ m[ 0 ] [ 1 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] -
35
+ m[ 0 ] [ 1 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] -
36
+ m[ 1 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] +
37
+ m[ 1 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] +
39
38
m[ 3 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 1 ] [ 3 ] -
40
39
m[ 3 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 2 ] ,
41
40
// 0,3:
@@ -46,26 +45,27 @@ pub fn scalar_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
46
45
m[ 2 ] [ 1 ] * m[ 0 ] [ 2 ] * m[ 1 ] [ 3 ] +
47
46
m[ 2 ] [ 1 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 2 ] ,
48
47
] ,
49
- [ // row 1
48
+ // row 1
49
+ [
50
50
// 1,0:
51
- -m[ 1 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] +
52
- m[ 1 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] +
53
- m[ 2 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] -
54
- m[ 2 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] -
55
- m[ 3 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 2 ] [ 3 ] +
56
- m[ 3 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 2 ] [ 2 ] ,
51
+ -m[ 1 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] +
52
+ m[ 1 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] +
53
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] -
54
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] -
55
+ m[ 3 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 2 ] [ 3 ] +
56
+ m[ 3 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 2 ] [ 2 ] ,
57
57
// 1,1:
58
- m[ 0 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] -
59
- m[ 0 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] -
60
- m[ 2 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] +
61
- m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] +
58
+ m[ 0 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 3 ] -
59
+ m[ 0 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 2 ] -
60
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] +
61
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] +
62
62
m[ 3 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 2 ] [ 3 ] -
63
63
m[ 3 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 2 ] [ 2 ] ,
64
64
// 1,2:
65
- -m[ 0 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] +
66
- m[ 0 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] +
67
- m[ 1 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] -
68
- m[ 1 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] -
65
+ -m[ 0 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 3 ] +
66
+ m[ 0 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 2 ] +
67
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 3 ] -
68
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 2 ] -
69
69
m[ 3 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 1 ] [ 3 ] +
70
70
m[ 3 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 2 ] ,
71
71
// 1,3:
@@ -76,26 +76,27 @@ pub fn scalar_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
76
76
m[ 2 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 1 ] [ 3 ] -
77
77
m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 2 ] ,
78
78
] ,
79
- [ // row 2
79
+ // row 2
80
+ [
80
81
// 2,0:
81
- m[ 1 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 3 ] -
82
- m[ 1 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 1 ] -
83
- m[ 2 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 3 ] +
84
- m[ 2 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 1 ] +
82
+ m[ 1 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 3 ] -
83
+ m[ 1 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 1 ] -
84
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 3 ] +
85
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 1 ] +
85
86
m[ 3 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 2 ] [ 3 ] -
86
87
m[ 3 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 2 ] [ 1 ] ,
87
88
// 2,1:
88
- -m[ 0 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 3 ] +
89
- m[ 0 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 1 ] +
90
- m[ 2 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 3 ] -
91
- m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 1 ] -
89
+ -m[ 0 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 3 ] +
90
+ m[ 0 ] [ 0 ] * m[ 2 ] [ 3 ] * m[ 3 ] [ 1 ] +
91
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 3 ] -
92
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 1 ] -
92
93
m[ 3 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 2 ] [ 3 ] +
93
94
m[ 3 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 2 ] [ 1 ] ,
94
95
// 2,2:
95
- m[ 0 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 3 ] -
96
- m[ 0 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 1 ] -
97
- m[ 1 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 3 ] +
98
- m[ 1 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 1 ] +
96
+ m[ 0 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 3 ] -
97
+ m[ 0 ] [ 0 ] * m[ 1 ] [ 3 ] * m[ 3 ] [ 1 ] -
98
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 3 ] +
99
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 3 ] [ 1 ] +
99
100
m[ 3 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 1 ] [ 3 ] -
100
101
m[ 3 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 1 ] ,
101
102
// 2,3:
@@ -106,26 +107,27 @@ pub fn scalar_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
106
107
m[ 2 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 1 ] [ 3 ] +
107
108
m[ 2 ] [ 0 ] * m[ 0 ] [ 3 ] * m[ 1 ] [ 1 ] ,
108
109
] ,
109
- [ // row 3
110
+ // row 3
111
+ [
110
112
// 3,0:
111
- -m[ 1 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 2 ] +
112
- m[ 1 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 1 ] +
113
- m[ 2 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 2 ] -
114
- m[ 2 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 1 ] -
113
+ -m[ 1 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 2 ] +
114
+ m[ 1 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 1 ] +
115
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 2 ] -
116
+ m[ 2 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 1 ] -
115
117
m[ 3 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 2 ] [ 2 ] +
116
118
m[ 3 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 2 ] [ 1 ] ,
117
119
// 3,1:
118
- m[ 0 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 2 ] -
119
- m[ 0 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 1 ] -
120
- m[ 2 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 2 ] +
121
- m[ 2 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 1 ] +
120
+ m[ 0 ] [ 0 ] * m[ 2 ] [ 1 ] * m[ 3 ] [ 2 ] -
121
+ m[ 0 ] [ 0 ] * m[ 2 ] [ 2 ] * m[ 3 ] [ 1 ] -
122
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 2 ] +
123
+ m[ 2 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 1 ] +
122
124
m[ 3 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 2 ] [ 2 ] -
123
125
m[ 3 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 2 ] [ 1 ] ,
124
126
// 3,2:
125
- -m[ 0 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 2 ] +
126
- m[ 0 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 1 ] +
127
- m[ 1 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 2 ] -
128
- m[ 1 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 1 ] -
127
+ -m[ 0 ] [ 0 ] * m[ 1 ] [ 1 ] * m[ 3 ] [ 2 ] +
128
+ m[ 0 ] [ 0 ] * m[ 1 ] [ 2 ] * m[ 3 ] [ 1 ] +
129
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 3 ] [ 2 ] -
130
+ m[ 1 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 3 ] [ 1 ] -
129
131
m[ 3 ] [ 0 ] * m[ 0 ] [ 1 ] * m[ 1 ] [ 2 ] +
130
132
m[ 3 ] [ 0 ] * m[ 0 ] [ 2 ] * m[ 1 ] [ 1 ] ,
131
133
// 3,3:
@@ -138,9 +140,10 @@ pub fn scalar_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
138
140
] ,
139
141
] ;
140
142
141
- let det = m[ 0 ] [ 0 ] * inv[ 0 ] [ 0 ] + m[ 0 ] [ 1 ] * inv[ 1 ] [ 0 ] +
142
- m[ 0 ] [ 2 ] * inv[ 2 ] [ 0 ] + m[ 0 ] [ 3 ] * inv[ 3 ] [ 0 ] ;
143
- if det == 0. { return None ; }
143
+ let det = m[ 0 ] [ 0 ] * inv[ 0 ] [ 0 ] + m[ 0 ] [ 1 ] * inv[ 1 ] [ 0 ] + m[ 0 ] [ 2 ] * inv[ 2 ] [ 0 ] + m[ 0 ] [ 3 ] * inv[ 3 ] [ 0 ] ;
144
+ if det == 0. {
145
+ return None ;
146
+ }
144
147
145
148
let det_inv = 1. / det;
146
149
@@ -163,76 +166,76 @@ pub fn simd_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
163
166
// 2 argument shuffle, returns an f32x4
164
167
// the first f32x4 is indexes 0..=3
165
168
// the second f32x4 is indexed 4..=7
166
- let tmp1 = f32x4:: shuffle :: < { [ 0 , 1 , 4 , 5 ] } > ( m_0, m_1) ;
167
- let row1 = f32x4:: shuffle :: < { [ 0 , 1 , 4 , 5 ] } > ( m_2, m_3, ) ;
169
+ let tmp1 = f32x4:: shuffle :: < { [ 0 , 1 , 4 , 5 ] } > ( m_0, m_1) ;
170
+ let row1 = f32x4:: shuffle :: < { [ 0 , 1 , 4 , 5 ] } > ( m_2, m_3) ;
168
171
169
- let row0 = f32x4:: shuffle :: < { [ 0 , 2 , 4 , 6 ] } > ( tmp1, row1) ;
170
- let row1 = f32x4:: shuffle :: < { [ 1 , 3 , 5 , 7 ] } > ( row1, tmp1) ;
172
+ let row0 = f32x4:: shuffle :: < { [ 0 , 2 , 4 , 6 ] } > ( tmp1, row1) ;
173
+ let row1 = f32x4:: shuffle :: < { [ 1 , 3 , 5 , 7 ] } > ( row1, tmp1) ;
171
174
172
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 6 , 7 ] } > ( m_0, m_1) ;
173
- let row3 = f32x4:: shuffle :: < { [ 2 , 3 , 6 , 7 ] } > ( m_2, m_3) ;
174
- let row2 = f32x4:: shuffle :: < { [ 0 , 2 , 4 , 6 ] } > ( tmp1, row3) ;
175
- let row3 = f32x4:: shuffle :: < { [ 1 , 3 , 5 , 7 ] } > ( row3, tmp1) ;
175
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 6 , 7 ] } > ( m_0, m_1) ;
176
+ let row3 = f32x4:: shuffle :: < { [ 2 , 3 , 6 , 7 ] } > ( m_2, m_3) ;
177
+ let row2 = f32x4:: shuffle :: < { [ 0 , 2 , 4 , 6 ] } > ( tmp1, row3) ;
178
+ let row3 = f32x4:: shuffle :: < { [ 1 , 3 , 5 , 7 ] } > ( row3, tmp1) ;
176
179
177
180
let tmp1 = row2 * row3;
178
181
// there's no syntax for a 1 arg shuffle yet,
179
182
// so we just pass the same f32x4 twice
180
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
183
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
181
184
182
185
let minor0 = row1 * tmp1;
183
186
let minor1 = row0 * tmp1;
184
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
187
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
185
188
let minor0 = ( row1 * tmp1) - minor0;
186
189
let minor1 = ( row0 * tmp1) - minor1;
187
- let minor1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor1, minor1) ;
190
+ let minor1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor1, minor1) ;
188
191
189
192
let tmp1 = row1 * row2;
190
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
193
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
191
194
let minor0 = ( row3 * tmp1) + minor0;
192
195
let minor3 = row0 * tmp1;
193
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
196
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
194
197
195
198
let minor0 = minor0 - row3 * tmp1;
196
199
let minor3 = row0 * tmp1 - minor3;
197
- let minor3 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor3, minor3) ;
200
+ let minor3 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor3, minor3) ;
198
201
199
- let tmp1 = row3 * f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( row1, row1) ;
200
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
201
- let row2 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( row2, row2) ;
202
+ let tmp1 = row3 * f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( row1, row1) ;
203
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
204
+ let row2 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( row2, row2) ;
202
205
let minor0 = row2 * tmp1 + minor0;
203
206
let minor2 = row0 * tmp1;
204
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
207
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
205
208
let minor0 = minor0 - row2 * tmp1;
206
209
let minor2 = row0 * tmp1 - minor2;
207
- let minor2 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor2, minor2) ;
210
+ let minor2 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( minor2, minor2) ;
208
211
209
212
let tmp1 = row0 * row1;
210
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
213
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
211
214
let minor2 = minor2 + row3 * tmp1;
212
215
let minor3 = row2 * tmp1 - minor3;
213
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
216
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
214
217
let minor2 = row3 * tmp1 - minor2;
215
218
let minor3 = minor3 - row2 * tmp1;
216
219
217
220
let tmp1 = row0 * row3;
218
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
221
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
219
222
let minor1 = minor1 - row2 * tmp1;
220
223
let minor2 = row1 * tmp1 + minor2;
221
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
224
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
222
225
let minor1 = row2 * tmp1 + minor1;
223
226
let minor2 = minor2 - row1 * tmp1;
224
227
225
228
let tmp1 = row0 * row2;
226
- let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
229
+ let tmp1 = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( tmp1, tmp1) ;
227
230
let minor1 = row3 * tmp1 + minor1;
228
231
let minor3 = minor3 - row1 * tmp1;
229
- let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
232
+ let tmp1 = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( tmp1, tmp1) ;
230
233
let minor1 = minor1 - row3 * tmp1;
231
234
let minor3 = row1 * tmp1 + minor3;
232
235
233
236
let det = row0 * minor0;
234
- let det = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( det, det) + det;
235
- let det = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( det, det) + det;
237
+ let det = f32x4:: shuffle :: < { [ 2 , 3 , 0 , 1 ] } > ( det, det) + det;
238
+ let det = f32x4:: shuffle :: < { [ 1 , 0 , 3 , 2 ] } > ( det, det) + det;
236
239
237
240
if det. horizontal_sum ( ) == 0. {
238
241
return None ;
@@ -256,7 +259,6 @@ pub fn simd_inv4x4(m: Matrix4x4) -> Option<Matrix4x4> {
256
259
Some ( Matrix4x4 ( m) )
257
260
}
258
261
259
-
260
262
#[ cfg( test) ]
261
263
#[ rustfmt:: skip]
262
264
mod tests {
@@ -313,7 +315,6 @@ mod tests {
313
315
}
314
316
}
315
317
316
-
317
318
fn main ( ) {
318
319
// Empty main to make cargo happy
319
320
}
0 commit comments