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
10*3cab2bb3Spatrick
11*3cab2bb3Spatrick	.macro FUNCTION_BEGIN name
12*3cab2bb3Spatrick	.text
13*3cab2bb3Spatrick        .p2align 5
14*3cab2bb3Spatrick	.globl \name
15*3cab2bb3Spatrick	.type  \name, @function
16*3cab2bb3Spatrick\name:
17*3cab2bb3Spatrick	.endm
18*3cab2bb3Spatrick
19*3cab2bb3Spatrick	.macro FUNCTION_END name
20*3cab2bb3Spatrick	.size  \name, . - \name
21*3cab2bb3Spatrick	.endm
22*3cab2bb3Spatrick
23*3cab2bb3Spatrick
24*3cab2bb3SpatrickFUNCTION_BEGIN __hexagon_divsi3
25*3cab2bb3Spatrick	{
26*3cab2bb3Spatrick		p0 = cmp.ge(r0,#0)
27*3cab2bb3Spatrick		p1 = cmp.ge(r1,#0)
28*3cab2bb3Spatrick		r1 = abs(r0)
29*3cab2bb3Spatrick		r2 = abs(r1)
30*3cab2bb3Spatrick	}
31*3cab2bb3Spatrick	{
32*3cab2bb3Spatrick		r3 = cl0(r1)
33*3cab2bb3Spatrick		r4 = cl0(r2)
34*3cab2bb3Spatrick		r5 = sub(r1,r2)
35*3cab2bb3Spatrick		p2 = cmp.gtu(r2,r1)
36*3cab2bb3Spatrick	}
37*3cab2bb3Spatrick#if (__HEXAGON_ARCH__ == 60)
38*3cab2bb3Spatrick	{
39*3cab2bb3Spatrick		r0 = #0
40*3cab2bb3Spatrick		p1 = xor(p0,p1)
41*3cab2bb3Spatrick		p0 = cmp.gtu(r2,r5)
42*3cab2bb3Spatrick	}
43*3cab2bb3Spatrick		if (p2) jumpr r31
44*3cab2bb3Spatrick#else
45*3cab2bb3Spatrick	{
46*3cab2bb3Spatrick		r0 = #0
47*3cab2bb3Spatrick		p1 = xor(p0,p1)
48*3cab2bb3Spatrick		p0 = cmp.gtu(r2,r5)
49*3cab2bb3Spatrick		if (p2) jumpr r31
50*3cab2bb3Spatrick	}
51*3cab2bb3Spatrick#endif
52*3cab2bb3Spatrick	{
53*3cab2bb3Spatrick		r0 = mux(p1,#-1,#1)
54*3cab2bb3Spatrick		if (p0) jumpr r31
55*3cab2bb3Spatrick		r4 = sub(r4,r3)
56*3cab2bb3Spatrick		r3 = #1
57*3cab2bb3Spatrick	}
58*3cab2bb3Spatrick	{
59*3cab2bb3Spatrick		r0 = #0
60*3cab2bb3Spatrick		r3:2 = vlslw(r3:2,r4)
61*3cab2bb3Spatrick		loop0(1f,r4)
62*3cab2bb3Spatrick	}
63*3cab2bb3Spatrick	.falign
64*3cab2bb3Spatrick1:
65*3cab2bb3Spatrick	{
66*3cab2bb3Spatrick		p0 = cmp.gtu(r2,r1)
67*3cab2bb3Spatrick		if (!p0.new) r1 = sub(r1,r2)
68*3cab2bb3Spatrick		if (!p0.new) r0 = add(r0,r3)
69*3cab2bb3Spatrick		r3:2 = vlsrw(r3:2,#1)
70*3cab2bb3Spatrick	}:endloop0
71*3cab2bb3Spatrick	{
72*3cab2bb3Spatrick		p0 = cmp.gtu(r2,r1)
73*3cab2bb3Spatrick		if (!p0.new) r0 = add(r0,r3)
74*3cab2bb3Spatrick		if (!p1) jumpr r31
75*3cab2bb3Spatrick	}
76*3cab2bb3Spatrick	{
77*3cab2bb3Spatrick		r0 = neg(r0)
78*3cab2bb3Spatrick		jumpr r31
79*3cab2bb3Spatrick	}
80*3cab2bb3SpatrickFUNCTION_END __hexagon_divsi3
81*3cab2bb3Spatrick
82*3cab2bb3Spatrick  .globl __qdsp_divsi3
83*3cab2bb3Spatrick  .set   __qdsp_divsi3, __hexagon_divsi3
84