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