您好!
我偶然发现 Delfino F28379D 编译器的编译器错误(在 TI 编译器20.2.1和21.6.0.0上检查)。
以下是调用编译器错误的最低代码示例:
#include <stddef.h>
#include <stdlib.h>
typedef struct
{
float a; float b;
float c; float d;
float e; float f;
float in; float in_prev;
} str;
typedef struct
{
float reserved[25];
str aa;
} movd32_example;
#pragma DATA_ALIGN ( md32 , 0x40 )
movd32_example md32;
static inline void calculate(str *a, float in) {
a->c = a->a * a->in_prev + a->b * a->c;
a->in_prev = in;
a->e = a->f * (a->in - a->c);
a->d = in - a->e;
}
void main(void) {
for (;;) {
md32.aa.in = (rand() % 100) / 10.0f;
calculate(&md32.aa, md32.aa.in);
}
}
对于我的项目(已附)、链接器将 m32放置在地址0xa800 - 64字页的开头。
线
a->in_prev = in;
可通过以下指令集实现:
MOVW DP,#_md32+64 ; [CPU_ARAU] MOV32 *+XAR4[AR1],R0H ; [CPU_FPU] |30| MOVB XAR1,#58 ; [CPU_ALU] |24| MOV32 R2H,*+XAR4[AR0] ; [CPU_FPU] |24| SUBF32 R1H,R2H,R1H ; [CPU_FPU] |24| MOVD32 R4H,@$BLOCKED(_md32)+62 ; [CPU_FPU] |23|
最后一条 MOVD32指令使用直接寻址、因此需要为数据页码设置 DP 寄存器、并且在 MOVD32指令中、只传递最后6位。
MOVD32指令的预期效果为:
R4H := [md32+62:md32+63] [md32+64:md32+65] := [md32+62:md32+63]
由于 MD32+62和 MD32+64地址位于不同的64字页上、并且 DP 寄存器设置为 MD32+64页、因此 movd32指令的两个部分都执行错误。
R2H 寄存器从 MD32+126而不是 MD32+62获取值、该值写入 MD+128、可能会覆盖其他一些数据。
我附加了竞争 CCS 项目来重现这种 fenom农 神庙。
e2e.ti.com/.../movd32_5F00_compiler_5F00_error.zip