#include <sse2.h>
<%
	$scan=2
	$unroll=4
	
%>
char *strstr2(char *s,char *n,int ns){
	const int pars=4;int par;
MASKTYPE mask;
MBTYPE <%= $scan.times.map{|i| "n#{i}=make_mask(n[#{i},0)" }*","%>;
	int aligned=((long)s)%BYTES_AT_ONCE;
	char *s2=s-aligned;
	int kill=((long)-1)<< aligned;
	MBTYPE so,sn; sn=LOAD(s2);	
	while(1){
		mask=0;
		for(par=0;par<pars;par++){
			so=sn; sn=LOAD(s2+(par+1)*BYTES_AT_ONCE);
			MBTYPE e= XOR(CONCAT(so,sn,0),n0);
	<%= 1.upto($phase1-1){|i| "e=  OR(e, XOR(CONCAT(so,sn,#{i}),n#{i});"}*"\n" %>
			mask=mask|(get_mask(test_eq(e,mz))<<par);
		}
		mask=mask&kill;
		if(mask){
			while(mask){
				int i=first_bit(mask);
				if (cmp(s2+i+scan,n+scan,ns-scan)==ns-scan) return s2+i;
        
        mask=mask&kill;
			}
		}
	}
}
