SSEプログラミングの初心者ですので、誰かが私を助けてくれることを願っています。私は最近、GCC SSE組み込み関数を使用して32ビット整数の配列の合計を計算する関数を実装しました。私の実装のコードを以下に示します。 int ssum(const int *d, unsigned int len)
{
static const unsigned int BLOCKSIZE=4;
32ビットオペレーティングシステムで128ビットレジスタXMM0を使用して、charポインタ配列との間でメモリをロード/ストアしようとしています。私が試した何 は非常に簡単です: int main() {
char *data = new char[33];
for (int i = 0; i < 32; i++)
data[i] = 'a';
data[
一部のCコードでAVX2命令を使用しています。 VPERMD命令はidxに基づいaを置換することによって、2つの8整数ベクトルaとidxを取り、第三のいずれかを生成する、dst。これはdst[i] = a[idx[i]] for i in 0..7に相当します。このソースは、ソースに基づいてインデックス付けされているため、このソースをベースとしています。 ただし、計算されたインデックスは宛先ベース
最近、fp番号の小さなプログラムを書いていました。 まず、私はその後、私は二重の移動 segment .data
scanf_fmt:
db "%f%ld", 0
segment .bss
align 16, db 0
x resq 1 ; for double fp
number resq 1 ; for integer
align 16,
ゼロにされた128ビットのレジスタがあります。左にシフトしてバイトを追加します。私はそれをシフトすることができます: pslldq xmm0, 1
...しかし、私は空のスペースにalをコピーしたいと思います。次のようなものがあります: or xmm0, al
もちろん動作しません。私は影響を受けた最も低い8ビットのみを必要とします。これはループの中で、レジスタの充填にalの連続する値が使
私はxmm0の0 .. 12の範囲内の8つの符号なし8ビット数のベクトルを持っています。私は、ベクトルの各要素eで次の変換を実行します: if (e != 12)
e = 11 - e;
、番号0、1、...、11は、10、11に変更されていることを...、0〜12のに対し、変更されません。他の値は発生しません、私はそれらに何が起こるか気にしません。 この操作をSSE4命令セットで効