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