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