ARM memcpy和对齐

时间:2012-12-10 15:44:06

标签: assembly arm neon

我正在使用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命令的预期吗?本文未提及此实现仅限于单词对齐值。它可以修复吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:0)

即使您没有指定明确的对齐要求,您仍然需要在元素边界上对齐数据(在这种情况下,在双字边界上)。这条规则有一些例外,但除非你有充分的理由这样做,否则最好不要依赖它们。

有关详细信息,请参阅Cortex-A8技术参考手册(ARM DDI 0344J)。