1 ; Copyright (C) 2011-2022 Free Software Foundation, Inc.
2 ; Contributed by Red Hat.
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
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.
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.
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/>.
28 ;; int __cmpsi2 (signed long A, signed long B)
30 ;; Performs a signed comparison of A and B.
31 ;; If A is less than B it returns 0. If A is greater
32 ;; than B it returns 2. If they are equal it returns 1.
40 ;; Initialise default return value.
43 ;; Compare the high words.
49 br !!.Lconvert_to_signed
51 .Lcompare_bottom_words:
52 ;; The top words are equal - compare the bottom words.
53 ;; Note - code from __ucmpsi2 branches into here.
59 br !!.Lless_than_or_greater_than
60 ;; The words are equal - return 1.
61 ;; Note - we could branch to the return code at the end of the
62 ;; function but a branch instruction takes 4 bytes, and the
63 ;; return sequence itself is only 4 bytes long...
69 ;; The top words are different. Unfortunately the comparison
70 ;; is always unsigned, so to get a signed result we XOR the CY
71 ;; flag with the top bits of AX and DE.
77 .Lless_than_or_greater_than:
78 ;; We now have a signed less than/greater than result in CY.
79 ;; Return 0 for less than, 2 for greater than.
80 ;; Note - code from __ucmpsi2 branches into here.
85 ;; Get the result value, currently in BC, into r8
92 ;; ------------------------------------------------------
94 ;; int __ucmpsi2 (unsigned long A, unsigned long B)
96 ;; Performs an unsigned comparison of A and B.
97 ;; If A is less than B it returns 0. If A is greater
98 ;; than B it returns 2. If they are equal it returns 1.
100 START_FUNC ___ucmpsi2
104 ;; Result put in R8..R9
106 ;; Initialise default return value.
109 ;; Compare the high words.
115 ;; Note: These branches go into the __cmpsi2 code!
116 br !!.Lless_than_or_greater_than
117 br !!.Lcompare_bottom_words
121 ;; ------------------------------------------------------
123 ;; signed int __gcc_bcmp (const unsigned char *s1, const unsigned char *s2, size_t size)
124 ;; Result is negative if S1 is less than S2,
125 ;; positive if S1 is greater, 0 if S1 and S2 are equal.
127 START_FUNC __gcc_bcmp
136 ;; Compare R10 against the SIZE parameter
142 ;; Load S2[r10] into R8
149 ;; Load S1[r10] into A
158 ;; Compare loaded bytes
163 ;; They differ. Subtract *S2 from *S1 and return as the result.