Я делаю программу, и на данный момент мне нужно сделать ее эффективной.
Я использую микроархитектуру Haswell (64 бит) и g ++.
Целью является использование ADC
инструкция, пока цикл не закончится.
//I removed every carry handlers from this preview, yo be more simple
size_t anum = ap[i], bnum = bp[i];
unsigned carry;
// The Carry flag is set here with an common addtion
anum += bnum;
cnum[0]= anum;
carry = check_Carry(anum, bnum);
for (int i=1; i<n; i++){
anum = ap[i];
bnum = bp[i];
//I want to remove this line and insert the __asm__ block
anum += (bnum + carry);
carry = check_Carry(anum, bnum);
//This block is not working
__asm__(
"movq -64(%rbp), %rcx;""adcq %rdx, %rcx;""movq %rsi, -88(%rbp);");
cnum[i] = anum;
}
Это CF
задавать только в первом дополнении? Или это каждый раз, когда я делаю ADC
инструкция?
Я думаю, что проблема на потеря из CF
каждый раз петля готово. Если это проблема, то как я могу ее решить?
Ты используешь как м вот так в семействе компиляторов gcc:
int src = 1;
int dst;
asm ("mov %1, %0\n\t""add $1, %0": "=r" (dst)
: "r" (src));
printf("%d\n", dst);
То есть вы можете ссылаться на переменные, а не угадывать, где они могут находиться в памяти / регистрах.
[Править] По теме переносов: не совсем понятно, чего вы хотите, но:ADC
принимает CF
в качестве ввода и производит его в качестве вывода. Тем не менее, МНОГИЕ другие инструкции смешиваются с флагами (например, те, которые используются компилятором для создания вашего цикла for), поэтому вам, вероятно, потребуется использовать некоторые инструкции для сохранения / восстановления CF (возможно LAHF/SAHF
).
Других решений пока нет …