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