`
xiaoer_1982
  • 浏览: 1819952 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

快乐虾

http://blog.csdn.net/lights_joy/

lights@hb165.com

本文适用于

ADSP-BF561

Visual DSP++ 5.0 (update 6)

Vdsp dual processor simulate

欢迎转载,但请保留作者信息

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的格式,而不是fract161.15格式,难怪在文档里面没有记载,嘿嘿。

2 参考资料

Vdsp(bf561)中的浮点运算(12):fract16加减运算(2009-8-17)

Vdsp(bf561)中的浮点运算(11):fract16float的转换(2009-8-17)

Vdsp(bf561)中的浮点运算(10):fract16类型表示(2009-8-17)

Vdsp(bf561)中的浮点运算(9):long doublefloat的比较(2009-8-14)

Vdsp(bf561)中的浮点运算(8):float除法运算(2009-8-14)

Vdsp(bf561)中的浮点运算(7):float乘法运算(2009-8-13)

Vdsp(bf561)中的浮点运算(6):float加减运算(2009-8-13)

Vdsp(bf561)中的浮点运算(5):float类型表示总结(2009-8-12)

Vdsp(bf561)中的浮点运算(4):FLT_MAX(2009-8-12)

Vdsp(bf561)中的浮点运算(3):FLT_MIN(2008-12-19)

Vdsp(bf561)中的浮点运算(2):float的疑问(2008-12-18)

Vdsp(bf561)中的浮点运算(1):文档的说法(2008-12-16)

分享到:
评论

相关推荐

    u-boot-1.1.6 for vdsp(bf561)

    这是将u-boot移植到VDSP的工程文件,支持的CPU为bf561,支持NandFlash和NorFlash,支持串口下载,不支持网络功能。

    uclinux-2008r1到vdsp5(bf561)的移植记录_v0.1

    这份文档记录了在vdsp5下移植bfin-uclinux-2008r1-rc8内核的过程。 适用于ADSP-BF561。

    u-boot-1.1.6-2008R1到vdsp5(bf561)的移植记录_v0.1

    这份文档记录了将u-boot-1.1.6移植到VDSP5下编译的过程。 所用的DSP为bf561,对其它blackfin系列的DSP也有一定参考意义。 欢迎转载,但请保留作者信息,谢谢!

    uboot_bf537_vdsp

    在VDSP++上面,编译的UBOOT_BF537,这个文件有bug,修改后的在我的另外一个资源里面

    uboot_bf537_VDSP5.0++

    这是在VDSP5.0++下面编译成功的uboot,支持的命令 base - print or set address offset bootm - boot application image from memory cmp - memory compare cp - memory copy crc32 - checksum calculation erase -...

    编译器VDSP_v0.1

    使用Visual DSP 5.0的一点心得。 使用ADSP-BF561。 仅供参考。

    uboot_bf537_VDSP++5.0

    uboot1.16版本,在VDSP++5.0环境下编译,适合bf537,实现了uboot的大部分的命令,功能齐全

    VDSP软件说明

    VDSP软件说明。对于visual dsp++软件的介绍,以及如何创建工程等的介绍

    vdsp查表法

    vdsp C语言编程 正弦函数查表法,专门运用于vdsp中。

    uclinux-2.6 for vdsp4.5

    这是将uclinux-2.6 for bf561的内核移植到Visual DSP 4.5下的工程文件。由于csdn空间限制,删除了Documentation及doj,dlb等中间文件或者无关的内容,请先在http://blackfin.uclinux.org/下载2.6.19.3-ADI-2007R1.1-...

    uboot1.60429.rar_uboot bf561

    本源码是uboot在bf537芯片上的移植,它是在vdsp++5.0环境下编译的,支持uboot绝大部分常用的命令,方便剪裁

    Intro_to_VDSP_transcript

    介绍Visual+DSP++开发环境的资料

    Vdsp LDF文件格式详解

    ADI Blackfin处理器 Vdsp ldf文件格式详解

    rootfs for uclinux

    与uclinux-2.6(bf561) for vdsp配合使用的根文件系统,ext2,使用时将之以hex32的格式插入到_end符号的末尾

    u-boot-1.1.6-2008R1-vdsp

    这个是将u-boot-1.1.6-2008R1移植到VDSP下的工程文件。 具体移植过程参见本人的BLOG。 http://blog.csdn.net/lights_joy/

    如何在VDSP下生成和调用DSP库

    本文将通过两个简单的例程来一步一步演示如何在VisualDSP++里创建并调用基于C 语言的DSP库文件(*.dlb)。虽然例程是基于Blackfin 处理器实的,但创建过程和调用方法依然适用于SHARC、TigerSHARC 等ADI 公司的处理器。

    bfin-uclinux-2008r1-csdn-2008-08-28.part05

    适用于ADSP-BF561。使用了优视科技BV561EVB开发板,但仅实现其DM9000的网卡驱动。 由于CSDN空间限制,请分开下载所有的8个rar文件。 也可在http://sf.net/projects/vdsp-uclinux/中下载单个的软件包。

    bfin-uclinux-2008r1-csdn-2008-08-28.part07

    适用于ADSP-BF561。使用了优视科技BV561EVB开发板,但仅实现其DM9000的网卡驱动。 由于CSDN空间限制,请分开下载所有的8个rar文件。 也可在http://sf.net/projects/vdsp-uclinux/中下载单个的软件包。

    bfin-uclinux-2008r1-csdn-2008-08-28.part02

    适用于ADSP-BF561。使用了优视科技BV561EVB开发板,但仅实现其DM9000的网卡驱动。 由于CSDN空间限制,请分开下载所有的8个rar文件。 也可在http://sf.net/projects/vdsp-uclinux/中下载单个的软件包。

    bfin-uclinux-2008r1-csdn-2008-08-28.part04

    适用于ADSP-BF561。使用了优视科技BV561EVB开发板,但仅实现其DM9000的网卡驱动。 由于CSDN空间限制,请分开下载所有的8个rar文件。 也可在http://sf.net/projects/vdsp-uclinux/中下载单个的软件包。

Global site tag (gtag.js) - Google Analytics