我正在写一些内在的微基准测试,并且我遇到了gcc试图优化掉东西的大问题。
一个。如果我没有用"输入" /"输出"来加载/存储,gcc会尝试提升周围的东西"输入"并消除周围的东西"输出"。
预期的行为,但很烦人。
因此,为了避免(A)中的情况,我必须尝试(B):
B.实际从内存加载输入,并将输出写入内存。
但我不想将输入/存储输出加载到数组中,因为地址计算会弄乱我的微基准。
不幸的是,我无法使用多个加载输入/存储输出到单个地址:gcc总是优化它们。
volatile也不起作用,它会产生如下错误:
>> static volatile float y2[] = ...
>> vst1_f32(y2, t1); //eliminated
>> vst1_f32(y2, t2);
error: invalid conversion from 'volatile float*' to 'float32_t* {aka float*}' [-fpermissive]
添加-fpermissive,它仍然无法正常工作。 gcc忽略volatile并消除冗余的加载/存储。
那么有没有办法强制加载/存储内在生成?
或者我必须使用组装?
我试图避免手臂组装,因为内联组件很糟糕,我不知道任何好的手臂组装器。