absolute value of the difference between two unsigned char

absolute value of the difference between two unsigned char

I have two 128-bit register xmm1, xmm2, each with 16 packed unsigned char, I want to get the absolute value of the difference between the corresponding unsigned chars, Is there an instruction to get it? Why isn't there the instruction to get it?

7 posts / 0 new
Last post
For more complete information about compiler optimizations, see our Optimization Notice.

Quoting - hurricanezhb
I have two 128-bit register xmm1, xmm2, each with 16 packed unsigned char, I want to get the absolute value of the difference between the corresponding unsigned chars, Is there an instruction to get it? Why isn't there the instruction to get it?

PSUBB xmm1, xmm2
PABSB xmm1, xmm2

- si the easyest way...
look at:
Intel 64 and IA-32 Architectures
Software Developers Manual
Volume 2B:
Instruction Set Reference, N-Z

Quoting - hurricanezhb
I have two 128-bit register xmm1, xmm2, each with 16 packed unsigned char, I want to get the absolute value of the difference between the corresponding unsigned chars, Is there an instruction to get it? Why isn't there the instruction to get it?

Probably, both unsigned char and unsigned int instructions are not supported till date.

The Intel Reference document - Intel-64 & IA-32 Architectures Software Develope's Manual, Vol.2B 4-91, Order# 253667-025US only speaks about signed bytes/words/double intergers.

~BR

Probably, both unsigned char and unsigned int instructions are not supported till date.

The Intel Reference document - Intel-64 & IA-32 Architectures Software Develope's Manual, Vol.2B 4-91, Order# 253667-025US only speaks about signed bytes/words/double intergers.

That probavly because data type char in C languages is the same as byte, I think. Both are 8 bits long and it doesn't mather whether it is signed or unsigned because in 2 complement logics it is the same...

Quoting - hurricanezhb
I have two 128-bit register xmm1, xmm2, each with 16 packed unsigned char, I want to get the absolute value of the difference between the corresponding unsigned chars, Is there an instruction to get it? Why isn't there the instruction to get it?

I am not sure psubb, pabsb will work. I'm still trying to convince myself using first principles of boolean algebra. It might depend on whether the mmx and sse vectors have associated carry/exception bits that affect subsequent operations. In other words, if psubb has an underflow that affects the subsequent pabsb operation.

Other sources say that abs value of the difference can be obtained by (a saturatedminus b) OR (b saturatedminus a). You can translate that into three vector operations using psubsb (subtraction using saturated arithmetic) and por.

The question is, what do you want to do, if the result overflow...

psubb(pmaxub(a,b), pminub(a,b))

Leave a Comment

Please sign in to add a comment. Not a member? Join today