xref: /linux/arch/hexagon/lib/divsi3.S (revision 8e07e0e3964ca4e23ce7b68e2096fe660a888942)
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (c) 2021, The Linux Foundation. All rights reserved.
4 */
5
6#include <linux/linkage.h>
7
8SYM_FUNC_START(__hexagon_divsi3)
9        {
10                p0 = cmp.gt(r0,#-1)
11                p1 = cmp.gt(r1,#-1)
12                r3:2 = vabsw(r1:0)
13        }
14        {
15                p3 = xor(p0,p1)
16                r4 = sub(r2,r3)
17                r6 = cl0(r2)
18                p0 = cmp.gtu(r3,r2)
19        }
20        {
21                r0 = mux(p3,#-1,#1)
22                r7 = cl0(r3)
23                p1 = cmp.gtu(r3,r4)
24        }
25        {
26                r0 = mux(p0,#0,r0)
27                p0 = or(p0,p1)
28                if (p0.new) jumpr:nt r31
29                r6 = sub(r7,r6)
30        }
31        {
32                r7 = r6
33                r5:4 = combine(#1,r3)
34                r6 = add(#1,lsr(r6,#1))
35                p0 = cmp.gtu(r6,#4)
36        }
37        {
38                r5:4 = vaslw(r5:4,r7)
39                if (!p0) r6 = #3
40        }
41        {
42                loop0(1f,r6)
43                r7:6 = vlsrw(r5:4,#1)
44                r1:0 = #0
45        }
46        .falign
471:
48        {
49                r5:4 = vlsrw(r5:4,#2)
50                if (!p0.new) r0 = add(r0,r5)
51                if (!p0.new) r2 = sub(r2,r4)
52                p0 = cmp.gtu(r4,r2)
53        }
54        {
55                r7:6 = vlsrw(r7:6,#2)
56                if (!p0.new) r0 = add(r0,r7)
57                if (!p0.new) r2 = sub(r2,r6)
58                p0 = cmp.gtu(r6,r2)
59        }:endloop0
60        {
61                if (!p0) r0 = add(r0,r7)
62        }
63        {
64                if (p3) r0 = sub(r1,r0)
65                jumpr r31
66        }
67SYM_FUNC_END(__hexagon_divsi3)
68