Testfall für adcx und adox

Ich testeIntel ADX add with carry und add with overflow to pipeline fügen große ganze Zahlen hinzu. Ich möchte sehen, wie die erwartete Codegenerierung aussehen sollte. Von _addcarry_u64 und _addcarryx_u64 mit MSVC und ICC, Ich dachte das wäre ein passender Testfall:

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

Wenn ich das @ untersucgenerierter Code aus GCC 6.1 using-O3 und-madx, es zeigt serialisiertaddc. -O1 und-O2 erzeugt ähnliche Ergebnisse:

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

So schätze ich, dass der Testfall nicht ganz ins Schwarze trifft, oder ich mache etwas falsch, oder ich verwende etwas falsch, ...

Wenn ich Intels Dokumente auf @ par_addcarryx_u64 richtig, ich glaube, der C-Code sollte die Pipeline generieren. Also schätze ich, dass ich etwas falsch mache:

Beschreibun

Vorzeichenlose 64-Bit-Ganzzahlen a und b mit vorzeichenlosem 8-Bit-Carry-In c_in (Übertrags- oder Überlaufflag) hinzufügen und das vorzeichenlose 64-Bit-Ergebnis in out und das Carry-Out in dst (Übertrags- oder Überlaufflag) speichern .

Wie kann ich die Pipeline generieren, die mit Carry / Add mit Overflow hinzugefügt wird? adcx/adox)?

Ich habe tatsächlich einen Core i7 der 5. Generation zum Testen bereit (sieheadx cpu flag):

$ 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
...

Antworten auf die Frage(4)

Ihre Antwort auf die Frage