尝试理解/将 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
在第一个片段中,您可以简单地使用
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