Arm 具有非相邻寄存器的stm是否进行32位写入?

Arm 具有非相邻寄存器的stm是否进行32位写入?,arm,Arm,我正在看一段ARM代码,它将编写一对32位寄存器,如下所示: ldm r9!, {r0, r1} sub r8, r8, #2 stm r10!, {r0, r1} 当r10输出指针是字对齐的,但并非总是dword对齐时,上述代码是否写入一个64位值?我对文档的阅读让我认为在这种情况下会写入64位值,但我担心的是,8字缓存线可能已经包含7个字,然后这段代码会进行64位写入,并在缓存线的末端拆分其中一个DWORD的一半 我在想,如果stm改为写2个32位的字,那可能会避免这个问题。所以,我的问题

我正在看一段ARM代码,它将编写一对32位寄存器,如下所示:

ldm r9!, {r0, r1}
sub r8, r8, #2
stm r10!, {r0, r1}
当r10输出指针是字对齐的,但并非总是dword对齐时,上述代码是否写入一个64位值?我对文档的阅读让我认为在这种情况下会写入64位值,但我担心的是,8字缓存线可能已经包含7个字,然后这段代码会进行64位写入,并在缓存线的末端拆分其中一个DWORD的一半

我在想,如果stm改为写2个32位的字,那可能会避免这个问题。所以,我的问题是,使用两个不相邻的寄存器会迫使stm写两个字,而不是双字吗

ldm r9!, {r0, r2}
sub r8, r8, #2
stm r10!, {r0, r2}
上述代码是否与以下代码基本相同:

ldm r9!, {r0, r1}
sub r8, r8, #2
str r0, [r10], #4
str r1, [r10], #4

从中写入或读取的寄存器号与AMBA/AXI总线事务无关。唯一的联系是数据量

这个问题有点模糊,我对所有不同的实现都不太了解,但是如果您有64位AXI总线,并且您的64位数据没有写入64位对齐的地址(这是完全合法的,例如,将两个寄存器写入地址0x1004)然后它接受两个总线事务,一个用于未对齐地址(0x1004)上的第一项,另一个用于另一项(0x1008)。假设您使用的是对齐地址,那么它将执行一个独立于寄存器号的64位事务,只要有两个寄存器号

缓存是另一个完全独立的主题。我相信如果地址不是dword对齐的,您将得到两个单独的事务,这些事务将由缓存单独处理。了解一级缓存(如果一级缓存位于内核内部而不是AXI总线上),二级缓存(如果存在)位于内核和供应商AXI内存控制器之间的内核外部。所以L1行为和L2行为可能会有所不同,我不知道L1的核心接口是什么样子,以及它是否以及如何分解这些事务。我怀疑,无论您使用的是什么品牌或型号的处理器,如果某个东西在内存系统或缓存逻辑中的某个点跨越缓存线边界,它都必须中断该事务并分别处理两条缓存线

据我所见,stm/ldm在必要时将单个指令转换为单独的总线事务。例如,对0x1004的4寄存器写入将变成3个单独的事务,0x1004处为32位,0x1008处为64位,0x1010处为32位。您自己这样做只会浪费指令获取周期,在本例中使用stm