]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/builtins/hexagon/sfdiv_opt.S
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / builtins / hexagon / sfdiv_opt.S
1 //===----------------------Hexagon builtin routine ------------------------===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10         .macro FUNCTION_BEGIN name
11         .text
12         .p2align 5
13         .globl \name
14         .type  \name, @function
15 \name:
16         .endm
17
18         .macro FUNCTION_END name
19         .size  \name, . - \name
20         .endm
21
22 #define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG
23 #define FAST_ALIAS(TAG) .global __hexagon_fast_##TAG ; .set __hexagon_fast_##TAG, __hexagon_##TAG
24 #define FAST2_ALIAS(TAG) .global __hexagon_fast2_##TAG ; .set __hexagon_fast2_##TAG, __hexagon_##TAG
25
26 FUNCTION_BEGIN __hexagon_divsf3
27   {
28     r2,p0 = sfrecipa(r0,r1)
29     r4 = sffixupd(r0,r1)
30     r3 = ##0x3f800000   // 1.0
31   }
32   {
33     r5 = sffixupn(r0,r1)
34     r3 -= sfmpy(r4,r2):lib  // 1-(den/recip) yields error?
35     r6 = ##0x80000000
36     r7 = r3
37   }
38   {
39     r2 += sfmpy(r3,r2):lib
40     r3 = r7
41     r6 = r5
42     r0 = and(r6,r5)
43   }
44   {
45     r3 -= sfmpy(r4,r2):lib
46     r0 += sfmpy(r5,r2):lib
47   }
48   {
49     r2 += sfmpy(r3,r2):lib
50     r6 -= sfmpy(r0,r4):lib
51   }
52   {
53     r0 += sfmpy(r6,r2):lib
54   }
55   {
56     r5 -= sfmpy(r0,r4):lib
57   }
58   {
59     r0 += sfmpy(r5,r2,p0):scale
60     jumpr r31
61   }
62 FUNCTION_END __hexagon_divsf3
63
64 Q6_ALIAS(divsf3)
65 FAST_ALIAS(divsf3)
66 FAST2_ALIAS(divsf3)