【问题标题】:ARM memcpy and alignmentARM memcpy 和对齐
【发布时间】:2012-12-10 15:44:05
【问题描述】:

我正在使用 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 命令是否需要这样做?文章没有提到这个实现仅限于字对齐的值。它可以修复吗?如果有,怎么做?

【问题讨论】:

标签: assembly arm neon


【解决方案1】:

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

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

【讨论】:

  • 好的,A3.2.1 中的表格说 VLDM 需要字对齐。但还有其他变体 (VLD1..4) 允许未对齐访问。我可以用其中一个替换 VLDM 并从 memcpy 获得我期望的行为吗?
  • 我希望元素对齐要求适用于所有这些指令,根据参考手册中的“4.2.1 NEON 数据对齐”部分。不过我不会发誓。
猜你喜欢
  • 1970-01-01
  • 2012-06-25
  • 2016-02-14
  • 2017-02-11
  • 1970-01-01
  • 2016-05-16
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多