;   Copyright (C) 2012-2023 Free Software Foundation, Inc.
;   Contributed by Red Hat.
; 
; This file is free software; you can redistribute it and/or modify it
; under the terms of the GNU General Public License as published by the
; Free Software Foundation; either version 3, or (at your option) any
; later version.
; 
; This file is distributed in the hope that it will be useful, but
; WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
; General Public License for more details.
; 
; Under Section 7 of GPL version 3, you are granted additional
; permissions described in the GCC Runtime Library Exception, version
; 3.1, as published by the Free Software Foundation.
;
; You should have received a copy of the GNU General Public License and
; a copy of the GCC Runtime Library Exception along with this program;
; see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
; <http://www.gnu.org/licenses/>.

#ifdef __MSP430X_LARGE__
#define ret_	RETA
#else
#define ret_	RET
#endif

	.text

	;;   int __cmpsi2 (signed long A, signed long B)
	;;
	;; Performs a signed comparison of A and B.
	;; If A is less than B it returns 0.  If A is greater
	;; than B it returns 2.  If they are equal it returns 1.

	;;  Note - this code is also used by the __ucmpsi2 routine below.

	.global	__cmpsi2
        .type   __cmpsi2, @function
__cmpsi2:
	;; A is in r12 (low), r13 (high)
	;; B is in r14 (low), r15 (high)
	;; Result put in r12

	cmp.w	r13, r15
	jeq	.L_compare_low
	jge	.L_less_than
.L_greater_than:
	mov.w	#2, r12
	ret_
.L_less_than:
	mov.w	#0, r12
	ret_

.L_compare_low:
	cmp.w	r12, r14
	jl	.L_greater_than
	jne     .L_less_than
	mov.w	#1, r12
	ret_

	.size	__cmpsi2, . - __cmpsi2


	;;   int __ucmpsi2 (unsigned long A, unsigned long B)
	;;
	;; Performs an unsigned comparison of A and B.
	;; If A is less than B it returns 0.  If A is greater
	;; than B it returns 2.  If they are equal it returns 1.

;;;  Note - this function branches into the __cmpsi2 code above.

	.global	__ucmpsi2
        .type   __ucmpsi2, @function
__ucmpsi2:
	;; A is in r12 (low), r13 (high)
	;; B is in r14 (low), r15 (high)
	;; Result put in r12

	tst	r13
	jn	.L_top_bit_set_in_A
	tst	r15
;;; If the top bit of B is set, but A's is clear we know that A < B.
	jn	.L_less_than
;;; Neither A nor B has their top bit set so we can use the __cmpsi2 routine.
;;; Note we use Jc rather than BR as that saves two bytes.  The TST insn always
;;; sets the C bit.
	jc	__cmpsi2

.L_top_bit_set_in_A:
	tst	r15
;;;  If both A and B have their top bit set we can use the __cmpsi2 routine.
	jn	__cmpsi2
;;; Otherwise A has its top bit set and B does not so A > B.
	jc	.L_greater_than

	.size	__ucmpsi2, . - __ucmpsi2
