2026年10月24日土曜日

飽和演算

unsigned char同士の演算で負の場合0になるSSE命令は?

結論だけ先に言うと、unsigned char(8bit)同士の演算で「負になったら 0 に飽和する」SSE 命令は存在します。 それは SSE2 の saturating subtract for unsigned bytes:

PSUBUSB(Packed SUBtract Unsigned Saturate Bytes) → 8bit の unsigned subtract で、結果が負になる場合 0 に飽和する。

🔍 なぜ PSUBUSB が該当するのか

SSE2 には「飽和演算(saturating arithmetic)」があり、特に unsigned byte に対しては:

  • PSUBUSB:a - b が負なら 0 に clamp

  • PADDUSB:a + b が 255 を超えたら 255 に clamp

あなたの質問は「unsigned char 同士の演算で負の場合 0 になる SSE 命令」なので、 まさに PSUBUSB がそのものです。

🧠 補足:Intel の saturating arithmetic の仕様

検索結果(Arm の saturating arithmetic の一般仕様)では:

unsigned saturating operation では、結果が negative なら 0 になる

と説明されています。 x86 SSE2 でも同じ概念があり、unsigned byte subtract の saturating 版が PSUBUSB です。

📌 使用例(C/C++ intrinsics)

cpp
#include <emmintrin.h>

__m128i a = _mm_set1_epi8(10);
__m128i b = _mm_set1_epi8(20);

// 10 - 20 = -10 → saturate to 0
__m128i r = _mm_subs_epu8(a, b);

_mm_subs_epu8 が PSUBUSB に対応します。

0 件のコメント:

コメントを投稿