如果我的代码执行大约30条ARM指令,后跟20条NEON指令。由于指令队列有限,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
答案 0 :(得分:3)
你应该交错它们。
你有比NEON更多的ARM指令。 ARM是执行代码的支配。
因此,如果交错,NEON指令将在6个条目边界内免费执行。
请注意,这种免费午餐不适用于较弱的核心,如CA7。