竹下世界塔の計算機よもやま話

アクセスカウンタ

zoom RSS マルチメディア命令調査:UltraSPARCのVIS命令 その1

<<   作成日時 : 2009/12/15 19:37   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

・VIS(Visual Instruction Set) SPARC V9では定義されていない。Sun UltraSPARC独自の追加仕様。
・UltraSPARC I,IIはVIS IのみだったがUltraSPARC IIIでVIS IIが追加定義された。
・富士通のSPARC64は後にSunと共同で定義したJPS1という仕様書でUltraSPARCと共通化された。
・GSR(Graphic Status Register)というステータスレジスタを使用。
・FSR(Floating Status Register)は変化しない。例外はSIAM命令。
・浮動小数点レジスタを使用。32bit長(単精度)と64bit長(倍精度)。SPARCでは浮動小数点レジスタの単精度と倍精度の指定方法に注意
・基本は3オペランド命令。

分類:
SIMD系命令
FSRC<1|2>[s] コピー、ただしFSRは無変化
fsrc1 rs1,rd 64bit
fsrc1s rs1,rd 32bit
fsrc2 rs2,rd 64bit
fsrc2s rs2,rd 32bit

FNOT<1|2>[s] 1の補数コピー(反転)、ただしFSRは無変化
fnot1 rs1,rd 64bit
fnot1s rs1,rd 32bit
fnot2 rs2,rd 64bit
fnot2s rs2,rd 32bit

FOR[s] OR演算
for rs1,rs2,rd
rd[63:0] = rs1[63:0] | rs2[63:0] 64bit OR
fors rs1,rs2,rd
rd[31:0] = rs1[31:0] | rs2[31:0] 32bit OR

FAND[s] AND演算
fand rs1,rs2,rd
rd[63:0] = rs1[63:0] & rs2[63:0] 64bit AND
fands rs1,rs2,rd
rd[31:0] = rs1[31:0] & rs2[31:0] 32bit AND

FNAND[s] NAND演算
fnand rs1,rs2,rd
rd[63:0] = not(rs1[63:0] & rs2[63:0]) 64bit NAND
fnands rs1,ts2,rd
rd[31:0] = not(rs1[31:0] & rs2[31:0]) 32bit NAND

FXOR[s] XOR演算
fxor rs1,rs2,rd
rd[63:0] = rs1[63:0] xor rs2[63:0] 64bit XOR
fxors rs1,rs2,rd
rd[31:0] = rs1[31:0] xor rs2[31:0] 32bit XOR

FXNOR[s] XNOR演算
fnxor rs1,rs2,rd
rd[63:0] = rs1[63:0] xnor rs2[63:0] 64bit XNOR
fnxors rs1,rs2,rd
rd[31:0] = rs1[31:0] xnor rs2[31:0] 32bit XNOR

FANDNOT<1|2>[s] 入力の片方がNOTであるAND演算
fandnot1 rs1,rs2,rd
rd[63:0] = not(rs1[63:0]) & rs2[63:0] 64bit
fandnot2 rs1,rs2,rd
rd[63:0] = rs1[63:0] & not(rs2[63:0]) 64bit
fandnot1s rs1,rs2,rd
rd[31:0] = not(rs1[31:0]) & rs2[31:0] 32bit
fandnot2s rs1,rs2,rd
rd[31:0] = rs1[31:0] & not(rs2[31:0]) 32bit

FORNOT<1|2>[s] 入力の片方がNOTであるOR演算
fornot1 rs1,rs2,rd
rd[63:0] = not(rs1[63:0]) | rs2[63:0] 64bit
fornot2 rs1,rs2,rd
rd[63:0] = rs1[63:0] | not(rs2[63:0]) 64bit
fornot1s rs1,rs2,rd
rd[31:0] = not(rs1[31:0]) | rs2[31:0] 32bit
fornot2s rs1,rs2,rd
rd[31:0] = rs1[31:0] | not(rs2[31:0]) 32bit

FZERO[s] すべて"0"
fzero rd
rd[63:0] = all"0" 64bit
fzeros rd
rd[31:0] = all"0" 32bit

FONE[s] すべて"1"
fone rd
rd[63:0] = all"1" 64bit
fones rd
rd[31:0] = all"1" 32bit

FPADD<16,32>[s] パックドデータの加算、キャリーは無視、ラップアラウンド
fpadd16 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rd[63:48] = rs1[63:48] + rs2[63:48]
rd[47:32] = rs1[47:32] + rs2[47:32]
rd[31:16] = rs1[31:16] + rs2[31:16]
rd[15:0] = rs1[15:0] + rs2[15:0]
fpadd16s rs1,rs2,rd - rs1,rs2,rdは単精度(32bit)
rd[31:16] = rs1[31:16] + rs2[31:16]
rd[15:0] = rs1[15:0] + rs2[15:0]
fpadd32 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rd[63:32] = rs1[63:32] + rs2[63:32]
rd[31:0] = rs1[31:0] + rs2[31:0]
fpadd32s rs1,rs2,rd - rs1,rs2,rdは単精度(32bit)
rd[31:0] = rs1[31:0] + rs2[31:0]

FPSUB<16,32>[s] パックドデータの減算、ボローは無視、ラップアラウンド
fpsub16 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rd[63:48] = rs1[63:48] ー rs2[63:48]
rd[47:32] = rs1[47:32] ー rs2[47:32]
rd[31:16] = rs1[31:16] ー rs2[31:16]
rd[15:0] = rs1[15:0] ー rs2[15:0]
fpsub16s rs1,rs2,rd - rs1,rs2,rdは単精度(32bit)
rd[31:16] = rs1[31:16] ー rs2[31:16]
rd[15:0] = rs1[15:0] ー rs2[15:0]
fpsub32 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rd[63:32] = rs1[63:32] ー rs2[63:32]
rd[31:0] = rs1[31:0] ー rs2[31:0]
fpsub32s rs1,rs2,rd - rs1,rs2,rdは単精度(32bit)
rd[31:0] = rs1[31:0] ー rs2[31:0]

FMUL8x16 8bit×16bitの結果24bitを丸めて上位16bitを格納。
fmul8x16 rs1,rs2,rd - rs1は単精度(32bit),rs2,rdは倍精度(64bit)
rs1は符号なし8bitが4個、rs2は符号付き16bitが4個。
rd[63:48] = rs2[63:48] × rs1[31:24] ,結果24bitを上位16bitに丸めて格納
rd[47:32] = rs2[47:32] × rs1[23:16] , 〃
rd[31:16] = rs2[31:16] × rs1[15:8] , 〃
rd[15:0] = rs2[15:0] × rs1[7:0] , 〃

FMUL8x16[AU|AL] 8bit×16bitの結果24bitを丸めて上位16bitを格納。
fmul8x16au rs1,rs2,rd - rs1,rs2は単精度(32bit),rdは倍精度(64bit)
rs1は符号なし8bitが4個、rs2は符号付き16bit(上位ビット)
rd[63:48] = rs2[31:16] × rs1[31:24] ,結果24bitを上位16bitに丸めて格納
rd[47:32] = rs2[31:16] × rs1[23:16] , 〃
rd[31:16] = rs2[31:16] × rs1[15:8] , 〃
rd[15:0] = rs2[31:16] × rs1[7:0] , 〃
fmul8x16al rs1,rs2,rd - rs1,rs2は単精度(32bit),rdは倍精度(64bit)
rs1は符号なし8bitが4個、rs2は符号付き16bit(下位ビット)
rd[63:48] = rs2[15:0] × rs1[31:24] ,結果24bitを上位16bitに丸めて格納
rd[47:32] = rs2[15:0] × rs1[23:16] , 〃
rd[31:16] = rs2[15:0] × rs1[15:8] , 〃
rd[15:0] = rs2[15:0] × rs1[7:0] , 〃

FMUL8[SU|UL]x16 8bit×16bitの結果24bitを丸めて上位16bitを格納。
fmul8sux16 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rs1は符号付き16bitの上位8bitが4個、rs2は符号付き16bitが4個
rd[63:48] = rs1[63:56] × rs2[63:48] ,結果24bitを上位16bitに丸めて格納
rd[47:32] = rs1[47:40] × rs2[47:32] , 〃
rd[31:16] = rs1[31:24] × rs2[31:16] , 〃
rd[15:0] = rs1[15:8] × rs2[15:0] , 〃
fmul8ulx16 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
rs1は符号付き16bitの下位8bit(符号なし)が4個、rs2は符号付き16bitが4個
rd[63:48] = rs1[55:48] × rs2[63:48] ,結果24bitを上位16bitに丸めて格納
rd[47:32] = rs1[39:32] × rs2[47:32] , 〃
rd[31:16] = rs1[23:16] × rs2[31:16] , 〃
rd[15:0] = rs1[7:0] × rs2[15:0] , 〃

FMULD8[SU|UL]x16 8bit×16bitの結果24bitを格納。
fmuld8sux16 rs1,rs2,rd - rs1,rs2は単精度(32bit),rdは倍精度(64bit)
rs1は符号付き16bitの上位8bitが2個、rs2は符号付き16bitが2個
rd[53:40] = rs1[31:24] × rs2[31:16]
rd[39:32] = "00000000"
rd[31:8] = rs1[15:8] × rs2[15:0]
rd[7:0] = "00000000"
fmuld8ulx16 rs1,rs2,rd - rs1,rs2は単精度(32bit),rdは倍精度(64bit)
rs1は符号付き16bitの下位8bit(符号なし)が2個、rs2は符号付き16bitが2個
rd[53:32] = rs1[23:16] × rs2[31:16]
rd[31:0] = rs1[7:0] × rs2[15:0]
※fpadd32と組み合わせると16bit×16bit=32bitが計算できる

FCMP<16,32> 符号付きSIMD比較
fcmp[gt,le,eq,ne,lt,ge]16 16bitずつ比較
Rd[3] = rs1[63:48] 比較 rs2[63:48]
Rd[2] = rs1[47:32] 比較 rs2[47:32]
Rd[1] = rs1[31:16] 比較 rs2[31:16]
Rd[0] = rs1[15:0] 比較 rs2[15:0]
Rd[63:4] = all"0"
fcmp[gt,le,eq,ne,lt,ge] 32bitずつ比較
Rd[1] = rs1[63:32] 比較 rs2[63:32]
Rd[0] = rs1[31:0] 比較 rs2[31:0]
Rd[63:2] = all"0"

浮動小数点レジスタの32bitも対象にしているのでやや複雑。ただしSPARCの浮動小数点レジスタは倍精度の下位、上位が単精度のレジスタに対応するので都合がよいこともある。
乗算命令は8x16bitしか持っていないみたい。加算と組み合わせて16x16bitを実現している。
飽和演算はない。

命令が多いので続きは次回。

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
マルチメディア命令調査:MIPS Vのマルチメディア拡張MDMX
 呼び方が「マッドマックス」というMIPSの3Dマルチメディア命令拡張。1996年にMicroprocessor Forumで発表されたもの。 ...続きを見る
竹下世界塔の計算機よもやま話
2013/02/25 01:44

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
URL(任意)
本 文




マルチメディア命令調査:UltraSPARCのVIS命令 その1 竹下世界塔の計算機よもやま話/BIGLOBEウェブリブログ
文字サイズ:       閉じる