快速业务通道

Vdsp(bf561)中的浮点运算(13):fract16乘法运算

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

vdsp提供了三种不同的方式进行fract16的乘法运算。

1.1 mult_fr1x16函数

这个函数定义为:

#pragma inline
#pragma always_inline
static fract16  mult_fr1x16(fract16  __a, fract16  __b) {
fract16  __rval = __builtin_mult_fr1x16(__a, __b);
return __rval;
}

从这里可以看出我们实际可以使用__builtin_mult_fr1x16这一函数调用。

写一个很简单的程序:

typedef fract16 ft;

ft calc(ft x, ft y)
{
ft r;
r = __builtin_mult_fr1x16(x, y);
return r;
}

__builtin_mult_fr1x16展开后的汇编代码为:

// line 29
R0.L = R0.L * R1.L (T);
R0 = R0.L (X);
W[FP + 16] = R0;

因而完成这样一个运算将只需要一个cycle的时间。

这里的乘法运算使用了(T)尾缀,文档里这样解释:

Signed fraction with truncation. Truncate Accumulator 9.31 format value at bit 16. (Perform no rounding.) Saturate the result to 1.15 precision in destination register half. Result is between minimum -1 and maximum 1-2-15 (or, expressed in hex, between minimum 0x8000 and maximum 0x7FFF).

这种计算方式直接将累加器里的数进行截断而不进行任何舍入的处理。

1.2 multr_fr1x16

这个函数定义为:

/* Performs a 16-bit fractional multiplication of the two input
** parameters. The result is rounded to 16 bits. Whether the
** rounding is biased or unbiased depends what the RND_MOD bit
** in the ASTAT register is set to.
*/

#pragma inline
#pragma always_inline
static fract16  multr_fr1x16(fract16  __a, fract16  __b) {
fract16  __rval = __builtin_multr_fr1x16(__a, __b);
return __rval;
}

它实际使用__builtin_multr_fr1x16完成计算,展开后的汇编代码就是:

// line 29
R0.L = R0.L * R1.L ;
R0 = R0.L (X);
W[FP + 16] = R0;

它不使用尾缀进行乘法计算,关于这种计算方式,文档这样描述:

Signed fraction. Multiply 1.15 * 1.15 to produce 1.31 results after left-shift correction. Round 1.31 format value at bit 16. (RND_MOD bit in the ASTAT register controls the rounding.) Saturate the result to 1.15 precision in destination register half. Result is between minimum -1 and maximum 1-2-15 (or, expressed in hex, between minimum 0x8000 and maximum 0x7FFF).

也就是说它将对结果进行舍入操作,当然和截断相比,它们之间的差值最大也就是2-15。

1.3 multu_fr1x16

这个函数在文档里面没有记载,其定义为:

/* 16-bit unsigned fractional multiplication using the FU option
*/

#pragma inline
#pragma always_inline
static fract16  multu_fr1x16(fract16  __a, fract16  __b) {
fract16  __rval = __builtin_multu_fr1x16(__a, __b);
return __rval;
}

展开__builtin_multu_fr1x16的汇编代码为:

// line 29
R0.L = R0.L * R1.L (FU);
R0 = R0.L (X);
W[FP + 16] = R0;

它使用了FU尾缀进行乘法运算,文档这样描述:

Unsigned fraction. Multiply 0.16 * 0.16 to produce 0.32 results. No shift correction. Round 0.32 format value at bit 16. (RND_MOD bit in the ASTAT register controls the rounding.) Saturate the result to 0.16 precision in destination register half. Result is between minimum 0 and maximum 1-2-16 (or, expressed in hex, between minimum 0x0000 and maximum 0xFFFF).

它采用的是0.16的格式,而不是fract16的1.15格式,难怪在文档里面没有记载,嘿嘿。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号