1.VMLAL.I16 这条指令I16是的意思是可能是S16或者是U16吗? 如果有个数是S16,有个数是U16,这两个数相乘可以使用I16吗??
2.
Vopn{cond}.datatype list, [Rn{@align}]{!}
Q1:文档中说到 “Align 可省略。 在这种情况下,将应用标准对齐规则”。 这里的标准对齐规则是什么样的?
Q2:如果Rn地址没有按照Q1中提到的标准对齐规则, 那么load数据的时候是否会出错还是说效率降低?
Q3:如果已经确定Rn是按照256bit对齐,那么指令vld1.32 {d0}, [r0:256] 是否会比vld1.32 {d0}, [r0] 效率高?
1.VMLAL
对于该指令,数据类型必须是下列中的一种:
I8, I16, I32, F32 for VMUL, VMLA, or VMLS
S8, S16, S32 for VMULL, VMLAL, or VMLSL
U8, U16, U32 for VMULL, VMLAL, or VMLSL
P8 for VMUL or VMULL.
也就是说要么是S16, 要么是U16, 不支持I16。如果想要S16XU16,需要确定U16的范围,看是否能将其视为S16。
ARM® Compiler toolchain
Version 5.02
Assembler Reference
4.10 Alignment restrictions in load and store, element and structure instructions
Many of these instructions permit memory alignment restrictions to be specified. When the
alignment is not specified in the instruction, the alignment restriction is controlled by the A bit
(SCTLR bit[1]):
• if the A bit is 0, there are no alignment restrictions (except for strongly ordered or device
memory, where accesses must be element aligned or the result is UNPREDICTABLE)
• if the A bit is 1, accesses must be element aligned.
If an address is not correctly aligned, an alignment fault occurs
如果Rn确定是256bit对齐,加上对齐标志比不加效率高。
1 不好意思,刚才第一个问题应该说的是VMLA,不小心多加了个L, 那对于I8, I16, I32, F32 for VMUL, VMLA, or VMLS 这些指令来说,对于16位的数据操作,不确定操作数是有符号还是无符号的时候用I16 类型吗? 如果VMLA执行S16 与U16相乘,U16是该范围的最大值时,能用VMLA.I16操作吗?
2. 按照你提到的文档中的说法,如果SCTLR bit[1]为0, VLD 可以操作非对齐地址,为1 则仅仅需要按照元素大小地址对齐即可,不知道理解对不对。如何确认SCTLR bit[1]为的值是0还是1?一般情况下,系统默认应该是设置SCTLR bit[1]为0的?
I16仅仅表示两个16位整数相乘,自己在选取操作数类型最好确定自己的操作数是什么类型的,在intrinsics接口中,整数类型只有U或S类型,没有I类型。如果U16是最大值,S16xU16的结果一定会溢出16位,这种结果是你想要的的吗?
ARM® Cortex®-A15 MPCore™ Processor
Revision: r4p0
Technical Reference Manual
4.3.27 System Control Register SCTLR
[1] A Banked Alignment check enable. This is the enable bit for Alignment fault checking:
0 Alignment fault checking disabled. This is the reset value.
1 Alignment fault checking enabled.
See the ARM® Architecture Reference Manual ARMv7-A and ARMv7-R edition for more
information.
如果你不确定你的板子的设置,可以在特定模式下,用MRS指令来读取该寄存器来确认。
有点不太明白你说的 “在特定模式下,用MRS指令来读取该寄存器来确认。” 能否给出一个操作在linux上直接判断吗?我对底层直接去操场CP15还不是特别熟。谢谢
你可以用这条指令来读该寄存器。
MRS R1, SCTLR ; writes the contents of the CP15 coprocessor register SCTLR into R1
但是这个寄存器的读取是有限制的
Usage constraints The SCTLR:
• Is a read/write register.
• Banked for Secure and Non-secure states for all implemented bits.
• Is only accessible from PL1 or higher.----------------------对于Linux来说,你在kenerl space下应该能读到,但是user space下,需要尝试
• Has write access to the Secure copy of the register disabled when the
CP15SDISABLE signal is asserted HIGH. Attempts to write to this
register in Secure PL1 modes when CP15SDISABLE is HIGH