xref: /kernel/linux/linux-5.10/arch/c6x/lib/divi.S
  • Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
  • only in /kernel/linux/linux-5.10/arch/c6x/lib/
1 ;; SPDX-License-Identifier: GPL-2.0-or-later
2 ;;  Copyright 2010  Free Software Foundation, Inc.
3 ;;  Contributed by Bernd Schmidt <bernds@codesourcery.com>.
4 ;;
5 
6 #include <linux/linkage.h>
7 
8 	;; ABI considerations for the divide functions
9 	;; The following registers are call-used:
10 	;; __c6xabi_divi A0,A1,A2,A4,A6,B0,B1,B2,B4,B5
11 	;; __c6xabi_divu A0,A1,A2,A4,A6,B0,B1,B2,B4
12 	;; __c6xabi_remi A1,A2,A4,A5,A6,B0,B1,B2,B4
13 	;; __c6xabi_remu A1,A4,A5,A7,B0,B1,B2,B4
14 	;;
15 	;; In our implementation, divu and remu are leaf functions,
16 	;; while both divi and remi call into divu.
17 	;; A0 is not clobbered by any of the functions.
18 	;; divu does not clobber B2 either, which is taken advantage of
19 	;; in remi.
20 	;; divi uses B5 to hold the original return address during
21 	;; the call to divu.
22 	;; remi uses B2 and A5 to hold the input values during the
23 	;; call to divu.  It stores B3 in on the stack.
24 
25 	.text
26 ENTRY(__c6xabi_divi)
27 	call	.s2	__c6xabi_divu
28 ||	mv	.d2	B3, B5
29 ||	cmpgt	.l1	0, A4, A1
30 ||	cmpgt	.l2	0, B4, B1
31 
32    [A1]	neg	.l1	A4, A4
33 || [B1]	neg	.l2	B4, B4
34 ||	xor	.s1x	A1, B1, A1
35    [A1] addkpc	.s2	_divu_ret, B3, 4
36 _divu_ret:
37 	neg	.l1	A4, A4
38 ||	mv	.l2	B3,B5
39 ||	ret	.s2	B5
40 	nop		5
41 ENDPROC(__c6xabi_divi)
42 

Indexes created Thu Nov 07 10:32:03 CST 2024