我觉得我疯了。我试图在ARM组件中编写一个模拟硬件浮点加法的函数。我有一个函数float simulate_fp_add(float, float)
,目前看起来像这样:
.global simulated_fp_add
.type simulated_fp_add, %function
simulated_fp_add:
push {r3, r4, r5, r6, lr}
mov r0, r0, lsr #1
pop {r3, r4, r5, r6, pc}
我的主文件(简化版)目前只用两个任意浮点调用我的ARM函数,并以十进制和二进制形式输出结果:
#include <stdio.h>
float simulated_fp_add(float, float);
void prt_bin(unsigned int, unsigned int);
int main() {
float x,y,z;
unsigned int a,b,c;
union
{
float f;
unsigned int i;
} u;
x = 125;
y = 0.5;
u.f = x;
a = u.i;
u.f = y;
b = u.i;
c = simulated_fp_add( a, b );
u.f = c;
printf("simulated_fp_add(%d, %d) = %f\n", a, b, u.f);
printf("result in binary: ");
prt_bin(c, 32);
putchar('\n');
return 0;
}
void prt_bin(unsigned int value, unsigned int length) {
int i;
for (i=(length-1); i>=0; i--) {
if ((value >> i) & 1)
putchar('1');
else
putchar('0');
}
}
移除换档线的输出:
simulated_fp_add(1123680256, 1056964608) = 125.000000
result in binary: 01000010111110100000000000000000
带有移位的输出:
simulated_fp_add(1123680256, 1056964608) = 0.000000
result in binary: 00000000000000000000000000000000
我所有的simulation_fp_add函数都是将r0中的float移位到右边1,但结果为零?我错过了什么吗?
答案 0 :(得分:2)
你有一些对你不利的事情。
float simulated_fp_add(float, float);
c = simulated_fp_add( a, b );
u.f = c;
您正在调用一个函数,该函数采用具有浮点位模式的整数值的浮点数。在调用之前,这些值被转换为(垃圾)浮点值,这可能不是您想要的。
您正在将simulated_fp_add()
的返回值转换为unsigned int(c),然后将其转换回float(u.f)。
最后,simulated_fp_add()
对将被解释为float的值进行逻辑右移。这种效果是不可预测的,但可能会给你一个次正规浮点值,在上面的整数转换中将向下舍入为零。
您应该首先编写一小段代码,对其进行测试,然后再进行构建。从这样的事情开始:
unsigned int shift(unsigned int a);
int main() {
unsigned int a, c;
a = 5;
printf("a = %0x\n", a);
c = shift(a);
printf("c = %0x\n", c);
return 0;
}