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