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

アクセスカウンタ

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

<<   作成日時 : 2009/12/25 03:33   >>

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

SPARCのVIS命令続き。

GSR(Graphics Status Register)について
GSR.mask (GSR[63:32]) BMASK,BSHUFFLE命令で使用
GSR.im (GSR[27]),GSR.irnd(GSR[26:25]) SIAM命令で設定 FSRの丸め設定を上書きする
GSR.scale(GSR[7:3]) FPACK命令で使用
GSR.align(GSR[2:0]) ALIGNADDRESS,FALIGNDATA命令で使用

FPACK<16|32|FIX>
fpack16 rs2,rd - rs2は倍精度(64bit),rdは単精度(32bit)
GSR.scaleの設定に従い、16bitの値を8bitに丸める。GSR.scaleは下4bitしか参照しない。
rd[31:24] = rs2[63:48]{GSR.scale[3:0]}
rd[23:16] = rs2[47:32]{GSR.scale[3:0]}
rd[15:8] = rs2[31:16]{GSR.scale[3:0]}
rd[7:0] = rs2[15:0]{GSR.scale[3:0]}
 丸め方法
 元の16bitの値の下にGSR.scale[3:0]で示される数の"0"を追加する。この値の[6]を負の∞方向へ丸めて符号付き8bit [14:7]を得る。

fpack32 rs1,rs2,rd - rs1,rs2,rdは倍精度(64bit)
GSR.scaleの設定に従い、rs2の32bitの値2つを8bitに丸める。rs1の値はバイト単位で左シフトして格納する。
rd[63:56] = rs1[55:48]
rd[55:48] = rs1[47:40]
rd[47:40] = rs1[39:32]
rd[39:32] = rs2[63:32]{GSR.scale}
rd[31:24] = rs1[23:16]
rd[23:16] = rs1[15:8]
rd[15:8] = rs1[7:0]
rd[7:0] = rs2[31:0]{GSR.scale}
 丸め方法
 元の32bitの値の下にGSR.scale[4:0]で示される数の"0"を追加する。この値の[23]を負の∞方向へ丸めて符号付き8bit [30:23]を得る。
※JPSの方は[31:23]とあったが誤記と思う。

fpackfix rs2,rd - rs2は倍精度(64bit),rdは単精度(32bit)
GSR.scaleの設定に従い、rs2の32bitの値2つを16bitに丸める。
rd[31:16] = rs2[63:32]{GSR.scale}
rd[15:0] = rs2[31:0]{GSR.scale}
 丸め方法
 元の32bitの値の下にGSR.scale[4:0]で示される数の"0"を追加する。この値の[15]を負の∞方向へ丸めて符号付き16bit [31:16]を得る。

FEXPAND 32bitレジスタを8bit単位で64bitに拡張。FPACK16命令に対応。
fexpand rs2,rd - rs2は単精度(32bit),rdは倍精度(64bit)
rd[63:60] = "0000"
rd[59:52] = rs2[31:24]
rd[51:48] = "0000"
rd[47:44] = "0000"
rd[43:36] = rs2[23:16]
rd[35:32] = "0000"
rd[31:28] = "0000"
rd[27:20] = rs2[15:8]
rd[19:16] = "0000"
rd[15:12] = "0000"
rd[11:4] = rs2[7:0]
rd[3:0] = "0000"

FPMERGE 32bitレジスタ2つを64bitレジスタ1つに8bit単位でmerge
fpmerge rs1,rs2,rd - rs1,rs2は単精度(32bit),rdは倍精度(64bit)
rd[63:56] = rs1[31:24]
rd[55:48] = rs2[31:24]
rd[47:40] = rs1[23:16]
rd[39:32] = rs2[23:16]
rd[31:24] = rs1[15:8]
rd[23:16] = rs2[15:8]
rd[15:8] = rs1[7:0]
rd[7:0] = rs1[7:0]

マルチメディア系命令
ALIGNADDRESS[_LITTLE] Calculate address for misaligned data access (_LITTLEはLittle endian)
alignaddr rs1,rs2,rd - Rs1,Rs2,Rdは汎用レジスタ(64bit)
tmp[63:0] = rs1[63:0] + rs2[63:0]
rd[63:3] = tmp[63:3] , rd[2:0] = "000"
GSR.align = rd[2:0]
alignaddrl rs1,rs2,rd - Rs1,Rs2,Rdは汎用レジスタ(64bit)
tmp[63:0] = rs1[63:0] + rs2[63:0]
rd[63:3] = tmp[63:3] , rd[2:0] = "000"
GSR.align = 2の補数(rd[2:0])

FALIGNDATA Perform data alignment for misaligned data ALIGNADDRESSと組み合わせて使用する
faligndata rs1,rs2,rd - Rs1,Rs2,Rdは倍精度(64bit)
rs1[63:0]とrs2[63:0]を連結し、128bit(8バイト×16)として扱う。MSB側からバイト0,バイト1,..バイト15と呼ぶ。
GSR.alignの値0〜15に従い、MSB側のバイト0,バイト1,..の位置から値を8バイト取り出してrdに格納する。

ARRAY<8|16|32> Convert 8/16/32-bit 3D address to blocked byte address
array<8|16|32> rs1,rs2,rd - Rs1,Rs2,Rdは汎用レジスタ(64bit)
rs1で示されるX,Y,Zの値を、rs2で示される要素数で計算し、rdに配列のアドレスを格納する。
integer:整数 fraction:端数
rs1[63:55] Z[8:0] integer 9bit
rs1[54:44] Z[10:0] fraction 11bit 合計20bit
rs1[43:33] Y[10:0] integer 11bit
rs1[32:22] Y[10:0] fraction 11bit 合計22bit
rs1[21:11] X[10:0] integer 11bit
rs1[10:0] X[10:0] fraction 11bit 合計22bit
配列の要素数
rs2 = 0 のとき64
rs2 = 1 のとき128
rs2 = 2 のとき256
rs2 = 3 のとき512
rs2 = 4 のとき1024
rs2 = 5 のとき2048
その他の値の時の演算結果は未定義。
X,Y,Zのinteger部分が以下のように変換される。
array8命令
rd[16:0] = Z[4:1]:Y[5:2]:X[5:2]:Z[0]:Y[1:0]:X[1:0] - 4,4,4,1,2,2bitで17bit
rs2=0のとき rd[20:17] = "0000",rd[63:21] = all"0"
rs2=1のとき rd[20:17] = "0":Z[5]:Y[6]:X[6],rd[63:21] = all"0"
rs2=2のとき rd[23:17] = Z[6:5]:Y[7:6]:X[7:6],rd[63:24] = all"0"
rs2=3のとき rd[26:17] = Z[7:5]:Y[8:6]:X[8:6],rd[63:27] = all"0"
rs2=4のとき rd[28:17] = Z[8:5]:Y[9:6]:X[9:6],rd[63:29] = all"0"
rs2=5のとき rd[30:17] = Z[8:5]:Y[10:6]:X[10:6],rd[63:31] = all"0"
array16命令
rd[17:0] = Z[4:1]:Y[5:2]:X[5:2]:Z[0]:Y[1:0]:X[1:0]:"0" - 4,4,4,1,2,2,1bitで18bit
rs2=0のとき rd[21:18] = "0000",rd[63:22] = all"0"
rs2=1のとき rd[21:18] = "0":Z[5]:Y[6]:X[6],rd[63:22] = all"0"
rs2=2のとき rd[24:18] = Z[6:5]:Y[7:6]:X[7:6],rd[63:25] = all"0"
rs2=3のとき rd[27:18] = Z[7:5]:Y[8:6]:X[8:6],rd[63:28] = all"0"
rs2=4のとき rd[29:18] = Z[8:5]:Y[9:6]:X[9:6],rd[63:30] = all"0"
rs2=5のとき rd[31:18] = Z[8:5]:Y[10:6]:X[10:6],rd[63:32] = all"0"
array32命令
rd[18:0] = Z[4:1]:Y[5:2]:X[5:2]:Z[0]:Y[1:0]:X[1:0]:"00" - 4,4,4,1,2,2,2bitで19bit
rs2=0のとき rd[22:19] = "0000",rd[63:23] = all"0"
rs2=1のとき rd[22:19] = "0":Z[5]:Y[6]:X[6],rd[63:23] = all"0"
rs2=2のとき rd[25:19] = Z[6:5]:Y[7:6]:X[7:6],rd[63:26] = all"0"
rs2=3のとき rd[28:19] = Z[7:5]:Y[8:6]:X[8:6],rd[63:29] = all"0"
rs2=4のとき rd[30:19] = Z[8:5]:Y[9:6]:X[9:6],rd[63:31] = all"0"
rs2=5のとき rd[32:19] = Z[8:5]:Y[10:6]:X[10:6],rd[63:33] = all"0"

EDGE<8|16|32>[L]cc Edge Handling (LはLittle endian)
エッジ境界条件の処理をする。
ピクセルをスキャンするループにおいて、rs1は次にレンダリングすべきピクセルのアドレス、rs2は最後のアドレス。
 この演算結果はPixel Compare(FCMP命令)やPartial Storeで使用される。
以下はbig endian動作時の場合。
edge<8|16|32> rs1,rs2,rd - Rs1,Rs2,Rdは汎用レジスタ(64bit)
1.左エッジマスクの値はrs1の下3bitから、右エッジマスクの値はrs2の下3bitから求める。
2.PSTATE.AM=0の時(64bitモード)、rs1[63:3] = rs2[63:3]ならば:rd = 左エッジマスク & 右エッジマスク
3.PSTATE.AM=1の時(32bitモード)、rs1[31:3] = rs2[31:3]ならば:rd = 左エッジマスク & 右エッジマスク
4.その他の場合は rd = 左エッジマスク
5.ccをsubccと同じ条件でセットする。

エッジマスクの値についてはJPS1-R1.0.4-Common-pub.pdfのTABLE A-4を参照

EDGE<8|16|32>[L]N Edge Handling no cc
整数のコンディションコードが変化しないことを除きEDGE<8|16|32>[L]ccと同じ動作。

PDIST Pixcel component distance 画像圧縮アルゴリズムで使われる
pdist rs1,rs2,rd rs1,rs2,rdは倍精度(64bit) 8bitずつ引き算し、その結果の和をrdに加える。
rd = rd + abs(rs1[63:56]-rs2[63:56])
+ abs(rs1[55:48]-rs2[55:48])
+ abs(rs1[47:40]-rs2[47:40])
+ abs(rs1[39:32]-rs2[39:32])
+ abs(rs1[31:24]-rs2[31:24])
+ abs(rs1[23:16]-rs2[23:16])
+ abs(rs1[15:8]-rs2[15:8])
+ abs(rs1[7:0]-rs2[7:0])

バイト操作命令
BMASK Byte Mask GSRに32bitのマスクビットを設定。BSHUFFLE命令で使用する。
bmask Rs1,Rs2,Rd - Rs1,Rs2,Rdは汎用レジスタ
Rd = Rs1 + Rs2 , GSR.mask = Rd[31:0] - GSR[63:32]=GSR.mask
BSHUFFLE GSR.maskの32bit指定に従いバイト並び替え
bshuffle Rs1,Rs2,Rd - Rs1,Rs2,Rdは倍精度(64bit)
Rs1:Rs2を連結した128bit(16バイト)が対象。結果はRdに格納。
 16バイトはMSBから0,1,2,...,15と位置を数える。
Rd[63:56] = Rs1:Rs2{GSR.mask[31:28]} GSR.mask[31:28]の4bitで表現される0〜15の値でバイト位置を指定
Rd[55:48] = Rs1:Rs2{GSR.mask[27:24]} GSR.mask[27:24]の 〃
Rd[47:40] = Rs1:Rs2{GSR.mask[23:20]} GSR.mask[23:20]の 〃
Rd[39:32] = Rs1:Rs2{GSR.mask[19:16]} GSR.mask[19:16]の 〃
Rd[31:24] = Rs1:Rs2{GSR.mask[15:12]} GSR.mask[15:12]の 〃
Rd[23:17] = Rs1:Rs2{GSR.mask[11:8]} GSR.mask[11:8]の 〃
Rd[16:8] = Rs1:Rs2{GSR.mask[7:4]} GSR.mask[7:4]の 〃
Rd[7:0] = Rs1:Rs2{GSR.mask[3:0]} GSR.mask[3:0]の 〃

※ここから下の命令はSIMDやマルチメディアとほとんど関係がない拡張。

ロード/ストア命令(ASIアクセス)
LDBLOCKF Block loads
STBLOCKF Block stores
浮動小数点レジスタ64バイト(=倍精度8本)をまとめてロード/ストア。
現在は使用非推奨命令。代わりにLDX命令の並びを使うこと。
当初メモリ転送の性能向上として考えられていたが(汎用レジスタを使わないので影響がない)、UltraSPARCT1/T2で浮動小数点ユニットの数がコア数より少なく性能がでなくなるため。

STPARTIALF Partial Store instructions
64bitデータ(倍精度)のうち、Rs2で指定したビット位置のバイト/ワード/ダブルワードのみをストアする。
バイトストアはRs2の下位8bitで指定。
ワードストアはRs2の下位4bitで指定。
ダブルワードストアはRs2の下位2bitで指定。

LDSHORTF Short floating-point loads
STSHORTF Short floating-point stores
浮動小数点レジスタに対する8bit/16bitのロード/ストア。

LDTXA Load Integer Twin Extended Word from Alternate Space VIS2+
すべてのUltraSPARCで実装しているわけではない。ソフトウェアエミュレーションの場合がある。
2本の連続した汎用レジスタにロードする。64bit+64bit=128bitロード。偶数レジスタを指定し、続く奇数レジスタとのペアにロードされる。奇数レジスタを指定したらIllegal_instruction発生。

浮動小数点命令
SIAM Set Interval Arithmetic Mode GSR.imとGSR.imdをセットする。GSR.imが"1"ならFSR.rdの丸め指定に優先してGSR.imdが丸め指定として使われる。
これはWRASRよりも早い設定ができる。(ASRアクセス命令は先行する命令の完了を待ってから行われるため、浮動小数点で丸めモードを変えたい時に都合が悪い)
siam mode

その他の命令
SHUTDOWN
shutdown 特権モードではNOP扱い。UltraSPARCI,IIではCPUをローパワーモードにして割り込み(XIR)待ちにする。現在は使用非推奨命令。

・FSRを操作しない。SIAM命令はGSRを設定することでFSRの設定を上書きするだけ。
・整数レジスタを使用する命令(マルチメディア系)と浮動小数点を操作する命令(SIMD系)が入り混じっている。

参考文献:
UltraSPARC Archtecture 2007 Draft D0.9.2,19 jun 2008
SPARC Joint Programming Specification(JPS1):Commonality Release 1.0.4, 31 May 2002 ※fpack32のFIGUREA-13 FPACK32 Operationに誤記あり。
VIS InstructionSet User'sManual
http://www.sun.com/processors/manuals/805-1394.pdf

テーマ

注目テーマ 一覧


月別リンク

ブログ気持玉

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

トラックバック(1件)

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

トラックバック用URL help


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

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

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




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