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

Vdsp(bf561)中的浮点运算(7):float乘法运算

阅读更多

快乐虾

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

lights@hb165.com

本文适用于

ADSP-BF561

Visual DSP++ 5.0 (update 6)

Vdsp dual processor simulate

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

1.1 Vdspfloat乘法运算的处理

vdsp下,可以很简单地用:

float mul(float x, float y)

{

float r = x * y;

return r;

}

来完成浮点乘法运算,编译器自动将里面的乘法操作转换为___float32_mul的函数调用,这个函数的调用实现在libdsp/fpmult.asm中,在这个文件的开头说明了这个函数的用法:

/***************************************************************************

Copyright (c) 2000-2008 Analog Devices Inc. All rights reserved.

****************************************************************************

File name : fpmult.asm

This function performs 32 bit floating point multiplication. Implemention

is based on the algorithm mentioned in the reference. Some more conditionS

are added in the present algorithm to take care of various testcases.

Registers used:

Operands in R0 & R1

R0 - X operand,

R1 - Y operand

R2 - R7

Special case:

1) If (x AND y) == 0, Return 0,

2) Overflow : If(Exp(x) + Exp(y) > 254,

Return 0X7F80000 or 0xFF80000

depending upon sign of X and y.

3) Underflow : If(Exp(x) + Exp(y) <= -149, RETURN 0.

Reference : Computer Architecture a Quantitative Approach 2nd Ed.

by Jhon L Hennessy and David Patterson

!!NOTE- Uses non-standard clobber set in compiler:

DefaultClobMinusBIMandLoopRegs

Remember to change the #pragma regs_clobbered in fpmult.c in softfloat if you

change this clobber set

**************************************************************/

1.2 xy都为0

看实现代码:

R2 = R0^R1; /* sign of the result of X * Y */

P0 = R2; /* Store sign */

R2 = R0 << 1; /* Remove the sign bit of X */

CC = R2 == 0;

R3 = R1 << 1; /* Remove the sign bit of Y */

CC |= AZ;

IF CC JUMP .HANDLE_ZERO_OP;

………..

.HANDLE_ZERO_OP:

// One operand is zero. If the other is NaN or inf, return NaN, otherwise

// zero

R2 = R2 | R3;

R2 = R2 >> 24;

R3 = MAXBIASEXP+1; // Max biased exponent

CC = R2 == R3;

R0 = 0;

IF !CC JUMP .SIGN_RESULT; // Return zero (signed appropriately)

R0 = -1; // return default NAN

RTS; // no regs to restore on this path

xy都为0时,直接返回0,此时的操作需要的CYCLE数为12

这里一个比较有意思的事情是0是可以有正负号的,也就是说如果计算0.0 * (-0.0),那么结果的符号位保持为负

1.3 xnan或者inf

看代码:

[--SP] = (R7:4); /* Push registers R4-R7 */

R4 = MAXBIASEXP+1; /* Max biased exponent */

/* Get exponents. */

R2 = R2 >> 24; /* Exponent of X operand */

R3 = R3 >> 24; /* Exponent of Y operand */

CC = R2 == R4;

IF CC JUMP .HANDLE_NAN_INF_X;

……………..

.HANDLE_NAN_INF_X:

// Return signed inf if X=inf, and Y is either inf or a non-zero number

// Otherwise return NaN

R5 = R1 << 1; // If Y = 0

CC = AZ; // Return NaN

IF CC JUMP .RET_DEFAULT_NAN;

CC = R3 < R4; // if y exp is valid

R5 = R1 << 9; // or if Y significand is zero

CC |= AZ;

R5 = R0 << 9; // then Y is either inf or a valid number

CC &= AZ; // And if X is inf, then return inf, otherwise NaN

IF !CC JUMP .RET_DEFAULT_NAN;

.RET_INF:

R0 = 0x7F8 (Z);

R0 <<= 21;

(R7:4) = [SP++]; /* Pop registers R4-R7 */

.SIGN_RESULT:

CC = P0 < 0; /* Extract sign, and set into result */

R0 = ROT R0 BY -1; /* by rotating back with CC */

RTS;

.RET_DEFAULT_NAN:

R0 = -1;

(R7:4) = [SP++]; /* Pop registers R4-R7 */

RTS;

l xinfyinf或者非0

结果为inf

mul(inf, inf)的结果为inf

mul(inf, 1.0)的结果为inf

此时的符号位仍然根据两个操作数的符号位来确定。

此时的操作需要的CYCLE数为53

l xinfy0

结果为NAN

l xinfy-inf

结果为-inf

1.4 ynan或者inf

看代码:

CC = R3 == R4;

IF CC JUMP .HANDLE_NAN_INF_Y;

…………..

// Handle certain identities concerning multiplying by NaNs and +/-inf

.HANDLE_NAN_INF_Y:

// Swap operands and exponents

R5 = R0;

R0 = R1;

R1 = R5;

R5 = R2;

R2 = R3;

R3 = R5;

.HANDLE_NAN_INF_X:

………..

简单交换xy,然后和上一个判断条件相同。

1.5 向上溢出

当两个操作数的指数相加大于254时,认为溢出:

// Compute result exponent, and check for overflow

R4 = BIASEXP;

R5 = R2 + R3;

R5 = R5 - R4;

R4 <<= 1; // R4 now 254, max allowed exponent

CC = R4 < R5;

IF CC JUMP .RET_INF;

……………

.RET_INF:

R0 = 0x7F8 (Z);

R0 <<= 21;

(R7:4) = [SP++]; /* Pop registers R4-R7 */

.SIGN_RESULT:

CC = P0 < 0; /* Extract sign, and set into result */

R0 = ROT R0 BY -1; /* by rotating back with CC */

RTS;

理解这段代码有点费劲,因为float能表示的最大指数是127,那么应该是大于127就认为溢出,为什么要和254做比较呢?

判断条件应该是在

(e1 – 127) + (e2 - 127) > 127

时溢出,在上面的代码里相当于等价改为e1 + e2 – 127 > 254

为何不干脆改为e1 + e2 > 381呢?

奇怪!

溢出计算时的CYCLE值为52

1.6 正常计算

在正常计算一个浮点乘法时,所用的CYCLE值为92居然比做浮点加减所用的CYCLE,一个出乎意料的结果!

1.7 向下溢出

在代码说明里给出的下溢条件是

Exp(x) + Exp(y) <= -149

为什么为是这样的条件呢?想不通!看来非得去看看Reference提及的书才行。

2 参考资料

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)

    2. **存储器支持**:BF561支持NandFlash和NorFlash两种非易失性存储器。u-boot需要包含对应的驱动,以便能够读取和写入这些存储介质。这些驱动通常位于`drivers`目录下。 3. **串口通信**:该版本的u-boot支持通过...

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

    ### uclinux-2008r1-rc8到VDSP5 (bf561)的移植知识点 #### 1. 前言 - **目标**:本移植项目旨在将uclinux-2008r1-rc8内核从bf561处理器移植到VDSP5平台上。 - **原则**:遵循uCLinux移植的基本原则,确保移植后的...

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

    ### u-boot-1.1.6-2008R1到VDSP5 (bf561) 的移植记录 ...以上是将u-boot-1.1.6移植到VDSP5 (bf561) 过程中的一些关键知识点和技术细节。希望这些内容能够帮助您更好地理解整个移植过程,并解决可能遇到的技术难题。

    uboot_bf537_VDSP++5.0

    《uboot_bf537_VDSP++5.0:嵌入式开发的关键组件与实践》 uboot_bf537_VDSP++5.0是针对ADI公司的Blackfin(BF537)处理器设计的一个特定版本的U-Boot引导加载程序。U-Boot是一款广泛应用在嵌入式系统的开源启动加载...

    编译器VDSP_v0.1

    #### 五、VDSP 4.5(BF561)中的CPLB - **LDF配置**: 配置LDF文件以支持CPLB。 - **缓存空间定义**: 定义要缓存的空间。 - ***_basiccrt.s**: 更新`*_basiccrt.s`文件以支持CPLB操作。 - **错误处理**: 处理可能出现...

    uboot_bf537_vdsp

    在描述中提到,UBOOT_BF537在这个环境下被编译,这表明用户可能遇到了与VDSP++工具链兼容性或者配置相关的问题。 然而,"这个文件有bug"指出UBOOT_BF537在原始状态下可能存在错误或缺陷,这可能涉及到代码逻辑、...

    vdsp查表法

    查表法的基本思想是预先计算一系列函数值并存储在一个数组中,当需要计算某个函数值时,直接从表中查找即可,避免了复杂的数学运算,从而大大提高了计算速度。 #### 三、vdsp中的C语言编程实践 本案例展示了如何在...

    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 -...

    u-boot-1.1.6-2008R1-vdsp

    5. **编译与烧录**:配置交叉编译工具链,编译生成适合VDSP架构的u-boot二进制文件,然后通过JTAG或串口等手段将其烧录到BF561的存储器中。 6. **测试与调试**:运行u-boot并进行功能测试,如命令行交互、加载内核...

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

    ### 如何在VDSP下生成和调用DSP库 #### 一、生成DSP库(*.dlb) 在本文中,我们将详细介绍如何在VisualDSP++环境下创建一个基于C语言的DSP库文件(*.dlb)。这个过程对于Blackfin处理器特别适用,同时也适用于其他ADI...

    Intro_to_VDSP_transcript

    通过学习“Intro_to_VDSP”资料,开发者可以深入了解VDSP的工作原理,掌握其强大的工具集,并应用到实际的DSP项目中,提高软件的效率和质量。这两个PDF文件作为学习资源,将为初学者和有经验的工程师提供宝贵的指导...

    VDSP软件说明

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

    rootfs for uclinux

    本文将深入探讨与uclinux-2.6(bf561)版本配合使用的根文件系统(rootfs)及其核心知识点,以及如何将ext2文件系统集成到VDSP(BF561)处理器中。 首先,根文件系统(rootfs)是Linux系统启动时必须的文件集合,它包含了...

    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绝大部分常用的命令,方便剪裁

    BDMA.zip_BDMA_VDSP_dma_字节内存

    标题中的“BDMA.zip_BDMA_VDSP_dma_字节内存”揭示了我们即将讨论的核心主题:BDMA(Block Direct Memory Access)技术,它与VDSP(Vector Digital Signal Processor)相关,涉及DMA(Direct Memory Access)操作...

    Vdsp LDF文件格式详解

    ### ADI Blackfin 处理器 Vdsp LDF 文件格式详解 #### 一、概述 在ADI (Analog Devices Inc.) 的Blackfin系列处理器中,`.ldf`(Linker Description File)是一种非常重要的文件类型,它主要用于描述链接器如何...

    idma.zip_VDSP++5.0百度云_pleasantb4s

    《IDMA.zip_VDSP++5.0百度云_pleasantb4s:深入解析VDSP++5.0在嵌入式系统开发中的应用》 在嵌入式系统开发领域,高性能数字信号处理(DSP)技术扮演着至关重要的角色。本文将深入探讨IDMA.zip文件中的主要内容——...

    bfin-uboot-2009r1-rc3

    描述中提到的“将uboot移植到vdsp5的工程”,暗示了这个项目是关于将U-Boot适配到Blackfin系列处理器中的BF561型号。Blackfin处理器是由 Analog Devices 公司设计的一种混合信号处理器,主要用于数字信号处理(DSP)和...

    Armv8-A Instruction Set Architecture_armv8指令集_ARMv8_源码.zip

    - **浮点运算**:浮点运算通过Advanced SIMD(SIMD即单指令多数据)进行,支持单精度和双精度浮点运算,适合多媒体处理和科学计算。 3. **寄存器**: - **通用寄存器**:AArch64拥有64个64位通用寄存器(X0-X31)...

Global site tag (gtag.js) - Google Analytics