18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#include <linux/linkage.h> 38c2ecf20Sopenharmony_ci 48c2ecf20Sopenharmony_ci/* 58c2ecf20Sopenharmony_ci * Multiply operation for 32 bit integers. 68c2ecf20Sopenharmony_ci * Input : Operand1 in Reg r5 78c2ecf20Sopenharmony_ci * Operand2 in Reg r6 88c2ecf20Sopenharmony_ci * Output: Result [op1 * op2] in Reg r3 98c2ecf20Sopenharmony_ci */ 108c2ecf20Sopenharmony_ci .text 118c2ecf20Sopenharmony_ci .globl __mulsi3 128c2ecf20Sopenharmony_ci .type __mulsi3, @function 138c2ecf20Sopenharmony_ci .ent __mulsi3 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci__mulsi3: 168c2ecf20Sopenharmony_ci .frame r1, 0, r15 178c2ecf20Sopenharmony_ci add r3, r0, r0 188c2ecf20Sopenharmony_ci beqi r5, result_is_zero /* multiply by zero */ 198c2ecf20Sopenharmony_ci beqi r6, result_is_zero /* multiply by zero */ 208c2ecf20Sopenharmony_ci bgeid r5, r5_pos 218c2ecf20Sopenharmony_ci xor r4, r5, r6 /* get the sign of the result */ 228c2ecf20Sopenharmony_ci rsubi r5, r5, 0 /* make r5 positive */ 238c2ecf20Sopenharmony_cir5_pos: 248c2ecf20Sopenharmony_ci bgei r6, r6_pos 258c2ecf20Sopenharmony_ci rsubi r6, r6, 0 /* make r6 positive */ 268c2ecf20Sopenharmony_cir6_pos: 278c2ecf20Sopenharmony_ci bri l1 288c2ecf20Sopenharmony_cil2: 298c2ecf20Sopenharmony_ci add r5, r5, r5 308c2ecf20Sopenharmony_cil1: 318c2ecf20Sopenharmony_ci srl r6, r6 328c2ecf20Sopenharmony_ci addc r7, r0, r0 338c2ecf20Sopenharmony_ci beqi r7, l2 348c2ecf20Sopenharmony_ci bneid r6, l2 358c2ecf20Sopenharmony_ci add r3, r3, r5 368c2ecf20Sopenharmony_ci blti r4, negateresult 378c2ecf20Sopenharmony_ci rtsd r15, 8 388c2ecf20Sopenharmony_ci nop 398c2ecf20Sopenharmony_cinegateresult: 408c2ecf20Sopenharmony_ci rtsd r15, 8 418c2ecf20Sopenharmony_ci rsub r3, r3, r0 428c2ecf20Sopenharmony_ciresult_is_zero: 438c2ecf20Sopenharmony_ci rtsd r15, 8 448c2ecf20Sopenharmony_ci addi r3, r0, 0 458c2ecf20Sopenharmony_ci 468c2ecf20Sopenharmony_ci.size __mulsi3, . - __mulsi3 478c2ecf20Sopenharmony_ci.end __mulsi3 48