C언어 - UTF16_LE_to_BE_fast
16비트 리틀엔디언을 빅엔디언으로 변환하는 함수.
32비트씩 처리하여,
속도 테스트
루프언롤링 8회 + 읽기 버퍼 8개 + 출력은 읽기버퍼 사용안하고, 바로 출력 할때, 가장 빠름.
void UTF16_LE_to_BE_fast(unsigned short *p16,int nsample)
{
unsigned int n,m;unsigned long *p32,a[8];
//메모리4바이트정렬
while(nsample)//16비트 홀수 데이터 처리
{
if((((size_t)p16)&3)==0)break;
a[0]=*p16;
*p16=(unsigned short)((a[0]>>8)|(a[0]<<8));
p16++;
nsample--;
}
p32=(unsigned long *)p16;
n=nsample>>1;//한번에 2개의 샘플씩 처리.
m=n>>3;//32비트,8개씩처리
while(m)
{
m--;
/*32비트가 아닌 16비트 단위로 변경한다.
0x12341234 -> 0x34123412
0x12341234 >>8 : 0x00123412 & 0x00FF00FF
0x12341234 <<8 : 0x34123400 & 0xFF00FF00
*/
a[0]=p32[0]; a[1]=p32[1]; a[2]=p32[2]; a[3]=p32[3];
a[4]=p32[4]; a[5]=p32[5]; a[6]=p32[6]; a[7]=p32[7];
p32[0]=((a[0]>>8)&0x00FF00FF) | ((a[0]<<8)&0xFF00FF00);//저장까지 총 6회 연산으로 2샘플처리
p32[1]=((a[1]>>8)&0x00FF00FF) | ((a[1]<<8)&0xFF00FF00);
p32[2]=((a[2]>>8)&0x00FF00FF) | ((a[2]<<8)&0xFF00FF00);
p32[3]=((a[3]>>8)&0x00FF00FF) | ((a[3]<<8)&0xFF00FF00);
p32[4]=((a[4]>>8)&0x00FF00FF) | ((a[4]<<8)&0xFF00FF00);//저장까지 총 6회 연산으로 2샘플처리
p32[5]=((a[5]>>8)&0x00FF00FF) | ((a[5]<<8)&0xFF00FF00);
p32[6]=((a[6]>>8)&0x00FF00FF) | ((a[6]<<8)&0xFF00FF00);
p32[7]=((a[7]>>8)&0x00FF00FF) | ((a[7]<<8)&0xFF00FF00);
p32+=8;
}
m=n&7;
while(m)//32비트 1개씩 처리
{
m--;
a[0]=p32[0];
p32[0]=((a[0]>>8)&0x00FF00FF) | ((a[0]<<8)&0xFF00FF00);//저장까지 총 6회 연산으로 2샘플처리
p32++;
}
if(nsample&1)//16비트 홀수 데이터 처리
{
a[0]=*((unsigned short *)p32);
*((unsigned short *)p32)=(unsigned short)((a[0]>>8)|(a[0]<<8));
}
}