12.2 ARMv6 SIMD intrinsics, summary descriptions, byte lanes, affected flags

The following table describes each ARMv6 SIMD intrinsic, providing a summary description together with information about byte lanes and affected flags.

Table 12-2 ARMv6 SIMD intrinsics, summary descriptions, byte lanes, affected flags

Intrinsic Summary description Byte lanes Affected flags
Returns Operands
__qadd16 2 x 16-bit addition, saturated to range -215 x ≤ 215 - 1. int16x2 int16x2, int16x2 None
__qadd8 4 x 8-bit addition, saturated to range -27 x ≤ 27 - 1. int8x4 int8x4, int8x4 None
__qasx Exchange halfwords of second operand, add high halfwords, subtract low halfwords, saturating in each case. int16x2 int16x2, int16x2 None
__qsax Exchange halfwords of second operand, subtract high halfwords, add low halfwords, saturating in each case. int16x2 int16x2, int16x2 None
__qsub16 2 x 16-bit subtraction with saturation. int16x2 int16x2, int16x2 None
__qsub8 4 x 8-bit subtraction with saturation. int8x4 int8x4, int8x4 None
__sadd16 2 x 16-bit signed addition. int16x2 int16x2, int16x2 APSR.GE bits
__sadd8 4 x 8-bit signed addition. int8x4 int8x4, int8x4 APSR.GE bits
__sasx Exchange halfwords of second operand, add high halfwords, subtract low halfwords. int16x2 int16x2, int16x2 APSR.GE bits
__sel Select each byte of the result from either the first operand or the second operand, according to the values of the GE bits. For each result byte, if the corresponding GE bit is set, the byte from the first operand is selected, otherwise the byte from the second operand is selected. Because of the way that int16x2 operations set two (duplicate) GE bits per value, the __sel intrinsic works equally well on (u)int16x2 and (u)int8x4 data. uint8x4 uint8x4, uint8x4 None
__shadd16 2x16-bit signed addition, halving the results. int16x2 int16x2, int16x2 None
__shadd8 4x8-bit signed addition, halving the results. int8x4 int8x4, int8x4 None
__shasx Exchange halfwords of the second operand, add high halfwords and subtract low halfwords, halving the results. int16x2 int16x2, int16x2 None
__shsax Exchange halfwords of the second operand, subtract high halfwords and add low halfwords, halving the results. int16x2 int16x2, int16x2 None
__shsub16 2x16-bit signed subtraction, halving the results. int16x2 int16x2, int16x2 None
__shsub8 4x8-bit signed subtraction, halving the results. int8x4 int8x4, int8x4 None
__smlad 2x16-bit multiplication, adding both results to third operand. int32 int16x2, int16x2, int32 Q bit
__smladx Exchange halfwords of the second operand, 2x16-bit multiplication, adding both results to third operand. int16x2 int16x2, int16x2 Q bit
__smlald 2x16-bit multiplication, adding both results to third operand. Overflow in addition is not detected. int64 int16x2, int16x2, int64 None
__smlaldx Exchange halfwords of second operand, perform 2x16-bit multiplication, adding both results to third operand. Overflow in addition is not detected. int64 int16x2, int16x2, int64 None
__smlsd 2x16-bit signed multiplications. Take difference of products, subtract high halfword product from low halfword product, add difference to third operand. int32 int16x2, int16x2, int32 Q bit
__smlsdx Exchange halfwords of second operand, then 2x16-bit signed multiplications. Product difference is added to a third accumulate operand. int32 int16x2, int16x2, int32 Q bit
__smlsld 2x16-bit signed multiplications. Take difference of products, subtracting high halfword product from low halfword product, and add difference to third operand. Overflow in addition is not detected. int64 int16x2, int16x2, int64 None
__smlsldx Exchange halfwords of second operand, then 2x16-bit signed multiplications. Take difference of products, subtracting high halfword product from low halfword product, and add difference to third operand. Overflow in addition is not detected. int64 int16x2, int16x2, u64 None
__smuad 2x16-bit signed multiplications, adding the products together. int32 int16x2, int16x2 Q bit
__smusd 2x16-bit signed multiplications. Take difference of products, subtracting high halfword product from low halfword product. int32 int16x2, int16x2 None
__smusdx 2x16-bit signed multiplications. Product of high halfword of first operand and low halfword of second operand is subtracted from product of low halfword of first operand and high halfword of second operand, and difference is added to third operand. int32 int16x2, int16x2 None
__ssat16 2x16-bit signed saturation to a selected width. int16x2 int16x2, /*constant*/ unsigned int Q bit
__ssax Exchange halfwords of second operand, subtract high halfwords and add low halfwords. int16x2 int16x2, int16x2 APSR.GE bits
__ssub16 2x16-bit signed subtraction. int16x2 int16x2, int16x2 APSR.GE bits
__ssub8 4x8-bit signed subtraction. int8x4 int8x4 APSR.GE bits
__smuadx Exchange halfwords of second operand, perform 2x16-bit signed multiplications, and add products together. int32 int16x2, int16x2 Q bit
__sxtab16 Two values at bit positions [23:16][7:0] are extracted from second operand, sign-extended to 16 bits, and added to first operand. int16x2 int8x4, int16x2 None
__sxtb16 Two values at bit positions [23:16][7:0] are extracted from the operand and sign-extended to 16 bits. int16x2 int8x4 None
__uadd16 2x16-bit unsigned addition. uint16x2 uint16x2, uint16x2 APSR.GE bits
__uadd8 4x8-bit unsigned addition. uint8x4 uint8x4, uint8x4 APSR.GE bits
__uasx Exchange halfwords of second operand, add high halfwords and subtract low halfwords. uint16x2 uint16x2, uint16x2 APSR.GE bits
__uhadd16 2x16-bit unsigned addition, halving the results. uint16x2 uint16x2, uint16x2 None
__uhadd8 4x8-bit unsigned addition, halving the results. uint8x4 uint8x4, uint8x4 None
__uhasx Exchange halfwords of second operand, add high halfwords and subtract low halfwords, halving the results. uint16x2 uint16x2, uint16x2 None
__uhsax Exchange halfwords of second operand, subtract high halfwords and add low halfwords, halving the results. uint16x2 uint16x2, uint16x2 None
__uhsub16 2x16-bit unsigned subtraction, halving the results. uint16x2 uint16x2, uint16x2 None
__uhsub8 4x8-bit unsigned subtraction, halving the results. uint8x4 uint8x4 None
__uqadd16 2x16-bit unsigned addition, saturating to range 0 ≤ x ≤ 216 - 1. uint16x2 uint16x2, uint16x2 None
__uqadd8 4x8-bit unsigned addition, saturating to range 0 ≤ x ≤ 28 - 1. uint8x4 uint8x4, uint8x4 None
__uqasx Exchange halfwords of second operand, perform saturating unsigned addition on high halfwords and saturating unsigned subtraction on low halfwords. uint16x2 uint16x2, uint16x2 None
__uqsax Exchange halfwords of second operand, perform saturating unsigned subtraction on high halfwords and saturating unsigned addition on low halfwords. uint16x2 uint16x2, uint16x2 None
__uqsub16 2x16-bit unsigned subtraction, saturating to range 0 ≤ x ≤ 216 - 1. uint16x2 uint16x2, uint16x2 None
__uqsub8 4x8-bit unsigned subtraction, saturating to range 0 ≤ x ≤ 28 - 1. uint8x4 uint8x4, uint8x4 None
__usad8 4x8-bit unsigned subtraction, add absolute values of the differences together, return result as single unsigned integer. uint32 uint8x4, uint8x4 None
__usada8 4x8-bit unsigned subtraction, add absolute values of the differences together, and add result to third operand. uint32 uint8x4, uint8x4, uint32 None
__usax Exchange halfwords of second operand, subtract high halfwords and add low halfwords. uint16x2 uint16x2, uint16x2 APSR.GE bits
__usat16 Saturate two 16-bit values to a selected unsigned range. Input values are signed and output values are non-negative. int16x2 int16x2, /*constant*/ unsigned int Q flag
__usub16 2x16-bit unsigned subtraction. uint16x2 uint16x2, uint16x2 APSR.GE bits
__usub8 4x8-bit unsigned subtraction. uint8x4 uint8x4, uint8x4 APSR.GE bits
__uxtab16 Two values at bit positions [23:16][7:0] are extracted from the second operand, zero-extended to 16 bits, and added to the first operand. uint16x2 uint8x4, uint16x2 None
__uxtb16 Two values at bit positions [23:16][7:0] are extracted from the operand and zero-extended to 16 bits. uint16x2 uint8x4 None
Non-ConfidentialPDF file icon PDF versionARM DUI0472J
Copyright © 2010-2013 ARM. All rights reserved.