5.43 浮動小数点演算に関するハードウェアサポートとソフトウェアサポートの違いの例

この例では、ハードウェアまたはソフトウェアの浮動小数点演算をサポートするさまざまなプロセッサでの浮動小数点演算をコンパイラが処理する方法を示します。

以下の例に、浮動小数点演算を C コードで実装する関数を示します。
float foo(float num1, float num2)
{
    float temp, temp2;
    temp = num1 + num2;
    temp2 = num2 * num2;
    return temp2 - temp;
}
サンプルの C コードをコマンドラインオプション --cpu 5TE および --fpu softvfp でコンパイルすると、コンパイラは以下に示した逆アセンブリを使用してマシンコードを生成します。この場合、__aeabi_fmul などのライブラリルーチンを呼び出して、浮動小数点演算がソフトウェアで実行されます。
||foo|| PROC
    PUSH     {r4-r6, lr}
    MOV      r4, r1
    BL       __aeabi_fadd
    MOV      r5, r0
    MOV      r1, r4
    MOV      r0, r4
    BL       __aeabi_fmul
    MOV      r1, r5
    POP      {r4-r6, lr}
    B        __aeabi_fsub
    ENDP
ただし、サンプルの C コードをコマンドラインオプション --fpu vfp でコンパイルすると、コンパイラは以下に示した逆アセンブリを使用してマシンコードを生成します。この場合、VMUL.F32 などの浮動小数点演算命令を使用して、浮動小数点演算がハードウェアで実行されます。
||foo|| PROC
    VADD.F32 s2, s0, s1
    VMUL.F32 s0, s1, s1
    VSUB.F32 s0, s0, s2
    BX       lr
    ENDP
関連する概念
5.41 浮動小数点演算に対するコンパイラサポート
5.42 デフォルトで選択されるハードウェアまたはソフトウェアによる浮動小数点サポート
5.44 ベクタ浮動小数点(VFP)アーキテクチャ
5.45 浮動小数点演算のハードウェアによる処理に関する制限
5.46 ベクタ浮動小数点(VFP)サポートコードの実装
5.47 半精度浮動小数点数に対するコンパイラおよびライブラリサポート
5.48 半精度浮動小数点数の形式
5.49 浮動小数点計算と浮動小数点リンケージに対するコンパイラサポート
5.50 浮動小数点リンケージの種類
5.51 浮動小数点リンケージと浮動小数点計算のコンパイラオプション
関連する参考文書
5.52 コンパイラオプションの浮動小数点リンケージと浮動小数点計算の要件
5.53 プロセッサおよび暗黙の浮動小数点ユニット(FPU)
8.42 --cpu=name コンパイラオプション
8.41 --cpu=list
8.87 --fpu=list
8.88 --fpu=name コンパイラオプション
関連情報
Application Binary Interface (ABI) for the ARM Architecture
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.