2012-12-25 5 views
2

내가 원하는 것 (고급 수준) : Android에서 qsort_r을 사용합니다.Android 용 qsort_r 없음 (Android ARM 코드에서 CLZ를 사용하도록 Thumb을 강제로 비활성화하는 방법)

기본 구현이 없습니다. 그래서 저는 BSD에서 한 명을 얻었습니다. 안타깝게도 안드로이드에서는 사용할 수없는 fls 함수가 필요합니다. 그래서 저는 Apple Open Source Libc 라이브러리를 가져 와서 ARM 구현을 인라인 어셈블리로 복사했습니다. 이제 다음과 같이 표시됩니다.

Assembler messages: 
Error: selected processor does not support Thumb mode `clz r3,r0' 
Error: cannot honor width suffix -- `rsb r0,r3,#32' 

AFAIR ARM-6은 Thumb 모드에서 지원하지 않습니다. 그렇다면이 하나의 파일에 대해 비 Thumb 모드를 강제로 적용 할 수 있습니까? 아니면 fls에 대해 순수 C 구현을 사용할 수 있습니까?

여기에 엄지 손가락을 컴파일 할 일을 설정하는 방법입니다, 당신의 Android.mk 파일에서

+2

Android.mk 파일에서 ".arm"을 파일 이름에 추가하면 Thumb 모드 (예 : sort.c.arm) 대신 ARM 모드로 컴파일됩니다. 안드로이드 네이티브 라이브러리에서 Thumb/ARM 코드를 섞어서 잘 작동했습니다. – BitBank

+0

@BitBank 제발 답변을 공동으로 그것을 upvote 수 있습니다. – Wojtek

답변

2

을 (하나님, 왜 ... 난 그냥 qsort_r 가지고 낮은 수준을 재생해야합니까), 팔과 네온 버전의 코드. 어셈블리 언어 소스 파일은 "S"를 메이크 파일에 대문자로 사용해야하지만 실제 이름은 대문자로 표기하지 않아도됩니다. 접미어 ".arm"과 ".arm.neon"은 makefile에만 있고 이름의 일부는 아닙니다 (예 : 아래 파일의 이름은 main.c, main_asm.s, test.c 및 test_asm.s입니다).

LOCAL_ARM_MODE := arm # remove this if you want thumb mode 
LOCAL_ARM_NEON := true # remove this if you want armv5 mode 

# this flag will allow neon intrinsics in your C files 
LOCAL_CFLAGS := -mfpu=neon -march=armv7 

LOCAL_SRC_FILES := \ 
      main.c.arm \ 
      test.c.arm.neon \ 
      main_asm.S.arm \ 
      test_asm.S.arm.neon \