@@ -227,13 +227,7 @@ Word32 L_shr_r (Word32 L_var1, Word16 var2);
227227#if ARMV4_INASM
228228__inline Word32 ASM_L_shr (Word32 L_var1 , Word16 var2 )
229229{
230- Word32 result ;
231- asm (
232- "MOV %[result], %[L_var1], ASR %[var2] \n"
233- :[result ]"=r" (result )
234- :[L_var1 ]"r" (L_var1 ), [var2 ]"r" (var2 )
235- );
236- return result ;
230+ return L_var1 >> var2 ;
237231}
238232
239233__inline Word32 ASM_L_shl (Word32 L_var1 , Word16 var2 )
@@ -264,6 +258,18 @@ __inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
264258
265259__inline Word32 ASM_shl (Word32 L_var1 , Word16 var2 )
266260{
261+ #if ARMV6_SAT
262+ Word32 result ;
263+ asm (
264+ "CMP %[var2], #16\n"
265+ "MOVLT %[result], %[L_var1], ASL %[var2]\n"
266+ "MOVGE %[result], %[L_var1], ASL #16\n"
267+ "SSAT %[result], #16, %[result]\n"
268+ :[result ]"=r" (result )
269+ :[L_var1 ]"r" (L_var1 ), [var2 ]"r" (var2 )
270+ );
271+ return result ;
272+ #else
267273 Word32 result ;
268274 Word32 tmp ;
269275 asm (
@@ -277,6 +283,7 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
277283 :[L_var1 ]"r" (L_var1 ), [var2 ]"r" (var2 ), [mask ]"r" (0x7fff )
278284 );
279285 return result ;
286+ #endif
280287}
281288#endif
282289
@@ -288,7 +295,15 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
288295#if (SATRUATE_IS_INLINE )
289296__inline Word16 saturate (Word32 L_var1 )
290297{
291- #if ARMV5TE_SAT
298+ #if ARMV6_SAT
299+ Word16 result ;
300+ asm (
301+ "SSAT %[result], #16, %[L_var1]"
302+ : [result ]"=r" (result )
303+ : [L_var1 ]"r" (L_var1 )
304+ );
305+ return result ;
306+ #elif ARMV5TE_SAT
292307 Word16 result ;
293308 Word32 tmp ;
294309 asm volatile (
@@ -445,8 +460,7 @@ __inline Word32 L_msu (Word32 L_var3, Word16 var1, Word16 var2)
445460 Word32 result ;
446461 asm (
447462 "SMULBB %[result], %[var1], %[var2] \n"
448- "QADD %[result], %[result], %[result] \n"
449- "QSUB %[result], %[L_var3], %[result]\n"
463+ "QDSUB %[result], %[L_var3], %[result]\n"
450464 :[result ]"=&r" (result )
451465 :[L_var3 ]"r" (L_var3 ), [var1 ]"r" (var1 ), [var2 ]"r" (var2 )
452466 );
@@ -671,7 +685,16 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
671685#if (MULT_IS_INLINE )
672686__inline Word16 mult (Word16 var1 , Word16 var2 )
673687{
674- #if ARMV5TE_MULT
688+ #if ARMV5TE_MULT && ARMV6_SAT
689+ Word32 result ;
690+ asm (
691+ "SMULBB %[result], %[var1], %[var2] \n"
692+ "SSAT %[result], #16, %[result], ASR #15 \n"
693+ :[result ]"=r" (result )
694+ :[var1 ]"r" (var1 ), [var2 ]"r" (var2 )
695+ );
696+ return result ;
697+ #elif ARMV5TE_MULT
675698 Word32 result , tmp ;
676699 asm (
677700 "SMULBB %[tmp], %[var1], %[var2] \n"
@@ -990,8 +1013,7 @@ __inline Word32 L_mac (Word32 L_var3, Word16 var1, Word16 var2)
9901013 Word32 result ;
9911014 asm (
9921015 "SMULBB %[result], %[var1], %[var2]\n"
993- "QADD %[result], %[result], %[result]\n"
994- "QADD %[result], %[result], %[L_var3]\n"
1016+ "QDADD %[result], %[L_var3], %[result]\n"
9951017 :[result ]"=&r" (result )
9961018 : [L_var3 ]"r" (L_var3 ), [var1 ]"r" (var1 ), [var2 ]"r" (var2 )
9971019 );
0 commit comments