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 */ 22r5_pos: 23 bgei r6, r6_pos 24 rsubi r6, r6, 0 /* make r6 positive */ 25r6_pos: 26 bri l1 27l2: 28 add r5, r5, r5 29l1: 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 38negateresult: 39 rtsd r15, 8 40 rsub r3, r3, r0 41result_is_zero: 42 rtsd r15, 8 43 addi r3, r0, 0 44 45.size __mulsi3, . - __mulsi3 46.end __mulsi3 47