Вставьте блок `__asm__`, чтобы выполнить сложение в очень большом количестве.

Я делаю программу, и на данный момент мне нужно сделать ее эффективной.
Я использую микроархитектуру 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каждый раз петля готово. Если это проблема, то как я могу ее решить?

0

Решение

Ты используешь как м вот так в семействе компиляторов 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).

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector