1 /* Copyright (c) 2014-2017 Apple, Inc. All rights reserved.
2 *
3 * Function Result
4 * ------------------------------------------------------------------
5 *
6 * simd_diagonal_matrix(x) A square matrix with the vector x
7 * as its diagonal.
8 *
9 * simd_matrix(c0, c1, ... ) A matrix with the specified vectors
10 * as columns.
11 *
12 * simd_matrix_from_rows(r0, r1, ... ) A matrix with the specified vectors
13 * as rows.
14 *
15 * simd_mul(a,x) Scalar product a*x.
16 *
17 * simd_linear_combination(a,x,b,y) a*x + b*y.
18 *
19 * simd_add(x,y) Macro wrapping linear_combination
20 * to compute x + y.
21 *
22 * simd_sub(x,y) Macro wrapping linear_combination
23 * to compute x - y.
24 *
25 * simd_transpose(x) Transpose of the matrix x.
26 *
27 * simd_trace(x) Trace of the matrix x.
28 *
29 * simd_determinant(x) Determinant of the matrix x.
30 *
31 * simd_inverse(x) Inverse of x if x is non-singular. If
32 * x is singular, the result is undefined.
33 *
34 * simd_mul(x,y) If x is a matrix, returns the matrix
35 * product x*y, where y is either a matrix
36 * or a column vector. If x is a vector,
37 * returns the product x*y where x is
38 * interpreted as a row vector.
39 *
40 * simd_equal(x,y) Returns true if and only if every
41 * element of x is exactly equal to the
42 * corresponding element of y.
43 *
44 * simd_almost_equal_elements(x,y,tol)
45 * Returns true if and only if for each
46 * entry xij in x, the corresponding
47 * element yij in y satisfies
48 * |xij - yij| <= tol.
49 *
50 * simd_almost_equal_elements_relative(x,y,tol)
51 * Returns true if and only if for each
52 * entry xij in x, the corresponding
53 * element yij in y satisfies
54 * |xij - yij| <= tol*|xij|.
55 *
56 * The header also defines a few useful global matrix objects:
57 * matrix_identity_floatNxM and matrix_identity_doubleNxM, may be used to get
58 * an identity matrix of the specified size.
59 *
60 * In C++, we are able to use namespacing to make the functions more concise;
61 * we also overload some common arithmetic operators to work with the matrix
62 * types:
63 *
64 * C++ Function Equivalent C Function
65 * --------------------------------------------------------------------
66 * simd::inverse simd_inverse
67 * simd::transpose simd_transpose
68 * operator+ simd_add
69 * operator- simd_sub
70 * operator+= N/A
71 * operator-= N/A
72 * operator* simd_mul or simd_mul
73 * operator*= simd_mul or simd_mul
74 * operator== simd_equal
75 * operator!= !simd_equal
76 * simd::almost_equal_elements simd_almost_equal_elements
77 * simd::almost_equal_elements_relative simd_almost_equal_elements_relative
78 *
79 * <simd/matrix_types.h> provides constructors for C++ matrix types.
80 */
81
82 #ifndef SIMD_MATRIX_HEADER
83 #define SIMD_MATRIX_HEADER
84
85 #include <simd/base.h>
86 #if SIMD_COMPILER_HAS_REQUIRED_FEATURES
87 #include <simd/matrix_types.h>
88 #include <simd/geometry.h>
89 #include <simd/extern.h>
90 #include <simd/logic.h>
91
92 #ifdef __cplusplus
93 extern "C" {
94 #endif
95
96 extern const simd_float2x2 matrix_identity_float2x2 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
97 extern const simd_float3x3 matrix_identity_float3x3 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
98 extern const simd_float4x4 matrix_identity_float4x4 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
99 extern const simd_double2x2 matrix_identity_double2x2 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
100 extern const simd_double3x3 matrix_identity_double3x3 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
101 extern const simd_double4x4 matrix_identity_double4x4 __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
102
103 static simd_float2x2 SIMD_CFUNC simd_diagonal_matrix(simd_float2 __x);
104 static simd_float3x3 SIMD_CFUNC simd_diagonal_matrix(simd_float3 __x);
105 static simd_float4x4 SIMD_CFUNC simd_diagonal_matrix(simd_float4 __x);
106 static simd_double2x2 SIMD_CFUNC simd_diagonal_matrix(simd_double2 __x);
107 static simd_double3x3 SIMD_CFUNC simd_diagonal_matrix(simd_double3 __x);
108 static simd_double4x4 SIMD_CFUNC simd_diagonal_matrix(simd_double4 __x);
109 #define matrix_from_diagonal simd_diagonal_matrix
110
111 static simd_float2x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1);
112 static simd_float3x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1, simd_float2 col2);
113 static simd_float4x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1, simd_float2 col2, simd_float2 col3);
114 static simd_float2x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1);
115 static simd_float3x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1, simd_float3 col2);
116 static simd_float4x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1, simd_float3 col2, simd_float3 col3);
117 static simd_float2x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1);
118 static simd_float3x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1, simd_float4 col2);
119 static simd_float4x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1, simd_float4 col2, simd_float4 col3);
120 static simd_double2x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1);
121 static simd_double3x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1, simd_double2 col2);
122 static simd_double4x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1, simd_double2 col2, simd_double2 col3);
123 static simd_double2x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1);
124 static simd_double3x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1, simd_double3 col2);
125 static simd_double4x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1, simd_double3 col2, simd_double3 col3);
126 static simd_double2x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1);
127 static simd_double3x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1, simd_double4 col2);
128 static simd_double4x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1, simd_double4 col2, simd_double4 col3);
129 #define matrix_from_columns simd_matrix
130
131 static simd_float2x2 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1);
132 static simd_float2x3 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1, simd_float2 row2);
133 static simd_float2x4 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1, simd_float2 row2, simd_float2 row3);
134 static simd_float3x2 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1);
135 static simd_float3x3 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1, simd_float3 row2);
136 static simd_float3x4 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1, simd_float3 row2, simd_float3 row3);
137 static simd_float4x2 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1);
138 static simd_float4x3 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1, simd_float4 row2);
139 static simd_float4x4 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1, simd_float4 row2, simd_float4 row3);
140 static simd_double2x2 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1);
141 static simd_double2x3 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1, simd_double2 row2);
142 static simd_double2x4 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1, simd_double2 row2, simd_double2 row3);
143 static simd_double3x2 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1);
144 static simd_double3x3 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1, simd_double3 row2);
145 static simd_double3x4 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1, simd_double3 row2, simd_double3 row3);
146 static simd_double4x2 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1);
147 static simd_double4x3 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1, simd_double4 row2);
148 static simd_double4x4 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1, simd_double4 row2, simd_double4 row3);
149 #define matrix_from_rows simd_matrix_from_rows
150
151 static simd_float3x3 SIMD_NOINLINE simd_matrix3x3(simd_quatf q);
152 static simd_float4x4 SIMD_NOINLINE simd_matrix4x4(simd_quatf q);
153 static simd_double3x3 SIMD_NOINLINE simd_matrix3x3(simd_quatd q);
154 static simd_double4x4 SIMD_NOINLINE simd_matrix4x4(simd_quatd q);
155
156 static simd_float2x2 SIMD_CFUNC simd_mul(float __a, simd_float2x2 __x);
157 static simd_float3x2 SIMD_CFUNC simd_mul(float __a, simd_float3x2 __x);
158 static simd_float4x2 SIMD_CFUNC simd_mul(float __a, simd_float4x2 __x);
159 static simd_float2x3 SIMD_CFUNC simd_mul(float __a, simd_float2x3 __x);
160 static simd_float3x3 SIMD_CFUNC simd_mul(float __a, simd_float3x3 __x);
161 static simd_float4x3 SIMD_CFUNC simd_mul(float __a, simd_float4x3 __x);
162 static simd_float2x4 SIMD_CFUNC simd_mul(float __a, simd_float2x4 __x);
163 static simd_float3x4 SIMD_CFUNC simd_mul(float __a, simd_float3x4 __x);
164 static simd_float4x4 SIMD_CFUNC simd_mul(float __a, simd_float4x4 __x);
165 static simd_double2x2 SIMD_CFUNC simd_mul(double __a, simd_double2x2 __x);
166 static simd_double3x2 SIMD_CFUNC simd_mul(double __a, simd_double3x2 __x);
167 static simd_double4x2 SIMD_CFUNC simd_mul(double __a, simd_double4x2 __x);
168 static simd_double2x3 SIMD_CFUNC simd_mul(double __a, simd_double2x3 __x);
169 static simd_double3x3 SIMD_CFUNC simd_mul(double __a, simd_double3x3 __x);
170 static simd_double4x3 SIMD_CFUNC simd_mul(double __a, simd_double4x3 __x);
171 static simd_double2x4 SIMD_CFUNC simd_mul(double __a, simd_double2x4 __x);
172 static simd_double3x4 SIMD_CFUNC simd_mul(double __a, simd_double3x4 __x);
173 static simd_double4x4 SIMD_CFUNC simd_mul(double __a, simd_double4x4 __x);
174
175 static simd_float2x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x2 __x, float __b, simd_float2x2 __y);
176 static simd_float3x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x2 __x, float __b, simd_float3x2 __y);
177 static simd_float4x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x2 __x, float __b, simd_float4x2 __y);
178 static simd_float2x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x3 __x, float __b, simd_float2x3 __y);
179 static simd_float3x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x3 __x, float __b, simd_float3x3 __y);
180 static simd_float4x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x3 __x, float __b, simd_float4x3 __y);
181 static simd_float2x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x4 __x, float __b, simd_float2x4 __y);
182 static simd_float3x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x4 __x, float __b, simd_float3x4 __y);
183 static simd_float4x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x4 __x, float __b, simd_float4x4 __y);
184 static simd_double2x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x2 __x, double __b, simd_double2x2 __y);
185 static simd_double3x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x2 __x, double __b, simd_double3x2 __y);
186 static simd_double4x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x2 __x, double __b, simd_double4x2 __y);
187 static simd_double2x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x3 __x, double __b, simd_double2x3 __y);
188 static simd_double3x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x3 __x, double __b, simd_double3x3 __y);
189 static simd_double4x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x3 __x, double __b, simd_double4x3 __y);
190 static simd_double2x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x4 __x, double __b, simd_double2x4 __y);
191 static simd_double3x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x4 __x, double __b, simd_double3x4 __y);
192 static simd_double4x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x4 __x, double __b, simd_double4x4 __y);
193 #define matrix_linear_combination simd_linear_combination
194
195 static simd_float2x2 SIMD_CFUNC simd_add(simd_float2x2 __x, simd_float2x2 __y);
196 static simd_float3x2 SIMD_CFUNC simd_add(simd_float3x2 __x, simd_float3x2 __y);
197 static simd_float4x2 SIMD_CFUNC simd_add(simd_float4x2 __x, simd_float4x2 __y);
198 static simd_float2x3 SIMD_CFUNC simd_add(simd_float2x3 __x, simd_float2x3 __y);
199 static simd_float3x3 SIMD_CFUNC simd_add(simd_float3x3 __x, simd_float3x3 __y);
200 static simd_float4x3 SIMD_CFUNC simd_add(simd_float4x3 __x, simd_float4x3 __y);
201 static simd_float2x4 SIMD_CFUNC simd_add(simd_float2x4 __x, simd_float2x4 __y);
202 static simd_float3x4 SIMD_CFUNC simd_add(simd_float3x4 __x, simd_float3x4 __y);
203 static simd_float4x4 SIMD_CFUNC simd_add(simd_float4x4 __x, simd_float4x4 __y);
204 static simd_double2x2 SIMD_CFUNC simd_add(simd_double2x2 __x, simd_double2x2 __y);
205 static simd_double3x2 SIMD_CFUNC simd_add(simd_double3x2 __x, simd_double3x2 __y);
206 static simd_double4x2 SIMD_CFUNC simd_add(simd_double4x2 __x, simd_double4x2 __y);
207 static simd_double2x3 SIMD_CFUNC simd_add(simd_double2x3 __x, simd_double2x3 __y);
208 static simd_double3x3 SIMD_CFUNC simd_add(simd_double3x3 __x, simd_double3x3 __y);
209 static simd_double4x3 SIMD_CFUNC simd_add(simd_double4x3 __x, simd_double4x3 __y);
210 static simd_double2x4 SIMD_CFUNC simd_add(simd_double2x4 __x, simd_double2x4 __y);
211 static simd_double3x4 SIMD_CFUNC simd_add(simd_double3x4 __x, simd_double3x4 __y);
212 static simd_double4x4 SIMD_CFUNC simd_add(simd_double4x4 __x, simd_double4x4 __y);
213 #define matrix_add simd_add
214
215 static simd_float2x2 SIMD_CFUNC simd_sub(simd_float2x2 __x, simd_float2x2 __y);
216 static simd_float3x2 SIMD_CFUNC simd_sub(simd_float3x2 __x, simd_float3x2 __y);
217 static simd_float4x2 SIMD_CFUNC simd_sub(simd_float4x2 __x, simd_float4x2 __y);
218 static simd_float2x3 SIMD_CFUNC simd_sub(simd_float2x3 __x, simd_float2x3 __y);
219 static simd_float3x3 SIMD_CFUNC simd_sub(simd_float3x3 __x, simd_float3x3 __y);
220 static simd_float4x3 SIMD_CFUNC simd_sub(simd_float4x3 __x, simd_float4x3 __y);
221 static simd_float2x4 SIMD_CFUNC simd_sub(simd_float2x4 __x, simd_float2x4 __y);
222 static simd_float3x4 SIMD_CFUNC simd_sub(simd_float3x4 __x, simd_float3x4 __y);
223 static simd_float4x4 SIMD_CFUNC simd_sub(simd_float4x4 __x, simd_float4x4 __y);
224 static simd_double2x2 SIMD_CFUNC simd_sub(simd_double2x2 __x, simd_double2x2 __y);
225 static simd_double3x2 SIMD_CFUNC simd_sub(simd_double3x2 __x, simd_double3x2 __y);
226 static simd_double4x2 SIMD_CFUNC simd_sub(simd_double4x2 __x, simd_double4x2 __y);
227 static simd_double2x3 SIMD_CFUNC simd_sub(simd_double2x3 __x, simd_double2x3 __y);
228 static simd_double3x3 SIMD_CFUNC simd_sub(simd_double3x3 __x, simd_double3x3 __y);
229 static simd_double4x3 SIMD_CFUNC simd_sub(simd_double4x3 __x, simd_double4x3 __y);
230 static simd_double2x4 SIMD_CFUNC simd_sub(simd_double2x4 __x, simd_double2x4 __y);
231 static simd_double3x4 SIMD_CFUNC simd_sub(simd_double3x4 __x, simd_double3x4 __y);
232 static simd_double4x4 SIMD_CFUNC simd_sub(simd_double4x4 __x, simd_double4x4 __y);
233 #define matrix_sub simd_sub
234
235 static simd_float2x2 SIMD_CFUNC simd_transpose(simd_float2x2 __x);
236 static simd_float2x3 SIMD_CFUNC simd_transpose(simd_float3x2 __x);
237 static simd_float2x4 SIMD_CFUNC simd_transpose(simd_float4x2 __x);
238 static simd_float3x2 SIMD_CFUNC simd_transpose(simd_float2x3 __x);
239 static simd_float3x3 SIMD_CFUNC simd_transpose(simd_float3x3 __x);
240 static simd_float3x4 SIMD_CFUNC simd_transpose(simd_float4x3 __x);
241 static simd_float4x2 SIMD_CFUNC simd_transpose(simd_float2x4 __x);
242 static simd_float4x3 SIMD_CFUNC simd_transpose(simd_float3x4 __x);
243 static simd_float4x4 SIMD_CFUNC simd_transpose(simd_float4x4 __x);
244 static simd_double2x2 SIMD_CFUNC simd_transpose(simd_double2x2 __x);
245 static simd_double2x3 SIMD_CFUNC simd_transpose(simd_double3x2 __x);
246 static simd_double2x4 SIMD_CFUNC simd_transpose(simd_double4x2 __x);
247 static simd_double3x2 SIMD_CFUNC simd_transpose(simd_double2x3 __x);
248 static simd_double3x3 SIMD_CFUNC simd_transpose(simd_double3x3 __x);
249 static simd_double3x4 SIMD_CFUNC simd_transpose(simd_double4x3 __x);
250 static simd_double4x2 SIMD_CFUNC simd_transpose(simd_double2x4 __x);
251 static simd_double4x3 SIMD_CFUNC simd_transpose(simd_double3x4 __x);
252 static simd_double4x4 SIMD_CFUNC simd_transpose(simd_double4x4 __x);
253 #define matrix_transpose simd_transpose
254
255 static float SIMD_CFUNC simd_trace(simd_float2x2 __x);
256 static float SIMD_CFUNC simd_trace(simd_float3x3 __x);
257 static float SIMD_CFUNC simd_trace(simd_float4x4 __x);
258 static double SIMD_CFUNC simd_trace(simd_double2x2 __x);
259 static double SIMD_CFUNC simd_trace(simd_double3x3 __x);
260 static double SIMD_CFUNC simd_trace(simd_double4x4 __x);
261 #define matrix_trace simd_trace
262
263 static float SIMD_CFUNC simd_determinant(simd_float2x2 __x);
264 static float SIMD_CFUNC simd_determinant(simd_float3x3 __x);
265 static float SIMD_CFUNC simd_determinant(simd_float4x4 __x);
266 static double SIMD_CFUNC simd_determinant(simd_double2x2 __x);
267 static double SIMD_CFUNC simd_determinant(simd_double3x3 __x);
268 static double SIMD_CFUNC simd_determinant(simd_double4x4 __x);
269 #define matrix_determinant simd_determinant
270
271 static simd_float2x2 SIMD_CFUNC simd_inverse(simd_float2x2 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
272 static simd_float3x3 SIMD_CFUNC simd_inverse(simd_float3x3 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
273 static simd_float4x4 SIMD_CFUNC simd_inverse(simd_float4x4 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
274 static simd_double2x2 SIMD_CFUNC simd_inverse(simd_double2x2 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
275 static simd_double3x3 SIMD_CFUNC simd_inverse(simd_double3x3 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
276 static simd_double4x4 SIMD_CFUNC simd_inverse(simd_double4x4 __x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0));
277 #define matrix_invert simd_inverse
278
279 static simd_float2 SIMD_CFUNC simd_mul(simd_float2x2 __x, simd_float2 __y);
280 static simd_float2 SIMD_CFUNC simd_mul(simd_float3x2 __x, simd_float3 __y);
281 static simd_float2 SIMD_CFUNC simd_mul(simd_float4x2 __x, simd_float4 __y);
282 static simd_float3 SIMD_CFUNC simd_mul(simd_float2x3 __x, simd_float2 __y);
283 static simd_float3 SIMD_CFUNC simd_mul(simd_float3x3 __x, simd_float3 __y);
284 static simd_float3 SIMD_CFUNC simd_mul(simd_float4x3 __x, simd_float4 __y);
285 static simd_float4 SIMD_CFUNC simd_mul(simd_float2x4 __x, simd_float2 __y);
286 static simd_float4 SIMD_CFUNC simd_mul(simd_float3x4 __x, simd_float3 __y);
287 static simd_float4 SIMD_CFUNC simd_mul(simd_float4x4 __x, simd_float4 __y);
288 static simd_double2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double2 __y);
289 static simd_double2 SIMD_CFUNC simd_mul(simd_double3x2 __x, simd_double3 __y);
290 static simd_double2 SIMD_CFUNC simd_mul(simd_double4x2 __x, simd_double4 __y);
291 static simd_double3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double2 __y);
292 static simd_double3 SIMD_CFUNC simd_mul(simd_double3x3 __x, simd_double3 __y);
293 static simd_double3 SIMD_CFUNC simd_mul(simd_double4x3 __x, simd_double4 __y);
294 static simd_double4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double2 __y);
295 static simd_double4 SIMD_CFUNC simd_mul(simd_double3x4 __x, simd_double3 __y);
296 static simd_double4 SIMD_CFUNC simd_mul(simd_double4x4 __x, simd_double4 __y);
297 static simd_float2 SIMD_CFUNC simd_mul(simd_float2 __x, simd_float2x2 __y);
298 static simd_float3 SIMD_CFUNC simd_mul(simd_float2 __x, simd_float3x2 __y);
299 static simd_float4 SIMD_CFUNC simd_mul(simd_float2 __x, simd_float4x2 __y);
300 static simd_float2 SIMD_CFUNC simd_mul(simd_float3 __x, simd_float2x3 __y);
301 static simd_float3 SIMD_CFUNC simd_mul(simd_float3 __x, simd_float3x3 __y);
302 static simd_float4 SIMD_CFUNC simd_mul(simd_float3 __x, simd_float4x3 __y);
303 static simd_float2 SIMD_CFUNC simd_mul(simd_float4 __x, simd_float2x4 __y);
304 static simd_float3 SIMD_CFUNC simd_mul(simd_float4 __x, simd_float3x4 __y);
305 static simd_float4 SIMD_CFUNC simd_mul(simd_float4 __x, simd_float4x4 __y);
306 static simd_double2 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double2x2 __y);
307 static simd_double3 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double3x2 __y);
308 static simd_double4 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double4x2 __y);
309 static simd_double2 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double2x3 __y);
310 static simd_double3 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double3x3 __y);
311 static simd_double4 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double4x3 __y);
312 static simd_double2 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double2x4 __y);
313 static simd_double3 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double3x4 __y);
314 static simd_double4 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double4x4 __y);
315 static simd_float2x2 SIMD_CFUNC simd_mul(simd_float2x2 __x, simd_float2x2 __y);
316 static simd_float3x2 SIMD_CFUNC simd_mul(simd_float2x2 __x, simd_float3x2 __y);
317 static simd_float4x2 SIMD_CFUNC simd_mul(simd_float2x2 __x, simd_float4x2 __y);
318 static simd_float2x3 SIMD_CFUNC simd_mul(simd_float2x3 __x, simd_float2x2 __y);
319 static simd_float3x3 SIMD_CFUNC simd_mul(simd_float2x3 __x, simd_float3x2 __y);
320 static simd_float4x3 SIMD_CFUNC simd_mul(simd_float2x3 __x, simd_float4x2 __y);
321 static simd_float2x4 SIMD_CFUNC simd_mul(simd_float2x4 __x, simd_float2x2 __y);
322 static simd_float3x4 SIMD_CFUNC simd_mul(simd_float2x4 __x, simd_float3x2 __y);
323 static simd_float4x4 SIMD_CFUNC simd_mul(simd_float2x4 __x, simd_float4x2 __y);
324 static simd_double2x2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double2x2 __y);
325 static simd_double3x2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double3x2 __y);
326 static simd_double4x2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double4x2 __y);
327 static simd_double2x3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double2x2 __y);
328 static simd_double3x3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double3x2 __y);
329 static simd_double4x3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double4x2 __y);
330 static simd_double2x4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double2x2 __y);
331 static simd_double3x4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double3x2 __y);
332 static simd_double4x4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double4x2 __y);
333 static simd_float2x2 SIMD_CFUNC simd_mul(simd_float3x2 __x, simd_float2x3 __y);
334 static simd_float3x2 SIMD_CFUNC simd_mul(simd_float3x2 __x, simd_float3x3 __y);
335 static simd_float4x2 SIMD_CFUNC simd_mul(simd_float3x2 __x, simd_float4x3 __y);
336 static simd_float2x3 SIMD_CFUNC simd_mul(simd_float3x3 __x, simd_float2x3 __y);
337 static simd_float3x3 SIMD_CFUNC simd_mul(simd_float3x3 __x, simd_float3x3 __y);
338 static simd_float4x3 SIMD_CFUNC simd_mul(simd_float3x3 __x, simd_float4x3 __y);
339 static simd_float2x4 SIMD_CFUNC simd_mul(simd_float3x4 __x, simd_float2x3 __y);
340 static simd_float3x4 SIMD_CFUNC simd_mul(simd_float3x4 __x, simd_float3x3 __y);
341 static simd_float4x4 SIMD_CFUNC simd_mul(simd_float3x4 __x, simd_float4x3 __y);
342 static simd_double2x2 SIMD_CFUNC simd_mul(simd_double3x2 __x, simd_double2x3 __y);
343 static simd_double3x2 SIMD_CFUNC simd_mul(simd_double3x2 __x, simd_double3x3 __y);
344 static simd_double4x2 SIMD_CFUNC simd_mul(simd_double3x2 __x, simd_double4x3 __y);
345 static simd_double2x3 SIMD_CFUNC simd_mul(simd_double3x3 __x, simd_double2x3 __y);
346 static simd_double3x3 SIMD_CFUNC simd_mul(simd_double3x3 __x, simd_double3x3 __y);
347 static simd_double4x3 SIMD_CFUNC simd_mul(simd_double3x3 __x, simd_double4x3 __y);
348 static simd_double2x4 SIMD_CFUNC simd_mul(simd_double3x4 __x, simd_double2x3 __y);
349 static simd_double3x4 SIMD_CFUNC simd_mul(simd_double3x4 __x, simd_double3x3 __y);
350 static simd_double4x4 SIMD_CFUNC simd_mul(simd_double3x4 __x, simd_double4x3 __y);
351 static simd_float2x2 SIMD_CFUNC simd_mul(simd_float4x2 __x, simd_float2x4 __y);
352 static simd_float3x2 SIMD_CFUNC simd_mul(simd_float4x2 __x, simd_float3x4 __y);
353 static simd_float4x2 SIMD_CFUNC simd_mul(simd_float4x2 __x, simd_float4x4 __y);
354 static simd_float2x3 SIMD_CFUNC simd_mul(simd_float4x3 __x, simd_float2x4 __y);
355 static simd_float3x3 SIMD_CFUNC simd_mul(simd_float4x3 __x, simd_float3x4 __y);
356 static simd_float4x3 SIMD_CFUNC simd_mul(simd_float4x3 __x, simd_float4x4 __y);
357 static simd_float2x4 SIMD_CFUNC simd_mul(simd_float4x4 __x, simd_float2x4 __y);
358 static simd_float3x4 SIMD_CFUNC simd_mul(simd_float4x4 __x, simd_float3x4 __y);
359 static simd_float4x4 SIMD_CFUNC simd_mul(simd_float4x4 __x, simd_float4x4 __y);
360 static simd_double2x2 SIMD_CFUNC simd_mul(simd_double4x2 __x, simd_double2x4 __y);
361 static simd_double3x2 SIMD_CFUNC simd_mul(simd_double4x2 __x, simd_double3x4 __y);
362 static simd_double4x2 SIMD_CFUNC simd_mul(simd_double4x2 __x, simd_double4x4 __y);
363 static simd_double2x3 SIMD_CFUNC simd_mul(simd_double4x3 __x, simd_double2x4 __y);
364 static simd_double3x3 SIMD_CFUNC simd_mul(simd_double4x3 __x, simd_double3x4 __y);
365 static simd_double4x3 SIMD_CFUNC simd_mul(simd_double4x3 __x, simd_double4x4 __y);
366 static simd_double2x4 SIMD_CFUNC simd_mul(simd_double4x4 __x, simd_double2x4 __y);
367 static simd_double3x4 SIMD_CFUNC simd_mul(simd_double4x4 __x, simd_double3x4 __y);
368 static simd_double4x4 SIMD_CFUNC simd_mul(simd_double4x4 __x, simd_double4x4 __y);
369
370 static simd_bool SIMD_CFUNC simd_equal(simd_float2x2 __x, simd_float2x2 __y);
371 static simd_bool SIMD_CFUNC simd_equal(simd_float2x3 __x, simd_float2x3 __y);
372 static simd_bool SIMD_CFUNC simd_equal(simd_float2x4 __x, simd_float2x4 __y);
373 static simd_bool SIMD_CFUNC simd_equal(simd_float3x2 __x, simd_float3x2 __y);
374 static simd_bool SIMD_CFUNC simd_equal(simd_float3x3 __x, simd_float3x3 __y);
375 static simd_bool SIMD_CFUNC simd_equal(simd_float3x4 __x, simd_float3x4 __y);
376 static simd_bool SIMD_CFUNC simd_equal(simd_float4x2 __x, simd_float4x2 __y);
377 static simd_bool SIMD_CFUNC simd_equal(simd_float4x3 __x, simd_float4x3 __y);
378 static simd_bool SIMD_CFUNC simd_equal(simd_float4x4 __x, simd_float4x4 __y);
379 static simd_bool SIMD_CFUNC simd_equal(simd_double2x2 __x, simd_double2x2 __y);
380 static simd_bool SIMD_CFUNC simd_equal(simd_double2x3 __x, simd_double2x3 __y);
381 static simd_bool SIMD_CFUNC simd_equal(simd_double2x4 __x, simd_double2x4 __y);
382 static simd_bool SIMD_CFUNC simd_equal(simd_double3x2 __x, simd_double3x2 __y);
383 static simd_bool SIMD_CFUNC simd_equal(simd_double3x3 __x, simd_double3x3 __y);
384 static simd_bool SIMD_CFUNC simd_equal(simd_double3x4 __x, simd_double3x4 __y);
385 static simd_bool SIMD_CFUNC simd_equal(simd_double4x2 __x, simd_double4x2 __y);
386 static simd_bool SIMD_CFUNC simd_equal(simd_double4x3 __x, simd_double4x3 __y);
387 static simd_bool SIMD_CFUNC simd_equal(simd_double4x4 __x, simd_double4x4 __y);
388 #define matrix_equal simd_equal
389
390 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float2x2 __x, simd_float2x2 __y, float __tol);
391 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float2x3 __x, simd_float2x3 __y, float __tol);
392 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float2x4 __x, simd_float2x4 __y, float __tol);
393 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float3x2 __x, simd_float3x2 __y, float __tol);
394 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float3x3 __x, simd_float3x3 __y, float __tol);
395 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float3x4 __x, simd_float3x4 __y, float __tol);
396 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float4x2 __x, simd_float4x2 __y, float __tol);
397 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float4x3 __x, simd_float4x3 __y, float __tol);
398 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_float4x4 __x, simd_float4x4 __y, float __tol);
399 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double2x2 __x, simd_double2x2 __y, double __tol);
400 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double2x3 __x, simd_double2x3 __y, double __tol);
401 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double2x4 __x, simd_double2x4 __y, double __tol);
402 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double3x2 __x, simd_double3x2 __y, double __tol);
403 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double3x3 __x, simd_double3x3 __y, double __tol);
404 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double3x4 __x, simd_double3x4 __y, double __tol);
405 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double4x2 __x, simd_double4x2 __y, double __tol);
406 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double4x3 __x, simd_double4x3 __y, double __tol);
407 static simd_bool SIMD_CFUNC simd_almost_equal_elements(simd_double4x4 __x, simd_double4x4 __y, double __tol);
408 #define matrix_almost_equal_elements simd_almost_equal_elements
409
410 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float2x2 __x, simd_float2x2 __y, float __tol);
411 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float2x3 __x, simd_float2x3 __y, float __tol);
412 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float2x4 __x, simd_float2x4 __y, float __tol);
413 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float3x2 __x, simd_float3x2 __y, float __tol);
414 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float3x3 __x, simd_float3x3 __y, float __tol);
415 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float3x4 __x, simd_float3x4 __y, float __tol);
416 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float4x2 __x, simd_float4x2 __y, float __tol);
417 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float4x3 __x, simd_float4x3 __y, float __tol);
418 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_float4x4 __x, simd_float4x4 __y, float __tol);
419 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double2x2 __x, simd_double2x2 __y, double __tol);
420 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double2x3 __x, simd_double2x3 __y, double __tol);
421 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double2x4 __x, simd_double2x4 __y, double __tol);
422 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double3x2 __x, simd_double3x2 __y, double __tol);
423 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double3x3 __x, simd_double3x3 __y, double __tol);
424 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double3x4 __x, simd_double3x4 __y, double __tol);
425 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double4x2 __x, simd_double4x2 __y, double __tol);
426 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double4x3 __x, simd_double4x3 __y, double __tol);
427 static simd_bool SIMD_CFUNC simd_almost_equal_elements_relative(simd_double4x4 __x, simd_double4x4 __y, double __tol);
428 #define matrix_almost_equal_elements_relative simd_almost_equal_elements_relative
429
430 #ifdef __cplusplus
431 } /* extern "C" */
432
433 namespace simd {
434 static SIMD_CPPFUNC float2x2 operator+(const float2x2 x, const float2x2 y) { return float2x2(::simd_linear_combination(1, x, 1, y)); }
435 static SIMD_CPPFUNC float2x3 operator+(const float2x3 x, const float2x3 y) { return float2x3(::simd_linear_combination(1, x, 1, y)); }
436 static SIMD_CPPFUNC float2x4 operator+(const float2x4 x, const float2x4 y) { return float2x4(::simd_linear_combination(1, x, 1, y)); }
437 static SIMD_CPPFUNC float3x2 operator+(const float3x2 x, const float3x2 y) { return float3x2(::simd_linear_combination(1, x, 1, y)); }
438 static SIMD_CPPFUNC float3x3 operator+(const float3x3 x, const float3x3 y) { return float3x3(::simd_linear_combination(1, x, 1, y)); }
439 static SIMD_CPPFUNC float3x4 operator+(const float3x4 x, const float3x4 y) { return float3x4(::simd_linear_combination(1, x, 1, y)); }
440 static SIMD_CPPFUNC float4x2 operator+(const float4x2 x, const float4x2 y) { return float4x2(::simd_linear_combination(1, x, 1, y)); }
441 static SIMD_CPPFUNC float4x3 operator+(const float4x3 x, const float4x3 y) { return float4x3(::simd_linear_combination(1, x, 1, y)); }
442 static SIMD_CPPFUNC float4x4 operator+(const float4x4 x, const float4x4 y) { return float4x4(::simd_linear_combination(1, x, 1, y)); }
443
444 static SIMD_CPPFUNC float2x2 operator-(const float2x2 x, const float2x2 y) { return float2x2(::simd_linear_combination(1, x, -1, y)); }
445 static SIMD_CPPFUNC float2x3 operator-(const float2x3 x, const float2x3 y) { return float2x3(::simd_linear_combination(1, x, -1, y)); }
446 static SIMD_CPPFUNC float2x4 operator-(const float2x4 x, const float2x4 y) { return float2x4(::simd_linear_combination(1, x, -1, y)); }
447 static SIMD_CPPFUNC float3x2 operator-(const float3x2 x, const float3x2 y) { return float3x2(::simd_linear_combination(1, x, -1, y)); }
448 static SIMD_CPPFUNC float3x3 operator-(const float3x3 x, const float3x3 y) { return float3x3(::simd_linear_combination(1, x, -1, y)); }
449 static SIMD_CPPFUNC float3x4 operator-(const float3x4 x, const float3x4 y) { return float3x4(::simd_linear_combination(1, x, -1, y)); }
450 static SIMD_CPPFUNC float4x2 operator-(const float4x2 x, const float4x2 y) { return float4x2(::simd_linear_combination(1, x, -1, y)); }
451 static SIMD_CPPFUNC float4x3 operator-(const float4x3 x, const float4x3 y) { return float4x3(::simd_linear_combination(1, x, -1, y)); }
452 static SIMD_CPPFUNC float4x4 operator-(const float4x4 x, const float4x4 y) { return float4x4(::simd_linear_combination(1, x, -1, y)); }
453
454 static SIMD_CPPFUNC float2x2& operator+=(float2x2& x, const float2x2 y) { x = x + y; return x; }
455 static SIMD_CPPFUNC float2x3& operator+=(float2x3& x, const float2x3 y) { x = x + y; return x; }
456 static SIMD_CPPFUNC float2x4& operator+=(float2x4& x, const float2x4 y) { x = x + y; return x; }
457 static SIMD_CPPFUNC float3x2& operator+=(float3x2& x, const float3x2 y) { x = x + y; return x; }
458 static SIMD_CPPFUNC float3x3& operator+=(float3x3& x, const float3x3 y) { x = x + y; return x; }
459 static SIMD_CPPFUNC float3x4& operator+=(float3x4& x, const float3x4 y) { x = x + y; return x; }
460 static SIMD_CPPFUNC float4x2& operator+=(float4x2& x, const float4x2 y) { x = x + y; return x; }
461 static SIMD_CPPFUNC float4x3& operator+=(float4x3& x, const float4x3 y) { x = x + y; return x; }
462 static SIMD_CPPFUNC float4x4& operator+=(float4x4& x, const float4x4 y) { x = x + y; return x; }
463
464 static SIMD_CPPFUNC float2x2& operator-=(float2x2& x, const float2x2 y) { x = x - y; return x; }
465 static SIMD_CPPFUNC float2x3& operator-=(float2x3& x, const float2x3 y) { x = x - y; return x; }
466 static SIMD_CPPFUNC float2x4& operator-=(float2x4& x, const float2x4 y) { x = x - y; return x; }
467 static SIMD_CPPFUNC float3x2& operator-=(float3x2& x, const float3x2 y) { x = x - y; return x; }
468 static SIMD_CPPFUNC float3x3& operator-=(float3x3& x, const float3x3 y) { x = x - y; return x; }
469 static SIMD_CPPFUNC float3x4& operator-=(float3x4& x, const float3x4 y) { x = x - y; return x; }
470 static SIMD_CPPFUNC float4x2& operator-=(float4x2& x, const float4x2 y) { x = x - y; return x; }
471 static SIMD_CPPFUNC float4x3& operator-=(float4x3& x, const float4x3 y) { x = x - y; return x; }
472 static SIMD_CPPFUNC float4x4& operator-=(float4x4& x, const float4x4 y) { x = x - y; return x; }
473
transpose(const float2x2 x)474 static SIMD_CPPFUNC float2x2 transpose(const float2x2 x) { return ::simd_transpose(x); }
transpose(const float3x2 x)475 static SIMD_CPPFUNC float2x3 transpose(const float3x2 x) { return ::simd_transpose(x); }
transpose(const float4x2 x)476 static SIMD_CPPFUNC float2x4 transpose(const float4x2 x) { return ::simd_transpose(x); }
transpose(const float2x3 x)477 static SIMD_CPPFUNC float3x2 transpose(const float2x3 x) { return ::simd_transpose(x); }
transpose(const float3x3 x)478 static SIMD_CPPFUNC float3x3 transpose(const float3x3 x) { return ::simd_transpose(x); }
transpose(const float4x3 x)479 static SIMD_CPPFUNC float3x4 transpose(const float4x3 x) { return ::simd_transpose(x); }
transpose(const float2x4 x)480 static SIMD_CPPFUNC float4x2 transpose(const float2x4 x) { return ::simd_transpose(x); }
transpose(const float3x4 x)481 static SIMD_CPPFUNC float4x3 transpose(const float3x4 x) { return ::simd_transpose(x); }
transpose(const float4x4 x)482 static SIMD_CPPFUNC float4x4 transpose(const float4x4 x) { return ::simd_transpose(x); }
483
trace(const float2x2 x)484 static SIMD_CPPFUNC float trace(const float2x2 x) { return ::simd_trace(x); }
trace(const float3x3 x)485 static SIMD_CPPFUNC float trace(const float3x3 x) { return ::simd_trace(x); }
trace(const float4x4 x)486 static SIMD_CPPFUNC float trace(const float4x4 x) { return ::simd_trace(x); }
487
determinant(const float2x2 x)488 static SIMD_CPPFUNC float determinant(const float2x2 x) { return ::simd_determinant(x); }
determinant(const float3x3 x)489 static SIMD_CPPFUNC float determinant(const float3x3 x) { return ::simd_determinant(x); }
determinant(const float4x4 x)490 static SIMD_CPPFUNC float determinant(const float4x4 x) { return ::simd_determinant(x); }
491
492 #pragma clang diagnostic push
493 #pragma clang diagnostic ignored "-Wgcc-compat"
inverse(const float2x2 x)494 static SIMD_CPPFUNC float2x2 inverse(const float2x2 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
inverse(const float3x3 x)495 static SIMD_CPPFUNC float3x3 inverse(const float3x3 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
inverse(const float4x4 x)496 static SIMD_CPPFUNC float4x4 inverse(const float4x4 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
497 #pragma clang diagnostic pop
498
499 static SIMD_CPPFUNC float2x2 operator*(const float a, const float2x2 x) { return ::simd_mul(a, x); }
500 static SIMD_CPPFUNC float2x3 operator*(const float a, const float2x3 x) { return ::simd_mul(a, x); }
501 static SIMD_CPPFUNC float2x4 operator*(const float a, const float2x4 x) { return ::simd_mul(a, x); }
502 static SIMD_CPPFUNC float3x2 operator*(const float a, const float3x2 x) { return ::simd_mul(a, x); }
503 static SIMD_CPPFUNC float3x3 operator*(const float a, const float3x3 x) { return ::simd_mul(a, x); }
504 static SIMD_CPPFUNC float3x4 operator*(const float a, const float3x4 x) { return ::simd_mul(a, x); }
505 static SIMD_CPPFUNC float4x2 operator*(const float a, const float4x2 x) { return ::simd_mul(a, x); }
506 static SIMD_CPPFUNC float4x3 operator*(const float a, const float4x3 x) { return ::simd_mul(a, x); }
507 static SIMD_CPPFUNC float4x4 operator*(const float a, const float4x4 x) { return ::simd_mul(a, x); }
508 static SIMD_CPPFUNC float2x2 operator*(const float2x2 x, const float a) { return ::simd_mul(a, x); }
509 static SIMD_CPPFUNC float2x3 operator*(const float2x3 x, const float a) { return ::simd_mul(a, x); }
510 static SIMD_CPPFUNC float2x4 operator*(const float2x4 x, const float a) { return ::simd_mul(a, x); }
511 static SIMD_CPPFUNC float3x2 operator*(const float3x2 x, const float a) { return ::simd_mul(a, x); }
512 static SIMD_CPPFUNC float3x3 operator*(const float3x3 x, const float a) { return ::simd_mul(a, x); }
513 static SIMD_CPPFUNC float3x4 operator*(const float3x4 x, const float a) { return ::simd_mul(a, x); }
514 static SIMD_CPPFUNC float4x2 operator*(const float4x2 x, const float a) { return ::simd_mul(a, x); }
515 static SIMD_CPPFUNC float4x3 operator*(const float4x3 x, const float a) { return ::simd_mul(a, x); }
516 static SIMD_CPPFUNC float4x4 operator*(const float4x4 x, const float a) { return ::simd_mul(a, x); }
517 static SIMD_CPPFUNC float2x2& operator*=(float2x2& x, const float a) { x = ::simd_mul(a, x); return x; }
518 static SIMD_CPPFUNC float2x3& operator*=(float2x3& x, const float a) { x = ::simd_mul(a, x); return x; }
519 static SIMD_CPPFUNC float2x4& operator*=(float2x4& x, const float a) { x = ::simd_mul(a, x); return x; }
520 static SIMD_CPPFUNC float3x2& operator*=(float3x2& x, const float a) { x = ::simd_mul(a, x); return x; }
521 static SIMD_CPPFUNC float3x3& operator*=(float3x3& x, const float a) { x = ::simd_mul(a, x); return x; }
522 static SIMD_CPPFUNC float3x4& operator*=(float3x4& x, const float a) { x = ::simd_mul(a, x); return x; }
523 static SIMD_CPPFUNC float4x2& operator*=(float4x2& x, const float a) { x = ::simd_mul(a, x); return x; }
524 static SIMD_CPPFUNC float4x3& operator*=(float4x3& x, const float a) { x = ::simd_mul(a, x); return x; }
525 static SIMD_CPPFUNC float4x4& operator*=(float4x4& x, const float a) { x = ::simd_mul(a, x); return x; }
526
527 static SIMD_CPPFUNC float2 operator*(const float2 x, const float2x2 y) { return ::simd_mul(x, y); }
528 static SIMD_CPPFUNC float3 operator*(const float2 x, const float3x2 y) { return ::simd_mul(x, y); }
529 static SIMD_CPPFUNC float4 operator*(const float2 x, const float4x2 y) { return ::simd_mul(x, y); }
530 static SIMD_CPPFUNC float2 operator*(const float3 x, const float2x3 y) { return ::simd_mul(x, y); }
531 static SIMD_CPPFUNC float3 operator*(const float3 x, const float3x3 y) { return ::simd_mul(x, y); }
532 static SIMD_CPPFUNC float4 operator*(const float3 x, const float4x3 y) { return ::simd_mul(x, y); }
533 static SIMD_CPPFUNC float2 operator*(const float4 x, const float2x4 y) { return ::simd_mul(x, y); }
534 static SIMD_CPPFUNC float3 operator*(const float4 x, const float3x4 y) { return ::simd_mul(x, y); }
535 static SIMD_CPPFUNC float4 operator*(const float4 x, const float4x4 y) { return ::simd_mul(x, y); }
536 static SIMD_CPPFUNC float2 operator*(const float2x2 x, const float2 y) { return ::simd_mul(x, y); }
537 static SIMD_CPPFUNC float2 operator*(const float3x2 x, const float3 y) { return ::simd_mul(x, y); }
538 static SIMD_CPPFUNC float2 operator*(const float4x2 x, const float4 y) { return ::simd_mul(x, y); }
539 static SIMD_CPPFUNC float3 operator*(const float2x3 x, const float2 y) { return ::simd_mul(x, y); }
540 static SIMD_CPPFUNC float3 operator*(const float3x3 x, const float3 y) { return ::simd_mul(x, y); }
541 static SIMD_CPPFUNC float3 operator*(const float4x3 x, const float4 y) { return ::simd_mul(x, y); }
542 static SIMD_CPPFUNC float4 operator*(const float2x4 x, const float2 y) { return ::simd_mul(x, y); }
543 static SIMD_CPPFUNC float4 operator*(const float3x4 x, const float3 y) { return ::simd_mul(x, y); }
544 static SIMD_CPPFUNC float4 operator*(const float4x4 x, const float4 y) { return ::simd_mul(x, y); }
545 static SIMD_CPPFUNC float2& operator*=(float2& x, const float2x2 y) { x = ::simd_mul(x, y); return x; }
546 static SIMD_CPPFUNC float3& operator*=(float3& x, const float3x3 y) { x = ::simd_mul(x, y); return x; }
547 static SIMD_CPPFUNC float4& operator*=(float4& x, const float4x4 y) { x = ::simd_mul(x, y); return x; }
548
549 static SIMD_CPPFUNC float2x2 operator*(const float2x2 x, const float2x2 y) { return ::simd_mul(x, y); }
550 static SIMD_CPPFUNC float3x2 operator*(const float2x2 x, const float3x2 y) { return ::simd_mul(x, y); }
551 static SIMD_CPPFUNC float4x2 operator*(const float2x2 x, const float4x2 y) { return ::simd_mul(x, y); }
552 static SIMD_CPPFUNC float2x3 operator*(const float2x3 x, const float2x2 y) { return ::simd_mul(x, y); }
553 static SIMD_CPPFUNC float3x3 operator*(const float2x3 x, const float3x2 y) { return ::simd_mul(x, y); }
554 static SIMD_CPPFUNC float4x3 operator*(const float2x3 x, const float4x2 y) { return ::simd_mul(x, y); }
555 static SIMD_CPPFUNC float2x4 operator*(const float2x4 x, const float2x2 y) { return ::simd_mul(x, y); }
556 static SIMD_CPPFUNC float3x4 operator*(const float2x4 x, const float3x2 y) { return ::simd_mul(x, y); }
557 static SIMD_CPPFUNC float4x4 operator*(const float2x4 x, const float4x2 y) { return ::simd_mul(x, y); }
558 static SIMD_CPPFUNC float2x2 operator*(const float3x2 x, const float2x3 y) { return ::simd_mul(x, y); }
559 static SIMD_CPPFUNC float3x2 operator*(const float3x2 x, const float3x3 y) { return ::simd_mul(x, y); }
560 static SIMD_CPPFUNC float4x2 operator*(const float3x2 x, const float4x3 y) { return ::simd_mul(x, y); }
561 static SIMD_CPPFUNC float2x3 operator*(const float3x3 x, const float2x3 y) { return ::simd_mul(x, y); }
562 static SIMD_CPPFUNC float3x3 operator*(const float3x3 x, const float3x3 y) { return ::simd_mul(x, y); }
563 static SIMD_CPPFUNC float4x3 operator*(const float3x3 x, const float4x3 y) { return ::simd_mul(x, y); }
564 static SIMD_CPPFUNC float2x4 operator*(const float3x4 x, const float2x3 y) { return ::simd_mul(x, y); }
565 static SIMD_CPPFUNC float3x4 operator*(const float3x4 x, const float3x3 y) { return ::simd_mul(x, y); }
566 static SIMD_CPPFUNC float4x4 operator*(const float3x4 x, const float4x3 y) { return ::simd_mul(x, y); }
567 static SIMD_CPPFUNC float2x2 operator*(const float4x2 x, const float2x4 y) { return ::simd_mul(x, y); }
568 static SIMD_CPPFUNC float3x2 operator*(const float4x2 x, const float3x4 y) { return ::simd_mul(x, y); }
569 static SIMD_CPPFUNC float4x2 operator*(const float4x2 x, const float4x4 y) { return ::simd_mul(x, y); }
570 static SIMD_CPPFUNC float2x3 operator*(const float4x3 x, const float2x4 y) { return ::simd_mul(x, y); }
571 static SIMD_CPPFUNC float3x3 operator*(const float4x3 x, const float3x4 y) { return ::simd_mul(x, y); }
572 static SIMD_CPPFUNC float4x3 operator*(const float4x3 x, const float4x4 y) { return ::simd_mul(x, y); }
573 static SIMD_CPPFUNC float2x4 operator*(const float4x4 x, const float2x4 y) { return ::simd_mul(x, y); }
574 static SIMD_CPPFUNC float3x4 operator*(const float4x4 x, const float3x4 y) { return ::simd_mul(x, y); }
575 static SIMD_CPPFUNC float4x4 operator*(const float4x4 x, const float4x4 y) { return ::simd_mul(x, y); }
576 static SIMD_CPPFUNC float2x2& operator*=(float2x2& x, const float2x2 y) { x = ::simd_mul(x, y); return x; }
577 static SIMD_CPPFUNC float2x3& operator*=(float2x3& x, const float2x2 y) { x = ::simd_mul(x, y); return x; }
578 static SIMD_CPPFUNC float2x4& operator*=(float2x4& x, const float2x2 y) { x = ::simd_mul(x, y); return x; }
579 static SIMD_CPPFUNC float3x2& operator*=(float3x2& x, const float3x3 y) { x = ::simd_mul(x, y); return x; }
580 static SIMD_CPPFUNC float3x3& operator*=(float3x3& x, const float3x3 y) { x = ::simd_mul(x, y); return x; }
581 static SIMD_CPPFUNC float3x4& operator*=(float3x4& x, const float3x3 y) { x = ::simd_mul(x, y); return x; }
582 static SIMD_CPPFUNC float4x2& operator*=(float4x2& x, const float4x4 y) { x = ::simd_mul(x, y); return x; }
583 static SIMD_CPPFUNC float4x3& operator*=(float4x3& x, const float4x4 y) { x = ::simd_mul(x, y); return x; }
584 static SIMD_CPPFUNC float4x4& operator*=(float4x4& x, const float4x4 y) { x = ::simd_mul(x, y); return x; }
585
586 static SIMD_CPPFUNC bool operator==(const float2x2& x, const float2x2& y) { return ::simd_equal(x, y); }
587 static SIMD_CPPFUNC bool operator==(const float2x3& x, const float2x3& y) { return ::simd_equal(x, y); }
588 static SIMD_CPPFUNC bool operator==(const float2x4& x, const float2x4& y) { return ::simd_equal(x, y); }
589 static SIMD_CPPFUNC bool operator==(const float3x2& x, const float3x2& y) { return ::simd_equal(x, y); }
590 static SIMD_CPPFUNC bool operator==(const float3x3& x, const float3x3& y) { return ::simd_equal(x, y); }
591 static SIMD_CPPFUNC bool operator==(const float3x4& x, const float3x4& y) { return ::simd_equal(x, y); }
592 static SIMD_CPPFUNC bool operator==(const float4x2& x, const float4x2& y) { return ::simd_equal(x, y); }
593 static SIMD_CPPFUNC bool operator==(const float4x3& x, const float4x3& y) { return ::simd_equal(x, y); }
594 static SIMD_CPPFUNC bool operator==(const float4x4& x, const float4x4& y) { return ::simd_equal(x, y); }
595
596 static SIMD_CPPFUNC bool operator!=(const float2x2& x, const float2x2& y) { return !(x == y); }
597 static SIMD_CPPFUNC bool operator!=(const float2x3& x, const float2x3& y) { return !(x == y); }
598 static SIMD_CPPFUNC bool operator!=(const float2x4& x, const float2x4& y) { return !(x == y); }
599 static SIMD_CPPFUNC bool operator!=(const float3x2& x, const float3x2& y) { return !(x == y); }
600 static SIMD_CPPFUNC bool operator!=(const float3x3& x, const float3x3& y) { return !(x == y); }
601 static SIMD_CPPFUNC bool operator!=(const float3x4& x, const float3x4& y) { return !(x == y); }
602 static SIMD_CPPFUNC bool operator!=(const float4x2& x, const float4x2& y) { return !(x == y); }
603 static SIMD_CPPFUNC bool operator!=(const float4x3& x, const float4x3& y) { return !(x == y); }
604 static SIMD_CPPFUNC bool operator!=(const float4x4& x, const float4x4& y) { return !(x == y); }
605
almost_equal_elements(const float2x2 x,const float2x2 y,const float tol)606 static SIMD_CPPFUNC bool almost_equal_elements(const float2x2 x, const float2x2 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float2x3 x,const float2x3 y,const float tol)607 static SIMD_CPPFUNC bool almost_equal_elements(const float2x3 x, const float2x3 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float2x4 x,const float2x4 y,const float tol)608 static SIMD_CPPFUNC bool almost_equal_elements(const float2x4 x, const float2x4 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float3x2 x,const float3x2 y,const float tol)609 static SIMD_CPPFUNC bool almost_equal_elements(const float3x2 x, const float3x2 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float3x3 x,const float3x3 y,const float tol)610 static SIMD_CPPFUNC bool almost_equal_elements(const float3x3 x, const float3x3 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float3x4 x,const float3x4 y,const float tol)611 static SIMD_CPPFUNC bool almost_equal_elements(const float3x4 x, const float3x4 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float4x2 x,const float4x2 y,const float tol)612 static SIMD_CPPFUNC bool almost_equal_elements(const float4x2 x, const float4x2 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float4x3 x,const float4x3 y,const float tol)613 static SIMD_CPPFUNC bool almost_equal_elements(const float4x3 x, const float4x3 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const float4x4 x,const float4x4 y,const float tol)614 static SIMD_CPPFUNC bool almost_equal_elements(const float4x4 x, const float4x4 y, const float tol) { return ::simd_almost_equal_elements(x, y, tol); }
615
almost_equal_elements_relative(const float2x2 x,const float2x2 y,const float tol)616 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float2x2 x, const float2x2 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float2x3 x,const float2x3 y,const float tol)617 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float2x3 x, const float2x3 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float2x4 x,const float2x4 y,const float tol)618 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float2x4 x, const float2x4 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float3x2 x,const float3x2 y,const float tol)619 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float3x2 x, const float3x2 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float3x3 x,const float3x3 y,const float tol)620 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float3x3 x, const float3x3 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float3x4 x,const float3x4 y,const float tol)621 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float3x4 x, const float3x4 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float4x2 x,const float4x2 y,const float tol)622 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float4x2 x, const float4x2 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float4x3 x,const float4x3 y,const float tol)623 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float4x3 x, const float4x3 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const float4x4 x,const float4x4 y,const float tol)624 static SIMD_CPPFUNC bool almost_equal_elements_relative(const float4x4 x, const float4x4 y, const float tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
625
626 static SIMD_CPPFUNC double2x2 operator+(const double2x2 x, const double2x2 y) { return double2x2(::simd_linear_combination(1, x, 1, y)); }
627 static SIMD_CPPFUNC double2x3 operator+(const double2x3 x, const double2x3 y) { return double2x3(::simd_linear_combination(1, x, 1, y)); }
628 static SIMD_CPPFUNC double2x4 operator+(const double2x4 x, const double2x4 y) { return double2x4(::simd_linear_combination(1, x, 1, y)); }
629 static SIMD_CPPFUNC double3x2 operator+(const double3x2 x, const double3x2 y) { return double3x2(::simd_linear_combination(1, x, 1, y)); }
630 static SIMD_CPPFUNC double3x3 operator+(const double3x3 x, const double3x3 y) { return double3x3(::simd_linear_combination(1, x, 1, y)); }
631 static SIMD_CPPFUNC double3x4 operator+(const double3x4 x, const double3x4 y) { return double3x4(::simd_linear_combination(1, x, 1, y)); }
632 static SIMD_CPPFUNC double4x2 operator+(const double4x2 x, const double4x2 y) { return double4x2(::simd_linear_combination(1, x, 1, y)); }
633 static SIMD_CPPFUNC double4x3 operator+(const double4x3 x, const double4x3 y) { return double4x3(::simd_linear_combination(1, x, 1, y)); }
634 static SIMD_CPPFUNC double4x4 operator+(const double4x4 x, const double4x4 y) { return double4x4(::simd_linear_combination(1, x, 1, y)); }
635
636 static SIMD_CPPFUNC double2x2 operator-(const double2x2 x, const double2x2 y) { return double2x2(::simd_linear_combination(1, x, -1, y)); }
637 static SIMD_CPPFUNC double2x3 operator-(const double2x3 x, const double2x3 y) { return double2x3(::simd_linear_combination(1, x, -1, y)); }
638 static SIMD_CPPFUNC double2x4 operator-(const double2x4 x, const double2x4 y) { return double2x4(::simd_linear_combination(1, x, -1, y)); }
639 static SIMD_CPPFUNC double3x2 operator-(const double3x2 x, const double3x2 y) { return double3x2(::simd_linear_combination(1, x, -1, y)); }
640 static SIMD_CPPFUNC double3x3 operator-(const double3x3 x, const double3x3 y) { return double3x3(::simd_linear_combination(1, x, -1, y)); }
641 static SIMD_CPPFUNC double3x4 operator-(const double3x4 x, const double3x4 y) { return double3x4(::simd_linear_combination(1, x, -1, y)); }
642 static SIMD_CPPFUNC double4x2 operator-(const double4x2 x, const double4x2 y) { return double4x2(::simd_linear_combination(1, x, -1, y)); }
643 static SIMD_CPPFUNC double4x3 operator-(const double4x3 x, const double4x3 y) { return double4x3(::simd_linear_combination(1, x, -1, y)); }
644 static SIMD_CPPFUNC double4x4 operator-(const double4x4 x, const double4x4 y) { return double4x4(::simd_linear_combination(1, x, -1, y)); }
645
646 static SIMD_CPPFUNC double2x2& operator+=(double2x2& x, const double2x2 y) { x = x + y; return x; }
647 static SIMD_CPPFUNC double2x3& operator+=(double2x3& x, const double2x3 y) { x = x + y; return x; }
648 static SIMD_CPPFUNC double2x4& operator+=(double2x4& x, const double2x4 y) { x = x + y; return x; }
649 static SIMD_CPPFUNC double3x2& operator+=(double3x2& x, const double3x2 y) { x = x + y; return x; }
650 static SIMD_CPPFUNC double3x3& operator+=(double3x3& x, const double3x3 y) { x = x + y; return x; }
651 static SIMD_CPPFUNC double3x4& operator+=(double3x4& x, const double3x4 y) { x = x + y; return x; }
652 static SIMD_CPPFUNC double4x2& operator+=(double4x2& x, const double4x2 y) { x = x + y; return x; }
653 static SIMD_CPPFUNC double4x3& operator+=(double4x3& x, const double4x3 y) { x = x + y; return x; }
654 static SIMD_CPPFUNC double4x4& operator+=(double4x4& x, const double4x4 y) { x = x + y; return x; }
655
656 static SIMD_CPPFUNC double2x2& operator-=(double2x2& x, const double2x2 y) { x = x - y; return x; }
657 static SIMD_CPPFUNC double2x3& operator-=(double2x3& x, const double2x3 y) { x = x - y; return x; }
658 static SIMD_CPPFUNC double2x4& operator-=(double2x4& x, const double2x4 y) { x = x - y; return x; }
659 static SIMD_CPPFUNC double3x2& operator-=(double3x2& x, const double3x2 y) { x = x - y; return x; }
660 static SIMD_CPPFUNC double3x3& operator-=(double3x3& x, const double3x3 y) { x = x - y; return x; }
661 static SIMD_CPPFUNC double3x4& operator-=(double3x4& x, const double3x4 y) { x = x - y; return x; }
662 static SIMD_CPPFUNC double4x2& operator-=(double4x2& x, const double4x2 y) { x = x - y; return x; }
663 static SIMD_CPPFUNC double4x3& operator-=(double4x3& x, const double4x3 y) { x = x - y; return x; }
664 static SIMD_CPPFUNC double4x4& operator-=(double4x4& x, const double4x4 y) { x = x - y; return x; }
665
transpose(const double2x2 x)666 static SIMD_CPPFUNC double2x2 transpose(const double2x2 x) { return ::simd_transpose(x); }
transpose(const double3x2 x)667 static SIMD_CPPFUNC double2x3 transpose(const double3x2 x) { return ::simd_transpose(x); }
transpose(const double4x2 x)668 static SIMD_CPPFUNC double2x4 transpose(const double4x2 x) { return ::simd_transpose(x); }
transpose(const double2x3 x)669 static SIMD_CPPFUNC double3x2 transpose(const double2x3 x) { return ::simd_transpose(x); }
transpose(const double3x3 x)670 static SIMD_CPPFUNC double3x3 transpose(const double3x3 x) { return ::simd_transpose(x); }
transpose(const double4x3 x)671 static SIMD_CPPFUNC double3x4 transpose(const double4x3 x) { return ::simd_transpose(x); }
transpose(const double2x4 x)672 static SIMD_CPPFUNC double4x2 transpose(const double2x4 x) { return ::simd_transpose(x); }
transpose(const double3x4 x)673 static SIMD_CPPFUNC double4x3 transpose(const double3x4 x) { return ::simd_transpose(x); }
transpose(const double4x4 x)674 static SIMD_CPPFUNC double4x4 transpose(const double4x4 x) { return ::simd_transpose(x); }
675
trace(const double2x2 x)676 static SIMD_CPPFUNC double trace(const double2x2 x) { return ::simd_trace(x); }
trace(const double3x3 x)677 static SIMD_CPPFUNC double trace(const double3x3 x) { return ::simd_trace(x); }
trace(const double4x4 x)678 static SIMD_CPPFUNC double trace(const double4x4 x) { return ::simd_trace(x); }
679
determinant(const double2x2 x)680 static SIMD_CPPFUNC double determinant(const double2x2 x) { return ::simd_determinant(x); }
determinant(const double3x3 x)681 static SIMD_CPPFUNC double determinant(const double3x3 x) { return ::simd_determinant(x); }
determinant(const double4x4 x)682 static SIMD_CPPFUNC double determinant(const double4x4 x) { return ::simd_determinant(x); }
683
684 #pragma clang diagnostic push
685 #pragma clang diagnostic ignored "-Wgcc-compat"
inverse(const double2x2 x)686 static SIMD_CPPFUNC double2x2 inverse(const double2x2 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
inverse(const double3x3 x)687 static SIMD_CPPFUNC double3x3 inverse(const double3x3 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
inverse(const double4x4 x)688 static SIMD_CPPFUNC double4x4 inverse(const double4x4 x) __API_AVAILABLE(macos(10.10), ios(8.0), watchos(2.0), tvos(9.0)) { return ::simd_inverse(x); }
689 #pragma clang diagnostic pop
690
691 static SIMD_CPPFUNC double2x2 operator*(const double a, const double2x2 x) { return ::simd_mul(a, x); }
692 static SIMD_CPPFUNC double2x3 operator*(const double a, const double2x3 x) { return ::simd_mul(a, x); }
693 static SIMD_CPPFUNC double2x4 operator*(const double a, const double2x4 x) { return ::simd_mul(a, x); }
694 static SIMD_CPPFUNC double3x2 operator*(const double a, const double3x2 x) { return ::simd_mul(a, x); }
695 static SIMD_CPPFUNC double3x3 operator*(const double a, const double3x3 x) { return ::simd_mul(a, x); }
696 static SIMD_CPPFUNC double3x4 operator*(const double a, const double3x4 x) { return ::simd_mul(a, x); }
697 static SIMD_CPPFUNC double4x2 operator*(const double a, const double4x2 x) { return ::simd_mul(a, x); }
698 static SIMD_CPPFUNC double4x3 operator*(const double a, const double4x3 x) { return ::simd_mul(a, x); }
699 static SIMD_CPPFUNC double4x4 operator*(const double a, const double4x4 x) { return ::simd_mul(a, x); }
700 static SIMD_CPPFUNC double2x2 operator*(const double2x2 x, const double a) { return ::simd_mul(a, x); }
701 static SIMD_CPPFUNC double2x3 operator*(const double2x3 x, const double a) { return ::simd_mul(a, x); }
702 static SIMD_CPPFUNC double2x4 operator*(const double2x4 x, const double a) { return ::simd_mul(a, x); }
703 static SIMD_CPPFUNC double3x2 operator*(const double3x2 x, const double a) { return ::simd_mul(a, x); }
704 static SIMD_CPPFUNC double3x3 operator*(const double3x3 x, const double a) { return ::simd_mul(a, x); }
705 static SIMD_CPPFUNC double3x4 operator*(const double3x4 x, const double a) { return ::simd_mul(a, x); }
706 static SIMD_CPPFUNC double4x2 operator*(const double4x2 x, const double a) { return ::simd_mul(a, x); }
707 static SIMD_CPPFUNC double4x3 operator*(const double4x3 x, const double a) { return ::simd_mul(a, x); }
708 static SIMD_CPPFUNC double4x4 operator*(const double4x4 x, const double a) { return ::simd_mul(a, x); }
709 static SIMD_CPPFUNC double2x2& operator*=(double2x2& x, const double a) { x = ::simd_mul(a, x); return x; }
710 static SIMD_CPPFUNC double2x3& operator*=(double2x3& x, const double a) { x = ::simd_mul(a, x); return x; }
711 static SIMD_CPPFUNC double2x4& operator*=(double2x4& x, const double a) { x = ::simd_mul(a, x); return x; }
712 static SIMD_CPPFUNC double3x2& operator*=(double3x2& x, const double a) { x = ::simd_mul(a, x); return x; }
713 static SIMD_CPPFUNC double3x3& operator*=(double3x3& x, const double a) { x = ::simd_mul(a, x); return x; }
714 static SIMD_CPPFUNC double3x4& operator*=(double3x4& x, const double a) { x = ::simd_mul(a, x); return x; }
715 static SIMD_CPPFUNC double4x2& operator*=(double4x2& x, const double a) { x = ::simd_mul(a, x); return x; }
716 static SIMD_CPPFUNC double4x3& operator*=(double4x3& x, const double a) { x = ::simd_mul(a, x); return x; }
717 static SIMD_CPPFUNC double4x4& operator*=(double4x4& x, const double a) { x = ::simd_mul(a, x); return x; }
718
719 static SIMD_CPPFUNC double2 operator*(const double2 x, const double2x2 y) { return ::simd_mul(x, y); }
720 static SIMD_CPPFUNC double3 operator*(const double2 x, const double3x2 y) { return ::simd_mul(x, y); }
721 static SIMD_CPPFUNC double4 operator*(const double2 x, const double4x2 y) { return ::simd_mul(x, y); }
722 static SIMD_CPPFUNC double2 operator*(const double3 x, const double2x3 y) { return ::simd_mul(x, y); }
723 static SIMD_CPPFUNC double3 operator*(const double3 x, const double3x3 y) { return ::simd_mul(x, y); }
724 static SIMD_CPPFUNC double4 operator*(const double3 x, const double4x3 y) { return ::simd_mul(x, y); }
725 static SIMD_CPPFUNC double2 operator*(const double4 x, const double2x4 y) { return ::simd_mul(x, y); }
726 static SIMD_CPPFUNC double3 operator*(const double4 x, const double3x4 y) { return ::simd_mul(x, y); }
727 static SIMD_CPPFUNC double4 operator*(const double4 x, const double4x4 y) { return ::simd_mul(x, y); }
728 static SIMD_CPPFUNC double2 operator*(const double2x2 x, const double2 y) { return ::simd_mul(x, y); }
729 static SIMD_CPPFUNC double2 operator*(const double3x2 x, const double3 y) { return ::simd_mul(x, y); }
730 static SIMD_CPPFUNC double2 operator*(const double4x2 x, const double4 y) { return ::simd_mul(x, y); }
731 static SIMD_CPPFUNC double3 operator*(const double2x3 x, const double2 y) { return ::simd_mul(x, y); }
732 static SIMD_CPPFUNC double3 operator*(const double3x3 x, const double3 y) { return ::simd_mul(x, y); }
733 static SIMD_CPPFUNC double3 operator*(const double4x3 x, const double4 y) { return ::simd_mul(x, y); }
734 static SIMD_CPPFUNC double4 operator*(const double2x4 x, const double2 y) { return ::simd_mul(x, y); }
735 static SIMD_CPPFUNC double4 operator*(const double3x4 x, const double3 y) { return ::simd_mul(x, y); }
736 static SIMD_CPPFUNC double4 operator*(const double4x4 x, const double4 y) { return ::simd_mul(x, y); }
737 static SIMD_CPPFUNC double2& operator*=(double2& x, const double2x2 y) { x = ::simd_mul(x, y); return x; }
738 static SIMD_CPPFUNC double3& operator*=(double3& x, const double3x3 y) { x = ::simd_mul(x, y); return x; }
739 static SIMD_CPPFUNC double4& operator*=(double4& x, const double4x4 y) { x = ::simd_mul(x, y); return x; }
740
741 static SIMD_CPPFUNC double2x2 operator*(const double2x2 x, const double2x2 y) { return ::simd_mul(x, y); }
742 static SIMD_CPPFUNC double3x2 operator*(const double2x2 x, const double3x2 y) { return ::simd_mul(x, y); }
743 static SIMD_CPPFUNC double4x2 operator*(const double2x2 x, const double4x2 y) { return ::simd_mul(x, y); }
744 static SIMD_CPPFUNC double2x3 operator*(const double2x3 x, const double2x2 y) { return ::simd_mul(x, y); }
745 static SIMD_CPPFUNC double3x3 operator*(const double2x3 x, const double3x2 y) { return ::simd_mul(x, y); }
746 static SIMD_CPPFUNC double4x3 operator*(const double2x3 x, const double4x2 y) { return ::simd_mul(x, y); }
747 static SIMD_CPPFUNC double2x4 operator*(const double2x4 x, const double2x2 y) { return ::simd_mul(x, y); }
748 static SIMD_CPPFUNC double3x4 operator*(const double2x4 x, const double3x2 y) { return ::simd_mul(x, y); }
749 static SIMD_CPPFUNC double4x4 operator*(const double2x4 x, const double4x2 y) { return ::simd_mul(x, y); }
750 static SIMD_CPPFUNC double2x2 operator*(const double3x2 x, const double2x3 y) { return ::simd_mul(x, y); }
751 static SIMD_CPPFUNC double3x2 operator*(const double3x2 x, const double3x3 y) { return ::simd_mul(x, y); }
752 static SIMD_CPPFUNC double4x2 operator*(const double3x2 x, const double4x3 y) { return ::simd_mul(x, y); }
753 static SIMD_CPPFUNC double2x3 operator*(const double3x3 x, const double2x3 y) { return ::simd_mul(x, y); }
754 static SIMD_CPPFUNC double3x3 operator*(const double3x3 x, const double3x3 y) { return ::simd_mul(x, y); }
755 static SIMD_CPPFUNC double4x3 operator*(const double3x3 x, const double4x3 y) { return ::simd_mul(x, y); }
756 static SIMD_CPPFUNC double2x4 operator*(const double3x4 x, const double2x3 y) { return ::simd_mul(x, y); }
757 static SIMD_CPPFUNC double3x4 operator*(const double3x4 x, const double3x3 y) { return ::simd_mul(x, y); }
758 static SIMD_CPPFUNC double4x4 operator*(const double3x4 x, const double4x3 y) { return ::simd_mul(x, y); }
759 static SIMD_CPPFUNC double2x2 operator*(const double4x2 x, const double2x4 y) { return ::simd_mul(x, y); }
760 static SIMD_CPPFUNC double3x2 operator*(const double4x2 x, const double3x4 y) { return ::simd_mul(x, y); }
761 static SIMD_CPPFUNC double4x2 operator*(const double4x2 x, const double4x4 y) { return ::simd_mul(x, y); }
762 static SIMD_CPPFUNC double2x3 operator*(const double4x3 x, const double2x4 y) { return ::simd_mul(x, y); }
763 static SIMD_CPPFUNC double3x3 operator*(const double4x3 x, const double3x4 y) { return ::simd_mul(x, y); }
764 static SIMD_CPPFUNC double4x3 operator*(const double4x3 x, const double4x4 y) { return ::simd_mul(x, y); }
765 static SIMD_CPPFUNC double2x4 operator*(const double4x4 x, const double2x4 y) { return ::simd_mul(x, y); }
766 static SIMD_CPPFUNC double3x4 operator*(const double4x4 x, const double3x4 y) { return ::simd_mul(x, y); }
767 static SIMD_CPPFUNC double4x4 operator*(const double4x4 x, const double4x4 y) { return ::simd_mul(x, y); }
768 static SIMD_CPPFUNC double2x2& operator*=(double2x2& x, const double2x2 y) { x = ::simd_mul(x, y); return x; }
769 static SIMD_CPPFUNC double2x3& operator*=(double2x3& x, const double2x2 y) { x = ::simd_mul(x, y); return x; }
770 static SIMD_CPPFUNC double2x4& operator*=(double2x4& x, const double2x2 y) { x = ::simd_mul(x, y); return x; }
771 static SIMD_CPPFUNC double3x2& operator*=(double3x2& x, const double3x3 y) { x = ::simd_mul(x, y); return x; }
772 static SIMD_CPPFUNC double3x3& operator*=(double3x3& x, const double3x3 y) { x = ::simd_mul(x, y); return x; }
773 static SIMD_CPPFUNC double3x4& operator*=(double3x4& x, const double3x3 y) { x = ::simd_mul(x, y); return x; }
774 static SIMD_CPPFUNC double4x2& operator*=(double4x2& x, const double4x4 y) { x = ::simd_mul(x, y); return x; }
775 static SIMD_CPPFUNC double4x3& operator*=(double4x3& x, const double4x4 y) { x = ::simd_mul(x, y); return x; }
776 static SIMD_CPPFUNC double4x4& operator*=(double4x4& x, const double4x4 y) { x = ::simd_mul(x, y); return x; }
777
778 static SIMD_CPPFUNC bool operator==(const double2x2& x, const double2x2& y) { return ::simd_equal(x, y); }
779 static SIMD_CPPFUNC bool operator==(const double2x3& x, const double2x3& y) { return ::simd_equal(x, y); }
780 static SIMD_CPPFUNC bool operator==(const double2x4& x, const double2x4& y) { return ::simd_equal(x, y); }
781 static SIMD_CPPFUNC bool operator==(const double3x2& x, const double3x2& y) { return ::simd_equal(x, y); }
782 static SIMD_CPPFUNC bool operator==(const double3x3& x, const double3x3& y) { return ::simd_equal(x, y); }
783 static SIMD_CPPFUNC bool operator==(const double3x4& x, const double3x4& y) { return ::simd_equal(x, y); }
784 static SIMD_CPPFUNC bool operator==(const double4x2& x, const double4x2& y) { return ::simd_equal(x, y); }
785 static SIMD_CPPFUNC bool operator==(const double4x3& x, const double4x3& y) { return ::simd_equal(x, y); }
786 static SIMD_CPPFUNC bool operator==(const double4x4& x, const double4x4& y) { return ::simd_equal(x, y); }
787
788 static SIMD_CPPFUNC bool operator!=(const double2x2& x, const double2x2& y) { return !(x == y); }
789 static SIMD_CPPFUNC bool operator!=(const double2x3& x, const double2x3& y) { return !(x == y); }
790 static SIMD_CPPFUNC bool operator!=(const double2x4& x, const double2x4& y) { return !(x == y); }
791 static SIMD_CPPFUNC bool operator!=(const double3x2& x, const double3x2& y) { return !(x == y); }
792 static SIMD_CPPFUNC bool operator!=(const double3x3& x, const double3x3& y) { return !(x == y); }
793 static SIMD_CPPFUNC bool operator!=(const double3x4& x, const double3x4& y) { return !(x == y); }
794 static SIMD_CPPFUNC bool operator!=(const double4x2& x, const double4x2& y) { return !(x == y); }
795 static SIMD_CPPFUNC bool operator!=(const double4x3& x, const double4x3& y) { return !(x == y); }
796 static SIMD_CPPFUNC bool operator!=(const double4x4& x, const double4x4& y) { return !(x == y); }
797
almost_equal_elements(const double2x2 x,const double2x2 y,const double tol)798 static SIMD_CPPFUNC bool almost_equal_elements(const double2x2 x, const double2x2 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double2x3 x,const double2x3 y,const double tol)799 static SIMD_CPPFUNC bool almost_equal_elements(const double2x3 x, const double2x3 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double2x4 x,const double2x4 y,const double tol)800 static SIMD_CPPFUNC bool almost_equal_elements(const double2x4 x, const double2x4 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double3x2 x,const double3x2 y,const double tol)801 static SIMD_CPPFUNC bool almost_equal_elements(const double3x2 x, const double3x2 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double3x3 x,const double3x3 y,const double tol)802 static SIMD_CPPFUNC bool almost_equal_elements(const double3x3 x, const double3x3 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double3x4 x,const double3x4 y,const double tol)803 static SIMD_CPPFUNC bool almost_equal_elements(const double3x4 x, const double3x4 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double4x2 x,const double4x2 y,const double tol)804 static SIMD_CPPFUNC bool almost_equal_elements(const double4x2 x, const double4x2 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double4x3 x,const double4x3 y,const double tol)805 static SIMD_CPPFUNC bool almost_equal_elements(const double4x3 x, const double4x3 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
almost_equal_elements(const double4x4 x,const double4x4 y,const double tol)806 static SIMD_CPPFUNC bool almost_equal_elements(const double4x4 x, const double4x4 y, const double tol) { return ::simd_almost_equal_elements(x, y, tol); }
807
almost_equal_elements_relative(const double2x2 x,const double2x2 y,const double tol)808 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double2x2 x, const double2x2 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double2x3 x,const double2x3 y,const double tol)809 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double2x3 x, const double2x3 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double2x4 x,const double2x4 y,const double tol)810 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double2x4 x, const double2x4 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double3x2 x,const double3x2 y,const double tol)811 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double3x2 x, const double3x2 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double3x3 x,const double3x3 y,const double tol)812 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double3x3 x, const double3x3 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double3x4 x,const double3x4 y,const double tol)813 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double3x4 x, const double3x4 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double4x2 x,const double4x2 y,const double tol)814 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double4x2 x, const double4x2 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double4x3 x,const double4x3 y,const double tol)815 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double4x3 x, const double4x3 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
almost_equal_elements_relative(const double4x4 x,const double4x4 y,const double tol)816 static SIMD_CPPFUNC bool almost_equal_elements_relative(const double4x4 x, const double4x4 y, const double tol) { return ::simd_almost_equal_elements_relative(x, y, tol); }
817 }
818
819 extern "C" {
820 #endif /* __cplusplus */
821
822 #pragma mark - Implementation
823
simd_diagonal_matrix(simd_float2 __x)824 static simd_float2x2 SIMD_CFUNC simd_diagonal_matrix(simd_float2 __x) { simd_float2x2 __r = { .columns[0] = {__x.x,0}, .columns[1] = {0,__x.y} }; return __r; }
simd_diagonal_matrix(simd_double2 __x)825 static simd_double2x2 SIMD_CFUNC simd_diagonal_matrix(simd_double2 __x) { simd_double2x2 __r = { .columns[0] = {__x.x,0}, .columns[1] = {0,__x.y} }; return __r; }
simd_diagonal_matrix(simd_float3 __x)826 static simd_float3x3 SIMD_CFUNC simd_diagonal_matrix(simd_float3 __x) { simd_float3x3 __r = { .columns[0] = {__x.x,0,0}, .columns[1] = {0,__x.y,0}, .columns[2] = {0,0,__x.z} }; return __r; }
simd_diagonal_matrix(simd_double3 __x)827 static simd_double3x3 SIMD_CFUNC simd_diagonal_matrix(simd_double3 __x) { simd_double3x3 __r = { .columns[0] = {__x.x,0,0}, .columns[1] = {0,__x.y,0}, .columns[2] = {0,0,__x.z} }; return __r; }
simd_diagonal_matrix(simd_float4 __x)828 static simd_float4x4 SIMD_CFUNC simd_diagonal_matrix(simd_float4 __x) { simd_float4x4 __r = { .columns[0] = {__x.x,0,0,0}, .columns[1] = {0,__x.y,0,0}, .columns[2] = {0,0,__x.z,0}, .columns[3] = {0,0,0,__x.w} }; return __r; }
simd_diagonal_matrix(simd_double4 __x)829 static simd_double4x4 SIMD_CFUNC simd_diagonal_matrix(simd_double4 __x) { simd_double4x4 __r = { .columns[0] = {__x.x,0,0,0}, .columns[1] = {0,__x.y,0,0}, .columns[2] = {0,0,__x.z,0}, .columns[3] = {0,0,0,__x.w} }; return __r; }
830
simd_matrix(simd_float2 col0,simd_float2 col1)831 static simd_float2x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1) { simd_float2x2 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_float3 col0,simd_float3 col1)832 static simd_float2x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1) { simd_float2x3 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_float4 col0,simd_float4 col1)833 static simd_float2x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1) { simd_float2x4 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_double2 col0,simd_double2 col1)834 static simd_double2x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1) { simd_double2x2 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_double3 col0,simd_double3 col1)835 static simd_double2x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1) { simd_double2x3 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_double4 col0,simd_double4 col1)836 static simd_double2x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1) { simd_double2x4 __r = { .columns[0] = col0, .columns[1] = col1 }; return __r; }
simd_matrix(simd_float2 col0,simd_float2 col1,simd_float2 col2)837 static simd_float3x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1, simd_float2 col2) { simd_float3x2 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_float3 col0,simd_float3 col1,simd_float3 col2)838 static simd_float3x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1, simd_float3 col2) { simd_float3x3 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_float4 col0,simd_float4 col1,simd_float4 col2)839 static simd_float3x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1, simd_float4 col2) { simd_float3x4 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_double2 col0,simd_double2 col1,simd_double2 col2)840 static simd_double3x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1, simd_double2 col2) { simd_double3x2 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_double3 col0,simd_double3 col1,simd_double3 col2)841 static simd_double3x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1, simd_double3 col2) { simd_double3x3 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_double4 col0,simd_double4 col1,simd_double4 col2)842 static simd_double3x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1, simd_double4 col2) { simd_double3x4 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2 }; return __r; }
simd_matrix(simd_float2 col0,simd_float2 col1,simd_float2 col2,simd_float2 col3)843 static simd_float4x2 SIMD_CFUNC simd_matrix(simd_float2 col0, simd_float2 col1, simd_float2 col2, simd_float2 col3) { simd_float4x2 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
simd_matrix(simd_float3 col0,simd_float3 col1,simd_float3 col2,simd_float3 col3)844 static simd_float4x3 SIMD_CFUNC simd_matrix(simd_float3 col0, simd_float3 col1, simd_float3 col2, simd_float3 col3) { simd_float4x3 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
simd_matrix(simd_float4 col0,simd_float4 col1,simd_float4 col2,simd_float4 col3)845 static simd_float4x4 SIMD_CFUNC simd_matrix(simd_float4 col0, simd_float4 col1, simd_float4 col2, simd_float4 col3) { simd_float4x4 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
simd_matrix(simd_double2 col0,simd_double2 col1,simd_double2 col2,simd_double2 col3)846 static simd_double4x2 SIMD_CFUNC simd_matrix(simd_double2 col0, simd_double2 col1, simd_double2 col2, simd_double2 col3) { simd_double4x2 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
simd_matrix(simd_double3 col0,simd_double3 col1,simd_double3 col2,simd_double3 col3)847 static simd_double4x3 SIMD_CFUNC simd_matrix(simd_double3 col0, simd_double3 col1, simd_double3 col2, simd_double3 col3) { simd_double4x3 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
simd_matrix(simd_double4 col0,simd_double4 col1,simd_double4 col2,simd_double4 col3)848 static simd_double4x4 SIMD_CFUNC simd_matrix(simd_double4 col0, simd_double4 col1, simd_double4 col2, simd_double4 col3) { simd_double4x4 __r = { .columns[0] = col0, .columns[1] = col1, .columns[2] = col2, .columns[3] = col3 }; return __r; }
849
simd_matrix_from_rows(simd_float2 row0,simd_float2 row1)850 static simd_float2x2 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_float3 row0,simd_float3 row1)851 static simd_float3x2 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_float4 row0,simd_float4 row1)852 static simd_float4x2 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_double2 row0,simd_double2 row1)853 static simd_double2x2 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_double3 row0,simd_double3 row1)854 static simd_double3x2 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_double4 row0,simd_double4 row1)855 static simd_double4x2 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1) { return simd_transpose(simd_matrix(row0, row1)); }
simd_matrix_from_rows(simd_float2 row0,simd_float2 row1,simd_float2 row2)856 static simd_float2x3 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1, simd_float2 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_float3 row0,simd_float3 row1,simd_float3 row2)857 static simd_float3x3 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1, simd_float3 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_float4 row0,simd_float4 row1,simd_float4 row2)858 static simd_float4x3 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1, simd_float4 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_double2 row0,simd_double2 row1,simd_double2 row2)859 static simd_double2x3 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1, simd_double2 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_double3 row0,simd_double3 row1,simd_double3 row2)860 static simd_double3x3 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1, simd_double3 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_double4 row0,simd_double4 row1,simd_double4 row2)861 static simd_double4x3 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1, simd_double4 row2) { return simd_transpose(simd_matrix(row0, row1, row2)); }
simd_matrix_from_rows(simd_float2 row0,simd_float2 row1,simd_float2 row2,simd_float2 row3)862 static simd_float2x4 SIMD_CFUNC simd_matrix_from_rows(simd_float2 row0, simd_float2 row1, simd_float2 row2, simd_float2 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
simd_matrix_from_rows(simd_float3 row0,simd_float3 row1,simd_float3 row2,simd_float3 row3)863 static simd_float3x4 SIMD_CFUNC simd_matrix_from_rows(simd_float3 row0, simd_float3 row1, simd_float3 row2, simd_float3 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
simd_matrix_from_rows(simd_float4 row0,simd_float4 row1,simd_float4 row2,simd_float4 row3)864 static simd_float4x4 SIMD_CFUNC simd_matrix_from_rows(simd_float4 row0, simd_float4 row1, simd_float4 row2, simd_float4 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
simd_matrix_from_rows(simd_double2 row0,simd_double2 row1,simd_double2 row2,simd_double2 row3)865 static simd_double2x4 SIMD_CFUNC simd_matrix_from_rows(simd_double2 row0, simd_double2 row1, simd_double2 row2, simd_double2 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
simd_matrix_from_rows(simd_double3 row0,simd_double3 row1,simd_double3 row2,simd_double3 row3)866 static simd_double3x4 SIMD_CFUNC simd_matrix_from_rows(simd_double3 row0, simd_double3 row1, simd_double3 row2, simd_double3 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
simd_matrix_from_rows(simd_double4 row0,simd_double4 row1,simd_double4 row2,simd_double4 row3)867 static simd_double4x4 SIMD_CFUNC simd_matrix_from_rows(simd_double4 row0, simd_double4 row1, simd_double4 row2, simd_double4 row3) { return simd_transpose(simd_matrix(row0, row1, row2, row3)); }
868
simd_matrix3x3(simd_quatf q)869 static simd_float3x3 SIMD_NOINLINE simd_matrix3x3(simd_quatf q) {
870 simd_float4x4 r = simd_matrix4x4(q);
871 return (simd_float3x3){ r.columns[0].xyz, r.columns[1].xyz, r.columns[2].xyz };
872 }
873
simd_matrix4x4(simd_quatf q)874 static simd_float4x4 SIMD_NOINLINE simd_matrix4x4(simd_quatf q) {
875 simd_float4 v = q.vector;
876 simd_float4x4 r = {
877 .columns[0] = { 1 - 2*(v.y*v.y + v.z*v.z),
878 2*(v.x*v.y + v.z*v.w),
879 2*(v.x*v.z - v.y*v.w), 0 },
880 .columns[1] = { 2*(v.x*v.y - v.z*v.w),
881 1 - 2*(v.z*v.z + v.x*v.x),
882 2*(v.y*v.z + v.x*v.w), 0 },
883 .columns[2] = { 2*(v.z*v.x + v.y*v.w),
884 2*(v.y*v.z - v.x*v.w),
885 1 - 2*(v.y*v.y + v.x*v.x), 0 },
886 .columns[3] = { 0, 0, 0, 1 }
887 };
888 return r;
889 }
890
simd_matrix3x3(simd_quatd q)891 static simd_double3x3 SIMD_NOINLINE simd_matrix3x3(simd_quatd q) {
892 simd_double4x4 r = simd_matrix4x4(q);
893 return (simd_double3x3){ r.columns[0].xyz, r.columns[1].xyz, r.columns[2].xyz };
894 }
895
simd_matrix4x4(simd_quatd q)896 static simd_double4x4 SIMD_NOINLINE simd_matrix4x4(simd_quatd q) {
897 simd_double4 v = q.vector;
898 simd_double4x4 r = {
899 .columns[0] = { 1 - 2*(v.y*v.y + v.z*v.z),
900 2*(v.x*v.y + v.z*v.w),
901 2*(v.x*v.z - v.y*v.w), 0 },
902 .columns[1] = { 2*(v.x*v.y - v.z*v.w),
903 1 - 2*(v.z*v.z + v.x*v.x),
904 2*(v.y*v.z + v.x*v.w), 0 },
905 .columns[2] = { 2*(v.z*v.x + v.y*v.w),
906 2*(v.y*v.z - v.x*v.w),
907 1 - 2*(v.y*v.y + v.x*v.x), 0 },
908 .columns[3] = { 0, 0, 0, 1 }
909 };
910 return r;
911 }
912
matrix_scale(float __a,simd_float2x2 __x)913 static simd_float2x2 SIMD_CFUNC matrix_scale(float __a, simd_float2x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(float __a,simd_float3x2 __x)914 static simd_float3x2 SIMD_CFUNC matrix_scale(float __a, simd_float3x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(float __a,simd_float4x2 __x)915 static simd_float4x2 SIMD_CFUNC matrix_scale(float __a, simd_float4x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
matrix_scale(float __a,simd_float2x3 __x)916 static simd_float2x3 SIMD_CFUNC matrix_scale(float __a, simd_float2x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(float __a,simd_float3x3 __x)917 static simd_float3x3 SIMD_CFUNC matrix_scale(float __a, simd_float3x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(float __a,simd_float4x3 __x)918 static simd_float4x3 SIMD_CFUNC matrix_scale(float __a, simd_float4x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
matrix_scale(float __a,simd_float2x4 __x)919 static simd_float2x4 SIMD_CFUNC matrix_scale(float __a, simd_float2x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(float __a,simd_float3x4 __x)920 static simd_float3x4 SIMD_CFUNC matrix_scale(float __a, simd_float3x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(float __a,simd_float4x4 __x)921 static simd_float4x4 SIMD_CFUNC matrix_scale(float __a, simd_float4x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
matrix_scale(double __a,simd_double2x2 __x)922 static simd_double2x2 SIMD_CFUNC matrix_scale(double __a, simd_double2x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(double __a,simd_double3x2 __x)923 static simd_double3x2 SIMD_CFUNC matrix_scale(double __a, simd_double3x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(double __a,simd_double4x2 __x)924 static simd_double4x2 SIMD_CFUNC matrix_scale(double __a, simd_double4x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
matrix_scale(double __a,simd_double2x3 __x)925 static simd_double2x3 SIMD_CFUNC matrix_scale(double __a, simd_double2x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(double __a,simd_double3x3 __x)926 static simd_double3x3 SIMD_CFUNC matrix_scale(double __a, simd_double3x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(double __a,simd_double4x3 __x)927 static simd_double4x3 SIMD_CFUNC matrix_scale(double __a, simd_double4x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
matrix_scale(double __a,simd_double2x4 __x)928 static simd_double2x4 SIMD_CFUNC matrix_scale(double __a, simd_double2x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
matrix_scale(double __a,simd_double3x4 __x)929 static simd_double3x4 SIMD_CFUNC matrix_scale(double __a, simd_double3x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
matrix_scale(double __a,simd_double4x4 __x)930 static simd_double4x4 SIMD_CFUNC matrix_scale(double __a, simd_double4x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
931
simd_mul(float __a,simd_float2x2 __x)932 static simd_float2x2 SIMD_CFUNC simd_mul(float __a, simd_float2x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(float __a,simd_float3x2 __x)933 static simd_float3x2 SIMD_CFUNC simd_mul(float __a, simd_float3x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(float __a,simd_float4x2 __x)934 static simd_float4x2 SIMD_CFUNC simd_mul(float __a, simd_float4x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
simd_mul(float __a,simd_float2x3 __x)935 static simd_float2x3 SIMD_CFUNC simd_mul(float __a, simd_float2x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(float __a,simd_float3x3 __x)936 static simd_float3x3 SIMD_CFUNC simd_mul(float __a, simd_float3x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(float __a,simd_float4x3 __x)937 static simd_float4x3 SIMD_CFUNC simd_mul(float __a, simd_float4x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
simd_mul(float __a,simd_float2x4 __x)938 static simd_float2x4 SIMD_CFUNC simd_mul(float __a, simd_float2x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(float __a,simd_float3x4 __x)939 static simd_float3x4 SIMD_CFUNC simd_mul(float __a, simd_float3x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(float __a,simd_float4x4 __x)940 static simd_float4x4 SIMD_CFUNC simd_mul(float __a, simd_float4x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
simd_mul(double __a,simd_double2x2 __x)941 static simd_double2x2 SIMD_CFUNC simd_mul(double __a, simd_double2x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(double __a,simd_double3x2 __x)942 static simd_double3x2 SIMD_CFUNC simd_mul(double __a, simd_double3x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(double __a,simd_double4x2 __x)943 static simd_double4x2 SIMD_CFUNC simd_mul(double __a, simd_double4x2 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
simd_mul(double __a,simd_double2x3 __x)944 static simd_double2x3 SIMD_CFUNC simd_mul(double __a, simd_double2x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(double __a,simd_double3x3 __x)945 static simd_double3x3 SIMD_CFUNC simd_mul(double __a, simd_double3x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(double __a,simd_double4x3 __x)946 static simd_double4x3 SIMD_CFUNC simd_mul(double __a, simd_double4x3 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
simd_mul(double __a,simd_double2x4 __x)947 static simd_double2x4 SIMD_CFUNC simd_mul(double __a, simd_double2x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; return __x; }
simd_mul(double __a,simd_double3x4 __x)948 static simd_double3x4 SIMD_CFUNC simd_mul(double __a, simd_double3x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; return __x; }
simd_mul(double __a,simd_double4x4 __x)949 static simd_double4x4 SIMD_CFUNC simd_mul(double __a, simd_double4x4 __x) { __x.columns[0] *= __a; __x.columns[1] *= __a; __x.columns[2] *= __a; __x.columns[3] *= __a; return __x; }
950
simd_linear_combination(float __a,simd_float2x2 __x,float __b,simd_float2x2 __y)951 static simd_float2x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x2 __x, float __b, simd_float2x2 __y) {
952 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
953 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
954 return __x;
955 }
simd_linear_combination(float __a,simd_float3x2 __x,float __b,simd_float3x2 __y)956 static simd_float3x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x2 __x, float __b, simd_float3x2 __y) {
957 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
958 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
959 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
960 return __x;
961 }
simd_linear_combination(float __a,simd_float4x2 __x,float __b,simd_float4x2 __y)962 static simd_float4x2 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x2 __x, float __b, simd_float4x2 __y) {
963 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
964 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
965 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
966 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
967 return __x;
968 }
simd_linear_combination(float __a,simd_float2x3 __x,float __b,simd_float2x3 __y)969 static simd_float2x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x3 __x, float __b, simd_float2x3 __y) {
970 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
971 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
972 return __x;
973 }
simd_linear_combination(float __a,simd_float3x3 __x,float __b,simd_float3x3 __y)974 static simd_float3x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x3 __x, float __b, simd_float3x3 __y) {
975 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
976 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
977 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
978 return __x;
979 }
simd_linear_combination(float __a,simd_float4x3 __x,float __b,simd_float4x3 __y)980 static simd_float4x3 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x3 __x, float __b, simd_float4x3 __y) {
981 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
982 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
983 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
984 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
985 return __x;
986 }
simd_linear_combination(float __a,simd_float2x4 __x,float __b,simd_float2x4 __y)987 static simd_float2x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float2x4 __x, float __b, simd_float2x4 __y) {
988 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
989 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
990 return __x;
991 }
simd_linear_combination(float __a,simd_float3x4 __x,float __b,simd_float3x4 __y)992 static simd_float3x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float3x4 __x, float __b, simd_float3x4 __y) {
993 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
994 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
995 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
996 return __x;
997 }
simd_linear_combination(float __a,simd_float4x4 __x,float __b,simd_float4x4 __y)998 static simd_float4x4 SIMD_CFUNC simd_linear_combination(float __a, simd_float4x4 __x, float __b, simd_float4x4 __y) {
999 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1000 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1001 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1002 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
1003 return __x;
1004 }
simd_linear_combination(double __a,simd_double2x2 __x,double __b,simd_double2x2 __y)1005 static simd_double2x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x2 __x, double __b, simd_double2x2 __y) {
1006 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1007 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1008 return __x;
1009 }
simd_linear_combination(double __a,simd_double3x2 __x,double __b,simd_double3x2 __y)1010 static simd_double3x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x2 __x, double __b, simd_double3x2 __y) {
1011 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1012 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1013 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1014 return __x;
1015 }
simd_linear_combination(double __a,simd_double4x2 __x,double __b,simd_double4x2 __y)1016 static simd_double4x2 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x2 __x, double __b, simd_double4x2 __y) {
1017 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1018 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1019 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1020 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
1021 return __x;
1022 }
simd_linear_combination(double __a,simd_double2x3 __x,double __b,simd_double2x3 __y)1023 static simd_double2x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x3 __x, double __b, simd_double2x3 __y) {
1024 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1025 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1026 return __x;
1027 }
simd_linear_combination(double __a,simd_double3x3 __x,double __b,simd_double3x3 __y)1028 static simd_double3x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x3 __x, double __b, simd_double3x3 __y) {
1029 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1030 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1031 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1032 return __x;
1033 }
simd_linear_combination(double __a,simd_double4x3 __x,double __b,simd_double4x3 __y)1034 static simd_double4x3 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x3 __x, double __b, simd_double4x3 __y) {
1035 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1036 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1037 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1038 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
1039 return __x;
1040 }
simd_linear_combination(double __a,simd_double2x4 __x,double __b,simd_double2x4 __y)1041 static simd_double2x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double2x4 __x, double __b, simd_double2x4 __y) {
1042 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1043 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1044 return __x;
1045 }
simd_linear_combination(double __a,simd_double3x4 __x,double __b,simd_double3x4 __y)1046 static simd_double3x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double3x4 __x, double __b, simd_double3x4 __y) {
1047 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1048 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1049 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1050 return __x;
1051 }
simd_linear_combination(double __a,simd_double4x4 __x,double __b,simd_double4x4 __y)1052 static simd_double4x4 SIMD_CFUNC simd_linear_combination(double __a, simd_double4x4 __x, double __b, simd_double4x4 __y) {
1053 __x.columns[0] = __a*__x.columns[0] + __b*__y.columns[0];
1054 __x.columns[1] = __a*__x.columns[1] + __b*__y.columns[1];
1055 __x.columns[2] = __a*__x.columns[2] + __b*__y.columns[2];
1056 __x.columns[3] = __a*__x.columns[3] + __b*__y.columns[3];
1057 return __x;
1058 }
1059
simd_add(simd_float2x2 __x,simd_float2x2 __y)1060 static simd_float2x2 SIMD_CFUNC simd_add(simd_float2x2 __x, simd_float2x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float3x2 __x,simd_float3x2 __y)1061 static simd_float3x2 SIMD_CFUNC simd_add(simd_float3x2 __x, simd_float3x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float4x2 __x,simd_float4x2 __y)1062 static simd_float4x2 SIMD_CFUNC simd_add(simd_float4x2 __x, simd_float4x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float2x3 __x,simd_float2x3 __y)1063 static simd_float2x3 SIMD_CFUNC simd_add(simd_float2x3 __x, simd_float2x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float3x3 __x,simd_float3x3 __y)1064 static simd_float3x3 SIMD_CFUNC simd_add(simd_float3x3 __x, simd_float3x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float4x3 __x,simd_float4x3 __y)1065 static simd_float4x3 SIMD_CFUNC simd_add(simd_float4x3 __x, simd_float4x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float2x4 __x,simd_float2x4 __y)1066 static simd_float2x4 SIMD_CFUNC simd_add(simd_float2x4 __x, simd_float2x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float3x4 __x,simd_float3x4 __y)1067 static simd_float3x4 SIMD_CFUNC simd_add(simd_float3x4 __x, simd_float3x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_float4x4 __x,simd_float4x4 __y)1068 static simd_float4x4 SIMD_CFUNC simd_add(simd_float4x4 __x, simd_float4x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double2x2 __x,simd_double2x2 __y)1069 static simd_double2x2 SIMD_CFUNC simd_add(simd_double2x2 __x, simd_double2x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double3x2 __x,simd_double3x2 __y)1070 static simd_double3x2 SIMD_CFUNC simd_add(simd_double3x2 __x, simd_double3x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double4x2 __x,simd_double4x2 __y)1071 static simd_double4x2 SIMD_CFUNC simd_add(simd_double4x2 __x, simd_double4x2 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double2x3 __x,simd_double2x3 __y)1072 static simd_double2x3 SIMD_CFUNC simd_add(simd_double2x3 __x, simd_double2x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double3x3 __x,simd_double3x3 __y)1073 static simd_double3x3 SIMD_CFUNC simd_add(simd_double3x3 __x, simd_double3x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double4x3 __x,simd_double4x3 __y)1074 static simd_double4x3 SIMD_CFUNC simd_add(simd_double4x3 __x, simd_double4x3 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double2x4 __x,simd_double2x4 __y)1075 static simd_double2x4 SIMD_CFUNC simd_add(simd_double2x4 __x, simd_double2x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double3x4 __x,simd_double3x4 __y)1076 static simd_double3x4 SIMD_CFUNC simd_add(simd_double3x4 __x, simd_double3x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
simd_add(simd_double4x4 __x,simd_double4x4 __y)1077 static simd_double4x4 SIMD_CFUNC simd_add(simd_double4x4 __x, simd_double4x4 __y) { return simd_linear_combination(1, __x, 1, __y); }
1078
simd_sub(simd_float2x2 __x,simd_float2x2 __y)1079 static simd_float2x2 SIMD_CFUNC simd_sub(simd_float2x2 __x, simd_float2x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float3x2 __x,simd_float3x2 __y)1080 static simd_float3x2 SIMD_CFUNC simd_sub(simd_float3x2 __x, simd_float3x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float4x2 __x,simd_float4x2 __y)1081 static simd_float4x2 SIMD_CFUNC simd_sub(simd_float4x2 __x, simd_float4x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float2x3 __x,simd_float2x3 __y)1082 static simd_float2x3 SIMD_CFUNC simd_sub(simd_float2x3 __x, simd_float2x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float3x3 __x,simd_float3x3 __y)1083 static simd_float3x3 SIMD_CFUNC simd_sub(simd_float3x3 __x, simd_float3x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float4x3 __x,simd_float4x3 __y)1084 static simd_float4x3 SIMD_CFUNC simd_sub(simd_float4x3 __x, simd_float4x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float2x4 __x,simd_float2x4 __y)1085 static simd_float2x4 SIMD_CFUNC simd_sub(simd_float2x4 __x, simd_float2x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float3x4 __x,simd_float3x4 __y)1086 static simd_float3x4 SIMD_CFUNC simd_sub(simd_float3x4 __x, simd_float3x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_float4x4 __x,simd_float4x4 __y)1087 static simd_float4x4 SIMD_CFUNC simd_sub(simd_float4x4 __x, simd_float4x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double2x2 __x,simd_double2x2 __y)1088 static simd_double2x2 SIMD_CFUNC simd_sub(simd_double2x2 __x, simd_double2x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double3x2 __x,simd_double3x2 __y)1089 static simd_double3x2 SIMD_CFUNC simd_sub(simd_double3x2 __x, simd_double3x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double4x2 __x,simd_double4x2 __y)1090 static simd_double4x2 SIMD_CFUNC simd_sub(simd_double4x2 __x, simd_double4x2 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double2x3 __x,simd_double2x3 __y)1091 static simd_double2x3 SIMD_CFUNC simd_sub(simd_double2x3 __x, simd_double2x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double3x3 __x,simd_double3x3 __y)1092 static simd_double3x3 SIMD_CFUNC simd_sub(simd_double3x3 __x, simd_double3x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double4x3 __x,simd_double4x3 __y)1093 static simd_double4x3 SIMD_CFUNC simd_sub(simd_double4x3 __x, simd_double4x3 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double2x4 __x,simd_double2x4 __y)1094 static simd_double2x4 SIMD_CFUNC simd_sub(simd_double2x4 __x, simd_double2x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double3x4 __x,simd_double3x4 __y)1095 static simd_double3x4 SIMD_CFUNC simd_sub(simd_double3x4 __x, simd_double3x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
simd_sub(simd_double4x4 __x,simd_double4x4 __y)1096 static simd_double4x4 SIMD_CFUNC simd_sub(simd_double4x4 __x, simd_double4x4 __y) { return simd_linear_combination(1, __x, -1, __y); }
1097
simd_transpose(simd_float2x2 __x)1098 static simd_float2x2 SIMD_CFUNC simd_transpose(simd_float2x2 __x) {
1099 #if defined __SSE__
1100 simd_float4 __x0, __x1;
1101 __x0.xy = __x.columns[0];
1102 __x1.xy = __x.columns[1];
1103 simd_float4 __r01 = _mm_unpacklo_ps(__x0, __x1);
1104 return simd_matrix(__r01.lo, __r01.hi);
1105 #else
1106 return simd_matrix((simd_float2){__x.columns[0][0], __x.columns[1][0]},
1107 (simd_float2){__x.columns[0][1], __x.columns[1][1]});
1108 #endif
1109 }
1110
simd_transpose(simd_float2x3 __x)1111 static simd_float3x2 SIMD_CFUNC simd_transpose(simd_float2x3 __x) {
1112 #if defined __SSE__
1113 simd_float4 __x0, __x1;
1114 __x0.xyz = __x.columns[0];
1115 __x1.xyz = __x.columns[1];
1116 simd_float4 __r01 = _mm_unpacklo_ps(__x0, __x1);
1117 simd_float4 __r2x = _mm_unpackhi_ps(__x0, __x1);
1118 return simd_matrix(__r01.lo, __r01.hi, __r2x.lo);
1119 #else
1120 return simd_matrix((simd_float2){__x.columns[0][0], __x.columns[1][0]},
1121 (simd_float2){__x.columns[0][1], __x.columns[1][1]},
1122 (simd_float2){__x.columns[0][2], __x.columns[1][2]});
1123 #endif
1124 }
1125
simd_transpose(simd_float2x4 __x)1126 static simd_float4x2 SIMD_CFUNC simd_transpose(simd_float2x4 __x) {
1127 #if defined __SSE__
1128 simd_float4 __r01 = _mm_unpacklo_ps(__x.columns[0], __x.columns[1]);
1129 simd_float4 __r23 = _mm_unpackhi_ps(__x.columns[0], __x.columns[1]);
1130 return simd_matrix(__r01.lo, __r01.hi, __r23.lo, __r23.hi);
1131 #else
1132 return simd_matrix((simd_float2){__x.columns[0][0], __x.columns[1][0]},
1133 (simd_float2){__x.columns[0][1], __x.columns[1][1]},
1134 (simd_float2){__x.columns[0][2], __x.columns[1][2]},
1135 (simd_float2){__x.columns[0][3], __x.columns[1][3]});
1136 #endif
1137 }
1138
simd_transpose(simd_float3x2 __x)1139 static simd_float2x3 SIMD_CFUNC simd_transpose(simd_float3x2 __x) {
1140 #if defined __SSE__
1141 simd_float4 __x0, __x1, __x2;
1142 __x0.xy = __x.columns[0];
1143 __x1.xy = __x.columns[1];
1144 __x2.xy = __x.columns[2];
1145 simd_float4 __t = _mm_unpacklo_ps(__x0, __x1);
1146 simd_float4 __r0 = _mm_shuffle_ps(__t,__x2,0xc4);
1147 simd_float4 __r1 = _mm_shuffle_ps(__t,__x2,0xde);
1148 return simd_matrix(__r0.xyz, __r1.xyz);
1149 #else
1150 return simd_matrix((simd_float3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1151 (simd_float3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]});
1152 #endif
1153 }
1154
simd_transpose(simd_float3x3 __x)1155 static simd_float3x3 SIMD_CFUNC simd_transpose(simd_float3x3 __x) {
1156 #if defined __SSE__
1157 simd_float4 __x0, __x1, __x2;
1158 __x0.xyz = __x.columns[0];
1159 __x1.xyz = __x.columns[1];
1160 __x2.xyz = __x.columns[2];
1161 simd_float4 __t0 = _mm_unpacklo_ps(__x0, __x1);
1162 simd_float4 __t1 = _mm_unpackhi_ps(__x0, __x1);
1163 simd_float4 __r0 = __t0; __r0.hi = __x2.lo;
1164 simd_float4 __r1 = _mm_shuffle_ps(__t0, __x2, 0xde);
1165 simd_float4 __r2 = __x2; __r2.lo = __t1.lo;
1166 return simd_matrix(__r0.xyz, __r1.xyz, __r2.xyz);
1167 #else
1168 return simd_matrix((simd_float3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1169 (simd_float3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]},
1170 (simd_float3){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2]});
1171 #endif
1172 }
1173
simd_transpose(simd_float3x4 __x)1174 static simd_float4x3 SIMD_CFUNC simd_transpose(simd_float3x4 __x) {
1175 #if defined __SSE__
1176 simd_float4 __t0 = _mm_unpacklo_ps(__x.columns[0],__x.columns[1]); /* 00 10 01 11 */
1177 simd_float4 __t1 = _mm_unpackhi_ps(__x.columns[0],__x.columns[1]); /* 02 12 03 13 */
1178 simd_float4 __r0 = __t0; __r0.hi = __x.columns[2].lo;
1179 simd_float4 __r1 = _mm_shuffle_ps(__t0, __x.columns[2], 0xde);
1180 simd_float4 __r2 = __x.columns[2]; __r2.lo = __t1.lo;
1181 simd_float4 __r3 = _mm_shuffle_ps(__t1, __x.columns[2], 0xfe);
1182 return simd_matrix(__r0.xyz, __r1.xyz, __r2.xyz, __r3.xyz);
1183 #else
1184 return simd_matrix((simd_float3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1185 (simd_float3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]},
1186 (simd_float3){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2]},
1187 (simd_float3){__x.columns[0][3], __x.columns[1][3], __x.columns[2][3]});
1188 #endif
1189 }
1190
simd_transpose(simd_float4x2 __x)1191 static simd_float2x4 SIMD_CFUNC simd_transpose(simd_float4x2 __x) {
1192 #if defined __SSE__
1193 simd_float4 __x0, __x1, __x2, __x3;
1194 __x0.xy = __x.columns[0];
1195 __x1.xy = __x.columns[1];
1196 __x2.xy = __x.columns[2];
1197 __x3.xy = __x.columns[3];
1198 simd_float4 __t0 = _mm_unpacklo_ps(__x0,__x2);
1199 simd_float4 __t1 = _mm_unpacklo_ps(__x1,__x3);
1200 simd_float4 __r0 = _mm_unpacklo_ps(__t0,__t1);
1201 simd_float4 __r1 = _mm_unpackhi_ps(__t0,__t1);
1202 return simd_matrix(__r0,__r1);
1203 #else
1204 return simd_matrix((simd_float4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1205 (simd_float4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]});
1206 #endif
1207 }
1208
simd_transpose(simd_float4x3 __x)1209 static simd_float3x4 SIMD_CFUNC simd_transpose(simd_float4x3 __x) {
1210 #if defined __SSE__
1211 simd_float4 __x0, __x1, __x2, __x3;
1212 __x0.xyz = __x.columns[0];
1213 __x1.xyz = __x.columns[1];
1214 __x2.xyz = __x.columns[2];
1215 __x3.xyz = __x.columns[3];
1216 simd_float4 __t0 = _mm_unpacklo_ps(__x0,__x2);
1217 simd_float4 __t1 = _mm_unpackhi_ps(__x0,__x2);
1218 simd_float4 __t2 = _mm_unpacklo_ps(__x1,__x3);
1219 simd_float4 __t3 = _mm_unpackhi_ps(__x1,__x3);
1220 simd_float4 __r0 = _mm_unpacklo_ps(__t0,__t2);
1221 simd_float4 __r1 = _mm_unpackhi_ps(__t0,__t2);
1222 simd_float4 __r2 = _mm_unpacklo_ps(__t1,__t3);
1223 return simd_matrix(__r0,__r1,__r2);
1224 #else
1225 return simd_matrix((simd_float4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1226 (simd_float4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]},
1227 (simd_float4){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2], __x.columns[3][2]});
1228 #endif
1229 }
1230
simd_transpose(simd_float4x4 __x)1231 static simd_float4x4 SIMD_CFUNC simd_transpose(simd_float4x4 __x) {
1232 #if defined __SSE__
1233 simd_float4 __t0 = _mm_unpacklo_ps(__x.columns[0],__x.columns[2]);
1234 simd_float4 __t1 = _mm_unpackhi_ps(__x.columns[0],__x.columns[2]);
1235 simd_float4 __t2 = _mm_unpacklo_ps(__x.columns[1],__x.columns[3]);
1236 simd_float4 __t3 = _mm_unpackhi_ps(__x.columns[1],__x.columns[3]);
1237 simd_float4 __r0 = _mm_unpacklo_ps(__t0,__t2);
1238 simd_float4 __r1 = _mm_unpackhi_ps(__t0,__t2);
1239 simd_float4 __r2 = _mm_unpacklo_ps(__t1,__t3);
1240 simd_float4 __r3 = _mm_unpackhi_ps(__t1,__t3);
1241 return simd_matrix(__r0,__r1,__r2,__r3);
1242 #else
1243 return simd_matrix((simd_float4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1244 (simd_float4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]},
1245 (simd_float4){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2], __x.columns[3][2]},
1246 (simd_float4){__x.columns[0][3], __x.columns[1][3], __x.columns[2][3], __x.columns[3][3]});
1247 #endif
1248 }
1249
simd_transpose(simd_double2x2 __x)1250 static simd_double2x2 SIMD_CFUNC simd_transpose(simd_double2x2 __x) {
1251 return simd_matrix((simd_double2){__x.columns[0][0], __x.columns[1][0]},
1252 (simd_double2){__x.columns[0][1], __x.columns[1][1]});
1253 }
1254
simd_transpose(simd_double2x3 __x)1255 static simd_double3x2 SIMD_CFUNC simd_transpose(simd_double2x3 __x) {
1256 return simd_matrix((simd_double2){__x.columns[0][0], __x.columns[1][0]},
1257 (simd_double2){__x.columns[0][1], __x.columns[1][1]},
1258 (simd_double2){__x.columns[0][2], __x.columns[1][2]});
1259 }
1260
simd_transpose(simd_double2x4 __x)1261 static simd_double4x2 SIMD_CFUNC simd_transpose(simd_double2x4 __x) {
1262 return simd_matrix((simd_double2){__x.columns[0][0], __x.columns[1][0]},
1263 (simd_double2){__x.columns[0][1], __x.columns[1][1]},
1264 (simd_double2){__x.columns[0][2], __x.columns[1][2]},
1265 (simd_double2){__x.columns[0][3], __x.columns[1][3]});
1266 }
1267
simd_transpose(simd_double3x2 __x)1268 static simd_double2x3 SIMD_CFUNC simd_transpose(simd_double3x2 __x) {
1269 return simd_matrix((simd_double3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1270 (simd_double3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]});
1271 }
1272
simd_transpose(simd_double3x3 __x)1273 static simd_double3x3 SIMD_CFUNC simd_transpose(simd_double3x3 __x) {
1274 return simd_matrix((simd_double3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1275 (simd_double3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]},
1276 (simd_double3){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2]});
1277 }
1278
simd_transpose(simd_double3x4 __x)1279 static simd_double4x3 SIMD_CFUNC simd_transpose(simd_double3x4 __x) {
1280 return simd_matrix((simd_double3){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0]},
1281 (simd_double3){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1]},
1282 (simd_double3){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2]},
1283 (simd_double3){__x.columns[0][3], __x.columns[1][3], __x.columns[2][3]});
1284 }
1285
simd_transpose(simd_double4x2 __x)1286 static simd_double2x4 SIMD_CFUNC simd_transpose(simd_double4x2 __x) {
1287 return simd_matrix((simd_double4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1288 (simd_double4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]});
1289 }
1290
simd_transpose(simd_double4x3 __x)1291 static simd_double3x4 SIMD_CFUNC simd_transpose(simd_double4x3 __x) {
1292 return simd_matrix((simd_double4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1293 (simd_double4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]},
1294 (simd_double4){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2], __x.columns[3][2]});
1295 }
1296
simd_transpose(simd_double4x4 __x)1297 static simd_double4x4 SIMD_CFUNC simd_transpose(simd_double4x4 __x) {
1298 return simd_matrix((simd_double4){__x.columns[0][0], __x.columns[1][0], __x.columns[2][0], __x.columns[3][0]},
1299 (simd_double4){__x.columns[0][1], __x.columns[1][1], __x.columns[2][1], __x.columns[3][1]},
1300 (simd_double4){__x.columns[0][2], __x.columns[1][2], __x.columns[2][2], __x.columns[3][2]},
1301 (simd_double4){__x.columns[0][3], __x.columns[1][3], __x.columns[2][3], __x.columns[3][3]});
1302 }
1303
__rotate1(simd_float3 __x)1304 static simd_float3 SIMD_CFUNC __rotate1( simd_float3 __x) { return __builtin_shufflevector(__x,__x,1,2,0); }
__rotate2(simd_float3 __x)1305 static simd_float3 SIMD_CFUNC __rotate2( simd_float3 __x) { return __builtin_shufflevector(__x,__x,2,0,1); }
__rotate1(simd_float4 __x)1306 static simd_float4 SIMD_CFUNC __rotate1( simd_float4 __x) { return __builtin_shufflevector(__x,__x,1,2,3,0); }
__rotate2(simd_float4 __x)1307 static simd_float4 SIMD_CFUNC __rotate2( simd_float4 __x) { return __builtin_shufflevector(__x,__x,2,3,0,1); }
__rotate3(simd_float4 __x)1308 static simd_float4 SIMD_CFUNC __rotate3( simd_float4 __x) { return __builtin_shufflevector(__x,__x,3,0,1,2); }
__rotate1(simd_double3 __x)1309 static simd_double3 SIMD_CFUNC __rotate1(simd_double3 __x) { return __builtin_shufflevector(__x,__x,1,2,0); }
__rotate2(simd_double3 __x)1310 static simd_double3 SIMD_CFUNC __rotate2(simd_double3 __x) { return __builtin_shufflevector(__x,__x,2,0,1); }
__rotate1(simd_double4 __x)1311 static simd_double4 SIMD_CFUNC __rotate1(simd_double4 __x) { return __builtin_shufflevector(__x,__x,1,2,3,0); }
__rotate2(simd_double4 __x)1312 static simd_double4 SIMD_CFUNC __rotate2(simd_double4 __x) { return __builtin_shufflevector(__x,__x,2,3,0,1); }
__rotate3(simd_double4 __x)1313 static simd_double4 SIMD_CFUNC __rotate3(simd_double4 __x) { return __builtin_shufflevector(__x,__x,3,0,1,2); }
1314
simd_trace(simd_float2x2 __x)1315 static float SIMD_CFUNC simd_trace( simd_float2x2 __x) { return __x.columns[0][0] + __x.columns[1][1]; }
simd_trace(simd_double2x2 __x)1316 static double SIMD_CFUNC simd_trace(simd_double2x2 __x) { return __x.columns[0][0] + __x.columns[1][1]; }
simd_trace(simd_float3x3 __x)1317 static float SIMD_CFUNC simd_trace( simd_float3x3 __x) { return __x.columns[0][0] + __x.columns[1][1] + __x.columns[2][2]; }
simd_trace(simd_double3x3 __x)1318 static double SIMD_CFUNC simd_trace(simd_double3x3 __x) { return __x.columns[0][0] + __x.columns[1][1] + __x.columns[2][2]; }
simd_trace(simd_float4x4 __x)1319 static float SIMD_CFUNC simd_trace( simd_float4x4 __x) { return __x.columns[0][0] + __x.columns[1][1] + __x.columns[2][2] + __x.columns[3][3]; }
simd_trace(simd_double4x4 __x)1320 static double SIMD_CFUNC simd_trace(simd_double4x4 __x) { return __x.columns[0][0] + __x.columns[1][1] + __x.columns[2][2] + __x.columns[3][3]; }
1321
simd_determinant(simd_float2x2 __x)1322 static float SIMD_CFUNC simd_determinant( simd_float2x2 __x) { return __x.columns[0][0]*__x.columns[1][1] - __x.columns[0][1]*__x.columns[1][0]; }
simd_determinant(simd_double2x2 __x)1323 static double SIMD_CFUNC simd_determinant(simd_double2x2 __x) { return __x.columns[0][0]*__x.columns[1][1] - __x.columns[0][1]*__x.columns[1][0]; }
simd_determinant(simd_float3x3 __x)1324 static float SIMD_CFUNC simd_determinant( simd_float3x3 __x) { return simd_reduce_add(__x.columns[0]*(__rotate1(__x.columns[1])*__rotate2(__x.columns[2]) - __rotate2(__x.columns[1])*__rotate1(__x.columns[2]))); }
simd_determinant(simd_double3x3 __x)1325 static double SIMD_CFUNC simd_determinant(simd_double3x3 __x) { return simd_reduce_add(__x.columns[0]*(__rotate1(__x.columns[1])*__rotate2(__x.columns[2]) - __rotate2(__x.columns[1])*__rotate1(__x.columns[2]))); }
simd_determinant(simd_float4x4 __x)1326 static float SIMD_CFUNC simd_determinant( simd_float4x4 __x) {
1327 simd_float4 codet = __x.columns[0]*(__rotate1(__x.columns[1])*(__rotate2(__x.columns[2])*__rotate3(__x.columns[3])-__rotate3(__x.columns[2])*__rotate2(__x.columns[3])) +
1328 __rotate2(__x.columns[1])*(__rotate3(__x.columns[2])*__rotate1(__x.columns[3])-__rotate1(__x.columns[2])*__rotate3(__x.columns[3])) +
1329 __rotate3(__x.columns[1])*(__rotate1(__x.columns[2])*__rotate2(__x.columns[3])-__rotate2(__x.columns[2])*__rotate1(__x.columns[3])));
1330 return simd_reduce_add(codet.even - codet.odd);
1331 }
simd_determinant(simd_double4x4 __x)1332 static double SIMD_CFUNC simd_determinant(simd_double4x4 __x) {
1333 simd_double4 codet = __x.columns[0]*(__rotate1(__x.columns[1])*(__rotate2(__x.columns[2])*__rotate3(__x.columns[3])-__rotate3(__x.columns[2])*__rotate2(__x.columns[3])) +
1334 __rotate2(__x.columns[1])*(__rotate3(__x.columns[2])*__rotate1(__x.columns[3])-__rotate1(__x.columns[2])*__rotate3(__x.columns[3])) +
1335 __rotate3(__x.columns[1])*(__rotate1(__x.columns[2])*__rotate2(__x.columns[3])-__rotate2(__x.columns[2])*__rotate1(__x.columns[3])));
1336 return simd_reduce_add(codet.even - codet.odd);
1337 }
1338
simd_inverse(simd_float2x2 __x)1339 static simd_float2x2 SIMD_CFUNC simd_inverse( simd_float2x2 __x) { return __invert_f2(__x); }
simd_inverse(simd_float3x3 __x)1340 static simd_float3x3 SIMD_CFUNC simd_inverse( simd_float3x3 __x) { return __invert_f3(__x); }
simd_inverse(simd_float4x4 __x)1341 static simd_float4x4 SIMD_CFUNC simd_inverse( simd_float4x4 __x) { return __invert_f4(__x); }
simd_inverse(simd_double2x2 __x)1342 static simd_double2x2 SIMD_CFUNC simd_inverse(simd_double2x2 __x) { return __invert_d2(__x); }
simd_inverse(simd_double3x3 __x)1343 static simd_double3x3 SIMD_CFUNC simd_inverse(simd_double3x3 __x) { return __invert_d3(__x); }
simd_inverse(simd_double4x4 __x)1344 static simd_double4x4 SIMD_CFUNC simd_inverse(simd_double4x4 __x) { return __invert_d4(__x); }
1345
simd_mul(simd_float2x2 __x,simd_float2 __y)1346 static simd_float2 SIMD_CFUNC simd_mul( simd_float2x2 __x, simd_float2 __y) { simd_float2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_float2x3 __x,simd_float2 __y)1347 static simd_float3 SIMD_CFUNC simd_mul( simd_float2x3 __x, simd_float2 __y) { simd_float3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_float2x4 __x,simd_float2 __y)1348 static simd_float4 SIMD_CFUNC simd_mul( simd_float2x4 __x, simd_float2 __y) { simd_float4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_float3x2 __x,simd_float3 __y)1349 static simd_float2 SIMD_CFUNC simd_mul( simd_float3x2 __x, simd_float3 __y) { simd_float2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_float3x3 __x,simd_float3 __y)1350 static simd_float3 SIMD_CFUNC simd_mul( simd_float3x3 __x, simd_float3 __y) { simd_float3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_float3x4 __x,simd_float3 __y)1351 static simd_float4 SIMD_CFUNC simd_mul( simd_float3x4 __x, simd_float3 __y) { simd_float4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_float4x2 __x,simd_float4 __y)1352 static simd_float2 SIMD_CFUNC simd_mul( simd_float4x2 __x, simd_float4 __y) { simd_float2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
simd_mul(simd_float4x3 __x,simd_float4 __y)1353 static simd_float3 SIMD_CFUNC simd_mul( simd_float4x3 __x, simd_float4 __y) { simd_float3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
simd_mul(simd_float4x4 __x,simd_float4 __y)1354 static simd_float4 SIMD_CFUNC simd_mul( simd_float4x4 __x, simd_float4 __y) { simd_float4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
simd_mul(simd_double2x2 __x,simd_double2 __y)1355 static simd_double2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double2 __y) { simd_double2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_double2x3 __x,simd_double2 __y)1356 static simd_double3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double2 __y) { simd_double3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_double2x4 __x,simd_double2 __y)1357 static simd_double4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double2 __y) { simd_double4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); return __r; }
simd_mul(simd_double3x2 __x,simd_double3 __y)1358 static simd_double2 SIMD_CFUNC simd_mul(simd_double3x2 __x, simd_double3 __y) { simd_double2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_double3x3 __x,simd_double3 __y)1359 static simd_double3 SIMD_CFUNC simd_mul(simd_double3x3 __x, simd_double3 __y) { simd_double3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_double3x4 __x,simd_double3 __y)1360 static simd_double4 SIMD_CFUNC simd_mul(simd_double3x4 __x, simd_double3 __y) { simd_double4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); return __r; }
simd_mul(simd_double4x2 __x,simd_double4 __y)1361 static simd_double2 SIMD_CFUNC simd_mul(simd_double4x2 __x, simd_double4 __y) { simd_double2 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
simd_mul(simd_double4x3 __x,simd_double4 __y)1362 static simd_double3 SIMD_CFUNC simd_mul(simd_double4x3 __x, simd_double4 __y) { simd_double3 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
simd_mul(simd_double4x4 __x,simd_double4 __y)1363 static simd_double4 SIMD_CFUNC simd_mul(simd_double4x4 __x, simd_double4 __y) { simd_double4 __r = __x.columns[0]*__y[0]; __r = simd_muladd( __x.columns[1], __y[1],__r); __r = simd_muladd( __x.columns[2], __y[2],__r); __r = simd_muladd( __x.columns[3], __y[3],__r); return __r; }
1364
simd_mul(simd_float2 __x,simd_float2x2 __y)1365 static simd_float2 SIMD_CFUNC simd_mul( simd_float2 __x, simd_float2x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float2 __x,simd_float3x2 __y)1366 static simd_float3 SIMD_CFUNC simd_mul( simd_float2 __x, simd_float3x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float2 __x,simd_float4x2 __y)1367 static simd_float4 SIMD_CFUNC simd_mul( simd_float2 __x, simd_float4x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float3 __x,simd_float2x3 __y)1368 static simd_float2 SIMD_CFUNC simd_mul( simd_float3 __x, simd_float2x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float3 __x,simd_float3x3 __y)1369 static simd_float3 SIMD_CFUNC simd_mul( simd_float3 __x, simd_float3x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float3 __x,simd_float4x3 __y)1370 static simd_float4 SIMD_CFUNC simd_mul( simd_float3 __x, simd_float4x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float4 __x,simd_float2x4 __y)1371 static simd_float2 SIMD_CFUNC simd_mul( simd_float4 __x, simd_float2x4 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float4 __x,simd_float3x4 __y)1372 static simd_float3 SIMD_CFUNC simd_mul( simd_float4 __x, simd_float3x4 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_float4 __x,simd_float4x4 __y)1373 static simd_float4 SIMD_CFUNC simd_mul( simd_float4 __x, simd_float4x4 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double2 __x,simd_double2x2 __y)1374 static simd_double2 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double2x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double2 __x,simd_double3x2 __y)1375 static simd_double3 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double3x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double2 __x,simd_double4x2 __y)1376 static simd_double4 SIMD_CFUNC simd_mul(simd_double2 __x, simd_double4x2 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double3 __x,simd_double2x3 __y)1377 static simd_double2 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double2x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double3 __x,simd_double3x3 __y)1378 static simd_double3 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double3x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double3 __x,simd_double4x3 __y)1379 static simd_double4 SIMD_CFUNC simd_mul(simd_double3 __x, simd_double4x3 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double4 __x,simd_double2x4 __y)1380 static simd_double2 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double2x4 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double4 __x,simd_double3x4 __y)1381 static simd_double3 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double3x4 __y) { return simd_mul(simd_transpose(__y), __x); }
simd_mul(simd_double4 __x,simd_double4x4 __y)1382 static simd_double4 SIMD_CFUNC simd_mul(simd_double4 __x, simd_double4x4 __y) { return simd_mul(simd_transpose(__y), __x); }
1383
simd_mul(simd_float2x2 __x,simd_float2x2 __y)1384 static simd_float2x2 SIMD_CFUNC simd_mul( simd_float2x2 __x, simd_float2x2 __y) { simd_float2x2 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_double2x2 __x,simd_double2x2 __y)1385 static simd_double2x2 SIMD_CFUNC simd_mul(simd_double2x2 __x, simd_double2x2 __y) { simd_double2x2 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_float2x3 __x,simd_float2x2 __y)1386 static simd_float2x3 SIMD_CFUNC simd_mul( simd_float2x3 __x, simd_float2x2 __y) { simd_float2x3 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_double2x3 __x,simd_double2x2 __y)1387 static simd_double2x3 SIMD_CFUNC simd_mul(simd_double2x3 __x, simd_double2x2 __y) { simd_double2x3 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_float2x4 __x,simd_float2x2 __y)1388 static simd_float2x4 SIMD_CFUNC simd_mul( simd_float2x4 __x, simd_float2x2 __y) { simd_float2x4 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_double2x4 __x,simd_double2x2 __y)1389 static simd_double2x4 SIMD_CFUNC simd_mul(simd_double2x4 __x, simd_double2x2 __y) { simd_double2x4 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_float3x2 __x,simd_float2x3 __y)1390 static simd_float2x2 SIMD_CFUNC simd_mul( simd_float3x2 __x, simd_float2x3 __y) { simd_float2x2 __r; for (int i=0; i<2; ++i) __r.columns[i] = simd_mul(__x, __y.columns[i]); return __r; }
simd_mul(simd_double3x2 __x,simd_double2x3 __y)1391