Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
4e07dba7 MS |
2 | #include <linux/linkage.h> |
3 | ||
4 | /* | |
5 | * Multiply operation for 32 bit integers. | |
6 | * Input : Operand1 in Reg r5 | |
7 | * Operand2 in Reg r6 | |
8 | * Output: Result [op1 * op2] in Reg r3 | |
9 | */ | |
10 | .text | |
11 | .globl __mulsi3 | |
12 | .type __mulsi3, @function | |
13 | .ent __mulsi3 | |
14 | ||
15 | __mulsi3: | |
16 | .frame r1, 0, r15 | |
17 | add r3, r0, r0 | |
18 | beqi r5, result_is_zero /* multiply by zero */ | |
19 | beqi r6, result_is_zero /* multiply by zero */ | |
20 | bgeid r5, r5_pos | |
21 | xor r4, r5, r6 /* get the sign of the result */ | |
22 | rsubi r5, r5, 0 /* make r5 positive */ | |
23 | r5_pos: | |
24 | bgei r6, r6_pos | |
25 | rsubi r6, r6, 0 /* make r6 positive */ | |
26 | r6_pos: | |
27 | bri l1 | |
28 | l2: | |
29 | add r5, r5, r5 | |
30 | l1: | |
31 | srl r6, r6 | |
32 | addc r7, r0, r0 | |
33 | beqi r7, l2 | |
34 | bneid r6, l2 | |
35 | add r3, r3, r5 | |
36 | blti r4, negateresult | |
37 | rtsd r15, 8 | |
38 | nop | |
39 | negateresult: | |
40 | rtsd r15, 8 | |
41 | rsub r3, r3, r0 | |
42 | result_is_zero: | |
43 | rtsd r15, 8 | |
44 | addi r3, r0, 0 | |
45 | ||
46 | .size __mulsi3, . - __mulsi3 | |
47 | .end __mulsi3 |