162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#include <linux/linkage.h>
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci/*
562306a36Sopenharmony_ci * Multiply operation for 32 bit integers.
662306a36Sopenharmony_ci *	Input :	Operand1 in Reg r5
762306a36Sopenharmony_ci *		Operand2 in Reg r6
862306a36Sopenharmony_ci *	Output: Result [op1 * op2] in Reg r3
962306a36Sopenharmony_ci */
1062306a36Sopenharmony_ci	.text
1162306a36Sopenharmony_ci	.globl	__mulsi3
1262306a36Sopenharmony_ci	.type __mulsi3,  @function
1362306a36Sopenharmony_ci	.ent __mulsi3
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci__mulsi3:
1662306a36Sopenharmony_ci	.frame	r1, 0, r15
1762306a36Sopenharmony_ci	add	r3, r0, r0
1862306a36Sopenharmony_ci	beqi	r5, result_is_zero /* multiply by zero */
1962306a36Sopenharmony_ci	beqi	r6, result_is_zero /* multiply by zero */
2062306a36Sopenharmony_ci	bgeid	r5, r5_pos
2162306a36Sopenharmony_ci	xor	r4, r5, r6 /* get the sign of the result */
2262306a36Sopenharmony_ci	rsubi	r5, r5, 0 /* make r5 positive */
2362306a36Sopenharmony_cir5_pos:
2462306a36Sopenharmony_ci	bgei	r6, r6_pos
2562306a36Sopenharmony_ci	rsubi	r6, r6, 0 /* make r6 positive */
2662306a36Sopenharmony_cir6_pos:
2762306a36Sopenharmony_ci	bri	l1
2862306a36Sopenharmony_cil2:
2962306a36Sopenharmony_ci	add	r5, r5, r5
3062306a36Sopenharmony_cil1:
3162306a36Sopenharmony_ci	srl	r6, r6
3262306a36Sopenharmony_ci	addc	r7, r0, r0
3362306a36Sopenharmony_ci	beqi	r7, l2
3462306a36Sopenharmony_ci	bneid	r6, l2
3562306a36Sopenharmony_ci	add	r3, r3, r5
3662306a36Sopenharmony_ci	blti	r4, negateresult
3762306a36Sopenharmony_ci	rtsd	r15, 8
3862306a36Sopenharmony_ci	nop
3962306a36Sopenharmony_cinegateresult:
4062306a36Sopenharmony_ci	rtsd	r15, 8
4162306a36Sopenharmony_ci	rsub	r3, r3, r0
4262306a36Sopenharmony_ciresult_is_zero:
4362306a36Sopenharmony_ci	rtsd	r15, 8
4462306a36Sopenharmony_ci	addi	r3, r0, 0
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci.size __mulsi3,  . - __mulsi3
4762306a36Sopenharmony_ci.end __mulsi3
48