1 | //===----------------------Hexagon builtin routine ------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | |
10 | |
11 | .macro FUNCTION_BEGIN name |
12 | .text |
13 | .p2align 5 |
14 | .globl \name |
15 | .type \name, @function |
16 | \name: |
17 | .endm |
18 | |
19 | .macro FUNCTION_END name |
20 | .size \name, . - \name |
21 | .endm |
22 | |
23 | |
24 | FUNCTION_BEGIN __hexagon_divsi3 |
25 | { |
26 | p0 = cmp.ge(r0,#0) |
27 | p1 = cmp.ge(r1,#0) |
28 | r1 = abs(r0) |
29 | r2 = abs(r1) |
30 | } |
31 | { |
32 | r3 = cl0(r1) |
33 | r4 = cl0(r2) |
34 | r5 = sub(r1,r2) |
35 | p2 = cmp.gtu(r2,r1) |
36 | } |
37 | #if (__HEXAGON_ARCH__ == 60) |
38 | { |
39 | r0 = #0 |
40 | p1 = xor(p0,p1) |
41 | p0 = cmp.gtu(r2,r5) |
42 | } |
43 | if (p2) jumpr r31 |
44 | #else |
45 | { |
46 | r0 = #0 |
47 | p1 = xor(p0,p1) |
48 | p0 = cmp.gtu(r2,r5) |
49 | if (p2) jumpr r31 |
50 | } |
51 | #endif |
52 | { |
53 | r0 = mux(p1,#-1,#1) |
54 | if (p0) jumpr r31 |
55 | r4 = sub(r4,r3) |
56 | r3 = #1 |
57 | } |
58 | { |
59 | r0 = #0 |
60 | r3:2 = vlslw(r3:2,r4) |
61 | loop0(1f,r4) |
62 | } |
63 | .falign |
64 | 1: |
65 | { |
66 | p0 = cmp.gtu(r2,r1) |
67 | if (!p0.new) r1 = sub(r1,r2) |
68 | if (!p0.new) r0 = add(r0,r3) |
69 | r3:2 = vlsrw(r3:2,#1) |
70 | }:endloop0 |
71 | { |
72 | p0 = cmp.gtu(r2,r1) |
73 | if (!p0.new) r0 = add(r0,r3) |
74 | if (!p1) jumpr r31 |
75 | } |
76 | { |
77 | r0 = neg(r0) |
78 | jumpr r31 |
79 | } |
80 | FUNCTION_END __hexagon_divsi3 |
81 | |
82 | .globl __qdsp_divsi3 |
83 | .set __qdsp_divsi3, __hexagon_divsi3 |
84 | |