1*3cab2bb3Spatrick//===----------------------Hexagon builtin routine ------------------------===//
2*3cab2bb3Spatrick//
3*3cab2bb3Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*3cab2bb3Spatrick// See https://llvm.org/LICENSE.txt for license information.
5*3cab2bb3Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*3cab2bb3Spatrick//
7*3cab2bb3Spatrick//===----------------------------------------------------------------------===//
8*3cab2bb3Spatrick
9*3cab2bb3Spatrick	.macro FUNCTION_BEGIN name
10*3cab2bb3Spatrick	.text
11*3cab2bb3Spatrick	.p2align 5
12*3cab2bb3Spatrick	.globl \name
13*3cab2bb3Spatrick	.type  \name, @function
14*3cab2bb3Spatrick\name:
15*3cab2bb3Spatrick	.endm
16*3cab2bb3Spatrick
17*3cab2bb3Spatrick	.macro FUNCTION_END name
18*3cab2bb3Spatrick	.size  \name, . - \name
19*3cab2bb3Spatrick	.endm
20*3cab2bb3Spatrick
21*3cab2bb3Spatrick#define Q6_ALIAS(TAG) .global __qdsp_##TAG ; .set __qdsp_##TAG, __hexagon_##TAG
22*3cab2bb3Spatrick#define FAST_ALIAS(TAG) .global __hexagon_fast_##TAG ; .set __hexagon_fast_##TAG, __hexagon_##TAG
23*3cab2bb3Spatrick#define FAST2_ALIAS(TAG) .global __hexagon_fast2_##TAG ; .set __hexagon_fast2_##TAG, __hexagon_##TAG
24*3cab2bb3Spatrick
25*3cab2bb3SpatrickFUNCTION_BEGIN __hexagon_divsf3
26*3cab2bb3Spatrick  {
27*3cab2bb3Spatrick    r2,p0 = sfrecipa(r0,r1)
28*3cab2bb3Spatrick    r4 = sffixupd(r0,r1)
29*3cab2bb3Spatrick    r3 = ##0x3f800000   // 1.0
30*3cab2bb3Spatrick  }
31*3cab2bb3Spatrick  {
32*3cab2bb3Spatrick    r5 = sffixupn(r0,r1)
33*3cab2bb3Spatrick    r3 -= sfmpy(r4,r2):lib  // 1-(den/recip) yields error?
34*3cab2bb3Spatrick    r6 = ##0x80000000
35*3cab2bb3Spatrick    r7 = r3
36*3cab2bb3Spatrick  }
37*3cab2bb3Spatrick  {
38*3cab2bb3Spatrick    r2 += sfmpy(r3,r2):lib
39*3cab2bb3Spatrick    r3 = r7
40*3cab2bb3Spatrick    r6 = r5
41*3cab2bb3Spatrick    r0 = and(r6,r5)
42*3cab2bb3Spatrick  }
43*3cab2bb3Spatrick  {
44*3cab2bb3Spatrick    r3 -= sfmpy(r4,r2):lib
45*3cab2bb3Spatrick    r0 += sfmpy(r5,r2):lib
46*3cab2bb3Spatrick  }
47*3cab2bb3Spatrick  {
48*3cab2bb3Spatrick    r2 += sfmpy(r3,r2):lib
49*3cab2bb3Spatrick    r6 -= sfmpy(r0,r4):lib
50*3cab2bb3Spatrick  }
51*3cab2bb3Spatrick  {
52*3cab2bb3Spatrick    r0 += sfmpy(r6,r2):lib
53*3cab2bb3Spatrick  }
54*3cab2bb3Spatrick  {
55*3cab2bb3Spatrick    r5 -= sfmpy(r0,r4):lib
56*3cab2bb3Spatrick  }
57*3cab2bb3Spatrick  {
58*3cab2bb3Spatrick    r0 += sfmpy(r5,r2,p0):scale
59*3cab2bb3Spatrick    jumpr r31
60*3cab2bb3Spatrick  }
61*3cab2bb3SpatrickFUNCTION_END __hexagon_divsf3
62*3cab2bb3Spatrick
63*3cab2bb3SpatrickQ6_ALIAS(divsf3)
64*3cab2bb3SpatrickFAST_ALIAS(divsf3)
65*3cab2bb3SpatrickFAST2_ALIAS(divsf3)
66