2017-01-09 4 views
3

SSE組み込み関数を使用して16個の8ビット整数を4で除算(または2を右にシフト)するにはどうすればよいですか?SSEを使用して8ビット整数を4(またはシフト)で割ります

+3

正しい-marchまたは-mtuneを指定すると、自動的に行われると思います。https://godbolt.org/g/jxGyFd –

+1

まず、このツールはStackOverflowのようなQ&Aページでは素晴らしいものです。私はすぐにそれをブックマークしました。また、実際の内容については、アセンブリを見ていただきありがとうございます。コンパイラが自動的にアセンブリを自動的に実行しても、アセンブリから読み込めるようにする必要があります。 – miho

+0

@RichardHodgesコードが実際にはかなり残念だが、Clangは良い仕事をしている。 – harold

答えて

4

残念ながら、8ビット要素のSSEシフト命令はありません。要素が8ビットの符号なしである場合、16ビットシフトを使用して不要な上位ビットをマスクすることができます。 8ビットについては

v = _mm_srli_epi16(v, 2); 
v = _mm_and_si128(v, _mm_set1_epi8(0x3f)); 

はそれだけで、その後8ビットにバックパック、16ビットに解凍シフトを行うことが容易になるかもしれないが、それは、可能性はほとんどfiddlierだが、それでも要素に署名しました。

+1

私はepi8を偽造するマクロを書くことで自分自身を解決しました: '' '#define _mm_srli_epi8(mm、Imm)_mm_and_si128(_mm_set1_epi8(0xFF >> Imm)、_mm_srli_epi32(mm、Imm))' '' – miho

+1

@miho:ここにインライン関数の代わりにマクロとして書くことは、実際には利点がないことに注意してください。 –

+1

@DietrichEpp:実際には、 '_mm_srli_epi32'の' Imm'が(特にデバッグビルドで)リテラル定数ではないと不平を言っています。これはインライン関数の問題である可能性がありますが、gccの現在/ 、clang、ICC。 –

関連する問題