Assembly ARM中的指令调度
如果我有一个代码,它执行大约30条ARM指令,然后是20条NEON指令。霓虹灯协处理器是否会因为指令队列有限而暂停,直到30条ARM指令完成?那么,混合使用ARM和NEON代码更好吗? 需要注意的是:ARM代码和NEON代码彼此独立Assembly ARM中的指令调度,assembly,arm,neon,Assembly,Arm,Neon,如果我有一个代码,它执行大约30条ARM指令,然后是20条NEON指令。霓虹灯协处理器是否会因为指令队列有限而暂停,直到30条ARM指令完成?那么,混合使用ARM和NEON代码更好吗? 需要注意的是:ARM代码和NEON代码彼此独立 . . str sl, [sp, #36] str fp, [sp, #84] add r8, r8, #1 ; 0x1 lsl r9, r8, r7 sub r9, r9, #1 ; 0x1 ldr sl, [r5, r9, lsl #2] ldr fp, [
.
.
str sl, [sp, #36]
str fp, [sp, #84]
add r8, r8, #1 ; 0x1
lsl r9, r8, r7
sub r9, r9, #1 ; 0x1
ldr sl, [r5, r9, lsl #2]
ldr fp, [r6, r9, lsl #2]
str sl, [sp, #8]
str fp, [sp, #56]
lsl ip, r8, #1
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
str sl, [sp, #24]
str fp, [sp, #72]
mov r9, #512 ; 0x200
lsl ip, r8, #1
add ip, ip, r8
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
cmp ip, #512 ; 0x200
sub r9, r9, #1 ; 0x1
and ip, ip, r9
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
rsbge sl, sl, #0 ; 0x
rsbge fp, fp, #0 ; 0x
str sl, [sp, #40]
str fp, [sp, #88]
add r8, r8, #1 ; 0x1
lsl r9, r8, r7
sub r9, r9, #1 ; 0x1
ldr sl, [r5, r9, lsl #2]
ldr fp, [r6, r9, lsl #2]
str sl, [sp, #12]
str fp, [sp, #60]
lsl ip, r8, #1
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
str sl, [sp, #28]
str fp, [sp, #76]
mov r9, #512 ; 0x200
lsl ip, r8, #1
add ip, ip, r8
lsl ip, ip, r7
sub ip, ip, #1 ; 0x1
cmp ip, #512 ; 0x200
sub r9, r9, #1 ; 0x1
and ip, ip, r9
ldr sl, [r5, ip, lsl #2]
ldr fp, [r6, ip, lsl #2]
rsbge sl, sl, #0 ; 0x
rsbge fp, fp, #0 ; 0x
str sl, [sp, #44]
str fp, [sp, #92]
add r8, r8, #1 ; 0x1
vshr.s32 q0, q0, #2
vshr.s32 q1, q1, #2
vshr.s32 q2, q2, #2
vshr.s32 q3, q3, #2
vshr.s32 q4, q4, #2
vshr.s32 q5, q5, #2
vshr.s32 q6, q6, #2
vshr.s32 q7, q7, #2
vadd.i32 q8, q0, q4
vadd.i32 q9, q2, q6
vsub.i32 q10, q0, q4
vsub.i32 q11, q2, q6
vadd.i32 q12, q8, q9
vsub.i32 q13, q8, q9
vadd.i32 q8, q1, q5
vsub.i32 q0, q1, q5
vadd.i32 q9, q3, q7
vsub.i32 q1, q3, q7
vsub.i32 q2, q8, q9
vsub.i32 q4, q10, q1
你应该把它们交错起来 你的手臂指令比NEON的多。ARM是执行代码的主要工具 因此,如果您将霓虹灯指令交错,它们将在6个条目边界内免费执行
请注意,这种免费午餐在较弱的内核(如CA7)上是不可用的。在交叉使用说明后,我节省了不少钱。谢谢好消息。您能否更详细地描述该机制是如何实现最大效益的?你所说的“6条边界”是什么意思?@BitBank一旦获取/解码,NEON指令就会被放入自己的执行队列中,该队列有6条边界。如果一行中有六条以上的ARM指令,NEON的队列将变为空,NEON将进入空闲状态。为了避免这种情况,您可以将指令从5到5交错排列。但是,没有理由不以一对一的方式这样做。