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.
Showing the changes to codec/processing/src (1 of 5 files). Show all
Unified · Split
| @@ -635,8 +635,9 @@ WELS_ASM_FUNC_END · 634 unmodified lines | |||
| 635 | 635 | ||
| 636 | WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon | 636 | WELS_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_stride | 640 | ldr r4, [sp, #120] //r4 keeps the pic_stride |
| 640 | 641 | ||
| 641 | sub r5, r4, #1 | 642 | sub r5, r4, #1 |
| 642 | lsl r5, r5, #4 //r5 keeps the little step | 643 | 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 step | 646 | sub r6, r2, r6 //r6 keeps the big step |
| 646 | 647 | ||
| 647 | 648 | ||
| 648 | ldr r8, [sp, #64]//psad8x8 | 649 | ldr r8, [sp, #128]//psad8x8 |
| 649 | ldr r9, [sp, #68]//psum16x16 | 650 | ldr r9, [sp, #132]//psum16x16 |
| 650 | ldr r10, [sp, #72]//psqsum16x16 | 651 | ldr r10, [sp, #136]//psqsum16x16 |
| 651 | ldr r11, [sp, #76]//psqdiff16x16 | 652 | ldr r11, [sp, #140]//psqdiff16x16 |
| 652 | ldr r12, [sp, #80]//p_sd8x8 | 653 | ldr r12, [sp, #144]//p_sd8x8 |
| 653 | ldr r14, [sp, #84]//p_mad8x8 | 654 | ldr r14, [sp, #148]//p_mad8x8 |
| 654 | 655 | ||
| 655 | vmov.i8 q12, #0 | 656 | vmov.i8 q12, #0 |
| 656 | 657 | ||
| @@ -700,11 +701,12 @@ vaa_calc_sad_ssd_bgd_width_loop: · 43 unmodified lines | |||
| 700 | bne vaa_calc_sad_ssd_bgd_height_loop | 701 | bne vaa_calc_sad_ssd_bgd_height_loop |
| 701 | 702 | ||
| 702 | //psadframe | 703 | //psadframe |
| 703 | ldr r7, [sp, #60]//psadframe | 704 | ldr r7, [sp, #124]//psadframe |
| 704 | 705 | ||
| 705 | vadd.i32 d24, d24, d25 | 706 | 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 | ||
| 710 | WELS_ASM_FUNC_END | 712 | WELS_ASM_FUNC_END |
| @@ -912,8 +914,10 @@ WELS_ASM_FUNC_END · 201 unmodified lines | |||
| 912 | 914 | ||
| 913 | WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon | 915 | WELS_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_stride | 920 | ldr r4, [sp, #80] //r4 keeps the pic_stride |
| 917 | 921 | ||
| 918 | sub r5, r4, #1 | 922 | sub r5, r4, #1 |
| 919 | lsl r5, r5, #4 //r5 keeps the little step | 923 | 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, #4 | 925 | lsl r6, r4, #4 |
| 922 | sub r6, r2, r6 //r6 keeps the big step | 926 | sub r6, r2, r6 //r6 keeps the big step |
| 923 | 927 | ||
| 924 | ldr r7, [sp, #36] //psadframe | 928 | ldr r7, [sp, #84] //psadframe |
| 925 | ldr r8, [sp, #40] //psad8x8 | 929 | ldr r8, [sp, #88] //psad8x8 |
| 926 | ldr r9, [sp, #44] //psum16x16 | 930 | ldr r9, [sp, #92] //psum16x16 |
| 927 | ldr r10, [sp, #48] //psqsum16x16 | 931 | ldr r10, [sp, #96] //psqsum16x16 |
| 928 | 932 | ||
| 929 | vmov.i8 q12, #0 | 933 | vmov.i8 q12, #0 |
| 930 | vaa_calc_sad_var_height_loop: | 934 | vaa_calc_sad_var_height_loop: |
| @@ -961,6 +965,8 @@ bne vaa_calc_sad_var_height_loop · 30 unmodified lines | |||
| 961 | vadd.i32 d24, d24, d25 | 965 | 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} |
| 965 | WELS_ASM_FUNC_END | 971 | WELS_ASM_FUNC_END |
| 966 | 972 | ||
| @@ -1080,8 +1086,10 @@ WELS_ASM_FUNC_END · 113 unmodified lines | |||
| 1080 | 1086 | ||
| 1081 | WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon | 1087 | WELS_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_stride | 1092 | ldr r4, [sp, #84] //r4 keeps the pic_stride |
| 1085 | 1093 | ||
| 1086 | sub r5, r4, #1 | 1094 | sub r5, r4, #1 |
| 1087 | lsl r5, r5, #4 //r5 keeps the little step | 1095 | 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, #4 | 1097 | lsl r6, r4, #4 |
| 1090 | sub r6, r2, r6 //r6 keeps the big step | 1098 | sub r6, r2, r6 //r6 keeps the big step |
| 1091 | 1099 | ||
| 1092 | ldr r7, [sp, #40] //psadframe | 1100 | ldr r7, [sp, #88] //psadframe |
| 1093 | ldr r8, [sp, #44] //psad8x8 | 1101 | ldr r8, [sp, #92] //psad8x8 |
| 1094 | ldr r9, [sp, #48] //psum16x16 | 1102 | ldr r9, [sp, #96] //psum16x16 |
| 1095 | ldr r10, [sp, #52] //psqsum16x16 | 1103 | ldr r10, [sp, #100] //psqsum16x16 |
| 1096 | ldr r11, [sp, #56] //psqdiff16x16 | 1104 | ldr r11, [sp, #104] //psqdiff16x16 |
| 1097 | 1105 | ||
| 1098 | vmov.i8 q12, #0 | 1106 | vmov.i8 q12, #0 |
| 1099 | vaa_calc_sad_ssd_height_loop: | 1107 | vaa_calc_sad_ssd_height_loop: |
| @@ -1137,6 +1145,8 @@ vaa_calc_sad_ssd_width_loop: · 37 unmodified lines | |||
| 1137 | vadd.i32 d24, d24, d25 | 1145 | 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} |
| 1141 | WELS_ASM_FUNC_END | 1151 | WELS_ASM_FUNC_END |
| 1142 | 1152 | ||