Open3
MiniShade: ベクタシャッフル命令の実装を考える
UTS2をコンパイルした結果には いくつかのベクタシャッフル命令が含まれる 。通常のロード・ストア命令と異なりこれらの実装は自明ではないので、じっくり考える必要がある。
実装が必要な命令
現状では、4種類の命令が出力されているようだ:
VectorShuffleは OpTypeVector
で宣言されたベクタに作用する。 Compositeはより一般的 で、aggregate(= 構造体と配列)、行列、ベクタのいずれかとなる。
重要な問題として、 これらは可変長命令であるため 簡単な方法でエンコードできない。
手抜きで良さそう
実際に出力される OpCompositeConstruct
等のComposite命令を確認してみると、これらも fvec4
等vectorの型に対してのみの出力となっていた。というわけで、単純に要素間 move に展開して良さそうに見える。
例えば、アセンブリ
628: 6(float) ExtInst 1(GLSL.std.450) 43(FClamp) 626 43 17
630: 7(fvec3) CompositeConstruct 628 628 628
は float
値の 628
を3つ繰り返した fvec3
を生成するが、この CompositeConstruct
は move 命令3つに展開できる。