Vdsp(bf561)中的浮点运算(6):float加减运算

一直以为float加减运算很简单,无非就是将之转换为__float32_add和__float32_sub这两个函数调用而已,然后用软件模拟进行加减运算。但真的如此简单吗?当一些让人不太舒服的条件出现的时候,还是如此吗?

1.1 Vdsp对float加减运算的处理

在vdsp下,可以很简单地用:

float add(float x, float y)
{
float r = x + y;
return r;
}
float sub(float x, float y)
{
float r = x - y;
return r;
}

来完成浮点加减运算,编译器自动将里面的加法操作转换为___float32_add的函数调用,而将减法操作转换为___float32_sub的函数调用,这两个函数的调用实现在libdsp/fpadd.asm中:

___float32_sub:
BITTGl (R1,31);  // Flip sign bit of Y, fall through to add
.align 2;
___float32_add:

从这几行代码可以看出减法无非就是把减数改变符号再用加法实现而已。

1.2 当y为0时

看__float32_add的代码:

// check for addition of 0.0
R3 = R1 << 1;  // Remove sign
CC = R3;    // If Y=0, return X
IF !CC JUMP .return_x_nopop;
………..
.return_x_nopop:
#if CHECKING_FOR_NEGZERO_RES
R1 = R0 << 1;
CC = R1;
IF !CC R0 = R1; // convert any -0.0 to 0.0
#endif
RTS;

直接返回x的值,此时的操作需要的CYCLE数为25。

1.3 当x为0时

R2 = R0 << 1;  // Remove sign
CC = R2;    // If X=0, return Y
IF !CC JUMP .return_y_nopop;
……….
.return_y_nopop:
R0 = R1;
RTS;

直接返回y的值,此时的操作需要的CYCLE数为26。

时间: 2025-01-07 16:48:58

Vdsp(bf561)中的浮点运算(6):float加减运算的相关文章

Vdsp(bf561)中的浮点运算(15):vdsp库的一个BUG

在写完fract除法之后,偶然发现在vdsp的一个头文件中提供了fract16除法运算的函数,这个文件就是VisualDSP 5.0\Blackfin\include\fract_math.h: /* Produces a result which is the fractional division of f1 by f2. Not a builtin * as written in C code. */ #pragma inline #pragma always_inline static

Vdsp(bf561)中的浮点运算(9):long double和float的比较

在默认情况下,vdsp认为double和float这两种类型是一样的,因此我们比较long double和float. 1.1 类型表示 下面是两种类型的数据表示:   float long double 字节数 4 8 符号位 1 1 指数位数 8 11 尾数位数 23 52 最小值 1.1754943508222875E-38F 2.2250738585072014E-308L 最大值 3.4028234663852886E+38F 1.797693134862315708E+308L 分辨

Vdsp(bf561)中的浮点运算(11):fract16与float的转换

vdsp提供了两个函数用以实现fract16与float之间的相互转换: fract16 float_to_fr16 (float _x); float fr16_to_float (fract16 _x); 看看这两个转换函数到底做了什么. 1.1 float_to_fr16 这个函数的原始代码在Blackfin\lib\src\libc\runtime\fl2fr.asm中,先看看它的注释: /*************************************************

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

1.1 Vdsp对float除法运算的处理 在vdsp下,可以很简单地用: float fdiv(float x, float y) { float r = x / y; return r; } 来完成浮点除法运算,编译器自动将里面的乘法操作转换为___float32_div的函数调用,这个函数的调用实现在libdsp/fpdiv.asm中,在这个文件的开头说明了这个函数的用法: /*********************************************************

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

1.1 Vdsp对float乘法运算的处理 在vdsp下,可以很简单地用: float mul (float x, float y) { float r = x * y; return r; } 来完成浮点乘法运算,编译器自动将里面的乘法操作转换为___float32_mul的函数调用,这个函数的调用实现在libdsp/fpmult.asm中,在这个文件的开头说明了这个函数的用法: /********************************************************

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

1.1 float的疑问 写一行很简单的C代码: float a = 1234.56; 用vdsp编译后的汇编代码为: R0 = 20972 ( X ) ; R0.H = 17562 ; [ FP + 0x10 ] = R0 ; 有点看不懂,呵呵,R0的值转换为十六进制就是0x449A51EC.根据vdsp文档的说法,其单精度浮点数格式为: 浮点数计算公式: 将0x449A51EC转换为二进制: 0100 0100 1001 1010 0101 0001 1110 1100 可得: Sign =

Vdsp(bf561)中的浮点运算(2):float的疑问

写一行很简单的C代码: float a = 1234.56; 用vdsp编译后的汇编代码为: R0 = 20972 ( X ) ; R0.H = 17562 ; [ FP + 0x10 ] = R0 ; 有点看不懂,呵呵,R0的值转换为十六进制就是0x449A51EC.根据vdsp文档的说法,其单精度浮点数格式为: 浮点数计算公式: 将0x449A51EC转换为二进制: 0100 0100 1001 1010 0101 0001 1110 1100 可得: Sign = 0 Mantissa =

Vdsp(bf561)中的浮点运算(12):fract16加减运算

由于减法实际可以看成加上一个负数,因此我们只需要看加法操作.fract16的加法运算由add_fr1x16函数完成: #pragma inline #pragma always_inline static fract16 add_fr1x16(fract16 __a, fract16 __b) { fract16 __rval = __builtin_add_fr1x16(__a, __b); return __rval; } 从这里可以看出我们实际可以使用__builtin_add_fr1x1

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

在vdsp提供的<VisualDSP++ 5.0 C/C++ Compiler and Library Manual for Blackfin Processors Revision 5.1, August 2008>中列出了vdsp支持的所有数据类型,其中与浮点有点的类型有: Type Bit Size Number Representation sizeof returns double 32 bits 32-bit IEEE single-precision 4 float 32 bit