Home | History | Annotate | Line # | Download | only in frv
lib1funcs.S revision 1.1.1.9
      1 /* Library functions.
      2    Copyright (C) 2000-2020 Free Software Foundation, Inc.
      3    Contributed by Red Hat, Inc.
      4 
      5    This file is part of GCC.
      6 
      7    GCC is free software ; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3, or (at your option)
     10    any later version.
     11 
     12    GCC is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY ; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    Under Section 7 of GPL version 3, you are granted additional
     18    permissions described in the GCC Runtime Library Exception, version
     19    3.1, as published by the Free Software Foundation.
     20 
     21    You should have received a copy of the GNU General Public License and
     22    a copy of the GCC Runtime Library Exception along with this program;
     23    see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     24    <http://www.gnu.org/licenses/>.  */
     25 
     26 #include <frv-asm.h>
     27 
     28 
     29 #ifdef L_cmpll
     31 /* icc0 = __cmpll (long long a, long long b)  */
     32 
     33 	.globl	EXT(__cmpll)
     34 	.type	EXT(__cmpll),@function
     35 	.text
     36 	.p2align 4
     37 EXT(__cmpll):
     38 	cmp	gr8, gr10, icc0
     39 	ckeq	icc0, cc4
     40 	P(ccmp)	gr9, gr11, cc4, 1
     41 	ret
     42 .Lend:
     43 	.size	EXT(__cmpll),.Lend-EXT(__cmpll)
     44 #endif /* L_cmpll */
     45 
     46 #ifdef L_cmpf
     48 /* icc0 = __cmpf (float a, float b) */
     49 /* Note, because this function returns the result in ICC0, it means it can't
     50    handle NaNs.  */
     51 
     52 	.globl	EXT(__cmpf)
     53 	.type	EXT(__cmpf),@function
     54 	.text
     55 	.p2align 4
     56 EXT(__cmpf):
     57 #ifdef __FRV_HARD_FLOAT__	/* floating point instructions available */
     58 	movgf	gr8, fr0
     59 	P(movgf) gr9, fr1
     60 	setlos	#1, gr8
     61 	fcmps	fr0, fr1, fcc0
     62 	P(fcklt) fcc0, cc0
     63 	fckeq	fcc0, cc1
     64 	csub	gr0, gr8, gr8, cc0, 1
     65 	cmov	gr0, gr8, cc1, 1
     66 	cmpi	gr8, 0, icc0
     67 	ret
     68 #else				/* no floating point instructions available */
     69 	movsg	lr, gr4
     70 	addi	sp, #-16, sp
     71 	sti	gr4, @(sp, 8)
     72 	st	fp, @(sp, gr0)
     73 	mov	sp, fp
     74 	call	EXT(__cmpsf2)
     75 	cmpi	gr8, #0, icc0
     76 	ldi	@(sp, 8), gr4
     77 	movgs	gr4, lr
     78 	ld	@(sp,gr0), fp
     79 	addi	sp, #16, sp
     80 	ret
     81 #endif
     82 .Lend:
     83 	.size	EXT(__cmpf),.Lend-EXT(__cmpf)
     84 #endif
     85 
     86 #ifdef L_cmpd
     88 /* icc0 = __cmpd (double a, double b) */
     89 /* Note, because this function returns the result in ICC0, it means it can't
     90    handle NaNs.  */
     91 
     92 	.globl	EXT(__cmpd)
     93 	.type	EXT(__cmpd),@function
     94 	.text
     95 	.p2align 4
     96 EXT(__cmpd):
     97 	movsg	lr, gr4
     98 	addi	sp, #-16, sp
     99 	sti	gr4, @(sp, 8)
    100 	st	fp, @(sp, gr0)
    101 	mov	sp, fp
    102 	call	EXT(__cmpdf2)
    103 	cmpi	gr8, #0, icc0
    104 	ldi	@(sp, 8), gr4
    105 	movgs	gr4, lr
    106 	ld	@(sp,gr0), fp
    107 	addi	sp, #16, sp
    108 	ret
    109 .Lend:
    110 	.size	EXT(__cmpd),.Lend-EXT(__cmpd)
    111 #endif
    112 
    113 #ifdef L_addll
    115 /* gr8,gr9 = __addll (long long a, long long b) */
    116 /* Note, gcc will never call this function, but it is present in case an
    117    ABI program calls it.  */
    118 
    119 	.globl	EXT(__addll)
    120 	.type	EXT(__addll),@function
    121 	.text
    122 	.p2align
    123 EXT(__addll):
    124 	addcc	gr9, gr11, gr9, icc0
    125 	addx	gr8, gr10, gr8, icc0
    126 	ret
    127 .Lend:
    128 	.size	EXT(__addll),.Lend-EXT(__addll)
    129 #endif
    130 
    131 #ifdef L_subll
    133 /* gr8,gr9 = __subll (long long a, long long b) */
    134 /* Note, gcc will never call this function, but it is present in case an
    135    ABI program calls it.  */
    136 
    137 	.globl	EXT(__subll)
    138 	.type	EXT(__subll),@function
    139 	.text
    140 	.p2align 4
    141 EXT(__subll):
    142 	subcc	gr9, gr11, gr9, icc0
    143 	subx	gr8, gr10, gr8, icc0
    144 	ret
    145 .Lend:
    146 	.size	EXT(__subll),.Lend-EXT(__subll)
    147 #endif
    148 
    149 #ifdef L_andll
    151 /* gr8,gr9 = __andll (long long a, long long b) */
    152 /* Note, gcc will never call this function, but it is present in case an
    153    ABI program calls it.  */
    154 
    155 	.globl	EXT(__andll)
    156 	.type	EXT(__andll),@function
    157 	.text
    158 	.p2align 4
    159 EXT(__andll):
    160 	P(and)	gr9, gr11, gr9
    161 	P2(and)	gr8, gr10, gr8
    162 	ret
    163 .Lend:
    164 	.size	EXT(__andll),.Lend-EXT(__andll)
    165 #endif
    166 
    167 #ifdef L_orll
    169 /* gr8,gr9 = __orll (long long a, long long b) */
    170 /* Note, gcc will never call this function, but it is present in case an
    171    ABI program calls it.  */
    172 
    173 	.globl	EXT(__orll)
    174 	.type	EXT(__orll),@function
    175 	.text
    176 	.p2align 4
    177 EXT(__orll):
    178 	P(or)	gr9, gr11, gr9
    179 	P2(or)	gr8, gr10, gr8
    180 	ret
    181 .Lend:
    182 	.size	EXT(__orll),.Lend-EXT(__orll)
    183 #endif
    184 
    185 #ifdef L_xorll
    187 /* gr8,gr9 = __xorll (long long a, long long b) */
    188 /* Note, gcc will never call this function, but it is present in case an
    189    ABI program calls it.  */
    190 
    191 	.globl	EXT(__xorll)
    192 	.type	EXT(__xorll),@function
    193 	.text
    194 	.p2align 4
    195 EXT(__xorll):
    196 	P(xor)	gr9, gr11, gr9
    197 	P2(xor)	gr8, gr10, gr8
    198 	ret
    199 .Lend:
    200 	.size	EXT(__xorll),.Lend-EXT(__xorll)
    201 #endif
    202 
    203 #ifdef L_notll
    205 /* gr8,gr9 = __notll (long long a) */
    206 /* Note, gcc will never call this function, but it is present in case an
    207    ABI program calls it.  */
    208 
    209 	.globl	EXT(__notll)
    210 	.type	EXT(__notll),@function
    211 	.text
    212 	.p2align 4
    213 EXT(__notll):
    214 	P(not)	gr9, gr9
    215 	P2(not)	gr8, gr8
    216 	ret
    217 .Lend:
    218 	.size	EXT(__notll),.Lend-EXT(__notll)
    219 #endif
    220 
    221 #ifdef L_cmov
    223 /* (void) __cmov (char *dest, const char *src, size_t len) */
    224 /*
    225  * void __cmov (char *dest, const char *src, size_t len)
    226  * {
    227  *   size_t i;
    228  *
    229  *   if (dest < src || dest > src+len)
    230  *     {
    231  *	 for (i = 0; i < len; i++)
    232  *	 dest[i] = src[i];
    233  *     }
    234  *   else
    235  *     {
    236  *	 while (len-- > 0)
    237  *	 dest[len] = src[len];
    238  *     }
    239  * }
    240  */
    241 
    242 	.globl	EXT(__cmov)
    243 	.type	EXT(__cmov),@function
    244 	.text
    245 	.p2align 4
    246 EXT(__cmov):
    247 	P(cmp)	gr8, gr9, icc0
    248 	add	gr9, gr10, gr4
    249 	P(cmp)	gr8, gr4, icc1
    250 	bc	icc0, 0, .Lfwd
    251 	bls	icc1, 0, .Lback
    252 .Lfwd:
    253 	/* move bytes in a forward direction */
    254 	P(setlos) #0, gr5
    255 	cmp	gr0, gr10, icc0
    256 	P(subi)	gr9, #1, gr9
    257 	P2(subi) gr8, #1, gr8
    258 	bnc	icc0, 0, .Lret
    259 .Lfloop:
    260 	/* forward byte move loop */
    261 	addi	gr5, #1, gr5
    262 	P(ldsb)	@(gr9, gr5), gr4
    263 	cmp	gr5, gr10, icc0
    264 	P(stb)	gr4, @(gr8, gr5)
    265 	bc	icc0, 0, .Lfloop
    266 	ret
    267 .Lbloop:
    268 	/* backward byte move loop body */
    269 	ldsb	@(gr9,gr10),gr4
    270 	stb	gr4,@(gr8,gr10)
    271 .Lback:
    272 	P(cmpi)	gr10, #0, icc0
    273 	addi	gr10, #-1, gr10
    274 	bne	icc0, 0, .Lbloop
    275 .Lret:
    276 	ret
    277 .Lend:
    278 	.size	 EXT(__cmov),.Lend-EXT(__cmov)
    279 #endif
    280