| #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 |