Caso de prueba para adcx y adox
Estoy probandoIntel ADX agregar con carry y agregar con desbordamiento a pipeline agrega enteros grandes. Me gustaría ver cómo debería ser la generación de código esperada. De_addcarry_u64 y _addcarryx_u64 con MSVC e ICC, Pensé que este sería un caso de prueba adecuado:
#include <stdint.h>
#include <x86intrin.h>
#include "immintrin.h"
int main(int argc, char* argv[])
{
#define MAX_ARRAY 100
uint8_t c1 = 0, c2 = 0;
uint64_t a[MAX_ARRAY]={0}, b[MAX_ARRAY]={0}, res[MAX_ARRAY];
for(unsigned int i=0; i< MAX_ARRAY; i++){
c1 = _addcarryx_u64(c1, res[i], a[i], (unsigned long long int*)&res[i]);
c2 = _addcarryx_u64(c2, res[i], b[i], (unsigned long long int*)&res[i]);
}
return 0;
}
Cuando examino elcódigo generado a partir de GCC 6.1 utilizando-O3
y-madx
, revela serializadoaddc
. -O1
y-O2
produce resultados similares:
main:
subq $688, %rsp
xorl %edi, %edi
xorl %esi, %esi
leaq -120(%rsp), %rdx
xorl %ecx, %ecx
leaq 680(%rsp), %r8
.L2:
movq (%rdx), %rax
addb $-1, %sil
adcq %rcx, %rax
setc %sil
addb $-1, %dil
adcq %rcx, %rax
setc %dil
movq %rax, (%rdx)
addq $8, %rdx
cmpq %r8, %rdx
jne .L2
xorl %eax, %eax
addq $688, %rsp
ret
Así que supongo que el caso de prueba no está dando en el blanco, o estoy haciendo algo mal, o estoy usando algo incorrectamente ...
Si estoy analizando los documentos de Intel en_addcarryx_u64
correctamente, creo que el código C debería generar la tubería. Así que supongo que estoy haciendo algo mal:
Descripción
Agregue enteros de 64 bits sin signo ayb con un arrastre de 8 bits sin signo c_in (acarreo o indicador de desbordamiento), y almacene el resultado de 64 bits sin signo en salida y el arrastre en dst (indicador de arrastre o desbordamiento).
¿Cómo puedo generar la tubería que agregaría con carry / add con overflow (adcx
/adox
)?
De hecho, tengo un Core i7 de quinta generación listo para probar (observe eladx
bandera de la CPU):
$ cat /proc/cpuinfo | grep adx
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush
dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc
arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni
pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 fma cx16 xtpr pdcm pcid sse4_1
sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm
3dnowprefetch ida arat epb pln pts dtherm tpr_shadow vnmi flexpriority ept vpid fsgsbase
tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm rdseed adx smap xsaveopt
...