このコードをNASM 32ビットSSEからNASM 64-AVXに変換したいと思います。それを簡単に行う方法を見つけることは可能でしょうか?NASM 32ビットSSEコードをNASM 64ビットに変換するAVX
64ビットコードに変換するには、32ビットコードを完全に書き直そうとします。しかし、これは非常に難しい作業であると私は思っています。私はすべてを行うほとんど自動の方法があると思います。
あなたはこのようなプロセスを認識していますか?たとえば、レジスタの名前を置き換える?
例:rax
から
- 変更
eax
、rbx
にebx
、というように... vmovaps
と変更movaps
のように...- ...
ここに私の32ビットNASMソースコードがあります:
section .text
global test
a equ 8
b equ 12
num equ 16
spuri equ 20
result equ 24
test:
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov esi, [ebp+a]
mov edi, [ebp+b]
mov ebx, 0
mov ecx, [ebp+num]
mov edx, [ebp+spuri]
mov eax,[ebp+result]
xorps xmm1,xmm1
xorps xmm3,xmm3
loop1:
cmp ecx,0
je end
movups xmm0, [esi+ebx]
movups xmm6, [edi+ebx]
subps xmm0, xmm6
mulps xmm0, xmm0
sqrtps xmm0, xmm0
addps xmm1, xmm0
add ebx, 16
dec ecx
jnz loop1
end:
haddps xmm1,xmm1
haddps xmm1,xmm1
addps xmm1,xmm3
movups [eax],xmm1
pop edi
pop esi
pop ebx
mov esp, ebp
pop ebp
ret
私はこのコードを変換しようとしましたが、良い結果はありませんでした。
なぜ組み込み関数に切り替えるだけではないのですか?これはかなり簡単な操作であり、Cや組み込み関数を使って書き直すと、はるかに簡単に保守、デバッグ、移植が可能です。(単純なスカラーのCコードで最初にそれを表現しようとしても、コンパイラが自動的にベクトル化するかどうかを確認することもできます) –
また、 'spuri'パラメータは未使用のようですか? (編集:OK - これは本当に[あなたの前の質問]の更新ですように見える(http://stackoverflow.com/questions/37257665/c-calling-conventions-32bit-to-nasm-with-float-movups- movupd-difference) 'loop1'の後にもう一つのループがあったのですか?) –
これはコードの一部です。 SSEだけの組み込み関数は使用できません。このコードを64ビットでどのように変換できますか? –