AR# 61480

|

SDK、GCC - GCC ツールチェーンでの VCVTR 命令の使用方法

説明

FPU をイネーブルにした状態で ELF を表示する場合、浮動小数点の変数が整数に割り当てられると (つまり整数に変換される)、GCC では VCVY 命令が使用されます。


 

ARM の資料より抜粋:

The floating-point to integer operation normally uses the Round towards Zero rounding mode, but can optionally use the rounding mode specified by the FPSCR. (浮動小数点から整数への変換する場合、通常、端数は切り捨ててゼロにしますが、オプションで、FPSCR で指定されている丸めモードを使用することができます。)

FPSCR レジスタ ビット ファンクション FPSCR[23:22] は、丸めモードを定義します。

ソリューション

GCC ARM FPU 変換を指示する方法は現時点ではなく、この場合はアセンブリを使用する必要があります。

C プログラム言語仕様の セクション 6.3.1.4 によれば、この変換には切り捨て (ゼロへの丸め) で十分なので、ゼロに丸められます。

"When a value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero)." (浮動小数点型の値が _bool 以外の整数型に変換されるとき、小数部は切り捨てられます (ゼロに丸められるなど)。)

たとえば、次のコードは VCVTR 命令を使用するためのインライン アセンプリを使用しています。


int main (void) {
    int integer = 0;
    float floating = 1.8;

    integer = (int)floating;
    printf("Float: %.6f, Integer: %d\n", floating, integer);

    __asm__ __volatile__("flds    s15, %0" : "=m" (floating));
    __asm__ __volatile__("VCVTR.S32.F32 s15, s15;");
    __asm__ __volatile__("fsts    s15, %0" : "=m" (integer));

    printf("Float: %f, Integer: %d\n", floating, integer);

    return 0;
};
AR# 61480
日付 06/08/2018
ステータス アクティブ
種類 一般
ツール
People Also Viewed