]> git.ipfire.org Git - thirdparty/gcc.git/blob - libgcc/config/microblaze/divsi3.S
Update copyright years.
[thirdparty/gcc.git] / libgcc / config / microblaze / divsi3.S
1 ###################################-
2 #
3 # Copyright (C) 2009-2020 Free Software Foundation, Inc.
4 #
5 # Contributed by Michael Eager <eager@eagercon.com>.
6 #
7 # This file is free software; you can redistribute it and/or modify it
8 # under the terms of the GNU General Public License as published by the
9 # Free Software Foundation; either version 3, or (at your option) any
10 # later version.
11 #
12 # GCC is distributed in the hope that it will be useful, but WITHOUT
13 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14 # or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
15 # License for more details.
16 #
17 # Under Section 7 of GPL version 3, you are granted additional
18 # permissions described in the GCC Runtime Library Exception, version
19 # 3.1, as published by the Free Software Foundation.
20 #
21 # You should have received a copy of the GNU General Public License and
22 # a copy of the GCC Runtime Library Exception along with this program;
23 # see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24 # <http://www.gnu.org/licenses/>.
25 #
26 # divsi3.S
27 #
28 # Divide operation for 32 bit integers.
29 # Input : Dividend in Reg r5
30 # Divisor in Reg r6
31 # Output: Result in Reg r3
32 #
33 #######################################
34
35 /* An executable stack is *not* required for these functions. */
36 #ifdef __linux__
37 .section .note.GNU-stack,"",%progbits
38 .previous
39 #endif
40
41 .globl __divsi3
42 .ent __divsi3
43 .type __divsi3,@function
44 __divsi3:
45 .frame r1,0,r15
46
47 ADDIK r1,r1,-16
48 SWI r28,r1,0
49 SWI r29,r1,4
50 SWI r30,r1,8
51 SWI r31,r1,12
52
53 BEQI r6,$LaDiv_By_Zero # Div_by_Zero # Division Error
54 BEQI r5,$LaResult_Is_Zero # Result is Zero
55 BGEID r5,$LaR5_Pos
56 XOR r28,r5,r6 # Get the sign of the result
57 RSUBI r5,r5,0 # Make r5 positive
58 $LaR5_Pos:
59 BGEI r6,$LaR6_Pos
60 RSUBI r6,r6,0 # Make r6 positive
61 $LaR6_Pos:
62 ADDIK r30,r0,0 # Clear mod
63 ADDIK r3,r0,0 # clear div
64 ADDIK r29,r0,32 # Initialize the loop count
65
66 # First part try to find the first '1' in the r5
67 $LaDIV0:
68 BLTI r5,$LaDIV2 # This traps r5 == 0x80000000
69 $LaDIV1:
70 ADD r5,r5,r5 # left shift logical r5
71 BGTID r5,$LaDIV1
72 ADDIK r29,r29,-1
73 $LaDIV2:
74 ADD r5,r5,r5 # left shift logical r5 get the '1' into the Carry
75 ADDC r30,r30,r30 # Move that bit into the Mod register
76 RSUB r31,r6,r30 # Try to subtract (r30 a r6)
77 BLTI r31,$LaMOD_TOO_SMALL
78 OR r30,r0,r31 # Move the r31 to mod since the result was positive
79 ADDIK r3,r3,1
80 $LaMOD_TOO_SMALL:
81 ADDIK r29,r29,-1
82 BEQi r29,$LaLOOP_END
83 ADD r3,r3,r3 # Shift in the '1' into div
84 BRI $LaDIV2 # Div2
85 $LaLOOP_END:
86 BGEI r28,$LaRETURN_HERE
87 BRID $LaRETURN_HERE
88 RSUBI r3,r3,0 # Negate the result
89 $LaDiv_By_Zero:
90 $LaResult_Is_Zero:
91 OR r3,r0,r0 # set result to 0
92 $LaRETURN_HERE:
93 # Restore values of CSRs and that of r3 and the divisor and the dividend
94 LWI r28,r1,0
95 LWI r29,r1,4
96 LWI r30,r1,8
97 LWI r31,r1,12
98 RTSD r15,8
99 ADDIK r1,r1,16
100 .end __divsi3
101 .size __divsi3, . - __divsi3
102