OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [libgcc/] [config/] [rl78/] [cmpsi2.S] - Blame information for rev 801

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 734 jeremybenn
;   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
; .
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
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.