32Bit Vector Prepare Functions#
 group vect_s32_prepare_api
Defines

vect_s32_add_scalar_prepare#
Obtain the output exponent and shifts required for a call to
vect_s32_add_scalar()
.The logic for computing the shifts and exponents of
vect_s32_add_scalar()
is identical to that forvect_s32_add()
.This macro is provided as a convenience to developers and to make the code more readable.
See also

vect_s32_nmacc_prepare#
Obtain the output exponent and shifts required for a call to vect_s32_nmacc().
The logic for computing the shifts and exponents of
vect_s32_nmacc()
is identical to that forvect_s32_macc_prepare()
.This macro is provided as a convenience to developers and to make the code more readable.
See also

vect_s32_scale_prepare#
Obtain the output exponent and shifts required for a call to
vect_s32_scale()
.The logic for computing the shifts and exponents of
vect_s32_scale()
is identical to that forvect_s32_mul()
.This macro is provided as a convenience to developers and to make the code more readable.
See also

vect_s32_sub_prepare#
Obtain the output exponent and shifts required for a call to
vect_s32_sub()
.The logic for computing the shifts and exponents of
vect_s32_sub()
is identical to that forvect_s32_add()
.This macro is provided as a convenience to developers and to make the code more readable.
See also
Functions

void vect_s32_add_prepare(exponent_t *a_exp, right_shift_t *b_shr, right_shift_t *c_shr, const exponent_t b_exp, const exponent_t c_exp, const headroom_t b_hr, const headroom_t c_hr)#
Obtain the output exponent and input shifts to add or subtract two 16 or 32bit BFP vectors.
The block floatingpoint functions in this library which add or subtract vectors are of the general form:
\( \bar{a} \cdot 2^{a\_exp} = \bar{b}\cdot 2^{b\_exp} \pm \bar{c}\cdot 2^{c\_exp} \) }
\(\bar b\) and \(\bar c\) are the input mantissa vectors with exponents \(b\_exp\) and \(c\_exp\), which are shared by each element of their respective vectors. \(\bar a\) is the output mantissa vector with exponent \(a\_exp\). Two additional properties, \(b\_hr\) and \(c\_hr\), which are the headroom of mantissa vectors \(\bar b\) and \(\bar c\) respectively, are required by this function.
In order to avoid any overflows in the output mantissas, the output exponent \(a\_exp\) must be chosen such that the largest (in the sense of absolute value) possible output mantissa will fit into the allotted space (e.g. 32 bits for vect_s32_add()). Once \(a\_exp\) is chosen, the input bitshifts \(b\_shr\) and \(c\_shr\) are calculated to achieve that resulting exponent.
This function chooses \(a\_exp\) to be the minimum exponent known to avoid overflows, given the input exponents ( \(b\_exp\) and \(c\_exp\)) and input headroom ( \(b\_hr\) and \(c\_hr\)).
This function is used calculate the output exponent and input bitshifts for each of the following functions:
 Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
andc_shr
produced by this function can be adjusted according to the following:exponent_t desired_exp = ...; // Value known a priori right_shift_t new_b_shr = b_shr + (desired_exp  a_exp); right_shift_t new_c_shr = c_shr + (desired_exp  a_exp);
When applying the above adjustment, the following conditions should be maintained:
b_hr + b_shr >= 0
c_hr + c_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
andc_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.
 Notes

If \(b\_hr\) or \(c\_hr\) are unknown, they can be calculated using the appropriate headroom function (e.g. vect_complex_s16_headroom() for complex 16bit vectors) or the value
0
can always be safely used (but may result in reduced precision).
See also
vect_s16_add, vect_s32_add, vect_s16_sub, vect_s32_sub, vect_complex_s16_add, vect_complex_s32_add, vect_complex_s16_sub, vect_complex_s32_sub
 Parameters:
a_exp – [out] Output exponent associated with output mantissa vector \(\bar a\)
b_shr – [out] Signed arithmetic rightshift to be applied to elements of \(\bar b\). Used by the function which computes the output mantissas \(\bar a\)
c_shr – [out] Signed arithmetic rightshift to be applied to elements of \(\bar c\). Used by the function which computes the output mantissas \(\bar a\)
b_exp – [in] Exponent of BFP vector \(\bar b\)
c_exp – [in] Exponent of BFP vector \(\bar c\)
b_hr – [in] Headroom of BFP vector \(\bar b\)
c_hr – [in] Headroom of BFP vector \(\bar c\)

void vect_s32_clip_prepare(exponent_t *a_exp, right_shift_t *b_shr, int32_t *lower_bound, int32_t *upper_bound, const exponent_t b_exp, const exponent_t bound_exp, const headroom_t b_hr)#
Obtain the output exponent, input shift and modified bounds used by vect_s32_clip().
This function is used in conjunction with vect_s32_clip() to bound the elements of a 32bit BFP vector to a specified range.
This function computes
a_exp
,b_shr
,lower_bound
andupper_bound
.a_exp
is the exponent associated with the 32bit mantissa vector \(\bar a\) computed by vect_s32_clip().b_shr
is the shift parameter required by vect_s32_clip() to achieve the output exponenta_exp
.lower_bound
andupper_bound
are the 32bit mantissas which indicate the lower and upper clipping bounds respectively. The values are modified by this function, and the resulting values should be passed along to vect_s32_clip().b_exp
is the exponent associated with the input mantissa vector \(\bar b\).bound_exp
is the exponent associated with the bound mantissaslower_bound
andupper_bound
respectively.b_hr
is the headroom of \(\bar b\). If unknown, it can be obtained using vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision).See also
 Parameters:
a_exp – [out] Exponent associated with output mantissa vector \(\bar a\)
b_shr – [out] Signed arithmetic rightshift for \(\bar b\) used by vect_s32_clip()
lower_bound – [inout] Lower bound of clipping range
upper_bound – [inout] Upper bound of clipping range
b_exp – [in] Exponent associated with input mantissa vector \(\bar b\)
bound_exp – [in] Exponent associated with clipping bounds
lower_bound
andupper_bound
b_hr – [in] Headroom of input mantissa vector \(\bar b\)

void vect_s32_dot_prepare(exponent_t *a_exp, right_shift_t *b_shr, right_shift_t *c_shr, const exponent_t b_exp, const exponent_t c_exp, const headroom_t b_hr, const headroom_t c_hr, const unsigned length)#
Obtain the output exponent and input shift used by vect_s32_dot().
This function is used in conjunction with vect_s32_dot() to compute the inner product of two 32bit BFP vectors.
This function computes
a_exp
,b_shr
andc_shr
.a_exp
is the exponent associated with the 64bit mantissa \(a\) returned by vect_s32_dot(), and must be chosen to be large enough to avoid saturation when \(a\) is computed. To maximize precision, this function choosesa_exp
to be the smallest exponent known to avoid saturation (see exception below). Thea_exp
chosen by this function is derived from the exponents and headrooms associated with the input vectors.b_shr
andc_shr
are the shift parameters required by vect_s32_dot() to achieve the chosen output exponenta_exp
.b_exp
andc_exp
are the exponents associated with the input mantissa vectors \(\bar b\) and \(\bar c\) respectively.b_hr
andc_hr
are the headroom of \(\bar b\) and \(\bar c\) respectively. If either is unknown, they can be obtained using vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision).length
is the number of elements in the input mantissa vectors \(\bar b\) and \(\bar c\). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
andc_shr
produced by this function can be adjusted according to the following:exponent_t desired_exp = ...; // Value known a priori right_shift_t new_b_shr = b_shr + (desired_exp  a_exp); right_shift_t new_c_shr = c_shr + (desired_exp  a_exp);
When applying the above adjustment, the following conditions should be maintained:
b_hr + b_shr >= 0
c_hr + c_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
orc_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.
See also
 Parameters:
a_exp – [out] Exponent associated with output mantissa \(a\)
b_shr – [out] Signed arithmetic rightshift for \(\bar b\) used by vect_s32_dot()
c_shr – [out] Signed arithmetic rightshift for \(\bar c\) used by vect_s32_dot()
b_exp – [in] Exponent associated with input mantissa vector \(\bar b\)
c_exp – [in] Exponent associated with input mantissa vector \(\bar b\)
b_hr – [in] Headroom of input mantissa vector \(\bar b\)
c_hr – [in] Headroom of input mantissa vector \(\bar b\)
length – [in] Number of elements in vectors \(\bar b\) and \(\bar c\)

void vect_s32_energy_prepare(exponent_t *a_exp, right_shift_t *b_shr, const unsigned length, const exponent_t b_exp, const headroom_t b_hr)#
Obtain the output exponent and input shift used by vect_s32_energy().
This function is used in conjunction with vect_s32_energy() to compute the inner product of a 32bit BFP vector with itself.
This function computes
a_exp
andb_shr
.a_exp
is the exponent associated with the 64bit mantissa \(a\) returned by vect_s32_energy(), and must be chosen to be large enough to avoid saturation when \(a\) is computed. To maximize precision, this function choosesa_exp
to be the smallest exponent known to avoid saturation (see exception below). Thea_exp
chosen by this function is derived from the exponent and headroom associated with the input vector.b_shr
is the shift parameter required by vect_s32_energy() to achieve the chosen output exponenta_exp
.b_exp
is the exponent associated with the input mantissa vector \(\bar b\).b_hr
is the headroom of \(\bar b\). If it is unknown, it can be obtained using vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision).length
is the number of elements in the input mantissa vector \(\bar b\). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
produced by this function can be adjusted according to the following:exponent_t desired_exp = ...; // Value known a priori right_shift_t new_b_shr = b_shr + (desired_exp  a_exp);
When applying the above adjustment, the following condition should be maintained:
b_hr + b_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.
See also
 Parameters:
a_exp – [out] Exponent of outputs of vect_s32_energy()
b_shr – [out] Rightshift to be applied to elements of \(\bar b\)
length – [in] Number of elements in vector \(\bar b\)
b_exp – [in] Exponent of vector{b}
b_hr – [in] Headroom of vector{b}

void vect_s32_inverse_prepare(exponent_t *a_exp, unsigned *scale, const int32_t b[], const exponent_t b_exp, const unsigned length)#
Obtain the output exponent and scale used by vect_s32_inverse().
This function is used in conjunction with vect_s32_inverse() to compute the inverse of elements of a 32bit BFP vector.
This function computes
a_exp
andscale
.a_exp
is the exponent associated with output mantissa vector \(\bar a\), and must be chosen to avoid overflow in the smallest element of the input vector, which when inverted becomes the largest output element. To maximize precision, this function choosesa_exp
to be the smallest exponent known to avoid saturation. Thea_exp
chosen by this function is derived from the exponent and smallest element of the input vector.scale
is a scaling parameter used by vect_s32_inverse() to achieve the chosen output exponent.b[]
is the input mantissa vector \(\bar b\).b_exp
is the exponent associated with the input mantissa vector \(\bar b\).length
is the number of elements in \(\bar b\).See also
 Parameters:
a_exp – [out] Exponent of output vector \(\bar a\)
scale – [out] Scale factor to be applied when computing inverse
b – [in] Input vector \(\bar b\)
b_exp – [in] Exponent of \(\bar b\)
length – [in] Number of elements in vector \(\bar b\)

void vect_s32_macc_prepare(exponent_t *new_acc_exp, right_shift_t *acc_shr, right_shift_t *b_shr, right_shift_t *c_shr, const exponent_t acc_exp, const exponent_t b_exp, const exponent_t c_exp, const headroom_t acc_hr, const headroom_t b_hr, const headroom_t c_hr)#
Obtain the output exponent and shifts needed by vect_s32_macc().
This function is used in conjunction with vect_s32_macc() to perform an elementwise multiplyaccumlate of 32bit BFP vectors.
This function computes
new_acc_exp
,acc_shr
,b_shr
andc_shr
, which are selected to maximize precision in the resulting accumulator vector without causing saturation of final or intermediate values. Normally the caller will pass these outputs to their corresponding inputs of vect_s32_macc().acc_exp
is the exponent associated with the accumulator mantissa vector \(\bar a\) prior to the operation, whereasnew_acc_exp
is the exponent corresponding to the updated accumulator vector.b_exp
andc_exp
are the exponents associated with the complex input mantissa vectors \(\bar b\) and \(\bar c\) respectively.acc_hr
,b_hr
andc_hr
are the headrooms of \(\bar a\), \(\bar b\) and \(\bar c\) respectively. If the headroom of any of these vectors is unknown, it can be obtained by calling vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theacc_shr
andbc_sat
produced by this function can be adjusted according to the following:// Presumed to be set somewhere exponent_t acc_exp, b_exp, c_exp; headroom_t acc_hr, b_hr, c_hr; exponent_t desired_exp; ... // Call prepare right_shift_t acc_shr, b_shr, c_shr; vect_s32_macc_prepare(&acc_exp, &acc_shr, &b_shr, &c_shr, acc_exp, b_exp, c_exp, acc_hr, b_hr, c_hr); // Modify results right_shift_t mant_shr = desired_exp  acc_exp; acc_exp += mant_shr; acc_shr += mant_shr; b_shr += mant_shr; c_shr += mant_shr; // acc_shr, b_shr and c_shr may now be used in a call to vect_s32_macc()
When applying the above adjustment, the following conditions should be maintained:
acc_shr > acc_hr
(Shifting any further left may cause saturation)b_shr => b_hr
(Shifting any further left may cause saturation)c_shr => c_hr
(Shifting any further left may cause saturation)
It is up to the user to ensure any such modification does not result in saturation or unacceptable loss of precision.
See also
 Parameters:
new_acc_exp – [out] Exponent associated with output mantissa vector \(\bar a\) (after macc)
acc_shr – [out] Signed arithmetic rightshift used for \(\bar a\) in vect_s32_macc()
b_shr – [out] Signed arithmetic rightshift used for \(\bar b\) in vect_s32_macc()
c_shr – [out] Signed arithmetic rightshift used for \(\bar c\) in vect_s32_macc()
acc_exp – [in] Exponent associated with input mantissa vector \(\bar a\) (before macc)
b_exp – [in] Exponent associated with input mantissa vector \(\bar b\)
c_exp – [in] Exponent associated with input mantissa vector \(\bar c\)
acc_hr – [in] Headroom of input mantissa vector \(\bar a\) (before macc)
b_hr – [in] Headroom of input mantissa vector \(\bar b\)
c_hr – [in] Headroom of input mantissa vector \(\bar c\)

void vect_s32_mul_prepare(exponent_t *a_exp, right_shift_t *b_shr, right_shift_t *c_shr, const exponent_t b_exp, const exponent_t c_exp, const headroom_t b_hr, const headroom_t c_hr)#
Obtain the output exponent and input shifts used by vect_s32_mul().
This function is used in conjunction with vect_s32_mul() to perform an elementwise multiplication of two 32bit BFP vectors.
This function computes
a_exp
,b_shr
,c_shr
.a_exp
is the exponent associated with mantissa vector \(\bar a\), and must be chosen to be large enough to avoid overflow when elements of \(\bar a\) are computed. To maximize precision, this function choosesa_exp
to be the smallest exponent known to avoid saturation (see exception below). Thea_exp
chosen by this function is derived from the exponents and headrooms of associated with the input vectors.b_shr
andc_shr
are the shift parameters required by vect_complex_s32_mul() to achieve the chosen output exponenta_exp
.b_exp
andc_exp
are the exponents associated with the input mantissa vectors \(\bar b\) and \(\bar c\) respectively.b_hr
andc_hr
are the headroom of \(\bar b\) and \(\bar c\) respectively. If the headroom of \(\bar b\) or \(\bar c\) is unknown, they can be obtained by calling vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
andc_shr
produced by this function can be adjusted according to the following:exponent_t desired_exp = ...; // Value known a priori right_shift_t new_b_shr = b_shr + (desired_exp  a_exp); right_shift_t new_c_shr = c_shr + (desired_exp  a_exp);
When applying the above adjustment, the following conditions should be maintained:
b_hr + b_shr >= 0
c_hr + c_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
andc_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.
 Notes

Using the outputs of this function, an output mantissa which would otherwise be
INT32_MIN
will instead saturate toINT32_MAX
. This is due to the symmetric saturation logic employed by the VPU and is a hardware feature. This is a corner case which is usually unlikely and results in 1 LSb of error when it occurs.
See also
 Parameters:
a_exp – [out] Exponent of output elements of vect_s32_mul()
b_shr – [out] Rightshift to be applied to elements of \(\bar b\)
c_shr – [out] Rightshift to be applied to elemetns of \(\bar c\)
b_exp – [in] Exponent of \(\bar b\)
c_exp – [in] Exponent of \(\bar c\)
b_hr – [in] Headroom of \(\bar b\)
c_hr – [in] Headroom of \(\bar c\)

void vect_s32_sqrt_prepare(exponent_t *a_exp, right_shift_t *b_shr, const exponent_t b_exp, const right_shift_t b_hr)#
Obtain the output exponent and shift parameter used by vect_s32_sqrt().
This function is used in conjunction withx vect_s32_sqrt() to compute the square root of elements of a 32bit BFP vector.
This function computes
a_exp
andb_shr
.a_exp
is the exponent associated with output mantissa vector \(\bar a\), and should be chosen to maximize the precision of the results. To that end, this function choosesa_exp
to be the smallest exponent known to avoid saturation of the resulting mantissa vector \(\bar a\). It is derived from the exponent and headroom of the input BFP vector.b_shr
is the shift parameter required by vect_s32_sqrt() to achieve the chosen output exponenta_exp
.b_exp
is the exponent associated with the input mantissa vector \(\bar b\).b_hr
is the headroom of \(\bar b\). If it is unknown, it can be obtained using vect_s32_headroom(). Alternatively, the value0
can always be safely used (but may result in reduced precision). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
produced by this function can be adjusted according to the following:exponent_t a_exp; right_shift_t b_shr; vect_s16_mul_prepare(&a_exp, &b_shr, b_exp, c_exp, b_hr, c_hr); exponent_t desired_exp = ...; // Value known a priori b_shr = b_shr + (desired_exp  a_exp); a_exp = desired_exp;
When applying the above adjustment, the following condition should be maintained:
b_hr + b_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.Also, if a larger exponent is used than necessary, a larger
depth
parameter (see vect_s32_sqrt()) will be required to achieve the same precision, as the results are computed bit by bit, starting with the most significant bit.
See also
 Parameters:
a_exp – [out] Exponent of outputs of vect_s32_sqrt()
b_shr – [out] Rightshift to be applied to elements of \(\bar b\)
b_exp – [in] Exponent of vector{b}
b_hr – [in] Headroom of vector{b}

void vect_2vec_prepare(exponent_t *a_exp, right_shift_t *b_shr, right_shift_t *c_shr, const exponent_t b_exp, const exponent_t c_exp, const headroom_t b_hr, const headroom_t c_hr, const headroom_t extra_operand_hr)#
Obtain the output exponent and input shifts required to perform a binary addlike operation.
This function computes the output exponent and input shifts required for BFP operations which take two vectors as input, where the operation is “addlike”.
Here, “addlike” operations are loosely defined as those which require input vectors to share an exponent before their mantissas can be meaningfully used to perform that operation.
For example, consider adding \( 3 \cdot 2^{x} + 4 \cdot 2^{y} \). If \(x = y\), then the mantissas can be added directly to get a meaningful result \( (3+4) \cdot 2^{x} \). If \(x \ne y\) however, adding the mantissas together is meaningless. Before the mantissas can be added in this case, one or both of the input mantissas must be shifted so that the representations correspond to the same exponent. Likewise, similar logic applies to binary comparisons.
This is in contrast to a “multiplylike” operation, which does not have this same requirement (e.g. \(a \cdot 2^x \cdot b \cdot 2^y = ab \cdot 2^{x+y}\), regardless of whether \(x=y\)).
For a general operation like:
\( \bar{a} \cdot 2^{a\_exp} = \bar{b}\cdot 2^{b\_exp} \oplus \bar{c}\cdot 2^{c\_exp} \)
\(\bar b\) and \(\bar c\) are the input mantissa vectors with exponents \(b\_exp\) and \(c\_exp\), which are shared by each element of their respective vectors. \(\bar a\) is the output mantissa vector with exponent \(a\_exp\). Two additional properties, \(b\_hr\) and \(c\_hr\), which are the headroom of mantissa vectors \(\bar b\) and \(\bar c\) respectively, are required by this function.
In addition to \(a\_exp\), this function computes \(b\_shr\) and \(c\_shr\), signed arithmetic rightshifts applied to the mantissa vectors \(\bar b\) and \(\bar c\) so that the addlike \(\oplus\) operation can be applied.
This function chooses \(a\_exp\) to be the minimum exponent which can be used to express both \(\bar B\) and \(\bar C\) without saturation of their mantissas, and which leaves both \(\bar b\) and \(\bar c\) with at least
extra_operand_hr
bits of headroom. The shifts \(b\_shr\) and \(c\_shr\) are derived from \(a\_exp\) using \(b\_exp\) and \(c\_exp\). Adjusting Output Exponents

If a specific output exponent
desired_exp
is needed for the result (e.g. for emulating fixedpoint arithmetic), theb_shr
andc_shr
produced by this function can be adjusted according to the following:exponent_t desired_exp = ...; // Value known a priori right_shift_t new_b_shr = b_shr + (desired_exp  a_exp); right_shift_t new_c_shr = c_shr + (desired_exp  a_exp);
When applying the above adjustment, the following conditions should be maintained:
b_hr + b_shr >= 0
c_hr + c_shr >= 0
Be aware that using smaller values than strictly necessary for
b_shr
andc_shr
can result in saturation, and using larger values may result in unnecessary underflows or loss of precision.
 Notes

If \(b\_hr\) or \(c\_hr\) are unknown, they can be calculated using the appropriate headroom function (e.g. vect_complex_s16_headroom() for complex 16bit vectors) or the value
0
can always be safely used (but may result in reduced precision).
 Parameters:
a_exp – [out] Output exponent associated with output mantissa vector \(\bar a\)
b_shr – [out] Signed arithmetic rightshift to be applied to elements of \(\bar b\). Used by the function which computes the output mantissas \(\bar a\)
c_shr – [out] Signed arithmetic rightshift to be applied to elements of \(\bar c\). Used by the function which computes the output mantissas \(\bar a\)
b_exp – [in] Exponent of BFP vector \(\bar b\)
c_exp – [in] Exponent of BFP vector \(\bar c\)
b_hr – [in] Headroom of BFP vector \(\bar b\)
c_hr – [in] Headroom of BFP vector \(\bar c\)
extra_operand_hr – [in] The minimum amount of headroom that will be left in the mantissa vectors following the arithmetic rightshift, as required by some operations.

vect_s32_add_scalar_prepare#