数値演算
asm.jsの最適化関数では、次の数値演算が利用できます。
多くの場合、演算をするたびに型は不明になります。
したがって、変数に保存する前に
変数の型を変換する'必要があります。
asm.jsでは、+(数値)はdouble変換を意味します。
また、intishの値は~~(数値)とするとsignedに変換できます。
比較演算のようにintを引数としてとれない場合は、|0などで型を変換する必要があります。
| 演算子 | 引数と戻り値 |
| +(数値) | signed→double,unsigned→double,float→double,double→double |
| -(数値) | int→intish,float→float,double→double |
| ~(数値) | intish→signed |
| !(数値) | int→int |
| (数値)+(数値) | int→intish,float?→floatish,double→double |
| (数値)-(数値) | int→intish,float?→floatish,double→double |
| (数値)*(数値) | float?→floatish,double→double |
| (数値)/(数値) | signed→intish,unsigned→intish,float?→floatish,double→double |
| (数値)%(数値) | signed→intish,unsigned→intish,double→double |
| (数値)&(数値) | intish→signed |
| (数値)|(数値) | intish→signed |
| (数値)^(数値) | intish→signed |
| (数値)<<(数値) | intish→signed |
| (数値)>>(数値) | intish→signed |
| (数値)>>>(数値) | intish→unsigned |
| (数値)==(数値) | signed→int,unsigned→int,float→int,double→int |
| (数値)!=(数値) | signed→int,unsigned→int,float→int,double→int |
| (数値)<(数値) | signed→int,unsigned→int,float→int,double→int |
| (数値)<=(数値) | signed→int,unsigned→int,float→int,double→int |
| (数値)>(数値) | signed→int,unsigned→int,float→int,double→int |
| (数値)>=(数値) | signed→int,unsigned→int,float→int,double→int |
ライブラリ関数
asm.jsの最適化関数では、次の数値演算用のライブラリ関数が利用できます。
これらの関数は、モジュール第1引数の標準ライブラリとして与える必要があります。
また、これら以外のライブラリ関数は、外部関数として扱う必要があります。
| 関数 | 引数と戻り値 | 内容 |
| Math.cos | double?→double | 引数のcosを求めます。 |
| Math.sin | double?→double | 引数のsinを求めます。 |
| Math.tan | double?→double | 引数のtanを求めます。 |
| Math.acos | double?→double | 引数のacosを求めます。 |
| Math.asin | double?→double | 引数のasinを求めます。 |
| Math.atan | double?→double | 引数のatanを求めます。 |
| Math.atan2 | (double?,double?)→double | 原点と引数の点のなす角であるatan2()を求めます。 |
| Math.exp | double?→double | eを引数乗した値を求めます。 |
| Math.log | double?→double | 引数の対数を求めます。 |
| Math.ceil | double?→double,float?->float | 引数以上で最小の整数を求めます。 |
| Math.floor | double?→double,float?->float | 引数以下で最大の整数を求めます。 |
| Math.sqrt | double?→double,float?->float | 引数の平方根を求めます。 |
| Math.abs | signed→signed,double?→double,float?->float | 引数の絶対値を求めます。 |
| Math.min | (int...)→int,(double...)→double | 最小値を求めます。 |
| Math.max | (int...)→int,(double...)→double | 最大値を求めます。 |
| Math.pow | (double?,double?)→double | 第1引数の第2引数乗を求めます。 |
| Math.imul | (int,int)→signed | 32ビット整数の乗算値を求めます。 |
| Math.fround | double→float | 引数をfloatに丸めた値を求めます。 |
| Infinity | (なし)→double | 定数です。 |
| NaN | (なし)→double | 定数です。 |
| Math.E | (なし)→double | 数学で使われる定数です。 |
| Math.LN10 | (なし)→double | 数学で使われる定数です。 |
| Math.LN2 | (なし)→double | 数学で使われる定数です。 |
| Math.LOG2E | (なし)→double | 数学で使われる定数です。 |
| Math.LOG10E | (なし)→double | 数学で使われる定数です。 |
| Math.PI | (なし)→double | 数学で使われる定数です。 |
| Math.SQRT1_2 | (なし)→double | 数学で使われる定数です。 |
| Math.SQRT2 | (なし)→double | 数学で使われる定数です。 |
型つき配列
asm.jsの最適化関数では、モジュール第3引数のメモリ配列を次のいずれかの配列に対応づけると、
配列データの読み書きができます。
配列データのアクセス時には、インデックスに右シフトをつけた形で(例えば、int32array[index>>2])呼び出す必要があります。
これら以外の型を使ったり、右シフトなしで配列にアクセスすると、
asm.jsの最適化関数ではなく、通常のJavascriptとして実行されます。
| 関数 | バイト数 | 右シフト数 | 読み込まれるデータの型 | 書き込み可能なデータ型 |
| Uint8Array | 1 | 0 | intish | intish |
| Int8Array | 1 | 0 | intish | intish |
| Uint16Array | 2 | 1 | intish | intish |
| Int16Array | 2 | 1 | intish | intish |
| Uint32Array | 4 | 2 | intish | intish |
| Int32Array | 4 | 2 | intish | intish |
| Float32Array | 4 | 2 | float? | floatish,double? |
| Float64Array | 8 | 3 | double? | float?,double? |