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