0

私はプログラムを実行していますが、この時点で効率化する必要があります。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

4

1 に答える 1

0

gcc ファミリのコンパイラでは、次のようにasmを使用します。

 int src = 1;
 int dst;

 asm ("mov %1, %0\n\t"
     "add $1, %0"
     : "=r" (dst)
     : "r" (src));

 printf("%d\n", dst);

つまり、変数がメモリ/レジスタのどこにあるかを推測するのではなく、変数を参照できます。

[編集] キャリーの件名: あなたが何を望んでいるかは完全には明らかではありませんが、:ADCCF入力として受け取り、それを出力として生成します。ただし、他の多くの命令はフラグをいじります (コンパイラが for ループを構築するために使用する可能性が高い命令など)。そのため、CF を保存/復元するためにいくつかの命令を使用する必要があります (おそらくLAHF/SAHF)。

于 2016-02-05T15:28:51.470 に答える