FP16のサポート

Armv8.1-Mでは、FPUとHeliumの両方で、FP16をサポートする(ただしOption扱い)。Armによれば、特に音声処理におけるPre-Processingでこれが有用であるとしている。音声の場合、精度はそこまで必要ではないが、ダイナミックレンジを確保するためにはFixed Pointでは十分ではないとしており、FP16を利用することでデータのダイナミックレンジを確保しつつメモリ帯域削減や演算処理の高速化(FPUの場合でも、FP16ではFP32の倍の処理速度になるとされている)が図れるとしている。

TrustZoneの対象にFPUを追加

これはちょっとプログラミングの話になる。Armv8-MでTrustZoneを利用するために、Armの定義するACLE(Arm C Language Extention)の中でCMSE(Cortex-M Security Extension)と呼ばれる要件が定義されている。

このCMSEの1つに、Non-SecureなプログラムがSecure APIを呼び出す際には、Secure Function Epilogue(Secure APIの最後にコンパイラが自動的に挿入するコード)の中で、FPSCR(Floating Point Status and Control Register)をクリアする事が求められている。これはSecure API内での振る舞いがNon-Secureなプログラム側に漏れる事を防止するための措置で、仕方ないといえば仕方ないのだが、この結果としてFPUの設定(例えば誤差の丸めモードの設定)が変わってしまうなどの問題が発生する。

Armv8.1-Mではこの問題への対処として、新たにFPCXT_NS(Saves and restores the Non-secure FP context)というレジスタが追加されており、Secure APIを呼び出す際にまずNon-SecureなFPSCRの状態をFPCXT_NSに保存し、Secure Function Epilogueの中でFPCXT_NSからFPSCRに状態を戻すという処理が追加されることになった。これにより、TrustZoneを利用してもFPUのモードが変更されたりすることなくなった、という話である。

ちなみに他の機能追加として、メモリアクセス(VLDR/VSTR)とFPUレジスタアクセス(VMRS/MVSR)が強化された他、レジスタバンクのコンテクストクリア(CLRM/VSCCLRM)命令が追加されている。

(次回は2月24日に掲載します)