테스트 중입니다. Intel ADX 캐리와 함께 더하고 파이프 라인에 오버 플로우를 추가하면 큰 정수가 추가됩니다. 예상되는 코드 생성이 어떻게 보이는지보고 싶습니다. _addcarry_u64 and _addcarryx_u64 with MSVC and ICC에서, 나는이 적절한 테스트 케이스가 될 것이라고 생각 : 나는 -O3
및 -madx
를 사용하여 generated code from GCC 6.1을 검토 할 때는adcx 및 adox 용 테스트 케이스
#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;
}
, 그것은 직렬화 addc
을 보여준다. -O1
및 -O2
유사한 결과를 생성합니다 ... 꽤 마크를 타격하지 않거나 뭔가 잘못하고있는 중이 야, 아니면 내가 잘못 뭔가를 사용하고
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
그래서 테스트 케이스 같은데요을
_addcarryx_u64
에있는 Intel의 문서를 올바르게 파싱한다면 C 코드가 파이프 라인을 생성해야한다고 생각합니다. 그래서 내가 뭔가 잘못하고있는 중이 야 같은데요 :
이 C_IN 부호없는 8 비트 반입와 부호없는 64 비트 정수 a와 b를 추가
나는 pipeline'd가 오버 플로우 (설명 (운반 또는 오버 플로우 플래그), 부호없는 64 비트 결과를 out에 저장하고, 및 캐리 아웃을 dst (캐리 또는 오버플로 플래그)에 저장합니다.
adcx
/adox
)를 추가/캐리와 함께 추가 생성 할 수있는 방법 ?
이$ 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
...
MSVC가 64 비트 모드에서 인라인 어셈블리를 허용하지 않기 때문에 이러한 내장 함수가 대부분 있다고 생각합니다. GCC를 사용하면이 경우 인라인 어셈블리를 사용해야합니다. 실제로 GCC를 사용하여 수십 년 동안 지속 되어온'adc '를 사용하는 가장 좋은 방법은 인라인 어셈블리입니다. 옵션으로 인라인 어셈블리를 사용하는 것이 좋지만 GCC에서 사용하는 PITA와 같이 너무 좋지 않습니다. –