在不支持adcx adox操作的平台上转换它们

问题描述 投票:0回答:1

尝试理解/将 adcx adox 程序集转换为不支持它们的指令

汇编代码:

https://github.com/zkbitcoin/ffiasm/blob/master/benchmark/fr.asm

想法是将对 adcx 和 adox (在下面的示例中)的调用转换为 adc 等(在不受支持的平台上)

adcx 示例:

; FirstLoop
    mov  rdx,[rsi + 0]
    mulx rax,r11,[rcx]
    mulx r8,r12,[rcx +8]
    adcx r12,rax
    mulx rax,r13,[rcx +16]
    adcx r13,r8
    mulx r8,r14,[rcx +24]
    adcx r14,rax
    mov  r15,r10
    adcx r15,r8

adcx 和 adox 示例


; SecondLoop
    mov  rdx,r9
    mulx rax,rdx,r11
    mulx r8,rax,[q]
    adcx rax,r11
    mulx rax,r11,[q +8]
    adcx r11,r8
    adox r11,r12
    mulx r8,r12,[q +16]
    adcx r12,rax
    adox r12,r13
    mulx rax,r13,[q +24]
    adcx r13,r8
    adox r13,r14
    mov r14,r10
    adcx r14,rax
    adox r14,r15

参考

“在英特尔® 架构处理器上支持大整数运算的新指令”

https://caxapa.ru/thumbs/808576/ia-large-integer-arithmetic-paper.pdf

assembly intel adx adox
1个回答
0
投票

在第一个片段中,您可以简单地使用

ADC
,因为您不关心其他标志。至少在所示的代码部分。

第二个更复杂。您可能应该将两条链分开,而不是一一模拟每个

ADOX
。但是,如果您不是特别关心速度,只是想要一些有效的东西,您可以在内存或空闲寄存器中分配一个变量,例如
tempOF
,并将
ADOX
替换为:

rcr tempOF, 1  ; save CF and bring in old value
adc op2, op1   ; emulate ADOX with ADC
rcl tempOF, 1  ; update emulated OF
© www.soinside.com 2019 - 2024. All rights reserved.