スタッフのブログです。個以上あるコメントは受け付けない設定になってます。)2012年01月26日SHのgccでの浮動小数点演算のオプションとその生成コードSHのgccでは浮動小数点演算のオプションの指定方法が他のアーキテクチャと異なっています。それぞれどんなコードが生成されるのか確認してみました。CPUの指定と浮動小数点演算のモードの指定SH以外のアーキテクチャではCPUの種別の指定と浮動小数点演算のモードは別々のオプションを指定しますが、SHの場合はこれがひとつになっています。CPUの種別がSH4Aの場合、以下の4通りのオプションが選択できます。-m4a-nofpuでは浮動小数点演算にFPUを使用せず、ソフトウェアで演算するライブラリを呼び出します。SH以外のCPUではdouble(倍精度)の演算とfloat(単精度)の演算では別々の命令があるのが普通ですが、SHではこれらは同一の命令で、精度の種別はFPUのステータスレジスタのビットによって指定します。SHは一命令16bitに統一しているので、オペコードの中に精度を区別するビットを確保できなかったのでしょう。(2)演算の2段階で行うことになります。倍精度eと単精度を交互に使う場合でない限りは精度の指定は省略することができます。-m4a-singleは逆にデフォルト状態を単精度にします。-m4a-single-onlyは特殊なオプションで、ソースコード上でdouble(倍精度)であっても、それをfloat(単精度)に読み替えてコードを生成します。このため、全て単精度に統一するために精度を切り替えるオーバヘッドをなくすことができます。doubleが8バイトあることを決めうちにしていたり、中のbitを直接扱ったりするプログラムは正しく動作しなくなります。当然のことながら、同じプログラムの中でこれらのオプションは統一しておく必要があります。混在することはできません。y;}このプログラムを4種類のオプションでコンパイルしてみます。(以下、本質的でない行は削除してあります。元のファイルはこちらをみてください。2.L5:.long___fpscr_values.L6:.long___fpscr_values+4SHは遅延分岐するので、rtsの実行前にその次の命令を実行します。daddとfaddではfaddのときにfpscrレジスタの設定が追加されてコードが長くなっています。___fpscr_valuesと___fpscr_values+4の初期値はスタートアップルーチンでセットされています。2.L3:.long___fpscr_values.L4:.long___fpscr_values+4_fadd:fmovfr5,fr0faddfr4,fr0mov.lr14,@-r15movr15,r14movr14,r15rtsmov.l@r15+,r14さきほどとは逆にfaddはすっきりしていますが、daddは長いコードです。float.c_dadd:fmovfr4,fr0faddfr5,fr0mov.lr14,@-r15movr15,r14movr14,r15rtsmov.l@r15+,r14_fadd:fmovfr4,fr0faddfr5,fr0mov.lr14,@-r15movr15,r14movr14,r15rtsmov.l@r15+,r14daddもfaddもどちらも同じコードになっています。___addsf3というライブラリ関数を呼んでいます。余談SHはデフォルトでIEEEへの準拠の度合いが低いです。制御用マイコンから発展したせいでしょうか。-mieeeをつける必要があります。数学関数ライブラリなどをコンパイルするときには要注意です。最新コメント「最新トラックバック」は提供を終了しました。(2)タグクラウドABCadbaidlAndroidARMarmv7asmbinderbionicBootbuildbuildrootbuiltinbusyboxcccacheCELFcelfjpClangcortex-a8Cortex-A9cpuinfodalvikvmDebiandebuggerdDMAelcembeddedemulatorEventexeGCCFlashfpufroyogccGDBGingerbreadgoldfishIceCreamSandwichinitinitrdinterpreterJAVAjavacjavapjitK&Rkernelkeykzm-a9-dualKZM-A9-GTkzm-ca9-01LinarolinuxLLVMloglogcatltsimingwMIPSmultiarchndkneonnetinstallnfsnon-stopobjdumppartnerPARTNER-JetportingpowermanagementprintfpropertyPyMitepythonqemuQTQTextCodecrootstockrubysdServiceSHsimdsmpTCGtuninguartubootUbuntuuclibcUNIXUSBv8vlinkwakelockwirelessx86zygote計測QRコード京都マイクロコンピュータ。