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
635 635
636WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon636WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon
637 stmdb sp!, {r0-r12, r14}637 stmdb sp!, {r0-r12, r14}
638 vpush {q4-q7}
638 639
639 ldr r4, [sp, #56] //r4 keeps the pic_stride640 ldr r4, [sp, #120] //r4 keeps the pic_stride
640 641
641 sub r5, r4, #1642 sub r5, r4, #1
642 lsl r5, r5, #4 //r5 keeps the little step643 lsl r5, r5, #4 //r5 keeps the little step
@@ -645,12 +646,12 @@ WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon · 2 unmodified lines
645 sub r6, r2, r6 //r6 keeps the big step646 sub r6, r2, r6 //r6 keeps the big step
646 647
647 648
648 ldr r8, [sp, #64]//psad8x8649 ldr r8, [sp, #128]//psad8x8
649 ldr r9, [sp, #68]//psum16x16650 ldr r9, [sp, #132]//psum16x16
650 ldr r10, [sp, #72]//psqsum16x16651 ldr r10, [sp, #136]//psqsum16x16
651 ldr r11, [sp, #76]//psqdiff16x16652 ldr r11, [sp, #140]//psqdiff16x16
652 ldr r12, [sp, #80]//p_sd8x8653 ldr r12, [sp, #144]//p_sd8x8
653 ldr r14, [sp, #84]//p_mad8x8654 ldr r14, [sp, #148]//p_mad8x8
654 655
655 vmov.i8 q12, #0656 vmov.i8 q12, #0
656 657
@@ -700,11 +701,12 @@ vaa_calc_sad_ssd_bgd_width_loop: · 43 unmodified lines
700bne vaa_calc_sad_ssd_bgd_height_loop701bne vaa_calc_sad_ssd_bgd_height_loop
701 702
702 //psadframe703 //psadframe
703 ldr r7, [sp, #60]//psadframe704 ldr r7, [sp, #124]//psadframe
704 705
705 vadd.i32 d24, d24, d25706 vadd.i32 d24, d24, d25
706 vst1.32 {d24[0]}, [r7]707 vst1.32 {d24[0]}, [r7]
707 708
709 vpop {q4-q7}
708 ldmia sp!, {r0-r12, r14}710 ldmia sp!, {r0-r12, r14}
709 711
710WELS_ASM_FUNC_END712WELS_ASM_FUNC_END
@@ -912,8 +914,10 @@ WELS_ASM_FUNC_END · 201 unmodified lines
912 914
913WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon915WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon
914 stmdb sp!, {r4-r11}916 stmdb sp!, {r4-r11}
917 vpush {q4}
918 vpush {q6-q7}
915 919
916 ldr r4, [sp, #32] //r4 keeps the pic_stride920 ldr r4, [sp, #80] //r4 keeps the pic_stride
917 921
918 sub r5, r4, #1922 sub r5, r4, #1
919 lsl r5, r5, #4 //r5 keeps the little step923 lsl r5, r5, #4 //r5 keeps the little step
@@ -921,10 +925,10 @@ WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon · 1 unmodified line
921 lsl r6, r4, #4925 lsl r6, r4, #4
922 sub r6, r2, r6 //r6 keeps the big step926 sub r6, r2, r6 //r6 keeps the big step
923 927
924 ldr r7, [sp, #36] //psadframe928 ldr r7, [sp, #84] //psadframe
925 ldr r8, [sp, #40] //psad8x8929 ldr r8, [sp, #88] //psad8x8
926 ldr r9, [sp, #44] //psum16x16930 ldr r9, [sp, #92] //psum16x16
927 ldr r10, [sp, #48] //psqsum16x16931 ldr r10, [sp, #96] //psqsum16x16
928 932
929 vmov.i8 q12, #0933 vmov.i8 q12, #0
930vaa_calc_sad_var_height_loop:934vaa_calc_sad_var_height_loop:
@@ -961,6 +965,8 @@ bne vaa_calc_sad_var_height_loop · 30 unmodified lines
961 vadd.i32 d24, d24, d25965 vadd.i32 d24, d24, d25
962 vst1.32 {d24[0]}, [r7]966 vst1.32 {d24[0]}, [r7]
963 967
968 vpop {q6-q7}
969 vpop {q4}
964 ldmia sp!, {r4-r11}970 ldmia sp!, {r4-r11}
965WELS_ASM_FUNC_END971WELS_ASM_FUNC_END
966 972
@@ -1080,8 +1086,10 @@ WELS_ASM_FUNC_END · 113 unmodified lines
1080 1086
1081WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon1087WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon
1082 stmdb sp!, {r4-r12}1088 stmdb sp!, {r4-r12}
1089 vpush {q4}
1090 vpush {q6-q7}
1083 1091
1084 ldr r4, [sp, #36] //r4 keeps the pic_stride1092 ldr r4, [sp, #84] //r4 keeps the pic_stride
1085 1093
1086 sub r5, r4, #11094 sub r5, r4, #1
1087 lsl r5, r5, #4 //r5 keeps the little step1095 lsl r5, r5, #4 //r5 keeps the little step
@@ -1089,11 +1097,11 @@ WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon · 1 unmodified line
1089 lsl r6, r4, #41097 lsl r6, r4, #4
1090 sub r6, r2, r6 //r6 keeps the big step1098 sub r6, r2, r6 //r6 keeps the big step
1091 1099
1092 ldr r7, [sp, #40] //psadframe1100 ldr r7, [sp, #88] //psadframe
1093 ldr r8, [sp, #44] //psad8x81101 ldr r8, [sp, #92] //psad8x8
1094 ldr r9, [sp, #48] //psum16x161102 ldr r9, [sp, #96] //psum16x16
1095 ldr r10, [sp, #52] //psqsum16x161103 ldr r10, [sp, #100] //psqsum16x16
1096 ldr r11, [sp, #56] //psqdiff16x161104 ldr r11, [sp, #104] //psqdiff16x16
1097 1105
1098 vmov.i8 q12, #01106 vmov.i8 q12, #0
1099vaa_calc_sad_ssd_height_loop:1107vaa_calc_sad_ssd_height_loop:
@@ -1137,6 +1145,8 @@ vaa_calc_sad_ssd_width_loop: · 37 unmodified lines
1137 vadd.i32 d24, d24, d251145 vadd.i32 d24, d24, d25
1138 vst1.32 {d24[0]}, [r7]1146 vst1.32 {d24[0]}, [r7]
1139 1147
1148 vpop {q6-q7}
1149 vpop {q4}
1140 ldmia sp!, {r4-r12}1150 ldmia sp!, {r4-r12}
1141WELS_ASM_FUNC_END1151WELS_ASM_FUNC_END
1142 1152

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