Caso de teste para adcx e adox

Estou testandoIntel ADX adicione com carry e adicione com overflow ao pipeline adiciona números inteiros grandes. Gostaria de ver como deve ser a geração de código esperada. De_addcarry_u64 e _addcarryx_u64 com MSVC e ICC, Pensei que este seria um caso de teste adequado:

#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;
}

Quando eu examino ocódigo gerado a partir do GCC 6.1 usando-O3 e-madx, revela serializadoaddc. -O1 e-O2 produz resultados semelhantes:

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

Então, acho que o caso de teste não está atingindo a marca ou estou fazendo algo errado, ou estou usando algo incorretamente, ...

Se eu estiver analisando os documentos da Intel em_addcarryx_u64 corretamente, acredito que o código C deve gerar o pipeline. Então, acho que estou fazendo algo errado:

Descrição

Adicione números inteiros de 64 bits não assinados aeb com transporte de 8 bits não assinado c_in (sinalizador de transporte ou transbordamento) e armazene o resultado de 64 bits não assinado em saída e transporte em dst (sinalizador de transbordo ou transbordamento).

Como gerar o pipeline'd adicionar com carry / add com estouro (adcx/adox)?

Na verdade, eu tenho um Core i7 de 5ª geração pronto para teste (observe oadx sinalizador da 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
...

questionAnswers(2)

yourAnswerToTheQuestion