Other Parts Discussed in Thread: TMS320F28377D
Hi,
we are running the following filter function on a F2833x Delfino:
static inline FLOAT32 filter3rdOrder(FilterStruct* FilterToCalc)
{
FilterToCalc->fl32out =
FilterToCalc->fl32b0 * FilterToCalc->fl32in
+ FilterToCalc->fl32b1 * FilterToCalc->fl32in_k1
+ FilterToCalc->fl32b2 * FilterToCalc->fl32in_k2
+ FilterToCalc->fl32b3 * FilterToCalc->fl32in_k3
- FilterToCalc->fl32a1 * FilterToCalc->fl32out_k1
- FilterToCalc->fl32a2 * FilterToCalc->fl32out_k2
- FilterToCalc->fl32a3 * FilterToCalc->fl32out_k3;
//Save outputs
FilterToCalc->fl32in_k3 = FilterToCalc->fl32in_k2;
FilterToCalc->fl32in_k2 = FilterToCalc->fl32in_k1;
FilterToCalc->fl32in_k1 = FilterToCalc->fl32in;
FilterToCalc->fl32out_k3 = FilterToCalc->fl32out_k2;
FilterToCalc->fl32out_k2 = FilterToCalc->fl32out_k1;
FilterToCalc->fl32out_k1 = FilterToCalc->fl32out;
return FilterToCalc->fl32out;
}
This functions uses the data structure:
typedef struct
{
FLOAT32 fl32in_k1; // 0x00
FLOAT32 fl32in_k2; // 0x02
FLOAT32 fl32in_k3; // 0x04
FLOAT32 fl32in_k4; // 0x06
FLOAT32 fl32in; // 0x08
FLOAT32 fl32out_k1; // 0x0a
FLOAT32 fl32out_k2; // 0x0c
FLOAT32 fl32out_k3; // 0x0e
FLOAT32 fl32out_k4; // 0x10
FLOAT32 fl32out; // 0x12
FLOAT32 fl32a0;
FLOAT32 fl32a1;
FLOAT32 fl32a2;
FLOAT32 fl32a3;
FLOAT32 fl32a4;
FLOAT32 fl32b0;
FLOAT32 fl32b1;
FLOAT32 fl32b2;
FLOAT32 fl32b3;
FLOAT32 fl32b4;
} FilterStruct;
We do apply Compiler optimization:
--opt_level=2
--opt_for_speed
When we run the filter function with cgt 6.1.6 correct and complete code is generated.
However, when using cgt 6.4.9 (or cgt 15.12.0) compiled code (checked by disassembling the obj or out file) for C instruction "FilterToCalc->fl32out_k2 = FilterToCalc->fl32out_k1;" is missing.
When we run the filter function as non-inlined function correct and complete code is generated even with cgt 6.4.9.
Is this known and expected behavior?
Thx and regards,
Dieter