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