2016-05-09 3 views
2

ARM Cコンパイラが桁上げ加算演算を行うための組み込み関数が存在するか、アセンブリ言語を使用する必要がありますか?Cでadd-with-carry用のARMコンパイラ組み込み関数がありますか?

x86では、add-with-carryには_addcarry_u64が存在します。

+0

コンパイラは、通常、 'adc'を使って32bitマシン上で' int64_t'を実装しています。 64bitプラットフォームのGNU C(gcc/clang)は、通常、 '__int128_t'をサポートしています。 –

+0

Aarch64には、gcc 5.2が使用するadc命令があります。 (2つの '__int128_t'引数を追加するには' 'adds/adc''を追加します)、Aarch64 gcc 4.8は[cmov-and-incrementの' csinc'命令を使います(http://infocenter.arm.com/help/index.jsp ?topic =/com.arm.doc.dui0802a/CSINC.html)。 [godboltの出力](https://godbolt.org/g/OujSx4)を参照してください。 IDKなぜaarch64 gcc 4.8では 'adc'だけを使うことはできません。 –

+0

私はadd-with-carryにgcc '__builtin'関数がありません:( –

答えて

3

gccの現在のバージョンには固有のものはありません。問題は「キャリーフラグ」の通信です。しかし、ARMバックエンドは、addsi3_carryinのようなADCプリミティブのセットを認識し定義しています。 exampleについては

unsigned long long big_inc(unsigned long long x) 
{ 
    return ++x; 
} 

は、あなたがこのような疑問を持っている場合、オープンソースのマルチ精度のライブラリを見て、常に有益である

big_inc(unsigned long long): 
     @ args = 0, pretend = 0, frame = 0 
     @ frame_needed = 0, uses_anonymous_args = 0 
     @ link register save eliminated. 
     adds r0, r0, #1 
     adc  r1, r1, #0 
     bx  lr 

、に変換されます。研究のないOpenSSL bignumおよびGNU MPのライブラリーがある。内在が存在しないため、(あなたの仕事のための)より明確な答えは、それが達成したいことが何であるかによって決まります。アセンブラを使用したり、特定の整数長のアセンブラを生成するスクリプトを強力に使用することができます。

+0

汎用ライブラリの多くは、[Duff's device](https://en.wikipedia.org/wiki/Duff's_device)のような処理を行い、 'int []'まで実行されます。配列は適切に '' adds''/'' adc''/'' adcs''を実行して操作を行いますが、ループの内部は効率を上げるために組み合わせることができます。それはあなたがしたいことに依存します... –

関連する問題