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