xref: /netbsd-src/external/gpl3/gcc.old/dist/libgcc/config/rl78/cmpsi2.S (revision b83ebeba7f767758d2778bb0f9d7a76534253621)
1;   Copyright (C) 2011-2013 Free Software Foundation, Inc.
2;   Contributed by Red Hat.
3;
4; This file is free software; you can redistribute it and/or modify it
5; under the terms of the GNU General Public License as published by the
6; Free Software Foundation; either version 3, or (at your option) any
7; later version.
8;
9; This file is distributed in the hope that it will be useful, but
10; WITHOUT ANY WARRANTY; without even the implied warranty of
11; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12; General Public License for more details.
13;
14; Under Section 7 of GPL version 3, you are granted additional
15; permissions described in the GCC Runtime Library Exception, version
16; 3.1, as published by the Free Software Foundation.
17;
18; You should have received a copy of the GNU General Public License and
19; a copy of the GCC Runtime Library Exception along with this program;
20; see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
21; <http://www.gnu.org/licenses/>.
22
23
24; clobberable
25r8	=	0xffef0
26
27	.text
28
29	;;   int __cmpsi2 (signed long A, signed long B)
30	;;
31	;; Performs a signed comparison of A and B.
32	;; If A is less than B it returns 0.  If A is greater
33	;; than B it returns 2.  If they are equal it returns 1.
34
35	.global	___cmpsi2
36        .type   ___cmpsi2, @function
37___cmpsi2:
38	;; A is at [sp+4]
39	;; B is at [sp+8]
40	;; Result put in R8
41
42	;; Initialise default return value.
43	onew	bc
44
45	;;  Compare the high words.
46	movw	ax, [sp + 10]
47	movw	de, ax
48	movw	ax, [sp + 6]
49	cmpw	ax, de
50	skz
51	br	!!.Lconvert_to_signed
52
53.Lcompare_bottom_words:
54	;; The top words are equal - compare the bottom words.
55	;; Note - code from __ucmpsi2 branches into here.
56	movw   ax, [sp + 8]
57	movw   de, ax
58	movw   ax, [sp + 4]
59	cmpw   ax, de
60	sknz
61	br	!!.Lless_than_or_greater_than
62	;; The words are equal - return 1.
63	;; Note - we could branch to the return code at the end of the
64	;; function but a branch instruction takes 4 bytes, and the
65	;; return sequence itself is only 4 bytes long...
66	movw	ax, bc
67	movw	r8, ax
68	ret
69
70.Lconvert_to_signed:
71	;; The top words are different.  Unfortunately the comparison
72	;; is always unsigned, so to get a signed result we XOR the CY
73	;; flag with the top bits of AX and DE.
74	xor1	cy, a.7
75	mov	a, d
76	xor1	cy, a.7
77	;; Fall through.
78
79.Lless_than_or_greater_than:
80	;; We now have a signed less than/greater than result in CY.
81	;; Return 0 for less than, 2 for greater than.
82	;; Note - code from __ucmpsi2 branches into here.
83	incw	bc
84	sknc
85	clrw	bc
86
87	;; Get the result value, currently in BC, into r8
88	movw	ax, bc
89	movw	r8, ax
90	ret
91
92	.size	___cmpsi2, . - ___cmpsi2
93
94
95	;;   int __ucmpsi2 (unsigned long A, unsigned long B)
96	;;
97	;; Performs an unsigned comparison of A and B.
98	;; If A is less than B it returns 0.  If A is greater
99	;; than B it returns 2.  If they are equal it returns 1.
100
101	.global	___ucmpsi2
102        .type   ___ucmpsi2, @function
103___ucmpsi2:
104	;; A is at [sp+4]
105	;; B is at [sp+8]
106	;; Result put in R8..R9
107
108	;; Initialise default return value.
109	onew	bc
110
111	;;  Compare the high words.
112	movw	ax, [sp + 10]
113	movw	de, ax
114	movw	ax, [sp + 6]
115	cmpw	ax, de
116	skz
117	;; Note: These branches go into the __cmpsi2 code!
118	br	!!.Lless_than_or_greater_than
119	br	!!.Lcompare_bottom_words
120
121	.size	___ucmpsi2, . - ___ucmpsi2
122