Skip to content

Commit d55da5d

Browse files
mansrmstorsjo
authored andcommitted
stagefright aacenc: Use ARMv6 SSAT instruction
Change-Id: I652eaaa54e7766d9dca80fd8cc156ca481359471
1 parent 5433616 commit d55da5d

File tree

3 files changed

+40
-3
lines changed

3 files changed

+40
-3
lines changed

media/libstagefright/codecs/aacenc/Android.mk

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
7979
endif
8080

8181
ifeq ($(VOTT), v7)
82-
LOCAL_CFLAGS += -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM
82+
LOCAL_CFLAGS += -DARMV5E -DARMV7Neon -DARM_INASM -DARMV5_INASM -DARMV6_INASM
8383
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV5E
8484
LOCAL_C_INCLUDES += $(LOCAL_PATH)/src/asm/ARMV7
8585
endif

media/libstagefright/codecs/aacenc/basic_op/basic_op.h

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -264,6 +264,18 @@ __inline Word32 ASM_shr(Word32 L_var1, Word16 var2)
264264

265265
__inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
266266
{
267+
#if ARMV6_SAT
268+
Word32 result;
269+
asm (
270+
"CMP %[var2], #16\n"
271+
"MOVLT %[result], %[L_var1], ASL %[var2]\n"
272+
"MOVGE %[result], %[L_var1], ASL #16\n"
273+
"SSAT %[result], #16, %[result]\n"
274+
:[result]"=r"(result)
275+
:[L_var1]"r"(L_var1), [var2]"r"(var2)
276+
);
277+
return result;
278+
#else
267279
Word32 result;
268280
Word32 tmp;
269281
asm (
@@ -277,6 +289,7 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
277289
:[L_var1]"r"(L_var1), [var2]"r"(var2), [mask]"r"(0x7fff)
278290
);
279291
return result;
292+
#endif
280293
}
281294
#endif
282295

@@ -288,7 +301,15 @@ __inline Word32 ASM_shl(Word32 L_var1, Word16 var2)
288301
#if (SATRUATE_IS_INLINE)
289302
__inline Word16 saturate(Word32 L_var1)
290303
{
291-
#if ARMV5TE_SAT
304+
#if ARMV6_SAT
305+
Word16 result;
306+
asm (
307+
"SSAT %[result], #16, %[L_var1]"
308+
: [result]"=r"(result)
309+
: [L_var1]"r"(L_var1)
310+
);
311+
return result;
312+
#elif ARMV5TE_SAT
292313
Word16 result;
293314
Word32 tmp;
294315
asm volatile (
@@ -671,7 +692,16 @@ __inline Word16 div_s (Word16 var1, Word16 var2)
671692
#if (MULT_IS_INLINE)
672693
__inline Word16 mult (Word16 var1, Word16 var2)
673694
{
674-
#if ARMV5TE_MULT
695+
#if ARMV5TE_MULT && ARMV6_SAT
696+
Word32 result;
697+
asm (
698+
"SMULBB %[result], %[var1], %[var2] \n"
699+
"SSAT %[result], #16, %[result], ASR #15 \n"
700+
:[result]"=r"(result)
701+
:[var1]"r"(var1), [var2]"r"(var2)
702+
);
703+
return result;
704+
#elif ARMV5TE_MULT
675705
Word32 result, tmp;
676706
asm (
677707
"SMULBB %[tmp], %[var1], %[var2] \n"

media/libstagefright/codecs/aacenc/basic_op/typedefs.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,13 @@ typedef unsigned __int64 UWord64;
130130
#define ARMV5TE_NORM_L 1
131131
#define ARMV5TE_L_MPY_LS 1
132132
#endif
133+
#if ARMV6_INASM
134+
#undef ARMV5TE_ADD
135+
#define ARMV5TE_ADD 0
136+
#undef ARMV5TE_SUB
137+
#define ARMV5TE_SUB 0
138+
#define ARMV6_SAT 1
139+
#endif
133140

134141
//basic operation functions optimization flags
135142
#define SATRUATE_IS_INLINE 1 //define saturate as inline function

0 commit comments

Comments
 (0)