#define N 100000000
#define D 256
#define D1 255
unsigned *rs[D],t0[D],t1[D],t2[D],t3[D];
void count_t(unsigned*a){
asm volatile(R"(
movl $12500000,%%ecx
movl %[a],%%esi
0:
movl (%%esi),%%eax
movl 4(%%esi),%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t0](,%%edx,4)
incl %[t0](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t1](,%%edx,4)
incl %[t1](,%%edi,4)
shrl $16,%%eax
shrl $16,%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t2](,%%edx,4)
incl %[t2](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t3](,%%edx,4)
incl %[t3](,%%edi,4)
movl 8(%%esi),%%eax
movl 12(%%esi),%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t0](,%%edx,4)
incl %[t0](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t1](,%%edx,4)
incl %[t1](,%%edi,4)
shrl $16,%%eax
shrl $16,%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t2](,%%edx,4)
incl %[t2](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t3](,%%edx,4)
incl %[t3](,%%edi,4)
movl 16(%%esi),%%eax
movl 20(%%esi),%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t0](,%%edx,4)
incl %[t0](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t1](,%%edx,4)
incl %[t1](,%%edi,4)
shrl $16,%%eax
shrl $16,%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t2](,%%edx,4)
incl %[t2](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t3](,%%edx,4)
incl %[t3](,%%edi,4)
movl 24(%%esi),%%eax
movl 28(%%esi),%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t0](,%%edx,4)
incl %[t0](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t1](,%%edx,4)
incl %[t1](,%%edi,4)
shrl $16,%%eax
shrl $16,%%ebx
movzbl %%al,%%edx
movzbl %%bl,%%edi
incl %[t2](,%%edx,4)
incl %[t2](,%%edi,4)
movzbl %%ah,%%edx
movzbl %%bh,%%edi
incl %[t3](,%%edx,4)
incl %[t3](,%%edi,4)
addl $32,%%esi
dec %%ecx
test %%ecx,%%ecx
jnz 0b
)"
:
:[a]"m"(a),[t0]"m"(t0),[t1]"m"(t1),[t2]"m"(t2),[t3]"m"(t3)
:"memory","eax","ebx","ecx","edx","esi","edi"
);
}
__attribute((opitmize("-o3")))
void sort(unsigned*a,int n){
#define cal(w,w2,tw,op) \
p=w2-1;\
for(i=0;i<D;++i)rs[i]=p,p+=tw[i];\
for(i=0;i<N;i+=8){\
p=w+i;\
*++rs[p[0]op]=p[0],\
*++rs[p[1]op]=p[1],\
*++rs[p[2]op]=p[2],\
*++rs[p[3]op]=p[3],\
*++rs[p[4]op]=p[4],\
*++rs[p[5]op]=p[5],\
*++rs[p[6]op]=p[6],\
*++rs[p[7]op]=p[7];\
}
unsigned b[N],*p,i,x;
count_t(a);
cal(a,b,t0,&D1);
cal(b,a,t1,>>8&D1);
cal(a,b,t2,>>16&D1);
cal(b,a,t3,>>24);
}
Compilation | N/A | N/A | Compile Error | Score: N/A | 显示更多 |