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

Example 33 に、浮動小数点演算を C コードで実装する関数を示します。

Example 33.  C コードでの浮動小数点演算の実装

float foo(float num1, float num2)
{
    float temp, temp2;
    temp = num1 + num2;
    temp2 = num2 * num2;
    return temp2 - temp;
}

Example 33 の C コードがコマンドラインオプション --cpu 5TE および --fpu softvfp と組み合わされると、コンパイラはExample 34 の逆アセンブリを使用してマシンコードを生成します。Example 34 では、__aeabi_fmul などのライブラリルーチンを呼び出して、浮動小数点演算がソフトウェアで実行されます。

Example 34.  ソフトウェアによる浮動小数点演算のサポート

||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

ただし、Example 33 の C コードがコマンドラインオプション --fpu vfp と組み合わされると、コンパイラはExample 35 の逆アセンブリを使用してマシンコードを生成します。Example 35 では、VMUL.F32 などの浮動小数点演算命令を使用して、浮動小数点演算がハードウェアで実行されます。

Example 35. ハードウェアによる浮動小数点演算のサポート

||foo|| PROC
    VADD.F32 s2, s0, s1
    VMUL.F32 s0, s1, s1
    VSUB.F32 s0, s0, s2
    BX       lr
    ENDP

Show/hide関連項目

Copyright © 2010-2011 ARM. All rights reserved.ARM DUI 0472EJ
Non-ConfidentialID081711