1 | /* SPDX-License-Identifier: GPL-2.0 */ |
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 |
48 | |