我正在使用ARM网站上的NEON memory copy with preload实现,以及Cortex-A8处理器上的Windows Embedded Compact 7 ARM汇编程序。
我注意到当我提供具有非单词对齐值的函数
时,我得到数据类型错位异常例如:
; NEON memory copy with preload
ALIGN
LEAF_ENTRY NEONCopyPLD
PLD [r1, #0xC0]
VLDM r1!,{d0-d7} ;datatype misalignment
VSTM r0!,{d0-d7}
SUBS r2,r2,#0x40
MOV R0, #0
MOV PC, LR
ENTRY_END
size_t size = /* arbitrary */;
size_t offset = 1;
char* src = new char[ size + offset ];
char* dst = new char[ size ];
NEONCopyPLD( dst, src + offset, size );
memcpy( dst, src + offset, size ); /* works perfectly */
这是VLDM命令的预期吗?本文未提及此实现仅限于单词对齐值。它可以修复吗?如果是这样,怎么样?
答案 0 :(得分:0)
即使您没有指定明确的对齐要求,您仍然需要在元素边界上对齐数据(在这种情况下,在双字边界上)。这条规则有一些例外,但除非你有充分的理由这样做,否则最好不要依赖它们。
有关详细信息,请参阅Cortex-A8技术参考手册(ARM DDI 0344J)。