History

Push clobbered neon registers on the stack

According to the calling convention, the registers q4-q7 should be preserved by functions. The caller (generated by the compiler) could be using those registers anywhere for any intermediate data. Functions that use more than 12 of the qX registers must push the clobbered registers on the stack in order to be able to restore them afterwards. In functions that don't use all 16 registers, but clobber some of the callee saved registers q4-q7, one or more of them are remapped to reduce the number of registers that have to be saved/restored. This incurs a very small (around 0.5%) slowdown in the decoder and encoder.

Martin Storsjö committed 12 years ago

Commit c0118901 parent 811c6475 files · +241 −194Browse files

Showing the changes to codec/processing/src (1 of 5 files). Show all

Unified · Split

codec/processing/src/arm/vaa_calc_neon.S+29−19
@@ -635,8 +635,9 @@ WELS_ASM_FUNC_END · 634 unmodified lines
635635
636636 WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon
637637 stmdb sp!, {r0-r12, r14}
638+ vpush {q4-q7}
638639
639− ldr r4, [sp, #56] //r4 keeps the pic_stride
640+ ldr r4, [sp, #120] //r4 keeps the pic_stride
640641
641642 sub r5, r4, #1
642643 lsl r5, r5, #4 //r5 keeps the little step
@@ -645,12 +646,12 @@ WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon · 2 unmodified lines
645646 sub r6, r2, r6 //r6 keeps the big step
646647
647648
648− ldr r8, [sp, #64]//psad8x8
649− ldr r9, [sp, #68]//psum16x16
650− ldr r10, [sp, #72]//psqsum16x16
651− ldr r11, [sp, #76]//psqdiff16x16
652− ldr r12, [sp, #80]//p_sd8x8
653− ldr r14, [sp, #84]//p_mad8x8
649+ ldr r8, [sp, #128]//psad8x8
650+ ldr r9, [sp, #132]//psum16x16
651+ ldr r10, [sp, #136]//psqsum16x16
652+ ldr r11, [sp, #140]//psqdiff16x16
653+ ldr r12, [sp, #144]//p_sd8x8
654+ ldr r14, [sp, #148]//p_mad8x8
654655
655656 vmov.i8 q12, #0
656657
@@ -700,11 +701,12 @@ vaa_calc_sad_ssd_bgd_width_loop: · 43 unmodified lines
700701 bne vaa_calc_sad_ssd_bgd_height_loop
701702
702703 //psadframe
703− ldr r7, [sp, #60]//psadframe
704+ ldr r7, [sp, #124]//psadframe
704705
705706 vadd.i32 d24, d24, d25
706707 vst1.32 {d24[0]}, [r7]
707708
709+ vpop {q4-q7}
708710 ldmia sp!, {r0-r12, r14}
709711
710712 WELS_ASM_FUNC_END
@@ -912,8 +914,10 @@ WELS_ASM_FUNC_END · 201 unmodified lines
912914
913915 WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon
914916 stmdb sp!, {r4-r11}
917+ vpush {q4}
918+ vpush {q6-q7}
915919
916− ldr r4, [sp, #32] //r4 keeps the pic_stride
920+ ldr r4, [sp, #80] //r4 keeps the pic_stride
917921
918922 sub r5, r4, #1
919923 lsl r5, r5, #4 //r5 keeps the little step
@@ -921,10 +925,10 @@ WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon · 1 unmodified line
921925 lsl r6, r4, #4
922926 sub r6, r2, r6 //r6 keeps the big step
923927
924− ldr r7, [sp, #36] //psadframe
925− ldr r8, [sp, #40] //psad8x8
926− ldr r9, [sp, #44] //psum16x16
927− ldr r10, [sp, #48] //psqsum16x16
928+ ldr r7, [sp, #84] //psadframe
929+ ldr r8, [sp, #88] //psad8x8
930+ ldr r9, [sp, #92] //psum16x16
931+ ldr r10, [sp, #96] //psqsum16x16
928932
929933 vmov.i8 q12, #0
930934 vaa_calc_sad_var_height_loop:
@@ -961,6 +965,8 @@ bne vaa_calc_sad_var_height_loop · 30 unmodified lines
961965 vadd.i32 d24, d24, d25
962966 vst1.32 {d24[0]}, [r7]
963967
968+ vpop {q6-q7}
969+ vpop {q4}
964970 ldmia sp!, {r4-r11}
965971 WELS_ASM_FUNC_END
966972
@@ -1080,8 +1086,10 @@ WELS_ASM_FUNC_END · 113 unmodified lines
10801086
10811087 WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon
10821088 stmdb sp!, {r4-r12}
1089+ vpush {q4}
1090+ vpush {q6-q7}
10831091
1084− ldr r4, [sp, #36] //r4 keeps the pic_stride
1092+ ldr r4, [sp, #84] //r4 keeps the pic_stride
10851093
10861094 sub r5, r4, #1
10871095 lsl r5, r5, #4 //r5 keeps the little step
@@ -1089,11 +1097,11 @@ WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon · 1 unmodified line
10891097 lsl r6, r4, #4
10901098 sub r6, r2, r6 //r6 keeps the big step
10911099
1092− ldr r7, [sp, #40] //psadframe
1093− ldr r8, [sp, #44] //psad8x8
1094− ldr r9, [sp, #48] //psum16x16
1095− ldr r10, [sp, #52] //psqsum16x16
1096− ldr r11, [sp, #56] //psqdiff16x16
1100+ ldr r7, [sp, #88] //psadframe
1101+ ldr r8, [sp, #92] //psad8x8
1102+ ldr r9, [sp, #96] //psum16x16
1103+ ldr r10, [sp, #100] //psqsum16x16
1104+ ldr r11, [sp, #104] //psqdiff16x16
10971105
10981106 vmov.i8 q12, #0
10991107 vaa_calc_sad_ssd_height_loop:
@@ -1137,6 +1145,8 @@ vaa_calc_sad_ssd_width_loop: · 37 unmodified lines
11371145 vadd.i32 d24, d24, d25
11381146 vst1.32 {d24[0]}, [r7]
11391147
1148+ vpop {q6-q7}
1149+ vpop {q4}
11401150 ldmia sp!, {r4-r12}
11411151 WELS_ASM_FUNC_END
11421152

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t