123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- #include <sysdep.h>
- #ifdef __UCLIBC_SUSV3_LEGACY__
- #undef ret
- #define dest in0
- #define cnt in1
- #define tmp r31
- #define save_lc r30
- #define ptr0 r29
- #define ptr1 r28
- #define ptr2 r27
- #define ptr3 r26
- #define ptr9 r24
- #define loopcnt r23
- #define linecnt r22
- #define bytecnt r21
- #define p_scr p6
- #define p_unalgn p9
- #define p_y p11
- #define p_n p12
- #define p_yy p13
- #define p_nn p14
- #define movi0 mov
- #define MIN1 15
- #define MIN1P1HALF 8
- #define LINE_SIZE 128
- #define LSIZE_SH 7
- #define PREF_AHEAD 8
- #define USE_FLP
- #if defined(USE_INT)
- #define store st8
- #define myval r0
- #elif defined(USE_FLP)
- #define store stf8
- #define myval f0
- #endif
- .align 64
- ENTRY(bzero)
- { .mmi
- .prologue
- alloc tmp = ar.pfs, 2, 0, 0, 0
- lfetch.nt1 [dest]
- .save ar.lc, save_lc
- movi0 save_lc = ar.lc
- } { .mmi
- .body
- mov ret0 = dest
- nop.m 0
- cmp.eq p_scr, p0 = cnt, r0
- { .mmi
- and ptr2 = -(MIN1+1), dest
- and tmp = MIN1, dest
- tbit.nz p_y, p_n = dest, 0
- } { .mib
- mov ptr1 = dest
- nop.i 0
- (p_scr) br.ret.dpnt.many rp
- { .mib
- cmp.ne p_unalgn, p0 = tmp, r0
- } { .mib
- sub bytecnt = (MIN1+1), tmp
- cmp.gt p_scr, p0 = 16, cnt
- (p_scr) br.cond.dptk.many .move_bytes_unaligned
- { .mmi
- (p_unalgn) add ptr1 = (MIN1+1), ptr2
- (p_unalgn) add ptr2 = MIN1P1HALF, ptr2
- (p_unalgn) tbit.nz.unc p_y, p_n = bytecnt, 3
- { .mib
- (p_y) add cnt = -8, cnt
- (p_unalgn) tbit.nz.unc p_yy, p_nn = bytecnt, 2
- } { .mib
- (p_y) st8 [ptr2] = r0,-4
- (p_n) add ptr2 = 4, ptr2
- { .mib
- (p_yy) add cnt = -4, cnt
- (p_unalgn) tbit.nz.unc p_y, p_n = bytecnt, 1
- } { .mib
- (p_yy) st4 [ptr2] = r0,-2
- (p_nn) add ptr2 = 2, ptr2
- { .mmi
- mov tmp = LINE_SIZE+1
- (p_y) add cnt = -2, cnt
- (p_unalgn) tbit.nz.unc p_yy, p_nn = bytecnt, 0
- } { .mmi
- nop.m 0
- (p_y) st2 [ptr2] = r0,-1
- (p_n) add ptr2 = 1, ptr2
- { .mmi
- (p_yy) st1 [ptr2] = r0
- cmp.gt p_scr, p0 = tmp, cnt
- } { .mbb
- (p_yy) add cnt = -1, cnt
- (p_scr) br.cond.dpnt.many .fraction_of_line
- { .mib
- nop.m 0
- shr.u linecnt = cnt, LSIZE_SH
- nop.b 0
- .align 32
- .l1b:
- { .mmi
- and tmp = -(LINE_SIZE), cnt
- mov ptr9 = ptr1
- and cnt = (LINE_SIZE-1), cnt
- } { .mmi
- mov loopcnt = PREF_AHEAD-1
- cmp.gt p_scr, p0 = PREF_AHEAD, linecnt
- { .mmi
- (p_scr) add loopcnt = -1, linecnt
- add ptr2 = 16, ptr1
- add ptr1 = tmp, ptr1
- { .mmi
- add tmp = -1, linecnt
- movi0 ar.lc = loopcnt
- .pref_l1b:
- { .mib
- stf.spill [ptr9] = f0, 128
- nop.i 0
- br.cloop.dptk.few .pref_l1b
- { .mmi
- add ptr0 = 16, ptr2
- movi0 ar.lc = tmp
- .l1bx:
- { .mmi
- stf.spill [ptr2] = f0, 32
- stf.spill [ptr0] = f0, 32
-
- { .mmi
- stf.spill [ptr2] = f0, 32
- stf.spill [ptr0] = f0, 32
-
- { .mmi
- stf.spill [ptr2] = f0, 32
- stf.spill [ptr0] = f0, 64
- cmp.lt p_scr, p0 = ptr9, ptr1
-
- { .mmb
- stf.spill [ptr2] = f0, 32
- (p_scr) stf.spill [ptr9] = f0, 128
- br.cloop.dptk.few .l1bx
- { .mib
- cmp.gt p_scr, p0 = 8, cnt
- (p_scr) br.cond.dpnt.many .move_bytes_from_alignment
- .fraction_of_line:
- { .mib
- add ptr2 = 16, ptr1
- shr.u loopcnt = cnt, 5
- { .mib
- cmp.eq p_scr, p0 = loopcnt, r0
- add loopcnt = -1, loopcnt
- (p_scr) br.cond.dpnt.many .store_words
- { .mib
- and cnt = 0x1f, cnt
- movi0 ar.lc = loopcnt
- .align 32
- .l2:
- { .mmb
- store [ptr1] = myval, 8
- store [ptr2] = myval, 8
- store [ptr1] = myval, 24
- store [ptr2] = myval, 24
- br.cloop.dptk.many .l2
- .store_words:
- { .mib
- cmp.gt p_scr, p0 = 8, cnt
- (p_scr) br.cond.dpnt.many .move_bytes_from_alignment
- { .mmi
- store [ptr1] = myval, 8
- cmp.le p_y, p_n = 16, cnt
- add cnt = -8, cnt
- { .mmi
- (p_y) store [ptr1] = myval, 8
- (p_y) cmp.le.unc p_yy, p_nn = 16, cnt
- (p_y) add cnt = -8, cnt
- { .mmi
- (p_yy) store [ptr1] = myval, 8
- (p_yy) add cnt = -8, cnt
- .move_bytes_from_alignment:
- { .mib
- cmp.eq p_scr, p0 = cnt, r0
- tbit.nz.unc p_y, p0 = cnt, 2
- (p_scr) br.cond.dpnt.few .restore_and_exit
- { .mib
- (p_y) st4 [ptr1] = r0,4
- tbit.nz.unc p_yy, p0 = cnt, 1
- { .mib
- (p_yy) st2 [ptr1] = r0,2
- tbit.nz.unc p_y, p0 = cnt, 0
- { .mib
- (p_y) st1 [ptr1] = r0
- .restore_and_exit:
- { .mib
- nop.m 0
- movi0 ar.lc = save_lc
- br.ret.sptk.many rp
- .move_bytes_unaligned:
- { .mmi
- .pred.rel "mutex",p_y, p_n
- .pred.rel "mutex",p_yy, p_nn
- (p_n) cmp.le p_yy, p_nn = 4, cnt
- (p_y) cmp.le p_yy, p_nn = 5, cnt
- (p_n) add ptr2 = 2, ptr1
- } { .mmi
- (p_y) add ptr2 = 3, ptr1
- (p_y) st1 [ptr1] = r0, 1
- (p_y) add cnt = -1, cnt
- { .mmi
- (p_yy) cmp.le.unc p_y, p0 = 8, cnt
- add ptr3 = ptr1, cnt
- movi0 ar.lc = save_lc
- } { .mmi
- (p_yy) st2 [ptr1] = r0, 4
- (p_yy) st2 [ptr2] = r0, 4
- (p_yy) add cnt = -4, cnt
- { .mmi
- (p_y) cmp.le.unc p_yy, p0 = 8, cnt
- add ptr3 = -1, ptr3
- tbit.nz p_scr, p0 = cnt, 1
- } { .mmi
- (p_y) st2 [ptr1] = r0, 4
- (p_y) st2 [ptr2] = r0, 4
- (p_y) add cnt = -4, cnt
- { .mmi
- (p_yy) st2 [ptr1] = r0, 4
- (p_yy) st2 [ptr2] = r0, 4
-
- tbit.nz p_y, p0 = cnt, 0
- } { .mmi
- (p_yy) add cnt = -4, cnt
- { .mmb
- (p_scr) st2 [ptr1] = r0
- (p_y) st1 [ptr3] = r0
- br.ret.sptk.many rp
- END(bzero)
- #endif
|