내가 추가한것도 기본적으로 kukyakya 와 동일한 성능을 내는 코드다.

disassemble 해보면,


kukyakya 의 unaligned 도 내 unaligned 도


    mov ecx, 16384              ; 00004000H

    push    esi

    push    edi

    mov esi, OFFSET ?src@@3PADA+3

    mov edi, OFFSET ?dst@@3PADA+1

    rep movsd

    pop edi

    pop esi


걍 rep movsd 로 4바이트 복사가 실행된다.

memcpy 는 무슨 개뿔.

classic instruction 으로도 쳐발리는데.


함수 자체만 놓고 보면 별도의 코드를 생성한다.

( 인라인으로 최적화되었을때랑 실제 함수구조랑 코드가 다름 )


; 320  :     _____   step_t* d = (step_t*)dst;

; 321  :     const   step_t* s = (step_t*)src;

; 322  :     const   std::size_t step_count  = size / sizeof(step_t);

; 323  :     const   u32         off_road    = size % sizeof(step_t);

; 324  : 

; 325  :     for( std::size_t i = 0; i < step_count; ++i )


    mov eax, ecx

    sub edi, ecx

    mov esi, 16384              ; 00004000H

    npad    3

$LL13@codesafer_:


; 326  :         d[i] = s[i];


    mov edx, DWORD PTR [edi+eax]

    lea eax, DWORD PTR [eax+4]

    mov DWORD PTR [eax-4], edx

    sub esi, 1

    jne SHORT $LL13@codesafer_


뭐, 핵심은 대동소이.


해석은 컴파일러 마음이지만,

만약 니네가 128비트 레지스터와 SIMD를 사용하고 싶으면 힌트를 하나 주자면,


void* codesafer_memcpy_unaligned1( void* dst, const void* src, std::size_t size )

{

    using   step_t = u32;

    ....

}


여기서 using step_t = u32 를 struct step_t{ float data[4]; };

와 같이 128비트 선언으로 바꾸면 된다.

다만 그것만으론 최적화가 제대로 안될거다.

나머지는 알아서 연구하시길.

다 가르쳐주면 재미없잖아?