Intel® ISA Extensions
Use hardware-based isolation and memory encryption to provide more code protection in your solutions.
1094 Discussions

absolute value of the difference between two unsigned char

hurricanezhb
Beginner
703 Views
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?
0 Kudos
6 Replies
jancino
Beginner
703 Views
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
0 Kudos
srimks
New Contributor II
703 Views
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
0 Kudos
jancino
Beginner
703 Views

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...
0 Kudos
bootchnc_rr_com
Beginner
703 Views
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.
0 Kudos
jancino
Beginner
703 Views
The question is, what do you want to do, if the result overflow...
0 Kudos
neni
New Contributor II
703 Views

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

0 Kudos
Reply