asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.

cho's의 이미지

asm에서 byte를 한칸씩 건너뛰고 저장하도록 하려고 합니다.
즉 입력값의 배열이
src[12]라면 그 값중 반만 받아서 저장하려고 합니다.
c코드는 다음과 같습니다. 방법이 없을까요?

for(int i = 0; i < 12/2; i++)
{
    dst[i] = src[i+1];
}

최대한 instruction을 줄이려고 mmx로 하고 있습니다.
싱글 instruction으로 바이트를 한칸씩 건너뛰고 저장할 방법은 없을까요?
어떻게 최적화를 해야될지 잘 모르겠습니다. 조언 부탁드립니다.
void half_size(unsigned char *pdst, unsigned char *psrc)
{
	__asm {
		mov ecx, 8					; Height
		test ecx,ecx
		jz _toend					;바로 앞전 연산 결과에 대한 플래그에서 zero 플래그가 세팅 되어 있으면(즉 0이면) _toend로 점프 합니다.

		push edi

		mov	esi, psrc				; Get pointer to src
		mov edi, pdst				; Get pointer to dst

		mov eax, 0

dorepeat:
		movq	mm0, [esi+eax*8]	; copy 8byte(64bit)

                            ;;여기에서 1byte식 건너서 저장하도록 처리해야하는데 잘 모르겠네요.
		movq	[edi+eax*8], mm0
		inc eax
		loop dorepeat
_toend:


	emms
	}
}
ryoo1105의 이미지

asm에서 byte를 한칸씩 건너뛰고 저장하도록 하면 8byte가 16byte로 늘어날것 같군요..

void half_size(unsigned char *pdst, unsigned char *psrc) 
{ 
   __asm { 
      mov ecx, 8               ; Height 
      test ecx,ecx 
      jz _toend               ;바로 앞전 연산 결과에 대한 플래그에서 zero 플래그가 세팅 되어 있으면(즉 0이면) _toend로 점프 합니다. 

      push edi 

      mov   esi, psrc            ; Get pointer to src 
      mov edi, pdst            ; Get pointer to dst 

      mov eax, 0 

    ; ------------------------------------
     pxor mm2, mm2
    ; ------------------------------------

dorepeat: 
      movq   mm0, [esi+eax*8]   ; copy 8byte(64bit) 

     ; ------------------------------------------------
      mov    mm1, mm0

      punpcklbw mm0, mm2
      punpckhbw mm1, mm2

      movq   [edi+eax*16], mm0 
      movq   [edi+eax*16+8], mm1
      inc eax 
     ; ---------------------------------------------------
      loop dorepeat 
_toend: 


   emms 
   } 
} 

가 되지 않을까요... [/code]

cho&#039;s의 이미지

답글대로 해봤는데
dst[0] = 0;dst[1]= 1;dst[2] = 0;dst[3] = 2
이렇게 되더군요.
제 생각과 거꾸로 더라구요. 제가 질문을 모호하게 해서
원하는 값은
dst[0] = 0;dst[1] = 1;dst[2] = 2
이런데 소스의 offset이 하나씩 증가하는 것을 원하는 것입니다.
즉 다시 풀면
dst[0] = src[0];dst[1] = src[2];dst[2] = src[4]

읽어주셔서 고맙고요. 답글달아주셔서 고맙습니다. 종일 어셈과 씨름하네요.
...

hb_kim의 이미지

dorepeat:
		movq	mm0, [esi+eax*16] ; copy 8byte(64bit)
		movq	mm1, [esi+eax*16+8] ; copy 8byte(64bit)
		packsswb mm1, mm0
		movq       [edi+eax*8], mm1
		inc           eax
		loop dorepeat

원하시는것이 이것 아니었나요?

참고로 제가 위의 코드를 만들기위해 구글한 사이트는,
http://webster.cs.ucr.edu/AoA/Windows/HTML/TheMMXInstructionSeta2.html#1011009