.text .global searchstr_maketbl .global searchstr /* static int eq(s1,s2,n,eqv) register unsigned char *s1; register unsigned char *s2; register int n; register char *eqv; { for (;n>0;n--) if (eqv[*s1++] != eqv[*s2++]) return(0); return(1); } */ .align 4 eq: #define s1 %o0 #define s2 %o1 #define n %o2 #define eqv %o3 #define rv %o4 1: deccc n bl 9f set 1,rv ldub [s1],%g1 ldub [s2],%g2 ldub [eqv+%g1],%g1 ldub [eqv+%g2],%g2 cmp %g1,%g2 inc s1 be 1b inc s2 clr rv 9: retl mov rv,%o0 #undef s1 #undef s2 #undef n #undef eqv #undef rv .align 4 searchstr_maketbl: /* searchstr_maketbl(tbl_,str_,len,equiv) register char (*tbl_)[256]; #define tbl ((unsigned char (*)[256])tbl_) register char *str_; #define str ((unsigned char *)str_) register int len; register char *equiv; */ save %sp,-104,%sp #define tbl %i0 #define str %i1 #define len %i2 #define equiv %i3 /* { register unsigned char *str1; register int i; register int j; register int k; register int l; if (len < 1) return; str1 = str + 1; for (i=len-1;i>=0;i--) { l = len - 1 - i; for (j=255;j>=0;j--) { for (k=i;k>=0;k--) { if ((equiv[str[k]] == equiv[j]) && ((l == 0) || (k == i) || eq(str1+k,str1+i,l,equiv))) { tbl[i][j] = i - k; break; } } if (k < 0) { for (k=0;k= l) tbl[i][j] = len; } } } } */ #define str1 %l0 #define i %l1 #define j %l2 #define k %l3 #define l %l4 cmp len,1 bl 9f .empty add str,1,str1 subcc len,1,i bl 9f .empty sub len,1,%o0 /* duplicated */ 4: sub %o0,i,l set 255,j mov i,k /* duplicated */ 2: ldub [str+k],%o0 ldub [equiv+%o0],%o0 ldub [equiv+j],%o1 cmp %o0,%o1 bne 1f sub i,k,%o0 tst l be 3f .empty cmp k,i be 3f .empty mov equiv,%o3 mov l,%o2 add str1,i,%o1 call eq add str1,k,%o0 tst %o0 bne 3f sub i,k,%o0 1: deccc k bge 2b nop clr k 1: cmp k,l bge 1f .empty mov equiv,%o3 sub l,k,%o2 add str1,i,%o1 add %o1,k,%o1 call eq mov str,%o0 tst %o0 be 1b .empty /* just to keep assembler happy - inc k belongs in delay slot */ 1: inc k add i,k,%o0 3: sll i,8,%o1 add %o1,j,%o1 stb %o0,[tbl+%o1] deccc j bge 2b mov i,k /* duplicate */ deccc i bge 4b sub len,1,%o0 /* duplicate */ 9: ret restore #undef tbl #undef str #undef len #undef str1 #undef i #undef j #undef k #undef l .align 4 searchstr: /* int searchstr(str,len,tbl,tbllen) register unsigned char *str; register int len; register unsigned char (*tbl)[256]; register int tbllen; */ #define str %o0 #define len %o1 #define tbl %o2 #define tbllen1 %o3 dec %o3 /* { register int strpos; register int stridx; register int stroff; register int adv; strpos = 0; while (1) { stroff = tbllen - 1; stridx = strpos + stroff; if (stridx >= len) return(-1); while (1) { adv = tbl[stroff][str[stridx]]; if (adv == 0) { if (stroff == 0) { return(stridx); } stroff --; stridx --; } else { strpos += adv; break; } } } } */ #define strpos %g1 #define stridx %g2 #define stroff %g3 #define adv %g4 clr strpos 2: add strpos,tbllen1,stridx cmp stridx,len bge 9f mov -1,%o4 mov tbllen1,stroff 1: ldub [str+stridx],%o5 sll stroff,8,%o4 add %o4,%o5,%o4 ldub [tbl+%o4],adv tst adv bne 2b add strpos,adv,strpos deccc stroff bl 9f mov stridx,%o4 b 1b dec stridx 9: retl mov %o4,%o0 #undef strpos #undef stridx #undef stroff #undef adv