GNU-RX 8.3.0 で、TFU(三角関数演算器)利用方法
多分、これで、使えるようになると思う。
関数プロトタイプは以下のようになっているようだ、この定義はincludeファイルには含まれないようで、-mtfu オプションを有効にすると、内部に組み込まれるようだ。
// -mtfu=intrinsic
void __init_tfu(void);
void __builtin_rx_sincosf(float, float*, float*);
void __builtin_rx_atan2hypotf(float, float, float*, float*);
// -mtfu=intrinsic,mathlib
float __builtin_rx_sinf(float);
float __builtin_rx_cosf(float);
float __builtin_rx_atan2f(float, float);
float __builtin_rx_hypotf(float, float);
また、-mtfu オプションで TFU を有効にすると、ビルトイン変数
__TFU
が有効になる。
これら、ビルトイン関数を利用する場合、多分、事前に初期化関数を呼んでおく必要がある。
__init_tfu();
後は、普通に関数を呼べば良いものと思う。
float a = vtx::get_pi<float>() * 0.25f;
float si, co;
__builtin_rx_sincosf(a, &si, &co);
utils::format("%8.7f: %8.7f, %8.7f\n") % a % si % co;
a = vtx::get_pi<float>() * 1.75f;
si = __builtin_rx_sinf(a);
co = __builtin_rx_cosf(a);
utils::format("%8.7f: %8.7f, %8.7f\n") % a % si % co;
Start test for 'RX72N' 240[MHz]
SCI Baud rate (set): 115200
SCI Baud rate (real): 115355 (0.13 [%])
CMT rate (set): 850 [Hz]
CMT rate (real): 849 [Hz] (-0.12 [%])
0.7853982: 0.7071068, 0.7071067
5.4977875: -0.7071068, 0.7071067
GNU-RX 8.3.0 で RX72N の機能を使える事が判った。
これで、RX72N に備わっている機能で、気になっていた部分の疑問は大体解決した。
ベンチマークについては、以下のような資料がある。
RXv3 CPU搭載RXファミリ 数値計算用ライブラリ関数ベンチマーク
コンパイラーオプションの自動判別
通常の gcc ソースコードを使ってビルドした、プレーンな gcc と、ルネサス版の魔改造 gcc で、オプションを自動設定する Makefile の制御文を考えてみた。
# rx-elf-gcc compiler version check
TARGET_ISA_TEXT := $(shell rx-elf-gcc --target-help | grep ISA)
# AS_DEFS = --defsym NOT_USER=1
ifeq ($(TARGET_ISA_TEXT), )
# gcc-7.5.0 current gcc source build
CC_DEFS = -mcpu=rx600 -Wa,-mcpu=rxv2
CP_DEFS = -mcpu=rx600
else # Renesas GNU-RX gcc
CC_DEFS = -misa=v3
# CP_DEFS = -misa=v3 -mdfpu -mtfu=intrinsic,mathlib
CP_DEFS = -misa=v3 -mtfu=intrinsic,mathlib
# CP_DEFS = -misa=v3 -mdfpu
endif
これは、gcc のオプションで「--target-help」を実行して「ISA」の文字列があれば「ルネサス版」と判断するもの。