1#include <functional>
2#include "taichi/ir/frontend_ir.h"
3#include "taichi/ir/ir.h"
4#include "taichi/ir/expression_ops.h"
5
6namespace taichi::lang {
7
8template <typename Tf, typename Ti>
9Expr svd_bitwise_or(const Expr &a, const Expr &b) {
10 return bit_cast<Tf>(bit_cast<Ti>(a) | bit_cast<Ti>(b));
11}
12
13template <typename Tf, typename Ti>
14Expr svd_bitwise_xor(const Expr &a, const Expr &b) {
15 return bit_cast<Tf>(bit_cast<Ti>(a) ^ bit_cast<Ti>(b));
16}
17
18template <typename Tf, typename Ti>
19Expr svd_bitwise_and(const Expr &a, const Expr &b) {
20 return bit_cast<Tf>(bit_cast<Ti>(a) & bit_cast<Ti>(b));
21}
22
23template <typename Tf, typename Ti>
24std::tuple<Expr,
25 Expr,
26 Expr,
27 Expr,
28 Expr,
29 Expr,
30 Expr,
31 Expr,
32 Expr,
33 Expr,
34 Expr,
35 Expr,
36 Expr,
37 Expr,
38 Expr,
39 Expr,
40 Expr,
41 Expr,
42 Expr,
43 Expr,
44 Expr>
45sifakis_svd_export(ASTBuilder *ast_builder, const Expr &mat, int num_iters) {
46 auto expanded_exprs = ast_builder->expand_exprs({mat});
47 TI_ASSERT(expanded_exprs.size() == 9);
48
49 Expr a00 = expanded_exprs[0];
50 Expr a01 = expanded_exprs[1];
51 Expr a02 = expanded_exprs[2];
52 Expr a10 = expanded_exprs[3];
53 Expr a11 = expanded_exprs[4];
54 Expr a12 = expanded_exprs[5];
55 Expr a20 = expanded_exprs[6];
56 Expr a21 = expanded_exprs[7];
57 Expr a22 = expanded_exprs[8];
58
59 static_assert(sizeof(Tf) == sizeof(Ti), "");
60 constexpr Tf Four_Gamma_Squared = 5.82842712474619f;
61 constexpr Tf Sine_Pi_Over_Eight = 0.3826834323650897f;
62 constexpr Tf Cosine_Pi_Over_Eight = 0.9238795325112867f;
63
64 std::string tb = "";
65 auto Var = [ast_builder, tb](const taichi::lang::Expr &x) {
66 return ast_builder->make_var(x, tb);
67 };
68
69 auto Sfour_gamma_squared = Var(Expr(Tf(0.0)));
70 auto Ssine_pi_over_eight = Var(Expr(Tf(0.0)));
71 auto Scosine_pi_over_eight = Var(Expr(Tf(0.0)));
72 auto Sone_half = Var(Expr(Tf(0.0)));
73 auto Sone = Var(Expr(Tf(0.0)));
74 auto Stiny_number = Var(Expr(Tf(0.0)));
75 auto Ssmall_number = Var(Expr(Tf(0.0)));
76 auto Sa11 = Var(Expr(Tf(0.0)));
77 auto Sa21 = Var(Expr(Tf(0.0)));
78 auto Sa31 = Var(Expr(Tf(0.0)));
79 auto Sa12 = Var(Expr(Tf(0.0)));
80 auto Sa22 = Var(Expr(Tf(0.0)));
81 auto Sa32 = Var(Expr(Tf(0.0)));
82 auto Sa13 = Var(Expr(Tf(0.0)));
83 auto Sa23 = Var(Expr(Tf(0.0)));
84 auto Sa33 = Var(Expr(Tf(0.0)));
85 auto Sv11 = Var(Expr(Tf(0.0)));
86 auto Sv21 = Var(Expr(Tf(0.0)));
87 auto Sv31 = Var(Expr(Tf(0.0)));
88 auto Sv12 = Var(Expr(Tf(0.0)));
89 auto Sv22 = Var(Expr(Tf(0.0)));
90 auto Sv32 = Var(Expr(Tf(0.0)));
91 auto Sv13 = Var(Expr(Tf(0.0)));
92 auto Sv23 = Var(Expr(Tf(0.0)));
93 auto Sv33 = Var(Expr(Tf(0.0)));
94 auto Su11 = Var(Expr(Tf(0.0)));
95 auto Su21 = Var(Expr(Tf(0.0)));
96 auto Su31 = Var(Expr(Tf(0.0)));
97 auto Su12 = Var(Expr(Tf(0.0)));
98 auto Su22 = Var(Expr(Tf(0.0)));
99 auto Su32 = Var(Expr(Tf(0.0)));
100 auto Su13 = Var(Expr(Tf(0.0)));
101 auto Su23 = Var(Expr(Tf(0.0)));
102 auto Su33 = Var(Expr(Tf(0.0)));
103 auto Sc = Var(Expr(Tf(0.0)));
104 auto Ss = Var(Expr(Tf(0.0)));
105 auto Sch = Var(Expr(Tf(0.0)));
106 auto Ssh = Var(Expr(Tf(0.0)));
107 auto Stmp1 = Var(Expr(Tf(0.0)));
108 auto Stmp2 = Var(Expr(Tf(0.0)));
109 auto Stmp3 = Var(Expr(Tf(0.0)));
110 auto Stmp4 = Var(Expr(Tf(0.0)));
111 auto Stmp5 = Var(Expr(Tf(0.0)));
112 auto Sqvs = Var(Expr(Tf(0.0)));
113 auto Sqvvx = Var(Expr(Tf(0.0)));
114 auto Sqvvy = Var(Expr(Tf(0.0)));
115 auto Sqvvz = Var(Expr(Tf(0.0)));
116 auto Ss11 = Var(Expr(Tf(0.0)));
117 auto Ss21 = Var(Expr(Tf(0.0)));
118 auto Ss31 = Var(Expr(Tf(0.0)));
119 auto Ss22 = Var(Expr(Tf(0.0)));
120 auto Ss32 = Var(Expr(Tf(0.0)));
121 auto Ss33 = Var(Expr(Tf(0.0)));
122 ast_builder->insert_assignment(Sfour_gamma_squared, Expr(Four_Gamma_Squared));
123 ast_builder->insert_assignment(Ssine_pi_over_eight, Expr(Sine_Pi_Over_Eight));
124 ast_builder->insert_assignment(Scosine_pi_over_eight,
125 Expr(Cosine_Pi_Over_Eight));
126 ast_builder->insert_assignment(Sone_half, Expr(Tf(0.5f)));
127 ast_builder->insert_assignment(Sone, Expr(Tf(1.0f)));
128 ast_builder->insert_assignment(Stiny_number, Expr(Tf(1.e-20f)));
129 ast_builder->insert_assignment(Ssmall_number, Expr(Tf(1.e-12f)));
130 ast_builder->insert_assignment(Sa11, a00);
131 ast_builder->insert_assignment(Sa21, a10);
132 ast_builder->insert_assignment(Sa31, a20);
133 ast_builder->insert_assignment(Sa12, a01);
134 ast_builder->insert_assignment(Sa22, a11);
135 ast_builder->insert_assignment(Sa32, a21);
136 ast_builder->insert_assignment(Sa13, a02);
137 ast_builder->insert_assignment(Sa23, a12);
138 ast_builder->insert_assignment(Sa33, a22);
139 ast_builder->insert_assignment(Sqvs, Expr(Tf(1.0f)));
140 ast_builder->insert_assignment(Sqvvx, Expr(Tf(0.0f)));
141 ast_builder->insert_assignment(Sqvvy, Expr(Tf(0.0f)));
142 ast_builder->insert_assignment(Sqvvz, Expr(Tf(0.0f)));
143 ast_builder->insert_assignment(Ss11, Sa11 * Sa11);
144 ast_builder->insert_assignment(Stmp1, Sa21 * Sa21);
145 ast_builder->insert_assignment(Ss11, Stmp1 + Ss11);
146 ast_builder->insert_assignment(Stmp1, Sa31 * Sa31);
147 ast_builder->insert_assignment(Ss11, Stmp1 + Ss11);
148 ast_builder->insert_assignment(Ss21, Sa12 * Sa11);
149 ast_builder->insert_assignment(Stmp1, Sa22 * Sa21);
150 ast_builder->insert_assignment(Ss21, Stmp1 + Ss21);
151 ast_builder->insert_assignment(Stmp1, Sa32 * Sa31);
152 ast_builder->insert_assignment(Ss21, Stmp1 + Ss21);
153 ast_builder->insert_assignment(Ss31, Sa13 * Sa11);
154 ast_builder->insert_assignment(Stmp1, Sa23 * Sa21);
155 ast_builder->insert_assignment(Ss31, Stmp1 + Ss31);
156 ast_builder->insert_assignment(Stmp1, Sa33 * Sa31);
157 ast_builder->insert_assignment(Ss31, Stmp1 + Ss31);
158 ast_builder->insert_assignment(Ss22, Sa12 * Sa12);
159 ast_builder->insert_assignment(Stmp1, Sa22 * Sa22);
160 ast_builder->insert_assignment(Ss22, Stmp1 + Ss22);
161 ast_builder->insert_assignment(Stmp1, Sa32 * Sa32);
162 ast_builder->insert_assignment(Ss22, Stmp1 + Ss22);
163 ast_builder->insert_assignment(Ss32, Sa13 * Sa12);
164 ast_builder->insert_assignment(Stmp1, Sa23 * Sa22);
165 ast_builder->insert_assignment(Ss32, Stmp1 + Ss32);
166 ast_builder->insert_assignment(Stmp1, Sa33 * Sa32);
167 ast_builder->insert_assignment(Ss32, Stmp1 + Ss32);
168 ast_builder->insert_assignment(Ss33, Sa13 * Sa13);
169 ast_builder->insert_assignment(Stmp1, Sa23 * Sa23);
170 ast_builder->insert_assignment(Ss33, Stmp1 + Ss33);
171 ast_builder->insert_assignment(Stmp1, Sa33 * Sa33);
172 ast_builder->insert_assignment(Ss33, Stmp1 + Ss33);
173 ast_builder->strictly_serialize();
174 ast_builder->insert_for(Expr(0), Expr(num_iters), [&](Expr sweep) {
175 ast_builder->insert_assignment(Ssh, Ss21 * Sone_half);
176 ast_builder->insert_assignment(Stmp5, Ss11 - Ss22);
177 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
178 ast_builder->insert_assignment(
179 Stmp1,
180 bit_cast<Tf>(expr_select(Stmp2 >= Stiny_number,
181 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
182 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp1, Ssh));
183 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp1, Stmp5));
184 ast_builder->insert_assignment(
185 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sone));
186 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
187 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
188 ast_builder->insert_assignment(Stmp2, Sch * Sch);
189 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
190 ast_builder->insert_assignment(Stmp4, rsqrt(Stmp3));
191 ast_builder->insert_assignment(Ssh, Stmp4 * Ssh);
192 ast_builder->insert_assignment(Sch, Stmp4 * Sch);
193 ast_builder->insert_assignment(Stmp1, Sfour_gamma_squared * Stmp1);
194 ast_builder->insert_assignment(
195 Stmp1, bit_cast<Tf>(expr_select(
196 Stmp2 <= Stmp1, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
197 ast_builder->insert_assignment(
198 Stmp2, svd_bitwise_and<Tf, Ti>(Ssine_pi_over_eight, Stmp1));
199 ast_builder->insert_assignment(
200 Ssh, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Ssh));
201 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
202 ast_builder->insert_assignment(
203 Stmp2, svd_bitwise_and<Tf, Ti>(Scosine_pi_over_eight, Stmp1));
204 ast_builder->insert_assignment(
205 Sch, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sch));
206 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
207 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
208 ast_builder->insert_assignment(Stmp2, Sch * Sch);
209 ast_builder->insert_assignment(Sc, Stmp2 - Stmp1);
210 ast_builder->insert_assignment(Ss, Sch * Ssh);
211 ast_builder->insert_assignment(Ss, Ss + Ss);
212 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
213 ast_builder->insert_assignment(Ss33, Ss33 * Stmp3);
214 ast_builder->insert_assignment(Ss31, Ss31 * Stmp3);
215 ast_builder->insert_assignment(Ss32, Ss32 * Stmp3);
216 ast_builder->insert_assignment(Ss33, Ss33 * Stmp3);
217 ast_builder->insert_assignment(Stmp1, Ss * Ss31);
218 ast_builder->insert_assignment(Stmp2, Ss * Ss32);
219 ast_builder->insert_assignment(Ss31, Sc * Ss31);
220 ast_builder->insert_assignment(Ss32, Sc * Ss32);
221 ast_builder->insert_assignment(Ss31, Stmp2 + Ss31);
222 ast_builder->insert_assignment(Ss32, Ss32 - Stmp1);
223 ast_builder->insert_assignment(Stmp2, Ss * Ss);
224 ast_builder->insert_assignment(Stmp1, Ss22 * Stmp2);
225 ast_builder->insert_assignment(Stmp3, Ss11 * Stmp2);
226 ast_builder->insert_assignment(Stmp4, Sc * Sc);
227 ast_builder->insert_assignment(Ss11, Ss11 * Stmp4);
228 ast_builder->insert_assignment(Ss22, Ss22 * Stmp4);
229 ast_builder->insert_assignment(Ss11, Ss11 + Stmp1);
230 ast_builder->insert_assignment(Ss22, Ss22 + Stmp3);
231 ast_builder->insert_assignment(Stmp4, Stmp4 - Stmp2);
232 ast_builder->insert_assignment(Stmp2, Ss21 + Ss21);
233 ast_builder->insert_assignment(Ss21, Ss21 * Stmp4);
234 ast_builder->insert_assignment(Stmp4, Sc * Ss);
235 ast_builder->insert_assignment(Stmp2, Stmp2 * Stmp4);
236 ast_builder->insert_assignment(Stmp5, Stmp5 * Stmp4);
237 ast_builder->insert_assignment(Ss11, Ss11 + Stmp2);
238 ast_builder->insert_assignment(Ss21, Ss21 - Stmp5);
239 ast_builder->insert_assignment(Ss22, Ss22 - Stmp2);
240 ast_builder->insert_assignment(Stmp1, Ssh * Sqvvx);
241 ast_builder->insert_assignment(Stmp2, Ssh * Sqvvy);
242 ast_builder->insert_assignment(Stmp3, Ssh * Sqvvz);
243 ast_builder->insert_assignment(Ssh, Ssh * Sqvs);
244 ast_builder->insert_assignment(Sqvs, Sch * Sqvs);
245 ast_builder->insert_assignment(Sqvvx, Sch * Sqvvx);
246 ast_builder->insert_assignment(Sqvvy, Sch * Sqvvy);
247 ast_builder->insert_assignment(Sqvvz, Sch * Sqvvz);
248 ast_builder->insert_assignment(Sqvvz, Sqvvz + Ssh);
249 ast_builder->insert_assignment(Sqvs, Sqvs - Stmp3);
250 ast_builder->insert_assignment(Sqvvx, Sqvvx + Stmp2);
251 ast_builder->insert_assignment(Sqvvy, Sqvvy - Stmp1);
252 ast_builder->insert_assignment(Ssh, Ss32 * Sone_half);
253 ast_builder->insert_assignment(Stmp5, Ss22 - Ss33);
254 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
255 ast_builder->insert_assignment(
256 Stmp1,
257 bit_cast<Tf>(expr_select(Stmp2 >= Stiny_number,
258 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
259 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp1, Ssh));
260 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp1, Stmp5));
261 ast_builder->insert_assignment(
262 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sone));
263 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
264 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
265 ast_builder->insert_assignment(Stmp2, Sch * Sch);
266 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
267 ast_builder->insert_assignment(Stmp4, rsqrt(Stmp3));
268 ast_builder->insert_assignment(Ssh, Stmp4 * Ssh);
269 ast_builder->insert_assignment(Sch, Stmp4 * Sch);
270 ast_builder->insert_assignment(Stmp1, Sfour_gamma_squared * Stmp1);
271 ast_builder->insert_assignment(
272 Stmp1, bit_cast<Tf>(expr_select(
273 Stmp2 <= Stmp1, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
274 ast_builder->insert_assignment(
275 Stmp2, svd_bitwise_and<Tf, Ti>(Ssine_pi_over_eight, Stmp1));
276 ast_builder->insert_assignment(
277 Ssh, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Ssh));
278 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
279 ast_builder->insert_assignment(
280 Stmp2, svd_bitwise_and<Tf, Ti>(Scosine_pi_over_eight, Stmp1));
281 ast_builder->insert_assignment(
282 Sch, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sch));
283 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
284 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
285 ast_builder->insert_assignment(Stmp2, Sch * Sch);
286 ast_builder->insert_assignment(Sc, Stmp2 - Stmp1);
287 ast_builder->insert_assignment(Ss, Sch * Ssh);
288 ast_builder->insert_assignment(Ss, Ss + Ss);
289 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
290 ast_builder->insert_assignment(Ss11, Ss11 * Stmp3);
291 ast_builder->insert_assignment(Ss21, Ss21 * Stmp3);
292 ast_builder->insert_assignment(Ss31, Ss31 * Stmp3);
293 ast_builder->insert_assignment(Ss11, Ss11 * Stmp3);
294 ast_builder->insert_assignment(Stmp1, Ss * Ss21);
295 ast_builder->insert_assignment(Stmp2, Ss * Ss31);
296 ast_builder->insert_assignment(Ss21, Sc * Ss21);
297 ast_builder->insert_assignment(Ss31, Sc * Ss31);
298 ast_builder->insert_assignment(Ss21, Stmp2 + Ss21);
299 ast_builder->insert_assignment(Ss31, Ss31 - Stmp1);
300 ast_builder->insert_assignment(Stmp2, Ss * Ss);
301 ast_builder->insert_assignment(Stmp1, Ss33 * Stmp2);
302 ast_builder->insert_assignment(Stmp3, Ss22 * Stmp2);
303 ast_builder->insert_assignment(Stmp4, Sc * Sc);
304 ast_builder->insert_assignment(Ss22, Ss22 * Stmp4);
305 ast_builder->insert_assignment(Ss33, Ss33 * Stmp4);
306 ast_builder->insert_assignment(Ss22, Ss22 + Stmp1);
307 ast_builder->insert_assignment(Ss33, Ss33 + Stmp3);
308 ast_builder->insert_assignment(Stmp4, Stmp4 - Stmp2);
309 ast_builder->insert_assignment(Stmp2, Ss32 + Ss32);
310 ast_builder->insert_assignment(Ss32, Ss32 * Stmp4);
311 ast_builder->insert_assignment(Stmp4, Sc * Ss);
312 ast_builder->insert_assignment(Stmp2, Stmp2 * Stmp4);
313 ast_builder->insert_assignment(Stmp5, Stmp5 * Stmp4);
314 ast_builder->insert_assignment(Ss22, Ss22 + Stmp2);
315 ast_builder->insert_assignment(Ss32, Ss32 - Stmp5);
316 ast_builder->insert_assignment(Ss33, Ss33 - Stmp2);
317 ast_builder->insert_assignment(Stmp1, Ssh * Sqvvx);
318 ast_builder->insert_assignment(Stmp2, Ssh * Sqvvy);
319 ast_builder->insert_assignment(Stmp3, Ssh * Sqvvz);
320 ast_builder->insert_assignment(Ssh, Ssh * Sqvs);
321 ast_builder->insert_assignment(Sqvs, Sch * Sqvs);
322 ast_builder->insert_assignment(Sqvvx, Sch * Sqvvx);
323 ast_builder->insert_assignment(Sqvvy, Sch * Sqvvy);
324 ast_builder->insert_assignment(Sqvvz, Sch * Sqvvz);
325 ast_builder->insert_assignment(Sqvvx, Sqvvx + Ssh);
326 ast_builder->insert_assignment(Sqvs, Sqvs - Stmp1);
327 ast_builder->insert_assignment(Sqvvy, Sqvvy + Stmp3);
328 ast_builder->insert_assignment(Sqvvz, Sqvvz - Stmp2);
329 ast_builder->insert_assignment(Ssh, Ss31 * Sone_half);
330 ast_builder->insert_assignment(Stmp5, Ss33 - Ss11);
331 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
332 ast_builder->insert_assignment(
333 Stmp1,
334 bit_cast<Tf>(expr_select(Stmp2 >= Stiny_number,
335 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
336 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp1, Ssh));
337 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp1, Stmp5));
338 ast_builder->insert_assignment(
339 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sone));
340 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
341 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
342 ast_builder->insert_assignment(Stmp2, Sch * Sch);
343 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
344 ast_builder->insert_assignment(Stmp4, rsqrt(Stmp3));
345 ast_builder->insert_assignment(Ssh, Stmp4 * Ssh);
346 ast_builder->insert_assignment(Sch, Stmp4 * Sch);
347 ast_builder->insert_assignment(Stmp1, Sfour_gamma_squared * Stmp1);
348 ast_builder->insert_assignment(
349 Stmp1, bit_cast<Tf>(expr_select(
350 Stmp2 <= Stmp1, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
351 ast_builder->insert_assignment(
352 Stmp2, svd_bitwise_and<Tf, Ti>(Ssine_pi_over_eight, Stmp1));
353 ast_builder->insert_assignment(
354 Ssh, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Ssh));
355 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
356 ast_builder->insert_assignment(
357 Stmp2, svd_bitwise_and<Tf, Ti>(Scosine_pi_over_eight, Stmp1));
358 ast_builder->insert_assignment(
359 Sch, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp1)), Sch));
360 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp2));
361 ast_builder->insert_assignment(Stmp1, Ssh * Ssh);
362 ast_builder->insert_assignment(Stmp2, Sch * Sch);
363 ast_builder->insert_assignment(Sc, Stmp2 - Stmp1);
364 ast_builder->insert_assignment(Ss, Sch * Ssh);
365 ast_builder->insert_assignment(Ss, Ss + Ss);
366 ast_builder->insert_assignment(Stmp3, Stmp1 + Stmp2);
367 ast_builder->insert_assignment(Ss22, Ss22 * Stmp3);
368 ast_builder->insert_assignment(Ss32, Ss32 * Stmp3);
369 ast_builder->insert_assignment(Ss21, Ss21 * Stmp3);
370 ast_builder->insert_assignment(Ss22, Ss22 * Stmp3);
371 ast_builder->insert_assignment(Stmp1, Ss * Ss32);
372 ast_builder->insert_assignment(Stmp2, Ss * Ss21);
373 ast_builder->insert_assignment(Ss32, Sc * Ss32);
374 ast_builder->insert_assignment(Ss21, Sc * Ss21);
375 ast_builder->insert_assignment(Ss32, Stmp2 + Ss32);
376 ast_builder->insert_assignment(Ss21, Ss21 - Stmp1);
377 ast_builder->insert_assignment(Stmp2, Ss * Ss);
378 ast_builder->insert_assignment(Stmp1, Ss11 * Stmp2);
379 ast_builder->insert_assignment(Stmp3, Ss33 * Stmp2);
380 ast_builder->insert_assignment(Stmp4, Sc * Sc);
381 ast_builder->insert_assignment(Ss33, Ss33 * Stmp4);
382 ast_builder->insert_assignment(Ss11, Ss11 * Stmp4);
383 ast_builder->insert_assignment(Ss33, Ss33 + Stmp1);
384 ast_builder->insert_assignment(Ss11, Ss11 + Stmp3);
385 ast_builder->insert_assignment(Stmp4, Stmp4 - Stmp2);
386 ast_builder->insert_assignment(Stmp2, Ss31 + Ss31);
387 ast_builder->insert_assignment(Ss31, Ss31 * Stmp4);
388 ast_builder->insert_assignment(Stmp4, Sc * Ss);
389 ast_builder->insert_assignment(Stmp2, Stmp2 * Stmp4);
390 ast_builder->insert_assignment(Stmp5, Stmp5 * Stmp4);
391 ast_builder->insert_assignment(Ss33, Ss33 + Stmp2);
392 ast_builder->insert_assignment(Ss31, Ss31 - Stmp5);
393 ast_builder->insert_assignment(Ss11, Ss11 - Stmp2);
394 ast_builder->insert_assignment(Stmp1, Ssh * Sqvvx);
395 ast_builder->insert_assignment(Stmp2, Ssh * Sqvvy);
396 ast_builder->insert_assignment(Stmp3, Ssh * Sqvvz);
397 ast_builder->insert_assignment(Ssh, Ssh * Sqvs);
398 ast_builder->insert_assignment(Sqvs, Sch * Sqvs);
399 ast_builder->insert_assignment(Sqvvx, Sch * Sqvvx);
400 ast_builder->insert_assignment(Sqvvy, Sch * Sqvvy);
401 ast_builder->insert_assignment(Sqvvz, Sch * Sqvvz);
402 ast_builder->insert_assignment(Sqvvy, Sqvvy + Ssh);
403 ast_builder->insert_assignment(Sqvs, Sqvs - Stmp2);
404 ast_builder->insert_assignment(Sqvvz, Sqvvz + Stmp1);
405 ast_builder->insert_assignment(Sqvvx, Sqvvx - Stmp3);
406 });
407 ast_builder->insert_assignment(Stmp2, Sqvs * Sqvs);
408 ast_builder->insert_assignment(Stmp1, Sqvvx * Sqvvx);
409 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
410 ast_builder->insert_assignment(Stmp1, Sqvvy * Sqvvy);
411 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
412 ast_builder->insert_assignment(Stmp1, Sqvvz * Sqvvz);
413 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
414 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
415 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
416 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
417 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
418 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
419 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
420 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
421 ast_builder->insert_assignment(Sqvs, Sqvs * Stmp1);
422 ast_builder->insert_assignment(Sqvvx, Sqvvx * Stmp1);
423 ast_builder->insert_assignment(Sqvvy, Sqvvy * Stmp1);
424 ast_builder->insert_assignment(Sqvvz, Sqvvz * Stmp1);
425 ast_builder->insert_assignment(Stmp1, Sqvvx * Sqvvx);
426 ast_builder->insert_assignment(Stmp2, Sqvvy * Sqvvy);
427 ast_builder->insert_assignment(Stmp3, Sqvvz * Sqvvz);
428 ast_builder->insert_assignment(Sv11, Sqvs * Sqvs);
429 ast_builder->insert_assignment(Sv22, Sv11 - Stmp1);
430 ast_builder->insert_assignment(Sv33, Sv22 - Stmp2);
431 ast_builder->insert_assignment(Sv33, Sv33 + Stmp3);
432 ast_builder->insert_assignment(Sv22, Sv22 + Stmp2);
433 ast_builder->insert_assignment(Sv22, Sv22 - Stmp3);
434 ast_builder->insert_assignment(Sv11, Sv11 + Stmp1);
435 ast_builder->insert_assignment(Sv11, Sv11 - Stmp2);
436 ast_builder->insert_assignment(Sv11, Sv11 - Stmp3);
437 ast_builder->insert_assignment(Stmp1, Sqvvx + Sqvvx);
438 ast_builder->insert_assignment(Stmp2, Sqvvy + Sqvvy);
439 ast_builder->insert_assignment(Stmp3, Sqvvz + Sqvvz);
440 ast_builder->insert_assignment(Sv32, Sqvs * Stmp1);
441 ast_builder->insert_assignment(Sv13, Sqvs * Stmp2);
442 ast_builder->insert_assignment(Sv21, Sqvs * Stmp3);
443 ast_builder->insert_assignment(Stmp1, Sqvvy * Stmp1);
444 ast_builder->insert_assignment(Stmp2, Sqvvz * Stmp2);
445 ast_builder->insert_assignment(Stmp3, Sqvvx * Stmp3);
446 ast_builder->insert_assignment(Sv12, Stmp1 - Sv21);
447 ast_builder->insert_assignment(Sv23, Stmp2 - Sv32);
448 ast_builder->insert_assignment(Sv31, Stmp3 - Sv13);
449 ast_builder->insert_assignment(Sv21, Stmp1 + Sv21);
450 ast_builder->insert_assignment(Sv32, Stmp2 + Sv32);
451 ast_builder->insert_assignment(Sv13, Stmp3 + Sv13);
452 ast_builder->insert_assignment(Stmp2, Sa12);
453 ast_builder->insert_assignment(Stmp3, Sa13);
454 ast_builder->insert_assignment(Sa12, Sv12 * Sa11);
455 ast_builder->insert_assignment(Sa13, Sv13 * Sa11);
456 ast_builder->insert_assignment(Sa11, Sv11 * Sa11);
457 ast_builder->insert_assignment(Stmp1, Sv21 * Stmp2);
458 ast_builder->insert_assignment(Sa11, Sa11 + Stmp1);
459 ast_builder->insert_assignment(Stmp1, Sv31 * Stmp3);
460 ast_builder->insert_assignment(Sa11, Sa11 + Stmp1);
461 ast_builder->insert_assignment(Stmp1, Sv22 * Stmp2);
462 ast_builder->insert_assignment(Sa12, Sa12 + Stmp1);
463 ast_builder->insert_assignment(Stmp1, Sv32 * Stmp3);
464 ast_builder->insert_assignment(Sa12, Sa12 + Stmp1);
465 ast_builder->insert_assignment(Stmp1, Sv23 * Stmp2);
466 ast_builder->insert_assignment(Sa13, Sa13 + Stmp1);
467 ast_builder->insert_assignment(Stmp1, Sv33 * Stmp3);
468 ast_builder->insert_assignment(Sa13, Sa13 + Stmp1);
469 ast_builder->insert_assignment(Stmp2, Sa22);
470 ast_builder->insert_assignment(Stmp3, Sa23);
471 ast_builder->insert_assignment(Sa22, Sv12 * Sa21);
472 ast_builder->insert_assignment(Sa23, Sv13 * Sa21);
473 ast_builder->insert_assignment(Sa21, Sv11 * Sa21);
474 ast_builder->insert_assignment(Stmp1, Sv21 * Stmp2);
475 ast_builder->insert_assignment(Sa21, Sa21 + Stmp1);
476 ast_builder->insert_assignment(Stmp1, Sv31 * Stmp3);
477 ast_builder->insert_assignment(Sa21, Sa21 + Stmp1);
478 ast_builder->insert_assignment(Stmp1, Sv22 * Stmp2);
479 ast_builder->insert_assignment(Sa22, Sa22 + Stmp1);
480 ast_builder->insert_assignment(Stmp1, Sv32 * Stmp3);
481 ast_builder->insert_assignment(Sa22, Sa22 + Stmp1);
482 ast_builder->insert_assignment(Stmp1, Sv23 * Stmp2);
483 ast_builder->insert_assignment(Sa23, Sa23 + Stmp1);
484 ast_builder->insert_assignment(Stmp1, Sv33 * Stmp3);
485 ast_builder->insert_assignment(Sa23, Sa23 + Stmp1);
486 ast_builder->insert_assignment(Stmp2, Sa32);
487 ast_builder->insert_assignment(Stmp3, Sa33);
488 ast_builder->insert_assignment(Sa32, Sv12 * Sa31);
489 ast_builder->insert_assignment(Sa33, Sv13 * Sa31);
490 ast_builder->insert_assignment(Sa31, Sv11 * Sa31);
491 ast_builder->insert_assignment(Stmp1, Sv21 * Stmp2);
492 ast_builder->insert_assignment(Sa31, Sa31 + Stmp1);
493 ast_builder->insert_assignment(Stmp1, Sv31 * Stmp3);
494 ast_builder->insert_assignment(Sa31, Sa31 + Stmp1);
495 ast_builder->insert_assignment(Stmp1, Sv22 * Stmp2);
496 ast_builder->insert_assignment(Sa32, Sa32 + Stmp1);
497 ast_builder->insert_assignment(Stmp1, Sv32 * Stmp3);
498 ast_builder->insert_assignment(Sa32, Sa32 + Stmp1);
499 ast_builder->insert_assignment(Stmp1, Sv23 * Stmp2);
500 ast_builder->insert_assignment(Sa33, Sa33 + Stmp1);
501 ast_builder->insert_assignment(Stmp1, Sv33 * Stmp3);
502 ast_builder->insert_assignment(Sa33, Sa33 + Stmp1);
503 ast_builder->insert_assignment(Stmp1, Sa11 * Sa11);
504 ast_builder->insert_assignment(Stmp4, Sa21 * Sa21);
505 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
506 ast_builder->insert_assignment(Stmp4, Sa31 * Sa31);
507 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
508 ast_builder->insert_assignment(Stmp2, Sa12 * Sa12);
509 ast_builder->insert_assignment(Stmp4, Sa22 * Sa22);
510 ast_builder->insert_assignment(Stmp2, Stmp2 + Stmp4);
511 ast_builder->insert_assignment(Stmp4, Sa32 * Sa32);
512 ast_builder->insert_assignment(Stmp2, Stmp2 + Stmp4);
513 ast_builder->insert_assignment(Stmp3, Sa13 * Sa13);
514 ast_builder->insert_assignment(Stmp4, Sa23 * Sa23);
515 ast_builder->insert_assignment(Stmp3, Stmp3 + Stmp4);
516 ast_builder->insert_assignment(Stmp4, Sa33 * Sa33);
517 ast_builder->insert_assignment(Stmp3, Stmp3 + Stmp4);
518 ast_builder->insert_assignment(
519 Stmp4, bit_cast<Tf>(expr_select(
520 Stmp1 < Stmp2, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
521 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa11, Sa12));
522 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
523 ast_builder->insert_assignment(Sa11, svd_bitwise_xor<Tf, Ti>(Sa11, Stmp5));
524 ast_builder->insert_assignment(Sa12, svd_bitwise_xor<Tf, Ti>(Sa12, Stmp5));
525 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa21, Sa22));
526 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
527 ast_builder->insert_assignment(Sa21, svd_bitwise_xor<Tf, Ti>(Sa21, Stmp5));
528 ast_builder->insert_assignment(Sa22, svd_bitwise_xor<Tf, Ti>(Sa22, Stmp5));
529 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa31, Sa32));
530 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
531 ast_builder->insert_assignment(Sa31, svd_bitwise_xor<Tf, Ti>(Sa31, Stmp5));
532 ast_builder->insert_assignment(Sa32, svd_bitwise_xor<Tf, Ti>(Sa32, Stmp5));
533 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv11, Sv12));
534 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
535 ast_builder->insert_assignment(Sv11, svd_bitwise_xor<Tf, Ti>(Sv11, Stmp5));
536 ast_builder->insert_assignment(Sv12, svd_bitwise_xor<Tf, Ti>(Sv12, Stmp5));
537 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv21, Sv22));
538 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
539 ast_builder->insert_assignment(Sv21, svd_bitwise_xor<Tf, Ti>(Sv21, Stmp5));
540 ast_builder->insert_assignment(Sv22, svd_bitwise_xor<Tf, Ti>(Sv22, Stmp5));
541 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv31, Sv32));
542 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
543 ast_builder->insert_assignment(Sv31, svd_bitwise_xor<Tf, Ti>(Sv31, Stmp5));
544 ast_builder->insert_assignment(Sv32, svd_bitwise_xor<Tf, Ti>(Sv32, Stmp5));
545 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Stmp1, Stmp2));
546 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
547 ast_builder->insert_assignment(Stmp1, svd_bitwise_xor<Tf, Ti>(Stmp1, Stmp5));
548 ast_builder->insert_assignment(Stmp2, svd_bitwise_xor<Tf, Ti>(Stmp2, Stmp5));
549 ast_builder->insert_assignment(Stmp5, Expr(Tf(-2.0f)));
550 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
551 ast_builder->insert_assignment(Stmp4, Expr(Tf(1.0f)));
552 ast_builder->insert_assignment(Stmp4, Stmp4 + Stmp5);
553 ast_builder->insert_assignment(Sa12, Sa12 * Stmp4);
554 ast_builder->insert_assignment(Sa22, Sa22 * Stmp4);
555 ast_builder->insert_assignment(Sa32, Sa32 * Stmp4);
556 ast_builder->insert_assignment(Sv12, Sv12 * Stmp4);
557 ast_builder->insert_assignment(Sv22, Sv22 * Stmp4);
558 ast_builder->insert_assignment(Sv32, Sv32 * Stmp4);
559 ast_builder->insert_assignment(
560 Stmp4, bit_cast<Tf>(expr_select(
561 Stmp1 < Stmp3, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
562 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa11, Sa13));
563 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
564 ast_builder->insert_assignment(Sa11, svd_bitwise_xor<Tf, Ti>(Sa11, Stmp5));
565 ast_builder->insert_assignment(Sa13, svd_bitwise_xor<Tf, Ti>(Sa13, Stmp5));
566 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa21, Sa23));
567 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
568 ast_builder->insert_assignment(Sa21, svd_bitwise_xor<Tf, Ti>(Sa21, Stmp5));
569 ast_builder->insert_assignment(Sa23, svd_bitwise_xor<Tf, Ti>(Sa23, Stmp5));
570 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa31, Sa33));
571 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
572 ast_builder->insert_assignment(Sa31, svd_bitwise_xor<Tf, Ti>(Sa31, Stmp5));
573 ast_builder->insert_assignment(Sa33, svd_bitwise_xor<Tf, Ti>(Sa33, Stmp5));
574 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv11, Sv13));
575 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
576 ast_builder->insert_assignment(Sv11, svd_bitwise_xor<Tf, Ti>(Sv11, Stmp5));
577 ast_builder->insert_assignment(Sv13, svd_bitwise_xor<Tf, Ti>(Sv13, Stmp5));
578 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv21, Sv23));
579 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
580 ast_builder->insert_assignment(Sv21, svd_bitwise_xor<Tf, Ti>(Sv21, Stmp5));
581 ast_builder->insert_assignment(Sv23, svd_bitwise_xor<Tf, Ti>(Sv23, Stmp5));
582 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv31, Sv33));
583 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
584 ast_builder->insert_assignment(Sv31, svd_bitwise_xor<Tf, Ti>(Sv31, Stmp5));
585 ast_builder->insert_assignment(Sv33, svd_bitwise_xor<Tf, Ti>(Sv33, Stmp5));
586 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Stmp1, Stmp3));
587 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
588 ast_builder->insert_assignment(Stmp1, svd_bitwise_xor<Tf, Ti>(Stmp1, Stmp5));
589 ast_builder->insert_assignment(Stmp3, svd_bitwise_xor<Tf, Ti>(Stmp3, Stmp5));
590 ast_builder->insert_assignment(Stmp5, Expr(Tf(-2.0f)));
591 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
592 ast_builder->insert_assignment(Stmp4, Expr(Tf(1.0f)));
593 ast_builder->insert_assignment(Stmp4, Stmp4 + Stmp5);
594 ast_builder->insert_assignment(Sa11, Sa11 * Stmp4);
595 ast_builder->insert_assignment(Sa21, Sa21 * Stmp4);
596 ast_builder->insert_assignment(Sa31, Sa31 * Stmp4);
597 ast_builder->insert_assignment(Sv11, Sv11 * Stmp4);
598 ast_builder->insert_assignment(Sv21, Sv21 * Stmp4);
599 ast_builder->insert_assignment(Sv31, Sv31 * Stmp4);
600 ast_builder->insert_assignment(
601 Stmp4, bit_cast<Tf>(expr_select(
602 Stmp2 < Stmp3, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
603 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa12, Sa13));
604 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
605 ast_builder->insert_assignment(Sa12, svd_bitwise_xor<Tf, Ti>(Sa12, Stmp5));
606 ast_builder->insert_assignment(Sa13, svd_bitwise_xor<Tf, Ti>(Sa13, Stmp5));
607 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa22, Sa23));
608 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
609 ast_builder->insert_assignment(Sa22, svd_bitwise_xor<Tf, Ti>(Sa22, Stmp5));
610 ast_builder->insert_assignment(Sa23, svd_bitwise_xor<Tf, Ti>(Sa23, Stmp5));
611 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sa32, Sa33));
612 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
613 ast_builder->insert_assignment(Sa32, svd_bitwise_xor<Tf, Ti>(Sa32, Stmp5));
614 ast_builder->insert_assignment(Sa33, svd_bitwise_xor<Tf, Ti>(Sa33, Stmp5));
615 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv12, Sv13));
616 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
617 ast_builder->insert_assignment(Sv12, svd_bitwise_xor<Tf, Ti>(Sv12, Stmp5));
618 ast_builder->insert_assignment(Sv13, svd_bitwise_xor<Tf, Ti>(Sv13, Stmp5));
619 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv22, Sv23));
620 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
621 ast_builder->insert_assignment(Sv22, svd_bitwise_xor<Tf, Ti>(Sv22, Stmp5));
622 ast_builder->insert_assignment(Sv23, svd_bitwise_xor<Tf, Ti>(Sv23, Stmp5));
623 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Sv32, Sv33));
624 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
625 ast_builder->insert_assignment(Sv32, svd_bitwise_xor<Tf, Ti>(Sv32, Stmp5));
626 ast_builder->insert_assignment(Sv33, svd_bitwise_xor<Tf, Ti>(Sv33, Stmp5));
627 ast_builder->insert_assignment(Stmp5, svd_bitwise_xor<Tf, Ti>(Stmp2, Stmp3));
628 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
629 ast_builder->insert_assignment(Stmp2, svd_bitwise_xor<Tf, Ti>(Stmp2, Stmp5));
630 ast_builder->insert_assignment(Stmp3, svd_bitwise_xor<Tf, Ti>(Stmp3, Stmp5));
631 ast_builder->insert_assignment(Stmp5, Expr(Tf(-2.0f)));
632 ast_builder->insert_assignment(Stmp5, svd_bitwise_and<Tf, Ti>(Stmp5, Stmp4));
633 ast_builder->insert_assignment(Stmp4, Expr(Tf(1.0f)));
634 ast_builder->insert_assignment(Stmp4, Stmp4 + Stmp5);
635 ast_builder->insert_assignment(Sa13, Sa13 * Stmp4);
636 ast_builder->insert_assignment(Sa23, Sa23 * Stmp4);
637 ast_builder->insert_assignment(Sa33, Sa33 * Stmp4);
638 ast_builder->insert_assignment(Sv13, Sv13 * Stmp4);
639 ast_builder->insert_assignment(Sv23, Sv23 * Stmp4);
640 ast_builder->insert_assignment(Sv33, Sv33 * Stmp4);
641 ast_builder->insert_assignment(Su11, Expr(Tf(1.0f)));
642 ast_builder->insert_assignment(Su21, Expr(Tf(0.0f)));
643 ast_builder->insert_assignment(Su31, Expr(Tf(0.0f)));
644 ast_builder->insert_assignment(Su12, Expr(Tf(0.0f)));
645 ast_builder->insert_assignment(Su22, Expr(Tf(1.0f)));
646 ast_builder->insert_assignment(Su32, Expr(Tf(0.0f)));
647 ast_builder->insert_assignment(Su13, Expr(Tf(0.0f)));
648 ast_builder->insert_assignment(Su23, Expr(Tf(0.0f)));
649 ast_builder->insert_assignment(Su33, Expr(Tf(1.0f)));
650 ast_builder->insert_assignment(Ssh, Sa21 * Sa21);
651 ast_builder->insert_assignment(
652 Ssh, bit_cast<Tf>(expr_select(Ssh >= Ssmall_number,
653 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
654 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Ssh, Sa21));
655 ast_builder->insert_assignment(Stmp5, Expr(Tf(0.0f)));
656 ast_builder->insert_assignment(Sch, Stmp5 - Sa11);
657 ast_builder->insert_assignment(Sch, max(Sch, Sa11));
658 ast_builder->insert_assignment(Sch, max(Sch, Ssmall_number));
659 ast_builder->insert_assignment(
660 Stmp5, bit_cast<Tf>(expr_select(
661 Sa11 >= Stmp5, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
662 ast_builder->insert_assignment(Stmp1, Sch * Sch);
663 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
664 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
665 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
666 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
667 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
668 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
669 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
670 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
671 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
672 ast_builder->insert_assignment(Stmp1, Stmp1 * Stmp2);
673 ast_builder->insert_assignment(Sch, Sch + Stmp1);
674 ast_builder->insert_assignment(
675 Stmp1, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Ssh));
676 ast_builder->insert_assignment(
677 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Sch));
678 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp5, Sch));
679 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp5, Ssh));
680 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp1));
681 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
682 ast_builder->insert_assignment(Stmp1, Sch * Sch);
683 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
684 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
685 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
686 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
687 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
688 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
689 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
690 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
691 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
692 ast_builder->insert_assignment(Sch, Sch * Stmp1);
693 ast_builder->insert_assignment(Ssh, Ssh * Stmp1);
694 ast_builder->insert_assignment(Sc, Sch * Sch);
695 ast_builder->insert_assignment(Ss, Ssh * Ssh);
696 ast_builder->insert_assignment(Sc, Sc - Ss);
697 ast_builder->insert_assignment(Ss, Ssh * Sch);
698 ast_builder->insert_assignment(Ss, Ss + Ss);
699 ast_builder->insert_assignment(Stmp1, Ss * Sa11);
700 ast_builder->insert_assignment(Stmp2, Ss * Sa21);
701 ast_builder->insert_assignment(Sa11, Sc * Sa11);
702 ast_builder->insert_assignment(Sa21, Sc * Sa21);
703 ast_builder->insert_assignment(Sa11, Sa11 + Stmp2);
704 ast_builder->insert_assignment(Sa21, Sa21 - Stmp1);
705 ast_builder->insert_assignment(Stmp1, Ss * Sa12);
706 ast_builder->insert_assignment(Stmp2, Ss * Sa22);
707 ast_builder->insert_assignment(Sa12, Sc * Sa12);
708 ast_builder->insert_assignment(Sa22, Sc * Sa22);
709 ast_builder->insert_assignment(Sa12, Sa12 + Stmp2);
710 ast_builder->insert_assignment(Sa22, Sa22 - Stmp1);
711 ast_builder->insert_assignment(Stmp1, Ss * Sa13);
712 ast_builder->insert_assignment(Stmp2, Ss * Sa23);
713 ast_builder->insert_assignment(Sa13, Sc * Sa13);
714 ast_builder->insert_assignment(Sa23, Sc * Sa23);
715 ast_builder->insert_assignment(Sa13, Sa13 + Stmp2);
716 ast_builder->insert_assignment(Sa23, Sa23 - Stmp1);
717 ast_builder->insert_assignment(Stmp1, Ss * Su11);
718 ast_builder->insert_assignment(Stmp2, Ss * Su12);
719 ast_builder->insert_assignment(Su11, Sc * Su11);
720 ast_builder->insert_assignment(Su12, Sc * Su12);
721 ast_builder->insert_assignment(Su11, Su11 + Stmp2);
722 ast_builder->insert_assignment(Su12, Su12 - Stmp1);
723 ast_builder->insert_assignment(Stmp1, Ss * Su21);
724 ast_builder->insert_assignment(Stmp2, Ss * Su22);
725 ast_builder->insert_assignment(Su21, Sc * Su21);
726 ast_builder->insert_assignment(Su22, Sc * Su22);
727 ast_builder->insert_assignment(Su21, Su21 + Stmp2);
728 ast_builder->insert_assignment(Su22, Su22 - Stmp1);
729 ast_builder->insert_assignment(Stmp1, Ss * Su31);
730 ast_builder->insert_assignment(Stmp2, Ss * Su32);
731 ast_builder->insert_assignment(Su31, Sc * Su31);
732 ast_builder->insert_assignment(Su32, Sc * Su32);
733 ast_builder->insert_assignment(Su31, Su31 + Stmp2);
734 ast_builder->insert_assignment(Su32, Su32 - Stmp1);
735 ast_builder->insert_assignment(Ssh, Sa31 * Sa31);
736 ast_builder->insert_assignment(
737 Ssh, bit_cast<Tf>(expr_select(Ssh >= Ssmall_number,
738 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
739 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Ssh, Sa31));
740 ast_builder->insert_assignment(Stmp5, Expr(Tf(0.0f)));
741 ast_builder->insert_assignment(Sch, Stmp5 - Sa11);
742 ast_builder->insert_assignment(Sch, max(Sch, Sa11));
743 ast_builder->insert_assignment(Sch, max(Sch, Ssmall_number));
744 ast_builder->insert_assignment(
745 Stmp5, bit_cast<Tf>(expr_select(
746 Sa11 >= Stmp5, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
747 ast_builder->insert_assignment(Stmp1, Sch * Sch);
748 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
749 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
750 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
751 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
752 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
753 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
754 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
755 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
756 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
757 ast_builder->insert_assignment(Stmp1, Stmp1 * Stmp2);
758 ast_builder->insert_assignment(Sch, Sch + Stmp1);
759 ast_builder->insert_assignment(
760 Stmp1, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Ssh));
761 ast_builder->insert_assignment(
762 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Sch));
763 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp5, Sch));
764 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp5, Ssh));
765 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp1));
766 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
767 ast_builder->insert_assignment(Stmp1, Sch * Sch);
768 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
769 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
770 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
771 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
772 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
773 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
774 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
775 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
776 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
777 ast_builder->insert_assignment(Sch, Sch * Stmp1);
778 ast_builder->insert_assignment(Ssh, Ssh * Stmp1);
779 ast_builder->insert_assignment(Sc, Sch * Sch);
780 ast_builder->insert_assignment(Ss, Ssh * Ssh);
781 ast_builder->insert_assignment(Sc, Sc - Ss);
782 ast_builder->insert_assignment(Ss, Ssh * Sch);
783 ast_builder->insert_assignment(Ss, Ss + Ss);
784 ast_builder->insert_assignment(Stmp1, Ss * Sa11);
785 ast_builder->insert_assignment(Stmp2, Ss * Sa31);
786 ast_builder->insert_assignment(Sa11, Sc * Sa11);
787 ast_builder->insert_assignment(Sa31, Sc * Sa31);
788 ast_builder->insert_assignment(Sa11, Sa11 + Stmp2);
789 ast_builder->insert_assignment(Sa31, Sa31 - Stmp1);
790 ast_builder->insert_assignment(Stmp1, Ss * Sa12);
791 ast_builder->insert_assignment(Stmp2, Ss * Sa32);
792 ast_builder->insert_assignment(Sa12, Sc * Sa12);
793 ast_builder->insert_assignment(Sa32, Sc * Sa32);
794 ast_builder->insert_assignment(Sa12, Sa12 + Stmp2);
795 ast_builder->insert_assignment(Sa32, Sa32 - Stmp1);
796 ast_builder->insert_assignment(Stmp1, Ss * Sa13);
797 ast_builder->insert_assignment(Stmp2, Ss * Sa33);
798 ast_builder->insert_assignment(Sa13, Sc * Sa13);
799 ast_builder->insert_assignment(Sa33, Sc * Sa33);
800 ast_builder->insert_assignment(Sa13, Sa13 + Stmp2);
801 ast_builder->insert_assignment(Sa33, Sa33 - Stmp1);
802 ast_builder->insert_assignment(Stmp1, Ss * Su11);
803 ast_builder->insert_assignment(Stmp2, Ss * Su13);
804 ast_builder->insert_assignment(Su11, Sc * Su11);
805 ast_builder->insert_assignment(Su13, Sc * Su13);
806 ast_builder->insert_assignment(Su11, Su11 + Stmp2);
807 ast_builder->insert_assignment(Su13, Su13 - Stmp1);
808 ast_builder->insert_assignment(Stmp1, Ss * Su21);
809 ast_builder->insert_assignment(Stmp2, Ss * Su23);
810 ast_builder->insert_assignment(Su21, Sc * Su21);
811 ast_builder->insert_assignment(Su23, Sc * Su23);
812 ast_builder->insert_assignment(Su21, Su21 + Stmp2);
813 ast_builder->insert_assignment(Su23, Su23 - Stmp1);
814 ast_builder->insert_assignment(Stmp1, Ss * Su31);
815 ast_builder->insert_assignment(Stmp2, Ss * Su33);
816 ast_builder->insert_assignment(Su31, Sc * Su31);
817 ast_builder->insert_assignment(Su33, Sc * Su33);
818 ast_builder->insert_assignment(Su31, Su31 + Stmp2);
819 ast_builder->insert_assignment(Su33, Su33 - Stmp1);
820 ast_builder->insert_assignment(Ssh, Sa32 * Sa32);
821 ast_builder->insert_assignment(
822 Ssh, bit_cast<Tf>(expr_select(Ssh >= Ssmall_number,
823 Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
824 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Ssh, Sa32));
825 ast_builder->insert_assignment(Stmp5, Expr(Tf(0.0f)));
826 ast_builder->insert_assignment(Sch, Stmp5 - Sa22);
827 ast_builder->insert_assignment(Sch, max(Sch, Sa22));
828 ast_builder->insert_assignment(Sch, max(Sch, Ssmall_number));
829 ast_builder->insert_assignment(
830 Stmp5, bit_cast<Tf>(expr_select(
831 Sa22 >= Stmp5, Expr(Ti(int32(0xffffffff))), Expr(Ti(0)))));
832 ast_builder->insert_assignment(Stmp1, Sch * Sch);
833 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
834 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
835 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
836 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
837 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
838 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
839 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
840 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
841 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
842 ast_builder->insert_assignment(Stmp1, Stmp1 * Stmp2);
843 ast_builder->insert_assignment(Sch, Sch + Stmp1);
844 ast_builder->insert_assignment(
845 Stmp1, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Ssh));
846 ast_builder->insert_assignment(
847 Stmp2, svd_bitwise_and<Tf, Ti>(Expr(~bit_cast<Ti>(Stmp5)), Sch));
848 ast_builder->insert_assignment(Sch, svd_bitwise_and<Tf, Ti>(Stmp5, Sch));
849 ast_builder->insert_assignment(Ssh, svd_bitwise_and<Tf, Ti>(Stmp5, Ssh));
850 ast_builder->insert_assignment(Sch, svd_bitwise_or<Tf, Ti>(Sch, Stmp1));
851 ast_builder->insert_assignment(Ssh, svd_bitwise_or<Tf, Ti>(Ssh, Stmp2));
852 ast_builder->insert_assignment(Stmp1, Sch * Sch);
853 ast_builder->insert_assignment(Stmp2, Ssh * Ssh);
854 ast_builder->insert_assignment(Stmp2, Stmp1 + Stmp2);
855 ast_builder->insert_assignment(Stmp1, rsqrt(Stmp2));
856 ast_builder->insert_assignment(Stmp4, Stmp1 * Sone_half);
857 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp4);
858 ast_builder->insert_assignment(Stmp3, Stmp1 * Stmp3);
859 ast_builder->insert_assignment(Stmp3, Stmp2 * Stmp3);
860 ast_builder->insert_assignment(Stmp1, Stmp1 + Stmp4);
861 ast_builder->insert_assignment(Stmp1, Stmp1 - Stmp3);
862 ast_builder->insert_assignment(Sch, Sch * Stmp1);
863 ast_builder->insert_assignment(Ssh, Ssh * Stmp1);
864 ast_builder->insert_assignment(Sc, Sch * Sch);
865 ast_builder->insert_assignment(Ss, Ssh * Ssh);
866 ast_builder->insert_assignment(Sc, Sc - Ss);
867 ast_builder->insert_assignment(Ss, Ssh * Sch);
868 ast_builder->insert_assignment(Ss, Ss + Ss);
869 ast_builder->insert_assignment(Stmp1, Ss * Sa21);
870 ast_builder->insert_assignment(Stmp2, Ss * Sa31);
871 ast_builder->insert_assignment(Sa21, Sc * Sa21);
872 ast_builder->insert_assignment(Sa31, Sc * Sa31);
873 ast_builder->insert_assignment(Sa21, Sa21 + Stmp2);
874 ast_builder->insert_assignment(Sa31, Sa31 - Stmp1);
875 ast_builder->insert_assignment(Stmp1, Ss * Sa22);
876 ast_builder->insert_assignment(Stmp2, Ss * Sa32);
877 ast_builder->insert_assignment(Sa22, Sc * Sa22);
878 ast_builder->insert_assignment(Sa32, Sc * Sa32);
879 ast_builder->insert_assignment(Sa22, Sa22 + Stmp2);
880 ast_builder->insert_assignment(Sa32, Sa32 - Stmp1);
881 ast_builder->insert_assignment(Stmp1, Ss * Sa23);
882 ast_builder->insert_assignment(Stmp2, Ss * Sa33);
883 ast_builder->insert_assignment(Sa23, Sc * Sa23);
884 ast_builder->insert_assignment(Sa33, Sc * Sa33);
885 ast_builder->insert_assignment(Sa23, Sa23 + Stmp2);
886 ast_builder->insert_assignment(Sa33, Sa33 - Stmp1);
887 ast_builder->insert_assignment(Stmp1, Ss * Su12);
888 ast_builder->insert_assignment(Stmp2, Ss * Su13);
889 ast_builder->insert_assignment(Su12, Sc * Su12);
890 ast_builder->insert_assignment(Su13, Sc * Su13);
891 ast_builder->insert_assignment(Su12, Su12 + Stmp2);
892 ast_builder->insert_assignment(Su13, Su13 - Stmp1);
893 ast_builder->insert_assignment(Stmp1, Ss * Su22);
894 ast_builder->insert_assignment(Stmp2, Ss * Su23);
895 ast_builder->insert_assignment(Su22, Sc * Su22);
896 ast_builder->insert_assignment(Su23, Sc * Su23);
897 ast_builder->insert_assignment(Su22, Su22 + Stmp2);
898 ast_builder->insert_assignment(Su23, Su23 - Stmp1);
899 ast_builder->insert_assignment(Stmp1, Ss * Su32);
900 ast_builder->insert_assignment(Stmp2, Ss * Su33);
901 ast_builder->insert_assignment(Su32, Sc * Su32);
902 ast_builder->insert_assignment(Su33, Sc * Su33);
903 ast_builder->insert_assignment(Su32, Su32 + Stmp2);
904 ast_builder->insert_assignment(Su33, Su33 - Stmp1);
905 return std::make_tuple(Su11, Su12, Su13, Su21, Su22, Su23, Su31, Su32, Su33,
906 Sv11, Sv12, Sv13, Sv21, Sv22, Sv23, Sv31, Sv32, Sv33,
907 Sa11, Sa22, Sa33);
908}
909
910} // namespace taichi::lang
911