.. embSubr コンパイラ変換関数の一覧 ======================== コンパイラ変換関数は、コンパイル時にコードが決定され、実際にプログラムで使われる値を生成します。 インライン展開され、式の右辺に使うことができます。 コンパイル時にコードが決定されるため、式は引数にとることはできず、即値あるいは単純変数のみを引数にとります。 コンパイラ変換関数は実行時関数ではないので、引数評価のためにスタックは消費しません。 数値変換系関数 -------------- **convF16Q8( "F16Q8形式で解釈可能な小数点数文字列" )** 引数にとった文字列を、F16Q8形式の固定小数点数に変換した値を返します。 variant型変数に固定小数点数の即値を代入する場合などに用います。 -128.0から127.99609375の間の値を表現する小数点数文字列であれば、指数表記でも受け付けます。 なお、浮動小数点表記から固定小数表現への変換に際してはfloorの値に切り捨てられます。 変換不能な場合にはエラーとなります。 **convF16Q12( "F16Q12形式で解釈可能な小数点数文字列" )** 引数にとった文字列を、F16Q12形式の固定小数点数に変換した値を返します。 variant型変数に固定小数点数の即値を代入する場合などに用います。 -8.0から7.999755859375の間の値を表現する小数点数文字列であれば、指数表記でも受け付けます。 なお、浮動小数点表記から固定小数表現への変換に際してはfloorの値に切り捨てられます。 変換不能な場合にはエラーとなります。 .. code-block:: none x = convF16Q12("1.5"); y = fpSqrt(byValue x); z = fpCos(byValue convF16Q12("3.14")); **convF32Q16( "F32Q16形式で解釈可能な小数点数文字列" )** 引数にとった文字列を、F32Q16形式の固定小数点数に変換した値を返します。 variant型変数に固定小数点数の即値を代入する場合などに用います。 -32768.0から32767.99998の間の値を表現する小数点数文字列であれば、指数表記でも受け付けます。 なお、浮動小数点表記から固定小数表現への変換に際してはfloorの値に切り捨てられます。 変換不能な場合にはエラーとなります。 **convF2Q8LP( "Q8LP形式で解釈可能な小数点数文字列", "小数点数文字列", "0-255整数文字列" )** 第1の引数にとった文字列を、Q8LP形式の8ビット数値に変換して返します。 Q8LPへの量子化の際に、第2の引数の小数点数文字列をスケール、第3の引数の整数文字列をゼロ点位置 として数値に変換して処理を行います。 variant型変数にQ8LP数の即値を代入する場合などに用います。 変換不能な場合にはエラーとなります。 **convWD( スカラー変数, F16形式時のQ, F32形式時のQ )** 第1引数のスカラー変数が保持する値をF16Q形式の固定小数点数としてみなしてF32Q形式の固定小数点数に変換します。 ベクタ計算演算子ではF16Q形式での処理が中心となり、スカラーでも近似初等関数などはF16Q形式を引数にとります。 しかし、F16Q形式のままでは通常の+ や -といった演算子での処理ができません。 この変換関数は、変換時に変換元の小数点以下ビット数と、変換後の小数点以下ビット数を指定することが可能です。 前後のQ値が等しい場合、符号拡張処理のみなされます。 なお、無効なQ値の組み合わせ、例えば変換元はQ=0, 変換先はQ=31などは、エラーとなります。 .. code-block:: none x = convF16Q12("1.5"); z = convF16Q12("-0.1"); a = convWD(x, 12, 16); b = convWD(z, 12, 16); y = a + b; **convDW( スカラー変数, F16形式時のQ, F32形式時のQ )** 第1引数のスカラー変数が保持する値をF32Q形式の固定小数点数としてみなしてF16Q形式の固定小数点数に変換します。 スカラー演算可能なF32Q形式数を近似初等関数の引数やベクタ計算演算子に渡せるF16Q形式に変換します。 この変換関数は、変換時に変換元の小数点以下ビット数と、変換後の小数点以下ビット数を指定することが可能ですが、 無効なQ値の組み合わせはエラーとなります。 ベクトル変数属性抽出関数 ------------------------ **vtypeOf( "大域変数名文字列" )** 引数の文字列で名前が示されるベクトル型大域変数が定義されていれば変数型を以下の数値で返します。 * 32ビット符号つき整数型ベクトルの場合 4 * 16ビット符号つき整数型ベクトルの場合 5 * 8ビット符号つき整数型ベクトルの場合 6 * 32ビット符号なし整数型ベクトルの場合 7 * 16ビット符号なし整数型ベクトルの場合 8 * 8ビット符号なし整数型ベクトルの場合 9 integer型の大域変数の場合 1を返します。ローカル変数名などを渡すとエラーを発生します。 .. code-block:: none vTest0 : u8[32] = 99, ~ vtype = vtypeOf("vTest0"); 上記の実行により変数vtypeには9が代入されます。 **nElem( "大域変数名文字列" )** 引数の文字列で名前が示されるベクトル型大域変数が定義されていれば総要素個数を返します。 .. code-block:: none vTest2 : i32[16, 16] = 0; ~ n = nElem("vTest2"); i32[16, 16]ベクトルは、実際には i32[16]ベクトルを16個集めたものです。 vTest2 は 16要素 x 16要素を全要素として持つので、上記の実行により変数nには256が代入されます。 **xElem( "大域変数名文字列" )** 引数の文字列で名前が示されるベクトル型大域変数が定義されていればx方向の要素数を返します。 .. code-block:: none vTest2 : i32[16, 16] = 0; ~ x = xElem("vTest2"); i32[16, 16]ベクトルは、実際には i32[16]ベクトルを16個集めたものです。 xElemは実ベクトルi32[16]の16要素を返します。 **eSize( "大域変数名文字列" )** 引数の文字列で名前が示されるベクトル型大域変数が定義されていれば1要素がメモリ上で占めるバイト数を返します。 .. code-block:: none vTest2 : i32[16, 16] = 0; ~ e = eSize("vTest2"); i32[16, 16]ベクトルの各要素はi32型です。1要素は4バイトなので、4が代入されます。