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

Subversion Repositories scarts

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

Go to most recent revision | 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  16 x 16
37
*******************************************************/
38
#ifdef L_mulhi3
39
 
40
        .section        .text
41
        .global __mulhi3
42
        .type   __mulhi3, @function
43
__mulhi3:
44
        ldli r0, 0              ; clear result
45
__mulhi3_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 __mulhi3_loop
52
        rts
53
        .size   __mulhi3, .-__mulhi3
54
 
55
#endif
56
 
57
/*******************************************************
58
                Multiplication  32 x 32
59
*******************************************************/
60
#ifdef L_mulsi3
61
 
62
        .section        .text
63
        .global __mulsi3
64
        .type   __mulsi3, @function
65
__mulsi3:
66
        ldfpz r4,0
67
        ldfpz r5,1
68
 
69
        mov r0,r1
70
 
71
        ldli r6, 0
72
        ldli r7, 0
73
 
74
__mulsi3_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 __mulsi3_loop
86
        cmpi_eq r3, 0
87
        jmpi_cf __mulsi3_loop
88
 
89
        mov r13,r0
90
        sth r6,r13
91
        addi r13, 2
92
        sth r7,r13
93
 
94
        rts
95
        .size   __mulsi3, .-__mulsi3
96
 
97
#endif
98
 
99
/*******************************************************
100
                Division 16 x 16
101
*******************************************************/
102
#ifdef L_divhi3
103
 
104
        .section        .text
105
        .global __divhi3
106
        .type   __divhi3, @function
107
__divhi3:
108
        cmpi_eq r2, 0           ; avoid division by zero
109
        jmpi_ct __divhi3_end
110
 
111
        cmpi_eq r1, 0           ; we need not divide zero
112
        mov_ct r0, r1
113
        jmpi_ct __divhi3_end
114
 
115
__divhi3_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
__divhi3_copy:
126
        mov r13, r2             ; make a copy of the divisor
127
 
128
__divhi3_scale:
129
        btest r2, 15            ; scale divisor up
130
        sli_cf r2, 1
131
        jmpi_cf __divhi3_scale
132
 
133
        ldli r0, 0              ; clear result
134
 
135
__divhi3_loop:
136
        cmpu_lt r2, r13         ; check if the divisor is reached
137
        jmpi_ct __divhi3_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 __divhi3_loop
147
 
148
__divhi3_resign:                ; add sign again
149
        cmpi_lt r3, 0
150
        neg_ct r0
151
 
152
__divhi3_end:
153
        rts
154
        .size   __divhi3, .-__divhi3
155
 
156
#endif
157
 
158
/*******************************************************
159
                Division 32 x 32
160
*******************************************************/
161
#ifdef L_divsi3
162
 
163
        .section        .text
164
        .global __divsi3
165
        .type   __divsi3, @function
166
__divsi3:
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 __divsi3_start
173
        cmpi_eq r5, 0
174
        jmpi_ct __divsi3_end
175
 
176
__divsi3_start:
177
        cmpi_eq r2, 0           ; we need not divide zero
178
        jmpi_cf __divsi3_cmpsign
179
        cmpi_eq r3, 0
180
        mov_ct r0, r2
181
        mov_ct r1, r3
182
        jmpi_ct __divsi3_end
183
 
184
__divsi3_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
__divsi3_copy:
203
        mov r6, r4              ; make a copy of the divisor
204
        mov r7, r5
205
 
206
__divsi3_scale:
207
        btest r5, 15            ; scale divisor up
208
        sli_cf r4, 1
209
        addc_cf r5, r5
210
        jmpi_cf __divsi3_scale
211
 
212
        ldli r0, 0              ; clear result
213
        ldli r1, 0
214
 
215
__divsi3_loop:
216
        cmpu_lt r5, r7          ; check if the divisor is reached
217
        jmpi_ct __divsi3_resign
218
        cmpu_gt r5, r7
219
        jmpi_ct __divsi3_noteq
220
        cmpu_lt r4, r6
221
        jmpi_ct __divsi3_resign
222
 
223
__divsi3_noteq:
224
        sli r0, 1
225
        addc r1, r1
226
 
227
        cmpu_gt r5, r3          ; need to scale back?
228
        jmpi_ct __divsi3_nosub
229
        cmpu_lt r5, r3
230
        jmpi_ct __divsi3_sub
231
        cmpu_gt r4, r2
232
        jmpi_ct __divsi3_nosub
233
__divsi3_sub:
234
        sub r2, r4
235
        subc r3, r5
236
        addi r0, 1
237
        addc r1, r13
238
__divsi3_nosub:
239
        sri r5, 1
240
        rrc r4
241
 
242
        jmpi __divsi3_loop
243
 
244
__divsi3_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
__divsi3_end:
252
        ldfpz r13, 0
253
 
254
        sth r0, r13
255
        addi r13, 2
256
        sth r1, r13
257
 
258
        ldfpz_inc r0, 0
259
 
260
        rts
261
        .size   __divsi3, .-__divsi3
262
 
263
#endif
264
 
265
/*******************************************************
266
                Unsigned Division 16 x 16
267
*******************************************************/
268
#ifdef L_udivhi3
269
 
270
        .section        .text
271
        .global __udivhi3
272
        .type   __udivhi3, @function
273
__udivhi3:
274
        cmpi_eq r2, 0           ; avoid division by zero
275
        jmpi_ct __udivhi3_end
276
 
277
        cmpi_eq r1, 0           ; we need not divide zero
278
        mov_ct r0, r1
279
        jmpi_ct __udivhi3_end
280
 
281
__udivhi3_copy:
282
        mov r13, r2             ; make a copy of the divisor
283
 
284
__udivhi3_scale:
285
        btest r2, 15            ; scale divisor up
286
        sli_cf r2, 1
287
        jmpi_cf __udivhi3_scale
288
 
289
        ldli r0, 0              ; clear result
290
 
291
__udivhi3_loop:
292
        cmpu_lt r2, r13         ; check if the divisor is reached
293
        jmpi_ct __udivhi3_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 __udivhi3_loop
303
 
304
__udivhi3_end:
305
        rts
306
        .size   __udivhi3, .-__udivhi3
307
 
308
#endif
309
 
310
/*******************************************************
311
                Unsigned Division 32 x 32
312
*******************************************************/
313
#ifdef L_udivsi3
314
 
315
        .section        .text
316
        .global __udivsi3
317
        .type   __udivsi3, @function
318
__udivsi3:
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 __udivsi3_start
325
        cmpi_eq r5, 0
326
        jmpi_ct __udivsi3_end
327
 
328
__udivsi3_start:
329
        cmpi_eq r2, 0           ; we need not divide zero
330
        jmpi_cf __udivsi3_copy
331
        cmpi_eq r3, 0
332
        mov_ct r0, r2
333
        mov_ct r1, r3
334
        jmpi_ct __udivsi3_end
335
 
336
__udivsi3_copy:
337
        mov r6, r4              ; make a copy of the divisor
338
        mov r7, r5
339
 
340
__udivsi3_scale:
341
        btest r5, 15            ; scale divisor up
342
        sli_cf r4, 1
343
        addc_cf r5, r5
344
        jmpi_cf __udivsi3_scale
345
 
346
        ldli r0, 0              ; clear result
347
        ldli r1, 0
348
 
349
        ldli r13, 0             ; we use that for incrementing
350
 
351
__udivsi3_loop:
352
        cmpu_lt r5, r7          ; check if the divisor is reached
353
        jmpi_ct __udivsi3_end
354
        cmpu_gt r5, r7
355
        jmpi_ct __udivsi3_noteq
356
        cmpu_lt r4, r6
357
        jmpi_ct __udivsi3_end
358
 
359
__udivsi3_noteq:
360
        sli r0, 1
361
        addc r1, r1
362
 
363
        cmpu_gt r5, r3          ; need to scale back?
364
        jmpi_ct __udivsi3_nosub
365
        cmpu_lt r5, r3
366
        jmpi_ct __udivsi3_sub
367
        cmpu_gt r4, r2
368
        jmpi_ct __udivsi3_nosub
369
__udivsi3_sub:
370
        sub r2, r4
371
        subc r3, r5
372
        addi r0, 1
373
        addc r1, r13
374
__udivsi3_nosub:
375
        sri r5, 1
376
        rrc r4
377
 
378
        jmpi __udivsi3_loop
379
 
380
__udivsi3_end:
381
        ldfpz r13, 0
382
 
383
        sth r0, r13
384
        addi r13, 2
385
        sth r1, r13
386
 
387
        ldfpz_inc r0, 0
388
 
389
        rts
390
        .size   __udivsi3, .-__udivsi3
391
 
392
#endif
393
 
394
/*******************************************************
395
                Modulo 16 x 16
396
*******************************************************/
397
#ifdef L_modhi3
398
 
399
        .section        .text
400
        .global __modhi3
401
        .type   __modhi3, @function
402
__modhi3:
403
        cmpi_eq r2, 0           ; avoid division by zero
404
        jmpi_ct __modhi3_end
405
 
406
        cmpi_eq r1, 0           ; we need not divide zero
407
        mov_ct r0, r1
408
        jmpi_ct __modhi3_end
409
 
410
__modhi3_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
__modhi3_copy:
420
        mov r13, r2             ; make a copy of the divisor
421
 
422
__modhi3_scale:
423
        btest r2, 15            ; scale divisor up
424
        sli_cf r2, 1
425
        jmpi_cf __modhi3_scale
426
 
427
__modhi3_loop:
428
        cmpu_lt r2, r13         ; check if the divisor is reached
429
        jmpi_ct __modhi3_resign
430
 
431
        cmpu_gt r2, r1          ; need to scale back?
432
        sub_cf r1, r2
433
        sri r2, 1
434
 
435
        jmpi __modhi3_loop
436
 
437
__modhi3_resign:                ; add sign again
438
        mov r0, r1
439
        cmpi_lt r3, 0
440
        neg_ct r0
441
 
442
__modhi3_end:
443
        rts
444
        .size   __modhi3, .-__modhi3
445
 
446
#endif
447
 
448
/*******************************************************
449
                Modulo 32 x 32
450
*******************************************************/
451
#ifdef L_modsi3
452
 
453
        .section        .text
454
        .global __modsi3
455
        .type   __modsi3, @function
456
__modsi3:
457
        ldfpz r4,0
458
        ldfpz r5,1
459
 
460
        cmpi_eq r4, 0           ; avoid division by zero
461
        jmpi_cf __modsi3_start
462
        cmpi_eq r5, 0
463
        jmpi_ct __modsi3_end
464
 
465
__modsi3_start:
466
        cmpi_eq r2, 0           ; we need not divide zero
467
        jmpi_cf __modsi3_cmpsign
468
        cmpi_eq r3, 0
469
        jmpi_ct __modsi3_end
470
 
471
__modsi3_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
__modsi3_copy:
489
        mov r6, r4              ; make a copy of the divisor
490
        mov r7, r5
491
 
492
__modsi3_scale:
493
        btest r5, 15            ; scale divisor up
494
        sli_cf r4, 1
495
        addc_cf r5, r5
496
        jmpi_cf __modsi3_scale
497
 
498
__modsi3_loop:
499
        cmpu_lt r5, r7          ; check if the divisor is reached
500
        jmpi_ct __modsi3_resign
501
        cmpu_gt r5, r7
502
        jmpi_ct __modsi3_noteq
503
        cmpu_lt r4, r6
504
        jmpi_ct __modsi3_resign
505
 
506
__modsi3_noteq:
507
        cmpu_gt r5, r3          ; need to scale back?
508
        jmpi_ct __modsi3_nosub
509
        cmpu_lt r5, r3
510
        jmpi_ct __modsi3_sub
511
        cmpu_gt r4, r2
512
        jmpi_ct __modsi3_nosub
513
__modsi3_sub:
514
        sub r2, r4
515
        subc r3, r5
516
__modsi3_nosub:
517
        sri r5, 1
518
        rrc r4
519
 
520
        jmpi __modsi3_loop
521
 
522
__modsi3_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
__modsi3_end:
530
        mov r13, r1
531
 
532
        sth r2, r13
533
        addi r13, 2
534
        sth r3, r13
535
 
536
        mov r0, r1
537
 
538
        rts
539
        .size   __modsi3, .-__modsi3
540
 
541
#endif
542
 
543
/*******************************************************
544
                Unsigned Modulo 16 x 16
545
*******************************************************/
546
#ifdef L_umodhi3
547
 
548
        .section        .text
549
        .global __umodhi3
550
        .type   __umodhi3, @function
551
__umodhi3:
552
        cmpi_eq r2, 0           ; avoid division by zero
553
        jmpi_ct __umodhi3_end
554
 
555
        cmpi_eq r1, 0           ; we need not divide zero
556
        mov_ct r0, r1
557
        jmpi_ct __umodhi3_end
558
 
559
__umodhi3_copy:
560
        mov r13, r2             ; make a copy of the divisor
561
 
562
__umodhi3_scale:
563
        btest r2, 15            ; scale divisor up
564
        sli_cf r2, 1
565
        jmpi_cf __umodhi3_scale
566
 
567
__umodhi3_loop:
568
        cmpu_lt r2, r13         ; check if the divisor is reached
569
        jmpi_ct __umodhi3_end
570
 
571
        cmpu_gt r2, r1          ; need to scale back?
572
        sub_cf r1, r2
573
        sri r2, 1
574
 
575
        jmpi __umodhi3_loop
576
 
577
__umodhi3_end:
578
        mov r0, r1
579
        rts
580
        .size   __umodhi3, .-__umodhi3
581
 
582
#endif
583
 
584
/*******************************************************
585
                Unsigned Modulo 32 x 32
586
*******************************************************/
587
#ifdef L_umodsi3
588
 
589
        .section        .text
590
        .global __umodsi3
591
        .type   __umodsi3, @function
592
__umodsi3:
593
        ldfpz r4,0
594
        ldfpz r5,1
595
 
596
        cmpi_eq r4, 0           ; avoid division by zero
597
        jmpi_cf __umodsi3_start
598
        cmpi_eq r5, 0
599
        jmpi_ct __umodsi3_end
600
 
601
__umodsi3_start:
602
        cmpi_eq r2, 0           ; we need not divide zero
603
        jmpi_cf __umodsi3_copy
604
        cmpi_eq r3, 0
605
        mov_ct r4, r2
606
        mov_ct r5, r3
607
        jmpi_ct __umodsi3_end
608
 
609
__umodsi3_copy:
610
        mov r6, r4              ; make a copy of the divisor
611
        mov r7, r5
612
 
613
__umodsi3_scale:
614
        btest r5, 15            ; scale divisor up
615
        sli_cf r4, 1
616
        addc_cf r5, r5
617
        jmpi_cf __umodsi3_scale
618
 
619
__umodsi3_loop:
620
        cmpu_lt r5, r7          ; check if the divisor is reached
621
        jmpi_ct __umodsi3_end
622
        cmpu_gt r5, r7
623
        jmpi_ct __umodsi3_noteq
624
        cmpu_lt r4, r6
625
        jmpi_ct __umodsi3_end
626
 
627
__umodsi3_noteq:
628
        cmpu_gt r5, r3          ; need to scale back?
629
        jmpi_ct __umodsi3_nosub
630
        cmpu_lt r5, r3
631
        jmpi_ct __umodsi3_sub
632
        cmpu_gt r4, r2
633
        jmpi_ct __umodsi3_nosub
634
__umodsi3_sub:
635
        sub r2, r4
636
        subc r3, r5
637
__umodsi3_nosub:
638
        sri r5, 1
639
        rrc r4
640
 
641
        jmpi __umodsi3_loop
642
 
643
__umodsi3_end:
644
        mov r13, r1
645
 
646
        sth r2, r13
647
        addi r13, 2
648
        sth r3, r13
649
 
650
        mov r0, r1
651
 
652
        rts
653
        .size   __umodsi3, .-__umodsi3
654
 
655
#endif
656
 
657
/*******************************************************
658
                Shift right logic 32
659
*******************************************************/
660
#ifdef L_lshrsi3
661
 
662
        .section        .text
663
        .global __lshrsi3
664
        .type   __lshrsi3, @function
665
__lshrsi3:
666
        mov r0,r1
667
 
668
__lshrsi3_loop:
669
        cmpi_gt r4, 0
670
        sri_ct r3, 1
671
        rrc_ct r2
672
        addi_ct r4, -1
673
        jmpi_ct __lshrsi3_loop
674
 
675
        mov r13,r0
676
        sth r2, r13
677
        addi r13, 2
678
        sth r3, r13
679
 
680
        rts
681
        .size   __lshrsi3, .-__lshrsi3
682
 
683
#endif
684
 
685
/*******************************************************
686
                Shift right logic 64
687
*******************************************************/
688
#ifdef L_lshrdi3
689
 
690
        .section        .text
691
        .global __lshrdi3
692
        .type   __lshrdi3, @function
693
__lshrdi3:
694
        mov r0,r1
695
 
696
        ldfpz r1, 0
697
        ldfpz r2, 1
698
        ldfpz r3, 2
699
        ldfpz r4, 3
700
        ldfpz r5, 4
701
 
702
__lshrdi3_loop:
703
        cmpi_gt r5, 0
704
        sri_ct r4, 1
705
        rrc_ct r3
706
        rrc_ct r2
707
        rrc_ct r1
708
 
709
        addi_ct r5, -1
710
        jmpi_ct __lshrdi3_loop
711
 
712
        mov r13,r0
713
        sth r1,r13
714
        addi r13, 2
715
        sth r2,r13
716
        addi r13, 2
717
        sth r3,r13
718
        addi r13, 2
719
        sth r4,r13
720
 
721
        rts
722
        .size   __lshrdi3, .-__lshrdi3
723
 
724
#endif
725
 
726
/*******************************************************
727
                Shift right arithmetic 32
728
*******************************************************/
729
#ifdef L_ashrsi3
730
 
731
        .section        .text
732
        .global __ashrsi3
733
        .type   __ashrsi3, @function
734
__ashrsi3:
735
        mov r0,r1
736
 
737
__ashrsi3_loop:
738
        cmpi_gt r4, 0
739
        srai_ct r3, 1
740
        rrc_ct r2
741
        addi_ct r4, -1
742
        jmpi_ct __ashrsi3_loop
743
 
744
        mov r13,r0
745
        sth r2, r13
746
        addi r13, 2
747
        sth r3, r13
748
 
749
        rts
750
        .size   __ashrsi3, .-__ashrsi3
751
 
752
#endif
753
 
754
/*******************************************************
755
                Shift right arithmetic 64
756
*******************************************************/
757
#ifdef L_ashrdi3
758
 
759
        .section        .text
760
        .global __ashrdi3
761
        .type   __ashrdi3, @function
762
__ashrdi3:
763
        mov r0,r1
764
 
765
        ldfpz r1, 0
766
        ldfpz r2, 1
767
        ldfpz r3, 2
768
        ldfpz r4, 3
769
        ldfpz r5, 4
770
 
771
__ashrdi3_loop:
772
        cmpi_gt r5, 0
773
        srai_ct r4, 1
774
        rrc_ct r3
775
        rrc_ct r2
776
        rrc_ct r1
777
 
778
        addi_ct r5, -1
779
        jmpi_ct __ashrdi3_loop
780
 
781
        mov r13,r0
782
        sth r1,r13
783
        addi r13, 2
784
        sth r2,r13
785
        addi r13, 2
786
        sth r3,r13
787
        addi r13, 2
788
        sth r4,r13
789
 
790
        rts
791
        .size   __ashrdi3, .-__ashrdi3
792
 
793
#endif
794
 
795
/*******************************************************
796
                Shift left 32
797
*******************************************************/
798
#ifdef L_ashlsi3
799
 
800
        .section        .text
801
        .global __ashlsi3
802
        .type   __ashlsi3, @function
803
__ashlsi3:
804
        mov r0,r1
805
 
806
__ashlsi3_loop:
807
        cmpi_gt r4, 0
808
        sli_ct r2, 1
809
        addc_ct r3, r3
810
        addi_ct r4, -1
811
        jmpi_ct __ashlsi3_loop
812
 
813
        mov r13,r0
814
        sth r2, r13
815
        addi r13, 2
816
        sth r3, r13
817
 
818
        rts
819
        .size   __ashlsi3, .-__ashlsi3
820
 
821
#endif
822
 
823
/*******************************************************
824
                Shift left 64
825
*******************************************************/
826
#ifdef L_ashldi3
827
 
828
        .section        .text
829
        .global __ashldi3
830
        .type   __ashldi3, @function
831
__ashldi3:
832
        mov r0,r1
833
 
834
        ldfpz r1, 0
835
        ldfpz r2, 1
836
        ldfpz r3, 2
837
        ldfpz r4, 3
838
        ldfpz r5, 4
839
 
840
__ashldi3_loop:
841
        cmpi_gt r5, 0
842
        sli_ct r1, 1
843
        addc_ct r2, r2
844
        addc_ct r3, r3
845
        addc_ct r4, r4
846
 
847
        addi_ct r5, -1
848
        jmpi_ct __ashldi3_loop
849
 
850
        mov r13,r0
851
        sth r1,r13
852
        addi r13, 2
853
        sth r2,r13
854
        addi r13, 2
855
        sth r3,r13
856
        addi r13, 2
857
        sth r4,r13
858
 
859
        rts
860
        .size   __ashldi3, .-__ashldi3
861
 
862
#endif
863
 
864
/*******************************************************
865
                Find first set bit 16
866
*******************************************************/
867
#ifdef L_ffshi2
868
 
869
        .section        .text
870
        .global __ffshi2
871
        .type   __ffshi2, @function
872
__ffshi2:
873
        cmpi_eq r1, 0           ; return zero if no bit is set
874
        mov_ct r0, r1
875
        jmpi_ct __ffshi2_end
876
 
877
        ldli r0, 1
878
__ffshi2_loop:
879
        btest r1, 0             ; test bit
880
        sri_cf r1, 1
881
        addi_cf r0, 1           ; update loop counter
882
        jmpi_cf __ffshi2_loop
883
 
884
__ffshi2_end:
885
        rts
886
        .size   __ffshi2, .-__ffshi2
887
 
888
#endif
889
 
890
/*******************************************************
891
                Find first set bit 32
892
*******************************************************/
893
#ifdef L_ffssi2
894
 
895
        .section        .text
896
        .global __ffssi2
897
        .type   __ffssi2, @function
898
__ffssi2:
899
        cmpi_eq r1, 0           ; return zero if no bit is set
900
        jmpi_cf __ffssi2_start
901
        cmpi_eq r2, 0
902
        mov_ct r0, r1
903
        jmpi_ct __ffssi2_end
904
 
905
__ffssi2_start:
906
        ldli r0, 1
907
__ffssi2_loop:
908
        btest r1, 0             ; test bit
909
        sri_cf r2, 1
910
        rrc_cf r1
911
        addi_cf r0, 1           ; update loop counter
912
        jmpi_cf __ffssi2_loop
913
 
914
__ffssi2_end:
915
        rts
916
        .size   __ffssi2, .-__ffssi2
917
 
918
#endif
919
 
920
/*******************************************************
921
                Count trailing zero bits 16
922
*******************************************************/
923
#ifdef L_ctzhi2
924
 
925
        .section        .text
926
        .global __ctzhi2
927
        .type   __ctzhi2, @function
928
__ctzhi2:
929
        ldli r0, 16             ; return 16 if no bit is set
930
        cmpi_eq r1, 0
931
        jmpi_ct __ctzhi2_end
932
 
933
        ldli r0, 0
934
__ctzhi2_loop:
935
        btest r1, 0             ; test bit
936
        sri_cf r1, 1
937
        addi_cf r0, 1           ; update loop counter
938
        jmpi_cf __ctzhi2_loop
939
 
940
__ctzhi2_end:
941
        rts
942
        .size   __ctzhi2, .-__ctzhi2
943
 
944
#endif
945
 
946
/*******************************************************
947
                Count trailing zero bits 32
948
*******************************************************/
949
#ifdef L_ctzsi2
950
 
951
        .section        .text
952
        .global __ctzsi2
953
        .type   __ctzsi2, @function
954
__ctzsi2:
955
        ldli r0, 32             ; return 32 if no bit is set
956
        cmpi_eq r1, 0
957
        jmpi_cf __ctzsi2_start
958
        cmpi_eq r2, 0
959
        jmpi_ct __ctzsi2_end
960
 
961
__ctzsi2_start:
962
        ldli r0, 0
963
__ctzsi2_loop:
964
        btest r1, 0             ; test bit
965
        sri_cf r2, 1
966
        rrc_cf r1
967
        addi_cf r0, 1           ; update loop counter
968
        jmpi_cf __ctzsi2_loop
969
 
970
__ctzsi2_end:
971
        rts
972
        .size   __ctzsi2, .-__ctzsi2
973
 
974
#endif
975
 
976
/*******************************************************
977
                Count leading zero bits 16
978
*******************************************************/
979
#ifdef L_clzhi2
980
 
981
        .section        .text
982
        .global __clzhi2
983
        .type   __clzhi2, @function
984
__clzhi2:
985
        ldli r0, 16             ; return 16 if no bit is set
986
        cmpi_eq r1, 0
987
        jmpi_ct __clzhi2_end
988
 
989
        ldli r0, 0
990
__clzhi2_loop:
991
        btest r1, 15            ; test bit
992
        sli_cf r1, 1
993
        addi_cf r0, 1           ; update loop counter
994
        jmpi_cf __clzhi2_loop
995
 
996
__clzhi2_end:
997
        rts
998
        .size   __clzhi2, .-__clzhi2
999
 
1000
#endif
1001
 
1002
/*******************************************************
1003
                Count leading zero bits 32
1004
*******************************************************/
1005
#ifdef L_clzsi2
1006
 
1007
        .section        .text
1008
        .global __clzsi2
1009
        .type   __clzsi2, @function
1010
__clzsi2:
1011
        ldli r0, 32             ; return 32 if no bit is set
1012
        cmpi_eq r1, 0
1013
        jmpi_cf __clzsi2_start
1014
        cmpi_eq r2, 0
1015
        jmpi_ct __clzsi2_end
1016
 
1017
__clzsi2_start:
1018
        ldli r0, 0
1019
__clzsi2_loop:
1020
        btest r2, 15            ; test bit
1021
        sli_cf r1, 1
1022
        addc_cf r2, r2
1023
        addi_cf r0, 1           ; update loop counter
1024
        jmpi_cf __clzsi2_loop
1025
 
1026
__clzsi2_end:
1027
        rts
1028
        .size   __clzsi2, .-__clzsi2
1029
 
1030
#endif
1031
 
1032
/*******************************************************
1033
                Count set bits 16
1034
*******************************************************/
1035
#ifdef L_popcounthi2
1036
 
1037
        .section        .text
1038
        .global __popcounthi2
1039
        .type   __popcounthi2, @function
1040
__popcounthi2:
1041
        ldli r0, 0              ; return 0 if no bit is set
1042
 
1043
__popcounthi2_loop:
1044
        btest r1, 0             ; test bit
1045
        addi_ct r0, 1           ; update loop counter
1046
        sri r1, 1
1047
        cmpi_eq r1, 0
1048
        jmpi_cf __popcounthi2_loop
1049
 
1050
__popcounthi2_end:
1051
        rts
1052
        .size   __popcounthi2, .-__popcounthi2
1053
 
1054
#endif
1055
 
1056
/*******************************************************
1057
                Count set bits 32
1058
*******************************************************/
1059
#ifdef L_popcountsi2
1060
 
1061
        .section        .text
1062
        .global __popcountsi2
1063
        .type   __popcountsi2, @function
1064
__popcountsi2:
1065
        ldli r0, 0              ; return 0 if no bit is set
1066
 
1067
__popcountsi2_loop:
1068
        btest r1, 0             ; test bit
1069
        addi_ct r0, 1           ; update loop counter
1070
        sri r2, 1
1071
        rrc r1
1072
        cmpi_eq r1, 0
1073
        jmpi_cf __popcountsi2_loop
1074
        cmpi_eq r2, 0
1075
        jmpi_cf __popcountsi2_loop
1076
 
1077
__popcountsi2_end:
1078
        rts
1079
        .size   __popcountsi2, .-__popcountsi2
1080
 
1081
#endif
1082
 
1083
/*******************************************************
1084
                Compute parity 16
1085
*******************************************************/
1086
#ifdef L_parityhi2
1087
 
1088
        .section        .text
1089
        .global __parityhi2
1090
        .type   __parityhi2, @function
1091
__parityhi2:
1092
        ldli r0, 0              ; return 0 if no bit is set
1093
 
1094
__parityhi2_loop:
1095
        btest r1, 0             ; test bit
1096
        addi_ct r0, 1           ; update loop counter
1097
        sri r1, 1
1098
        cmpi_eq r1, 0
1099
        jmpi_cf __parityhi2_loop
1100
 
1101
__parityhi2_end:
1102
        ldli r13, 1
1103
        and r0, r13
1104
        rts
1105
        .size   __parityhi2, .-__parityhi2
1106
 
1107
#endif
1108
 
1109
/*******************************************************
1110
                Compute parity 32
1111
*******************************************************/
1112
#ifdef L_paritysi2
1113
 
1114
        .section        .text
1115
        .global __paritysi2
1116
        .type   __paritysi2, @function
1117
__paritysi2:
1118
        ldli r0, 0              ; return 0 if no bit is set
1119
 
1120
__paritysi2_loop:
1121
        btest r1, 0             ; test bit
1122
        addi_ct r0, 1           ; update loop counter
1123
        sri r2, 1
1124
        rrc r1
1125
        cmpi_eq r1, 0
1126
        jmpi_cf __paritysi2_loop
1127
        cmpi_eq r2, 0
1128
        jmpi_cf __paritysi2_loop
1129
 
1130
__paritysi2_end:
1131
        ldli r13, 1
1132
        and r0, r13
1133
        rts
1134
        .size   __paritysi2, .-__paritysi2
1135
 
1136
#endif

powered by: WebSVN 2.1.0

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