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

Subversion Repositories scarts

[/] [scarts/] [trunk/] [toolchain/] [scarts-gcc/] [gcc-4.1.1/] [gcc/] [config/] [scarts32/] [libgcc.S] - Blame information for rev 12

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 12 jlechner
/* Copyright (C) 1998, 1999, 2000, 2005 Free Software Foundation, Inc.
2
   Contributed by Wolfgang Puffitsch 
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 2, or (at your option) any
7
later version.
8
 
9
In addition to the permissions in the GNU General Public License, the
10
Free Software Foundation gives you unlimited permission to link the
11
compiled version of this file into combinations with other programs,
12
and to distribute those combinations without any restriction coming
13
from the use of this file.  (The General Public License restrictions
14
do apply in other respects; for example, they cover modification of
15
the file, and distribution when not linked into a combine
16
executable.)
17
 
18
This file is distributed in the hope that it will be useful, but
19
WITHOUT ANY WARRANTY; without even the implied warranty of
20
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21
General Public License for more details.
22
 
23
You should have received a copy of the GNU General Public License
24
along with this program; see the file COPYING.  If not, write to
25
the Free Software Foundation, 59 Temple Place - Suite 330,
26
Boston, MA 02111-1307, USA.  */
27
 
28
        .file   "libgcc.S"
29
 
30
/* Most of the functions here are called directly from scarts.md
31
   patterns, instead of using the standard libcall mechanisms.
32
   This can make better code because GCC knows exactly which
33
   of the call-used registers (not all of them) are clobbered.  */
34
 
35
/*******************************************************
36
                Multiplication  32 x 32
37
*******************************************************/
38
#ifdef L_mulsi3
39
 
40
        .section        .text
41
        .global __mulsi3
42
        .type   __mulsi3, @function
43
__mulsi3:
44
        ldli r0, 0              ; clear result
45
__mulsi3_loop:
46
        btest r2, 0
47
        add_ct r0, r1
48
        sli r1, 1
49
        sri r2, 1
50
        cmpi_eq r2, 0
51
        jmpi_cf __mulsi3_loop
52
        rts
53
        .size   __mulsi3, .-__mulsi3
54
 
55
#endif
56
 
57
/*******************************************************
58
                Multiplication  64 x 64
59
*******************************************************/
60
#ifdef L_muldi3
61
 
62
        .section        .text
63
        .global __muldi3
64
        .type   __muldi3, @function
65
__muldi3:
66
        ldfpz r4,0
67
        ldfpz r5,1
68
 
69
        mov r0,r1
70
 
71
        ldli r6, 0
72
        ldli r7, 0
73
 
74
__muldi3_loop:
75
        btest r2, 0
76
        add_ct r6, r4
77
        addc_ct r7, r5
78
 
79
        sli r4, 1
80
        addc r5, r5
81
        sri r3, 1
82
        rrc r2
83
 
84
        cmpi_eq r2, 0
85
        jmpi_cf __muldi3_loop
86
        cmpi_eq r3, 0
87
        jmpi_cf __muldi3_loop
88
 
89
        mov r13,r0
90
        stw r6,r13
91
        addi r13,4
92
        stw r7,r13
93
 
94
        rts
95
        .size   __muldi3, .-__muldi3
96
 
97
#endif
98
 
99
/*******************************************************
100
                Division 32 x 32
101
*******************************************************/
102
#ifdef L_divsi3
103
 
104
        .section        .text
105
        .global __divsi3
106
        .type   __divsi3, @function
107
__divsi3:
108
        cmpi_eq r2, 0           ; avoid division by zero
109
        jmpi_ct __divsi3_end
110
 
111
        cmpi_eq r1, 0           ; we need not divide zero
112
        mov_ct r0, r1
113
        jmpi_ct __divsi3_end
114
 
115
__divsi3_cmpsign:
116
        mov r3, r1              ; compute the sign of the result
117
        eor r3, r2
118
 
119
        cmpi_lt r1, 0           ; make positive
120
        neg_ct r1
121
 
122
        cmpi_lt r2, 0           ; make positive
123
        neg_ct r2
124
 
125
__divsi3_copy:
126
        mov r13, r2             ; make a copy of the divisor
127
 
128
__divsi3_scale:
129
        btest r2, 31            ; scale divisor up
130
        sli_cf r2, 1
131
        jmpi_cf __divsi3_scale
132
 
133
        ldli r0, 0              ; clear result
134
 
135
__divsi3_loop:
136
        cmpu_lt r2, r13         ; check if the divisor is reached
137
        jmpi_ct __divsi3_resign
138
 
139
        sli r0, 1
140
 
141
        cmpu_gt r2, r1          ; need to scale back?
142
        sub_cf r1, r2
143
        addi_cf r0, 1
144
        sri r2, 1
145
 
146
        jmpi __divsi3_loop
147
 
148
__divsi3_resign:                ; add sign again
149
        cmpi_lt r3, 0
150
        neg_ct r0
151
 
152
__divsi3_end:
153
        rts
154
        .size   __divsi3, .-__divsi3
155
 
156
#endif
157
 
158
/*******************************************************
159
                Division 64 x 64
160
*******************************************************/
161
#ifdef L_divdi3
162
 
163
        .section        .text
164
        .global __divdi3
165
        .type   __divdi3, @function
166
__divdi3:
167
        stfpz_dec r1,-1
168
        ldfpz r4,1
169
        ldfpz r5,2
170
 
171
        cmpi_eq r4, 0           ; avoid division by zero
172
        jmpi_cf __divdi3_start
173
        cmpi_eq r5, 0
174
        jmpi_ct __divdi3_end
175
 
176
__divdi3_start:
177
        cmpi_eq r2, 0           ; we need not divide zero
178
        jmpi_cf __divdi3_cmpsign
179
        cmpi_eq r3, 0
180
        mov_ct r0, r2
181
        mov_ct r1, r3
182
        jmpi_ct __divdi3_end
183
 
184
__divdi3_cmpsign:
185
        mov r8, r3
186
        eor r8, r5
187
 
188
        ldli r13, 0             ; we use that for incrementing
189
 
190
        cmpi_lt r3, 0           ; make positive
191
        not_ct r2
192
        not_ct r3
193
        addi_ct r2, 1
194
        addc_ct r3, r13
195
 
196
        cmpi_lt r5, 0           ; make positive
197
        not_ct r4
198
        not_ct r5
199
        addi_ct r4, 1
200
        addc_ct r5, r13
201
 
202
__divdi3_copy:
203
        mov r6, r4              ; make a copy of the divisor
204
        mov r7, r5
205
 
206
__divdi3_scale:
207
        btest r5, 31            ; scale divisor up
208
        sli_cf r4, 1
209
        addc_cf r5, r5
210
        jmpi_cf __divdi3_scale
211
 
212
        ldli r0, 0              ; clear result
213
        ldli r1, 0
214
 
215
__divdi3_loop:
216
        cmpu_lt r5, r7          ; check if the divisor is reached
217
        jmpi_ct __divdi3_resign
218
        cmpu_gt r5, r7
219
        jmpi_ct __divdi3_noteq
220
        cmpu_lt r4, r6
221
        jmpi_ct __divdi3_resign
222
 
223
__divdi3_noteq:
224
        sli r0, 1
225
        addc r1, r1
226
 
227
        cmpu_gt r5, r3          ; need to scale back?
228
        jmpi_ct __divdi3_nosub
229
        cmpu_lt r5, r3
230
        jmpi_ct __divdi3_sub
231
        cmpu_gt r4, r2
232
        jmpi_ct __divdi3_nosub
233
__divdi3_sub:
234
        sub r2, r4
235
        subc r3, r5
236
        addi r0, 1
237
        addc r1, r13
238
__divdi3_nosub:
239
        sri r5, 1
240
        rrc r4
241
 
242
        jmpi __divdi3_loop
243
 
244
__divdi3_resign:
245
        cmpi_lt r8, 0           ; add sign again
246
        not_ct r0
247
        not_ct r1
248
        addi_ct r0, 1
249
        addc_ct r1, r13
250
 
251
__divdi3_end:
252
        ldfpz r13, 0
253
 
254
        stw r0, r13
255
        addi r13, 4
256
        stw r1, r13
257
 
258
        ldfpz_inc r0, 0
259
 
260
        rts
261
        .size   __divdi3, .-__divdi3
262
 
263
#endif
264
 
265
/*******************************************************
266
                Unsigned Division 32 x 32
267
*******************************************************/
268
#ifdef L_udivsi3
269
 
270
        .section        .text
271
        .global __udivsi3
272
        .type   __udivsi3, @function
273
__udivsi3:
274
        cmpi_eq r2, 0           ; avoid division by zero
275
        jmpi_ct __udivsi3_end
276
 
277
        cmpi_eq r1, 0           ; we need not divide zero
278
        mov_ct r0, r1
279
        jmpi_ct __udivsi3_end
280
 
281
__udivsi3_copy:
282
        mov r13, r2             ; make a copy of the divisor
283
 
284
__udivsi3_scale:
285
        btest r2, 31            ; scale divisor up
286
        sli_cf r2, 1
287
        jmpi_cf __udivsi3_scale
288
 
289
        ldli r0, 0              ; clear result
290
 
291
__udivsi3_loop:
292
        cmpu_lt r2, r13         ; check if the divisor is reached
293
        jmpi_ct __udivsi3_end
294
 
295
        sli r0, 1
296
 
297
        cmpu_gt r2, r1          ; need to scale back?
298
        sub_cf r1, r2
299
        addi_cf r0, 1
300
        sri r2, 1
301
 
302
        jmpi __udivsi3_loop
303
 
304
__udivsi3_end:
305
        rts
306
        .size   __udivsi3, .-__udivsi3
307
 
308
#endif
309
 
310
/*******************************************************
311
                Unsigned Division 64 x 64
312
*******************************************************/
313
#ifdef L_udivdi3
314
 
315
        .section        .text
316
        .global __udivdi3
317
        .type   __udivdi3, @function
318
__udivdi3:
319
        stfpz_dec r1,-1
320
        ldfpz r4,1
321
        ldfpz r5,2
322
 
323
        cmpi_eq r4, 0           ; avoid division by zero
324
        jmpi_cf __udivdi3_start
325
        cmpi_eq r5, 0
326
        jmpi_ct __udivdi3_end
327
 
328
__udivdi3_start:
329
        cmpi_eq r2, 0           ; we need not divide zero
330
        jmpi_cf __udivdi3_copy
331
        cmpi_eq r3, 0
332
        mov_ct r0, r2
333
        mov_ct r1, r3
334
        jmpi_ct __udivdi3_end
335
 
336
__udivdi3_copy:
337
        mov r6, r4              ; make a copy of the divisor
338
        mov r7, r5
339
 
340
__udivdi3_scale:
341
        btest r5, 31            ; scale divisor up
342
        sli_cf r4, 1
343
        addc_cf r5, r5
344
        jmpi_cf __udivdi3_scale
345
 
346
        ldli r0, 0              ; clear result
347
        ldli r1, 0
348
 
349
        ldli r13, 0             ; we use that for incrementing
350
 
351
__udivdi3_loop:
352
        cmpu_lt r5, r7          ; check if the divisor is reached
353
        jmpi_ct __udivdi3_end
354
        cmpu_gt r5, r7
355
        jmpi_ct __udivdi3_noteq
356
        cmpu_lt r4, r6
357
        jmpi_ct __udivdi3_end
358
 
359
__udivdi3_noteq:
360
        sli r0, 1
361
        addc r1, r1
362
 
363
        cmpu_gt r5, r3          ; need to scale back?
364
        jmpi_ct __udivdi3_nosub
365
        cmpu_lt r5, r3
366
        jmpi_ct __udivdi3_sub
367
        cmpu_gt r4, r2
368
        jmpi_ct __udivdi3_nosub
369
__udivdi3_sub:
370
        sub r2, r4
371
        subc r3, r5
372
        addi r0, 1
373
        addc r1, r13
374
__udivdi3_nosub:
375
        sri r5, 1
376
        rrc r4
377
 
378
        jmpi __udivdi3_loop
379
 
380
__udivdi3_end:
381
        ldfpz r13, 0
382
 
383
        stw r0, r13
384
        addi r13, 4
385
        stw r1, r13
386
 
387
        ldfpz_inc r0, 0
388
 
389
        rts
390
        .size   __udivdi3, .-__udivdi3
391
 
392
#endif
393
 
394
/*******************************************************
395
                Modulo 32 x 32
396
*******************************************************/
397
#ifdef L_modsi3
398
 
399
        .section        .text
400
        .global __modsi3
401
        .type   __modsi3, @function
402
__modsi3:
403
        cmpi_eq r2, 0           ; avoid division by zero
404
        jmpi_ct __modsi3_end
405
 
406
        cmpi_eq r1, 0           ; we need not divide zero
407
        mov_ct r0, r1
408
        jmpi_ct __modsi3_end
409
 
410
__modsi3_cmpsign:
411
        mov r3, r1              ; compute the sign of the result
412
 
413
        cmpi_lt r1, 0           ; make positive
414
        neg_ct r1
415
 
416
        cmpi_lt r2, 0           ; make positive
417
        neg_ct r2
418
 
419
__modsi3_copy:
420
        mov r13, r2             ; make a copy of the divisor
421
 
422
__modsi3_scale:
423
        btest r2, 31            ; scale divisor up
424
        sli_cf r2, 1
425
        jmpi_cf __modsi3_scale
426
 
427
__modsi3_loop:
428
        cmpu_lt r2, r13         ; check if the divisor is reached
429
        jmpi_ct __modsi3_resign
430
 
431
        cmpu_gt r2, r1          ; need to scale back?
432
        sub_cf r1, r2
433
        sri r2, 1
434
 
435
        jmpi __modsi3_loop
436
 
437
__modsi3_resign:                ; add sign again
438
        mov r0, r1
439
        cmpi_lt r3, 0
440
        neg_ct r0
441
 
442
__modsi3_end:
443
        rts
444
        .size   __modsi3, .-__modsi3
445
 
446
#endif
447
 
448
/*******************************************************
449
                Modulo 64 x 64
450
*******************************************************/
451
#ifdef L_moddi3
452
 
453
        .section        .text
454
        .global __moddi3
455
        .type   __moddi3, @function
456
__moddi3:
457
        ldfpz r4,0
458
        ldfpz r5,1
459
 
460
        cmpi_eq r4, 0           ; avoid division by zero
461
        jmpi_cf __moddi3_start
462
        cmpi_eq r5, 0
463
        jmpi_ct __moddi3_end
464
 
465
__moddi3_start:
466
        cmpi_eq r2, 0           ; we need not divide zero
467
        jmpi_cf __moddi3_cmpsign
468
        cmpi_eq r3, 0
469
        jmpi_ct __moddi3_end
470
 
471
__moddi3_cmpsign:
472
        mov r0, r3              ; compute the sign of result
473
 
474
        ldli r13, 0             ; we use that for incrementing
475
 
476
        cmpi_lt r3, 0           ; make positive
477
        not_ct r2
478
        not_ct r3
479
        addi_ct r2, 1
480
        addc_ct r3, r13
481
 
482
        cmpi_lt r5, 0           ; make positive
483
        not_ct r4
484
        not_ct r5
485
        addi_ct r4, 1
486
        addc_ct r5, r13
487
 
488
__moddi3_copy:
489
        mov r6, r4              ; make a copy of the divisor
490
        mov r7, r5
491
 
492
__moddi3_scale:
493
        btest r5, 31            ; scale divisor up
494
        sli_cf r4, 1
495
        addc_cf r5, r5
496
        jmpi_cf __moddi3_scale
497
 
498
__moddi3_loop:
499
        cmpu_lt r5, r7          ; check if the divisor is reached
500
        jmpi_ct __moddi3_resign
501
        cmpu_gt r5, r7
502
        jmpi_ct __moddi3_noteq
503
        cmpu_lt r4, r6
504
        jmpi_ct __moddi3_resign
505
 
506
__moddi3_noteq:
507
        cmpu_gt r5, r3          ; need to scale back?
508
        jmpi_ct __moddi3_nosub
509
        cmpu_lt r5, r3
510
        jmpi_ct __moddi3_sub
511
        cmpu_gt r4, r2
512
        jmpi_ct __moddi3_nosub
513
__moddi3_sub:
514
        sub r2, r4
515
        subc r3, r5
516
__moddi3_nosub:
517
        sri r5, 1
518
        rrc r4
519
 
520
        jmpi __moddi3_loop
521
 
522
__moddi3_resign:
523
        cmpi_lt r0, 0           ; add sign again
524
        not_ct r2
525
        not_ct r3
526
        addi_ct r2, 1
527
        addc_ct r3, r13
528
 
529
__moddi3_end:
530
        mov r13, r1
531
 
532
        stw r2, r13
533
        addi r13, 4
534
        stw r3, r13
535
 
536
        mov r0, r1
537
 
538
        rts
539
        .size   __moddi3, .-__moddi3
540
 
541
#endif
542
 
543
/*******************************************************
544
                Unsigned Modulo 32 x 32
545
*******************************************************/
546
#ifdef L_umodsi3
547
 
548
        .section        .text
549
        .global __umodsi3
550
        .type   __umodsi3, @function
551
__umodsi3:
552
        cmpi_eq r2, 0           ; avoid division by zero
553
        jmpi_ct __umodsi3_end
554
 
555
        cmpi_eq r1, 0           ; we need not divide zero
556
        mov_ct r0, r1
557
        jmpi_ct __umodsi3_end
558
 
559
__umodsi3_copy:
560
        mov r13, r2             ; make a copy of the divisor
561
 
562
__umodsi3_scale:
563
        btest r2, 31            ; scale divisor up
564
        sli_cf r2, 1
565
        jmpi_cf __umodsi3_scale
566
 
567
__umodsi3_loop:
568
        cmpu_lt r2, r13         ; check if the divisor is reached
569
        jmpi_ct __umodsi3_end
570
 
571
        cmpu_gt r2, r1          ; need to scale back?
572
        sub_cf r1, r2
573
        sri r2, 1
574
 
575
        jmpi __umodsi3_loop
576
 
577
__umodsi3_end:
578
        mov r0, r1
579
        rts
580
        .size   __umodsi3, .-__umodsi3
581
 
582
#endif
583
 
584
/*******************************************************
585
                Unsigned Modulo 64 x 64
586
*******************************************************/
587
#ifdef L_umoddi3
588
 
589
        .section        .text
590
        .global __umoddi3
591
        .type   __umoddi3, @function
592
__umoddi3:
593
        ldfpz r4,0
594
        ldfpz r5,1
595
 
596
        cmpi_eq r4, 0           ; avoid division by zero
597
        jmpi_cf __umoddi3_start
598
        cmpi_eq r5, 0
599
        jmpi_ct __umoddi3_end
600
 
601
__umoddi3_start:
602
        cmpi_eq r2, 0           ; we need not divide zero
603
        jmpi_cf __umoddi3_copy
604
        cmpi_eq r3, 0
605
        mov_ct r4, r2
606
        mov_ct r5, r3
607
        jmpi_ct __umoddi3_end
608
 
609
__umoddi3_copy:
610
        mov r6, r4              ; make a copy of the divisor
611
        mov r7, r5
612
 
613
__umoddi3_scale:
614
        btest r5, 31            ; scale divisor up
615
        sli_cf r4, 1
616
        addc_cf r5, r5
617
        jmpi_cf __umoddi3_scale
618
 
619
__umoddi3_loop:
620
        cmpu_lt r5, r7          ; check if the divisor is reached
621
        jmpi_ct __umoddi3_end
622
        cmpu_gt r5, r7
623
        jmpi_ct __umoddi3_noteq
624
        cmpu_lt r4, r6
625
        jmpi_ct __umoddi3_end
626
 
627
__umoddi3_noteq:
628
        cmpu_gt r5, r3          ; need to scale back?
629
        jmpi_ct __umoddi3_nosub
630
        cmpu_lt r5, r3
631
        jmpi_ct __umoddi3_sub
632
        cmpu_gt r4, r2
633
        jmpi_ct __umoddi3_nosub
634
__umoddi3_sub:
635
        sub r2, r4
636
        subc r3, r5
637
__umoddi3_nosub:
638
        sri r5, 1
639
        rrc r4
640
 
641
        jmpi __umoddi3_loop
642
 
643
__umoddi3_end:
644
        mov r13, r1
645
 
646
        stw r2, r13
647
        addi r13, 4
648
        stw r3, r13
649
 
650
        mov r0, r1
651
 
652
        rts
653
        .size   __umoddi3, .-__umoddi3
654
 
655
#endif
656
 
657
/*******************************************************
658
                Shift right logic 64
659
*******************************************************/
660
#ifdef L_lshrdi3
661
 
662
        .section        .text
663
        .global __lshrdi3
664
        .type   __lshrdi3, @function
665
__lshrdi3:
666
        mov r0,r1
667
 
668
__lshrdi3_loop:
669
        cmpi_gt r4, 0
670
        sri_ct r3, 1
671
        rrc_ct r2
672
        addi_ct r4, -1
673
        jmpi_ct __lshrdi3_loop
674
 
675
        mov r13,r0
676
        stw r2, r13
677
        addi r13, 4
678
        stw r3, r13
679
 
680
        rts
681
        .size   __lshrdi3, .-__lshrdi3
682
 
683
#endif
684
 
685
/*******************************************************
686
                Shift right arithmetic 64
687
*******************************************************/
688
#ifdef L_ashrdi3
689
 
690
        .section        .text
691
        .global __ashrdi3
692
        .type   __ashrdi3, @function
693
__ashrdi3:
694
        mov r0,r1
695
 
696
__ashrdi3_loop:
697
        cmpi_gt r4, 0
698
        srai_ct r3, 1
699
        rrc_ct r2
700
        addi_ct r4, -1
701
        jmpi_ct __ashrdi3_loop
702
 
703
        mov r13,r0
704
        stw r2, r13
705
        addi r13, 4
706
        stw r3, r13
707
 
708
        rts
709
        .size   __ashrdi3, .-__ashrdi3
710
 
711
#endif
712
 
713
/*******************************************************
714
                Shift left 64
715
*******************************************************/
716
#ifdef L_ashldi3
717
 
718
        .section        .text
719
        .global __ashldi3
720
        .type   __ashldi3, @function
721
__ashldi3:
722
        mov r0,r1
723
 
724
__ashldi3_loop:
725
        cmpi_gt r4, 0
726
        sli_ct r2, 1
727
        addc_ct r3, r3
728
        addi_ct r4, -1
729
        jmpi_ct __ashldi3_loop
730
 
731
        mov r13,r0
732
        stw r2, r13
733
        addi r13, 4
734
        stw r3, r13
735
 
736
        rts
737
        .size   __ashldi3, .-__ashldi3
738
 
739
#endif
740
 
741
/*******************************************************
742
                Find first set bit 32
743
*******************************************************/
744
#ifdef L_ffssi2
745
 
746
        .section        .text
747
        .global __ffssi2
748
        .type   __ffssi2, @function
749
__ffssi2:
750
        cmpi_eq r1, 0           ; return zero if no bit is set
751
        mov_ct r0, r1
752
        jmpi_ct __ffssi2_end
753
 
754
        ldli r0, 1
755
__ffssi2_loop:
756
        btest r1, 0             ; test bit
757
        sri_cf r1, 1
758
        addi_cf r0, 1           ; update loop counter
759
        jmpi_cf __ffssi2_loop
760
 
761
__ffssi2_end:
762
        rts
763
        .size   __ffssi2, .-__ffssi2
764
 
765
#endif
766
 
767
/*******************************************************
768
                Find first set bit 64
769
*******************************************************/
770
#ifdef L_ffsdi2
771
 
772
        .section        .text
773
        .global __ffsdi2
774
        .type   __ffsdi2, @function
775
__ffsdi2:
776
        cmpi_eq r1, 0           ; return zero if no bit is set
777
        jmpi_cf __ffsdi2_start
778
        cmpi_eq r2, 0
779
        mov_ct r0, r1
780
        jmpi_ct __ffsdi2_end
781
 
782
__ffsdi2_start:
783
        ldli r0, 1
784
__ffsdi2_loop:
785
        btest r1, 0             ; test bit
786
        sri_cf r2, 1
787
        rrc_cf r1
788
        addi_cf r0, 1           ; update loop counter
789
        jmpi_cf __ffsdi2_loop
790
 
791
__ffsdi2_end:
792
        rts
793
        .size   __ffsdi2, .-__ffsdi2
794
 
795
#endif
796
 
797
/*******************************************************
798
                Count trailing zero bits 32
799
*******************************************************/
800
#ifdef L_ctzsi2
801
 
802
        .section        .text
803
        .global __ctzsi2
804
        .type   __ctzsi2, @function
805
__ctzsi2:
806
        ldli r0, 32             ; return 32 if no bit is set
807
        cmpi_eq r1, 0
808
        jmpi_ct __ctzsi2_end
809
 
810
        ldli r0, 0
811
__ctzsi2_loop:
812
        btest r1, 0             ; test bit
813
        sri_cf r1, 1
814
        addi_cf r0, 1           ; update loop counter
815
        jmpi_cf __ctzsi2_loop
816
 
817
__ctzsi2_end:
818
        rts
819
        .size   __ctzsi2, .-__ctzsi2
820
 
821
#endif
822
 
823
/*******************************************************
824
                Count trailing zero bits 64
825
*******************************************************/
826
#ifdef L_ctzdi2
827
 
828
        .section        .text
829
        .global __ctzdi2
830
        .type   __ctzdi2, @function
831
__ctzdi2:
832
        ldli r0, 64             ; return 64 if no bit is set
833
        cmpi_eq r1, 0
834
        jmpi_cf __ctzdi2_start
835
        cmpi_eq r2, 0
836
        jmpi_ct __ctzdi2_end
837
 
838
__ctzdi2_start:
839
        ldli r0, 0
840
__ctzdi2_loop:
841
        btest r1, 0             ; test bit
842
        sri_cf r2, 1
843
        rrc_cf r1
844
        addi_cf r0, 1           ; update loop counter
845
        jmpi_cf __ctzdi2_loop
846
 
847
__ctzdi2_end:
848
        rts
849
        .size   __ctzdi2, .-__ctzdi2
850
 
851
#endif
852
 
853
/*******************************************************
854
                Count leading zero bits 32
855
*******************************************************/
856
#ifdef L_clzsi2
857
 
858
        .section        .text
859
        .global __clzsi2
860
        .type   __clzsi2, @function
861
__clzsi2:
862
        ldli r0, 32             ; return 32 if no bit is set
863
        cmpi_eq r1, 0
864
        jmpi_ct __clzsi2_end
865
 
866
        ldli r0, 0
867
__clzsi2_loop:
868
        btest r1, 31            ; test bit
869
        sli_cf r1, 1
870
        addi_cf r0, 1           ; update loop counter
871
        jmpi_cf __clzsi2_loop
872
 
873
__clzsi2_end:
874
        rts
875
        .size   __clzsi2, .-__clzsi2
876
 
877
#endif
878
 
879
/*******************************************************
880
                Count leading zero bits 64
881
*******************************************************/
882
#ifdef L_clzdi2
883
 
884
        .section        .text
885
        .global __clzdi2
886
        .type   __clzdi2, @function
887
__clzdi2:
888
        ldli r0, 64             ; return 64 if no bit is set
889
        cmpi_eq r1, 0
890
        jmpi_cf __clzdi2_start
891
        cmpi_eq r2, 0
892
        jmpi_ct __clzdi2_end
893
 
894
__clzdi2_start:
895
        ldli r0, 0
896
__clzdi2_loop:
897
        btest r2, 31            ; test bit
898
        sli_cf r1, 1
899
        addc_cf r2, r2
900
        addi_cf r0, 1           ; update loop counter
901
        jmpi_cf __clzdi2_loop
902
 
903
__clzdi2_end:
904
        rts
905
        .size   __clzdi2, .-__clzdi2
906
 
907
#endif
908
 
909
/*******************************************************
910
                Count set bits 32
911
*******************************************************/
912
#ifdef L_popcountsi2
913
 
914
        .section        .text
915
        .global __popcountsi2
916
        .type   __popcountsi2, @function
917
__popcountsi2:
918
        ldli r0, 0              ; return 0 if no bit is set
919
 
920
__popcountsi2_loop:
921
        btest r1, 0             ; test bit
922
        addi_ct r0, 1           ; update loop counter
923
        sri r1, 1
924
        cmpi_eq r1, 0
925
        jmpi_cf __popcountsi2_loop
926
 
927
__popcountsi2_end:
928
        rts
929
        .size   __popcountsi2, .-__popcountsi2
930
 
931
#endif
932
 
933
/*******************************************************
934
                Count set bits 64
935
*******************************************************/
936
#ifdef L_popcountdi2
937
 
938
        .section        .text
939
        .global __popcountdi2
940
        .type   __popcountdi2, @function
941
__popcountdi2:
942
        ldli r0, 0              ; return 0 if no bit is set
943
 
944
__popcountdi2_loop:
945
        btest r1, 0             ; test bit
946
        addi_ct r0, 1           ; update loop counter
947
        sri r2, 1
948
        rrc r1
949
        cmpi_eq r1, 0
950
        jmpi_cf __popcountdi2_loop
951
        cmpi_eq r2, 0
952
        jmpi_cf __popcountdi2_loop
953
 
954
__popcountdi2_end:
955
        rts
956
        .size   __popcountdi2, .-__popcountdi2
957
 
958
#endif
959
 
960
/*******************************************************
961
                Compute parity 32
962
*******************************************************/
963
#ifdef L_paritysi2
964
 
965
        .section        .text
966
        .global __paritysi2
967
        .type   __paritysi2, @function
968
__paritysi2:
969
        ldli r0, 0              ; return 0 if no bit is set
970
 
971
__paritysi2_loop:
972
        btest r1, 0             ; test bit
973
        addi_ct r0, 1           ; update loop counter
974
        sri r1, 1
975
        cmpi_eq r1, 0
976
        jmpi_cf __paritysi2_loop
977
 
978
__paritysi2_end:
979
        ldli r13, 1
980
        and r0, r13
981
        rts
982
        .size   __paritysi2, .-__paritysi2
983
 
984
#endif
985
 
986
/*******************************************************
987
                Compute parity 64
988
*******************************************************/
989
#ifdef L_paritydi2
990
 
991
        .section        .text
992
        .global __paritydi2
993
        .type   __paritydi2, @function
994
__paritydi2:
995
        ldli r0, 0              ; return 0 if no bit is set
996
 
997
__paritydi2_loop:
998
        btest r1, 0             ; test bit
999
        addi_ct r0, 1           ; update loop counter
1000
        sri r2, 1
1001
        rrc r1
1002
        cmpi_eq r1, 0
1003
        jmpi_cf __paritydi2_loop
1004
        cmpi_eq r2, 0
1005
        jmpi_cf __paritydi2_loop
1006
 
1007
__paritydi2_end:
1008
        ldli r13, 1
1009
        and r0, r13
1010
        rts
1011
        .size   __paritydi2, .-__paritydi2
1012
 
1013
#endif

powered by: WebSVN 2.1.0

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