Assembly ARM中的指令调度

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, [

如果我有一个代码,它执行大约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, [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交错排列。但是,没有理由不以一对一的方式这样做。