1const builtin = @import("builtin");
2
3const compiler_rt = @import("../compiler_rt.zig");
4const symbol = compiler_rt.symbol;
5
6fn __hexagon_divsi3() callconv(.naked) noreturn {
7 asm volatile (
8 \\ {
9 \\ p0 = cmp.ge(r0,#0)
10 \\ p1 = cmp.ge(r1,#0)
11 \\ r1 = abs(r0)
12 \\ r2 = abs(r1)
13 \\ }
14 \\ {
15 \\ r3 = cl0(r1)
16 \\ r4 = cl0(r2)
17 \\ r5 = sub(r1,r2)
18 \\ p2 = cmp.gtu(r2,r1)
19 \\ }
20 \\ {
21 \\ r0 = #0
22 \\ p1 = xor(p0,p1)
23 \\ p0 = cmp.gtu(r2,r5)
24 \\ if (p2) jumpr r31
25 \\ }
26 \\
27 \\ {
28 \\ r0 = mux(p1,#-1,#1)
29 \\ if (p0) jumpr r31
30 \\ r4 = sub(r4,r3)
31 \\ r3 = #1
32 \\ }
33 \\ {
34 \\ r0 = #0
35 \\ r3:2 = vlslw(r3:2,r4)
36 \\ loop0(1f,r4)
37 \\ }
38 \\ .falign
39 \\ 1:
40 \\ {
41 \\ p0 = cmp.gtu(r2,r1)
42 \\ if (!p0.new) r1 = sub(r1,r2)
43 \\ if (!p0.new) r0 = add(r0,r3)
44 \\ r3:2 = vlsrw(r3:2,#1)
45 \\ }:endloop0
46 \\ {
47 \\ p0 = cmp.gtu(r2,r1)
48 \\ if (!p0.new) r0 = add(r0,r3)
49 \\ if (!p1) jumpr r31
50 \\ }
51 \\ {
52 \\ r0 = neg(r0)
53 \\ jumpr r31
54 \\ }
55 );
56}
57
58fn __hexagon_umodsi3() callconv(.naked) noreturn {
59 asm volatile (
60 \\ {
61 \\ r2 = cl0(r0)
62 \\ r3 = cl0(r1)
63 \\ p0 = cmp.gtu(r1,r0)
64 \\ }
65 \\ {
66 \\ r2 = sub(r3,r2)
67 \\ if (p0) jumpr r31
68 \\ }
69 \\ {
70 \\ loop0(1f,r2)
71 \\ p1 = cmp.eq(r2,#0)
72 \\ r2 = lsl(r1,r2)
73 \\ }
74 \\ .falign
75 \\ 1:
76 \\ {
77 \\ p0 = cmp.gtu(r2,r0)
78 \\ if (!p0.new) r0 = sub(r0,r2)
79 \\ r2 = lsr(r2,#1)
80 \\ if (p1) r1 = #0
81 \\ }:endloop0
82 \\ {
83 \\ p0 = cmp.gtu(r2,r0)
84 \\ if (!p0.new) r0 = sub(r0,r1)
85 \\ jumpr r31
86 \\ }
87 );
88}
89
90fn __hexagon_sqrtf() callconv(.naked) noreturn {
91 asm volatile (
92 \\ {
93 \\ r3,p0 = sfinvsqrta(r0)
94 \\ r5 = sffixupr(r0)
95 \\ r4 = ##0x3f000000
96 \\ r1:0 = combine(#0,#0)
97 \\ }
98 \\ {
99 \\ r0 += sfmpy(r3,r5):lib
100 \\ r1 += sfmpy(r3,r4):lib
101 \\ r2 = r4
102 \\ r3 = r5
103 \\ }
104 \\ {
105 \\ r2 -= sfmpy(r0,r1):lib
106 \\ p1 = sfclass(r5,#1)
107 \\
108 \\ }
109 \\ {
110 \\ r0 += sfmpy(r0,r2):lib
111 \\ r1 += sfmpy(r1,r2):lib
112 \\ r2 = r4
113 \\ r3 = r5
114 \\ }
115 \\ {
116 \\ r2 -= sfmpy(r0,r1):lib
117 \\ r3 -= sfmpy(r0,r0):lib
118 \\ }
119 \\ {
120 \\ r0 += sfmpy(r1,r3):lib
121 \\ r1 += sfmpy(r1,r2):lib
122 \\ r2 = r4
123 \\ r3 = r5
124 \\ }
125 \\ {
126 \\
127 \\ r3 -= sfmpy(r0,r0):lib
128 \\ if (p1) r0 = or(r0,r5)
129 \\ }
130 \\ {
131 \\ r0 += sfmpy(r1,r3,p0):scale
132 \\ jumpr r31
133 \\ }
134 );
135}
136
137fn __hexagon_moddi3() callconv(.naked) noreturn {
138 asm volatile (
139 \\ {
140 \\ p3 = tstbit(r1,#31)
141 \\ }
142 \\ {
143 \\ r1:0 = abs(r1:0)
144 \\ r3:2 = abs(r3:2)
145 \\ }
146 \\ {
147 \\ r6 = cl0(r1:0)
148 \\ r7 = cl0(r3:2)
149 \\ r5:4 = r3:2
150 \\ r3:2 = r1:0
151 \\ }
152 \\ {
153 \\ r10 = sub(r7,r6)
154 \\ r1:0 = #0
155 \\ r15:14 = #1
156 \\ }
157 \\ {
158 \\ r11 = add(r10,#1)
159 \\ r13:12 = lsl(r5:4,r10)
160 \\ r15:14 = lsl(r15:14,r10)
161 \\ }
162 \\ {
163 \\ p0 = cmp.gtu(r5:4,r3:2)
164 \\ loop0(1f,r11)
165 \\ }
166 \\ {
167 \\ if (p0) jump .hexagon_moddi3_return
168 \\ }
169 \\ .falign
170 \\ 1:
171 \\ {
172 \\ p0 = cmp.gtu(r13:12,r3:2)
173 \\ }
174 \\ {
175 \\ r7:6 = sub(r3:2, r13:12)
176 \\ r9:8 = add(r1:0, r15:14)
177 \\ }
178 \\ {
179 \\ r1:0 = vmux(p0, r1:0, r9:8)
180 \\ r3:2 = vmux(p0, r3:2, r7:6)
181 \\ }
182 \\ {
183 \\ r15:14 = lsr(r15:14, #1)
184 \\ r13:12 = lsr(r13:12, #1)
185 \\ }:endloop0
186 \\
187 \\ .hexagon_moddi3_return:
188 \\ {
189 \\ r1:0 = neg(r3:2)
190 \\ }
191 \\ {
192 \\ r1:0 = vmux(p3,r1:0,r3:2)
193 \\ jumpr r31
194 \\ }
195 );
196}
197
198fn __hexagon_divdi3() callconv(.naked) noreturn {
199 asm volatile (
200 \\ {
201 \\ p2 = tstbit(r1,#31)
202 \\ p3 = tstbit(r3,#31)
203 \\ }
204 \\ {
205 \\ r1:0 = abs(r1:0)
206 \\ r3:2 = abs(r3:2)
207 \\ }
208 \\ {
209 \\ r6 = cl0(r1:0)
210 \\ r7 = cl0(r3:2)
211 \\ r5:4 = r3:2
212 \\ r3:2 = r1:0
213 \\ }
214 \\ {
215 \\ p3 = xor(p2,p3)
216 \\ r10 = sub(r7,r6)
217 \\ r1:0 = #0
218 \\ r15:14 = #1
219 \\ }
220 \\ {
221 \\ r11 = add(r10,#1)
222 \\ r13:12 = lsl(r5:4,r10)
223 \\ r15:14 = lsl(r15:14,r10)
224 \\ }
225 \\ {
226 \\ p0 = cmp.gtu(r5:4,r3:2)
227 \\ loop0(1f,r11)
228 \\ }
229 \\ {
230 \\ if (p0) jump .hexagon_divdi3_return
231 \\ }
232 \\ .falign
233 \\ 1:
234 \\ {
235 \\ p0 = cmp.gtu(r13:12,r3:2)
236 \\ }
237 \\ {
238 \\ r7:6 = sub(r3:2, r13:12)
239 \\ r9:8 = add(r1:0, r15:14)
240 \\ }
241 \\ {
242 \\ r1:0 = vmux(p0, r1:0, r9:8)
243 \\ r3:2 = vmux(p0, r3:2, r7:6)
244 \\ }
245 \\ {
246 \\ r15:14 = lsr(r15:14, #1)
247 \\ r13:12 = lsr(r13:12, #1)
248 \\ }:endloop0
249 \\
250 \\ .hexagon_divdi3_return:
251 \\ {
252 \\ r3:2 = neg(r1:0)
253 \\ }
254 \\ {
255 \\ r1:0 = vmux(p3,r3:2,r1:0)
256 \\ jumpr r31
257 \\ }
258 );
259}
260
261fn __hexagon_divsf3() callconv(.naked) noreturn {
262 asm volatile (
263 \\ {
264 \\ r2,p0 = sfrecipa(r0,r1)
265 \\ r4 = sffixupd(r0,r1)
266 \\ r3 = ##0x3f800000
267 \\ }
268 \\ {
269 \\ r5 = sffixupn(r0,r1)
270 \\ r3 -= sfmpy(r4,r2):lib
271 \\ r6 = ##0x80000000
272 \\ r7 = r3
273 \\ }
274 \\ {
275 \\ r2 += sfmpy(r3,r2):lib
276 \\ r3 = r7
277 \\ r6 = r5
278 \\ r0 = and(r6,r5)
279 \\ }
280 \\ {
281 \\ r3 -= sfmpy(r4,r2):lib
282 \\ r0 += sfmpy(r5,r2):lib
283 \\ }
284 \\ {
285 \\ r2 += sfmpy(r3,r2):lib
286 \\ r6 -= sfmpy(r0,r4):lib
287 \\ }
288 \\ {
289 \\ r0 += sfmpy(r6,r2):lib
290 \\ }
291 \\ {
292 \\ r5 -= sfmpy(r0,r4):lib
293 \\ }
294 \\ {
295 \\ r0 += sfmpy(r5,r2,p0):scale
296 \\ jumpr r31
297 \\ }
298 );
299}
300
301fn __hexagon_udivdi3() callconv(.naked) noreturn {
302 asm volatile (
303 \\ {
304 \\ r6 = cl0(r1:0)
305 \\ r7 = cl0(r3:2)
306 \\ r5:4 = r3:2
307 \\ r3:2 = r1:0
308 \\ }
309 \\ {
310 \\ r10 = sub(r7,r6)
311 \\ r1:0 = #0
312 \\ r15:14 = #1
313 \\ }
314 \\ {
315 \\ r11 = add(r10,#1)
316 \\ r13:12 = lsl(r5:4,r10)
317 \\ r15:14 = lsl(r15:14,r10)
318 \\ }
319 \\ {
320 \\ p0 = cmp.gtu(r5:4,r3:2)
321 \\ loop0(1f,r11)
322 \\ }
323 \\ {
324 \\ if (p0) jumpr r31
325 \\ }
326 \\ .falign
327 \\ 1:
328 \\ {
329 \\ p0 = cmp.gtu(r13:12,r3:2)
330 \\ }
331 \\ {
332 \\ r7:6 = sub(r3:2, r13:12)
333 \\ r9:8 = add(r1:0, r15:14)
334 \\ }
335 \\ {
336 \\ r1:0 = vmux(p0, r1:0, r9:8)
337 \\ r3:2 = vmux(p0, r3:2, r7:6)
338 \\ }
339 \\ {
340 \\ r15:14 = lsr(r15:14, #1)
341 \\ r13:12 = lsr(r13:12, #1)
342 \\ }:endloop0
343 \\ {
344 \\ jumpr r31
345 \\ }
346 );
347}
348
349fn __hexagon_umoddi3() callconv(.naked) noreturn {
350 asm volatile (
351 \\ {
352 \\ r6 = cl0(r1:0)
353 \\ r7 = cl0(r3:2)
354 \\ r5:4 = r3:2
355 \\ r3:2 = r1:0
356 \\ }
357 \\ {
358 \\ r10 = sub(r7,r6)
359 \\ r1:0 = #0
360 \\ r15:14 = #1
361 \\ }
362 \\ {
363 \\ r11 = add(r10,#1)
364 \\ r13:12 = lsl(r5:4,r10)
365 \\ r15:14 = lsl(r15:14,r10)
366 \\ }
367 \\ {
368 \\ p0 = cmp.gtu(r5:4,r3:2)
369 \\ loop0(1f,r11)
370 \\ }
371 \\ {
372 \\ if (p0) jump .hexagon_umoddi3_return
373 \\ }
374 \\ .falign
375 \\ 1:
376 \\ {
377 \\ p0 = cmp.gtu(r13:12,r3:2)
378 \\ }
379 \\ {
380 \\ r7:6 = sub(r3:2, r13:12)
381 \\ r9:8 = add(r1:0, r15:14)
382 \\ }
383 \\ {
384 \\ r1:0 = vmux(p0, r1:0, r9:8)
385 \\ r3:2 = vmux(p0, r3:2, r7:6)
386 \\ }
387 \\ {
388 \\ r15:14 = lsr(r15:14, #1)
389 \\ r13:12 = lsr(r13:12, #1)
390 \\ }:endloop0
391 \\
392 \\ .hexagon_umoddi3_return:
393 \\ {
394 \\ r1:0 = r3:2
395 \\ jumpr r31
396 \\ }
397 );
398}
399
400fn __hexagon_modsi3() callconv(.naked) noreturn {
401 asm volatile (
402 \\ {
403 \\ p2 = cmp.ge(r0,#0)
404 \\ r2 = abs(r0)
405 \\ r1 = abs(r1)
406 \\ }
407 \\ {
408 \\ r3 = cl0(r2)
409 \\ r4 = cl0(r1)
410 \\ p0 = cmp.gtu(r1,r2)
411 \\ }
412 \\ {
413 \\ r3 = sub(r4,r3)
414 \\ if (p0) jumpr r31
415 \\ }
416 \\ {
417 \\ p1 = cmp.eq(r3,#0)
418 \\ loop0(1f,r3)
419 \\ r0 = r2
420 \\ r2 = lsl(r1,r3)
421 \\ }
422 \\ .falign
423 \\ 1:
424 \\ {
425 \\ p0 = cmp.gtu(r2,r0)
426 \\ if (!p0.new) r0 = sub(r0,r2)
427 \\ r2 = lsr(r2,#1)
428 \\ if (p1) r1 = #0
429 \\ }:endloop0
430 \\ {
431 \\ p0 = cmp.gtu(r2,r0)
432 \\ if (!p0.new) r0 = sub(r0,r1)
433 \\ if (p2) jumpr r31
434 \\ }
435 \\ {
436 \\ r0 = neg(r0)
437 \\ jumpr r31
438 \\ }
439 );
440}
441
442fn __hexagon_memcpy_likely_aligned_min32bytes_mult8bytes() callconv(.naked) noreturn {
443 asm volatile (
444 \\ {
445 \\ p0 = bitsclr(r1,#7)
446 \\ p0 = bitsclr(r0,#7)
447 \\ if (p0.new) r5:4 = memd(r1)
448 \\ r3 = #-3
449 \\ }
450 \\ {
451 \\ if (!p0) jump .Lmemcpy_call
452 \\ if (p0) memd(r0++#8) = r5:4
453 \\ if (p0) r5:4 = memd(r1+#8)
454 \\ r3 += lsr(r2,#3)
455 \\ }
456 \\ {
457 \\ memd(r0++#8) = r5:4
458 \\ r5:4 = memd(r1+#16)
459 \\ r1 = add(r1,#24)
460 \\ loop0(1f,r3)
461 \\ }
462 \\ .falign
463 \\ 1:
464 \\ {
465 \\ memd(r0++#8) = r5:4
466 \\ r5:4 = memd(r1++#8)
467 \\ }:endloop0
468 \\ {
469 \\ memd(r0) = r5:4
470 \\ r0 -= add(r2,#-8)
471 \\ jumpr r31
472 \\ }
473 \\ .Lmemcpy_call:
474 \\ jump memcpy@PLT
475 );
476}
477
478fn __hexagon_udivsi3() callconv(.naked) noreturn {
479 asm volatile (
480 \\ {
481 \\ r2 = cl0(r0)
482 \\ r3 = cl0(r1)
483 \\ r5:4 = combine(#1,#0)
484 \\ p0 = cmp.gtu(r1,r0)
485 \\ }
486 \\ {
487 \\ r6 = sub(r3,r2)
488 \\ r4 = r1
489 \\ r1:0 = combine(r0,r4)
490 \\ if (p0) jumpr r31
491 \\ }
492 \\ {
493 \\ r3:2 = vlslw(r5:4,r6)
494 \\ loop0(1f,r6)
495 \\ }
496 \\ .falign
497 \\ 1:
498 \\ {
499 \\ p0 = cmp.gtu(r2,r1)
500 \\ if (!p0.new) r1 = sub(r1,r2)
501 \\ if (!p0.new) r0 = add(r0,r3)
502 \\ r3:2 = vlsrw(r3:2,#1)
503 \\ }:endloop0
504 \\ {
505 \\ p0 = cmp.gtu(r2,r1)
506 \\ if (!p0.new) r0 = add(r0,r3)
507 \\ jumpr r31
508 \\ }
509 );
510}
511
512fn __hexagon_adddf3() align(32) callconv(.naked) noreturn {
513 asm volatile (
514 \\ {
515 \\ r4 = extractu(r1,#11,#20)
516 \\ r5 = extractu(r3,#11,#20)
517 \\ r13:12 = combine(##0x20000000,#0)
518 \\ }
519 \\ {
520 \\ p3 = dfclass(r1:0,#2)
521 \\ p3 = dfclass(r3:2,#2)
522 \\ r9:8 = r13:12
523 \\ p2 = cmp.gtu(r5,r4)
524 \\ }
525 \\ {
526 \\ if (!p3) jump .Ladd_abnormal
527 \\ if (p2) r1:0 = r3:2
528 \\ if (p2) r3:2 = r1:0
529 \\ if (p2) r5:4 = combine(r4,r5)
530 \\ }
531 \\ {
532 \\ r13:12 = insert(r1:0,#52,#11 -2)
533 \\ r9:8 = insert(r3:2,#52,#11 -2)
534 \\ r15 = sub(r4,r5)
535 \\ r7:6 = combine(#62,#1)
536 \\ }
537 \\
538 \\
539 \\
540 \\
541 \\
542 \\ .Ladd_continue:
543 \\ {
544 \\ r15 = min(r15,r7)
545 \\
546 \\ r11:10 = neg(r13:12)
547 \\ p2 = cmp.gt(r1,#-1)
548 \\ r14 = #0
549 \\ }
550 \\ {
551 \\ if (!p2) r13:12 = r11:10
552 \\ r11:10 = extractu(r9:8,r15:14)
553 \\ r9:8 = ASR(r9:8,r15)
554 \\
555 \\
556 \\
557 \\
558 \\ r15:14 = #0
559 \\ }
560 \\ {
561 \\ p1 = cmp.eq(r11:10,r15:14)
562 \\ if (!p1.new) r8 = or(r8,r6)
563 \\ r5 = add(r4,#-1024 -60)
564 \\ p3 = cmp.gt(r3,#-1)
565 \\ }
566 \\ {
567 \\ r13:12 = add(r13:12,r9:8)
568 \\ r11:10 = sub(r13:12,r9:8)
569 \\ r7:6 = combine(#54,##2045)
570 \\ }
571 \\ {
572 \\ p0 = cmp.gtu(r4,r7)
573 \\ p0 = !cmp.gtu(r4,r6)
574 \\ if (!p0.new) jump:nt .Ladd_ovf_unf
575 \\ if (!p3) r13:12 = r11:10
576 \\ }
577 \\ {
578 \\ r1:0 = convert_d2df(r13:12)
579 \\ p0 = cmp.eq(r13,#0)
580 \\ p0 = cmp.eq(r12,#0)
581 \\ if (p0.new) jump:nt .Ladd_zero
582 \\ }
583 \\ {
584 \\ r1 += asl(r5,#20)
585 \\ jumpr r31
586 \\ }
587 \\
588 \\ .falign
589 \\ .Ladd_zero:
590 \\
591 \\
592 \\ {
593 \\ r28 = USR
594 \\ r1:0 = #0
595 \\ r3 = #1
596 \\ }
597 \\ {
598 \\ r28 = extractu(r28,#2,#22)
599 \\ r3 = asl(r3,#31)
600 \\ }
601 \\ {
602 \\ p0 = cmp.eq(r28,#2)
603 \\ if (p0.new) r1 = xor(r1,r3)
604 \\ jumpr r31
605 \\ }
606 \\ .falign
607 \\ .Ladd_ovf_unf:
608 \\ {
609 \\ r1:0 = convert_d2df(r13:12)
610 \\ p0 = cmp.eq(r13,#0)
611 \\ p0 = cmp.eq(r12,#0)
612 \\ if (p0.new) jump:nt .Ladd_zero
613 \\ }
614 \\ {
615 \\ r28 = extractu(r1,#11,#20)
616 \\ r1 += asl(r5,#20)
617 \\ }
618 \\ {
619 \\ r5 = add(r5,r28)
620 \\ r3:2 = combine(##0x00100000,#0)
621 \\ }
622 \\ {
623 \\ p0 = cmp.gt(r5,##1024 +1024 -2)
624 \\ if (p0.new) jump:nt .Ladd_ovf
625 \\ }
626 \\ {
627 \\ p0 = cmp.gt(r5,#0)
628 \\ if (p0.new) jumpr:t r31
629 \\ r28 = sub(#1,r5)
630 \\ }
631 \\ {
632 \\ r3:2 = insert(r1:0,#52,#0)
633 \\ r1:0 = r13:12
634 \\ }
635 \\ {
636 \\ r3:2 = lsr(r3:2,r28)
637 \\ }
638 \\ {
639 \\ r1:0 = insert(r3:2,#63,#0)
640 \\ jumpr r31
641 \\ }
642 \\ .falign
643 \\ .Ladd_ovf:
644 \\
645 \\ {
646 \\ r1:0 = r13:12
647 \\ r28 = USR
648 \\ r13:12 = combine(##0x7fefffff,#-1)
649 \\ }
650 \\ {
651 \\ r5 = extractu(r28,#2,#22)
652 \\ r28 = or(r28,#0x28)
653 \\ r9:8 = combine(##0x7ff00000,#0)
654 \\ }
655 \\ {
656 \\ USR = r28
657 \\ r5 ^= lsr(r1,#31)
658 \\ r28 = r5
659 \\ }
660 \\ {
661 \\ p0 = !cmp.eq(r28,#1)
662 \\ p0 = !cmp.eq(r5,#2)
663 \\ if (p0.new) r13:12 = r9:8
664 \\ }
665 \\ {
666 \\ r1:0 = insert(r13:12,#63,#0)
667 \\ }
668 \\ {
669 \\ p0 = dfcmp.eq(r1:0,r1:0)
670 \\ jumpr r31
671 \\ }
672 \\
673 \\ .Ladd_abnormal:
674 \\ {
675 \\ r13:12 = extractu(r1:0,#63,#0)
676 \\ r9:8 = extractu(r3:2,#63,#0)
677 \\ }
678 \\ {
679 \\ p3 = cmp.gtu(r13:12,r9:8)
680 \\ if (!p3.new) r1:0 = r3:2
681 \\ if (!p3.new) r3:2 = r1:0
682 \\ }
683 \\ {
684 \\
685 \\ p0 = dfclass(r1:0,#0x0f)
686 \\ if (!p0.new) jump:nt .Linvalid_nan_add
687 \\ if (!p3) r13:12 = r9:8
688 \\ if (!p3) r9:8 = r13:12
689 \\ }
690 \\ {
691 \\
692 \\
693 \\ p1 = dfclass(r1:0,#0x08)
694 \\ if (p1.new) jump:nt .Linf_add
695 \\ }
696 \\ {
697 \\ p2 = dfclass(r3:2,#0x01)
698 \\ if (p2.new) jump:nt .LB_zero
699 \\ r13:12 = #0
700 \\ }
701 \\
702 \\ {
703 \\ p0 = dfclass(r1:0,#4)
704 \\ if (p0.new) jump:nt .Ladd_two_subnormal
705 \\ r13:12 = combine(##0x20000000,#0)
706 \\ }
707 \\ {
708 \\ r4 = extractu(r1,#11,#20)
709 \\ r5 = #1
710 \\
711 \\ r9:8 = asl(r9:8,#11 -2)
712 \\ }
713 \\
714 \\
715 \\
716 \\ {
717 \\ r13:12 = insert(r1:0,#52,#11 -2)
718 \\ r15 = sub(r4,r5)
719 \\ r7:6 = combine(#62,#1)
720 \\ jump .Ladd_continue
721 \\ }
722 \\
723 \\ .Ladd_two_subnormal:
724 \\ {
725 \\ r13:12 = extractu(r1:0,#63,#0)
726 \\ r9:8 = extractu(r3:2,#63,#0)
727 \\ }
728 \\ {
729 \\ r13:12 = neg(r13:12)
730 \\ r9:8 = neg(r9:8)
731 \\ p0 = cmp.gt(r1,#-1)
732 \\ p1 = cmp.gt(r3,#-1)
733 \\ }
734 \\ {
735 \\ if (p0) r13:12 = r1:0
736 \\ if (p1) r9:8 = r3:2
737 \\ }
738 \\ {
739 \\ r13:12 = add(r13:12,r9:8)
740 \\ }
741 \\ {
742 \\ r9:8 = neg(r13:12)
743 \\ p0 = cmp.gt(r13,#-1)
744 \\ r3:2 = #0
745 \\ }
746 \\ {
747 \\ if (!p0) r1:0 = r9:8
748 \\ if (p0) r1:0 = r13:12
749 \\ r3 = ##0x80000000
750 \\ }
751 \\ {
752 \\ if (!p0) r1 = or(r1,r3)
753 \\ p0 = dfcmp.eq(r1:0,r3:2)
754 \\ if (p0.new) jump:nt .Lzero_plus_zero
755 \\ }
756 \\ {
757 \\ jumpr r31
758 \\ }
759 \\
760 \\ .Linvalid_nan_add:
761 \\ {
762 \\ r28 = convert_df2sf(r1:0)
763 \\ p0 = dfclass(r3:2,#0x0f)
764 \\ if (p0.new) r3:2 = r1:0
765 \\ }
766 \\ {
767 \\ r2 = convert_df2sf(r3:2)
768 \\ r1:0 = #-1
769 \\ jumpr r31
770 \\ }
771 \\ .falign
772 \\ .LB_zero:
773 \\ {
774 \\ p0 = dfcmp.eq(r13:12,r1:0)
775 \\ if (!p0.new) jumpr:t r31
776 \\ }
777 \\
778 \\
779 \\
780 \\
781 \\ .Lzero_plus_zero:
782 \\ {
783 \\ p0 = cmp.eq(r1:0,r3:2)
784 \\ if (p0.new) jumpr:t r31
785 \\ }
786 \\ {
787 \\ r28 = USR
788 \\ }
789 \\ {
790 \\ r28 = extractu(r28,#2,#22)
791 \\ r1:0 = #0
792 \\ }
793 \\ {
794 \\ p0 = cmp.eq(r28,#2)
795 \\ if (p0.new) r1 = ##0x80000000
796 \\ jumpr r31
797 \\ }
798 \\ .Linf_add:
799 \\
800 \\ {
801 \\ p0 = !cmp.eq(r1,r3)
802 \\ p0 = dfclass(r3:2,#8)
803 \\ if (!p0.new) jumpr:t r31
804 \\ }
805 \\ {
806 \\ r2 = ##0x7f800001
807 \\ }
808 \\ {
809 \\ r1:0 = convert_sf2df(r2)
810 \\ jumpr r31
811 \\ }
812 );
813}
814
815fn __hexagon_subdf3() align(32) callconv(.naked) noreturn {
816 asm volatile (
817 \\ {
818 \\ r3 = togglebit(r3,#31)
819 \\ jump ##__hexagon_adddf3
820 \\ }
821 );
822}
823
824fn __hexagon_divdf3() align(32) callconv(.naked) noreturn {
825 asm volatile (
826 \\ {
827 \\ p2 = dfclass(r1:0,#0x02)
828 \\ p2 = dfclass(r3:2,#0x02)
829 \\ r13:12 = combine(r3,r1)
830 \\ r28 = xor(r1,r3)
831 \\ }
832 \\ {
833 \\ if (!p2) jump .Ldiv_abnormal
834 \\ r7:6 = extractu(r3:2,#23,#52 -23)
835 \\ r8 = ##0x3f800001
836 \\ }
837 \\ {
838 \\ r9 = or(r8,r6)
839 \\ r13 = extractu(r13,#11,#52 -32)
840 \\ r12 = extractu(r12,#11,#52 -32)
841 \\ p3 = cmp.gt(r28,#-1)
842 \\ }
843 \\
844 \\
845 \\ .Ldenorm_continue:
846 \\ {
847 \\ r11,p0 = sfrecipa(r8,r9)
848 \\ r10 = and(r8,#-2)
849 \\ r28 = #1
850 \\ r12 = sub(r12,r13)
851 \\ }
852 \\
853 \\
854 \\ {
855 \\ r10 -= sfmpy(r11,r9):lib
856 \\ r1 = insert(r28,#11 +1,#52 -32)
857 \\ r13 = ##0x00800000 << 3
858 \\ }
859 \\ {
860 \\ r11 += sfmpy(r11,r10):lib
861 \\ r3 = insert(r28,#11 +1,#52 -32)
862 \\ r10 = and(r8,#-2)
863 \\ }
864 \\ {
865 \\ r10 -= sfmpy(r11,r9):lib
866 \\ r5 = #-0x3ff +1
867 \\ r4 = #0x3ff -1
868 \\ }
869 \\ {
870 \\ r11 += sfmpy(r11,r10):lib
871 \\ p1 = cmp.gt(r12,r5)
872 \\ p1 = !cmp.gt(r12,r4)
873 \\ }
874 \\ {
875 \\ r13 = insert(r11,#23,#3)
876 \\ r5:4 = #0
877 \\ r12 = add(r12,#-61)
878 \\ }
879 \\
880 \\
881 \\
882 \\
883 \\ {
884 \\ r13 = add(r13,#((-3) << 3))
885 \\ }
886 \\ { r7:6 = mpyu(r13,r1); r1:0 = asl(r1:0,# ( 15 )); }; { r6 = # 0; r1:0 -= mpyu(r7,r2); r15:14 = mpyu(r7,r3); }; { r5:4 += ASL(r7:6, # ( 14 )); r1:0 -= asl(r15:14, # 32); }
887 \\ { r7:6 = mpyu(r13,r1); r1:0 = asl(r1:0,# ( 15 )); }; { r6 = # 0; r1:0 -= mpyu(r7,r2); r15:14 = mpyu(r7,r3); }; { r5:4 += ASR(r7:6, # ( 1 )); r1:0 -= asl(r15:14, # 32); }
888 \\ { r7:6 = mpyu(r13,r1); r1:0 = asl(r1:0,# ( 15 )); }; { r6 = # 0; r1:0 -= mpyu(r7,r2); r15:14 = mpyu(r7,r3); }; { r5:4 += ASR(r7:6, # ( 16 )); r1:0 -= asl(r15:14, # 32); }
889 \\ { r7:6 = mpyu(r13,r1); r1:0 = asl(r1:0,# ( 15 )); }; { r6 = # 0; r1:0 -= mpyu(r7,r2); r15:14 = mpyu(r7,r3); }; { r5:4 += ASR(r7:6, # ( 31 )); r1:0 -= asl(r15:14, # 32); r7:6=# ( 0 ); }
890 \\
891 \\
892 \\
893 \\
894 \\
895 \\
896 \\
897 \\ {
898 \\
899 \\ r15:14 = sub(r1:0,r3:2)
900 \\ p0 = cmp.gtu(r3:2,r1:0)
901 \\
902 \\ if (!p0.new) r6 = #2
903 \\ }
904 \\ {
905 \\ r5:4 = add(r5:4,r7:6)
906 \\ if (!p0) r1:0 = r15:14
907 \\ r15:14 = #0
908 \\ }
909 \\ {
910 \\ p0 = cmp.eq(r1:0,r15:14)
911 \\ if (!p0.new) r4 = or(r4,r28)
912 \\ }
913 \\ {
914 \\ r7:6 = neg(r5:4)
915 \\ }
916 \\ {
917 \\ if (!p3) r5:4 = r7:6
918 \\ }
919 \\ {
920 \\ r1:0 = convert_d2df(r5:4)
921 \\ if (!p1) jump .Ldiv_ovf_unf
922 \\ }
923 \\ {
924 \\ r1 += asl(r12,#52 -32)
925 \\ jumpr r31
926 \\ }
927 \\
928 \\ .Ldiv_ovf_unf:
929 \\ {
930 \\ r1 += asl(r12,#52 -32)
931 \\ r13 = extractu(r1,#11,#52 -32)
932 \\ }
933 \\ {
934 \\ r7:6 = abs(r5:4)
935 \\ r12 = add(r12,r13)
936 \\ }
937 \\ {
938 \\ p0 = cmp.gt(r12,##0x3ff +0x3ff)
939 \\ if (p0.new) jump:nt .Ldiv_ovf
940 \\ }
941 \\ {
942 \\ p0 = cmp.gt(r12,#0)
943 \\ if (p0.new) jump:nt .Ldiv_possible_unf
944 \\ }
945 \\ {
946 \\ r13 = add(clb(r7:6),#-1)
947 \\ r12 = sub(#7,r12)
948 \\ r10 = USR
949 \\ r11 = #63
950 \\ }
951 \\ {
952 \\ r13 = min(r12,r11)
953 \\ r11 = or(r10,#0x030)
954 \\ r7:6 = asl(r7:6,r13)
955 \\ r12 = #0
956 \\ }
957 \\ {
958 \\ r15:14 = extractu(r7:6,r13:12)
959 \\ r7:6 = lsr(r7:6,r13)
960 \\ r3:2 = #1
961 \\ }
962 \\ {
963 \\ p0 = cmp.gtu(r3:2,r15:14)
964 \\ if (!p0.new) r6 = or(r2,r6)
965 \\ r7 = setbit(r7,#52 -32+4)
966 \\ }
967 \\ {
968 \\ r5:4 = neg(r7:6)
969 \\ p0 = bitsclr(r6,#(1<<4)-1)
970 \\ if (!p0.new) r10 = r11
971 \\ }
972 \\ {
973 \\ USR = r10
974 \\ if (p3) r5:4 = r7:6
975 \\ r10 = #-0x3ff -(52 +4)
976 \\ }
977 \\ {
978 \\ r1:0 = convert_d2df(r5:4)
979 \\ }
980 \\ {
981 \\ r1 += asl(r10,#52 -32)
982 \\ jumpr r31
983 \\ }
984 \\
985 \\
986 \\ .Ldiv_possible_unf:
987 \\
988 \\
989 \\ {
990 \\ r3:2 = extractu(r1:0,#63,#0)
991 \\ r15:14 = combine(##0x00100000,#0)
992 \\ r10 = #0x7FFF
993 \\ }
994 \\ {
995 \\ p0 = dfcmp.eq(r15:14,r3:2)
996 \\ p0 = bitsset(r7,r10)
997 \\ }
998 \\
999 \\
1000 \\
1001 \\
1002 \\
1003 \\
1004 \\ {
1005 \\ if (!p0) jumpr r31
1006 \\ r10 = USR
1007 \\ }
1008 \\
1009 \\ {
1010 \\ r10 = or(r10,#0x30)
1011 \\ }
1012 \\ {
1013 \\ USR = r10
1014 \\ }
1015 \\ {
1016 \\ p0 = dfcmp.eq(r1:0,r1:0)
1017 \\ jumpr r31
1018 \\ }
1019 \\
1020 \\ .Ldiv_ovf:
1021 \\
1022 \\
1023 \\
1024 \\ {
1025 \\ r10 = USR
1026 \\ r3:2 = combine(##0x7fefffff,#-1)
1027 \\ r1 = mux(p3,#0,#-1)
1028 \\ }
1029 \\ {
1030 \\ r7:6 = combine(##0x7ff00000,#0)
1031 \\ r5 = extractu(r10,#2,#22)
1032 \\ r10 = or(r10,#0x28)
1033 \\ }
1034 \\ {
1035 \\ USR = r10
1036 \\ r5 ^= lsr(r1,#31)
1037 \\ r4 = r5
1038 \\ }
1039 \\ {
1040 \\ p0 = !cmp.eq(r4,#1)
1041 \\ p0 = !cmp.eq(r5,#2)
1042 \\ if (p0.new) r3:2 = r7:6
1043 \\ p0 = dfcmp.eq(r3:2,r3:2)
1044 \\ }
1045 \\ {
1046 \\ r1:0 = insert(r3:2,#63,#0)
1047 \\ jumpr r31
1048 \\ }
1049 \\
1050 \\
1051 \\
1052 \\
1053 \\
1054 \\
1055 \\
1056 \\ .Ldiv_abnormal:
1057 \\ {
1058 \\ p0 = dfclass(r1:0,#0x0F)
1059 \\ p0 = dfclass(r3:2,#0x0F)
1060 \\ p3 = cmp.gt(r28,#-1)
1061 \\ }
1062 \\ {
1063 \\ p1 = dfclass(r1:0,#0x08)
1064 \\ p1 = dfclass(r3:2,#0x08)
1065 \\ }
1066 \\ {
1067 \\ p2 = dfclass(r1:0,#0x01)
1068 \\ p2 = dfclass(r3:2,#0x01)
1069 \\ }
1070 \\ {
1071 \\ if (!p0) jump .Ldiv_nan
1072 \\ if (p1) jump .Ldiv_invalid
1073 \\ }
1074 \\ {
1075 \\ if (p2) jump .Ldiv_invalid
1076 \\ }
1077 \\ {
1078 \\ p2 = dfclass(r1:0,#(0x0F ^ 0x01))
1079 \\ p2 = dfclass(r3:2,#(0x0F ^ 0x08))
1080 \\ }
1081 \\ {
1082 \\ p1 = dfclass(r1:0,#(0x0F ^ 0x08))
1083 \\ p1 = dfclass(r3:2,#(0x0F ^ 0x01))
1084 \\ }
1085 \\ {
1086 \\ if (!p2) jump .Ldiv_zero_result
1087 \\ if (!p1) jump .Ldiv_inf_result
1088 \\ }
1089 \\
1090 \\
1091 \\
1092 \\
1093 \\
1094 \\ {
1095 \\ p0 = dfclass(r1:0,#0x02)
1096 \\ p1 = dfclass(r3:2,#0x02)
1097 \\ r10 = ##0x00100000
1098 \\ }
1099 \\ {
1100 \\ r13:12 = combine(r3,r1)
1101 \\ r1 = insert(r10,#11 +1,#52 -32)
1102 \\ r3 = insert(r10,#11 +1,#52 -32)
1103 \\ }
1104 \\ {
1105 \\ if (p0) r1 = or(r1,r10)
1106 \\ if (p1) r3 = or(r3,r10)
1107 \\ }
1108 \\ {
1109 \\ r5 = add(clb(r1:0),#-11)
1110 \\ r4 = add(clb(r3:2),#-11)
1111 \\ r10 = #1
1112 \\ }
1113 \\ {
1114 \\ r12 = extractu(r12,#11,#52 -32)
1115 \\ r13 = extractu(r13,#11,#52 -32)
1116 \\ }
1117 \\ {
1118 \\ r1:0 = asl(r1:0,r5)
1119 \\ r3:2 = asl(r3:2,r4)
1120 \\ if (!p0) r12 = sub(r10,r5)
1121 \\ if (!p1) r13 = sub(r10,r4)
1122 \\ }
1123 \\ {
1124 \\ r7:6 = extractu(r3:2,#23,#52 -23)
1125 \\ }
1126 \\ {
1127 \\ r9 = or(r8,r6)
1128 \\ jump .Ldenorm_continue
1129 \\ }
1130 \\
1131 \\ .Ldiv_zero_result:
1132 \\ {
1133 \\ r1 = xor(r1,r3)
1134 \\ r3:2 = #0
1135 \\ }
1136 \\ {
1137 \\ r1:0 = insert(r3:2,#63,#0)
1138 \\ jumpr r31
1139 \\ }
1140 \\ .Ldiv_inf_result:
1141 \\ {
1142 \\ p2 = dfclass(r3:2,#0x01)
1143 \\ p2 = dfclass(r1:0,#(0x0F ^ 0x08))
1144 \\ }
1145 \\ {
1146 \\ r10 = USR
1147 \\ if (!p2) jump 1f
1148 \\ r1 = xor(r1,r3)
1149 \\ }
1150 \\ {
1151 \\ r10 = or(r10,#0x04)
1152 \\ }
1153 \\ {
1154 \\ USR = r10
1155 \\ }
1156 \\ 1:
1157 \\ {
1158 \\ r3:2 = combine(##0x7ff00000,#0)
1159 \\ p0 = dfcmp.uo(r3:2,r3:2)
1160 \\ }
1161 \\ {
1162 \\ r1:0 = insert(r3:2,#63,#0)
1163 \\ jumpr r31
1164 \\ }
1165 \\ .Ldiv_nan:
1166 \\ {
1167 \\ p0 = dfclass(r1:0,#0x10)
1168 \\ p1 = dfclass(r3:2,#0x10)
1169 \\ if (!p0.new) r1:0 = r3:2
1170 \\ if (!p1.new) r3:2 = r1:0
1171 \\ }
1172 \\ {
1173 \\ r5 = convert_df2sf(r1:0)
1174 \\ r4 = convert_df2sf(r3:2)
1175 \\ }
1176 \\ {
1177 \\ r1:0 = #-1
1178 \\ jumpr r31
1179 \\ }
1180 \\
1181 \\ .Ldiv_invalid:
1182 \\ {
1183 \\ r10 = ##0x7f800001
1184 \\ }
1185 \\ {
1186 \\ r1:0 = convert_sf2df(r10)
1187 \\ jumpr r31
1188 \\ }
1189 );
1190}
1191
1192fn __hexagon_muldf3() align(32) callconv(.naked) noreturn {
1193 asm volatile (
1194 \\ {
1195 \\ p0 = dfclass(r1:0,#2)
1196 \\ p0 = dfclass(r3:2,#2)
1197 \\ r13:12 = combine(##0x40000000,#0)
1198 \\ }
1199 \\ {
1200 \\ r13:12 = insert(r1:0,#52,#11 -1)
1201 \\ r5:4 = asl(r3:2,#11 -1)
1202 \\ r28 = #-1024
1203 \\ r9:8 = #1
1204 \\ }
1205 \\ {
1206 \\ r7:6 = mpyu(r4,r13)
1207 \\ r5:4 = insert(r9:8,#2,#62)
1208 \\ }
1209 \\
1210 \\
1211 \\
1212 \\
1213 \\ {
1214 \\ r15:14 = mpyu(r12,r4)
1215 \\ r7:6 += mpyu(r12,r5)
1216 \\ }
1217 \\ {
1218 \\ r7:6 += lsr(r15:14,#32)
1219 \\ r11:10 = mpyu(r13,r5)
1220 \\ r5:4 = combine(##1024 +1024 -4,#0)
1221 \\ }
1222 \\ {
1223 \\ r11:10 += lsr(r7:6,#32)
1224 \\ if (!p0) jump .Lmul_abnormal
1225 \\ p1 = cmp.eq(r14,#0)
1226 \\ p1 = cmp.eq(r6,#0)
1227 \\ }
1228 \\ {
1229 \\ if (!p1) r10 = or(r10,r8)
1230 \\ r6 = extractu(r1,#11,#20)
1231 \\ r7 = extractu(r3,#11,#20)
1232 \\ }
1233 \\ {
1234 \\ r15:14 = neg(r11:10)
1235 \\ r6 += add(r28,r7)
1236 \\ r28 = xor(r1,r3)
1237 \\ }
1238 \\ {
1239 \\ if (!p2.new) r11:10 = r15:14
1240 \\ p2 = cmp.gt(r28,#-1)
1241 \\ p0 = !cmp.gt(r6,r5)
1242 \\ p0 = cmp.gt(r6,r4)
1243 \\ if (!p0.new) jump:nt .Lmul_ovf_unf
1244 \\ }
1245 \\ {
1246 \\ r1:0 = convert_d2df(r11:10)
1247 \\ r6 = add(r6,#-1024 -58)
1248 \\ }
1249 \\ {
1250 \\ r1 += asl(r6,#20)
1251 \\ jumpr r31
1252 \\ }
1253 \\
1254 \\ .falign
1255 \\ .Lmul_possible_unf:
1256 \\ {
1257 \\ p0 = cmp.eq(r0,#0)
1258 \\ p0 = bitsclr(r1,r4)
1259 \\ if (!p0.new) jumpr:t r31
1260 \\ r5 = #0x7fff
1261 \\ }
1262 \\ {
1263 \\ p0 = bitsset(r13,r5)
1264 \\ r4 = USR
1265 \\ r5 = #0x030
1266 \\ }
1267 \\ {
1268 \\ if (p0) r4 = or(r4,r5)
1269 \\ }
1270 \\ {
1271 \\ USR = r4
1272 \\ }
1273 \\ {
1274 \\ p0 = dfcmp.eq(r1:0,r1:0)
1275 \\ jumpr r31
1276 \\ }
1277 \\ .falign
1278 \\ .Lmul_ovf_unf:
1279 \\ {
1280 \\ r1:0 = convert_d2df(r11:10)
1281 \\ r13:12 = abs(r11:10)
1282 \\ r7 = add(r6,#-1024 -58)
1283 \\ }
1284 \\ {
1285 \\ r1 += asl(r7,#20)
1286 \\ r7 = extractu(r1,#11,#20)
1287 \\ r4 = ##0x7FEFFFFF
1288 \\ }
1289 \\ {
1290 \\ r7 += add(r6,##-1024 -58)
1291 \\
1292 \\ r5 = #0
1293 \\ }
1294 \\ {
1295 \\ p0 = cmp.gt(r7,##1024 +1024 -2)
1296 \\ if (p0.new) jump:nt .Lmul_ovf
1297 \\ }
1298 \\ {
1299 \\ p0 = cmp.gt(r7,#0)
1300 \\ if (p0.new) jump:nt .Lmul_possible_unf
1301 \\ r5 = sub(r6,r5)
1302 \\ r28 = #63
1303 \\ }
1304 \\ {
1305 \\ r4 = #0
1306 \\ r5 = sub(#5,r5)
1307 \\ }
1308 \\ {
1309 \\ p3 = cmp.gt(r11,#-1)
1310 \\ r5 = min(r5,r28)
1311 \\ r11:10 = r13:12
1312 \\ }
1313 \\ {
1314 \\ r28 = USR
1315 \\ r15:14 = extractu(r11:10,r5:4)
1316 \\ }
1317 \\ {
1318 \\ r11:10 = asr(r11:10,r5)
1319 \\ r4 = #0x0030
1320 \\ r1 = insert(r9,#11,#20)
1321 \\ }
1322 \\ {
1323 \\ p0 = cmp.gtu(r9:8,r15:14)
1324 \\ if (!p0.new) r10 = or(r10,r8)
1325 \\ r11 = setbit(r11,#20 +3)
1326 \\ }
1327 \\ {
1328 \\ r15:14 = neg(r11:10)
1329 \\ p1 = bitsclr(r10,#0x7)
1330 \\ if (!p1.new) r28 = or(r4,r28)
1331 \\ }
1332 \\ {
1333 \\ if (!p3) r11:10 = r15:14
1334 \\ USR = r28
1335 \\ }
1336 \\ {
1337 \\ r1:0 = convert_d2df(r11:10)
1338 \\ p0 = dfcmp.eq(r1:0,r1:0)
1339 \\ }
1340 \\ {
1341 \\ r1 = insert(r9,#11 -1,#20 +1)
1342 \\ jumpr r31
1343 \\ }
1344 \\ .falign
1345 \\ .Lmul_ovf:
1346 \\
1347 \\ {
1348 \\ r28 = USR
1349 \\ r13:12 = combine(##0x7fefffff,#-1)
1350 \\ r1:0 = r11:10
1351 \\ }
1352 \\ {
1353 \\ r14 = extractu(r28,#2,#22)
1354 \\ r28 = or(r28,#0x28)
1355 \\ r5:4 = combine(##0x7ff00000,#0)
1356 \\ }
1357 \\ {
1358 \\ USR = r28
1359 \\ r14 ^= lsr(r1,#31)
1360 \\ r28 = r14
1361 \\ }
1362 \\ {
1363 \\ p0 = !cmp.eq(r28,#1)
1364 \\ p0 = !cmp.eq(r14,#2)
1365 \\ if (p0.new) r13:12 = r5:4
1366 \\ p0 = dfcmp.eq(r1:0,r1:0)
1367 \\ }
1368 \\ {
1369 \\ r1:0 = insert(r13:12,#63,#0)
1370 \\ jumpr r31
1371 \\ }
1372 \\
1373 \\ .Lmul_abnormal:
1374 \\ {
1375 \\ r13:12 = extractu(r1:0,#63,#0)
1376 \\ r5:4 = extractu(r3:2,#63,#0)
1377 \\ }
1378 \\ {
1379 \\ p3 = cmp.gtu(r13:12,r5:4)
1380 \\ if (!p3.new) r1:0 = r3:2
1381 \\ if (!p3.new) r3:2 = r1:0
1382 \\ }
1383 \\ {
1384 \\
1385 \\ p0 = dfclass(r1:0,#0x0f)
1386 \\ if (!p0.new) jump:nt .Linvalid_nan
1387 \\ if (!p3) r13:12 = r5:4
1388 \\ if (!p3) r5:4 = r13:12
1389 \\ }
1390 \\ {
1391 \\
1392 \\ p1 = dfclass(r1:0,#0x08)
1393 \\ p1 = dfclass(r3:2,#0x0e)
1394 \\ }
1395 \\ {
1396 \\
1397 \\
1398 \\ p0 = dfclass(r1:0,#0x08)
1399 \\ p0 = dfclass(r3:2,#0x01)
1400 \\ }
1401 \\ {
1402 \\ if (p1) jump .Ltrue_inf
1403 \\ p2 = dfclass(r3:2,#0x01)
1404 \\ }
1405 \\ {
1406 \\ if (p0) jump .Linvalid_zeroinf
1407 \\ if (p2) jump .Ltrue_zero
1408 \\ r28 = ##0x7c000000
1409 \\ }
1410 \\
1411 \\
1412 \\
1413 \\
1414 \\
1415 \\ {
1416 \\ p0 = bitsclr(r1,r28)
1417 \\ if (p0.new) jump:nt .Lmul_tiny
1418 \\ }
1419 \\ {
1420 \\ r28 = cl0(r5:4)
1421 \\ }
1422 \\ {
1423 \\ r28 = add(r28,#-11)
1424 \\ }
1425 \\ {
1426 \\ r5:4 = asl(r5:4,r28)
1427 \\ }
1428 \\ {
1429 \\ r3:2 = insert(r5:4,#63,#0)
1430 \\ r1 -= asl(r28,#20)
1431 \\ }
1432 \\ jump __hexagon_muldf3
1433 \\ .Lmul_tiny:
1434 \\ {
1435 \\ r28 = USR
1436 \\ r1:0 = xor(r1:0,r3:2)
1437 \\ }
1438 \\ {
1439 \\ r28 = or(r28,#0x30)
1440 \\ r1:0 = insert(r9:8,#63,#0)
1441 \\ r5 = extractu(r28,#2,#22)
1442 \\ }
1443 \\ {
1444 \\ USR = r28
1445 \\ p0 = cmp.gt(r5,#1)
1446 \\ if (!p0.new) r0 = #0
1447 \\ r5 ^= lsr(r1,#31)
1448 \\ }
1449 \\ {
1450 \\ p0 = cmp.eq(r5,#3)
1451 \\ if (!p0.new) r0 = #0
1452 \\ jumpr r31
1453 \\ }
1454 \\ .Linvalid_zeroinf:
1455 \\ {
1456 \\ r28 = USR
1457 \\ }
1458 \\ {
1459 \\ r1:0 = #-1
1460 \\ r28 = or(r28,#2)
1461 \\ }
1462 \\ {
1463 \\ USR = r28
1464 \\ }
1465 \\ {
1466 \\ p0 = dfcmp.uo(r1:0,r1:0)
1467 \\ jumpr r31
1468 \\ }
1469 \\ .Linvalid_nan:
1470 \\ {
1471 \\ p0 = dfclass(r3:2,#0x0f)
1472 \\ r28 = convert_df2sf(r1:0)
1473 \\ if (p0.new) r3:2 = r1:0
1474 \\ }
1475 \\ {
1476 \\ r2 = convert_df2sf(r3:2)
1477 \\ r1:0 = #-1
1478 \\ jumpr r31
1479 \\ }
1480 \\ .falign
1481 \\ .Ltrue_zero:
1482 \\ {
1483 \\ r1:0 = r3:2
1484 \\ r3:2 = r1:0
1485 \\ }
1486 \\ .Ltrue_inf:
1487 \\ {
1488 \\ r3 = extract(r3,#1,#31)
1489 \\ }
1490 \\ {
1491 \\ r1 ^= asl(r3,#31)
1492 \\ jumpr r31
1493 \\ }
1494 );
1495}
1496
1497fn __hexagon_sqrtdf2() align(32) callconv(.naked) noreturn {
1498 asm volatile (
1499 \\ {
1500 \\ r15:14 = extractu(r1:0,#23 +1,#52 -23)
1501 \\ r28 = extractu(r1,#11,#52 -32)
1502 \\ r5:4 = combine(##0x3f000004,#1)
1503 \\ }
1504 \\ {
1505 \\ p2 = dfclass(r1:0,#0x02)
1506 \\ p2 = cmp.gt(r1,#-1)
1507 \\ if (!p2.new) jump:nt .Lsqrt_abnormal
1508 \\ r9 = or(r5,r14)
1509 \\ }
1510 \\
1511 \\ .Ldenormal_restart:
1512 \\ {
1513 \\ r11:10 = r1:0
1514 \\ r7,p0 = sfinvsqrta(r9)
1515 \\ r5 = and(r5,#-16)
1516 \\ r3:2 = #0
1517 \\ }
1518 \\ {
1519 \\ r3 += sfmpy(r7,r9):lib
1520 \\ r2 += sfmpy(r7,r5):lib
1521 \\ r6 = r5
1522 \\
1523 \\
1524 \\ r9 = and(r28,#1)
1525 \\ }
1526 \\ {
1527 \\ r6 -= sfmpy(r3,r2):lib
1528 \\ r11 = insert(r4,#11 +1,#52 -32)
1529 \\ p1 = cmp.gtu(r9,#0)
1530 \\ }
1531 \\ {
1532 \\ r3 += sfmpy(r3,r6):lib
1533 \\ r2 += sfmpy(r2,r6):lib
1534 \\ r6 = r5
1535 \\ r9 = mux(p1,#8,#9)
1536 \\ }
1537 \\ {
1538 \\ r6 -= sfmpy(r3,r2):lib
1539 \\ r11:10 = asl(r11:10,r9)
1540 \\ r9 = mux(p1,#3,#2)
1541 \\ }
1542 \\ {
1543 \\ r2 += sfmpy(r2,r6):lib
1544 \\
1545 \\ r15:14 = asl(r11:10,r9)
1546 \\ }
1547 \\ {
1548 \\ r2 = and(r2,##0x007fffff)
1549 \\ }
1550 \\ {
1551 \\ r2 = add(r2,##0x00800000 - 3)
1552 \\ r9 = mux(p1,#7,#8)
1553 \\ }
1554 \\ {
1555 \\ r8 = asl(r2,r9)
1556 \\ r9 = mux(p1,#15-(1+1),#15-(1+0))
1557 \\ }
1558 \\ {
1559 \\ r13:12 = mpyu(r8,r15)
1560 \\ }
1561 \\ {
1562 \\ r1:0 = asl(r11:10,#15)
1563 \\ r15:14 = mpyu(r13,r13)
1564 \\ p1 = cmp.eq(r0,r0)
1565 \\ }
1566 \\ {
1567 \\ r1:0 -= asl(r15:14,#15)
1568 \\ r15:14 = mpyu(r13,r12)
1569 \\ p2 = cmp.eq(r0,r0)
1570 \\ }
1571 \\ {
1572 \\ r1:0 -= lsr(r15:14,#16)
1573 \\ p3 = cmp.eq(r0,r0)
1574 \\ }
1575 \\ {
1576 \\ r1:0 = mpyu(r1,r8)
1577 \\ }
1578 \\ {
1579 \\ r13:12 += lsr(r1:0,r9)
1580 \\ r9 = add(r9,#16)
1581 \\ r1:0 = asl(r11:10,#31)
1582 \\ }
1583 \\
1584 \\ {
1585 \\ r15:14 = mpyu(r13,r13)
1586 \\ r1:0 -= mpyu(r13,r12)
1587 \\ }
1588 \\ {
1589 \\ r1:0 -= asl(r15:14,#31)
1590 \\ r15:14 = mpyu(r12,r12)
1591 \\ }
1592 \\ {
1593 \\ r1:0 -= lsr(r15:14,#33)
1594 \\ }
1595 \\ {
1596 \\ r1:0 = mpyu(r1,r8)
1597 \\ }
1598 \\ {
1599 \\ r13:12 += lsr(r1:0,r9)
1600 \\ r9 = add(r9,#16)
1601 \\ r1:0 = asl(r11:10,#47)
1602 \\ }
1603 \\
1604 \\ {
1605 \\ r15:14 = mpyu(r13,r13)
1606 \\ }
1607 \\ {
1608 \\ r1:0 -= asl(r15:14,#47)
1609 \\ r15:14 = mpyu(r13,r12)
1610 \\ }
1611 \\ {
1612 \\ r1:0 -= asl(r15:14,#16)
1613 \\ r15:14 = mpyu(r12,r12)
1614 \\ }
1615 \\ {
1616 \\ r1:0 -= lsr(r15:14,#17)
1617 \\ }
1618 \\ {
1619 \\ r1:0 = mpyu(r1,r8)
1620 \\ }
1621 \\ {
1622 \\ r13:12 += lsr(r1:0,r9)
1623 \\ }
1624 \\ {
1625 \\ r3:2 = mpyu(r13,r12)
1626 \\ r5:4 = mpyu(r12,r12)
1627 \\ r15:14 = #0
1628 \\ r1:0 = #0
1629 \\ }
1630 \\ {
1631 \\ r3:2 += lsr(r5:4,#33)
1632 \\ r5:4 += asl(r3:2,#33)
1633 \\ p1 = cmp.eq(r0,r0)
1634 \\ }
1635 \\ {
1636 \\ r7:6 = mpyu(r13,r13)
1637 \\ r1:0 = sub(r1:0,r5:4,p1):carry
1638 \\ r9:8 = #1
1639 \\ }
1640 \\ {
1641 \\ r7:6 += lsr(r3:2,#31)
1642 \\ r9:8 += asl(r13:12,#1)
1643 \\ }
1644 \\
1645 \\
1646 \\
1647 \\
1648 \\
1649 \\ {
1650 \\ r15:14 = sub(r11:10,r7:6,p1):carry
1651 \\ r5:4 = sub(r1:0,r9:8,p2):carry
1652 \\
1653 \\
1654 \\
1655 \\
1656 \\ r7:6 = #1
1657 \\ r11:10 = #0
1658 \\ }
1659 \\ {
1660 \\ r3:2 = sub(r15:14,r11:10,p2):carry
1661 \\ r7:6 = add(r13:12,r7:6)
1662 \\ r28 = add(r28,#-0x3ff)
1663 \\ }
1664 \\ {
1665 \\
1666 \\ if (p2) r13:12 = r7:6
1667 \\ if (p2) r1:0 = r5:4
1668 \\ if (p2) r15:14 = r3:2
1669 \\ }
1670 \\ {
1671 \\ r5:4 = sub(r1:0,r9:8,p3):carry
1672 \\ r7:6 = #1
1673 \\ r28 = asr(r28,#1)
1674 \\ }
1675 \\ {
1676 \\ r3:2 = sub(r15:14,r11:10,p3):carry
1677 \\ r7:6 = add(r13:12,r7:6)
1678 \\ }
1679 \\ {
1680 \\ if (p3) r13:12 = r7:6
1681 \\ if (p3) r1:0 = r5:4
1682 \\
1683 \\
1684 \\
1685 \\
1686 \\
1687 \\ r2 = #1
1688 \\ }
1689 \\ {
1690 \\ p0 = cmp.eq(r1:0,r11:10)
1691 \\ if (!p0.new) r12 = or(r12,r2)
1692 \\ r3 = cl0(r13:12)
1693 \\ r28 = add(r28,#-63)
1694 \\ }
1695 \\
1696 \\
1697 \\
1698 \\ {
1699 \\ r1:0 = convert_ud2df(r13:12)
1700 \\ r28 = add(r28,r3)
1701 \\ }
1702 \\ {
1703 \\ r1 += asl(r28,#52 -32)
1704 \\ jumpr r31
1705 \\ }
1706 \\ .Lsqrt_abnormal:
1707 \\ {
1708 \\ p0 = dfclass(r1:0,#0x01)
1709 \\ if (p0.new) jumpr:t r31
1710 \\ }
1711 \\ {
1712 \\ p0 = dfclass(r1:0,#0x10)
1713 \\ if (p0.new) jump:nt .Lsqrt_nan
1714 \\ }
1715 \\ {
1716 \\ p0 = cmp.gt(r1,#-1)
1717 \\ if (!p0.new) jump:nt .Lsqrt_invalid_neg
1718 \\ if (!p0.new) r28 = ##0x7F800001
1719 \\ }
1720 \\ {
1721 \\ p0 = dfclass(r1:0,#0x08)
1722 \\ if (p0.new) jumpr:nt r31
1723 \\ }
1724 \\
1725 \\
1726 \\ {
1727 \\ r1:0 = extractu(r1:0,#52,#0)
1728 \\ }
1729 \\ {
1730 \\ r28 = add(clb(r1:0),#-11)
1731 \\ }
1732 \\ {
1733 \\ r1:0 = asl(r1:0,r28)
1734 \\ r28 = sub(#1,r28)
1735 \\ }
1736 \\ {
1737 \\ r1 = insert(r28,#1,#52 -32)
1738 \\ }
1739 \\ {
1740 \\ r3:2 = extractu(r1:0,#23 +1,#52 -23)
1741 \\ r5 = ##0x3f000004
1742 \\ }
1743 \\ {
1744 \\ r9 = or(r5,r2)
1745 \\ r5 = and(r5,#-16)
1746 \\ jump .Ldenormal_restart
1747 \\ }
1748 \\ .Lsqrt_nan:
1749 \\ {
1750 \\ r28 = convert_df2sf(r1:0)
1751 \\ r1:0 = #-1
1752 \\ jumpr r31
1753 \\ }
1754 \\ .Lsqrt_invalid_neg:
1755 \\ {
1756 \\ r1:0 = convert_sf2df(r28)
1757 \\ jumpr r31
1758 \\ }
1759 );
1760}
1761
1762comptime {
1763 if (builtin.cpu.arch == .hexagon) {
1764 symbol(&__hexagon_adddf3, "__hexagon_adddf3");
1765 symbol(&__hexagon_adddf3, "__hexagon_fast_adddf3");
1766 symbol(&__hexagon_subdf3, "__hexagon_subdf3");
1767 symbol(&__hexagon_subdf3, "__hexagon_fast_subdf3");
1768 symbol(&__hexagon_divdf3, "__hexagon_divdf3");
1769 symbol(&__hexagon_divdf3, "__hexagon_fast_divdf3");
1770 symbol(&__hexagon_muldf3, "__hexagon_muldf3");
1771 symbol(&__hexagon_muldf3, "__hexagon_fast_muldf3");
1772 symbol(&__hexagon_sqrtdf2, "__hexagon_sqrtdf2");
1773 symbol(&__hexagon_sqrtdf2, "__hexagon_fast2_sqrtdf2");
1774 symbol(&__hexagon_sqrtdf2, "__hexagon_sqrt");
1775 symbol(&__hexagon_divsf3, "__hexagon_divsf3");
1776 symbol(&__hexagon_divsf3, "__hexagon_fast_divsf3");
1777 symbol(&__hexagon_divsi3, "__hexagon_divsi3");
1778 symbol(&__hexagon_umodsi3, "__hexagon_umodsi3");
1779 symbol(&__hexagon_sqrtf, "__hexagon_sqrtf");
1780 symbol(&__hexagon_sqrtf, "__hexagon_fast2_sqrtf");
1781 symbol(&__hexagon_moddi3, "__hexagon_moddi3");
1782 symbol(&__hexagon_divdi3, "__hexagon_divdi3");
1783 symbol(&__hexagon_udivdi3, "__hexagon_udivdi3");
1784 symbol(&__hexagon_umoddi3, "__hexagon_umoddi3");
1785 symbol(&__hexagon_modsi3, "__hexagon_modsi3");
1786 symbol(&__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes, "__hexagon_memcpy_likely_aligned_min32bytes_mult8bytes");
1787 symbol(&__hexagon_udivsi3, "__hexagon_udivsi3");
1788 }
1789}