「Cell SPUのスカラ演算、整数演算、分岐」の編集履歴(バックアップ)一覧に戻る
- # アライメントがとれていないbyteをロードする
- # $ra : アドレス
- # $rb : 結果をいれる
-
- # $raの下位4bitは無視されるため自動的に16バイトアラインでロードされる
- lqd $rb, 0($ra)
-
- # $raの下位4bitを使って$rtをバイト単位でローテートすることでMSBに移動させる
- rotqby $rb, $rb, $ra
-
- # プリファードスロットへさらにローテート
- rotqbyi $rb, $rb, -3
-
-
- # アライメントがとれていないbyte位置へストアする
- # $ra : アドレス
- # $rb : バイトデータ
- # $rc, rd, re : テンポラリ
-
- # まずストア位置のデータをロードする
- lqd $rc, 0($ra)
-
- # バイト挿入マスクの生成
- cbd $rd, 0($ra)
-
- # シャッフル
- # rbのプリファードスロットとrcのプリファードスロット以外とを合成する
- shufb $re, $rb, $rc, $rd
-
- # ストアする
- stqd $re, 0($ra)
-
- int32_t mul_s32x2_to_s32(int32_t a, int32_t b)
- {
- return a * b;
- }
-
- # $3 : a
- # $4 : b
-
- # aの上位ハーフワードとbの下位ハーフワードを乗算
- mpyh $6,$3,$4
-
- # bの上位ハーフワードとaの下位ハーフワードを乗算
- mpyh $5,$4,$3
-
- # aの下位ハーフワードとbの下位ハーフワードを符号無しで乗算
- mpyu $3,$3,$4
-
- # 以上をすべて足し合わせる
- # 32bitに収まることが前提なので上位ハーフワード同士の乗算は行わない
- a $2,$6,$5
- a $3,$2,$3
-
- # リターン
- bi $0
-