]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/compiler-rt/lib/builtins/hexagon/sfsqrt_opt.S
Merge clang 7.0.1 and several follow-up changes
[FreeBSD/FreeBSD.git] / contrib / compiler-rt / lib / builtins / hexagon / sfsqrt_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 RIN r0
23 #define S r0
24 #define H r1
25 #define D r2
26 #define E r3
27 #define HALF r4
28 #define R r5
29
30 #define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG
31 #define FAST_ALIAS(TAG) .global __hexagon_fast_##TAG ; .set __hexagon_fast_##TAG, __hexagon_##TAG
32 #define FAST2_ALIAS(TAG) .global __hexagon_fast2_##TAG ; .set __hexagon_fast2_##TAG, __hexagon_##TAG
33
34 FUNCTION_BEGIN __hexagon_sqrtf
35   {
36     E,p0 = sfinvsqrta(RIN)
37     R = sffixupr(RIN)
38     HALF = ##0x3f000000   // 0.5
39     r1:0 = combine(#0,#0)   // clear S/H
40   }
41   {
42     S += sfmpy(E,R):lib   // S0
43     H += sfmpy(E,HALF):lib    // H0
44     D = HALF
45     E = R
46   }
47   {
48     D -= sfmpy(S,H):lib   // d0
49     p1 = sfclass(R,#1)    // is zero?
50     //E -= sfmpy(S,S):lib   // e0
51   }
52   {
53     S += sfmpy(S,D):lib   // S1
54     H += sfmpy(H,D):lib   // H1
55     D = HALF
56     E = R
57   }
58   {
59     D -= sfmpy(S,H):lib   // d0
60     E -= sfmpy(S,S):lib   // e0
61   }
62   {
63     S += sfmpy(H,E):lib   // S2
64     H += sfmpy(H,D):lib   // H2
65     D = HALF
66     E = R
67   }
68   {
69     //D -= sfmpy(S,H):lib   // d2
70     E -= sfmpy(S,S):lib   // e2
71     if (p1) r0 = or(r0,R)     // sqrt(-0.0) = -0.0
72   }
73   {
74     S += sfmpy(H,E,p0):scale  // S3
75     jumpr r31
76   }
77
78 FUNCTION_END __hexagon_sqrtf
79
80 Q6_ALIAS(sqrtf)
81 FAST_ALIAS(sqrtf)
82 FAST2_ALIAS(sqrtf)