OSDN Git Service

.
[pf3gnuchains/gcc-fork.git] / libgcc / config / rl78 / cmpsi2.S
1 ;   Copyright (C) 2011 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
25 r8      =       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