SSE2 movq xmm, xmm/m64
작품을보십시오. 표시 한 코드는 이미 32 비트 주소 지정 모드를 사용 했으므로 32 비트 모드에서 변경되지 않습니다. movq
의 또 다른 형식은 movq xmm, r64/m64
인 64 비트 모드에서만 작동합니다. movq xmm0, rax
을 수행 할 수있는 동일한 opcode의 메모리 소스 형식.
어쨌든, 32 비트 SSE2 :
movq xmm5, [esi+2h]
movq [edi+f1h], xmm5
만 SSE1하지만 SSE2를 가정 할 경우, 당신은, 당신이 무슨 일을하는지에 따라 movlps
;; xorps xmm5,xmm5 ; optional to break a dependency on old value
movlps xmm5, [esi+2h] ; merges into xmm5: false dependency
movlps [edi+f1h], xmm5
을이 수 사용할 수 있습니다
movq mm0, [esi+2h]
movq [edi+f1h], mm0
; emms required later, after a loop.
,536,913,632 : 당신이 아니라 SSE1이있는 경우는 MMX를 사용하는 것이 가능 가치 10
정렬 된 주소에 대해 단일 명령어 64 비트로드/저장 so it's atomic (on P5 and later)을 사용하려는 경우 fild
/fistp
을 선택하는 것이 좋습니다. gcc는 std::atomic<int64_t>
에 -m32 -mno-sse
을 사용합니다.
귀하의 데이터를 절대로 괴롭히지 않습니다. unless you (or MSVC++'s CRT) have the x87 precision bits set to less than a 64-bit mantissa.
fild qword ptr [esi+2h]
fistp qword ptr [edi+f1h]
fild
/fistp
도 적어도 현대의 CPU에 32 비트 정수로드/저장을 사용하는 것보다 64 비트 덩어리를 산란 복사 할 처리량이있을 수 있습니다. 32 또는 64 바이트 이상의 연속 사본의 경우
rep movsd
을 사용하십시오. (보통
rep movsd
에 대한 임계 값은 훨씬 더 높은 가치가있는, 그러나 우리는 32 비트 정수 또는 64 비트
fild
/
fistp
멀티 UOP로드/저장 지침 SIMD 벡터없이 얘기하고 있습니다.)
일반 정수로, 당신이 clobber 수있는 레지스터를 선택하십시오. (또는 MSVC의 인라인 어셈블리에서, 그것을 절약에 대한 컴파일러 걱정을 할 수 있습니다.) 레지스터 꽉 경우, 하나를 사용합니다 (SRC와 DST가 알려진 경우 중첩되지 않음) :
mov eax, [esi+2h]
mov [edi+f1h], eax
mov eax, [esi+2h + 4] ; write the +4 separately in the addressing mode as documentation
mov [edi+f1h + 4], eax
당신이이 개 레지스터를 마련 할 수있는 경우 , 그렇다면 아마도로드를 수행 한 다음 두 저장소를 수행하는 것이 좋습니다.
두 가지 모두에서 결과를 비교해 보시지 않겠습니까? –
[이] (http://www.x86-64.org/documentation/assembly.html) 도움이 될 것 같아요. 미안하지만) –
두 결과를 비교해 보았습니다.하지만 제 경우에 충돌이 발생합니다. 미리보기가 제공됩니다. – user3475849